lz 现在是学习 PHP 阶段,有很多不懂,期望不要吐槽 233 正文: 现在在学习使用前几天的个人微信支付接口 帖子 /t/416924 目前卡在了异步验证,POST 返回之后做成变量,如何根据他的方式计算出签名? http://mi90.com/20180102025127.png http://mi90.com/20180102025559.png
1
lhx2008 2018-01-02 06:34:21 +08:00 via Android
手动拼接也是可以的,按 ascii 顺序
|
2
lhx2008 2018-01-02 06:39:55 +08:00 via Android
或者就是按教程把所有非空的变量丢进一个数组,然后用 httpbuild
|
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 就对不上。 |
4
Light3 2018-01-02 11:49:42 +08:00
3 楼说的很清楚了
就是根据参数 然后 ascii 排序 拼接 md5 得到一个串比对 就行了. 重点 md5 和 ascii 排序 话说 微信那好像有 demo 你可以看看 |
5
Annual OP |
6
qiayue 2018-01-02 15:00:40 +08:00
按照参数名排序,如果你已知所有参数,那么直接写死顺序就可以了
一般来讲,都是按照值排序,这样每个请求的顺序都不一样,才需要每次都排序 |
7
qiayue 2018-01-02 15:01:17 +08:00
排序直接用 ksort
|
10
xiangbudaomingzi 2018-01-02 15:19:52 +08:00
@Annual 不懂 ascii。。。。。。你大学是什么专业?
|
11
Telegram 2018-01-02 15:36:39 +08:00 via iPhone
@Annual #8 你直接理解成按照 abcdefg 这种字母顺序排序就行了,反正参数不会是数字开头
|
12
xiangbudaomingzi 2018-01-02 15:58:50 +08:00
如果是半路转行的话建议还是得补一些计算机基本知识...
|
13
Annual OP @xiangbudaomingzi 等等,我账号写的大学???
|
14
mingyun 2018-01-02 23:54:33 +08:00
github 有代码自己看看
|
15
yyup 2018-01-03 10:13:23 +08:00
签名算法是已知的,修改数据之后再重新计算签名就可以篡改金额了,请问微信是如何防御这样的危险的?如何避免中间人获取到这些数据?
|