PayPal IPN - Paypal网站标准

时间:2016-06-21 13:15:49

标签: ruby-on-rails ruby paypal paypal-ipn

我一直在关注实施Paypal Standard付款的Railscast。 收到IPN通知后,我意识到我没有收到类似的商品细节 item_name, item_number, & quantity。 经过一番调查后,我发现我在控制器中错误地写了它们,因为PayPal将变量发送为item_name1item_number1quantity1item_name2item_number2quantity2等等

我已经安装了Railscasts。通知来自控制器

  PaymentNotificationsController < ApplicationController
    protect_from_forgery except: [:create]
     def create
       PaymentNotification.create!(params: params, 
       item_number: params[:item_number], item_name: params[:item_name], quantity: params[:quantity] 
       render nothing: true
     end

如果订单包含多个商品,则为item_name1item_name2item_name3等等。 命名这些变量的正确方法是什么,能够接受paypal IPN通知而无需为每个额外项添加列?

提前致谢!

1 个答案:

答案 0 :(得分:0)

您可以在致电params之前查看PaymentNotification.create!。使用循环检查params中的字段,可以计算有多少项,并将其所有属性提取到数组中。之后,您可以根据需要使用该阵列中的数据。

此代码假定PayPal从不发送包含字段item_name的响应 - 如果有一个项目,则仍会发送字段item_name1。我不知道这是不是真的。

ITEM_PARAM_PREFIXES = ["item_name", "item_number", "quantity"]

def extract_ipn_items_params(params)
  item_params = []

  loop do
    item_num_to_test = item_params.length + 1
    item_num_suffix = item_num_to_test.to_s
    possible_param_name = ITEM_PARAM_PREFIXES[0] + item_num_suffix
    if params.include?(possible_param_name)
      this_item_params = {}
      ITEM_PARAM_PREFIXES.each do |prefix|
        this_item_params[prefix] = params[prefix + item_num_suffix]
      end
      item_params.push this_item_params
    else
      return item_params
    end
  end
end

考虑一些像

这样的参数
{"item_name1"=>"cards", "item_number1"=>"123", "quantity1"=>"1",
 "item_name2"=>"book", "item_number2"=>"55", "quantity2"=>"2",
 "other_fields"=>"whatever"}

上面的方法应该返回这个哈希数组:

[{"item_name"=>"cards", "item_number"=>"123", "quantity"=>"1"},
 {"item_name"=>"book",  "item_number"=>"55",  "quantity"=>"2"}]

希望这种格式可以让您轻松地使用该信息做任何您需要的事情。例如,你可以在其上调用.length来计算有多少项,如果你想为每个项目单独通知,你可以迭代每个元素并将每个哈希传递给PaymentNotification.create!。 p>