关于微信支付 二维码扫码支付

首先注册微信公众平台服务号:https://mp.weixin.qq.com 

    获得开发者id和秘钥(appid & appsecret)

 

    随后注册微信支付商户平台:https://pay.weixin.qq.com/

    获取微信支付的商户号(在账户信息页面):

 

 获取微信支付接口的秘钥(账户中心->api安全):

 

同时在产品中心->开发配置页面,将支付域名配置好:

 

微信官方文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5&index=3 

生成二维码后

使用微信扫码即可

由于涉及金钱业务,为了养成良好的测试习惯,最好登录商户后台再次确认

import requests

import random

import time

import hashlib

import qrcode

from bs4 import BeautifulSoup



class WeixinHandler():

    def trans_xml_to_dict(self,data_xml):

        soup = BeautifulSoup(data_xml, features='html.parser')

        xml = soup.find('xml')  # 解析XML

        if not xml:

            return {}

        data_dict = dict([(item.name, item.text) for item in xml.find_all()])

        return data_dict



    def trans_dict_to_xml(self,data_dict):  # 定义字典转XML的函数

        data_xml = []

        for k in sorted(data_dict.keys()):  # 遍历字典排序后的key

            v = data_dict.get(k)  # 取出字典中key对应的value

            if k == 'detail' and not v.startswith('<![CDATA['):  # 添加XML标记

                v = '<![CDATA[{}]]>'.format(v)

            data_xml.append('<{key}>{value}</{key}>'.format(key=k, value=v))

        return '<xml>{}</xml>'.format(''.join(data_xml))  # 返回XML



    def get_sign(self,data_dict, key):  # 签名函数,参数为签名的数据和密钥

        params_list = sorted(data_dict.items(), key=lambda e: e[0], reverse=False)  # 参数字典倒排序为列表

        params_str = "&".join(u"{}={}".format(k, v) for k, v in params_list) + '&key=' + key

        # 组织参数字符串并在末尾添加商户交易密钥

        md5 = hashlib.md5()  # 使用MD5加密模式

        md5.update(params_str.encode())  # 将参数字符串传入

        sign = md5.hexdigest().upper()  # 完成加密并转为大写

        return sign



    def get(self):

        url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'  # 微信扫码支付接口

        key = '商户api秘钥'  # 商户api秘钥 须替换

        total_fee = int(float('1') * 100)  # 支付金额,单位分

        body = 'nine-tailed fox'  # 商品描述



        out_trade_no = "order_16837069598136852151_5"  # 订单编号  只能使用一次



        params = {

            'appid': 'APPID',  # APPID  须替换

            'mch_id': '商户号',  # 商户号  须替换

            'notify_url': 'http://127.0.0.1:9999/school/school',  # 支付域名回调地址

            'product_id': 'goods_%s' % random.randrange(100000, 999999),  # 商品编号

            'trade_type': 'NATIVE',  # 支付类型(扫码支付)

            'spbill_create_ip': '114.254.176.137',  # 发送请求服务器的IP地址

            'total_fee': total_fee,  # 订单总金额

            'out_trade_no': out_trade_no,  # 订单编号

            'body': body,  # 商品描述

            'nonce_str': 'ibuaiVcKdpRxkhJA'  # 随机 字符串

        }

        sign = self.get_sign(params, key)  # 获取签名

        params.setdefault('sign', sign)  # 添加签名到参数字典

        xml = self.trans_dict_to_xml(params)  # 转换字典为XML

        response = requests.request('post', url, data=xml)  # 以POST方式向微信公众平台服务器发起请求

        print(response.content)

        data_dict = self.trans_xml_to_dict(response.content)  # 将请求返回的数据转为字典

        print(data_dict)

        qrcode_name = out_trade_no + '.png'  # 支付二维码图片保存路径

        if data_dict.get('return_code') == 'SUCCESS':  # 如果请求成功

            img = qrcode.make(data_dict.get('code_url'))  # 创建支付二维码片

            img.save('../vxstatic/' + qrcode_name)  # 保存支付二维码



        return 'ok'



print(WeixinHandler().get())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值