Rails 验证支付宝回调时踩过的坑

zhangbin-github · 2017年07月14日 · 最后由 zhangbin-github 回复于 2017年07月14日 · 3735 次阅读

这几天重写以前遗留的我们对接支付宝的支付服务,在做到 rsa 签名验证的时候遇到一个小坑。

我首先获取 controller 的 request params,然后用过一个方法,将 params hash 转换成 string,然后使用 public key 进行 rsa 验签,整个过程,并没有什么高科技,在 console 里面也一切 ok。 部署线上以后,就发现签名怎么也过不了

原因是 rails 的 request params 里面会添加一些额外的参数进去,例如 controller,action,format 等。

参考: https://stackoverflow.com/questions/7467901/getting-the-rails-params-without-the-defaults

rails 源码 https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/http/parameters.rb 第 48 行 parameters 方法

所以正确的姿势应该是:

sign_params = params.except(*request.path_parameters.keys)

更好的写法:

sign_params = request.request_parameters

获取需要参与签名的参数

post 请求直接 request.request_parameters

zhangbin-github 关闭了讨论。 07月14日 14:25
需要 登录 后方可回复, 如果你还没有账号请 注册新账号