很多站长朋友们都不太清楚php支付宝支付rsa,今天小编就来给大家整理php支付宝支付rsa,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 php 支付宝接口官方给的md5签名版本和rsa签名版本的区别 2、 php 5.3.13怎么使用支付宝RSA2 3、 支付宝 .NET SDK 报错:RSA签名遭遇异常,请检查私钥格式是否正确 4、 php开发中app怎么接入支付宝 php 支付宝接口官方给的md5签名版本和rsa签名版本的区别虽然支付宝官方还未提供相关SDK,PHP确实可以实现RSA方式的签名,这点其实很重要,由于不熟悉,在遇到困难的时候,经常会不由自主地想到是否PHP不支持RSA签名,干脆用MD5得了,这样就没有了前进的动力。其实说穿了MD5和RSA签名,不同的只是签名方式的区别,其他的都一样,因此我这里主要说一下如何用RSA进行签名和验签。
首先你需要准备下面的东西:
php的openssl扩展里已经封装好了验签的方法openssl_verify。
如果在Windows下的php.ini需要开启Openssl模块: extension=php_openssl.dll
商户私钥:
即RSA私钥,按照手册,按以下方式生成:
openssl genrsa -out rsa_private_key.pem 1024
商户公钥:
即RSA私钥,按照手册,按以下方式生成:
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
生成之后,按照手册的说明,需要在签约平台上传公钥,需要注意的是,上传的时候需要把所有的注释和换行都去掉。
另外手册中还有如下命令:
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
该命令将RSA私钥转换成PKCS8格式,对于PHP来说,不需要。
支付宝公钥:
根据手册,在签约平台获得。
如果你直接复制下来的话,会得到一个字符串,需要进行下面的转换;
1)把空格变成换行
2)添加注释
比如你复制下来的公钥是:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRBMjkaBznjXk06ddsL751KyYt
ztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4M
UmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9j
TCoccYMDXEIWYTs3CwIDAQAB,那转换之后为:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRBMjkaBznjXk06ddsL751KyYt
ztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4M
UmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9j
TCoccYMDXEIWYTs3CwIDAQAB
-----END PUBLIC KEY-----
把公钥保存在文件里。
注意这个是2048位的公钥应该是9行或者10行,不能为1行,不然PHP的openssl_pkey_get_public无法读取,pub_key_id的结果为false,如果没有-----BEGIN PUBLIC KEY----- 和 -----END PUBLIC KEY----- 可以自己加上,最后保存到一个rsa_public_key.pem文件中。
好了,现在已经有了所有的东西,先看签名函数:
复制代码
1 <?php
2 /**
3 * 签名字符串
4 * @param $prestr 需要签名的字符串
5 * return 签名结果
6 */
7 function rsaSign($prestr) {
8 $public_key= file_get_contents('rsa_private_key.pem');
9 $pkeyid = openssl_get_privatekey($public_key);
10 openssl_sign($prestr, $sign, $pkeyid);
11 openssl_free_key($pkeyid);
12 $sign = base64_encode($sign);
13 return $sign;
14 }
15 ?>
复制代码
注意点:
1.$prestr的内容和MD5一样(参见手册,但不包含最后的MD5密码)
2.签名用商户私钥
3.最后的签名,需要用base64编码
4.这个函数返回的值,就是这次请求的RSA签名。
验签函数:
复制代码
1 <?php
2 /**
3 * 验证签名
4 * @param $prestr 需要签名的字符串
5 * @param $sign 签名结果
6 * return 签名结果
7 */
8 function rsaVerify($prestr, $sign) {
9 $sign = base64_decode($sign);
10 $public_key= file_get_contents('rsa_public_key.pem');
11 $pkeyid = openssl_get_publickey($public_key);
12 if ($pkeyid) {
13 $verify = openssl_verify($prestr, $sign, $pkeyid);
14 openssl_free_key($pkeyid);
15 }
16 if($verify == 1){
17 return true;
18 }else{
19 return false;
20 }
21 }
22 ?>
复制代码
注意点:
1.$prestr的内容和MD5一样(参见手册)
2.$sign是支付宝接口返回的sign参数用base64_decode解码之后的二进制
3.验签用支付宝公钥
4.这个函数返回一个布尔值,直接告诉你,验签是否通过
支付宝官方提供的PHP版SDK demo中只对MD5加密方式进行了处理,但android 端和ios端 请求支付宝加密方式只能用RSA加密算法,这时服务端PHP就无法验证签名了,所以需要对demo进行一些修改。
1、修改alipay_notify.class.php文件
verifyNotify 函数第46行
$isSign = $this->getSignVeryfy($_POST, $_POST["sign"]);
改成
$isSign = $this->getSignVeryfy($_POST, $_POST["sign"], $_POST["sign_type"]);
verifyReturn 函数第83行
$isSign = $this->getSignVeryfy($_GET, $_GET["sign"]);
改成
$isSign = $this->getSignVeryfy($_GET, $_GET["sign"], $_GET["sign_type"]);
getSignVeryfy 函数 116行
function getSignVeryfy($para_temp, $sign) {
改成
function getSignVeryfy($para_temp, $sign, $sign_type) {
getSignVeryfy 函数 127行
switch (strtoupper(trim($this->alipay_config['sign_type']))) {
case "MD5" :
$isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']);
break;
default :
$isSgin = false;
}
改成
switch (strtoupper(trim($sign_type))) {
case "MD5" :
$isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']);
break;
case "RSA" :
$isSgin = rsaVerify($prestr, $sign);
break;
default :
$isSgin = false;
}
2、新建一个alipay_rsa.function.php文件
复制代码
1 <?php
2 /* *
3 * RSA
4 * 详细:RSA加密
5 * 版本:3.3
6 * 日期:2014-02-20
7 * 说明:
8 * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
9 * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
10 */
11 /**
12 * 签名字符串
13 * @param $prestr 需要签名的字符串
14 * return 签名结果
15 */
16 function rsaSign($prestr) {
17 $public_key= file_get_contents('rsa_private_key.pem');
18 $pkeyid = openssl_get_privatekey($public_key);
19 openssl_sign($prestr, $sign, $pkeyid);
20 openssl_free_key($pkeyid);
21 $sign = base64_encode($sign);
22 return $sign;
23 }
24 /**
25 * 验证签名
26 * @param $prestr 需要签名的字符串
27 * @param $sign 签名结果
28 * return 签名结果
29 */
30 function rsaVerify($prestr, $sign) {
31 $sign = base64_decode($sign);
32 $public_key= file_get_contents('rsa_public_key.pem');
33 $pkeyid = openssl_get_publickey($public_key);
34 if ($pkeyid) {
35 $verify = openssl_verify($prestr, $sign, $pkeyid);
36 openssl_free_key($pkeyid);
37 }
38 if($verify == 1){
39 return true;
40 }else{
41 return false;
42 }
43 }
44 ?>
php 5.3.13怎么使用支付宝RSA2配置开发者信息「私钥」And「App_id」
/*?配置信息?*/
//?支付宝分配给开发者的应用ID
$app_id='';
//?开发者私钥,为这里填入方便,去头、去尾、去换行?字符串私钥,私钥处理放在签名方法内。
$private_key='';
//?商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
$sign_type='RSA2';
/*?配置信息?*/
2.组装部分请求参数:根据接口文档组装参数?app_id、method、format、timestamp、charset、version、notify_url、sign_type
/*?组装请求参数部分start?*/
???????
//?支付宝分配给开发者的应用ID
$params['app_id']?=?$app_id;
//?接口名称
$params['method']?=?'alipay.trade.app.pay';
//?仅支持JSON
$params['format']?=?'json';?
//?发送请求的时间,格式"yyyy-MM-dd?HH:mm:ss"
$params['timestamp']?=?date("Y-m-d?H:i:s");
//?请求使用的编码格式,如utf-8,gbk,gb2312等
$params['charset']?=?'UTF-8';
//?调用的接口版本,固定为:1.0
$params['version']?=?'1.0';
//?支付宝服务器主动通知商户服务器里指定的页面http/https路径。建议商户使用https
$params['notify_url']?=?'';
//?商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
$params['sign_type']?=?$sign_type;
???????
/*?组装请求参数部分end?*/
3.组装业务参数json格式,并填充在$params数组中
/*?组装业务参数json?*/
//?对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。
$bizcontent['body']?=?'非sdk原生php服务端生成请求订单';
//?商品的标题/交易标题/订单标题/订单关键字等。
$bizcontent['subject']?=?'php代码示例';
???????
/*?生成随机数作为外部订单号start?*/
$date=date("YmdHis");?
$arr=range(1000,9999);
shuffle($arr);
$out_trade_no=$date.$arr[0];
/*?生成随机数作为外部订单号end?*/
//?商户网站唯一订单号
$bizcontent['out_trade_no']?=?$out_trade_no;
//?设置未付款支付宝交易的超时时间,一旦超时,该笔交易就会自动被关闭。当用户进入支付宝收银台页面(不包括登录页面),会触发即刻创建支付宝交易,此时开始计时。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。?该参数数值不接受小数点,?如?1.5h,可转换为?90m。
$bizcontent['timeout_express']='10m';
//?订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
$bizcontent['total_amount']?=?'0.01';
//?销售产品码,商家和支付宝签约的产品码
$bizcontent['product_code']?=?'QUICK_MSECURITY_PAY';
//?商品主类型:0—虚拟类商品,1—实物类商品?注:虚拟类商品不支持使用花呗渠道
$bizcontent['goods_type']?=?'0';
//?公用回传参数,如果请求时传递了该参数,则返回给商户时会回传该参数。支付宝会在异步通知时将该参数原样返回。本参数必须进行UrlEncode之后才可以发送给支付宝
$bizcontent['passback_params']='spicy%3d%e8%87%aa%e5%ae%9a%e4%b9%89%e5%8f%82%e6%95%b01%26custom%3d%e8%87%aa%e5%ae%9a%e4%b9%89%e5%8f%82%e6%95%b02';
???????
$biz_content=json_encode($bizcontent,JSON_UNESCAPED_UNICODE);
/*?组装业务参数json?*/
???????
//?将业务参数填充在请求参数内
$params['biz_content']?=?$biz_content;
4.排序签名得到sign,并填充在$params数组中「签名方法请往下翻」
//?排序
ksort($params);
//?调用签名方法得到sign填入请求参数
$params['sign']?=?sign($params,?$params['sign_type'],?$private_key);
5.将参数urlencode输出查看,打印出来的参数可以直接放在客户端使用
//?htmlspecialchars是为防止浏览器将参数中的「×」和「?」转义
echo?htmlspecialchars(http_build_query($params));
工具方法:签名方法和检查是否为空方法
/**??
*?签名函数?
*?
*?@param?array?$params?请求参数数组
*?@param?string?$signType?签名方式
*?@param?string?$private_key?为了方便只要填一行字符串
*?@return?string?返回类型
*/
function?sign($params,$signType,$private_key){
????$stringToBeSigned?=?"";
????$i?=?0;
????//?将数组使用符号拼接
????foreach?($params?as?$k?=>?$v)?{
????????if?(false?===?checkEmpty($v)??"@"?!=?substr($v,?0,?1))?{
????????????if?($i?==?0)?{
????????????????$stringToBeSigned?.=?"$k"?.?"="?.?"$v";
????????????}?else?{
????????????????$stringToBeSigned?.=?""?.?"$k"?.?"="?.?"$v";
????????????}
????????????$i++;
????????}
????}
????unset?($k,?$v);
???????
????//?私钥处理
????$res?=?"-----BEGIN?RSA?PRIVATE?KEY-----".PHP_EOL.wordwrap($private_key,?64,?PHP_EOL,?true).PHP_EOL."-----END?RSA?PRIVATE?KEY-----";
????($res)?or?die('您使用的私钥格式错误,请检查RSA私钥配置');?
???????
????//?
????if?("RSA2"?==?$signType)?{
????????openssl_sign($stringToBeSigned,?$sign,?$res,?OPENSSL_ALGO_SHA256);
????}?else?{
????????openssl_sign($stringToBeSigned,?$sign,?$res);
????}
????return?base64_encode($sign);
}
???????
/**??
*?检查是否为空
*?
*?@param?string?$value?请求参数数组
*?@return?bool?返回类型
*/
function?checkEmpty($value)?{
????if?(!isset($value))
????????return?true;
????if?($value?===?null)
????????return?true;
????if?(trim($value)?===?"")
????????return?true;
????return?false;
}
支付宝 .NET SDK 报错:RSA签名遭遇异常,请检查私钥格式是否正确AlipaySDKNet 是 .NET 平台下用于对接支付宝支付的官方 SDK。Alipay SDK for .NET 让您不用复杂编程即可访问支付宝开放平台开放的各项能力,SDK可以自动帮您满足能力调用过程中所需的证书校验、加签、验签、发送HTTP请求等非功能性要求。其 Nuget 链接如下: 。GitHub 开源地址为: 。
要在程序中集成支付宝支付其实并不困难,只要谨记 .NET 程序要用的私钥格式是 PKCS1 且不把参数搞混问题应该都不大。
但是今天,却遇到一个大问题: 之前 正常工作的代码在更换了账户配置(APPID、私钥等)之后竟然报错了。
根据报错时的堆栈信息,该错误来自于方法:
本着先从自己找原因的原则冲头到尾检查了配置参数,PKCS1 格式是对的、私钥是对的、公钥是对的甚至点鼠标的手势也是对的。
尝试了 Java 语言的 DEMO (其采用的是 PKCS8 格式),这套参数也是可以正常工作的那就说明密钥本身是没问题的。
无奈之下只能通过 GitHub 将代码克隆到本地并引入项目开始调试。找到报错断点位于 RSAEncryptor 的 BuildRSAServiceProvider 方法:
这个方法的作用是读取 PKCS1 格式私钥并构建 RSACryptoServiceProvider ,但转换过程略显过时。其实,.NET 在 netstandard-2.1 时已经提供了名为 ImportRSAPrivateKey 的方法用于导入密钥,这段代码可以直接被替换掉。
首先需要将 AlipaySDKNet.Standard 的目标框架修改为 netstandard2.1 ,接着使用以下代码替换 BuildRSAServiceProvider 方法:
再次编译项目,已经可以正常下单使用了。
换一个密钥也许是最简单的方案。想要向阿里反馈这个问题,却发现该仓库并未开放 Issues 功能。我也想退而求其次,不要在项目中引入整个 SDK 的源代码(它太大了,有一万五千多个文件)只对 SDK 打补丁。但我发现这很难做到:DefaultAopClient 的实现看上去很复杂,而且 BuildRSAServiceProvider 被定义为了一个私有的静态方法。
我当然不能把我现在使用的私钥共享出来,但我做了一些工作又生成了一个会报错的私钥(PKCS1 格式):
你也可以使用以下代码尝试生成并测试,该代码循环100次,并尝试用阿里 SDK 提供的方法对密钥进行转换:
经测试,一百次生成中大概会有 2-4 次遇到异常密钥。
如果你遇到了和笔者一样的问题,并且通读本文解决了你的问题。那么恭喜你,你大概就是天选之子,下班后去买彩吧,说不定能中大奖。
受制于笔者的浅薄,本文并没有找到 BuildRSAServiceProvider 不能正确加载私钥的原因,但使用另一种方法规避了该问题。这让我更加坚信,即便是大厂的作品也不是完美无瑕。
简单总结一下:如果你遇到了本文所述的问题,那么就重置一下密钥吧。植发毕竟太贵了。
阅读原文:支付宝 .NET SDK 报错:RSA签名遭遇异常,请检查私钥格式是否正确。-码农很忙
php开发中app怎么接入支付宝准备工作
APP支付接口:alipay.trade.app.pay
服务器端使用框架:TP5
登录蚂蚁金服开放平台 --> 创建应用 --> 添加App支付功能。具体查看官方文档
下载官方 SDK (PHP版本资源)——当前SDK版本:106 生成时间:2017-07-25 11:46:10
将SDK原码放置在TP5的vendor目录下的alipay文件夹(可根据实际使用框架技术进行实际调整)。
支付接口调用原理
1、APP支付系统架构
APP支付系统架构图
2、数据校验原理
数据校验原理
应用公钥(商户自身的RSA公钥):支付宝使用该公钥验证该交易是商户发起。
支付宝公钥(支付宝的RSA公钥):商户使用该公钥验证该结果是支付宝返回的。
3、系统交互流程
系统交互流程图
4、支付场景具体实现流程(最详细图解)
在集成App支付能力时,建议实现如下支付流程,创建订单并支付,根据返回的结果确定支付状态,并进行相应的异常处理,其过程如下图所示.
支付场景具体实现流程
商家APP在创建订单并且唤起支付宝APP支付,流程如上图所示,根据第2.2,3步返回的支付结果,确定支付状态,并且做相应的异常处理(必要时关闭订单)
代码实现
步骤1:商户APP端请求商户服务器接口,提交订单数据。
步骤2:商户服务器端接收数据,然后对数据进行签名,返回请求参数到商户APP端。
官方接口文档:
——代码如下:
//vendor();为TP5框架的方法,作用:导入第三方框架类库
vendor('alipay.aop.AopClient');
vendor('alipay.aop.request.AlipayTradeAppPayRequest');
//实例化支付接口
$aop = new \AopClient();
$aop->gatewayUrl = ""; //支付宝网关
$aop->appId = “应用ID,填写你的APPID”;
$aop->rsaPrivateKey = "商户私钥,您的原始格式RSA私钥()";
$aop->alipayrsaPublicKey = "支付宝公钥";
$aop->apiVersion = '1.0';
$aop->signType = "签名方式,如 RSA2 ";
$aop->postCharset = 'UTF-8';
$aop->format = "json";
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
$appRequest = new \AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数
$bizcontent = json_encode([
'body' => '余额充值', //订单描述
'subject' => '充值', //订单标题
'timeout_express' => '30m',
'out_trade_no' => ‘20170125test01’, //商户网站唯一订单号
'total_amount' => '0.01', //订单总金额
'product_code' => 'QUICK_MSECURITY_PAY', //固定值
]);
$appRequest->setNotifyUrl($url); //设置异步通知地址
$appRequest->setBizContent($bizcontent);
//这里和普通的接口调用不同,使用的是sdkExecute
$response = $aop->sdkExecute($appRequest);
//htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题
echo htmlspecialchars($response);//就是orderString 可以直接给客户端请求,无需再做处理。
// 如果最后有问题可以尝试把htmlspecialchars方法去掉,直接返回$response
说明:sdkExecute()方法,作用生成签名,详细步骤如下:
将请求参数组装分下列3步,以最后第三步获取到的请求为准。
1)将请求参数的键按字典排序,然后按照key=valuekey=value方式拼接,得到未签名原始字符串如下:
app_id=2015052600090779biz_content={"timeout_express":"30m","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是测试数据","out_trade_no":"IQJZSRC1YMQB5HU"}charset=utf-8format=jsonmethod=alipay.trade.app.pay?ify_url=;sign_type=RSA2×tamp=2016-08-25 20:26:31version=1.0
2)再对原始字符串进行签名
app_id=2015052600090779biz_content={"timeout_express":"30m","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是测试数据","out_trade_no":"IQJZSRC1YMQB5HU"}charset=utf-8format=jsonmethod=alipay.trade.app.pay?ify_url=;sign_type=RSA2×tamp=2016-08-25 20:26:31version=1.0sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj+y48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp/M45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g=
3)最后对请求字符串的所有一级value(biz_content作为一个value)进行encode,编码格式按请求串中的charset为准,没传charset按UTF-8处理,获得最终的请求字符串:
app_id=2015052600090779biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22IQJZSRC1YMQB5HU%22%7Dcharset=utf-8format=jsonmethod=alipay.trade.app.pay?ify_url=http%3A%2F%2Fdomain.merchant测试数据%2Fpayment_notifysign_type=RSA2×tamp=2016-08-25%2020%3A26%3A31version=1.0sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj%2By48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp%2FM45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g%3D
步骤3:商户APP接收从商户服务器端返回的请求参数,然后调起支付宝支付面板。
若用户支付成功,支付宝会同步给商户APP端返回一个支付结果。相应地,支付宝也会通过异步通知给商户服务器端返回一个支付结果。
注意:由于同步通知和异步通知都可以作为支付完成的凭证,且异步通知支付宝一定会确保发送给商户服务端。为了简化集成流程,商户可以将同步结果仅仅作为一个支付结束的通知(忽略执行校验),实际支付是否成功,完全依赖服务端异步通知。
步骤4:服务端异步通知处理机制(支付宝主动发起通知,该方式才会被启用)
官方接口文档:
注意点:
1)必须保证服务器异步通知页面(notify_url)上无任何字符,如空格、HTML标签、开发系统自带抛出的异常提示信息等;
2)支付宝是用POST方式发送通知信息,因此该页面中获取参数的方式,如:$_POST[‘out_trade_no’];
3)程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h);
4)当商户收到服务器异步通知并打印出success时,服务器异步通知参数notify_id才会失效。
——代码如下:
$aop = new AopClient;
$aop->alipayrsaPublicKey = '请填写支付宝公钥,一行字符串';
$flag = $aop->rsaCheckV1($_POST, NULL, "RSA2"); //验证签名
if($flag){
//校验通知数据的正确性
$out_trade_no = $_POST[‘out_trade_no']; //商户订单号
$trade_no = $_POST[‘trade_no']; //支付宝交易号
$trade_status = $_POST[‘trade_status']; //交易状态trade_status
$total_amount = $_POST[‘'total_amount']; //订单的实际金额
$app_id = $_POST[‘app_id'];
if($app_id!=$this->config['app_id']) exit('fail'); //验证app_id是否为该商户本身
//只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。
if($trade_status != 'TRADE_FINISHED' $trade_status != 'TRADE_SUCCESS')
exit('fail');
//校验订单的正确性
if(!empty($out_trade_no)){
//1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
//2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额);
//3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)。
//上述1、2、3有任何一个验证不通过,则表明本次通知是异常通知,务必忽略。在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。
//校验成功后在response中返回success,校验失败返回failure
}
exit('fail');
}
echo"fail"; //验证签名失败
步骤5:当商户APP端接收到支付宝的同步返回结果为成功时,商户APP端再请求商户服务器端API,判断订单最终支付结果,并做出最终响应。
关于php支付宝支付rsa的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。
查看更多关于php支付宝支付rsa php支付宝支付流程原理的详细内容...