用户
 找回密码
 立即注册

QQ登录

只需一步,快速开始

微客吧 首页 教程 微信小程序 实战教程 查看内容

关于小程序未上线二维码识别功能开发

纸飞机 2018-4-11 10:53

近期接触了小程序开发,发现我们可以使用微信小程序提供的接口来生成小程序二维码,具体如何操作可以参见这里:微信小程序获取二维码。我们使用的是接口B:https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_ ...

近期接触了

小程序

开发,发现我们可以使用微信小程序提供的接口来生成小程序二维码,具体如何操作可以参见这里:微信小程序获取二维码。

我们使用的是接口B:

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

发现有个坑:未上线的小程序生成二维码时如果传入的page未上线,那么会生成失败。但是我们线上肯定是需要跳转到指定页面的,所以测试起来就比较蛋疼。各方咨询,最终结果依然是未上线无法测试。。。

page要求:必须是已经发布的小程序存在的页面(否则报错),例如 "pages/index/index" ,根路径前不要填加'/',不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面

我们看一下微信官方提供的一些内容:

注意:通过该接口生成的小程序码,永久有效,数量暂无限制。用户扫描该码进入小程序后,开发者需在对应页面获取的码中 scene 字段的值,再做处理逻辑。 
使用如下代码可以获取到二维码中的 scene 字段的值。调试阶段可以使用开发工具的条件编译自定义参数 scene=xxxx 进行模拟,开发工具模拟时的 scene 的参数值需要进行 urlencode

  1. // 这是首页的 js
  2. Page({
  3. onLoad: function(options) {
  4. // options 中的 scene 需要使用 decodeURIComponent 才能获取到生成二维码时传入的 scene
  5. var scene = decodeURIComponent(options.scene)
  6. }
  7. })

也就是说我们可以在通过开发工具的条件编译自定义参数模拟。这个方法我这边没有尝试。

我们就按照最有可能正确的方式去做。对于后端是这样传值的:

  1. scene = "uid=" + uid + "&cid=" + cid;
  2. Map<String, Object> twoDimensionMap = this.getTwoDimensionForWX(accessToken, page, scene);

其中的getTwoDimensionForWX是我们自定义的方法,里面是调用微信的接口:

  1. public Map<String, Object> getTwoDimensionForWX (String accessToken, String page, String scene){
  2. Map<String, String> map = Maps.newHashMap();
  3. Map<String, Object> resultMap = Maps.newHashMap();
  4. map.put("page", page);
  5. map.put("scene", scene);
  6. Map<String, String> headers = Maps.newHashMap();
  7. String method = "POST";
  8. headers.put("Content-Type", "application/json; charset=UTF-8");
  9. Map<String, String> querys = Maps.newHashMap();
  10. String bodys = JSONObject.toJSONString(map);
  11.      String host = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken;
  12.      HttpResponse res =HttpUtils.doPost(host, "", method, headers, querys, bodys);
  13. //res就是我们拿到的二维码数据
  14. }

这样写就可以成功获取到二维码(发布线上之后), 因此后端发布时这样写就ok。(这里的方法只有一部分,并不完全,但完全可以表达出来意思)

接下来就是微信小程序端的处理:

  1. onLoad: function (options) {
  2. // 扫描二维码获取的数据
  3. if (options.scene) {
  4. var scene = decodeURIComponent(options.scene)
  5. // var scence = options.scene;
  6. var arrPara = scene.split("&");
  7. var arr = [];
  8. var testData = {};
  9. for (var i in arrPara) {
  10. arr = arrPara[i].split("=");
  11. if (i == 0) {
  12. testData.uid = arr[1];
  13. } else {
  14. testData.cid = arr[1]
  15. }
  16. }
  17. //这里的testData就包括了uid和cid
  18. }
  19. },

小程序端按照这种方式处理就可以了。

想想也是这个逻辑,微信那边只是把scene做了encode处理,里面的数据只是一个字符串,所以我们使用的时候后端传的内容是什么,我们小程序端取到的数据就是什么,所以如果按照我上面呢的那种方式传值,需要对字符串进行分割获取需要数据。

另外需要注意一点:那就是scene的字符限制:

最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)

以上便是对生成码和扫码的逻辑处理。

鲜花
鲜花
握手
握手
雷人
雷人
路过
路过
鸡蛋
鸡蛋
分享至 : QQ空间
收藏