?微信小程序?----支付接口

Posted LD_Dragon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了?微信小程序?----支付接口相关的知识,希望对你有一定的参考价值。

 ==文档==

 流程搞清楚就行  我就直接丢代码了 ==文档==

# 支付接口
class Pay(APIView):
    def post(self, request, *args, **kwargs):
        login_key = request.data.get(\'login_key\')
        if not login_key:
            return Response({\'status\': 400, \'msg\': \'参数错误\'})
        data_list = cache.get(login_key)
        if not data_list:
            return Response({\'status\': 400, \'msg\': \'没有login_key对应的值\'})
        session_key, open_id = data_list.split(\'&\')
        # 把open_id放入self中 写pay方法
        self.open_id = open_id
        # 获取ip
        # 使用负载均衡 获取ip方法
        if request.META.get(\'HTTP_X_FORWARDED_FOR\'):
            self.ip =request.META.get(\'HTTP_X_FORWARDED_FOR\')
        else:
            # 原本的ip获取
            self.ip = request.META.get(\'REMOTE_ADDR\')
        data = self.pay()
        return Response({\'status\': 200, \'msg\': \'ok\', \'data\':data})

    # 随机字符串
    def get_str(self):
        str_all = \'1234567890abcdefjhigklmnpqrstuvwxyz\'
        nonce_str = \'\'.join(random.sample(str_all, 20))
        return nonce_str

    # 签名
    def get_sign(self):
        # sign 不参与签名
        data_dic = {
            "nonce_str": self.nonce_str,
            "out_trade_no": self.out_trade_no,
            "spbill_create_ip": self.ip,
            "notify_url": self.notify_url,
            "openid": self.open_id,
            "body": self.body,
            "trade_type": "JSAPI",
            "appid": self.app_id,
            "total_fee": self.total_fee,
            "mch_id": self.pay_mchid
        }
        # 拼接
        # sorted 按照ASCII 排序
        sign_str = "&".join([f"{k}={data_dic[k]}" for k in sorted(data_dic)])
        sign_str = f"{sign_str}&key{setting.pay_apikey}"
        md5 = hashlib.md5()
        md5.update(sign_str.encode(\'utf-8\'))
        return md5.hexdigest().upper()

    # 订单id
    def get_order_id(self):
        order_id = str(time.strftime(\'%Y%m%d%X\'))
        return order_id

    # xml转dic
    def xml_to_dic(self, xml):
        import xml.etree.ElementTree as ET
        xml_dict = {}
        data_dic = ET.fromstring(xml)
        for item in data_dic:
            xml_dict[item.tag] = item.text
        return xml_dict


    # 支付接口
    def pay(self):
        self.app_id = setting.APP_ID
        self.pay_mchid = setting.pay_mchid
        self.pay_apikey = setting.pay_apikey
        self.nonce_str = self.get_str()
        # 订单id
        self.out_trade_no = self.get_order_id()
        self.body = \'龙哥的生活费\'
        self.total_fee = 1
        self.spbill_create_ip = self.ip
        # 回调地址
        self.notify_url = \'https://www.baidu.com\'
        self.trade_type = \'JSAPI\'
        # 签名
        self.sign = self.get_sign()

        # 数据加密 且 变成xml形式
        data = f"""
        <xml>
            <appid>{self.app_id}</appid>
            <body>{self.body}</body>
            <mch_id>{self.pay_mchid}</mch_id>
            <nonce_str>{self.nonce_str}</nonce_str>
            <notify_url>{self.notify_url}</notify_url>
            <openid>{self.open_id}</openid>
            <out_trade_no>{self.out_trade_no}</out_trade_no>
            <spbill_create_ip>{self.spbill_create_ip}</spbill_create_ip>
            <total_fee>{self.total_fee}</total_fee>
            <trade_type>{self.trade_type}</trade_type>
            <sign>{self.sign}</sign>
        </xml>
        """
        # 发起请求
        url = \'https://api.mch.weixin.qq.com/pay/unifiedorder\'
        response = requests.post(url=url, data=data.encode(\'utf-8\'),
                                 headers={\'content-type\':\'application/xml\'}
                                 )
        data = self.xml_to_dic(response.content) # 二进制数据
        data = self.two_sign(data[\'prepay_id\'])
        return data


    # 再次签名
    def two_sign(self, prepay_id):
        data_dict = {
            "appId": setting.APP_ID,
            "timeStamp": str(int(time.time())),
            "nonceStr": self.get_str(),
            "package": f"prepay_id={prepay_id}",
            "signType": "MD5"
        }
        sign_str = "&".join([f"{k}={data_dict[k]}" for k in sorted(data_dict)])
        sign_str = f"{sign_str}&key={setting.pay_apikey}"
        md5 = hashlib.md5()
        md5.update(sign_str.encode("utf-8"))
        sign=md5.hexdigest().upper()
        data_dict["paySign"]=sign
        data_dict.pop("appId")
        return  data_dict

 

 

以上是关于?微信小程序?----支付接口的主要内容,如果未能解决你的问题,请参考以下文章

小程序微信支付接口成功后不回调

在微信中如何调用支付宝接口

微信小程序一般去哪里对接一些商品接口

微信小程序调微信支付

微信小程序篇(微信小程序的支付)转载 “微信小程序联盟”

微信H5支付接口开发,安卓调用不了,苹果可以正常调用?