Ruby on rails 如何在RubyonRails中正确处理来自服务器的POST请求
我正在开发一个支付系统(网关),在这个系统中,当用户使用带有PIN和序列号的现金卡请求支付时,服务器将POST请求发送到API。我在返回URL中包含查询字符串以及用于在交易后查询的参考数据,以显示结果 API返回用于将用户从我的应用程序重定向到支付网关的支付URL。然后,用户需要输入现金卡pin和序列号,然后API将其提交。在检查输入的现金卡的有效性后,API将做两件事:Ruby on rails 如何在RubyonRails中正确处理来自服务器的POST请求,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在开发一个支付系统(网关),在这个系统中,当用户使用带有PIN和序列号的现金卡请求支付时,服务器将POST请求发送到API。我在返回URL中包含查询字符串以及用于在交易后查询的参考数据,以显示结果 API返回用于将用户从我的应用程序重定向到支付网关的支付URL。然后,用户需要输入现金卡pin和序列号,然后API将其提交。在检查输入的现金卡的有效性后,API将做两件事: 它将POST请求发送到预定义的回调URL,其中包含状态代码、参考ID和现金卡金额等结果数据。这用于将支付结果存储到数据库中,
def topup
ref = 'ref'+Time.now.strftime('%Y%m%d%H%M%S')
params = {'app_code'=>'xxxx', 'secret'=>'xxxx', 'ref'=>ref, 'returnurl'=>'http://xxx.xxx.xxx/returnpath?=reference='+ref}
api = 'http://api.xxx.xxx/topuprequest'
raw = Net::HTTP.post_form(URI.parse(api), params)
response = ActiveSupport::JSON.decode(raw.body)
# Redirect the user to the gateway using the URL returned from the API
redirect_to response['paymentUrl']
end
这是将所有从API返回的数据保存到数据库并更新用户信用的最重要部分,也是应用程序拒绝所有请求并返回“422:不可处理实体”时出现问题的地方:
这是在第一个请求中定义的返回URL。它查询最近存储在数据库中的信息,并将其显示给用户。它使用第一步发送的查询字符串中的参考ID搜索匹配的交易,然后查询状态和金额,最后将结果显示给用户:
def returnpath
# Retrieve the query string data
ref = params[:ref]
transaction = Transaction.where(ref = ?, ref).first
status = transaction.status
amount = transaction.amount
message = 'You topup #{amount} to your account and the status is #{status}'
render plain: message
end
用户请求支付,然后重定向到网关,然后输入现金卡PIN和序列号,然后系统检查有效性及其金额,并将POST请求作为回调发送到应用程序。最后,它将用户重定向回我们最初定义的返回路径
问题是回调,即POST请求,总是被应用程序拒绝。它以“422:不可处理实体”响应。我仍然不明白为什么会发生这种情况。您是只保留了
金额
,还是在您发布的回调
方法上写了什么?您如何使用状态
和引用
参数。请添加将事务模型持久化到数据库的方式。添加了事务保存,以便查看图片@Optimus Pettewhich model未能保存,事务
或用户
?我不认为这是一个保存问题。看起来没有收到POST请求。因此它返回422。您是只保留金额
,还是在您发布的回调
方法中输入了一些内容?您如何使用状态
和引用
参数。请添加将事务模型持久化到数据库的方式。添加了事务保存,以便查看图片@Optimus Pettewhich model未能保存,事务
或用户
?我不认为这是一个保存问题。看起来没有收到POST请求。所以它返回422。
def returnpath
# Retrieve the query string data
ref = params[:ref]
transaction = Transaction.where(ref = ?, ref).first
status = transaction.status
amount = transaction.amount
message = 'You topup #{amount} to your account and the status is #{status}'
render plain: message
end