Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在RubyonRails中正确处理来自服务器的POST请求_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 如何在RubyonRails中正确处理来自服务器的POST请求

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和现金卡金额等结果数据。这用于将支付结果存储到数据库中,

我正在开发一个支付系统(网关),在这个系统中,当用户使用带有PIN和序列号的现金卡请求支付时,服务器将POST请求发送到API。我在返回URL中包含查询字符串以及用于在交易后查询的参考数据,以显示结果

API返回用于将用户从我的应用程序重定向到支付网关的支付URL。然后,用户需要输入现金卡pin和序列号,然后API将其提交。在检查输入的现金卡的有效性后,API将做两件事:

  • 它将POST请求发送到预定义的回调URL,其中包含状态代码、参考ID和现金卡金额等结果数据。这用于将支付结果存储到数据库中,并根据返回的现金卡金额向用户添加信用
  • 它将用户重定向回在我们获得支付URL时第一次发出请求时生成的预定义返回URL,在该URL中,我查询最近存储在数据库中的结果,以向用户显示支付结果
  • 问题是应用程序从不接受POST请求,而是获取“422:不可处理实体”

    这是第一次将数据发布到API并重定向到支付网关:

    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