近期的项目里有一个类似微信付款码之类的功能

  • 每分钟需要进行刷新
  • 生成的二维码/code只能使用一次,即解密之后进行失效处理,重新生成的 code 需要覆盖之前的 code
  • 需要从生成的code中取到用户信息

刷新可以做到客户端,大概就是一个任务循环调用Code API,也可以是点击刷新

关于Code的生成

  • 需要从 code 中获取用户信息,那么原始值必然要带有用户标识,且加密可逆

首先对原始值进行加密处理,此时的加密串偏长且非纯数字,所以还需要对其进行 hash,此时的 hash 值为 code 的后缀

  • 重新生成 code 后,需要对该用户已生成未使用的 code 进行失效处理

这里我的做法是一定时间内,单个用户生成的 code 前缀一致,再通过该前缀对历史 code 进行失效处理,即 code 的组成为两组 hash 值

最终以 code 为 key,带有用户信息的加密串作为 value,保存至redis中,且过期时间设置为一分钟

每次进行解密操作时先验证 code 是否存在于redis中,再对其进行解密,解密后从redis中删除

another

不过微信支付的付款码支持离线支付,像QQ令牌,Steam令牌之类的,也都是离线的,而上文则是基于客户端有网络的情况下

离线令牌大概是这样的,首次绑定是会产生一个随机串(随机串也会被记录到服务器),再通过某种加密方式产生一个较短的Code(即令牌),加密的原始值需要带有时间戳

服务端则通过登陆时的用户名拿到当前用户所绑定的随机串,再以相同的加密方式对 随机串&时间戳 进行加密处理

最终判断结果是否一致

不过微信的貌似要更加复杂


Ex - ploooosion!