好得很程序员自学网
  • 首页
  • 后端语言
    • C#
    • PHP
    • Python
    • java
    • Golang
    • ASP.NET
  • 前端开发
    • Angular
    • react框架
    • LayUi开发
    • javascript
    • HTML与HTML5
    • CSS与CSS3
    • jQuery
    • Bootstrap
    • NodeJS
    • Vue与小程序技术
    • Photoshop
  • 数据库技术
    • MSSQL
    • MYSQL
    • Redis
    • MongoDB
    • Oracle
    • PostgreSQL
    • Sqlite
    • 数据库基础
    • 数据库排错
  • CMS系统
    • HDHCMS
    • WordPress
    • Dedecms
    • PhpCms
    • 帝国CMS
    • ThinkPHP
    • Discuz
    • ZBlog
    • ECSHOP
  • 高手进阶
    • Android技术
    • 正则表达式
    • 数据结构与算法
  • 系统运维
    • Windows
    • apache
    • 服务器排错
    • 网站安全
    • nginx
    • linux系统
    • MacOS
  • 学习教程
    • 前端脚本教程
    • HTML与CSS 教程
    • 脚本语言教程
    • 数据库教程
    • 应用系统教程
  • 新技术
  • 编程导航
    • 区块链
    • IT资讯
    • 设计灵感
    • 建站资源
    • 开发团队
    • 程序社区
    • 图标图库
    • 图形动效
    • IDE环境
    • 在线工具
    • 调试测试
    • Node开发
    • 游戏框架
    • CSS库
    • Jquery插件
    • Js插件
    • Web框架
    • 移动端框架
    • 模块管理
    • 开发社区
    • 在线课堂
    • 框架类库
    • 项目托管
    • 云服务

当前位置:首页>后端语言>PHP
<tfoot draggable='sEl'></tfoot>

php支付宝支付rsa php支付宝支付流程原理

很多站长朋友们都不太清楚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支付宝支付流程原理的详细内容...

声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did198186
更新时间:2023-04-26   阅读:18次

上一篇: 旅游系统源码php php旅游系统代码

下一篇:php获得系统时间的简单介绍

相关资讯

最新资料更新

  • 1.包含phpgabage的词条
  • 2.php开发宝典 php7开发宝典pdf下载
  • 3.php有类似cmap 与php类似的语言
  • 4.php操作redis存值 php redis数据类型
  • 5.php复杂语法 php基本语法
  • 6.php获取js变量 php获取js变量值
  • 7.php条形码生成 条形码生成器工具
  • 8.php如何接收对象 php怎么接收json数据
  • 9.php+rpush的简单介绍
  • 10.php例子下载 php资料下载
  • 11.phpajix的简单介绍
  • 12.包含peintphp的词条
  • 13.php棋牌小游戏 棋牌类小程序
  • 14.php延迟0.1 php延迟执行不影响页面展示
  • 15.php每个小时执行 php定时执行每天执行一次
  • 16.学php学什么专业 学php可以干什么工作
  • 17.php表格循环 php循环函数
  • 18.php绘制健康码 php源码怎么搭建网站
  • 19.php登录注册论文 php写注册登录
  • 20.php网站后台demo php后端模板

CopyRight:2016-2025好得很程序员自学网 备案ICP:湘ICP备09009000号-16 http://haodehen.cn
本站资讯不构成任何建议,仅限于个人分享,参考须谨慎!
本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。

网站内容来源于网络分享,如有侵权发邮箱到:kenbest@126.com,收到邮件我们会即时下线处理。
网站框架支持:HDHCMS   51LA统计 百度统计
Copyright © 2018-2025 「好得很程序员自学网」
[ SiteMap ]