贝宝 IPN - 贝宝网站标准

PayPal IPN - Paypal Website Standard

我一直在关注 Railscasts 如何实施 Paypal 标准支付。 在收到 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等。 命名这些变量的正确方法是什么,以便能够在不为每个额外项目添加一列的情况下接受贝宝 IPN 通知?

提前致谢!

你可以在调用PaymentNotification.create!之前查看params。使用循环检查 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"}

上述方法应该return这个哈希数组:

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

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