zoukankan      html  css  js  c++  java
  • python-qrcode-二维码

    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
  • 相关阅读:
    报错Required String parameter 'customerInfo' is not present的原因及处理办法
    Mybatis 中$与#的区别
    ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql
    Git使用
    前后端分离
    对excel文件的读取
    POI导入和导出Excel总结
    git权限
    @RequestParam与@PathVariable
    lombok学习
  • 原文地址:https://www.cnblogs.com/yblackd/p/14533389.html
Copyright © 2011-2022 走看看