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

一、二维码的获取

二维码的获取调用微信提供的wxacode.getUnlimited接口即可,这里注意微信的返回值有两种。如果获取成功则返回图片的二进制数据流,如果获取失败会返回json格式的错误代码。

另外注意请求参数需要使用json.dumps()封装为json格式,另外请求头要添加Application/json,并且附带的参数名称全为小写,否则的话会返回invalid format错误。

二、二维码处理并返回

因为微信接口返回的为Buffer所以这里有两种思路:

1、将文件流base64编码返回给小程序,小程序直接解吗显示,代码如下

onLoad: function(){
  var that = this;
  this.setData({
    src: 'data:image/png;base64,' + DATA_FROM_BACKEND
  })
}
<image src='{{src}}' class='image'></image>
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,代码如下:

onLoad: function (options) {
    var that = this
    that.setData({
      "src": app.globalData.server_url+res.data.src
    })
}
<image src='{{src}}' class='image'></image>
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


本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

Django动态表单 上一篇
ctf-web&misc学习小结 下一篇