1. 回调失败问题(沙箱环境)
问题始末: 最近再弄微信退款回调发现设置的回调的url根本就没有被调用,但是微信支付的回调是成功的.
于是开始做各种尝试 1. 代码没问题 2. 防火墙并没有限制微信IP的访问
网上有的说微信退款回调被取消了,这真的是误人子弟...
微信的官方以及公众号都写得是沙箱环境的退款是可以用的,但是都没说在沙箱环境下退款回调的url不起作用,毕竟沙箱环境下支付成功的回调是成功的
再此真的想吐槽下微信官方,希望能把这个说明加到官方文档上,省的好多童鞋做无用功
2. 解决方案
将微信支付切换到生产环境,支付成功一笔再退款就会发现退款的回调已经成功执行了
3. 退款回调的解密代码
在此放上微信回调的解密代码(python版),防止在生产环境下的key还没申请下来的童鞋的调试
微信退款回调的内容都是放在body中的, 我们假设现在已经获取到了body中的内容
def md5_trans(decode_str):
"""md5加密"""
return hashlib.md5(decode_str.encode("utf-8")).hexdigest()
def aes_ecb_pkcs7(body, key):
"""AES-ECB模式解密PKCS7Padding"""
unpad = lambda s: s[:-ord(s[len(s) - 1:])]
cipher = AES.new(key, AES.MODE_ECB)
return unpad(cipher.decrypt(body)).decode('utf8')
def base64_decode(body):
"""base64解码"""
return base64.b64decode(body)
def decode_refund_response(body, key):
"""微信服务器通知退款通知结果的时候使用,解密加密字符串"""
# 一: 进行base64解码
body = base64_decode(body)
# 二: key做md5,得到32位小写key*
key = md5_trans(key)
# 三: key*对加密串B做AES-256-ECB解密(PKCS7Padding)
info = aes_ecb_pkcs7(body, key)
return info