Django获取小程序码并返回

今天实现小程序码获取和返回的一些功能遇到了一些问题,记录一下。

一、二维码的获取

二维码的获取调用微信提供的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


Django获取小程序码并返回
https://blog.yrpang.com/posts/58401/
作者
yrPang
发布于
2019年7月6日
许可协议