针对微信小程序码获取接口B的scene参数对输入参数做压缩处理放入scene参数中
针对微信获取小程序码scene参数的数据压缩算法
一、前言
微信小程序现在有四个获取小程序码的接口,分别是:
生成小程序码,可接受 path 参数较长,生成个数受限,请谨慎使用。
生成小程序码,可接受页面参数较短,生成个数不受限。
生成二维码,可接受 path 参数较长,生成个数受限。
微信一物一码 支持生成小程序码。微信通过“一物一码”接口发放的二维码相比较普通链接二维码更安全、支持更小的印刷面积,支持跳转到指定小程序页面,且无数量限制
二、问题
需要生成的小程序码数量要求很大,接口D的场景不一致,不考虑,接口A和接口C的生成数量加起来不超过十万,剩下的选择只有接口B,但是接口B的要求scene参数为(最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&’()+,/:;=?@-._~,其它字符请自行编码为合法字符)
算起来的话数字10个,大小写英文有262=52个,加上特殊字符共有82个字符,业务要求将两个信息放入32个字符内,不考虑别的手段,两个信息一个信息的数量小,但是另一个信息为数字和英文组成的36进制编码。
经过计算后可以发现将特殊字符中的一个作为分隔符,将32位信息36进制压缩进81进制中可以缩短到27位,一个做分隔,还有4位保存另一个信息!可以做!
三、接口B文档
1 | POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN |
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
access_token | string | 是 | 接口调用凭证 | |
scene | string | 是 | 最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&’()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式) | |
page | string | 主页 | 否 | 必须是已经发布的小程序存在的页面(否则报错),例如 pages/index/index, 根路径前不要填加 /,不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面 |
width | number | 430 | 否 | 二维码的宽度,单位 px,最小 280px,最大 1280px |
auto_color | boolean | false | 否 | 自动配置线条颜色,如果颜色依然是黑色,则说明不建议配置主色调,默认 false |
line_color | Object | {“r”:0,”g”:0,”b”:0} | 否 | auto_color 为 false 时生效,使用 rgb 设置颜色 例如 {“r”:”xxx”,”g”:”xxx”,”b”:”xxx”} 十进制表示 |
is_hyaline | boolean | false | 否 | 是否需要透明底色,为 true 时,生成透明底色的小程序 |
返回值为图片的Buffer
四、操作
将82个字符中的“-”拿出来做分隔符,剩下81个字符做为81进制,将36进制转为10进制,再将10进制转为81进制。
五、工具类
我写好了工具类,直接拿来用就可以
1 | import org.apache.commons.lang.StringUtils; |
六、调用方式
1 | System.out.println(MiniCodeUtil.decode(MiniCodeUtil.encode("995587e102064d47b670f5b81253dd58"))); |
七、Javascript函数(未做大数处理)
写了个javascript的解密函数,但是javascript对大于9007199254740992的数处理出现错误,所以该函数只能对位数比较短的数做处理,例如处理32位数会出现问题
1 | var Stack = (function(){ |
此为博主副博客,留言请去主博客,转载请注明出处:https://www.baby7blog.com/myBlog/67.html