支付宝异步通知的验签有什么用?

为什么要验签 直接return 'success';不行吗
先取出订单编号 判断数据库有没有数据 如果没有数据并且当状态为TRADE_SUCCESS时再存入数据库 如果数据库有数据就不做处理 反正支付宝最多也就发6次通知让它发就行了 不做验签处理我这种操作可以吗?

阅读 3.7k
2 个回答

非对称加密的方式来校验是不是真的支付宝发来的回调。

如果你的回调地址被我知道了,我下一个单但是没真支付,而是伪装成支付宝给你发回调、数据格式啥的都跟他一模一样(甚至如果我能劫持你的上层网关的话,连 IP 地址我都能伪装成支付宝的服务器地址),你也照样当我已支付了处理?

在创建订单时异步通知地址会附在 Payload 中,如果你不验签,别人就在你网站或者APP上面下单,不支付,然后然后直接伪造一个异步通知过来,如果这时候你没有验签,那么你就会正常处理,商品并变成了已支付,但是这个过程中我没有支付1分钱,也就是「白嫖」。

验签的作用就是,在你跟支付宝之间,商定了一个「密钥对」,因为支付宝是用的非对称加密,支付宝使用公钥把发送的数据生成签名后并把签名一起附加到请求中,收到异步通知后,先将数据提出来,签名放到一边,根据签名计算规则用数据计算出签名和支付宝发请求附带的签名进行比较,如果在算法有效的情况下,这两个签名不一样就说明数据被动过手脚,如果有中间人攻击,他修改了数据里面的任何一项,因为他并没有公钥,所以他无法生成出正确的签名,即使他使用旧的签名,但是也因为你的签名计算是通过数据包来计算的,直接就不一样,也就无法验签通过!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题