【问题标题】:Handling Incoming Parameters - Payment and Transaction with Rails处理传入参数 - 使用 Rails 进行支付和交易
【发布时间】:2014-07-21 16:29:09
【问题描述】:

我的 Rails4 应用程序中有一个 Order 和一个 OrderTransactions 模型。他们之间有一个基本的has_onebelongs_to关系。

我正在从 /orders/new 页面向银行的 URL 发布请求,如下所示:

<%= simple_form_for(@order, :url => "https://testsanalpos.est.com.tr/servlet/est3Dgate", :method => :post) do |f| %>

  <% @hashing.each do |k, v| %>
    <%= f.input k, input_html: {name: k, value: v}, as: :hidden %>
  <% end %>

  <%= f.input :participation_id, ... %>
  <%= f.button :submit, "Ödeme Yap" %>
<% end %>

@hashing, hash 来自我的控制器 =>

class OrdersController < ApplicationController
  before_filter :authenticate_user!
  before_action :set_order, only: [:show, :edit, :update, :destroy]
  skip_before_action :verify_authenticity_token

  def new
    @order = Order.new
    @hashing = {
      clientid: POS['clientid'],
      oid: Time.now.to_i.to_s,
      amount: POS['amount'],
      okUrl: POS['okUrl'],
      failUrl: POS['failUrl'],
      rnd: Time.now.to_i.to_s,
     }
  end

  def create
    @order = Order.new(order_params)
    respond_to do |format|
      @order.purchase
    end
  end

  def success
  end

  def fail
  end

  private

  def set_order
    @order = Order.find(params[:id])
  end

  def order_params
    params.require(:order).permit(:id, :ip_address, :first_name, :last_name, :card_brand, :card_number, :card_verification, :card_expires_on, :user_id, :participation_id)
  end
end

Order.rb =>

class Order < ActiveRecord::Base
  belongs_to :user
  belongs_to :participation
  has_one :transaction, :class_name => "OrderTransaction"

  def purchase
    participation.update_attribute(:payment_status, true)
    create_transaction(:action => "purchase", :response => response)
  end
end

银行页面正在从用户那里获取所有必要的信息,例如信用卡号、卡到期日期等。我的应用程序没有对购买过程做任何事情,所有这些都发生在银行方面。

然后银行给我回了一堆关于支付过程的参数。如果付款成功,银行会将参数发布到我的/orders/success.html.erb,如果失败则发布到/order/fail.html.erb。

我有 2 个问题 =>

1) 无论响应成功还是失败,我都希望创建 Order 模型实例。似乎这应该通过控制器中的 create 方法发生,但它不起作用:/

2) 如何获取银行发送到我的 /fail 或 /success URL 的参数?我需要将它们放入我的应用程序并将它们作为 OrderTransaction 实例保存在我的数据库中。我可以在我的日志中看到这样的参数 =>

Started POST "/orders/fail" for 127.0.0.1 at 2014-06-01 13:40:28 +0300
Processing by OrdersController#fail as HTML
Parameters: 
  {
    "TRANID"=>"", 
    "Faturafirma"=>"OMÜ Uzaktan Eğitim Merkezi", 
    "islemtipi"=>"Auth", 
    "refreshtime"=>"5", 
    "lang"=>"tr", 
    "amount"=>"30", 
    "ACQBIN"=>"490740", 
    "clientIp"=>"193.140.28.145", 
    "name"=>"AKBANK", 
    "cardHolderName"=>"dsadas dasdsa", 
    "okUrl"=>"http://localhost:3000/orders/success",
    "storetype"=>"3d_pay_hosting",
    "Response"=>"Declined"
    ....
  }

数据库架构 =>

create_table "orders", force: true do |t|
  t.integer  "participation_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "order_transactions", force: true do |t|
  t.integer  "order_id"
  t.string   "clientip"
  t.string   "cardholdername"
  t.string   "response"
  t.string   "errmsg"
  ...
  t.datetime "created_at"
  t.datetime "updated_at"
end

Routes.rb =>

...
post 'orders/success' => 'orders#success'
post 'orders/fail' => 'orders#fail'
resources :orders, only: [:index, :new, :create]
...

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    建议: 将您的创作成功失败转移到模型中并传递给它。

     def success
       Order.create_from_params(order_params)
      end
    
      def fail
       Order.create_from_params(order_params)
      end
    

    然后使用响应拒绝等处理来自参数的成功失败。

    class Order<ActivewRecord::Base
    
    def self.create_from_params(order_params)
      self.create(inflatewithfields) && self.purchase if params[response'] == 'success'
    
      self.create(inflatewithfields) if params[response'] == 'Decline'
    
    end
    end
    

    【讨论】:

    • 我无法理解 "self.create(inflatewithfields) && self.purchase if params[response] == 'success'" 部分,你能举个例子吗?
    猜你喜欢
    • 2013-08-20
    • 2015-01-15
    • 2012-02-26
    • 2021-05-14
    • 2016-03-17
    • 2016-12-22
    • 2011-03-29
    • 1970-01-01
    • 2011-03-21
    相关资源
    最近更新 更多