【问题标题】:Rails PayPal Checkout SDK Store Request Body in View instead of ControllerRails PayPal Checkout SDK 在视图而不是控制器中存储请求正文
【发布时间】:2020-11-23 23:50:23
【问题描述】:

我正在运行 Rails 5.2,目前我的 PayPal Checkout 设置如下:

查看:

paypal.Buttons({
      
      env: "#{ENV['PAYPAL_ENV']}",

      createOrder: async () => {
        const response = await fetch('/create_order', {method: 'POST'});
        const responseData = await response.json();
        return responseData.token;
      },

控制器:

def create_order
    price = '100.00'
   
    request = PayPalCheckoutSdk::Orders::OrdersCreateRequest::new
    request.request_body({
      :intent => 'CAPTURE',
      :purchase_units => [
        {
          :amount => {
            :currency_code => 'USD',
            :value => price
          }
        }
      ]
    })
    begin
      response = @client.execute request
      order = Order.new(order_params)
      order.price_cents = price.to_i
      order.token = response.result.id
      if order.save
        return render :json => {:token => response.result.id}, :status => :ok
      end
    rescue PayPalHttp::HttpError => ioe
      return render html: ERROR_MESSAGE
    end
  end

但是...我宁愿像这样处理 JavaScript 中的请求正文:

 createOrder: function(data, actions) {
      
      return actions.order.create({
        
        purchase_units: [{
          amount: {
            value: document.getElementById('payprice').value
          }
        }]
      });
      
    },

如何设置我的控制器,以便它仍然给我 PayPal 令牌...但它接受来自视图中 JavaScript 的请求正文,而不是现在设置的方式?或者......失败了......我怎样才能从视图(价格)中获取表单数据到控制器中以替换那里的“价格”?

【问题讨论】:

    标签: javascript ruby-on-rails paypal


    【解决方案1】:

    您似乎希望您的 JS 代码调用您的 Ruby 代码以获取订单令牌 - 并且可能稍后在批准后捕获交易。

    您需要这样的服务器端集成模式:https://developer.paypal.com/demo/checkout/#/pattern/server

    然后,您需要在您的服务器上创建两个您的 JS 代码可以调用的路由,并将其指向它们。

    【讨论】:

    • 没有。我已经有了令牌和两条路线等等。我所做的是对此稍作修改的版本:davidangulo.xyz/…,它本质上是您上面所拥有的内容的副本。
    • 那么你已经有了正确的解决方案,它不涉及actions.order.create(),而是使用 fetch 到服务器。我猜您是在问如何将价格作为参数包含在内。它可以是获取请求正文的一部分,也可以是 URL 路由的一部分。
    • 好的。好吧,如果您添加如何将其添加到脚本中的 fetch 请求正文中...以及如何在控制器中检索它...我会接受您的回答。 :)
    • 到目前为止我已经尝试过 const response = await fetch('/create_order', {method: 'POST', "amount" : payprice});并在控制器中:“price = params[:amount]”,但我收到错误:“位置 0 处 JSON 中的意外令牌 S”
    • 链接服务器模式有一个将data.orderID 作为 URL 路径的一部分传输的示例。有关在 JSON 格式的请求正文中发送相同内容的示例,请参阅 developer.paypal.com/docs/checkout/reference/server-integration/… 。如果您要这样读取数据,则需要以 JSON 格式发送数据
    【解决方案2】:

    Preston PHX 为我指明了正确的方向,值得称赞……但我的朋友 Gary 在两个小时前解决了这个小难题:

    查看:

     paypal.Buttons({
          
          env: "#{ENV['PAYPAL_ENV']}",
          createOrder: async () => {
            const response = await fetch('/create_order', {method: 'POST',
        headers: {'Content-Type': 'application/json'}, 
        body: JSON.stringify({"price" : document.getElementById('amount').value})
      });
            const responseData = await response.json();
            return responseData.token;
          },
    

    控制器:

    def create_order
        price = params[:amount]
        request = PayPalCheckoutSdk::Orders::OrdersCreateRequest::new
        request.request_body({
          :intent => 'CAPTURE',
          :purchase_units => [
            {
              :amount => {
                :currency_code => 'USD',
                 :value => price
              }
            }
          ]
        })
    

    就是这样。这完全回答了如何将价格输入控制器的问题......以及如何将价格从表单输入 javascript 以便将其发布到控制器。

    令我惊讶的是,经过一个月的搜索,我从未在任何地方看到过如何做到这一点。我想有很多应用程序,您希望用户选择他们要支付的金额和货币。

    【讨论】:

      猜你喜欢
      • 2014-11-05
      • 2011-08-21
      • 2020-11-13
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 2015-08-04
      • 1970-01-01
      相关资源
      最近更新 更多