如何携带POST参数重定向?Rails集成CorvusPay支付对接咨询
在Rails中集成CorvusPay POST重定向支付表单
刚处理过类似的支付集成需求,结合CorvusPay的文档要求,给你整理一套清晰的实现方案,确保完全符合他们的规则:
核心逻辑说明
CorvusPay要求必须通过POST请求将用户重定向到支付表单,绝对不能用GET拼接参数的方式,所以我们需要在Rails里用表单来触发这个POST提交,而不是普通的链接跳转。
视图层实现(生成POST表单)
在你的订单确认页或者支付按钮所在的视图里,添加一个隐藏的表单,包含所有必填参数:
<%= form_tag 'https://testcps.corvus.hr/redirect/', method: :post, encoding: 'UTF-8' do %> <!-- 固定参数 --> <%= hidden_field_tag :target, '_top' %> <%= hidden_field_tag :mode, 'form' %> <%= hidden_field_tag :store_id, ENV['CORVUS_STORE_ID'] %> <!-- 从环境变量取值,避免硬编码 --> <%= hidden_field_tag :language, 'hr' %> <!-- 可根据用户语言动态调整,比如I18n.locale --> <%= hidden_field_tag :currency, 'HRK' %> <%= hidden_field_tag :require_complete, 'false' %> <!-- 动态参数:从你的订单模型获取真实数据 --> <%= hidden_field_tag :order_number, @order.id %> <!-- 替换为你的订单唯一标识 --> <%= hidden_field_tag :amount, @order.total.to_s %> <!-- 确保是字符串格式,保留正确小数位 --> <%= hidden_field_tag :cart, @order.line_items.map { |item| "#{item.quantity}x#{item.name}" }.join(', ') %> <!-- 生成购物车内容描述 --> <!-- 签名哈希:必须用商家密钥生成,用于验证请求合法性 --> <%= hidden_field_tag :hash, generate_corvus_payment_hash(@order) %> <%= button_tag '确认支付', type: :submit, class: 'payment-btn' %> <% end %>
控制器/服务层:生成签名哈希
hash参数是支付安全的核心,需要严格按照CorvusPay指定的规则,用商家提供的密钥生成。假设他们要求用SHA1哈希,你可以实现一个专门的服务类来处理:
# app/services/corvus_payment_service.rb class CorvusPaymentService def self.generate_hash(order) # 注意:参数拼接顺序必须和CorvusPay文档要求完全一致! base_string = "#{ENV['CORVUS_STORE_ID']}#{order.id}#{order.total}#{ENV['CORVUS_SECRET_KEY']}" Digest::SHA1.hexdigest(base_string) end end # 在视图里调用的话,可在控制器对应的helper里定义方法: # app/helpers/orders_helper.rb module OrdersHelper def generate_corvus_payment_hash(order) CorvusPaymentService.generate_hash(order) end end
必须遵守的规则(划重点!)
- 禁止使用GET请求:绝对不能直接跳转带参数的URL(比如
https://testcps.corvus.hr/redirect/?target=_top&...),文档明确禁止这种方式,会导致支付请求被拒绝。 - UTF-8编码:表单已经指定了
encoding: 'UTF-8',确保参数传递时不会出现乱码问题。 - 环境区分:当前用的是测试环境地址
https://testcps.corvus.hr/redirect/,上线前记得替换为CorvusPay提供的生产环境URL。 - SSL说明:文档提到用户重定向无需SSL证书,所以开发环境可以正常测试,但生产环境建议配置SSL提升整体安全性。
这样实现后,用户点击支付按钮就会通过POST请求跳转到CorvusPay的支付表单,完全符合文档要求。
内容的提问来源于stack exchange,提问作者Hrvoje Jesenovic
相关产品推荐
相关产品推荐

