微信小程序退款 重点:微信退款必须要有ssl证书
def Refund(self, reqd):
prepay = {}
cert_path = r'./cert/apiclient_cert.pem'
key_path = r'./cert/apiclient_key.pem'
chardet.detect(self.request.body)
bod = eval(self.request.body.decode('utf-8'))
weixinkey = 'xxxxxxxxxxxxxxxxxxxxx'
url = 'https://api.mch.weixin.qq.com/secapi/pay/refund'
body={}
body['appid'] = 'xxxxxxxxxxx'
body['mch_id'] = 'xxxxxxxxxxx'
body['nonce_str'] = createNoncestr()
body['sign_type'] = 'MD5'
body['out_trade_no'] = bod.get('recordid')
body['out_refund_no'] = createNoncestr(64)
body['total_fee'] = bod.get('orderamount')
body['refund_fee'] = bod.get('refundamount')
body['notify_url'] = 'xxxxxxxxxxxxxxxxxxxxxx'
bodys = get_sign_contents(body)
bodys = bodys + '&key=' + weixinkey
sign = (MD5(bodys)).upper()
body['sign'] = sign
xml = "<xml>"
for k, v in body.items():
if type(v) == int:
v = str(v)
xml += '<' + k + '>' + v + '</' + k + '>'
xml += "</xml>"
print("xml :"+xml)
r = requests.post(url, cert=(cert_path, key_path), data=xml.encode("utf-8"))
msg = r.text.encode('ISO-8859-1').decode('utf-8')
print('msg :'+msg)
xmljson = xmltodict.parse(msg)
print(xmljson['xml']['return_code'])
if xmljson['xml']['return_code'] =='SUCCESS':
if "err_code" not in xmljson['xml']:
prepay['transaction_id'] = xmljson['xml']['transaction_id']
prepay['out_trade_no'] = xmljson['xml']['out_trade_no']
prepay['out_refund_no'] = xmljson['xml']['out_refund_no']
prepay['refund_id'] = xmljson['xml']['refund_id']
prepay['refund_fee'] = xmljson['xml']['refund_fee']
prepay['total_fee'] = xmljson['xml']['total_fee']
else:
prepay['code'] = xmljson['xml']['err_code']
prepay['desc'] = xmljson['xml']['err_code_des']
else:
prepay['code'] = '500'
prepay['desc'] = '提交业务失败'
return prepay
def get_sign_contents(all_params):
sign_content = ""
for (k, v) in sorted(all_params.items()):
value = v
if not isinstance(value, str):
value = json.dumps(value, ensure_ascii=False)
sign_content += ("&" + k + "=" + value)
sign_content = sign_content[1:]
return sign_content
def MD5(str):
md5 = hashlib.md5()
md5.update(str.encode('utf-8'))
return md5.hexdigest()
微信小程序支付回调
def wxAppletsRefund(self, reqd):
weixinkey = 'xxxxxxxxxxx'
xmljson = xmltodict.parse(reqd)
temp = base64.b64decode(xmljson['xml']['req_info'])
sign = (MD5(weixinkey)).lower()
cipher = AES.new(sign, AES.MODE_ECB)
a = cipher.decrypt(temp).decode('utf8')
print('a :' + a)