如何在Stripe的success_url中添加订阅时长参数?
实现步骤
1. 前端传递订阅方案参数
确保前端在发起创建Checkout Session请求时,将用户选择的方案对应的my_params值(比如方案1传2、方案2传3、方案3传4)与total参数一起提交到CheckoutController#create接口。
2. 修改Create方法注入参数到Success URL
在create方法中先获取前端传来的my_params,再通过Rails的URL Helper生成包含该参数的success_url,同时保留Stripe要求的{CHECKOUT_SESSION_ID}占位符:
def create @user = current_user @total = params[:total].to_d @my_params = params[:my_params] # 获取前端传递的订阅方案标识 @session = Stripe::Checkout::Session.create( payment_method_types: ['card'], line_items: [ { name: 'Rails Stripe Checkout', amount: (@total * 100).to_i, currency: 'eur', quantity: 1 }, ], # 用URL Helper生成带参数的成功跳转地址 success_url: checkout_success_url(my_params: @my_params, session_id: '{CHECKOUT_SESSION_ID}'), cancel_url: checkout_cancel_url ) respond_to do |format| format.js end end
3. 修复Success方法的逻辑问题
原success方法存在参数类型不匹配、实例变量调用遗漏的问题,修正后代码如下:
def success @session = Stripe::Checkout::Session.retrieve(params[:session_id]) @payment_intent = Stripe::PaymentIntent.retrieve(@session.payment_intent) @user = current_user my_params = params[:my_params].to_i # 将字符串参数转为整数,避免类型不匹配 if my_params == 2 @user.update(sub_lvl: [@user.sub_lvl, 2].max) # 简化等级更新逻辑 new_end_date = @user.end_sub_date < Time.now ? Time.now + 30.days : @user.end_sub_date + 30.days @user.update(end_sub_date: new_end_date) elsif my_params == 3 @user.update(sub_lvl: [@user.sub_lvl, 3].max) # 修正原代码中60天的错误,匹配方案2的90天时长 new_end_date = @user.end_sub_date < Time.now ? Time.now + 90.days : @user.end_sub_date + 90.days @user.update(end_sub_date: new_end_date) elsif my_params == 4 @user.update(sub_lvl: [@user.sub_lvl, 4].max) new_end_date = @user.end_sub_date < Time.now ? Time.now + 180.days : @user.end_sub_date + 180.days @user.update(end_sub_date: new_end_date) end end
额外提示
- 建议在
create方法中添加参数验证,比如检查@my_params是否为允许的2/3/4值,防止非法参数传入 - 确保前端传递的
my_params与订阅方案的对应关系准确(方案1→2、方案2→3、方案3→4)
内容的提问来源于stack exchange,提问作者ffouquet42
相关产品推荐
相关产品推荐

