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