今天实现小程序码获取和返回的一些功能遇到了一些问题,记录一下。
一、二维码的获取
二维码的获取调用微信提供的wxacode.getUnlimited
接口即可,这里注意微信的返回值有两种。如果获取成功则返回图片的二进制数据流,如果获取失败会返回json
格式的错误代码。
另外注意请求参数需要使用json.dumps()
封装为json
格式,另外请求头要添加Application/json
,并且附带的参数名称全为小写,否则的话会返回invalid format
错误。
二、二维码处理并返回
因为微信接口返回的为Buffer
所以这里有两种思路:
1、将文件流base64编码返回给小程序,小程序直接解吗显示,代码如下
1 2 3 4 5 6
| onLoad: function(){ var that = this; this.setData({ src: 'data:image/png;base64,' + DATA_FROM_BACKEND }) }
|
1
| <image src='{{src}}' class='image'></image>
|
1 2 3 4 5 6 7 8 9
| import base64 import requests
def getQR(request): url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+str(access_token) headers = {'Content-Type': 'application/json'} data = {'scene':'team_id='+str(team_id), 'is_hyaline': True} r = requests.post(url, data=json.dumps(data), headers=headers) return HttpResponse(base64.b64encode(r.content))
|
2、将二进制存储为图片并返回url,代码如下:
1 2 3 4 5 6
| onLoad: function (options) { var that = this that.setData({ "src": app.globalData.server_url+res.data.src }) }
|
1
| <image src='{{src}}' class='image'></image>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| def getQR(request): url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+str(access_token) headers = {'Content-Type': 'application/json'}
data = {'scene':'team_id='+str(team_id), 'is_hyaline': True} r = requests.post(url, data=json.dumps(data), headers=headers) i = BytesIO(r.content) roiImg = Image.open(i) print(type(roiImg)) savepath = os.path.join(os.getcwd() ,'media/') name = str(int(time.time())) + r'.png' roiImg.save(str(savepath)+name, format='PNG') return JsonResponse({'code': '0', 'src': '/media/%s'%(name)})
|
之后设置一下nginx就ok
参考资料:
1 https://www.jianshu.com/p/28e6e090966a
2 https://blog.csdn.net/uikoo9/article/details/86088028
3 https://blog.csdn.net/qq_32446743/article/details/87780821
4 https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.getUnlimited.html