1. 什么是APP_ID
开放平台使用APP_ID, 来区分openapi的调用者, 相当于用户的一个身份证
用过开放平台的开发者 懂得都懂,不懂的说了也不懂,你也别问,利益牵扯太大,说了对你们没好处,我只能说水很深,网上的资料都删了,所以我只能说懂得都懂,不懂也没办法
2. 各家的APP_ID长什么样
- 微信的APP_ID
统一wx开头, “wx”+16位的 16进制数字
- 支付宝的APP_ID
16位的纯数字, 可以看出开头的4位是年份, 其他数字生成规则不明
- 融云
13位数字和字母组成的字符串, 生成规则不明
- 我的设计
3. APP_ID需要满足什么需求
- APP_ID会频繁在开放平台的接口调用中被使用, 所以不能太长, 浪费带宽
- APP_ID可能被别人获取, 所以不能包含太多私有信息, 所以要有一定的随机性
- APP_ID很多情况下要方便客户以及开放平台的人员进行调试, 所以可以包含一定公开的信息; 什么样的信息是允许公开的需要开放平台的设计者斟酌, 如将集群信息暴露在APP_ID上,方便快速缩小检查范围
- APP_ID的长度要稳定, 不能一会儿长一会短
4. 我的设计
作为一个小厂的开发, 没有那么多需求, 只要生成的APP_ID有随机性,长度稳定, 长度不太长 就行了
下面说一下我的app_id生成步骤
- 生成一个4位的十进制数字(1000~9999)
- 获取当前时间的时间戳, 13位十进制数字
- 组合成为一个 17 (4+13) 位的十进制数字
- 将这个17位的十进制数字转化为 36 进制数字(0~9,a~z; 一共36位)
/**
* 先构造一个十进制的数字,
* 前四位: 为随机值(1000,9999),
* 后13位: 为时间戳 (类似于这种形式1631238326627)
* 然后将该数字转换为字符串
* 再用36进制重新解析([0-9]|[a-z]), 数字和小写字母
* 得到的字符串长度为11个字节
*
* @return 生成的字符串用作app_id, 是个11个字节的字符串
*/
public static String generateAppId() {
final String s = RandomUtil.randomInt(1000, 9999) + String.valueOf(System.currentTimeMillis());
BigInteger n = new BigInteger(s, 10);
return n.toString(36);//转换成36进制, 得到的字符串长度11个字节
//10000000000000000 转化之后是: 2qgpckvng1s ; 也是11个字节
//99999999999999999 转化之后是: rcn1hssighr ; 也是11个字节
}
根据这个算法
- 得到的字符串稳定11个字节, (utf8的数字和字母,一个字符是一个字节)
- 生成的字符串比较随机
- 不包含任何私有信息