热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

本篇文章是对使用php实现快钱支付功能的代码进行了详细的分析介绍,需要的朋友参考下
本项目用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

代码如下:


BillRequest;?>



$val):?>







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

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
author-avatar
然然妈1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有