社区/学习指南/小程序·云开发高级教程

小程序码

通过服务端云函数可以获取一个小程序任意页面的小程序码,扫描该小程序码就可以直接进入小程序对应的页面,所有生成的小程序码永久有效,可长期使用。小程序码具有更好的辨识度,且拥有展示“公众号关注组件”等高级能力。当用户扫小程序码打开小程序时,开发者可在小程序内配置公众号关注组件official-account,用户可以快捷关注公众号。

13.2.1 获取小程序码

1、小程序码的接口说明

  • wxacode.get,适用于需要的码数量较少的业务场景,可接受 path 参数较长,页面路径最大长度 128 字节;生成的小程序码永久有效,个数有限。

  • wxacode.getUnlimited,获取小程序码,适用于需要的码数量极多的业务场景。生成的小程序码,永久有效,数量暂无限制,但是此方法只支持 32 个字符。

  • wxacode.createQRCode(不推荐使用),和 wxacode.get 类似,只是生成的不是小程序码,而是小程序的二维码

wxacode.get 和 wxacode.createQRCode 总共生成的码数量限制为 10 万个,也就是究极你的小程序的一生,只能通过这两种方式生成 10 万个小程序码和小程序二维码,不过如果参数相同,是不算次数的,所以 10 万个还是挺多的。

wxacode.get 和 wxacode.getUnlimited 的区别

如果你的小程序页面参数是动态更新的,建议使用 wxacode.getUnlimited,如果你的小程序页面包含了非常多的运营类的参数,32 个字符不够用,或者动态页面较少,那可以使用 wxacode.get,通常用 wxacode.getUnlimited 比较稳妥。

wxacode.getUnlimited 可能 32 个字符不够用,比如想追踪分享小程序码的用户的 openid,比如希望记录更多运营数据,不过即使不够用,也是有替代方法的,就是在数据库里添加一个字段 ID,将你要记录的这些参数与这个简短而独一无二的 ID 对应,这个会浪费一点数据库的性能,不过也在可以接受范围之类。

除此之外,在云调用时传递的参数上,wxacode.get 是必须填写 path 的(path 为小程序的页面路径,即包含 page 和 scene),而 wxacode.getUnlimited 的 page 和 scene 是分开的,可以只填 scene,不必填写 page。

2、新建云函数并添加权限

首先我们使用开发者工具,新建一个云函数比如 wxacode,然后在 config.json 里添加如下权限配置(前面已经反复强调权限配置文件 json 的格式),也就是我们在处理云调用时,一定要先添加权限,而且权限文件的格式不能出错。


{

  "permissions": {

    "openapi": [

      "wxacode.get",

      "wxacode.getUnlimited"

    ]

  }

}

然后在 index.js 里添加如下代码,我们先以 wxacode.getUnlimited 这个接口为例获取小程序码,然后再把小程序码上传到云存储里,

const cloud = require("wx-server-sdk");

cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV,
});

exports.main = async (event, context) => {
  const wxacodeResult = await cloud.openapi.wxacode.getUnlimited({
    scene: "uid=1jigsdff", //只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,不能有空格之类的其他字符

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

  const uploadResult = await cloud.uploadFile({
    cloudPath: `wxacode.jpg`,

    fileContent: wxacodeResult.buffer,
  });

  return uploadResult.fileID;
};

而如果是使用 wxacode.get 这个接口,它传递的参数会有所不同,

const result = await cloud.openapi.wxacode.get({
  path: "page/index/index?uid=1jigsdff",
});

调用这个云函数,就能在云存储里看到生成的 wxacode.jpg 小程序码了。我们可以把集合的某个字段的 id,或者页面 id 等参数写进小程序码里。

13.2.2 通过小程序码进入小程序

通过追踪带有参数的小程序码,我们就能知道用户到底是通过我们生成的哪个小程序码进入到小程序的,这个功能应用的场景有很多,尤其是运营上特别有用,比如追踪用户的分享来增加积分或返利,追踪各个渠道的运营效果等等,要完成这样的步骤,除了生成带参数的小程序外,还需小程序能识别该小程序码。

1、小程序码与场景值

场景值用来描述用户进入小程序的路径,比如公众号文章的自定义菜单、模板消息、文章等,二维码的扫描、长按、通过识别手机相册的二维码等,微信群聊或单聊等,微信首页顶部搜索框等,也就是用户到底是通过什么方式进入到我们的小程序的,会有一个对应的场景值,扫描小程序码的是 1047,长按图片识别小程序码为 1048,扫描手机相册中选取的小程序码为 1049。

我们可以在 App 生命周期的 onLaunch 和 onShow,或wx.getLaunchOptionsSync(注意,这个接口是一个对象,不是一个函数) 中获取上述场景值,在下面的 options 对象里就会包含 scene


  onLaunch (options) {

    console.log('onLaunch方法',options)

  },

  onShow (options) {

    console.log('onShow方法',options)

  },

在 options 对象里就包含着 scene 这个属性,属性的值即为场景值:


path: "" //页面路径

query: {} //页面的参数

referrerInfo: {} //来源小程序、公众号或 App 的 appId

scene: 1047 //场景值

shareTicket: //带 shareTicket 的转发可以获取到更多的转发信息,例如群聊的名称以及群的标识 openGId

2、获取小程序码里的参数

值得注意的是,使用 cloud.openapi.wxacode.get 和 cloud.openapi.wxacode.getUnlimited 生成的小程序码所带的参数在调试时需要使用开发工具的条件编译自定义参数 scene=xxxx 进行模拟,开发工具模拟时的 scene 的参数值需要进行 encodeURIComponent。

首先我们需要 encodeURIComponent()方法将我们要传递的参数进行编码,比如我们要传递“a=3&b=4&c=5”这样的参数,我们可以直接在控制台里进行编码:

encodeURIComponent("a=3&b=4&c=5");

编码之后的结果为"a%3D3%26b%3D4%26c%3D5",调试时可以添加编译模式,在启动参数里填入


scene=a%3D3%26b%3D4%26c%3D5

小程序码不只是一个技术问题,更多的是涉及到运营,让运营的效果可以量化追踪,是增长黑客、数据运营的关键,场景值可以让我们了解小程序的增长来源;而将一些参数写进小程序码,可以让我们根据参数的不同来采取不同的运营策略,比如广告点击、返利、分销、拼团、分享追踪等等。作为开发人员,可以多和运营交流,让小程序的增长更有效果。

本文出自 李东bbsky