支付宝与微信支付回调响应处理指南
支付宝支付系统回调处理:
以下是支付宝沙箱环境中的回调响应示例:
GET 页面跳转回调<br></br>alipay/?charset=utf-8&order_id=20230515123456789012&payment_method=alipay.trade.page.pay.return&amount=0.50&signature=XaYbZcD1eFgHiJkLmNoPqRsTuVwXyZ1234567890%3D&trade_id=202305151234567890123456&merchant_app_id=2018051500123456&api_version=1.0&app_id=2018051500123456&encryption_type=RSA2&partner_id=2088202963205945&time_stamp=2023-05-15+12%3A34%3A56 HTTP/1.1" 200 0
POST 服务器端回调<br></br><QueryDict: {'create_time': ['2023-05-15 12:34:47'], 'encoding': ['utf-8'], 'payment_time': ['2023-05-15 12:35:02'], 'notification_timestamp': ['2023-05-15 12:35:03'], 'product_name': ['20230515123456789012'], 'security_code': ['AbCdEfGhIjKlMnOpQrStUvWxYz1234567890aBcDeFgHiJkLmNoP='], 'buyer_identifier': ['2088202963801234'], 'bill_amount': ['0.50'], 'api_version': ['1.0'], 'notification_reference': ['20230515012345678901234567890'], 'fund_detail': ['[{"amount":"0.50","payment_source":"ALIPAYACCOUNT"}]'], 'notification_category': ['order_status_update'], 'order_id': ['20230515123456789012'], 'total_fee': ['0.50'], 'payment_status': ['COMPLETED'], 'transaction_id': ['202305151234567890123456789'], 'merchant_app_id': ['2018051500123456'], 'receipt_amount': ['0.50'], 'bonus_amount': ['0.00'], 'app_id': ['2018051500123456'], 'customer_paid_amount': ['0.50'], 'encryption_method': ['RSA2'], 'partner_id': ['2088202963205945']}>
同步返回处理(return_url):这是一种可视化返回方式,即页面跳转通知。当支付成功后,支付宝会通过GET方式跳转到指定地址,并附带相关参数。这种通知方式受用户操作影响,如果用户在支付宝显示"支付成功"提示后关闭页面,而商户服务器响应较慢,可能导致订单信息无法获取,这种情况称为"掉单"。同步返回处理是一次性调用,仅在支付成功后触发。
异步返回处理(notify_url):此方式通过服务器间直接通信进行数据交互,必须部署在公网服务器上进行测试。支付宝会向商户的异步通知地址发送POST请求,商户需在该地址处理相关业务逻辑,并每一步操作都必须向支付宝返回"success"字符串(不能包含HTML脚本或其他内容,也不可进行页面跳转)。若异步通知处理正常,基本不会出现掉单情况,因为支付宝会在24小时内分6-10次向商户网站发送订单信息,直到接收到正确的响应。
微信支付回调:
微信支付仅提供服务器端回调方式,需注意以下事项:
-
同一通知可能会多次发送给商户系统。商户系统必须具备处理重复通知的能力。
-
在后台通知交互过程中,若微信收到商户的响应不符合规范或超时,微信会判定本次通知失败并重新发送,直至成功(在通知持续失败的情况下,微信总共会发起10次通知,通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 累计24小时4分钟),但微信不保证通知最终一定能成功。
-
在订单状态不明确或未收到微信支付结果通知的情况下,建议商户主动调用微信支付【订单查询接口】确认订单状态。
<xml>
<merchant><![CDATA[wx1234567890abcdef1234567890]]></merchant>
<additional_info><![CDATA[测试支付]]></additional_info>
<payment_channel><![CDATA[ICBC]]></payment_channel>
<currency><![CDATA[CNY]]></currency>
<subscribe_status><![CDATA[Y]]></subscribe_status>
<business_id><![CDATA[1234567890]]></business_id>
<random_string><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></random_string>
<user_openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></user_openid>
<merchant_order_id><![CDATA[1409811653]]></merchant_order_id>
<result><![CDATA[SUCCESS]]></result>
<response_code><![CDATA[SUCCESS]]></response_code>
<verify_signature><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></verify_signature>
<sub_business_id><![CDATA[1234567890]]></sub_business_id>
<completion_time><![CDATA[20230515123456]]></completion_time>
<total_amount>1</total_amount>
<coupon_amount_0><![CDATA[10]]></coupon_amount_0>
<coupon_total><![CDATA[1]]></coupon_total>
<coupon_kind><![CDATA[CASH]]></coupon_kind>
<promotion_id><![CDATA[10000]]></promotion_id>
<transaction_type><![CDATA[JSAPI]]></transaction_type>
<wechat_transaction_id><![CDATA[1004400740201409030005092168]]></wechat_transaction_id>
</xml>
商户服务器需捕获上述参数并进行验证,处理相关业务逻辑。商户系统必须能够正确处理重复的通知。
重要提示:
处理完成后,必须返回字符串格式。
如果返回对象或其他格式,微信将无法处理,会持续发送通知。切记返回字符串。这是常见的开发陷阱。
向微信服务器返回的响应格式如下:
<xml>
<response_code><![CDATA[SUCCESS]]></response_code> <response_message><![CDATA[OK]]></response_message> </xml>