|
modules/default/controllers/IndexController.php
IndexController.php
復(fù)制代碼 代碼如下:
<?php
class IndexController extends Zend_Controller_Action
{
public function init()
{
/* Initialize action controller here */
}
public function indexAction()
{
/*模擬訂單
*$MockOrder是從數(shù)據(jù)庫(kù)取出來(lái)的信息,它包含一些塊錢(qián)Request的信息。這里我寫(xiě)死了。
*orderId訂單號(hào),數(shù)據(jù)庫(kù)表的主鍵(唯一)。 //必要字段
*usr_idtype證件類型,根據(jù)自己需要。
*usr_idcode證件號(hào),根據(jù)自己需要。
*etx_status是否優(yōu)惠,根據(jù)自己需要。
*time_create驗(yàn)證是否符合優(yōu)惠的時(shí)間,根據(jù)自己需要。
*ets_license套餐代碼如同商品類別,根據(jù)自己需要。
*contact_type聯(lián)系方式類型,固定選擇值1,2。1電子郵件,2手機(jī)號(hào),根據(jù)自己需要,塊錢(qián)那邊可以為空。
*contact_text聯(lián)系方式,根據(jù)contact_type來(lái)填寫(xiě),根據(jù)自己需要,塊錢(qián)那邊可以為空。
*etsPrice套餐價(jià)格及商品價(jià)格,根據(jù)自己需要。
*orderPrice實(shí)際價(jià)格,根據(jù)自己需要。
*orderAmount訂單實(shí)際支付金額,這個(gè)要加手續(xù)費(fèi)的。 //必要字段
*orderTime訂單時(shí)間。 //必要字段
*paySuccess訂單是否支付成功。 //必要字段
*buySuccess賬號(hào)是否生成功,根據(jù)自己需要
*payTime訂單支付成功時(shí)間。 //必要字段
*總之凡是跟訂單有關(guān)的都是必要字段
*orderId、orderAmount、orderTime為 Request所需字段
*paySuccess、payTime為Response所需字段
*/
$MockOrder = array();
$MockOrder['orderId'] = '100000125';//訂單號(hào)。--必要
$MockOrder['usr_idtype'] = '1';//證件類型,身份證
$MockOrder['usr_idcode'] = '371111199011111111';//身份證號(hào)
$MockOrder['etx_status'] = '0';//是否優(yōu)惠,否
$MockOrder['time_create'] = '1352338189';//驗(yàn)證是否優(yōu)惠時(shí)間
$MockOrder['ets_license'] = '1';//套餐代碼及商品類別
$MockOrder['contact_type'] = '1';//聯(lián)系方式類型 1,郵箱
$MockOrder['contact_text'] = 'x@163.com';//聯(lián)系方式,郵箱
$MockOrder['etsPrice'] = '30800';//套餐價(jià)格及商品價(jià)格
$MockOrder['orderPrice'] = '30800';//實(shí)際價(jià)格
$MockOrder['orderAmount'] = '31100';//訂單實(shí)際支付價(jià)格,加手續(xù)費(fèi)的。--必要
$MockOrder['orderTime'] = '1352338199';//訂單生成時(shí)間。--必要
$MockOrder['paySuccess'] = '0';//訂單是否支付成功。--必要
$MockOrder['buySuccess'] = '0';//賬號(hào)是否生成成功
$MockOrder['payTime'] = '0';//訂單支付時(shí)間。--必要
//BillRequest就是快錢(qián)那邊需要的的一些參數(shù)
$this->view->BillRequest = new Application_Model_BillRequest($MockOrder);
Zend_Debug::dump($this->view->BillRequest);exit;
}
//bgUrl地址指向這里
public function receiveAction()
{
//receive數(shù)據(jù)庫(kù)設(shè)計(jì)
/*用$MockReceive數(shù)組模擬
* $MockReceive = array();
* $MockReceive['id']主鍵;
* $MockReceive['orderId']商戶訂單號(hào);
* $MockReceive['receiveTime']接受時(shí)間;
* $MockReceive['queryString']http_build_encode($_REQUEST);
* $MockReceive['dealId']快錢(qián)交易號(hào);
* $MockReceive['bankDealId']銀行交易號(hào);
* $MockReceive['payResult']處理結(jié)果10:支付成功;11:支付失敗;
* $MockReceive['dealTime']快錢(qián)交易時(shí)間;
* $MockReceive['payAmount']訂單實(shí)際支付金額;
* $MockReceive['fee']費(fèi)用;
* $MockReceive['errCode']錯(cuò)誤代碼;
*/
/*$_REQUEST是快錢(qián)那邊返回來(lái)的數(shù)據(jù)
* merchantAcctId人民幣賬號(hào),與提交訂單時(shí)的塊錢(qián)賬號(hào)保持一致。
* version網(wǎng)關(guān)版本,固定值:v2.0,與提交訂單時(shí)的網(wǎng)關(guān)版本號(hào)保持一致。
* language網(wǎng)頁(yè)顯示語(yǔ)言種類,1中文顯示,與提交訂單時(shí)的網(wǎng)頁(yè)顯示語(yǔ)言種類保持一致
* signType簽名類型,4PKI簽名,與提交訂單時(shí)的簽名類型保持一致
* payType支付方式,00全部,與提交訂單時(shí)的支付方式保持一致
* bankId銀行代碼
* orderId商戶訂單號(hào),與提交訂單時(shí)的商戶訂單號(hào)保持一致
* orderTime商戶訂單提交時(shí)間,與提交訂單時(shí)的商戶訂單提交時(shí)間保持一致
* orderAmount商戶訂單金額,與提交訂單時(shí)的商戶訂單金額保持一致。
* dealId快錢(qián)交易號(hào)
* bankDealId銀行交易號(hào)
* dealTime快錢(qián)交易時(shí)間
* payAmount訂單實(shí)際支付金額
* fee費(fèi)用
* ext1擴(kuò)展字段1,與提交訂單時(shí)的擴(kuò)展字段1保持一致
* ext2擴(kuò)展字段2,與提交訂單時(shí)的擴(kuò)展字段2保持一致
* payResult處理結(jié)果 10:支付成功;11:支付失敗
* errCode錯(cuò)誤代碼,可為空
* signMsg簽名字符串
*/
$BillResponse = new Application_Model_BillResponse($_REQUEST);
//$BillResponse->checkSignMsg驗(yàn)證簽名字符串是否正確,防止bug漏洞等
if($BillResponse->checkSignMsg){
//判斷訂單支付是否成功
if($BillResponse->isSuccess){
//返回給快錢(qián),快錢(qián)會(huì)按照redirecturl地址跳到新頁(yè)面,這里是成功頁(yè)面
return "<result>1</result><redirecturl>http://99bill/default/index/sucess</redirecturl>";exit;
}else{
//返回給快錢(qián),快錢(qián)會(huì)按照redirecturl地址跳到新頁(yè)面,這個(gè)是失敗頁(yè)面
return "<result>1</result><redirecturl>http://99bill/default/index/fail</redirecturl>";exit;
}
}
//返回給快錢(qián),快錢(qián)會(huì)按照redirecturl地址跳到新頁(yè)面,這個(gè)是失敗頁(yè)面
return "<result>1</result><redirecturl>http://99bill/default/index/fail</redirecturl>";exit;
}
//redirecturl地址
//成功
public function success()
{
}
//失敗
public function fail()
{
}
}
modules/default/views/scripts/index/index.phtml
https://www.99bill.com/gateway/recvMerchantInfoAction.htm
復(fù)制代碼 代碼如下:
<?php $BillRequest = (array)$this->BillRequest;?>
<div style="display:none;">
<form name="kqPay" action="https://www.99bill.com/gateway/recvMerchantInfoAction.htm" method="post">
<?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="提交到快錢(qián)" id="kqPay">
</form>
</div>
<script>
document.getElementById('kqPay').click();
</script>
models/BillRequest.php
BillRequest.php
復(fù)制代碼 代碼如下:
<?php
class Application_Model_BillRequest
{
public function __construct($MockOrder){
/*
* 人民幣網(wǎng)關(guān)賬號(hào)。
*第一種方式:該賬號(hào)為11位人民幣網(wǎng)關(guān)商戶編號(hào)+01,該參數(shù)必填。01對(duì)應(yīng)工商銀行。
*第二種方式:該賬號(hào)為16位人民幣網(wǎng)關(guān)商戶
*/
$this->merchantAcctId = "1001011111101";
//服務(wù)器接收支付結(jié)果的后臺(tái)地址,該參數(shù)務(wù)必填寫(xiě),絕對(duì)路徑//不能為空。
$this->bgUrl = "http://99bill/default/index/receive";
//商戶訂單號(hào),以下采用時(shí)間來(lái)定義訂單號(hào),商戶可以根據(jù)自己訂單號(hào)的定義規(guī)則來(lái)定義該值//不能為空。
$this->orderId = 'TOLPC'.sprintf("%09d", $MockOrder['orderId']);
//訂單金額,金額以“分”為單位,商戶測(cè)試以1分測(cè)試即可,切勿以大金額測(cè)試,該參數(shù)必填//不能為空
$this->orderAmount =$MockOrder['orderAmount'];
//訂單提交時(shí)間,格式:yyyyMMddHHmmss,如:20071117020101//不能為空。
$this->orderTime = date("YmdHis", $MockOrder['orderTime']);
//支付人姓名,可以為空。
$this->payerName= "";
//支付人聯(lián)系類型,1 代表電子郵件方式;2 代表手機(jī)聯(lián)系方式。可以為空。
$this->payerContactType = "";
//支付人聯(lián)系方式,與payerContactType設(shè)置對(duì)應(yīng),payerContactType為1,則填寫(xiě)郵箱地址;payerContactType為2,則填寫(xiě)手機(jī)號(hào)碼。可以為空。
$this->payerContact = "";
//商品名稱,可以為空。
$this->productName= "TOLPC";
//商品數(shù)量,可以為空。
$this->productNum = "1";
//商品代碼,可以為空。
$this->productId = $MockOrder['ets_license'];
//商品描述,可以為空。
$this->productDesc = "";
//支付方式,一般為00,代表所有的支付方式。如果是銀行直連商戶,該值為10,必填//不能為空
$this->payType = "00";
//編碼方式,1代表 UTF-8; 2 代表 GBK; 3代表 GB2312 默認(rèn)為1,該參數(shù)必填//不能為空
$this->inputCharset = "1";
//網(wǎng)關(guān)版本,固定值:v2.0,該參數(shù)必填//不能為空
$this->version = "v2.0";
//語(yǔ)言種類,1代表中文顯示,2代表英文顯示。默認(rèn)為1,該參數(shù)必填//不能為空
$this->language = "1";
//簽名類型,該值為4,代表PKI加密方式,該參數(shù)必填//不能為空
$this->signType = "4";
//接收支付結(jié)果的頁(yè)面地址,該參數(shù)一般置為空即可。
$this->pageUrl = "";
//擴(kuò)展字段1,商戶可以傳遞自己需要的參數(shù),支付完快錢(qián)會(huì)原值返回,可以為空。
$this->ext1 = $MockOrder['orderId'];
//擴(kuò)展自段2,商戶可以傳遞自己需要的參數(shù),支付完快錢(qián)會(huì)原值返回,可以為空。
$this->ext2 = $MockOrder['orderTime'];
//銀行代碼,如果payType為00,該值可以為空;如果payType為10,該值必須填寫(xiě),具體請(qǐng)參考銀行列表。
$this->bankId = "";
//同一訂單禁止重復(fù)提交標(biāo)志,實(shí)物購(gòu)物車填1,虛擬產(chǎn)品用0。1代表只能提交一次,0代表在支付不成功情況下可以再提交。可為空。
$this->redoFlag = "";
//快錢(qián)合作伙伴的帳戶號(hào),即商戶編號(hào),可為空。
$this->pid = "";
//快錢(qián)提供的request參數(shù)。
$KeyOrders = array('inputCharset','pageUrl','bgUrl','version','language','signType','merchantAcctId','payerName','payerContactType','payerContact',
'orderId','orderAmount','orderTime','productName','productNum','productId','productDesc','ext1','ext2','payType','bankId','redoFlag','pid',);
//判斷快錢(qián)提供的request參數(shù)的值是否為空,把非空的參數(shù)及值重新組建數(shù)組
foreach($KeyOrders as $key){
if(''==$this->{$key}){continue;}
$params[$key] = $this->{$key};
}
//http_build_query()生成URL-encode之后的請(qǐng)求字符串
//urldecode()還原未編碼的字符串
//getSignMsg() PKI加密,也可使用MD5加密
//MD5加密方式 strtoupper(md5(urldecode(http_build_query($params))));這種不常用了。
//常用PKI加密
$this->signMsg = $this->getSignMsg(urldecode(http_build_query($params)));
}
//PKI加密技術(shù)
public function getSignMsg($param){
//99bill-rsa.pem是快錢(qián)的一個(gè)CA證書(shū)
//本地隨機(jī)生成一個(gè)KEY,用此KEY加密數(shù)據(jù) KEY為$priv_key_id
$priv_key_id = openssl_get_privatekey(file_get_contents("99bill-rsa.pem", "r"));
//用$priv_key_id給$param數(shù)據(jù)加密。
//計(jì)算一個(gè)簽名字符串$param通過(guò)使用SHA1哈希加密,隨后$priv_key_id私鑰加密。數(shù)據(jù)本身是不加密的。
openssl_sign($param, $signMsg, $priv_key_id, OPENSSL_ALGO_SHA1);
//從存儲(chǔ)器上釋放$priv_key_id
openssl_free_key($priv_key_id);
//使用base64對(duì)數(shù)據(jù)進(jìn)行編碼
return base64_encode($signMsg);
}
}
models/BillResponse.php
BillResponse.php
復(fù)制代碼 代碼如下:
<?php
class Application_Model_BillResponse
{
/*
* __construct()構(gòu)造函數(shù)
* 生成19個(gè)參數(shù)及值,可能有一個(gè)參數(shù)的值為空,$this->errCode的值可能為空
*/
public function __construct($response){
$KeyOrders = array('merchantAcctId','version','language','signType','payType','bankId','orderId','orderTime','orderAmount',
'dealId','bankDealId','dealTime','payAmount','fee','ext1','ext2','payResult','errCode', 'signMsg');
foreach($KeyOrders as $key){
$this->{$key} = $response[$key];
}
}
/*
* 檢查簽名字符串
* 快錢(qián)返回的簽名字符串是$this->signMsg
* 使用base64對(duì)前面字符串進(jìn)行解碼
* 驗(yàn)證使用快錢(qián)給的公鑰驗(yàn)證
* 快錢(qián)那邊他們把返回來(lái)的參數(shù)值不為空的使用私鑰加密生成了$this->signMsg
* 快錢(qián)給了我們私鑰對(duì)應(yīng)的公鑰,我們使用這個(gè)公鑰來(lái)驗(yàn)證。1成功,0失敗,-1錯(cuò)誤。
*/
public function checkSignMsg(){
$KeyOrders = array('merchantAcctId','version','language','signType','payType','bankId','orderId','orderTime','orderAmount',
'dealId','bankDealId','dealTime','payAmount','fee','ext1','ext2','payResult','errCode',);
foreach($KeyOrders as $key){
if(''==$this->{$key}){continue;}
$params[$key] = $this->{$key};
}
//$pub_key_id 公鑰
$pub_key_id = openssl_get_publickey(file_get_contents("99bill-rsa.cer", "r"));
return openssl_verify(urldecode(http_build_query($params)), base64_decode($this->signMsg), $pub_key_id);
}
public function isSuccess(){
//$this->payResult成功時(shí)10,失敗時(shí)11
return '10'==$this->payResult;
}
public function getOrderId(){
return str_replace('XXX', '', $this->orderId);
}
}
需要一個(gè)公鑰和一個(gè)私鑰,這個(gè)不是一對(duì)的
都是一半
99bill-rsa.cer
99bill-rsa.pem
php技術(shù):使用php實(shí)現(xiàn)快錢(qián)支付功能(涉及到接口),轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。