1. 什么是APP_ID

开放平台使用APP_ID, 来区分openapi的调用者, 相当于用户的一个身份证

用过开放平台的开发者 懂得都懂,不懂的说了也不懂,你也别问,利益牵扯太大,说了对你们没好处,我只能说水很深,网上的资料都删了,所以我只能说懂得都懂,不懂也没办法

2. 各家的APP_ID长什么样

  • 微信的APP_ID

统一wx开头, “wx”+16位的 16进制数字
image.png

  • 支付宝的APP_ID

16位的纯数字, 可以看出开头的4位是年份, 其他数字生成规则不明
image.png

  • 融云

13位数字和字母组成的字符串, 生成规则不明
image.png

  • 我的设计

11位英文字母的组合
image.png

3. APP_ID需要满足什么需求

  1. APP_ID会频繁在开放平台的接口调用中被使用, 所以不能太长, 浪费带宽
  2. APP_ID可能被别人获取, 所以不能包含太多私有信息, 所以要有一定的随机性
  3. APP_ID很多情况下要方便客户以及开放平台的人员进行调试, 所以可以包含一定公开的信息; 什么样的信息是允许公开的需要开放平台的设计者斟酌, 如将集群信息暴露在APP_ID上,方便快速缩小检查范围
  4. APP_ID的长度要稳定, 不能一会儿长一会短

4. 我的设计

作为一个小厂的开发, 没有那么多需求, 只要生成的APP_ID有随机性,长度稳定, 长度不太长 就行了

下面说一下我的app_id生成步骤

  1. 生成一个4位的十进制数字(1000~9999)
  2. 获取当前时间的时间戳, 13位十进制数字
  3. 组合成为一个 17 (4+13) 位的十进制数字
  4. 将这个17位的十进制数字转化为 36 进制数字(0~9,a~z; 一共36位)
    1. /**
    2. * 先构造一个十进制的数字,
    3. * 前四位: 为随机值(1000,9999),
    4. * 后13位: 为时间戳 (类似于这种形式1631238326627)
    5. * 然后将该数字转换为字符串
    6. * 再用36进制重新解析([0-9]|[a-z]), 数字和小写字母
    7. * 得到的字符串长度为11个字节
    8. *
    9. * @return 生成的字符串用作app_id, 是个11个字节的字符串
    10. */
    11. public static String generateAppId() {
    12. final String s = RandomUtil.randomInt(1000, 9999) + String.valueOf(System.currentTimeMillis());
    13. BigInteger n = new BigInteger(s, 10);
    14. return n.toString(36);//转换成36进制, 得到的字符串长度11个字节
    15. //10000000000000000 转化之后是: 2qgpckvng1s ; 也是11个字节
    16. //99999999999999999 转化之后是: rcn1hssighr ; 也是11个字节
    17. }

根据这个算法

  • 得到的字符串稳定11个字节, (utf8的数字和字母,一个字符是一个字节)
  • 生成的字符串比较随机
  • 不包含任何私有信息