ruby-on-rails 一个StripeCheckout示例工作正常,另一个示例给出的印前检查响应代码为403

lymnna71  于 2023-06-07  发布在  Ruby
关注(0)|答案(1)|浏览(157)

我正在我的应用程序中实现另一个Checkout Session示例。在我的donations控制器中,下面的create操作工作正常:

def create
        @donation = Donation.create(create_params)

        if @donation.save
            if Rails.env.development?
                success_url = "http://localhost:3000/donations_success?session_id={CHECKOUT_SESSION_ID}"
                cancel_url = "http://localhost:3000/"
            elsif Rails.env.production?
                success_url = "https://www.dbsan.org/donations_success?session_id={CHECKOUT_SESSION_ID}"
                cancel_url = "https://www.dbsan.org/"
            end

            data = {
                line_items: [{
                    price_data: {
                        currency: 'usd',
                        product_data: {
                        name: @donation.program
                    },
                    unit_amount: @donation.amount.to_i
                    },
                    quantity: 1,
                }], 
                mode: 'payment',
                customer_email: @donation.email,
                success_url: success_url,
                cancel_url: cancel_url
            }

            session = Stripe::Checkout::Session.create(data)
            redirect_to session.url, allow_other_host: true
        end
    end

我将相关的Stripe部分复制到我的参与者注册控制器中:

def create
        @registrant = @challenge.challenge_participants.build(register_params)
        @registrant.user_id = current_user.id
        unless @registrant.donations.empty?
            @registrant.donations.first.user_id = current_user.id
            @registrant.donations.first.email = current_user.email
        end

        if @registrant.save
            @challenge = @registrant.challenge
            ChallengeMailer.with(registrant: @registrant).registered.deliver_now
            if @registrant.price.price == 0
                redirect_to challenge_participant_path(@challenge, @registrant)
            else
                if Rails.env.development?
                    success_url = "http://localhost:3000/donations_success?session_id={CHECKOUT_SESSION_ID}"
                    cancel_url = "http://localhost:3000/"
                elsif Rails.env.production?
                    success_url = "https://www.dbsan.org/donations_success?session_id={CHECKOUT_SESSION_ID}"
                    cancel_url = "https://www.dbsan.org/"
                end

                data = {
                    line_items: [{
                        price_data: {
                            currency: 'usd',
                            product_data: {
                            name: "Registration"
                        },
                        unit_amount: 100
                        },
                        quantity: 1,
                    }], 
                    mode: 'payment',
                    success_url: success_url,
                    cancel_url: cancel_url
                }

                session = Stripe::Checkout::Session.create(data)
                redirect_to session.url, allow_other_host: true
            end
        end

捐赠一个将重定向到条纹没有问题;但是,如果所选的定价大于0,则注册服务器将尝试启动条带校验。在我的浏览器控制台中,我得到一个Preflight响应不成功的错误代码403,其中包含一些TypeError,但它没有给我详细信息。
在这两个视图中,Stripe API Javascript包含在提交按钮的上方:

= javascript_include_tag "https://js.stripe.com/v3"

由于我从捐赠控制器复制了代码,所以我没有看到我的错误是什么。
我还没有更新success_url,因为我想先重定向到Stripe。name和unit_amount现在是硬编码的,以防我的变量不起作用。

4dc9hkyq

4dc9hkyq1#

您共享的代码是Ruby中一个简单的HTTP重定向服务器端,除非您的客户端代码正在发出 AJAX 请求而不是页面/表单提交,否则不应该在浏览器中导致CORS错误。
或者,表单提交可能配置错误,Rails将其转换为turbo请求。将data-turbo=false添加到表单中可能会解决这个问题。

相关问题