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的值是否规范
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
|
第一步: 在通知返回参数列表中,除去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
¬ify_time=
2016
-
07
-
19
14
:
10
:
49
¬ify_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.
}
|
注意: