首页 后端开发 php教程 使用php实现快钱支付功能_PHP教程

使用php实现快钱支付功能_PHP教程

Jul 20, 2016 am 11:16 AM
def framework php zend 使用 功能 实现 支付 框架 项目

本项目用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):?>





<script><br /> document.getElementById('kqPay').click();<br /> </script>


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

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/372419.htmlTechArticle本项目用zend framework框架实现的 modules/default/controllers/IndexController.php IndexController.php 复制代码 代码如下: ?php class IndexController extends Zend_Con...
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1668
14
CakePHP 教程
1426
52
Laravel 教程
1329
25
PHP教程
1273
29
C# 教程
1256
24
PHP:网络开发的关键语言 PHP:网络开发的关键语言 Apr 13, 2025 am 12:08 AM

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

PHP和Python:比较两种流行的编程语言 PHP和Python:比较两种流行的编程语言 Apr 14, 2025 am 12:13 AM

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP与Python:了解差异 PHP与Python:了解差异 Apr 11, 2025 am 12:15 AM

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

PHP行动:现实世界中的示例和应用程序 PHP行动:现实世界中的示例和应用程序 Apr 14, 2025 am 12:19 AM

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

PHP的持久相关性:它还活着吗? PHP的持久相关性:它还活着吗? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在现代编程领域中依然占据重要地位。1)PHP的简单易学和强大社区支持使其在Web开发中广泛应用;2)其灵活性和稳定性使其在处理Web表单、数据库操作和文件处理等方面表现出色;3)PHP不断进化和优化,适用于初学者和经验丰富的开发者。

PHP与其他语言:比较 PHP与其他语言:比较 Apr 13, 2025 am 12:19 AM

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

PHP和Python:解释了不同的范例 PHP和Python:解释了不同的范例 Apr 18, 2025 am 12:26 AM

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP和Python:代码示例和比较 PHP和Python:代码示例和比较 Apr 15, 2025 am 12:07 AM

PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。

See all articles