手记

小程序完整生成小程序码

开发前准备

本文首先假定开发者已经粗略阅读过微信小程序的开发文档,所以注册小程序的流程就不介绍了。这里我们先看下生成小程序码的官方文档

1.首先我们确定开发者在app.json中已经注册了相应的页面,当然你的pages目录下也有相应的页面,且必须是已经上线的小程序,否则生成码后会提示找不到相应页面,这里我们就使用[pages/index/index]为例。

image.png

2.然后我们需要拿到Access_token。关于获取Access_token官方文档里也有介绍,进入小程序后台,点击左侧「设置」,找到「开发设置」,我们就能找到AppSecret一项。点击「获取」或「重置」,扫码之后,网页就会显示新的AppSecret。

需要注意的是,如果你之前生成过新的AppSecret,那么旧的AppSecret会随这个操作而失效。然后在官方测试网站获取到Access_token,走到这里我们就完成基础的一步了

image.png


3.接着我们继续看文档,官方提供了3个获取小程序码的接口:

接口A:适用于需要的码数量较少的业务场景(生成小程序码,可接受path参数较长,生成个数受限)
接口B:适用于需要的码数量极多的业务场景(生成小程序码,可接受页面参数较短,生成个数不受限)
接口C:适用于需要的码数量较少的业务场景(生成二维码,可接受path参数较长,生成个数受限)


image.png

我们要利用AppId和AppSecret,获取AccessToken
这一步,我们请求的地址是:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appId=(小程序Id)&secret=(小程序后台的AppSecret),我们需要使用GET方法,传递你的AppID和AppSecret。
grant_type 获取access_token填写client_credential
appid 第三方用户唯一凭证
secret第三方用户唯一凭证密钥,即Appsecret
在本例,我们使用postman模拟请求的方式,让大家了解这个接口的使用方法和原理。

image.png


从结果中(emmmm我就没去拿真实的AppId和Appsecret了)我们可以得知:执行这个操作后,微信会给你返回一个JSON数据包。解析这个数据包,我们就可以获得AccessToken。


假如我们需要生成的码扫码后打开具体页面:入参path:pages/index/index

接口A:https://api.weixin.qq.com/wxa/getwxacode?access_token=ACCESS_TOKEN



至于接口B:https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN
这个接口就是重中之重了。基本上所有的小程序码都是通过这个接口获取到的(因为不限制数量啊)
跟其他两个接口不一样的地方在于:
a)入参从path变为page了,不可携带参数(path可以携带)
b)需要的参数需要单独通过scene字段上传,然后需要在你生成小程序码的页面里拿到scene字段解析后做页面逻辑处理。

image.png

需要注意的是:
因为前端获取Access_token不安全,且前端请求接口后拿到的是一个二进制图片流文件,需要后端进行转换,所以建议生成小程序码这一块让后端来操作。我们只需要传入要生成的路径以及参数即可
let postData = {    scene: `pid=${this.data.partJobId}&sid=${this.data.shareUserId}`,    page: 'pages/partJob/partJob'}//这里的调用请求方法是封装过的,只做示例。this.postAjax(url, postData).then((res)) {  if (res.success) {   //后端返回的图片url地址
  } else {
    toast(res.errMsg)  
  }
}

附上后端解析二进制流生成图片的地址

页面内进行解析:

这是部分业务代码,因为scene最大32个可见字符,只支持数字,大小写英文以及部分特殊字符,所以我们的业务Id就已经是超出这个长度了。所以我们需要与后端进行约定sid为shareUserId,pid为partJobId,最后跟获取到的Id进行映射即可做后续操作.

//页面初始化加载
  onLoad(options) {    if (!options.scene) {      this.setData({        partJobId: options.partJobId,        shareUserId: options.shareUserId || '',        authorizedKey: options.authorizedKey || ''
      })
    } else {      var getQueryString = new Object()      var strs = decodeURIComponent(options.scene).split('&') //以&分割
      //取得全部并赋值
      for (var i = 0; i < strs.length; i++) {
        getQueryString[strs[i].split('=')[0]] = unescape(strs[i].split('=')[1])
      }      this.setData({        partJobId: getQueryString['pid'] ? getQueryString['pid'] : '',        shareUserId: getQueryString['sid'] ? getQueryString['sid'] : ''
      })
    }
  }

image.png

最后:生成码后如何调试???

因为生成的码扫码打开后是生产环境的小程序,所以生成的码的页面必须是线上已有的小程序页面。
调试使用开发者工具的编译模式即可。只要配置好参数,测试后如果没问题上线后也是没问题的。

image.png

生成小程序码常见的Q&A

1.前端生成的码是乱码的?


image.png

前面已经说过了,前端生成的码 就是一个二进制的流文件,所以转换交给后端即可。再贴一下后端转换二进制流为图片的地址
2.生成的小程序码偶现是空白的。
确定路径是线上的路径,偶现生成码是这样的

image


这个问题是你的Access_token过期了。因为如果你在本地测试小程序码,本地拿到Access_token,线上的Access_token可能就失效了,然后就会跪咯,就看你的Access_token的缓存机制了。





作者:一个被床封印的程序猿
链接:https://www.jianshu.com/p/1713f23360de


0人推荐
随时随地看视频
慕课网APP