生成微信小程序二维码

 

最近接到产品的需求,要求给公司的小程序生成二维码。

由于中间遇到一些坑,希望写篇博客帮助大家避开这些坑,同时也是自己做个记录。

一、参看微信小程序二维码api文档:

地址:https://developers.weixin.qq.com/miniprogram/dev/api/getWXACodeUnlimit.html

内容大致如下: 

getWXACodeUnlimit

本接口应在后端服务器调用,详细说明参见后端API

获取小程序码,适用于需要的码数量极多的业务场景。通过该接口生成的小程序码,永久有效,数量暂无限制。 更多用法详见 获取二维码

请求地址

POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN

请求参数

属性类型默认值必填说明
access_tokenstring 接口调用凭证
scenestring 最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)

 

可以看到,调用这个接口需要两个必填参数:access_token 和 scene

access_token的获取需要调另外的接口:https://developers.weixin.qq.com/miniprogram/dev/api/getAccessToken.html

api文档大致内容如下:

getAccessToken

本接口应在后端服务器调用,详细说明参见后端API

获取小程序全局唯一后台接口调用凭据(access_token)。调调用绝大多数后台接口时都需使用 access_token,开发者需要进行妥善保存。

请求地址

GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

请求参数

属性类型默认值必填说明
grant_typestring 填写 client_credential
appidstring 小程序唯一凭证,即 AppID,可在「微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态)
secretstring 小程序唯一凭证密钥,即 AppSecret,获取方式同 appid

 

ok,到这里基本清楚了,先调用getAccessToken这个接口拿到access_token,然后把这个参数传给getWxAcodeUnlimit

二、代码

不多说没用的,直接上代码

基本环境:python3

导入的模块大家自己看一下,缺失的话pip3 install

# -*- coding=utf-8
from pathlib import Path
import os
import sys
import threading
import base64
import io
import PIL
from PIL import Image
import requests
import json
class genQrcode():
    def __init__(self,appid,secret): #入参是小程序的appid 和secret,这个在微信平台获取
        self.appid = appid
        self.secret = secret

    def getaccesstoken(self):
        url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s'\
              %(self.appid,self.secret)
        #print(url)
        req1 = requests.get(url) #get方式发起请求
        dataText=req1.text #获取接口返回值的文本
        dataText = json.loads(dataText) #以json解析返回值
        print(dataText)
        accesstoken=dataText["access_token"] #获取返回值json中的access_token这个key对应的value
        print("当前获取到的accecc token为: " + accesstoken)
        return accesstoken #返回access_token给下面的函数使用

    def getqrcode(self):
        channelcode = os.environ["channel"]; #获取jenkins中的channel这个参数,当然不使用jenkins的话可以直接指定一个值
        workspace = os.environ["WORKSPACE"]; #获取jenkins的workspace参数
        accesstoken = self.getaccesstoken() #调用上面的方法,拿到access_token
        url = 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s'%(accesstoken) #注意这里请求的格式
        values = {
            'scene': channelcode #指定scene参数
        }
        jsonvalue = json.dumps(values) #以json方式发送请求参数
        print(jsonvalue)
        req1 = requests.post(url, data=jsonvalue) #以post方式发送请求
        dataText = req1.content #获取接口返回值
        print(dataText)
        #将返回值转化为图片
        datapic = io.BytesIO(dataText)
        im = Image.open(datapic)
        im.save("%s/QRcode%s.jpg"%(workspace,channelcode))
#调用方法,传入appid和密钥
test=genQrcode("wx**************","**********************")
test.getqrcode()

三、接入jenkins(不感兴趣的话可以忽略)

1.jenkins配置:

pipeline脚本:

pipeline {
    agent { label 'lajitong' }
    environment { 
        python = '/usr/local/bin/python3'
        script = '/Users/saic/Work/workspace/.shell'
    }
    stages {
        stage('clean'){
            steps{
                    sh "cd ${WORKSPACE} && rm -rf *"
            }
        }
        
        stage('generate'){
            steps{
                    sh "${python} ${script}/generateQRcode.py"
            }
        }
        stage('artifacts'){
            steps{
                    archiveArtifacts artifacts: '*.jpg'
            }

        }
        
    }      
}

 

2.接入jenkins之后的效果:

 

三、碰到的一些坑

1.我们拿到access_token 之后

POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN

access_token必须是包含在url里面,而不是放到请求的values里面,只有scene这个参数以及其他非必填参数才可以作为请求的values。否则会报错access_token missing,具体怎么写可以参考上面的代码。

2.调用getWXACodeUnlimit接口获取到的数据是一串二进制数据,需要自己在代码中进行处理将这些二进制数据保存为图片:

不加处理的情况:

 

或者:

 

使用python语言进行处理后可以存储为图片,具体方法请参考上面的代码(各个语言具体的方法可能不太一样,这个坑网上资料还很少,,,可能是我经验太少)

有任何疑问,请留言,看到就会回答~

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值