一、如何指定接收异步通知的地址
对于支付产生的交易,支付宝会根据原始支付API中传入的异步通知地址notify_url,通过POST请求的形式将支付结果 作为参数通知到商户系统。
以app支付为例,支付请求中notify_url参数的(如下图):
二、异步通知返回参数介绍
支付宝通过POST请求的形式将支付结果作为参数通知到商户系统。各接口返回的异步通知参数可能会略有不同,具体请参见支付宝开放平台文档中各接口的异步通知参数的详细说明。
以app支付为例,返回的异步通知参数如下(以下示例报文仅供参考,实际返回的详细报文请以实际返回为准):
复制代码
1 |
https: //api.xx.com/receive_notify.htm?total_amount=2.00&buyer_id=2088102116773037&body=大乐透2.1&trade_no=2016071921001003030200089909&refund_fee=0.00¬ify_time=2016-07-19 14:10:49&subject=大乐透2.1&sign_type=RSA2&charset=utf-8¬ify_type=trade_status_sync&out_trade_no=0719141034-6418&gmt_close=2016-07-19 14:10:46&gmt_payment=2016-07-19 14:10:47&trade_status=TRADE_SUCCESS&version=1.0&sign=kPbQIjX+xQc8F0/A6/AocELIjhhZnGbcBN6G4MM/HmfWL4ZiHM6fWl5NQhzXJusaklZ1LFuMo+lHQUELAYeugH8LYFvxnNajOvZhuxNFbN2LhF0l/KL8ANtj8oyPM4NN7Qft2kWJTDJUpQOzCzNnV9hDxh5AaT9FPqRS6ZKxnzM=&gmt_create=2016-07-19 14:10:44&app_id=2015102700040153&seller_id=2088102119685838¬ify_id=4a91b7a78a503640467525113fb7d8bg8e
|
三、异步通知的验签
为了帮助开发者调用开放接口,我们提供了开放平台服务端sdk和demo,包含JAVA、PHP和.NET三语言版本,封装了签名&验签、HTTP接口请求等基础功能。为了避免验签出错强烈建议先下载对应语言版本的SDK并引入您的开发工程进行快速接入。
其验签步骤为:
第一步: 在通知返回参数列表中,除去sign、sign_type两个参数外,凡是通知返回回来的参数皆是待验签的参数。
第二步: 将剩下参数进行url_decode, 然后进行字典排序,组成字符串,得到待签名字符串:
第三步: 将签名参数(sign)使用base64解码为字节码串。
第四步: 使用RSA的验签方法,通过签名字符串、签名参数(经过base64解码)及支付宝公钥验证签名。
第五步:在步骤四验证签名正确后,必须再严格按照如下描述校验通知数据的正确性。
1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额);
3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email);
4、验证app_id是否为该商户本身。
上述1、2、3、4有任何一个验证不通过,则表明本次通知是异常通知,务必忽略。在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。在支付宝的业务通知中,只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。
四、无法接收到异步通知怎么办
自查方案一:[url]https://openclub.alipay.com/read.php?tid=1677&fid=25&page=1[/url]
自查方案二:[url]https://openclub.alipay.com/read.php?tid=675&fid=2[/url]
五、异步通知中的交易状态介绍
请参考这个详情帖子:[url]https://openclub.alipay.com/read.php?tid=1295&fid=25[/url]
六、为什么会重复不断的收到支付宝的异步通知
每当交易状态改变时,服务器异步通知页面就会收到支付宝发来的处理结果通知,程序执行完后必须打印输出success。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h)。
其中,若退款期限是3个月可退款,支付成功后,支付宝会发送trade_success的支付成功状态的异步通知,在3个月后支付宝会再次发送trade_finished的交易结束状态的异步通知,表示交易结束不允许退款。
返回success代码示例:
JAVA:复制代码
out.println("success");
PHP:复制代码
echo "success";
.NET:复制代码
Response.Write("success");
其他开发语言也是直接输出success即可
直接访问你的异步页面应该是输出(如下图)中的success这7个字符
注意:浏览器上点击查看页面源代码,看到的是这个7个字符,有空格或者其他字符都会导致重复收到通知(建议大家做一下简单的验证)