本项目用zend framework框架实现的modules/default/controllers/IndexController.php

IndexController.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联系方式类型,固定选择值1,2。1电子邮件,2手机号,根据自己需要,块钱那边可以为空。

*contact_text联系方式,根据contact_type来填写,根据自己需要,块钱那边可以为空。

*etsPrice套餐价格及商品价格,根据自己需要。

*orderPrice实际价格,根据自己需要。

*orderAmount订单实际支付金额,这个要加手续费的。  //必要字段

*orderTime订单时间。        //必要字段

*paySuccess订单是否支付成功。      //必要字段

*buySuccess账号是否生成功,根据自己需要

*payTime订单支付成功时间。       //必要字段

*总之凡是跟订单有关的都是必要字段

*orderId、orderAmount、orderTime为 Request所需字段

*paySuccess、payTime为Response所需字段

*/

$MockOrder = array();

$MockOrder['orderId'] = '100000125';//订单号。--必要

$MockOrder['usr_idtype'] = '1';//证件类型,身份证

$MockOrder['usr_idcode'] = '371111199011111111';//身份证号

$MockOrder['etx_status'] = '0';//是否优惠,否

$MockOrder['time_create'] = '1352338189';//验证是否优惠时间

$MockOrder['ets_license'] = '1';//套餐代码及商品类别

$MockOrder['contact_type'] = '1';//联系方式类型 1,邮箱

$MockOrder['contact_text'] = 'x@163.com';//联系方式,邮箱

$MockOrder['etsPrice'] = '30800';//套餐价格及商品价格

$MockOrder['orderPrice'] = '30800';//实际价格

$MockOrder['orderAmount'] = '31100';//订单实际支付价格,加手续费的。--必要

$MockOrder['orderTime'] = '1352338199';//订单生成时间。--必要

$MockOrder['paySuccess'] = '0';//订单是否支付成功。--必要

$MockOrder['buySuccess'] = '0';//账号是否生成成功

$MockOrder['payTime'] = '0';//订单支付时间。--必要

//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']处理结果10:支付成功;11:支付失败;

* $MockReceive['dealTime']快钱交易时间;

* $MockReceive['payAmount']订单实际支付金额;

* $MockReceive['fee']费用;

* $MockReceive['errCode']错误代码;

*/

/*$_REQUEST是快钱那边返回来的数据

* merchantAcctId人民币账号,与提交订单时的块钱账号保持一致。

* version网关版本,固定值:v2.0,与提交订单时的网关版本号保持一致。

* language网页显示语言种类,1中文显示,与提交订单时的网页显示语言种类保持一致

* signType签名类型,4PKI签名,与提交订单时的签名类型保持一致

* payType支付方式,00全部,与提交订单时的支付方式保持一致

* bankId银行代码

* orderId商户订单号,与提交订单时的商户订单号保持一致

* orderTime商户订单提交时间,与提交订单时的商户订单提交时间保持一致

* orderAmount商户订单金额,与提交订单时的商户订单金额保持一致。

* dealId快钱交易号

* bankDealId银行交易号

* dealTime快钱交易时间

* payAmount订单实际支付金额

* fee费用

* ext1扩展字段1,与提交订单时的扩展字段1保持一致

* ext2扩展字段2,与提交订单时的扩展字段2保持一致

* payResult处理结果 10:支付成功;11:支付失败

* errCode错误代码,可为空

* signMsg签名字符串

*/

$BillResponse = new Application_Model_BillResponse($_REQUEST);

//$BillResponse->checkSignMsg验证签名字符串是否正确,防止bug漏洞等

if($BillResponse->checkSignMsg){

//判断订单支付是否成功

if($BillResponse->isSuccess){

//返回给快钱,快钱会按照redirecturl地址跳到新页面,这里是成功页面

return "1http://99bill/default/index/sucess";exit;

}else{

//返回给快钱,快钱会按照redirecturl地址跳到新页面,这个是失败页面

return "1http://99bill/default/index/fail";exit;

}

}

//返回给快钱,快钱会按照redirecturl地址跳到新页面,这个是失败页面

return "1http://99bill/default/index/fail";exit;

}

//redirecturl地址

//成功

public function success()

{

}

//失败

public function fail()

{

}

}

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

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

<?php $BillRequest = (array)$this->BillRequest;?>

<?php foreach($BillRequest as $key => $val):?>

document.getElementById('kqPay').click();

models/BillRequest.php

BillRequest.php

class Application_Model_BillRequest

{

public function __construct($MockOrder){

/*

* 人民币网关账号。

*第一种方式:该账号为11位人民币网关商户编号+01,该参数必填。01对应工商银行。

*第二种方式:该账号为16位人民币网关商户

*/

$this->merchantAcctId = "1001011111101";

//服务器接收支付结果的后台地址,该参数务必填写,绝对路径//不能为空。

$this->bgUrl = "http://99bill/default/index/receive";

//商户订单号,以下采用时间来定义订单号,商户可以根据自己订单号的定义规则来定义该值//不能为空。

$this->orderId = 'TOLPC'.sprintf("%09d", $MockOrder['orderId']);

//订单金额,金额以“分”为单位,商户测试以1分测试即可,切勿以大金额测试,该参数必填//不能为空

$this->orderAmount =$MockOrder['orderAmount'];

//订单提交时间,格式:yyyyMMddHHmmss,如:20071117020101//不能为空。

$this->orderTime = date("YmdHis", $MockOrder['orderTime']);

//支付人姓名,可以为空。

$this->payerName= "";

//支付人联系类型,1 代表电子邮件方式;2 代表手机联系方式。可以为空。

$this->payerContactType =  "";

//支付人联系方式,与payerContactType设置对应,payerContactType为1,则填写邮箱地址;payerContactType为2,则填写手机号码。可以为空。

$this->payerContact =  "";

//商品名称,可以为空。

$this->productName= "TOLPC";

//商品数量,可以为空。

$this->productNum = "1";

//商品代码,可以为空。

$this->productId = $MockOrder['ets_license'];

//商品描述,可以为空。

$this->productDesc = "";

//支付方式,一般为00,代表所有的支付方式。如果是银行直连商户,该值为10,必填//不能为空

$this->payType = "00";

//编码方式,1代表 UTF-8; 2 代表 GBK; 3代表 GB2312 默认为1,该参数必填//不能为空

$this->inputCharset = "1";

//网关版本,固定值:v2.0,该参数必填//不能为空

$this->version =  "v2.0";

//语言种类,1代表中文显示,2代表英文显示。默认为1,该参数必填//不能为空

$this->language =  "1";

//签名类型,该值为4,代表PKI加密方式,该参数必填//不能为空

$this->signType =  "4";

//接收支付结果的页面地址,该参数一般置为空即可。

$this->pageUrl = "";

//扩展字段1,商户可以传递自己需要的参数,支付完快钱会原值返回,可以为空。

$this->ext1 = $MockOrder['orderId'];

//扩展自段2,商户可以传递自己需要的参数,支付完快钱会原值返回,可以为空。

$this->ext2 = $MockOrder['orderTime'];

//银行代码,如果payType为00,该值可以为空;如果payType为10,该值必须填写,具体请参考银行列表。

$this->bankId = "";

//同一订单禁止重复提交标志,实物购物车填1,虚拟产品用0。1代表只能提交一次,0代表在支付不成功情况下可以再提交。可为空。

$this->redoFlag = "";

//快钱合作伙伴的帐户号,即商户编号,可为空。

$this->pid = "";

//快钱提供的request参数。

$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',);

//判断快钱提供的request参数的值是否为空,把非空的参数及值重新组建数组

foreach($KeyOrders as $key){

if(''==$this->{$key}){continue;}

$params[$key] = $this->{$key};

}

//http_build_query()生成URL-encode之后的请求字符串

//urldecode()还原未编码的字符串

//getSignMsg() PKI加密,也可使用MD5加密

//MD5加密方式  strtoupper(md5(urldecode(http_build_query($params))));这种不常用了。

//常用PKI加密

$this->signMsg = $this->getSignMsg(urldecode(http_build_query($params)));

}

//PKI加密技术

public function getSignMsg($param){

//99bill-rsa.pem是快钱的一个CA证书

//本地随机生成一个KEY,用此KEY加密数据 KEY为$priv_key_id

$priv_key_id = openssl_get_privatekey(file_get_contents("99bill-rsa.pem", "r"));

//用$priv_key_id给$param数据加密。

//计算一个签名字符串$param通过使用SHA1哈希加密,随后$priv_key_id私钥加密。数据本身是不加密的。

openssl_sign($param, $signMsg, $priv_key_id, OPENSSL_ALGO_SHA1);

//从存储器上释放$priv_key_id

openssl_free_key($priv_key_id);

//使用base64对数据进行编码

return base64_encode($signMsg);

}

}

models/BillResponse.php

BillResponse.php

class Application_Model_BillResponse

{

/*

* __construct()构造函数

* 生成19个参数及值,可能有一个参数的值为空,$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];

}

}

/*

* 检查签名字符串

* 快钱返回的签名字符串是$this->signMsg

* 使用base64对前面字符串进行解码

* 验证使用快钱给的公钥验证

* 快钱那边他们把返回来的参数值不为空的使用私钥加密生成了$this->signMsg

* 快钱给了我们私钥对应的公钥,我们使用这个公钥来验证。1成功,0失败,-1错误。

*/

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成功时10,失败时11

return '10'==$this->payResult;

}

public function getOrderId(){

return str_replace('XXX', '', $this->orderId);

}

}

需要一个公钥和一个私钥,这个不是一对的

都是一半

99bill-rsa.cer

99bill-rsa.pem

php 银行支付通道_使用php实现快钱支付功能(涉及到接口)相关推荐

  1. 在J2EE项目中集成快钱支付接口

    转载地址 [url] http://my.oschina.net/bairrfhoinn/blog/78184[/url] 首先是发送快钱支付请求的页面send.jsp,内容如下: 001 <% ...

  2. 快钱 支付 php,GitHub - laraveler/omnipay-99bill: 基于Omnipay的快钱支付SDK

    omnipay-99bill 基于Omnipay的快钱支付SDK 该文档共包含以下5个部分: 1.创建交易 2.支付回调 3.交易查询 4.网关退款 Quick Start 快速开始 PHP版本要求: ...

  3. php 实现快钱支付功能(涉及到接口)

    本项目用zend framework框架实现的 modules/default/controllers/IndexController.php IndexController.php <?php ...

  4. 快钱支付平台 退款功能

    最近做快钱支付平台的退款功能,遇到不少问题,在解决问题的过程中,也获得了不少心得,现在将它们整理出来,以备不时之需. 首先,在做退款功能前,需要研究<快钱人民币网关商户退款接口规范>,弄明 ...

  5. magento -- 开发magento快钱支付模块

    浪费了三四天时间终于完成了magento的快钱支付模块.其实对于熟悉magento的程序员来说,开发一个普通的支付模块不需要太多的时间,可能一天或者一个下午就可以完成开发和测试.然而快钱的magent ...

  6. php 银行支付通道_接口--php对接农行网上支付平台-b2b

    对接农行网上支付平台 从银行那边获取到对应的接口包 将文件保存在网站的路径中 我是destoon网站系统对接,就放在了api/pay/新建一个文件夹abc/下 完成之后填写接口的配置文件 路径:ebu ...

  7. jsapi支付签名_小程序开发之微信支付

    1. 小程序之微信支付 虽然我们现行的小程序版本中没有支付这块功能,但是作为移动互联网中非常重要的一个功能还是需要了解下(老版本的小程序中有微信支付相关的功能代码在serviceList.js中). ...

  8. 快钱接口php,快钱支付接口

    1.下载快钱的demo代码和一个证书包,还有 人民币网关自助接入接口文档 2.生成自己的证书 2.0.安装   Win32OpenSSL_Light-0_9_8k.exe 打开openssl.exe, ...

  9. 云付认证已通过可以支付吗_海科融通丨刷新支付日常问题【附交易操作步奏】...

    01 常见问题汇总 QPIN秘钥检验出错 A:认证时不要频繁点击,点完后等一等系统反应,可联系客服处理. Q报错99,该小商户已入网 A:提供商户编号给服务经理处理. Q终端屏幕无法签字 A:待机界面 ...

最新文章

  1. servlet必知细节(一)
  2. Spring_Hibernate整合准备
  3. 【机器翻译】transformer
  4. ios序列化与反序列化,本地化
  5. python 类的内置方法_Python 类的常用内置方法
  6. Java黑皮书课后题第7章:7.26(完全相同的数组)如果两个数组list1和list2的对应元素都相等,认为完全相同。编写一个测试程序,提示用户输入两个整数列表,然后显示这两个列表是否完全相同
  7. Round A - Kick Start 2019
  8. 师大校园网迅雷解封软件 Ver1.0.1.5(2009-06-12)
  9. JList的基本操作
  10. python(22)--面向对象1-封装
  11. 【Java】内存解析
  12. C语言实现单向链表、双向链表、循环链表
  13. Web端微信授权登录
  14. 自我职业生涯规划的三步走
  15. 北京开通企业登记“e窗通”服务平台 开办企业可3天完成
  16. 【蓝桥杯】基础练习十六进制转十进制
  17. 14年macmini装双硬盘_Mac mini 2014版(中配)更换固态硬盘
  18. 微信公众平台iPhone版开始内测了
  19. ubuntu下彻底卸载软件
  20. sa-token进阶

热门文章

  1. Mycat JVM appears hung: Timed out waiting for signal from JVM.
  2. MATLAB-基于灰色神经网络的预测算法研究(订单需求预测)
  3. python爬虫可视化——小龙虾
  4. 360浏览器等被金山毒霸网强制霸占问题解决
  5. 毕业设计之 --- 基于图像识别的跌倒检测算法
  6. day01 与MySQL的第一次亲密接触基础查询条件查询
  7. 机器学习入门之PCA与ICA
  8. 为什么投资拉勾的是前程无忧?
  9. larbin的详细配置
  10. 用 Python 来全自动抢微信红包