最近接到产品的需求,要求给公司的小程序生成二维码。
由于中间遇到一些坑,希望写篇博客帮助大家避开这些坑,同时也是自己做个记录。
一、参看微信小程序二维码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_token | string | 是 | 接口调用凭证 | |
scene | string | 是 | 最大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_type | string | 是 | 填写 client_credential | |
appid | string | 是 | 小程序唯一凭证,即 AppID,可在「微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态) | |
secret | string | 是 | 小程序唯一凭证密钥,即 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语言进行处理后可以存储为图片,具体方法请参考上面的代码(各个语言具体的方法可能不太一样,这个坑网上资料还很少,,,可能是我经验太少)
有任何疑问,请留言,看到就会回答~