支付宝通知notify url处理


1) 获取APPID




notify_url是异步接口,支付宝会发多次,直到收到你的响应;

至于你说的重复问题,你的后台需要根据流水号、订单号等信息判断是否已经接收过请求并成功处理(insert 支付流水,update订单状态等),处理过就直接返回;
另外notify_url是有次数限制的,如果系统上线后有严重bug或宕机了,恢复之后可能无法再收到通知,所以支付宝还提供了一个接口“单笔查询接口”-查询单笔交易是否支付成功;
支付这一块有很多异常情况必须考虑:比如防止一笔订单用户多次支付,多次支付后的退款处理等等;


排除常见错误的方法: 
1:错误信息提示为:ILLEGAL_SIGN,属于签名验证出错 
CreatUrl的方式参数不一致,编码问题都可以引起这个错误 
2:错误信息提示为:ILLEGAL_ARGUMENT,属于参数格式有问题 
查看接口发送页的参数是不是符合要求 
3:错误信息提示为:ILLEGAL_SERVICE,属于无效接口名称 
查看service参数 
4:错误信息提示为ILLEGAL_PARTNER,属于无效合作伙伴ID 
查看partner参数 
5:错误信息提示为ILLEGAL_SIGN_TYPE,属于无效签名方式 
sign_type是加密类型,一般为md5 
6:错误信息提示为DIRECT_PAY_AMOUNT_OUT_OF_RANGE,属于快速付款交易总金额超出最大值限制 
快速付款余额支付最大限制为:2000,用卡没限制 
7:错误信息提示为HASH_NO_PRIVILEGE,属于没有权限访问该服务 
查看service参数和卖家支付宝帐号所拥有的权限是不是一致 
8:错误信息提示为DONATE_GREATER_THAN_MAX,属于小额捐赠总金额超出最大值限制 
小额捐赠一般现在为100 
9:错误信息提示为OUT_TRADE_NO_EXIST,属于外部交易号已经存在 
外部交易号重复 
10:错误信息提示为TRADE_NOT_EXIST,属于交易不存在 
11:错误信息提示为ILLEGAL_PAYMENT_TYPE,属于无效支付类型 
查看有没有PAYMENT_TYPE参数,是不是对的 
12:错误信息提示为BUYER_NOT_EXIST,属于买家不存在 
查看buyer_email的帐号是不是支付宝帐号 
13:错误信息提示为SELLER_NOT_EXIST,属于卖家不存在 
seller_email的帐号是不是支付宝帐号 
14:错误信息提示为BUYER_SELLER_EQUAL,属于买家、卖家是同一帐户 
同一个支付宝帐号不能同为买家和卖家 
15:错误信息提示为ILLEGAL_LOGISTICS_FORMAT,属于无效物流格式 
只有三种物流类型:EMS,POST,EXPRESS,即为EMS,平邮,其他快递 
16:错误信息提示为TOTAL_FEE_LESSEQUAL_ZERO,属于交易总金额小于等于0 
price或者total_fee不能小于等于0 
17:错误信息提示为TOTAL_FEE_OUT_OF_RANGE,属于交易总金额超出范围 
18:错误信息提示为ILLEGAL_FEE_PARAM,属于非法交易金额格式 
price或者total_fee的值是否规范


某商户设置的通知地址为https://api.xx.com/receive_notify.htm,对应接收到通知的示例如下:

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&notify_time=2016-07-19 14:10:49&subject=大乐透2.1&sign_type=RSA2&charset=utf-8&notify_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&notify_id=4a91b7a78a503640467525113fb7d8bg8e

第一步: 在通知返回参数列表中,除去sign、sign_type两个参数外,凡是通知返回回来的参数皆是待验签的参数。

第二步: 将剩下参数进行url_decode, 然后进行字典排序,组成字符串,得到待签名字符串:

1
body=大乐透 2.1 &buyer_id= 2088102116773037 &charset=utf- 8 &gmt_close= 2016 - 07 - 19 14 : 10 : 46 &gmt_payment= 2016 - 07 - 19 14 : 10 : 47 &notify_time= 2016 - 07 - 19 14 : 10 : 49 &notify_type=trade_status_sync&out_trade_no= 0719141034 - 6418 &refund_fee= 0.00 &subject=大乐透 2.1 &total_amount= 2.00 &trade_no= 2016071921001003030200089909 &trade_status=TRADE_SUCCESS&version= 1.0

第三步: 将签名参数(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时,支付宝才会认定为买家付款成功。

验签过程代码描述【这里列举java示例,按照服务端SDK中提供的工具类】:

1
2
3
4
5
6
7
8
Map<String, String> paramsMap = ... //将异步通知中收到的待验证所有参数都存放到map中
boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, ALIPAY_PUBLIC_KEY, CHARSET) //调用SDK验证签名
if (signVerfied){
    // TODO 验签成功后
    //按照支付结果异步通知中的描述,对支付结果中的业务内容进行1\2\3\4二次校验,校验成功后在response中返回success,校验失败返回failure
} else {
     // TODO 验签失败则记录异常日志,并在response中返回failure.
}


注意:

  • 状态TRADE_SUCCESS的通知触发条件是商户签约的产品支持退款功能的前提下,买家付款成功;
  • 交易状态TRADE_FINISHED的通知触发条件是商户签约的产品不支持退款功能的前提下,买家付款成功;或者,商户签约的产品支持退款功能的前提下,交易已经成功并且已经超过可退款期限。


猜你喜欢

转载自blog.csdn.net/huoyin/article/details/63252070