PHP22 PHP在线支付
易宝支付示例脚本
参考网址:https://blog.csdn.net/yerenyuan_pku/article/details/52239862
参数说明
- p1_MerId:商户编号,网站在易宝上申请一个账号时,易宝支付系统为商户分配的唯一身份标识。
- p8_Url(此参数是非常重要的):该响应地址就是支付流程图中第14步的那个地址,是由易宝给用户的,通知网站是否支付成功。
- pd_FrpId:即支付通道编码,用户向易宝发送请求时,告诉易宝找哪个银行去支付。
- pr_NeedResponse:即应答机制。
应答机制
用户通过网站发支付请求,网站让用户去找易宝,如果用户在易宝那端支付成功,那这时易宝要通知网站支付成功,易宝怎么去通知网站是否支付成功呢?
答:易宝都是要用户浏览器去重定向到网站上面去,在重定向的时候后面跟一个消息,即是否支付成功。
那么就会出现一个问题:如果只是采用这种模型来通知网站是否支付成功,这是有问题的,你让用户浏览器重定向,用户浏览器恰恰坏了,那就无法重定向到网站,通知网站是否支付成功。这时无法把订单置为true,即用户就没有支付。那又改怎么去解决这个问题呢?
答:易宝采用了一种比较稳妥的方法,它收到支付成功的消息后,它会让用户浏览器去重定向到网站上面去,以通知网站是否支付成功。除此之外,它自己还会向在线支付请求参数中的p8_Url所代表的servlet发请求,它一直发,直到网站给易宝返回success为止,易宝收到success,它就认为网站收到了支付成功的消息,如果易宝向网站发请求,网站没有给他返回success,它就认为网站没收到支付成功的消息,它会不停地向网站发,一直到网站收到为止。
hmac,即hmac码。该hmac码是由网站通过以上易宝需要的支付请求参数和密钥(网站在易宝上申请一个账号时,易宝支付系统为每个申请者分配的唯一密钥)混在一起,经由MD5算法生成的。
支付请求页面index.html
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
</head>
<form action="payConfirm.php" method="post">
<table>
<tr>
<td colspan="4">
订单号:<input type="text" name="p2_Order"/>
支付金额:<input type="text" name="p3_Amt"/></td>
</tr>
<tr><td colspan="4">请选择支付银行</td></tr>
<tr>
<td><input type="radio"name="pd_FrpId" value="CMBCHINA-NET"/>招商银行</td>
<td><input type="radio"name="pd_FrpId" value="ICBC-NET"/>工商银行</td>
<td><input type="radio"name="pd_FrpId" value="ABC-NET"/>农业银行</td>
<td><input type="radio"name="pd_FrpId" value="CCB-NET"/>建设银行</td>
</tr>
<tr>
<td colspan="4"><input type="submit" value="确认支付"/></td>
</tr>
</table>
</form>
确认支付数据处理payConfirm.php
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
</head>
<?php
include 'common.php'; $p0_Cmd = "Buy";//业务类型
$p1_MerId = "10001126856";//商户编号(测试账号)
$p2_Order = $_REQUEST['p2_Order'];//获取用户提交表单中的订单编号
$p3_Amt = $_REQUEST['p3_Amt'];//订单金额
$p4_Cur = "CNY";//交易币种,固定值是'CNY' 人民币 $p5_Pid = "";// 商品名称
$p6_Pcat = ""; // 商品种类
$p7_Pdesc = ""; // 商品介绍 $p8_Url = "http://loaclhost/mythinkphp/pay/res.php";//易宝支付成功后,返回信息到此url
$p9_SAF = "0"; // 送货地址
$pa_MP = ""; // 商品扩展信息
$pd_FrpId = $_REQUEST['pd_FrpId']; // 银行支付通道
$pr_NeedResponse = "1"; // 应答机制
// 我们把请求参数一个一个拼接(拼接的时候,顺序很重要!!)
$data="";
$data=$data.$p0_Cmd;
$data=$data.$p1_MerId;
$data=$data.$p2_Order;
$data=$data.$p3_Amt;
$data=$data.$p4_Cur;
$data=$data.$p5_Pid;
$data=$data.$p6_Pcat;
$data=$data.$p7_Pdesc;
$data=$data.$p8_Url;
$data=$data.$p9_SAF;
$data=$data.$pa_MP;
$data=$data.$pd_FrpId;
$data=$data.$pr_NeedResponse; $merchantKey ="69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl";
// hmac签名串,是用于易宝和商家互相确认的关键字
$hmac = HmacMd5($data,$merchantKey); ?>
你的订单号是:<?php echo $p2_Order; ?>支付的金额是<?php echo $p3_Amt; ?>
<!-- 把要提交的数据用隐藏域表示 -->
<form action="https://www.yeepay.com/app-merchant-proxy/node" method="post">
<input type="hidden" name="p0_Cmd" value="<?php echo $p0_Cmd; ?>"/>
<input type="hidden" name="p1_MerId" value="<?php echo $p1_MerId; ?>"/>
<input type="hidden" name="p2_Order" value="<?php echo $p2_Order; ?>"/>
<input type="hidden" name="p3_Amt" value="<?php echo $p3_Amt; ?>"/>
<input type="hidden" name="p4_Cur" value="<?php echo $p4_Cur; ?>"/>
<input type="hidden" name="p5_Pid" value="<?php echo $p5_Pid; ?>"/>
<input type="hidden" name="p6_Pcat" value="<?php echo $p6_Pcat; ?>"/>
<input type="hidden" name="p7_Pdesc" value="<?php echo $p7_Pdesc; ?>"/>
<input type="hidden" name="p8_Url" value="<?php echo $p8_Url; ?>"/>
<input type="hidden" name="p9_SAF" value="<?php echo $p9_SAF; ?>"/>
<input type="hidden" name="pa_MP" value="<?php echo $pa_MP; ?>"/>
<input type="hidden" name="pd_FrpId" value="<?php echo $pd_FrpId; ?>"/>
<input type="hidden" name="pr_NeedResponse" value="<?php echo $pr_NeedResponse; ?>"/>
<input type="hidden" name="hmac" value="<?php echo $hmac; ?>"/>
<input type="submit" value="确认网上支付"/>
</form>
</html>
支付加密common.php文件
<?php
function HmacMd5($data, $key)
{
//需要配置环境支撑iconv,否则中文参数不能正常处理
$key = iconv("GB2312", "UTF-8", $key);
$data = iconv("GB2312", "UTF-8", $data);
$b = 64;
if (strlen($key) > $b) {
$key = pack("H*", md5($key));
}
$key = str_pad($key, $b, chr(0x00));
$ipad = str_pad('', $b, chr(0x36));
$opad = str_pad('', $b, chr(0x5c));
$k_ipad = $key ^ $ipad;
$k_opad = $key ^ $opad;
return md5($k_opad . pack("H*", md5($k_ipad . $data)));
}
//我们把易宝支付要求生成一个签名串
//把各个请求参数凭借作为$data传入: $key 就是易宝给商家分配的密钥
支付响应信息处理页面payres.php
<?php
include 'common.php';
//获取从易宝支付网关返回的信息
$p1_MerId = "10001126856";
$r0_Cmd = $_REQUEST['r0_Cmd'];
$r1_Code = $_REQUEST['r1_Code'];
$r2_TrxId = $_REQUEST['r2_TrxId'];
$r3_Amt = $_REQUEST['r3_Amt'];
$r4_Cur = $_REQUEST['r4_Cur'];
$r5_Pid = $_REQUEST['r5_Pid'];
$r6_Order = $_REQUEST['r6_Order'];
$r7_Uid = $_REQUEST['r7_Uid'];
$r8_MP = $_REQUEST['r8_MP'];
$r9_BType = $_REQUEST['r9_BType'];
$hmac = $_REQUEST['hmac']; // 拼接
$res_src = "";
$res_src = $res_src . $p1_MerId;
$res_src = $res_src . $r0_Cmd;
$res_src = $res_src . $r1_Code;
$res_src = $res_src . $r2_TrxId;
$res_src = $res_src . $r3_Amt;
$res_src = $res_src . $r4_Cur;
$res_src = $res_src . $r5_Pid;
$res_src = $res_src . $r6_Order;
$res_src = $res_src . $r7_Uid;
$res_src = $res_src . $r8_MP;
$res_src = $res_src . $r9_BType;
$merchantKey = "69c1522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4P1";
// 对返回的结果进行MD5-hmac加密处理,和返回的hmac签名串比较
if (HmacMd5($res_src, $merchantKey) == $hmac) {
if ($r1_Code == 1) {
if ($r9_BType == 1) {
echo '交易成功!';
echo '订单号为' . $r6_Order . '支付成功!' . '所付金额是' . $r3_Amt . '易宝支付订单号' . $r2_TrxId;
echo '<br/>浏览器重定向';
} elseif ($r9_BType == 2) {
echo 'success';
echo '<br/>交易成功!';
echo '<br/>服务器点对点通讯';
}
}
} else {
echo '签名被篡改了';
} ?>
MVC框架中实现支付
定义支付视图
index.html请求支付视图
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
</head> <body> <form action="index.php?g=home&c=pay&a=payconfirm" method="post">
<table>
<tr>
<td colspan="4">
订单号:<input type="text" name="p2_Order"/>
支付金额:<input type="text" name="p3_Amt"/></td>
</tr>
<tr>
<td colspan="4">请选择支付银行</td>
</tr>
<tr>
<td><input type="radio" name="pd_FrpId" value="CMBCHINA-NET"/>招商银行</td>
<td><input type="radio" name="pd_FrpId" value="ICBC-NET"/>工商银行</td>
<td><input type="radio" name="pd_FrpId" value="ABC-NET"/>农业银行</td>
<td><input type="radio" name="pd_FrpId" value="CCB-NET"/>建设银行</td>
</tr>
<tr>
<td colspan="4"><input type="submit" value="确认支付"/></td>
</tr>
</table>
</form> </body> </html>
payconfirm.html确认支付视图
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
你的订单号是:<?php echo $this->data['p2_Order']; ?>支付的金额是<?php echo $this->data['p3_Amt']; ?>
<!-- 把要提交的数据用隐藏域表示 -->
<form action="https://www.yeepay.com/app-merchant-proxy/node" method="post">
<input type="hidden" name="p0_Cmd" value="<?php echo $this->data['p0_Cmd']; ?>"/>
<input type="hidden" name="p1_MerId" value="<?php echo $this->data['p1_MerId']; ?>"/>
<input type="hidden" name="p2_Order" value="<?php echo $this->data['p2_Order']; ?>"/>
<input type="hidden" name="p3_Amt" value="<?php echo $this->data['p3_Amt']; ?>"/>
<input type="hidden" name="p4_Cur" value="<?php echo $this->data['p4_Cur']; ?>"/>
<input type="hidden" name="p5_Pid" value="<?php echo $this->data['p5_Pid']; ?>"/>
<input type="hidden" name="p6_Pcat" value="<?php echo $this->data['p6_Pcat']; ?>"/>
<input type="hidden" name="p7_Pdesc" value="<?php echo $this->data['p7_Pdesc']; ?>"/>
<input type="hidden" name="p8_Url" value="<?php echo $this->data['p8_Url']; ?>"/>
<input type="hidden" name="p9_SAF" value="<?php echo $this->data['p9_SAF']; ?>"/>
<input type="hidden" name="pa_MP" value="<?php echo $this->data['pa_MP']; ?>"/>
<input type="hidden" name="pd_FrpId" value="<?php echo $this->data['pd_FrpId']; ?>"/>
<input type="hidden" name="pr_NeedResponse" value="<?php echo $this->data['pr_NeedResponse']; ?>"/>
<input type="hidden" name="hmac" value="<?php echo $this->data['hmac']; ?>"/>
<input type="submit" value="确认网上支付"/>
</form>
</body>
</html>
控制器设计
关键代码
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018/7/12
* Time: 10:00
*/ namespace application\home\controllers; use core\mybase\Controller;
use core\PayMD5; class PayController extends Controller
{
/**支付页面*/
public function index()
{
$this->display();
} /**确认支付*/
public function payconfirm()
{ $p0_Cmd = "Buy";//业务类型
$p1_MerId = "10001126856";//商户编号(测试账号)
$p2_Order = $_REQUEST['p2_Order'];//获取用户提交表单中的订单编号
$p3_Amt = $_REQUEST['p3_Amt'];//订单金额
$p4_Cur = "CNY";//交易币种,固定值是'CNY' 人民币
$p5_Pid = "";// 商品名称
$p6_Pcat = ""; // 商品种类
$p7_Pdesc = ""; // 商品介绍
$p8_Url = "http://loaclhost/MyMVC1.0/index.php?g=home&c=pay&a=payres";//易宝支付成功后,返回信息到此url
$p9_SAF = "0"; // 送货地址
$pa_MP = ""; // 商品扩展信息
$pd_FrpId = $_REQUEST['pd_FrpId']; // 银行支付通道
$pr_NeedResponse = "1"; // 应答机制
// 我们把请求参数一个一个拼接(拼接的时候,顺序很重要!!)
$data = "";
$data = $data . $p0_Cmd;
$data = $data . $p1_MerId;
$data = $data . $p2_Order;
$data = $data . $p3_Amt;
$data = $data . $p4_Cur;
$data = $data . $p5_Pid;
$data = $data . $p6_Pcat;
$data = $data . $p7_Pdesc;
$data = $data . $p8_Url;
$data = $data . $p9_SAF;
$data = $data . $pa_MP;
$data = $data . $pd_FrpId;
$data = $data . $pr_NeedResponse;
$merchantKey = "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl";// hmac签名串,是用于易宝和商家互相确认的关键字
//$hmac = HmacMd5($data,$merchantKey);
$payMD5 = new PayMD5();
$hmac = $payMD5->HmacMd5($data, $merchantKey); $this->assign("p0_Cmd", $p0_Cmd);
$this->assign("p1_MerId", $p1_MerId);
$this->assign("p2_Order", $p2_Order);
$this->assign("p3_Amt", $p3_Amt);
$this->assign("p4_Cur", $p4_Cur);
$this->assign("p5_Pid", $p5_Pid);
$this->assign("p6_Pcat", $p6_Pcat);
$this->assign("p7_Pdesc", $p7_Pdesc);
$this->assign("p8_Url", $p8_Url);
$this->assign("p9_SAF", $p9_SAF);
$this->assign("pa_MP", $pa_MP);
$this->assign("pd_FrpId", $pd_FrpId);
$this->assign("pr_NeedResponse", $pr_NeedResponse);
$this->assign("hmac", $hmac); $this->display(); } /**接收支付结果消息*/
public function payres()
{ //获取从易宝支付网关返回的信息
$p1_MerId = "10001126856";
$r0_Cmd = $_REQUEST['r0_Cmd'];
$r1_Code = $_REQUEST['r1_Code'];
$r2_TrxId = $_REQUEST['r2_TrxId'];
$r3_Amt = $_REQUEST['r3_Amt'];
$r4_Cur = $_REQUEST['r4_Cur'];
$r5_Pid = $_REQUEST['r5_Pid'];
$r6_Order = $_REQUEST['r6_Order'];
$r7_Uid = $_REQUEST['r7_Uid'];
$r8_MP = $_REQUEST['r8_MP'];
$r9_BType = $_REQUEST['r9_BType'];
$hmac = $_REQUEST['hmac']; // 拼接
$res_src = "";
$res_src = $res_src . $p1_MerId;
$res_src = $res_src . $r0_Cmd;
$res_src = $res_src . $r1_Code;
$res_src = $res_src . $r2_TrxId;
$res_src = $res_src . $r3_Amt;
$res_src = $res_src . $r4_Cur;
$res_src = $res_src . $r5_Pid;
$res_src = $res_src . $r6_Order;
$res_src = $res_src . $r7_Uid;
$res_src = $res_src . $r8_MP;
$res_src = $res_src . $r9_BType; $merchantKey = "69c1522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4P1"; // 对返回的结果进行MD5-hmac加密处理,和返回的hmac签名串比较
$payMD5 = new PayMD5();
if ($payMD5->HmacMd5($res_src, $merchantKey) == $hmac) {
if ($r1_Code == 1) {
if ($r9_BType == 1) {
echo '交易成功!';
echo '订单号为' . $r6_Order . '支付成功!' . '所付金额是' . $r3_Amt . '易宝支付订单号' . $r2_TrxId;
echo '<br/>浏览器重定向';
} elseif ($r9_BType == 2) { //修改订单状态 echo 'success';
echo '<br/>交易成功!';
echo '<br/>服务器点对点通讯';
}
}
} else {
echo '签名被篡改了';
}
}
}
PHP22 PHP在线支付的更多相关文章
- Atitit 在线支付系统功能设计原理与解决方案 与目录
Atitit 在线支付系统功能设计原理与解决方案 与目录 1.1. 支付系统1 1.2. 独立的支付子体系..微服务架构..1 1.3. 参考书籍1 支付战争 [The PayPal Wars:Bat ...
- php支付宝在线支付接口开发教程【转】
php支付宝在线支付接口开发教程 这篇文章主要为大家详细介绍了php支付宝在线支付接口开发教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.什么是第三方支付 所谓第三方支付,就是一些和各 ...
- 【drp 1】使用易宝实现在线支付
导读:在很多网站上,都会涉及到在线支付的功能,总所周知的有:淘宝.天猫.京东等等.我们常见的支付方式有支付宝.微信钱包.银行卡支付等.本篇博客,将介绍一种使用易宝第三方软件进行在线支付的功能. 一.基 ...
- Android集成支付宝接口 实现在线支付
手机的在线支付,被认为是2012年最看好的功能,我个人认为这也是移动互联网较传统互联网将会大放光彩的一个功能. 人人有手机,人人携带手机,花钱买东西,不再需要取钱付现,不再需要回家上网银,想买什么,扫 ...
- 在线支付接口之PHP支付宝接口开发简单介绍
php100:92:在线支付接口之PHP支付宝接口开发 支付接口一般是第三方提供的代收款.付款的平台,可以通过支付接口帮助企业或个人利用一切可以使用的支付方式.常见支付平台:支付宝.快钱.云网支付.财 ...
- php最新微信扫码在线支付接口。ecshop和shopex,shopnc下完美无错
最近为客户的一个在线商城做了一个微信扫码在线支付的接口.跟大家分享一下. 1 首先可以模仿其他的接口,比如支付宝,财付通等的接口,构建模块功能文件和语言文件.2 微信提供2种扫码方式,大家可以根据自己 ...
- 国付宝ecshop,shopex,shopnc在线支付接口,php版本支付接口开发
最近应一个客户的要求,给他的一个ecshop商城开发国付宝在线支付接口.国付宝估计大家比较陌生,但是他集成了很多银行的一些网银接口,所以比较方便.号称国家级的第三方支付平台.最近有增加了域名验证,就是 ...
- 让你的微信小程序具有在线支付功能
前言 最近需要在微信小程序中用到在线支付功能,于是看了一下官方的文档,发现要在小程序里实现微信支付还是很方便的,如果你以前开发过服务号下的微信支付,那么你会发现其实小程序里的微信支付和服务号里的开发过 ...
- SSH架构实现在线支付功能
在线支付是指卖方与卖方通过因特网上的电子商务网站进行交易时,银行为其提供网上资金结算服务的一种业务,她为企业和个人提供了一个安全.快捷.方便的电子商务应用环境和网上资金结算工具,在线支付不仅帮助企业实 ...
随机推荐
- 查看mysql状态
命令:mysqladmin -uroot -p -h172.16.0.20 status Uptime: 14317755 Threads: 61 Questions: 187732924 Sl ...
- PHP empty()函数使用需要注意
在 PHP 5.5 之前,empty() 仅支持变量:任何其他东西将会导致一个解析错误.换言之,下列代码不会生效: empty(trim($name)). 作为替代,应该使用trim($name) = ...
- Golang项目的测试实践
Golang项目的测试实践 最近有一个项目,链路涉及了4个服务.最核心的是一个配时服务.要如何对这个项目进行测试,保证输出质量,是最近思考和实践的重点.这篇就说下最近这个实践的过程总结. 测试金字塔 ...
- C++开发工程师面试题库 1~50道
1. 指出以下变量数据存储位置 全局变量int(*g_pFun)(int);g_pFun=myFunction;g_pFun存储的位置(A ) 为全局的函数指针 指向空间的位置( B) 所有函数 ...
- sql server编写通用脚本自动统计各表数据量心得
工作过程中,如果一个数据库的表比较多,手工编写统计脚本就会比较繁琐,于是摸索出自动生成各表统计数据量脚本的通用方法,直接上代码: /* 脚本来源:https://www.cnblogs.com/zha ...
- hdu1598 find the most comfortable road 枚举+最小生成树
#include<cstdio> #include<cstring> #include<algorithm> #define MAXN 210 #define IN ...
- UML 图中类之间的关系:依赖,泛化,关联,聚合,组合,实现
http://www.uml.org.cn/oobject/201211231.asp 1. 关联 一个类作为另外一个类的变量:在UML类图中,用实线连接有关联关系的对象所对应的类 2.聚合 表示整体 ...
- Jquery | 基础 | 慕课网 | (*选择器)
原生JS var elements1 = document.getElementsByTagName('*'); JQ var elements2 = $("*"); <!D ...
- 跟我一起玩Win32开发(9):绘图(B)
我们今天继续涂鸦,实践证明,涂鸦是人生一大乐趣. 首先,我们写一个程序骨架子,以便做实验. #include <Windows.h> LRESULT CALLBACK MainWinPro ...
- IDEA中创建HBASE工程
IntelliJ IDEA+maven的HBase开发环境搭建 hbase 配置(hbase-site.xml)和基本使用 16010端口可以查看Hbase web信息