前言:相信很多朋友在开发微信支付接口时遇到无法收到回调问题非常的懊恼,不知道从何下手,相信看完本文章基本就能解决你无法收到回调的问题了。阅读本文章前,建议提前看一下文章右侧的目录,帮助你更好的阅读此文章。
--------
提前需要准备的工具:postman(其他能调试API的工具也可以)
--------
什么情况下才会有回调通知
1、 支付成功后微信侧才会发送支付结果回调通知
可参考官方文档:支付通知API
2、 申请退款成功后,只有退款状态为退款异常、退款关闭、退款成功才会发送退款回调通知
可参考官方文档:退款结果通知API
注意:
1.上面只是举例了两个接口,还要更多的回调接口,每个回调接口都会有对应的 通知频率 和 回调触发条件
--------
2.支付结果回调 是异步队列加公网通知的,支付完成后会立即发送回调消息,以支付结果回调为准,不存在回调支付成功,查询接口却一直返回的是未支付
--------
3.退款回调 是异步的,申请退款接口返回的成功只是代表了申请退款这个操作成功了,退款整个流程可能经过银行等,所以 回调时长可能会长一些
--------
4.申请退款成功后,用户侧长时间未到账,或商户查询退款状态一直都是退款中,则可能是退款到用户银行卡中,需要经过银行,一般在7个工作内是比较正常的,若7个工作日后还是退款中,请拨打95017协助排查
--------
5.回调的作用是告诉商户结果是什么,商户应答回调是告诉接口已经成功收到回调,建议商户最好是按照文档要求去应答接口,若商户是自行查询接口来判断情况,而不是根据回调来判断,理论上是可以不去管回调(包括应答),但还是强烈建议按照正常流程正确的应答接口
--------
下面介绍一下每一种无法接受到回调的情况及对应的检查方法
--------
情况一:v3接口的回调未设置APIv3密钥(非常重要!!!非常重要!!!非常重要!!!一定要优先设置)
注意(APIv2密钥以前也叫API密钥):
1.v2接口 使用的是 APIV2密钥,v2接口 下单能成功 说明就设置好了APIv2密钥。
--------
2.APIv3密钥 与 APIV2密钥 是隔离的,设置APIv3密钥时,不会导致APIV2密钥发生变化,且 对v2接口没有影响。
--------
情况二:下单时实际填写的回调地址跟自己实际想要的回调地址不一致,可能多了 / 或者 空格
--------
比如想要的是:http://www.qqweixin.top/weixin/pay/callback/test
--------
实际的填写的:http://www.qqweixin.top/weixin/pay//callback/test
--------
情况三(硬性条件,不要抱着侥幸心理!!!):回调地址不规范,回调地址规则:回调地址不能携带参数及端口号且不能是直接的ip,请检查下单时的回调地址是否有携带参数或端口号,必须为 公网域名 且是 https 开头,现使用 http开头 、携带 端口号 或是 ip 能正常接收回调的用户,建议更换为 https 且去除 端口号 使用正常的域名,避免后期出现回调通知无法接收的情况,是post请求。
--------
错误示例:
携带端口号:http://www.qqweixin.top:443/weixin/pay/callback/test
携带参数:http://www.qqweixin.top/weixin/pay/callback/test?id=10086
使用ip地址:192.168.x.x
非公网域名:(一定要使用公网ip映射的域名)
--------
如何检查域名是否有问题:核实回调地址是否可被外网访问,是否有DNS解析成功。
(检查ip地址/域名是否可以ping通:如何ping域名,建议是在不同网络下进行操作,这样可以检查是否是内网ip,ping不通可能的原因是ip地址和域名没有映射成功或者是内网ip(同网络能ping通,不同网络不能ping通,一般就是内网ip),需要到注册的域名网站重新进行映射)
成功示例:
失败示例:
--------
情况四:开通了防火墙,拦截了回调
(是否开通了防火墙导致回调地址被拦截了,开通防火墙后设置一下白名单,回调IP段白名单)
--------
情况五:商户侧网络波动导致部分回调丢失
商户侧由于网络波动导致部分部分回调数据没有正常存储或数据丢失等,可以按照网络监测工具检查
(一般商户侧出现就部分订单的回调丢失就是这种情况,微信侧目前没有出现过支付成功后未给商户发送回调的情况,若极端情况下出现,官方也肯定是会在第一时间通知商户,所以基本都是商户自身网络问题导致)
--------
情况六:域名转发(url转发)导致的DNS解析失败
域名转发:所谓URL转发,是通过服务器的特殊设置,将访问您当前域名的用户引导到您指定的另一个网络地址。 地址转向(也可称“URL转发”)即将一个域名指向到另外一个已存在的站点,英文称为“ URL FORWARDING ”。
DNS解析失败:解析失败就是找不到相关域名对应的IP
这种情况一般自己比较难排查吗,所以不要做域名转发,然后再进行测试,出现问题后再按照上述步骤进行检查(建议直接咨询自己的运维人员,他们知道如何处理)
情况七:程序代码问题(若使用的回调地址本身是在正常使用的回调地址,是对代码或者环境修改后出现的问题,则说明是代码层面或者环境的问题)
使用postman等API调试工具模拟微信支付回调的格式测试,检查代码是否能正常接收回调信息,v2接口的回调信息是xml格式,v3接口的回调格式json格式,上述两种格式都是以字符串的形式发送的数据流,特殊情况:只要是在商户平台进行 手动退款的回调通知都是xml格式。
(注意测试时,发送回调和接收回调尽量不要在同一网络当中,避免都是在是同一网络测试结果不准确,注意:接收到回调为空的现象一般都是接收格式的问题,比如xml格式的数据使用json格式接收)
v2接口回调格式(固定为xml格式,v2部分接口需要解密,比如:退款接口,详情会在接口特别说明说明中有描述,退款结果通知)
示例:
<xml>
<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
<attach><![CDATA[支付测试]]></attach>
<bank_type><![CDATA[CFT]]></bank_type>
<fee_type><![CDATA[CNY]]></fee_type>
<is_subscribe><![CDATA[Y]]></is_subscribe>
<mch_id><![CDATA[10000100]]></mch_id>
<nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str>
<openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></openid>
<out_trade_no><![CDATA[1409811653]]></out_trade_no>
<result_code><![CDATA[SUCCESS]]></result_code>
<return_code><![CDATA[SUCCESS]]></return_code>
<sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign>
<time_end><![CDATA[20140903131540]]></time_end>
<total_fee>1</total_fee>
<coupon_fee><![CDATA[10]]></coupon_fee>
<coupon_count><![CDATA[1]]></coupon_count>
<coupon_type><![CDATA[CASH]]></coupon_type>
<coupon_id><![CDATA[10000]]></coupon_id>
<trade_type><![CDATA[JSAPI]]></trade_type>
<transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id>
</xml>
v3接口回调格式(固定为json格式,格式固定,内容不一样,需要解密)
示例:
{
“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+8ctmM6L3kxqQ6JS56S7JkVFMiCvfcMGkQFMtUifq09Wrt6+bNwMUNLKQ52zLyMLwS9uML2Y2Qmi1obactel3rwwTs+IXGir505F2eLBG9ruqtJxGd2dlsLQ+0Sl7OUA/mMCnxMXUhfwJC84lv2oZDC3T827Mzy0BQ5YmXfdpgOA0OCTl+OwokWMXJz2DiGafE1n0pqH/R0VgDyUCEAOb6l+dFRR7S0I1yVe7/6czAYp+i7mTgNrmudG7EgDoOVfGga9Wq9epO6PEew1ypK5M8PmIopNSzg34WEouFhOqvPZfi2paqib2gxexcqtniQQbdechavr4SH/3JSpg8Zbnnbeo3ClFDU7eRVO2FCAPQaMlcSmjU4zv2H98dvB9TnIyon/so+QwSo/ZwWMnTKeztviuYd5ICbrtzAPoeeDrPlYlB0pwlFT8Tz3lqC0QZWKvL0+FIj0+9P+2/JvZpr5aVrFosMI1Afb17P7zx69jnLFPFX0ph4AgBK/N8oRNg12uVqvJM3E07/4P7LWLKyrf9FySovQplbhlasAyOf5PWb3aBwEv19hr71uMvAyuCll39zhIZ9M1CZTcSLpuyeWDOUwt3Y7ww0mOMruvK5a5mREuowqfP/OVv73yX/mf/7MEo9wAvz2bNqAuS0c9xc2yn5EHN4rNSTgApcJh2OTNUVEZXu7sL04S/pKpApS4eXxTS1bnLeqVfk5rePQagXFXwMFJVfAPmLyMRLsBLpdc2lO2LIof+nx8HnqjHvKYnolRgJYAlUuHx1mdjsPrZreDjK12b3cBznrfC7gac+3VW4r42f2b533RCAvchchxb7l+sdzQSFImbxZ1IAZFO/ZozZEFFko2FypOh2SdZYigW6Rq6hxw8EFOrvp6GwKpkhGbb4xnQsGHupDAMte5QmiMb9M8KUP5DSIo7gCsO7FMWtXFrdetyQfLXsZ/CidA+JOlSGKL+8s/ISyajpl8YseGNhlq39Zci53GoQCETs/ixLPz4BOTeTLC9FASUoEGPKet+OvYhdo4Xlopbhs95jl6jjgZcT6Bkr5ivG2ocqi2aP5hpnnVDXq/OwXvdofTHxlp2oydlYo9xqXhg+emzSQ8woub6XXO22KOKuEcWMSCiSMWYm9gsP2v0QkCw54ZmJHuDoivV2jVrFQjdH9nO2m68SHj9I9PBj4eSbDG235d/gSxp6VrrH+UaP5b4fjZi4xZ+9Nr1oUAc1Z6RRqqvCVLY1DTMpp2H/aXr9gNUs8fL8kkfuiWEKTkcoW/JKTZjiizzbHEkXSU3+dm4AITiKWrdvSUs80OGg==”,
“associated_data”: “certificate”,
“nonce”: “4de73afd28b6”
}
}