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