python微信退款案例

微信小程序退款 重点:微信退款必须要有ssl证书

    def Refund(self, reqd):
        #  @Description: 微信小程序退款 重点:微信退款必须要有ssl证书
        #  cert_path = r'./cert/apiclient_cert.pem':证书的路径 key_path = r'./cert/apiclient_key.pem':证书的路径
        #  requests.post(url, cert=(cert_path, key_path),  data=xml.encode("utf-8"))
        #  @Date: 2019/10/14 0014
        prepay = {}
        cert_path = r'./cert/apiclient_cert.pem'
        # print(cert_path)
        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={}
        # 小程序ID
        body['appid'] = 'xxxxxxxxxxx'
        # 商户号
        body['mch_id'] = 'xxxxxxxxxxx'
        # 生成的随机数32位
        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"))#退款请求需要双向证书cert=(cert_path, key_path)
        msg = r.text.encode('ISO-8859-1').decode('utf-8')#转换格式
        print('msg      :'+msg)
        xmljson = xmltodict.parse(msg)#xmltodict是另一个简易的库,它致力于将XML变得像JSON.
        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
   
   # 微信md5加密
def MD5(str):
    md5 = hashlib.md5()
    md5.update(str.encode('utf-8'))
    return md5.hexdigest()

微信小程序支付回调

    def wxAppletsRefund(self, reqd):
        #  @Description: 微信小程序支付回调
        #  @Date: 2019/10/16 0016
        weixinkey = 'xxxxxxxxxxx'#商户key
        xmljson = xmltodict.parse(reqd)  # xmltodict是另一个简易的库,它致力于将XML变得像JSON.
        #对加密串做base64解码,得到加密串B
        temp = base64.b64decode(xmljson['xml']['req_info'])
        #对商户key做md5,得到32位小写key*
        sign = (MD5(weixinkey)).lower()
        cipher = AES.new(sign, AES.MODE_ECB)
        a = cipher.decrypt(temp).decode('utf8')
        print('a           :' + a)
        
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值