使用Ruby on Rails form_for和控制器/方法绑定PayPal智能按钮?

问题描述 投票:1回答:1

我有智能按钮在沙盒中“工作”,但我想不出任何方法将智能按钮成功附加到创建订单的订单表单。使用条纹元素,它非常即插即用,因为它位于页面上并且是表单本身的一部分,但是使用PayPal进行重定向时,我似乎无法想到某种方式。

这需要javascript还是我可以在没有它的情况下执行此操作,除了已经存在的内容?

形成:

<%= form_for(@order, url: listing_orders_path([@listing, @listing_video]), html: {id: "payment_form-4"} ) do |form| %>

   <%= form.label :name, "Your Name", class: "form-label" %>
   <%= form.text_field :name, class: "form-control", required: true, placeholder: "John" %>
#stripe code here (not important)
<%= form.submit %>
  <div id="paypal-button-container"></div>

<!-- Include the PayPal JavaScript SDK -->
<script src="https://www.paypal.com/sdk/js?client-id=sb&currency=USD"></script>

  <script>
    // Render the PayPal button into #paypal-button-container
    paypal.Buttons({

        // Set up the transaction
        createOrder: function(data, actions) {
            return actions.order.create({
                purchase_units: [{
                    amount: {
                        value: <%= @listing.listing_video.price %>
                    }
                }]
            });
        },

        // Finalize the transaction
        onApprove: function(data, actions) {
            return actions.order.capture().then(function(details) {
                // Show a success message to the buyer
                alert('Transaction completed by ' + details.payer.name.given_name + '!');
            });
        }


    }).render('#paypal-button-container');
</script>

在Controller中创建方法:

require 'paypal-checkout-sdk'
client_id = Rails.application.credentials[Rails.env.to_sym].dig(:paypal, :client_id)
client_secret = Rails.application.credentials[Rails.env.to_sym].dig(:paypal, :client_secret)
# Creating an environment
environment = PayPal::SandboxEnvironment.new(client_id, client_secret)
client = PayPal::PayPalHttpClient.new(environment)

@amount_paypal = (@listing.listing_video.price || @listing.listing_tweet.price)
request = PayPalCheckoutSdk::Orders::OrdersCreateRequest::new
request.request_body(
  {
    intent: 'AUTHORIZE',
    purchase_units: [
      {
        amount: {
          currency_code: 'USD',
          value: "#{@amount_paypal}"
        }
      }
    ]
  }
)

begin
  # Call API with your client and get a response for your call
  response = client.execute(request)

  # If call returns body in response, you can get the deserialized version from the result attribute of the response
  order = response.result
  puts order
  @order.paypal_authorization_token = response.id
rescue BraintreeHttp::HttpError => ioe
  # Something went wrong server-side
  puts ioe.status_code
  puts ioe.headers['debug_id']
end

如何将PayPal智能按钮与表单绑定,以便在付款完成后,如果成功,它会创建订单?

UPDATE :::::::

创建了PaypalPayments控制器和模型:

控制器:

  def create
    @paypal_payment = PaypalPayment.new
    @listing = Listing.find_by(params[:listing_id])  

    require 'paypal-checkout-sdk'
    client_id = "#{Rails.application.credentials[Rails.env.to_sym].dig(:paypal, :client_id)}"
    client_secret = "#{Rails.application.credentials[Rails.env.to_sym].dig(:paypal, :client_secret)}"
    # Creating an environment
    environment = PayPal::SandboxEnvironment.new(client_id, client_secret)
    client = PayPal::PayPalHttpClient.new(environment)

    @amount_paypal = @listing.listing_video.price
    request = PayPalCheckoutSdk::Orders::OrdersCreateRequest::new
    @paypal_payment = request.request_body({
                            intent: "AUTHORIZE",
                            purchase_units: [
                                {
                                    amount: {
                                        currency_code: "USD",
                                        value: "#{@amount_paypal}"
                                    }
                                }
                            ]
                          })

    begin
        # Call API with your client and get a response for your call
        response = client.execute(request)

        # If call returns body in response, you can get the deserialized version from the result attribute of the response
        order = response.result
        puts order
        # @order.paypal_authorization_token = response.id
    rescue BraintreeHttp::HttpError => ioe
        # Something went wrong server-side
        puts ioe.status_code
        puts ioe.headers["debug_id"]
    end

    # if @paypal_payment.create
    #   render json: {success: true}
    # else
    #   render json: {success: false}
    # end

  end

Javascript在视图中:

paypal.Buttons({

                                      createOrder: function() {
                                        return fetch('/paypal_payments', {
                                          method: 'post',
                                          headers: {
                                            'content-type': 'application/json'
                                          }
                                        }).then(function(res) {
                                          return res.json();
                                        }).then(function(data) {
                                          return data.orderID;
                                        });
                                      },



                                      onApprove: function(data) {
                                        return fetch('/orders', {
                                          method: 'post',
                                          headers: {
                                            'content-type': 'application/json'
                                          },
                                          body: JSON.stringify({
                                            orderID: data.orderID
                                          })
                                        }).then(function(res) {
                                          return res.json();
                                        }).then(function(details) {
                                          alert('Authorization created for ' + details.payer_given_name);
                                        });
                                      },


                                  }).render('#paypal-button-container');

有了这个,paypal框出现了,但随后在CMD加载后立即消失:

#<OpenStruct id="1Pxxxxxxx394U", links=[#<OpenStruct href="https://api.sandbox.paypal.com/v2/checkout/orders/1P0xxxxxxx394U", rel="self", method="GET">, #<OpenStruct href="https://www.sandbox.paypal.com/checkoutnow?token=1P07xxxxxxx94U", rel="approve", method="GET">, #<OpenStruct href="https://api.sandbox.paypal.com/v2/checkout/orders/1Pxxxxxxx4U", rel="update", method="PATCH">, #<OpenStruct href="https://api.sandbox.paypal.com/v2/checkout/orders/1P07xxxxxxx394U/authorize", rel="authorize", method="POST">], status="CREATED">
No template found for PaypalPaymentsController#create, rendering head :no_content
Completed 204 No Content in 2335ms (ActiveRecord: 15.8ms)
ruby-on-rails ruby paypal paypal-rest-sdk express-checkout
1个回答
0
投票

我没有使用过智能按钮。但是,在创建操作中不应该有“更多代码”。如果您遵循MVC和rails约定。您似乎需要单独的控制器操作来独立于创建操作处理付款授权。但是,如果你可以在你的javascript中达到这一点,这里是你如何将数据从paypal javascript发送回你的控制器的例子,这将需要一些工作,但希望它指出你正确的方向:

// Finalize the transaction
onApprove: function(data, actions) {
  return actions.order.capture().then(function(details) {
    // Show a success message to the buyer
    alert('Transaction completed by ' + details.payer.name.given_name + '!');
   // here is where you should send info to your controller action via ajax.
     $.ajax({
        type: "POST",
        url: "/orders",
        data: data,
        success: function(data) {
          alert(data); // or whatever you wanna do here
          return false;
        },
        error: function(data) {
          alert(data); // or something else
          return false;
        }
     });
  });
}
© www.soinside.com 2019 - 2024. All rights reserved.