这几天重写以前遗留的我们对接支付宝的支付服务,在做到 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
获取需要参与签名的参数