【问题标题】:PayPal IPN - Paypal Website StandardPayPal IPN - 贝宝网站标准
【发布时间】:2016-10-23 01:37:47
【问题描述】:

我一直在关注 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 等。 命名这些变量的正确方法是什么,以便能够在不为每个额外项目添加列的情况下接受 paypal IPN 通知?

提前致谢!

【问题讨论】:

  • 您可以在致电PaymentNotification.create! 之前查看params。执行if params.include?(:item_name1) 来检查是否有这样的键,如果有,通过循环item_name2item_name3 等参数来检查有多少项,直到找到缺少的参数。
  • @RoryO'Kane 如果你不介意,你能写一个例子作为答案吗?

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


【解决方案1】:

您可以在致电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"}

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

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

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

【讨论】:

  • 我使用了before_action :extract_ipn_items_params, only: [:create] 来触发它,但我得到了ArgumentError (wrong number of arguments (0 for 1)): app/controllers/payment_notifications_controller.rb:7:in extract_ipn_items_params'`
  • @Rails_learner 该错误意味着该函数使用零参数调用,即使它需要一个参数 (params)。你明白了,因为我给你的函数被设计为从控制器手动调用并传递 params 哈希,而不是作为模型的 before_action 调用,其中没有 params。我对您的应用了解得不够多,无法实际编写您的控制器操作,但我假设您想编写 items_params = extract_ipn_items_params(params),然后按照我在回答的最后一段中建议的那样对结果进行一些处理。
  • 这是我的控制器现在的样子,如何手动触发该功能? >>https://www.dropbox.com/s/2f508296wb378wc/sublime.png?dl=0
  • @Rails_learner 就像我已经写过的一样,只需在create 方法中写入items_params = extract_ipn_items_params(params) 行。然后更改后面的行以使用该新变量items_params。我无法确定这些行应该是什么,因为您从未确切说明为什么要以这种方式转换 item_name1 参数。但从你的截图来看,我猜你想为每个项目创建一个PaymentNotification。如果是这样,添加items_params.each do |item_params| … end,并在里面放PaymentNotification.create!(product_title: item_params[:item_name], …)
  • @Rails_learner 顺便说一句,如果你想通过链接分享代码 sn-p,最好使用“pastebin”网站,例如GitHub Gist,而不是上传截图。像 Gist 这样的网站可以让读者增加文本大小,而不会让文本变得太宽而无法在屏幕上显示,并让读者复制和粘贴文本以尝试运行它或发布经过编辑的版本。
猜你喜欢
  • 2011-06-23
  • 2013-12-22
  • 2014-09-17
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 2010-12-22
  • 2012-11-23
  • 2015-06-16
相关资源
最近更新 更多