php实现快钱接口

http://blog.csdn.net/motian06/article/details/8162548

本项目用zend framework框架实现的

modules/default/controllers/IndexController.php

IndexController.php

[php]  view plain copy
  1. <?php  
  2. class IndexController extends Zend_Controller_Action  
  3. {  
  4.   
  5.     public function init()  
  6.     {  
  7.         /* Initialize action controller here */  
  8.     }  
  9.   
  10.     public function indexAction()  
  11.     {     
  12.           
  13.         /*模拟订单  
  14.          *$MockOrder是从数据库取出来的信息,它包含一些块钱Request的信息。这里我写死了。 
  15.          *orderId订单号,数据库表的主键(唯一)。               //必要字段 
  16.          *usr_idtype证件类型,根据自己需要。 
  17.          *usr_idcode证件号,根据自己需要。 
  18.          *etx_status是否优惠,根据自己需要。 
  19.          *time_create验证是否符合优惠的时间,根据自己需要。 
  20.          *ets_license套餐代码如同商品类别,根据自己需要。 
  21.          *contact_type联系方式类型,固定选择值1,2。1电子邮件,2手机号,根据自己需要,块钱那边可以为空。 
  22.          *contact_text联系方式,根据contact_type来填写,根据自己需要,块钱那边可以为空。 
  23.          *etsPrice套餐价格及商品价格,根据自己需要。 
  24.          *orderPrice实际价格,根据自己需要。 
  25.          *orderAmount订单实际支付金额,这个要加手续费的。     //必要字段 
  26.          *orderTime订单时间。                                //必要字段 
  27.          *paySuccess订单是否支付成功。                       //必要字段 
  28.          *buySuccess账号是否生成功,根据自己需要 
  29.          *payTime订单支付成功时间。                          //必要字段 
  30.          *总之凡是跟订单有关的都是必要字段 
  31.          *orderId、orderAmount、orderTime为 Request所需字段 
  32.          *paySuccess、payTime为Response所需字段 
  33.          */  
  34.         $MockOrder = array();  
  35.         $MockOrder['orderId'] = '100000125';//订单号。--必要  
  36.         $MockOrder['usr_idtype'] = '1';//证件类型,身份证  
  37.         $MockOrder['usr_idcode'] = '371111199011111111';//身份证号  
  38.         $MockOrder['etx_status'] = '0';//是否优惠,否  
  39.         $MockOrder['time_create'] = '1352338189';//验证是否优惠时间  
  40.         $MockOrder['ets_license'] = '1';//套餐代码及商品类别  
  41.         $MockOrder['contact_type'] = '1';//联系方式类型 1,邮箱  
  42.         $MockOrder['contact_text'] = 'x@163.com';//联系方式,邮箱  
  43.         $MockOrder['etsPrice'] = '30800';//套餐价格及商品价格  
  44.         $MockOrder['orderPrice'] = '30800';//实际价格  
  45.         $MockOrder['orderAmount'] = '31100';//订单实际支付价格,加手续费的。--必要  
  46.         $MockOrder['orderTime'] = '1352338199';//订单生成时间。--必要  
  47.         $MockOrder['paySuccess'] = '0';//订单是否支付成功。--必要  
  48.         $MockOrder['buySuccess'] = '0';//账号是否生成成功  
  49.         $MockOrder['payTime'] = '0';//订单支付时间。--必要  
  50.           
  51.         //BillRequest就是快钱那边需要的的一些参数  
  52.         $this->view->BillRequest = new Application_Model_BillRequest($MockOrder);  
  53.         Zend_Debug::dump($this->view->BillRequest);exit;        
  54.     }  
  55.       
  56.     //bgUrl地址指向这里  
  57.     public function receiveAction()  
  58.     {  
  59.         //receive数据库设计  
  60.         /*用$MockReceive数组模拟 
  61.          * $MockReceive = array(); 
  62.          * $MockReceive['id']主键; 
  63.          * $MockReceive['orderId']商户订单号; 
  64.          * $MockReceive['receiveTime']接受时间; 
  65.          * $MockReceive['queryString']http_build_encode($_REQUEST); 
  66.          * $MockReceive['dealId']快钱交易号; 
  67.          * $MockReceive['bankDealId']银行交易号; 
  68.          * $MockReceive['payResult']处理结果10:支付成功;11:支付失败; 
  69.          * $MockReceive['dealTime']快钱交易时间; 
  70.          * $MockReceive['payAmount']订单实际支付金额; 
  71.          * $MockReceive['fee']费用; 
  72.          * $MockReceive['errCode']错误代码; 
  73.          */  
  74.           
  75.           
  76.         /*$_REQUEST是快钱那边返回来的数据 
  77.          * merchantAcctId人民币账号,与提交订单时的块钱账号保持一致。 
  78.          * version网关版本,固定值:v2.0,与提交订单时的网关版本号保持一致。 
  79.          * language网页显示语言种类,1中文显示,与提交订单时的网页显示语言种类保持一致 
  80.          * signType签名类型,4PKI签名,与提交订单时的签名类型保持一致 
  81.          * payType支付方式,00全部,与提交订单时的支付方式保持一致 
  82.          * bankId银行代码 
  83.          * orderId商户订单号,与提交订单时的商户订单号保持一致 
  84.          * orderTime商户订单提交时间,与提交订单时的商户订单提交时间保持一致 
  85.          * orderAmount商户订单金额,与提交订单时的商户订单金额保持一致。 
  86.          * dealId快钱交易号 
  87.          * bankDealId银行交易号 
  88.          * dealTime快钱交易时间 
  89.          * payAmount订单实际支付金额 
  90.          * fee费用 
  91.          * ext1扩展字段1,与提交订单时的扩展字段1保持一致 
  92.          * ext2扩展字段2,与提交订单时的扩展字段2保持一致 
  93.          * payResult处理结果 10:支付成功;11:支付失败 
  94.          * errCode错误代码,可为空 
  95.          * signMsg签名字符串 
  96.          */  
  97.         $BillResponse = new Application_Model_BillResponse($_REQUEST);  
  98.         //$BillResponse->checkSignMsg验证签名字符串是否正确,防止bug漏洞等  
  99.         if($BillResponse->checkSignMsg){  
  100.             //判断订单支付是否成功  
  101.             if($BillResponse->isSuccess){  
  102.                 //返回给快钱,快钱会按照redirecturl地址跳到新页面,这里是成功页面  
  103.                 return "<result>1</result><redirecturl>http://99bill/default/index/sucess</redirecturl>";exit;  
  104.             }else{  
  105.                 //返回给快钱,快钱会按照redirecturl地址跳到新页面,这个是失败页面  
  106.                 return "<result>1</result><redirecturl>http://99bill/default/index/fail</redirecturl>";exit;  
  107.             }  
  108.         }  
  109.         //返回给快钱,快钱会按照redirecturl地址跳到新页面,这个是失败页面  
  110.         return "<result>1</result><redirecturl>http://99bill/default/index/fail</redirecturl>";exit;  
  111.     }  
  112.       
  113.     //redirecturl地址  
  114.     //成功  
  115.     public function success()  
  116.     {  
  117.       
  118.     }  
  119.       
  120.     //失败  
  121.     public function fail()  
  122.     {  
  123.       
  124.     }  
  125.   
  126. }  

modules/default/views/scripts/index/index.phtml

https://www.99bill.com/gateway/recvMerchantInfoAction.htm

[html]  view plain copy
  1. <?php $BillRequest = (array)$this->BillRequest;?>  
  2. <div style="display:none;">  
  3. <form name="kqPay" action="https://www.99bill.com/gateway/recvMerchantInfoAction.htm" method="post">  
  4. <?php foreach($BillRequest as $key => $val):?>  
  5.     <input type="hidden" name="<?php echo $key;?>" value="<?php echo $val;?>"/>  
  6. <?php endforeach;?>  
  7.     <input type="submit" name="submit" value="提交到快钱" id="kqPay">  
  8. </form>  
  9. </div>  
  10. <script>  
  11. document.getElementById('kqPay').click();  
  12. </script>  

models/BillRequest.php

BillRequest.php

[php]  view plain copy
  1. <?php  
  2. class Application_Model_BillRequest  
  3. {  
  4.     public function __construct($MockOrder){  
  5.         /* 
  6.          * 人民币网关账号。 
  7.          *第一种方式:该账号为11位人民币网关商户编号+01,该参数必填。01对应工商银行。 
  8.          *第二种方式:该账号为16位人民币网关商户 
  9.          */  
  10.         $this->merchantAcctId = "1001011111101";   
  11.         //服务器接收支付结果的后台地址,该参数务必填写,绝对路径//不能为空。  
  12.         $this->bgUrl = "http://99bill/default/index/receive";  
  13.         //商户订单号,以下采用时间来定义订单号,商户可以根据自己订单号的定义规则来定义该值//不能为空。  
  14.         $this->orderId = 'TOLPC'.sprintf("%09d"$MockOrder['orderId']);  
  15.         //订单金额,金额以“分”为单位,商户测试以1分测试即可,切勿以大金额测试,该参数必填//不能为空  
  16.         $this->orderAmount =$MockOrder['orderAmount'];  
  17.         //订单提交时间,格式:yyyyMMddHHmmss,如:20071117020101//不能为空。  
  18.         $this->orderTime = date("YmdHis"$MockOrder['orderTime']);  
  19.         //支付人姓名,可以为空。  
  20.         $this->payerName= "";   
  21.         //支付人联系类型,1 代表电子邮件方式;2 代表手机联系方式。可以为空。  
  22.         $this->payerContactType =  "";  
  23.         //支付人联系方式,与payerContactType设置对应,payerContactType为1,则填写邮箱地址;payerContactType为2,则填写手机号码。可以为空。  
  24.         $this->payerContact =  "";  
  25.         //商品名称,可以为空。  
  26.         $this->productName= "TOLPC";  
  27.         //商品数量,可以为空。  
  28.         $this->productNum = "1";  
  29.         //商品代码,可以为空。  
  30.         $this->productId = $MockOrder['ets_license'];  
  31.         //商品描述,可以为空。  
  32.         $this->productDesc = "";  
  33.         //支付方式,一般为00,代表所有的支付方式。如果是银行直连商户,该值为10,必填//不能为空  
  34.         $this->payType = "00";  
  35.         //编码方式,1代表 UTF-8; 2 代表 GBK; 3代表 GB2312 默认为1,该参数必填//不能为空  
  36.         $this->inputCharset = "1";  
  37.         //网关版本,固定值:v2.0,该参数必填//不能为空  
  38.         $this->version =  "v2.0";  
  39.         //语言种类,1代表中文显示,2代表英文显示。默认为1,该参数必填//不能为空  
  40.         $this->language =  "1";  
  41.         //签名类型,该值为4,代表PKI加密方式,该参数必填//不能为空  
  42.         $this->signType =  "4";  
  43.         //接收支付结果的页面地址,该参数一般置为空即可。  
  44.         $this->pageUrl = "";  
  45.         //扩展字段1,商户可以传递自己需要的参数,支付完快钱会原值返回,可以为空。  
  46.         $this->ext1 = $MockOrder['orderId'];  
  47.         //扩展自段2,商户可以传递自己需要的参数,支付完快钱会原值返回,可以为空。  
  48.         $this->ext2 = $MockOrder['orderTime'];  
  49.         //银行代码,如果payType为00,该值可以为空;如果payType为10,该值必须填写,具体请参考银行列表。  
  50.         $this->bankId = "";  
  51.         //同一订单禁止重复提交标志,实物购物车填1,虚拟产品用0。1代表只能提交一次,0代表在支付不成功情况下可以再提交。可为空。  
  52.         $this->redoFlag = "";  
  53.         //快钱合作伙伴的帐户号,即商户编号,可为空。  
  54.         $this->pid = "";  
  55.           
  56.         //快钱提供的request参数。  
  57.         $KeyOrders = array('inputCharset','pageUrl','bgUrl','version','language','signType','merchantAcctId','payerName','payerContactType','payerContact',  
  58.             'orderId','orderAmount','orderTime','productName','productNum','productId','productDesc','ext1','ext2','payType','bankId','redoFlag','pid',);  
  59.           
  60.         //判断快钱提供的request参数的值是否为空,把非空的参数及值重新组建数组  
  61.         foreach($KeyOrders as $key){  
  62.             if(''==$this->{$key}){continue;}  
  63.             $params[$key] = $this->{$key};  
  64.         }  
  65.         //http_build_query()生成URL-encode之后的请求字符串  
  66.         //urldecode()还原未编码的字符串  
  67.         //getSignMsg() PKI加密,也可使用MD5加密  
  68.         //MD5加密方式   strtoupper(md5(urldecode(http_build_query($params))));这种不常用了。  
  69.         //常用PKI加密  
  70.         $this->signMsg = $this->getSignMsg(urldecode(http_build_query($params)));  
  71.     }  
  72.       
  73.     //PKI加密技术  
  74.       
  75.     public function getSignMsg($param){  
  76.         //99bill-rsa.pem是快钱的一个CA证书  
  77.         //本地随机生成一个KEY,用此KEY加密数据 KEY为$priv_key_id  
  78.         $priv_key_id = openssl_get_privatekey(file_get_contents("99bill-rsa.pem""r"));  
  79.         //用$priv_key_id给$param数据加密。  
  80.         //计算一个签名字符串$param通过使用SHA1哈希加密,随后$priv_key_id私钥加密。数据本身是不加密的。  
  81.         openssl_sign($param$signMsg$priv_key_id, OPENSSL_ALGO_SHA1);  
  82.         //从存储器上释放$priv_key_id  
  83.         openssl_free_key($priv_key_id);  
  84.         //使用base64对数据进行编码  
  85.         return base64_encode($signMsg);  
  86.     }  
  87. }  

models/BillResponse.php

BillResponse.php

[php]  view plain copy
  1. <?php  
  2. class Application_Model_BillResponse  
  3. {  
  4.     /* 
  5.      * __construct()构造函数 
  6.      * 生成19个参数及值,可能有一个参数的值为空,$this->errCode的值可能为空 
  7.      */  
  8.     public function __construct($response){  
  9.         $KeyOrders = array('merchantAcctId','version','language','signType','payType','bankId','orderId','orderTime','orderAmount',  
  10.             'dealId','bankDealId','dealTime','payAmount','fee','ext1','ext2','payResult','errCode''signMsg');  
  11.   
  12.         foreach($KeyOrders as $key){  
  13.             $this->{$key} = $response[$key];  
  14.         }  
  15.     }  
  16.     /* 
  17.      * 检查签名字符串 
  18.      * 快钱返回的签名字符串是$this->signMsg 
  19.      * 使用base64对前面字符串进行解码 
  20.      * 验证使用快钱给的公钥验证 
  21.      * 快钱那边他们把返回来的参数值不为空的使用私钥加密生成了$this->signMsg 
  22.      * 快钱给了我们私钥对应的公钥,我们使用这个公钥来验证。1成功,0失败,-1错误。 
  23.      */  
  24.     public function checkSignMsg(){  
  25.         $KeyOrders = array('merchantAcctId','version','language','signType','payType','bankId','orderId','orderTime','orderAmount',  
  26.             'dealId','bankDealId','dealTime','payAmount','fee','ext1','ext2','payResult','errCode',);  
  27.   
  28.         foreach($KeyOrders as $key){  
  29.             if(''==$this->{$key}){continue;}  
  30.             $params[$key] = $this->{$key};  
  31.         }  
  32.         //$pub_key_id 公钥  
  33.         $pub_key_id = openssl_get_publickey(file_get_contents("99bill-rsa.cer""r"));  
  34.         return openssl_verify(urldecode(http_build_query($params)), base64_decode($this->signMsg), $pub_key_id);   
  35.     }  
  36.   
  37.     public function isSuccess(){  
  38.         //$this->payResult成功时10,失败时11  
  39.         return '10'==$this->payResult;  
  40.     }  
  41.   
  42.     public function getOrderId(){  
  43.         return str_replace('XXX'''$this->orderId);  
  44.     }  
  45. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值