目前微信支付API v2 版本的SDK已停止维护,为了在保证支付安全的前提下,带给商户简单、一致且易用的开发体验,微信支付官方推出了全新的微信支付API v3。并且提供了Java、php、go语言的相关业务SDK,该SDK已支持回调验签,接收解析回调通知的功能,若你有SDK需求,建议使用API v3版本,根据自己的需要选择对应的SDK使用,具体可参考:微信支付APIv3 SDK 介绍
V2版接口和V3版接口规则差异说明:
- 参数格式:V2接口为XML,V3接口为JSON
- 签名方式:V2接口为MD5或HMAC-SHA256,V3接口为非对称密钥SHA256-RSA
- 回调加密:V2接口无需加密,V3接口为AES-256-GCM加密
本文章主要协助开发者定位接收不到微信支付回调的问题,开发者可根据以下步骤逐步排查。
情况一、使用V3接口未设置APIv3密钥
针对V3版本的接口,未设置APIv3密钥的情况下,微信侧不会发送异步通知,请务必保证先设置了APIv3密钥,功能介绍和设置指引可参考:什么是APIv3密钥?如何设置?
情况二、接口上传或商户平台配置的回调地址不规范
部分业务只能在商户平台配置回调地址,例如接收分账动账通知、委托代扣解约通知,具体的需要以各业务接口文档说明为准。
2.1请检查回调URL是否有携带后缀参数,如果携带了后缀参数,会导致无法接收到微信的回调通知信息
携带参数错误示例:http://www.qq.weixin.top/weixin/pay/callback/test?testid=000001
2.2请检查回调URL是否是自己系统的真实回调地址,有很多人这里在上传给微信支付时填错了回调地址,例如比系统的真实地址多了“空格”或“/“的情况
错误示例:系统真实回调地址:http://www.qqweixin.top/weixin/pay/callback/test
实际在接口上传或商户平台配置的是:http://www.qqweixin.top/weixin/pay//callback/test
比系统真实回调地址多了“/”(手动)
2.3请检查回调URL是否为https地址,如果是走专线接入,使用专线NAT IP或者私有回调域名才可使用http
2.4notify_url必须是以https://或http://开头的完整全路径地址,不能填写localhost、127.0.0.1、192.168.x.x等本地或内网IP。
情况三、有防火墙策略限制但未对微信IP段开通白名单
商户侧对微信支付回调IP有防火墙策略限制的,需要对以下所有IP段开通白名单:
上海电信出口网段:101.226.103.0/25
上海联通出口网段:140.207.54.0/25
上海CAP出口网段:121.51.58.128/25
深圳电信出口网段:183.3.234.0/25
深圳联通出口网段:58.251.80.0/25
深圳CAP出口网段:121.51.30.128/25
香港出口网段:203.205.219.128/25
退款结果通知、分账动账通知IP(新增):
175.24.214.208、175.24.211.24、175.24.213.135、109.244.180.23、114.132.203.119、43.139.43.69
情况四、回调URL外网无法访问或域名DNS解析失败
4.1请检查回调URL 中的域名和IP是不是外网可以访问的,如果外网不可以访问,会导致无法接收到微信的回调通知信息
4.2请检查回调URL中的代码处理逻辑是否做了登录态校验,如果做了这个校验,也会导致无法接收到微信的回调通知信息
4.3请检查回调URL 域名是否因为未实名认证、未备案、到期未续费等原因而出现异常状态,造成域名停止解析,找不到相关域名对应的IP,从而导致接收不到回调
如何检查域名是否有问题:回调地址是否可被外网访问,DNS是否能解析成功。
检查ip地址/域名是否可以ping通:如何ping域名,建议是在不同网络下进行操作,这样可以检查是否是内网ip,ping不通可能的原因是ip地址和域名没有映射成功或者是内网ip(同网络能ping通,不同网络不能ping通,一般就是内网ip),需要到注册的域名网站重新进行映射
成功示例:
异常示例:
情况五、订单未达到触发回调的状态
请按照对应的回调接口文档确认是否达到了触发回调条件,例如申请退款成功之后,长时间没有收到退款结果通知的回调,这种情况下,大概率是退款单还没得到明确的结果,例如退款还在处理中,退到银行卡(储蓄卡及信用卡)一般需要0-3个工作日,具体时间还需要以银行处理时间为准,像这种情况没回调就是正常的,商户可以通过调用查询退款API查到对应退款单的处理状态。
情况六、处理回调的代码有问题
如果你使用的开发语言是Java,go,php,建议使用微信支付官方提供的SDK
请检查使用的回调地址是否是线上正在使用的,如果线上正常使用,且对代码或者环境有修改后才出现问题,则说明大概率是代码层面或者环境的问题。可以使用postman等API调试工具模拟微信支付回调的格式测试,看看代码程序是否能正常接收到回调信息,v2接口的回调信息是xml格式,v3接口的回调格式json格式,两种格式都是以字符串形式发送的数据流
v2接口回调测试示例(固定为xml格式):
V2示例参数(可直接复制使用):
<xml>
<appid><![CDATA[wxa9d9651ae8212345]]> </appid>
<attach><![CDATA[内部商户号是 11312347]]></attach>
<bank_type><![CDATA[CITIC_CREDIT]]></bank_type>
<cash_fee><![CDATA[10]]></cash_fee>
<fee_type><![CDATA[CNY]]></fee_type>
<is_subscribe><![CDATA[N]]></is_subscribe>
<mch_id><![CDATA[1900010001]]></mch_id>
<nonce_str><![CDATA[vmall_230825163112_idc_3489]]></nonce_str>
<openid><![CDATA[oLTPCuLEY-noZj6MKWmyMn12345]]></openid>
<out_trade_no><![CDATA[vmall_230825163112_idc_3489]]></out_trade_no>
<result_code><![CDATA[SUCCESS]]></result_code>
<return_code><![CDATA[SUCCESS]]></return_code>
<sign><![CDATA[00199DB310C7D426EDADEE6A6E91B53D]]></sign>
<time_end><![CDATA[20230825163126]]></time_end>
<total_fee>10</total_fee>
<trade_type><![CDATA[JSAPI]]></trade_type>
<transaction_id><![CDATA[4200001905202308254305900001]]></transaction_id>
</xml>
v3接口回调测试示例(固定为json格式):
V3示例参数(可直接复制使用):
{
“id”: “EV-2018022511223320873”,
“create_time”: “2015-05-20T13:29:35+08:00”,
“resource_type”: “encrypt-resource”,
“event_type”: “TRANSACTION.SUCCESS”,
“summary”: “支付成功”,
“resource”: {
“original_type”: “transaction”,
“algorithm”: “AEAD_AES_256_GCM”,
“ciphertext”: “3TxpOF8YqF5Zy2cYQWrZNnmC1FWrxwIPvIv4WejUr+8ctmM6L3kxqQ6JS56S7JkVFMiCvfcMGkQFM
tUifq09Wrt6+bNwMUNLKQ52zLyMLwS9uML2Y2Qmi1obactel3rwwTs+IXGir505F2eLBG9ruqtJxGd2dlsLQ+0
Sl7OUA/mMCnxMXUhfwJC84lv2oZDC3T827Mzy0BQ5YmXfdpgOA0OCTl+OwokWMXJz2DiGafE1n0pqH/R0V
gDyUCEAOb6l+dFRR7S0I1yVe7/6czAYp+i7mTgNrmudG7EgDoOVfGga9Wq9epO6PEew1ypK5M8PmIopNSzg3
4WEouFhOqvPZfi2paqib2gxexcqtniQQbdechavr4SH/3JSpg8Zbnnbeo3ClFDU7eRVO2FCAPQaMlcSmjU4zv
2H98dvB9TnIyon/so+QwSo/ZwWMnTKeztviuYd5ICbrtzAPoeeDrPlYlB0pwlFT8Tz3lqC0QZWKvL0+FIj0+9P+2/
JvZpr5aVrFosMI1Afb17P7zx69jnLFPFX0ph4AgBK/N8oRNg12uVqvJM3E07/4P7LWLKyrf9FySovQplbhlasA
yOf5PWb3aBwEv19hr71uMvAyuCll39zhIZ9M1CZTcSLpuyeWDOUwt3Y7ww0mOMruvK5a5mREuowqfP/
OVv73yX/mf/7MEo9wAvz2bNqAuS0c9xc2yn5EHN4rNSTgApcJh2OTNUVEZXu7sL04S/pKpApS4eXxTS1bnLeqVfk5
rePQagXFXwMFJVfAPmLyMRLsBLpdc2lO2LIof+nx8HnqjHvKYnolRgJYAlUuHx1mdjsPrZreDjK12b3cBznrfC7gac+3VW4
r42f2b533RCAvchchxb7l+sdzQSFImbxZ1IAZFO/ZozZEFFko2FypOh2SdZYigW6Rq6hxw8EFOrvp6GwKpkhGbb4xnQsGHupDA
Mte5QmiMb9M8KUP5DSIo7gCsO7FMWtXFrdetyQfLXsZ/CidA+JOlSGKL+8s/ISyajpl8YseGNhlq39Zci53GoQCETs/ixLPz4BO
TeTLC9FASUoEGPKet+OvYhdo4Xlopbhs95jl6jjgZcT6Bkr5ivG2ocqi2aP5hpnnVDXq/OwXvdofTHxlp2oydlYo9xqXhg+emzSQ8
woub6XXO22KOKuEcWMSCiSMWYm9gsP2v0QkCw54ZmJHuDoivV2jVrFQjdH9nO2m68SHj9I9PBj4eSbDG235d/gSxp6VrrH+UaP5
b4fjZi4xZ+9Nr1oUAc1Z6RRqqvCVLY1DTMpp2H/aXr9gNUs8fL8kkfuiWEKTkcoW/JKTZjiizzbHEkXSU3+dm4AITiKWrdvSUs80OGg==”,
“associated_data”: “certificate”,
“nonce”: “4de73afd28b6”
}
}
其实他们都懒得去排查,只想给个420单号让你把具体错误给他们
我用postman模拟是正常的,为啥真实付款后没有回调呢?比如这个订单:4200002180202406292587583221
应答报文头呢?怎么没有头?建议给一个应答报文头,方便我模拟真实的操作场景