V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Annual
V2EX  ›  PHP

学习支付过程中遇到的问题

  •  
  •   Annual · 2018-01-02 02:59:16 +08:00 · 3311 次点击
    这是一个创建于 2512 天前的主题,其中的信息可能已经有所发展或是发生改变。

    lz 现在是学习 PHP 阶段,有很多不懂,期望不要吐槽 233 正文: 现在在学习使用前几天的个人微信支付接口 帖子 /t/416924 目前卡在了异步验证,POST 返回之后做成变量,如何根据他的方式计算出签名? http://mi90.com/20180102025127.png http://mi90.com/20180102025559.png

    16 条回复    2018-01-03 16:45:08 +08:00
    lhx2008
        1
    lhx2008  
       2018-01-02 06:34:21 +08:00 via Android
    手动拼接也是可以的,按 ascii 顺序
    lhx2008
        2
    lhx2008  
       2018-01-02 06:39:55 +08:00 via Android
    或者就是按教程把所有非空的变量丢进一个数组,然后用 httpbuild
    Telegram
        3
    Telegram  
       2018-01-02 10:04:38 +08:00   ❤️ 2
    先给你讲下大概的原理:
    比如说金额 je=100 订单号 ddh=123456,支付时间 sj=20180101 这 3 个参数,
    如果不签名的话,我可以直接修改金额 je=9999,然后提交给服务器,那我账户就白白多充值了 9999 余额。

    所以需要签名,用来验证前面参数是否被修改过。
    按照你的这个接口,方法是先根据参数名的 ascii 排序,ddh,je,sj 这个顺序
    所以拼接后市 ddh=123456&je=100&sj=20180101
    再加一个 key,比如说是 IGDIGI#**D*S&#@
    拼接后就是
    ddh=123456&je=100&sj=20180101&key=IGDIGI#**D*S&#@

    然后对这个字符串 MD5 运算,得到:B71C6C22BD69675BCD1302D2EDCD9F3C

    最后提交服务器就是:
    ddh=123456&je=100&sj=20180101&sign=B71C6C22BD69675BCD1302D2EDCD9F3C

    这样一来,服务器只要收到后自己再验算一遍,看看算出来的 sign 是不是一样,就知道你改没改参数了。
    只要你随便改其中某一个参数,后面的 sign 就对不上。
    Light3
        4
    Light3  
       2018-01-02 11:49:42 +08:00
    3 楼说的很清楚了
    就是根据参数 然后 ascii 排序 拼接 md5 得到一个串比对 就行了.
    重点 md5 和 ascii 排序 话说 微信那好像有 demo  你可以看看
    Annual
        5
    Annual  
    OP
       2018-01-02 14:55:50 +08:00
    只能写成这个样子了,ascii 排序不会。。。
    http://mi90.com/20180102145316.png

    @Telegram
    qiayue
        6
    qiayue  
       2018-01-02 15:00:40 +08:00
    按照参数名排序,如果你已知所有参数,那么直接写死顺序就可以了

    一般来讲,都是按照值排序,这样每个请求的顺序都不一样,才需要每次都排序
    qiayue
        7
    qiayue  
       2018-01-02 15:01:17 +08:00
    排序直接用 ksort
    Annual
        8
    Annual  
    OP
       2018-01-02 15:14:49 +08:00
    @qiayue 就是不懂 ascii 所以才不知道怎么排序来写死。。
    qiayue
        9
    qiayue  
       2018-01-02 15:17:13 +08:00
    @Annual “不懂 ascii ”
    不懂随便搜索一下就了解了
    我感觉你都可以不用干这行了,去搬砖吧
    xiangbudaomingzi
        10
    xiangbudaomingzi  
       2018-01-02 15:19:52 +08:00
    @Annual 不懂 ascii。。。。。。你大学是什么专业?
    Telegram
        11
    Telegram  
       2018-01-02 15:36:39 +08:00 via iPhone
    @Annual #8 你直接理解成按照 abcdefg 这种字母顺序排序就行了,反正参数不会是数字开头
    xiangbudaomingzi
        12
    xiangbudaomingzi  
       2018-01-02 15:58:50 +08:00
    如果是半路转行的话建议还是得补一些计算机基本知识...
    Annual
        13
    Annual  
    OP
       2018-01-02 18:46:09 +08:00 via Android
    @xiangbudaomingzi 等等,我账号写的大学???
    mingyun
        14
    mingyun  
       2018-01-02 23:54:33 +08:00
    github 有代码自己看看
    yyup
        15
    yyup  
       2018-01-03 10:13:23 +08:00
    签名算法是已知的,修改数据之后再重新计算签名就可以篡改金额了,请问微信是如何防御这样的危险的?如何避免中间人获取到这些数据?
    Annual
        16
    Annual  
    OP
       2018-01-03 16:45:08 +08:00
    @yyup 需要从微信那边去效验签名
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2952 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 14:55 · PVG 22:55 · LAX 06:55 · JFK 09:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.