微信小程序--使用getWXACodeUnlimit生成海报时包含的二维码的生成笔记

说明

关于微信小程序二维码的生成,官方文档有记载,这里仅作为个人笔记。纯属虾扯蛋一下!
image.png

官网访问地址:
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/qr-code.html

小程序二维码生成步骤:

依据实际情况,后续生成的海报数量是无法预估的,所以我们使用的方案是:


image.png

生成步骤:

第一步:获取access_token

官网文档地址:
https://developers.weixin.qq.com/miniprogram/dev/api/open-api/access-token/getAccessToken.html

测试获取access_token 地址:
https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index&type=%E5%9F%BA%E7%A1%80%E6%94%AF%E6%8C%81&form=%E8%8E%B7%E5%8F%96access_token%E6%8E%A5%E5%8F%A3%20/token&token=&lang=zh_CN

image.png
第二步:提交access_token到获取二维码接口

官网文档地址:
https://developers.weixin.qq.com/miniprogram/dev/api/open-api/qr-code/getWXACodeUnlimit.html

image.png
第三步:保存二维码到自己的服务器上面,返回二维码地址
第四步:canvas合成海报二维码地址

代码示例:

#!/usr/bin/evn python
# coding=utf-8
# + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +
#        ┏┓   ┏┓+ +
#    ┏┛┻━━━┛┻┓ + +
#    ┃       ┃  
#    ┃   ━   ┃ ++ + + +
#    ████━████ ┃+
#    ┃       ┃ +
#    ┃   ┻   ┃
#    ┃       ┃ + +
#    ┗━┓   ┏━┛
#      ┃   ┃           
#      ┃   ┃ + + + +
#      ┃   ┃    Codes are far away from bugs with the animal protecting   
#      ┃   ┃ +     神兽保佑,代码无bug  
#      ┃   ┃
#      ┃   ┃  +         
#      ┃    ┗━━━┓ + +
#      ┃        ┣┓
#      ┃        ┏┛
#      ┗┓┓┏━┳┓┏┛ + + + +
#       ┃┫┫ ┃┫┫
#       ┗┻┛ ┗┻┛+ + + +
# + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +"""
"""
Author = zyx
@Create_Time: 2018/11/16 16:30
@version: v1.0.0
@Contact: 308711822@qq.com
@File: get_ compose_acode.py
@文件功能描述:合并获取小程序二维码
"""
from business.logic.api_third_inter import _request
from basic.cache import redis_cache_helper
import json
import requests
from PIL import Image
from io import BytesIO
from basic.utils import file_helper


def get_wx_accesstoken(appid='', secret=''):
    """
      获取小程序授权码
    """
    # 缓存key
    cache_key = 'wx_access_token:' + str(appid)
    # 获取缓存值
    result = redis_cache_helper.get(cache_key)
    # 判断是否有值
    if result:
        return result

    # 设置参数
    params = {
        'appid': appid,
        'secret': secret,
        'grant_type': 'client_credential'
    }
    # 直接访问接口
    url = 'https://api.weixin.qq.com/cgi-bin/token'
    # 提交微信服务器
    _result = _request.get_direct(url, params)

    # 处理结果
    if not _result:
        return ''

    if _result.get('access_token'):
        expires_in = _result.get('expires_in')
        access_token = _result.get('access_token')
        # 设置缓存过期的时间
        redis_cache_helper.set(cache_key, access_token, timeout=int(expires_in) - 100)
        return access_token
    else:
        return ''


def action(host_name='', cp_appid='', openid='', appid='', secret='', scene='', page='', width=280, is_hyaline=True, auto_color=True, line_color=''):
    '''
    二维码生成的参数信息
    :param cp_appid: 分配合作的放的APID.用于组合生成的图片明名称
     :param openid: 永固的openID.用于组合生成的图片明名称
    :param appid: 小程序唯一凭证,即 AppID,可在「微信公众平台 - 设置 - 开发设置」页中获得
    :param secret: 小程序唯一凭证密钥,即 AppSecret,获取方式同 appid
    :param scene: 最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符
    :param page:已经发布的小程序存在的页面(否则报错),例如 pages/index/index, 根路径前不要填加 /,不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面
    :param width: 二维码的宽度,默认为 430px,最小 280px,最大 1280px
    :param is_hyaline: 是否需要透明底色,为 true 时,生成透明底色的小程序码,默认 false
    :param auto_color: 自动配置线条颜色,如果颜色依然是黑色,则说明不建议配置主色调,默认 false
    :param line_color: auto_color 为 false 时生效,使用 rgb 设置颜色 例如 {"r":"xxx","g":"xxx","b":"xxx"} 十进制表示,默认全 0
    :return:
    '''

    # 文件的名称
    file_name = str(cp_appid) + str(openid)
    # 保存的文件的路径
    file_path = "static/tmpfiles/wxcode_%s.jpg" % file_name

    # 先判断本地文件是否已经存在
    if file_helper.exists(file_path):
        # 直接的返回图片的地址
        return str(host_name) + str(file_path)

    # 需要添加到二维码的地址后面的授权码
    access_token = get_wx_accesstoken(appid=appid, secret=secret)

    if not access_token:
        # 抛出异常
        raise Exception("access_token is None")

    # 需要提交的参数
    params = {'access_token': access_token}

    # json数据值
    json_data = {"scene": scene,
                 "page": page,
                 "width": width,
                 "auto_color": auto_color,
                 "is_hyaline": is_hyaline}
    # 转化
    json_data = json.dumps(json_data).encode(encoding='utf-8')
    # 生成二维码地址
    url = 'https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode'
    # 提交到微信地址
    _result = requests.post(url, params=params, json=json_data, timeout=3, verify=False)

    if _result.status_code == 502 or _result.status_code == 500:
        # return return_msg(r.status_code, '服务器内部错误', result)
        return False

    if _result.status_code >= 400 and _result.status_code <= 499:
        # return return_msg(r.status_code, '语法格式有误,服务器无法理解此请求', result)
        return False

    # 判断返回的内容类型 如果是返回的 JSON 数据包
    if 'json' in _result.headers.get('content-type'):
        # 返回微信的错误描述信息
        return _result.json().get('errmsg')

    # 否则说明 请成功 以请求返回的二进制数据创建一张图片
    img = Image.open(BytesIO(_result.content))

    # 保存文件
    img.save(file_path, "jpg")  # 保存图像为gif格式

    return str(host_name) + str(file_path)

小程序的获取:


image.png

实际获取的方式可能和官方的文档是是有些出路的。

官网的文档是:

 onLoad (query) {
    // scene 需要使用 decodeURIComponent 才能获取到生成二维码时传入的 scene
    const scene = decodeURIComponent(query.scene)
  }

正确的方式应该是:

  onLaunch: function (options) {
    console.log("options", options)

    this.wxshare.getShareTicketDecryptData(options)
    // 从ops提取相关参数信息
    // 用户场景来源
    // let where_from_scene_id = options.scene
    // 场景值
    var where_from_scene_id = decodeURIComponent(options.query.scene)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • 每天的学习记录,可能有的地方写的不对,因为刚学,以后发现错的话会回来改掉整体流程 https://develope...
    有点健忘阅读 4,666评论 0 7
  • 应用场景:公众号推广时,用户通过扫码关注公众号,需要统计用户是通过谁的二维码进行关注。 思路:在用户扫码关注公众号...
    羊俊宇阅读 24,921评论 0 4
  • 1。 我也什么要写作? 我思索了很久,这是一个好问题,每一个作者都必须经历的过程。 2. 自初一开始写日记,整理房...
    龙十五_阅读 527评论 6 6
  • 雷雁雄4月14日总结:今天休息,啥也没干,无聊的一天。
    雷雁雄阅读 86评论 0 0
  • 台风安比据说今天在崇明登陆,但没太大感觉,只是风大,时不时有雨。今天约了在宾州读大学的Andrew下午1点来家...
    Lucy艳萍_静待花开阅读 370评论 0 4