当前位置: 首页 > 工具软件 > python-qrcode > 使用案例 >

python-qrcode-二维码

张唯
2023-12-01

1.qrcode 生成

def qrcode_gen(version=1, box_size=10, border=4, words=None, save_name=None):
    """
    将参数words生成文件名为save_name的二维码
    :param version: 值为1~40的整数,控制二维码的大小(最小值是1,是个12×12的矩阵)。 如果想让程序自动确定,将值设置为 None 并使用 fit 参数即可。
    :param box_size: 控制二维码中每个小格子包含的像素数。
    :param border: 控制边框(二维码与图片边界的距离)包含的格子数(默认为4,是相关标准规定的最小值)
    :param words: 生成二维码的内容
    :param save_name: 生成二维码后的文件名
    error_correction:控制纠错水平,范围是ERROR_CORRECT_L (L、M、Q、H),从左到右依次升高
    """
    qr = qrcode.QRCode(
        version=version,
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=box_size,
        border=border,
    )
    try:
        words = "https://www.12dms.com" if words is None else words
        save_name = "../static/img/" + "qrcode_" + str(time.ctime()) + ".png" if save_name is None else save_name
        print(">>二维码图片名称:{}".format(save_name))  # save_name:二维码保存路径 + 图片名称

        qr.add_data(words)
        qr.make()
        img = qr.make_image()
        img.save(save_name)
    except Exception as e:
        raise ManagerParamsError("103")

2.微信支付code_url 获取 生成二维码

class WxPayManager(object):
    APP_ID = WX_APP_ID
    MCH_ID = WX_MCH_ID
    CREATE_IP = WX_CREATE_IP
    NOTIFY_URL = WX_NOTIFY_URL
    API_KEY = WX_API_KEY
    UFDODER_URL = WX_UFDODER_URL

    def __init__(self):
        pass

    @staticmethod
    def get_sign(data_dict, key):
        """
        签名函数
        :param data_dict: 需要签名的参数,格式为字典
        :param key: 密钥 ,即上面的API_KEY
        :return: 字符串
        """
        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('utf-8'))  # 将参数字符串传入
        sign = md5.hexdigest().upper()  # 完成加密并转为大写
        return sign

    @staticmethod
    def order_num(mobile):
        """
        生成扫码付款订单号
        :param phone: 手机号
        :return:
        """
        local_time = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
        result = mobile + 'T' + local_time + WxPayManager.random_str(5)
        return result

    @staticmethod
    def random_str(randomlength=8):
        """
        生成随机字符串
        :param randomlength: 字符串长度
        :return:
        """
        strs = ''
        chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
        length = len(chars) - 1
        random = Random()
        for i in range(randomlength):
            strs += chars[random.randint(0, length)]
        return strs

    @staticmethod
    def trans_dict_to_xml(data_dict):
        """
        定义字典转XML的函数
        :param data_dict:
        :return:
        """
        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

    @staticmethod
    def trans_xml_to_dict(data_xml):
        """
        定义XML转字典的函数
        :param data_xml:
        :return:
        """
        soup = BeautifulSoup(data_xml, features='xml')
        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

    @staticmethod
    def qrcode_gen(version=1, box_size=10, border=4, words=None, save_name=None):
        """
        将参数words生成文件名为save_name的二维码
        :param version: 值为1~40的整数,控制二维码的大小(最小值是1,是个12×12的矩阵)。 如果想让程序自动确定,将值设置为 None 并使用 fit 参数即可。
        :param box_size: 控制二维码中每个小格子包含的像素数。
        :param border: 控制边框(二维码与图片边界的距离)包含的格子数(默认为4,是相关标准规定的最小值)
        :param words: 生成二维码的内容
        :param save_name: 生成二维码后的文件名
        error_correction:控制纠错水平,范围是ERROR_CORRECT_L (L、M、Q、H),从左到右依次升高
        """
        qr = qrcode.QRCode(
            version=version,
            error_correction=qrcode.constants.ERROR_CORRECT_L,
            box_size=box_size,
            border=border,
        )
        try:
            words = "https://www.12dms.com" if words is None else words
            save_name = "../static/img/" + "qrcode_" + str(time.ctime()) + ".png" if save_name is None else save_name
            print(">>二维码图片名称:{}".format(save_name))  # save_name:二维码保存路径 + 图片名称

            qr.add_data(words)
            qr.make()
            img = qr.make_image()
            img.save(save_name)
        except Exception as e:
            raise ManagerParamsError("103")

    @staticmethod
    async def wxpay(total_fee, order_id):
        """
        发起微信支付请求
        :param total_fee: 支付总金额
        :param order_id:  自定义订单ID
        :return:  微信支付请求响应 字典格式数据
        """
        nonce_str = WxPayManager.random_str()  # 拼接出随机的字符串即可,我这里是用  时间+随机数字+5个随机字母

        # TODO: 测试数据,待删除
        total_fee = total_fee
        total_fee = 1  # 付款金额,单位是分,必须是整数


        params = {
            'appid': WX_APP_ID,  # APPID
            'mch_id': WX_MCH_ID,  # 商户号
            'nonce_str': nonce_str,  # 随机字符串
            'out_trade_no': order_id,  # 订单编号,可自定义
            'total_fee': total_fee,  # 订单总金额
            'spbill_create_ip': WX_CREATE_IP,  # 自己服务器的IP地址
            'notify_url': WX_NOTIFY_URL,  # 回调地址,微信支付成功后会回调这个url,告知商户支付结果
            'body': '十二维度科技有限公司',  # 商品描述
            'detail': '商品--支付测试',  # 商品详情
            'trade_type': 'NATIVE',  # 扫码支付类型
        }

        sign = WxPayManager.get_sign(params, WX_API_KEY)  # 获取签名
        params['sign'] = sign  # 添加签名到参数字典
        print(">>获取签名后的微信支付请求参数:{}".format(params))
        xml = WxPayManager.trans_dict_to_xml(params)  # 转换字典为XML
        # TODO: 方法转换
        try:
            client = tornado.httpclient.AsyncHTTPClient()
            response = await client.fetch(WX_UFDODER_URL, method='POST', body=xml)  # 以POST方式向微信公众平台服务器发起请求
            resp = response.body.decode()
            print(">>发起微信支付请求 响应结果:{}".format(resp))

            data_dict = WxPayManager.trans_xml_to_dict(response.body)  # 将请求返回的数据转为字典
            return data_dict
        except Exception as e:
            print("发起微信支付错误:{}".format(e))

3.资料-qrcode-具体案例(简单生成, 自定义图标,更改颜色)

Python学习笔记8-利用qrcode模块生成普通二维码和带图标的二维码: https://blog.csdn.net/weixin_42703239/article/details/104349417
 类似资料: