如何在Stripe支付中通过控制器动态生成通用返回URL?
问题:如何在Rails控制器中定义通用return_url供Stripe支付表单调用
你需要用统一表单处理多路径的Stripe支付意图及支付UI,希望把前端JS里硬编码的giftcard_authorised_payments_url改成通用的return_url变量,以下是具体实现步骤:
当前你使用的前端JS代码片段:
<script type="text/javascript"> [...] form.addEventListener('submit', async (event) => { event.preventDefault(); const {error} = await stripe.confirmPayment({ //`Elements`实例,用于创建Payment Element elements, confirmParams: { return_url: '<%= giftcard_authorised_payments_url(id: @payment.id) %>' }, }); </script>
解决方案
1. 在控制器动作中定义实例变量@return_url
根据不同的支付业务场景,在对应的控制器动作里生成专属的返回URL,赋值给@return_url:
# 礼品卡支付场景的控制器动作示例 def giftcard_payment @payment = Payment.find(params[:id]) @return_url = giftcard_authorised_payments_url(id: @payment.id) end # 普通订单支付场景的控制器动作示例 def order_payment @order = Order.find(params[:id]) @return_url = order_authorised_payments_url(id: @order.id) end
2. 视图JS中替换为通用变量
把原来硬编码的URL助手调用,替换成控制器传递的实例变量:
<script type="text/javascript"> [...] form.addEventListener('submit', async (event) => { event.preventDefault(); const {error} = await stripe.confirmPayment({ elements, confirmParams: { return_url: '<%= @return_url %>' }, }); </script>
3. (可选)封装通用方法减少重复代码
如果多个控制器动作都需要生成支付返回URL,可以在ApplicationController里封装通用方法,复用逻辑:
# app/controllers/application_controller.rb class ApplicationController < ActionController::Base protected def set_payment_return_url(record, url_helper) @return_url = send(url_helper, id: record.id) end end # 具体控制器中调用示例 def giftcard_payment @payment = Payment.find(params[:id]) set_payment_return_url(@payment, :giftcard_authorised_payments_url) end def order_payment @order = Order.find(params[:id]) set_payment_return_url(@order, :order_authorised_payments_url) end
内容的提问来源于stack exchange,提问作者Jerome
相关产品推荐
相关产品推荐

