django 调用微信接口(微信支付、微信用户信息)

class WeChatPay(object):
    def __init__(self, order_id, body, total_fee, nonce_str, spbill_create_ip='8.8.8.8'):
        """
        :param order_id: 订单ID
        :param body: 订单信息
        :param total_fee: 订单金额
        :param nonce_str: 32位内随机字符串
        :param spbill_create_ip: 客户端请求IP地址
        appid = '微信appid'
    AppSecret = '微信AppSecret'
    mch_id = '微信商户id'
    api_key = '微信支付密钥'
        """
        self.params = {
            'appid': YOUR_WX_APPID,
            'mch_id': YOUR_MCH_ID,
            'nonce_str': nonce_str,
            'body': str(body),
            'out_trade_no': str(order_id),
            'total_fee': str(int(total_fee)),#单位为分
            'spbill_create_ip': spbill_create_ip,#用户请求地址
            'trade_type': 'APP',  # 'APP',
            'notify_url': YOUR_NOTIFY_URL,#你的支付回调地址
        }

        self.WxPay_request_url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'  # 微信请求url
        self.error = None

    def key_value_url(self, value):
        """将将键值对转为 key1=value1&key2=value2
        """
        pair_array = []
        string_sign = ''
        for k in sorted(value.keys()):
            string_sign += "{0}={1}&".format(k, value[k])
        print(string_sign)
        return string_sign

    def get_sign(self, params):
        """生成sign
        """
        stringA = self.key_value_url(params)
        stringSignTemp = stringA + 'key=' + current_app.config['APIKEY']   # APIKEY, API密钥,需要在商户后台设置
        print(stringSignTemp)
        sign = hashlib.md5(stringSignTemp.encode('utf-8')).hexdigest().upper()
        params['sign'] = sign

    def get_req_xml(self):
        """拼接XML
        """
        self.get_sign(self.params)
        xml = "<xml>"
        for k in sorted(self.params.keys()):
            xml += '<{0}>{1}</{0}>'.format(k, self.params[k])
        xml += "</xml>"
        print(xml)
        return xml.encode('utf-8')

    def get_prepay_id(self):
        """
        请求获取prepay_id
        """
        import requests
        xml = self.get_req_xml()
        unifiedorderXML = requests.post('https://api.mch.weixin.qq.com/pay/unifiedorder', data=xml)
        unifiedorderXML.encoding ='utf-8'
        unifiedorderXML = unifiedorderXML.text
        print(unifiedorderXML)
        tree = et.parse(unifiedorderXML)
        root = tree.getroot()
        if root.find("result_code").text != 'SUCCESS':
            self.error = u"连接微信出错啦!"
            print(self.error)
        prepay_id = root.find("prepay_id").text

        self.params['prepay_id'] = prepay_id
        self.params['package'] = 'Sign=WXPay'
        self.params['timestamp'] = str(int(time.time()))

    def re_finall(self):
        """得到prepay_id后再次签名,返回给终端参数
        """
        self.get_prepay_id()
        if self.error:
            return

        sign_again_params = {
            'appid': self.params['appid'],
            'noncestr': self.params['nonce_str'],
            'package': self.params['package'],
            'partnerid': self.params['mch_id'],
            'timestamp': self.params['timestamp'],
            'prepayid': self.params['prepay_id']
        }
        self.get_sign(sign_again_params)
        self.params['sign'] = sign_again_params['sign']

        # 移除其他不需要返回参数
        print('最后一步:', self.params)
        parms_keys = []
        for i in self.params.keys():
            parms_keys.append(i)
        for i in parms_keys:
            if i not in ['appid', 'mch_id', 'nonce_str', 'timestamp', 'sign', 'package', 'prepay_id']:
                self.params.pop(i)
        print('传给前端的parms:', self.params)
        return self.params
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值