需求
微信官方提示需要签名验证,可是在官网上却没找到签名验证的方法。
支付回调若是得不到正确回复,就会多次请求回调微信官方文档-页面底部
解决
在支付回调接口中,对返回的数据按照 微信的签名要求,注意:空值和key为sign\sign_type的值 不参与签名。 代码如下(上篇中有完整的微信支付代码):
def wx_sign(self, param):
stringA = ''
ks = sorted(param.keys())
for k in ks:
#在验签时使用,过滤字段
if k != 'sign' and k != 'sign_type' and param[k]:
data = param[k]
stringA += (k + '=' + str(data) + '&')
stringSignTemp = stringA + "key=" + self.MCHKEY
# md5加密
hash_md5 = hashlib.md5(stringSignTemp.encode('utf8'))
sign = hash_md5.hexdigest().upper()
return sign
回调返回数据格式:
data1 = {
'return_code': 'SUCCESS',
'return_msg': 'OK'
}
具体使用(支付回调api):
class alter_order_status(APIView):
#指定解析类型,为了读取回调的xml
parsers.XMLParser.media_type = 'text/xml'
parser_classes = [parsers.XMLParser]
# @staticmethod
def post(self, request):
# 获取订单号,通过类型来区分,订单号为 type_orderId
print(request.data)
if request.data["return_code"] == "SUCCESS" and request.data["result_code"] == "SUCCESS":
# 验签 把返回数据除去sign signType 空值,重新签名
wxpay = WxPay(good_info={})
wxpay.MCHKEY = MCHKEY
sign = wxpay.wx_sign(request.data)
print('sign:' + sign)
#验签
if sign == request.data['sign']:
data1 = {
'return_code': 'SUCCESS',
'return_msg': 'OK'
}
data2 = {
'xml': data1
}
return JsonResponse(data=data2)