熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PHP編程 >> 正文

使用php實現快錢支付功能

2013-11-15 12:25:11  來源: PHP編程 

  本項目用zend framework框架實現的
modules/default/controllers/IndexControllerphp
IndexControllerphp

復制代碼 代碼如下:
<?php
class IndexController extends Zend_Controller_Action
{
public function init()
{
/* Initialize action controller here */
}
public function indexAction()
{

/*模擬訂單
*$MockOrder是從數據庫取出來的信息它包含一些塊錢Request的信息這裡我寫死了
*orderId訂單號數據庫表的主鍵(唯一) //必要字段
*usr_idtype證件類型根據自己需要
*usr_idcode證件號根據自己需要
*etx_status是否優惠根據自己需要
*time_create驗證是否符合優惠的時間根據自己需要
*ets_license套餐代碼如同商品類別根據自己需要
*contact_type聯系方式類型固定選擇值電子郵件手機號根據自己需要塊錢那邊可以為空
*contact_text聯系方式根據contact_type來填寫根據自己需要塊錢那邊可以為空
*etsPrice套餐價格及商品價格根據自己需要
*orderPrice實際價格根據自己需要
*orderAmount訂單實際支付金額這個要加手續費的 //必要字段
*orderTime訂單時間 //必要字段
*paySuccess訂單是否支付成功 //必要字段
*buySuccess賬號是否生成功根據自己需要
*payTime訂單支付成功時間 //必要字段
*總之凡是跟訂單有關的都是必要字段
*orderIdorderAmountorderTime為 Request所需字段
*paySuccesspayTime為Response所需字段
*/
$MockOrder = array();
$MockOrder[orderId] = ;//訂單號必要
$MockOrder[usr_idtype] = ;//證件類型身份證
$MockOrder[usr_idcode] = ;//身份證號
$MockOrder[etx_status] = ;//是否優惠
$MockOrder[time_create] = ;//驗證是否優惠時間
$MockOrder[ets_license] = ;//套餐代碼及商品類別
$MockOrder[contact_type] = ;//聯系方式類型 郵箱
$MockOrder[contact_text] = x@com;//聯系方式郵箱
$MockOrder[etsPrice] = ;//套餐價格及商品價格
$MockOrder[orderPrice] = ;//實際價格
$MockOrder[orderAmount] = ;//訂單實際支付價格加手續費的必要
$MockOrder[orderTime] = ;//訂單生成時間必要
$MockOrder[paySuccess] = ;//訂單是否支付成功必要
$MockOrder[buySuccess] = ;//賬號是否生成成功
$MockOrder[payTime] = ;//訂單支付時間必要

//BillRequest就是快錢那邊需要的的一些參數
$this>view>BillRequest = new Application_Model_BillRequest($MockOrder);
Zend_Debug::dump($this>view>BillRequest);exit;
}

//bgUrl地址指向這裡
public function receiveAction()
{
//receive數據庫設計
/*用$MockReceive數組模擬
* $MockReceive = array();
* $MockReceive[id]主鍵;
* $MockReceive[orderId]商戶訂單號;
* $MockReceive[receiveTime]接受時間;
* $MockReceive[queryString]http_build_encode($_REQUEST);
* $MockReceive[dealId]快錢交易號;
* $MockReceive[bankDealId]銀行交易號;
* $MockReceive[payResult]處理結果支付成功支付失敗;
* $MockReceive[dealTime]快錢交易時間;
* $MockReceive[payAmount]訂單實際支付金額;
* $MockReceive[fee]費用;
* $MockReceive[errCode]錯誤代碼;
*/


/*$_REQUEST是快錢那邊返回來的數據
* merchantAcctId人民幣賬號與提交訂單時的塊錢賬號保持一致
* version網關版本固定值v與提交訂單時的網關版本號保持一致
* language網頁顯示語言種類中文顯示與提交訂單時的網頁顯示語言種類保持一致
* signType簽名類型PKI簽名與提交訂單時的簽名類型保持一致
* payType支付方式全部與提交訂單時的支付方式保持一致
* bankId銀行代碼
* orderId商戶訂單號與提交訂單時的商戶訂單號保持一致
* orderTime商戶訂單提交時間與提交訂單時的商戶訂單提交時間保持一致
* orderAmount商戶訂單金額與提交訂單時的商戶訂單金額保持一致
* dealId快錢交易號
* bankDealId銀行交易號
* dealTime快錢交易時間
* payAmount訂單實際支付金額
* fee費用
* ext擴展字段與提交訂單時的擴展字段保持一致
* ext擴展字段與提交訂單時的擴展字段保持一致
* payResult處理結果 支付成功支付失敗
* errCode錯誤代碼可為空
* signMsg簽名字符串
*/
$BillResponse = new Application_Model_BillResponse($_REQUEST);
//$BillResponse>checkSignMsg驗證簽名字符串是否正確防止bug漏洞等
if($BillResponse>checkSignMsg){
//判斷訂單支付是否成功
if($BillResponse>isSuccess){
//返回給快錢快錢會按照redirecturl地址跳到新頁面這裡是成功頁面
return "<result></result><redirecturl>http://bill/default/index/sucess</redirecturl>";exit;
}else{
//返回給快錢快錢會按照redirecturl地址跳到新頁面這個是失敗頁面
return "<result></result><redirecturl>http://bill/default/index/fail</redirecturl>";exit;
}
}
//返回給快錢快錢會按照redirecturl地址跳到新頁面這個是失敗頁面
return "<result></result><redirecturl>http://bill/default/index/fail</redirecturl>";exit;
}

//redirecturl地址
//成功
public function success()
{

}

//失敗
public function fail()
{

}
}

  
modules/default/views/scripts/index/indexphtml

復制代碼 代碼如下:
<?php $BillRequest = (array)$this>BillRequest;?>
<div style="display:none;">
<form name="kqPay" action="
<?php foreach($BillRequest as $key => $val):?>
<input type="hidden" name="<?php echo $key;?>" value="<?php echo $val;?>"/>
<?php endforeach;?>
<input type="submit" name="submit" value="提交到快錢" id="kqPay">
</form>
</div>
<script>
documentgetElementById(kqPay)click();
</script>

  
models/BillRequestphp
BillRequestphp

復制代碼 代碼如下:
<?php
class Application_Model_BillRequest
{
public function __construct($MockOrder){
/*
* 人民幣網關賬號
*第一種方式該賬號為位人民幣網關商戶編號+該參數必填對應工商銀行
*第二種方式該賬號為位人民幣網關商戶
*/
$this>merchantAcctId = "";
//服務器接收支付結果的後台地址該參數務必填寫絕對路徑//不能為空
$this>bgUrl = "http://bill/default/index/receive";
//商戶訂單號以下采用時間來定義訂單號商戶可以根據自己訂單號的定義規則來定義該值//不能為空
$this>orderId = TOLPCsprintf("%d" $MockOrder[orderId]);
//訂單金額金額以“分”為單位商戶測試以分測試即可切勿以大金額測試該參數必填//不能為空
$this>orderAmount =$MockOrder[orderAmount];
//訂單提交時間格式yyyyMMddHHmmss//不能為空
$this>orderTime = date("YmdHis" $MockOrder[orderTime]);
//支付人姓名可以為空
$this>payerName= "";
//支付人聯系類型 代表電子郵件方式 代表手機聯系方式可以為空
$this>payerContactType = "";
//支付人聯系方式與payerContactType設置對應payerContactType為則填寫郵箱地址payerContactType為則填寫手機號碼可以為空
$this>payerContact = "";
//商品名稱可以為空
$this>productName= "TOLPC";
//商品數量可以為空
$this>productNum = "";
//商品代碼可以為空
$this>productId = $MockOrder[ets_license];
//商品描述可以為空
$this>productDesc = "";
//支付方式一般為代表所有的支付方式如果是銀行直連商戶該值為必填//不能為空
$this>payType = "";
//編碼方式代表 UTF; 代表 GBK; 代表 GB 默認為該參數必填//不能為空
$this>inputCharset = "";
//網關版本固定值v該參數必填//不能為空
$this>version = "v";
//語言種類代表中文顯示代表英文顯示默認為該參數必填//不能為空
$this>language = "";
//簽名類型該值為代表PKI加密方式該參數必填//不能為空
$this>signType = "";
//接收支付結果的頁面地址該參數一般置為空即可
$this>pageUrl = "";
//擴展字段商戶可以傳遞自己需要的參數支付完快錢會原值返回可以為空
$this>ext = $MockOrder[orderId];
//擴展自段商戶可以傳遞自己需要的參數支付完快錢會原值返回可以為空
$this>ext = $MockOrder[orderTime];
//銀行代碼如果payType為該值可以為空如果payType為該值必須填寫具體請參考銀行列表
$this>bankId = "";
//同一訂單禁止重復提交標志實物購物車填虛擬產品用代表只能提交一次代表在支付不成功情況下可以再提交可為空
$this>redoFlag = "";
//快錢合作伙伴的帳戶號即商戶編號可為空
$this>pid = "";

//快錢提供的request參數
$KeyOrders = array(inputCharsetpageUrlbgUrlversionlanguagesignTypemerchantAcctIdpayerNamepayerContactTypepayerContact
orderIdorderAmountorderTimeproductNameproductNumproductIdproductDescextextpayTypebankIdredoFlagpid);

//判斷快錢提供的request參數的值是否為空把非空的參數及值重新組建數組
foreach($KeyOrders as $key){
if(==$this>{$key}){continue;}
$params[$key] = $this>{$key};
}
//http_build_query()生成URLencode之後的請求字符串
//urldecode()還原未編碼的字符串
//getSignMsg() PKI加密也可使用MD加密
//MD加密方式 strtoupper(md(urldecode(http_build_query($params))));這種不常用了
//常用PKI加密
$this>signMsg = $this>getSignMsg(urldecode(http_build_query($params)));
}

//PKI加密技術

public function getSignMsg($param){
//billrsapem是快錢的一個CA證書
//本地隨機生成一個KEY用此KEY加密數據 KEY為$priv_key_id
$priv_key_id = openssl_get_privatekey(file_get_contents("billrsapem" "r"));
//用$priv_key_id給$param數據加密
//計算一個簽名字符串$param通過使用SHA哈希加密隨後$priv_key_id私鑰加密數據本身是不加密的
openssl_sign($param $signMsg $priv_key_id OPENSSL_ALGO_SHA);
//從存儲器上釋放$priv_key_id
openssl_free_key($priv_key_id);
//使用base對數據進行編碼
return base_encode($signMsg);
}
}

  
models/BillResponsephp
BillResponsephp

復制代碼 代碼如下:
<?php
class Application_Model_BillResponse
{
/*
* __construct()構造函數
* 生成個參數及值可能有一個參數的值為空$this>errCode的值可能為空
*/
public function __construct($response){
$KeyOrders = array(merchantAcctIdversionlanguagesignTypepayTypebankIdorderIdorderTimeorderAmount
dealIdbankDealIddealTimepayAmountfeeextextpayResulterrCode signMsg);
foreach($KeyOrders as $key){
$this>{$key} = $response[$key];
}
}
/*
* 檢查簽名字符串
* 快錢返回的簽名字符串是$this>signMsg
* 使用base對前面字符串進行解碼
* 驗證使用快錢給的公鑰驗證
* 快錢那邊他們把返回來的參數值不為空的使用私鑰加密生成了$this>signMsg
* 快錢給了我們私鑰對應的公鑰我們使用這個公鑰來驗證成功失敗錯誤
*/
public function checkSignMsg(){
$KeyOrders = array(merchantAcctIdversionlanguagesignTypepayTypebankIdorderIdorderTimeorderAmount
dealIdbankDealIddealTimepayAmountfeeextextpayResulterrCode);
foreach($KeyOrders as $key){
if(==$this>{$key}){continue;}
$params[$key] = $this>{$key};
}
//$pub_key_id 公鑰
$pub_key_id = openssl_get_publickey(file_get_contents("billrsacer" "r"));
return openssl_verify(urldecode(http_build_query($params)) base_decode($this>signMsg) $pub_key_id);
}
public function isSuccess(){
//$this>payResult成功時失敗時
return ==$this>payResult;
}
public function getOrderId(){
return str_replace(XXX $this>orderId);
}
}

  
需要一個公鑰和一個私鑰這個不是一對的
都是一半
billrsacer
billrsapem


From:http://tw.wingwit.com/Article/program/PHP/201311/20903.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.