小程序码通过微信私有编码协议生成,只能用微信客户端扫码解析。小程序通过调用 wx.scanCode 方法,可以获取到属主小程序生成小程序码携带的信息。而如果扫的是其他小程序的码,则会被屏蔽 result 字段,只有 rawData 字段经过 base64 解码后,携带有一些信息,这里记录下这部分信息的一些规律。
通过小程序 AppID查 的 “全能扫码” 功能,可以从小程序码图片中获取到解码后的 rawData 信息
以 l 开头的小程序码
是 unlimit 接口 生成的码,“l” 后紧跟的一位数字,表示最后有几位数字是 scene 的原始数据(未被加密)。
如:l8Kw0~HWs1c=sBGD78.8$y8L4,cp=0 ,是扫场所码得到的,该场所码的 scene 值 id=MD8G8L4,cp=0,后 8 位 8L4,cp=0 就是原始的值。
以 m 开头的小程序码
是赞赏码。如:m01YyY9!OagTRPt?KngpY&2
k 开头和其他
应该就是 limit 接口 生成的码
一些扫码数据
| 小程序 | rawData 解码 | scene |
|---|---|---|
| 赞赏码 | m01YyY9!OagTRPt?KngpY&2 | 未知 |
| 场所码 | l8Kw0~HWs1c=sBGD78.8$y8L4,cp=0 | id=MD8G8L4,cp=0 |
| 地铁 | kg1g5b_IXJ0E~1nUbVlf20S81IL&s@F#n; | id=6DRWFHU,cp=0 |
| 自成e家 | kheSsuGHDL7I~AIPgxvcbflU6T/dO&7Hm | 未知 |
| 美团 | kbCgFRJGUiVg~1qOa:+1ZTCly7Z5apCx#i | 未知 |
| 小商店 | klGvdEJA8c6c~8TNJ?df@X?(1WcRNE?3. | 未知 |
| 跨时空 | kk2MzNRhsd8g~?VByX4WijpMa7Dw-y:#& | 未知 |
| 跨时空2 | kntzcTxALmmM~&Dc?Nb7$b,,’(rC0u- | 未知 |
| 跨时空3 | kfRZvDYGxyeI~h6=gp/Bm2vxYDJd3M4ix | 未知 |
| 场所码 | l82bkmOs8?1bo47!Ya3xQN?EFU,cp=0 | YCN9EFU,cp=0 |
| 场所码 | l8zPkX=!o0-7!o1xeod9T/8L4,cp=0 | YC8G8L4,cp=0 |
| 场所码 | l82A@Tw(RK4lb7ci(fd9M&3EFU,cp=0 | 2ZN9EFU,cp=0 |
| 场所码 | l81aKD,wfz!M@e*HS7z=Zw-EFU,cp=0 | MCN9EFU,cp=0 |
小结
生成小程序码时,传入 scene 参数的限制是 “最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)” 。而 rawData 解码后的长度,有出现长度为 30 的,低于 32 ,理论上是承载不下完整的 scene,猜测是需要配合接口查询来完成数据还原,类似短网址还原。
如果希望生成的小程序码,在别的小程序也可以通过 scanCode 方法读取到信息,可以生成 scene 长度短于 8 位的码,然后截取后八位。如上表最后的四个场所码,如果去掉尾部的 ,cp=0 就可以通过任意小程序拿到场所码 ID 了。
当前微信还未开放第三方 App 扫小程序码的能力,这大概是目前 粤省事App 还不支持扫自家生成的场所码的原因吧 😂

即便后续在各方对推动下,微信开放该能力,估计对第三方 App 也会有诸多条件限制。