Rails PayPal Checkout SDK 在视图而不是控制器中存储请求正文

Posted

技术标签:

【中文标题】Rails PayPal Checkout SDK 在视图而不是控制器中存储请求正文【英文标题】:Rails PayPal Checkout SDK Store Request Body in View instead of Controller 【发布时间】: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 的请求正文,而不是现在设置的方式?或者......失败了......我怎样才能从视图(价格)中获取表单数据到控制器中以替换那里的“价格”?

【问题讨论】:

【参考方案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 以便将其发布到控制器。

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

【讨论】:

以上是关于Rails PayPal Checkout SDK 在视图而不是控制器中存储请求正文的主要内容,如果未能解决你的问题,请参考以下文章

Rails:Localhost 中的 PayPal Express Checkout 集成

Rails:Paypal 端点 /v2/checkout/orders 返回 http 401

PayPal Express Checkout 与多件商品在 Rails 中的活跃商家

我想在 Rails 中实现 PayPal Digital Goods Express Checkout API

Rails 5中没有令牌通过PayPal Express Checkout

Rails:Paypal Express 实施因未定义方法“checkout_thank_you_url”而失败