异步通知
简介
异步通知是指当收银台调用 预下单 请求 API 生成二维码展示给用户后,用户通过手机扫描二维码进行支付,支付宝会将该笔订单的变更信息,沿着商户调用预下单请求时所传入的异步通知地址 notify_url,通过 POST 请求的形式将支付结果作为参数通知到商户系统。该异步通知主要作用于配置应用网关,详情请参见 配置应用环境。
异步回调地址状态码(http 状态码) 为 200 时表示异步通知成功,返回码为 404 或 500 时则表示服务器内部错误,需要商户自行排查。
商户如果因为其他原因没有收到支付宝服务端返回的异步通知,可根据 异步通知问题 进行排查。
异步通知参数
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
交易状态说明
|
|
|
|
|
|
|
|
|
|
通知触发条件
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
资金明细信息说明
|
|
|
|
|
|
|
|
|
|
|
|
支付渠道说明
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
优惠券信息说明
| |||
| |||
| |||
| |||
| |||
|
异步返回结果示例
某商户设置的通知地址为 https://api.xx.com/receive_notify.htm,对应接收到通知的示例如下:
xxxxxxxxxx
https://api.xx.com/receive_notify.htm?gmt_payment=2015-06-11 22:33:59¬ify_id=42af7baacd1d3746cf7b56752b91edcj34&seller_email=testyufabu07@alipay.com¬ify_type=trade_status_sync&sign=kPbQIjX+xQc8F0/A6/AocELIjhhZnGbcBN6G4MM/HmfWL4ZiHM6fWl5NQhzXJusaklZ1LFuMo+lHQUELAYeugH8LYFvxnNajOvZhuxNFbN2LhF0l/KL8ANtj8oyPM4NN7Qft2kWJTDJUpQOzCzNnV9hDxh5AaT9FPqRS6ZKxnzM=&trade_no=2015061121001004400068549373&out_trade_no=21repl2ac2eOutTradeNo322&gmt_create=2015-06-11 22:33:46&seller_id=2088211521646673¬ify_time=2015-06-11 22:34:03&subject=FACE_TO_FACE_PAYMENT_PRECREATE中文&trade_status=TRADE_SUCCESS&sign_type=RSA2
注意:第三方代商户调用支付接口得到的异步通知有所不同,会带上 auth_app_id,即第三方应用的 APPID;第三方代调用场景下,系统服务商收到的异步通知示例如下:
xxxxxxxxxx
body=Iphone6 16G&subject=测试&sign_type=RSA2&buyer_logon_id=180****0062&auth_app_id=2014100900013222¬ify_type=trade_status_sync&out_trade_no=20191212422536232&point_amount=0.00&version=1.0&fund_bill_list=[{"amount":"0.01","fundChannel":"PCREDIT"}]&buyer_id=2088122610115771&total_amount=0.01&trade_no=2020022722001415771422894859¬ify_time=2020-02-27 13:27:09&charset=utf-8&invoice_amount=0.01&gmt_payment=2020-02-27 13:27:09&trade_status=TRADE_SUCCESS&sign=JKNY/hYiz2Ke9lsOBMKSczTmnoX4HG+morAGuXzKMISyU4Jn72Xl1K5h5mRj6Xe0yJsf0CswsV2Fi0y9SHaGPI7Bt/eO3L5Q6w1Z5jjoYF3kCtMaY8P/5a+5BbX+wh8sRpU11rSIpwpUtB72WUwuQWiPJM8mlmaYvRjJG55AiG0SwsbzYfoNHwsjqCy407FtzU23yyJ9prt4sGbgalEYWGybkXcsF3s7yIjroKtiMu01gjw8/wlHxKkUK7ZrIyNyqw2bEVJmsfkCiy3NER1Gp7cnVeRS1MdO0qzmybnhMMMN0c61SN+u0VyeRazK+k5Keyo0R5IlAb+uXoU+rTUPpQ==&gmt_create=2020-02-27 13:27:04&buyer_pay_amount=0.01&receipt_amount=0.01&seller_id=2088501624560335&app_id=2016102102272098¬ify_id=2020022700222132709015771442113650&seller_email=alipayrisk10@alipay.com
异步返回结果验签
在通知返回参数列表中,除去 sign、sign_type 两个参数外,凡是通知返回回来的参数皆是待验签的参数;将剩下参数进行 url_decode, 然后进行字典排序,组成字符串,得到待签名字符串:gmt_create=2015-06-1122:33:46&gmt_payment=2015-06-1122:33:59¬ify_id=42af7baacd1d3746cf7b56752b91edcj34¬ify_time=2015-06-1122:34:03¬ify_type=trade_status_sync&out_trade_no=21repl2ac2eOutTradeNo322&seller_email=testyufabu07@alipay.com&seller_id=2088211521646673&subject=FACE_TO_FACE_PAYMENT_PRECREATE中文&trade_no=2015061121001004400068549373&trade_status=TRADE_SUCCESS
将签名参数(sign)使用 base64 解码为字节码串;使用 RSA/RSA2 的验签方法,通过签名字符串、签名参数(经过 base64 解码)及支付宝公钥验证签名;需要严格按照如下描述校验通知数据的正确性:商户需要验证该通知数据中的 out_trade_no 是否为商户系统中创建的订单号。判断 total_amount 是否确实为该订单的实际金额(即商户订单创建时的金额)。校验通知中的 seller_id(或者seller_email) 是否为 out_trade_no 这笔单据的对应的操作方(有的时候,一个商户可能有多个 seller_id/seller_email)。
上述有任何一个验证不通过,则表明本次通知是异常通知,务必忽略。在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时,支付宝才会认定为买家付款成功。
注意:
状态 TRADE_SUCCESS 的通知触发条件是商户签约的产品支持退款功能的前提下,买家付款成功。交易状态 TRADE_FINISHED 的通知触发条件是商户签约的产品不支持退款功能的前提下,买家付款成功;或者,商户签约的产品支持退款功能的前提下,交易已经成功并且已经超过可退款期限。
服务器异步通知页面特性
商户设置的异步地址必须是外网能够顺利访问到的地址,且不能是重定向的网址,并且保证服务器异步通知页面(notify_url)上无任何字符,如空格、HTML 标签、开发系统自带抛出的异常提示信息等。支付宝是用 POST 方式发送通知信息,因此该页面中获取参数的方式,如:request.Form("out_trade_no")、$_POST['out_trade_no']。支付宝主动发起通知,该方式才会被启用。只有在支付宝的交易管理中存在该笔交易,且发生了交易状态的改变,支付宝才会通过该方式发起服务器通知(即时到账中交易状态为“等待买家付款”的状态默认是不会发送通知的)。服务器间的交互,不像页面跳转同步通知可以在页面上显示出来,这种交互方式是不可见的。第一次交易状态改变(即时到账中此时交易状态是交易完成)时,不仅会返回同步处理结果,而且服务器异步通知页面也会收到支付宝发来的处理结果通知。程序执行完后必须通过 PrintWriter 类打印输出"success"(不包含引号)。如果商户反馈给支付宝的字符不是 success 这 7 个字符,支付宝服务器会不断重发通知,直到超过 24 小时 22 分钟。一般情况下,25 小时以内完成 8 次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h)。程序执行完成后,该页面不能执行页面跳转。如果执行页面跳转,支付宝会收不到 success 字符,会被支付宝服务器判定为该页面程序运行出现异常,而重发处理结果通知。cookies、session 等在此页面会失效,即无法获取这些数据。该方式的调试与运行必须在服务器上,即互联网上能访问。该方式的作用主要防止订单丢失,即页面跳转同步通知没有处理订单更新,它则去处理。当商户收到服务器异步通知并打印出 success 时,服务器异步通知参数 notify_id 才会失效。也就是说在支付宝发送同一条异步通知时(包含商户并未成功打印出 success 导致支付宝重发数次通知),服务器异步通知参数 notify_id 是不变的。