V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
simplesslife
V2EX  ›  问与答

求微信和支付宝二维码动态生成原理?

  •  
  •   simplesslife · 2016-05-05 19:55:36 +08:00 · 20312 次点击
    这是一个创建于 3143 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT ,最近项目中要用到,请各路大神不吝赐教

    18 条回复    2019-04-09 10:29:22 +08:00
    murmur
        1
    murmur  
       2016-05-05 20:11:28 +08:00
    大概就是保持服务器和手机时间近似同步吧 然后有一套算法去加密这个时间就可以了
    liyvhg
        2
    liyvhg  
       2016-05-05 20:12:38 +08:00 via Android
    实际上是个 URL 的短链接。可能一部分校验在服务器一部分数据在 URL 里面吧。业余答复。
    mio4kon
        3
    mio4kon  
       2016-05-05 20:17:56 +08:00
    会有几张保存在本地,所以没网也会有二维码
    JiShuTui
        5
    JiShuTui  
       2016-05-05 21:01:55 +08:00
    都是按格式生成 URL 然后 APP 去处理 URL
    simplesslife
        6
    simplesslife  
    OP
       2016-05-05 21:21:34 +08:00
    @murmur 离线怎么处理,请求量大的话怎么,一个时间可能有多个项。。
    @liyvhg @JiShuTui @mio4kon @skyshy @murmur 谢谢
    还有二维码的使用,安全,使用周期怎么控制。。
    murmur
        7
    murmur  
       2016-05-05 21:29:20 +08:00
    @simplesslife 一个时间应该只会有一张图片 精确到半分钟或者一分钟就可以了
    mkeith
        8
    mkeith  
       2016-05-05 23:24:27 +08:00
    应该类似网银的"动态密码"那种原理吧
    haitang
        9
    haitang  
       2016-05-06 03:06:56 +08:00 via Android
    查了下微信的付款二维码,是 18 位数字编号,感觉是预定的验证码,又顺手抓了下包,发现请求一个 tenpay 接口,返回的数据长度 1300+,根据长度看,如果是纯黑白图片,可能是一个二维码大小,就是说,二维码是服务器来生成的。

    PS: 微信中,我的二维码功能,是由服务器生成的,不过这个二维码是美化过的,不确定本地是否有二维码生成模块
    venster
        10
    venster  
       2016-05-06 08:17:52 +08:00
    @murmur 不知道服务器端都没有存储客户端最近一次的时间偏差,要是存储了的话,应该可以允许更高的时间误差。
    murmur
        11
    murmur  
       2016-05-06 09:36:10 +08:00
    @haitang
    @venster
    支付宝钱包可以离线支付,下面有小字写了每分钟自动更新,我想大概时间差就是半分钟吧,把时间作为参数加到二维码里了
    simplesslife
        12
    simplesslife  
    OP
       2016-05-06 10:04:33 +08:00
    @murmur 嗯,我看了一下,应该跟你说的差不多,就是生成的规则具体是怎样的,是把时间和用户信息合在一起 hash 还是别的方法。
    murmur
        13
    murmur  
       2016-05-06 11:08:45 +08:00
    @simplesslife 具体参考魔兽世界的手机安全令牌 有开源版 只要把那个数字加大能凑出一幅图就够了
    eirk2004
        14
    eirk2004  
       2016-05-06 13:53:07 +08:00
    secret key + time stamp
    simplesslife
        15
    simplesslife  
    OP
       2016-05-06 17:10:28 +08:00
    @murmur @eirk2004 看了一下,貌似是 totp 算法
    731193550
        16
    731193550  
       2016-06-06 14:40:42 +08:00
    你好,大神联系方式是什么?学习下
    myshzzx
        17
    myshzzx  
       2017-05-06 16:13:48 +08:00
    猜想应该是这么生成的, 用户 id+key 得到一个数字串, 然后用支付宝公钥加密一下得到.
    key 应该是楼上说的 totp 算法生成的, 生成密钥在登录支付宝时从服务器获取即可.
    服务端验证: 只需验证 key 是由当前用户的密钥生成即可.
    这里有个安全漏洞: 生成 key 的密钥需要保存在本地, 一旦手机被 root, 这个密钥可能泄露.
    youyaang
        18
    youyaang  
       2019-04-09 10:29:22 +08:00
    [大雾] 干脆每次都传好几个给手机,定时联网刷新,刷新失败就用本地缓存(就是之前提前发过来的),就是现在是 abc,30 秒后换成 abd (本地缓存),再 60 秒后 abe (本地缓存),手机时钟在短时间内怎么说也是可靠的吧(当然你也可以用时间戳
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1057 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:26 · PVG 02:26 · LAX 10:26 · JFK 13:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.