我一直在关注实施Paypal Standard付款的Railscast。
收到IPN通知后,我意识到我没有收到类似的商品细节
item_name, item_number, & quantity
。
经过一番调查后,我发现我在控制器中错误地写了它们,因为PayPal将变量发送为item_name1
,item_number1
,quantity1
,item_name2
,item_number2
, quantity2
等等
我已经安装了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_name1
,item_name2
,item_name3
等等。
命名这些变量的正确方法是什么,能够接受paypal IPN通知而无需为每个额外项添加列?
提前致谢!
答案 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>