小程序完整生成小程序码
开发前准备
本文首先假定开发者已经粗略阅读过微信小程序的开发文档,所以注册小程序的流程就不介绍了。这里我们先看下生成小程序码的官方文档
1.首先我们确定开发者在app.json中已经注册了相应的页面,当然你的pages目录下也有相应的页面,且必须是已经上线的小程序,否则生成码后会提示找不到相应页面,这里我们就使用[pages/index/index]为例。
image.png2.然后我们需要拿到Access_token。关于获取Access_token官方文档里也有介绍,进入小程序后台,点击左侧「设置」,找到「开发设置」,我们就能找到AppSecret一项。点击「获取」或「重置」,扫码之后,网页就会显示新的AppSecret。
需要注意的是,如果你之前生成过新的AppSecret,那么旧的AppSecret会随这个操作而失效。然后在官方测试网站获取到Access_token,走到这里我们就完成基础的一步了
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模拟请求的方式,让大家了解这个接口的使用方法和原理。
从结果中(emmmm我就没去拿真实的AppId和Appsecret了)我们可以得知:执行这个操作后,微信会给你返回一个JSON数据包。解析这个数据包,我们就可以获得AccessToken。
假如我们需要生成的码扫码后打开具体页面:入参path:pages/index/index
接口A:https://api.weixin.qq.com/wxa/getwxacode?access_token=ACCESS_TOKEN
image.png接口C:https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=ACCESS_TOKEN
至于接口B:https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN
这个接口就是重中之重了。基本上所有的小程序码都是通过这个接口获取到的(因为不限制数量啊)
跟其他两个接口不一样的地方在于:
a)入参从path变为page了,不可携带参数(path可以携带)
b)需要的参数需要单独通过scene字段上传,然后需要在你生成小程序码的页面里拿到scene字段解析后做页面逻辑处理。
需要注意的是:
因为前端获取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 = {}
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'] || : '',
shareUserId: getQueryString['sid'] || ''
})
}
}
image.png
最后:生成码后如何调试???
因为生成的码扫码打开后是生产环境的小程序,所以生成的码的页面必须是线上已有的小程序页面。
调试使用开发者工具的通过二维码编译即可。只要配置好参数,在开发者工具页面内接收解析参数就可以了,测试后如果没问题上线后也是没问题的。
生成小程序码常见的Q&A
1.前端生成的码是乱码的?
image.png
前面已经说过了,前端生成的码 就是一个二进制的流文件,所以转换交给后端即可。再贴一下后端转换二进制流为图片的地址
2.生成的小程序码偶现是空白的。
确定路径是线上的路径,偶现生成码是这样的
这个问题是你的access_token过期了。因为如果你在本地测试小程序码,本地拿到access_token,线上的access_token可能就失效了,看你的access_token的缓存机制了,线上线下是否共用的同一个access_token。
image.png
还有其他细节问题的可以联系邮箱minchangyong@qtshe.com或者QQ8662054.