7

我正在使用paypal-recurring gem来处理 Rails 应用程序中的定期付款。我的大部分代码来自这个优秀的Railscast,但我还想添加一个 payment_notification 模型来接受 IPN 回调并存储任何相关数据。这个Railscast介绍了如何设置通知。但是,我很难弄清楚如何将 paypal-recurring gem IPN 回调发送到我的 PaymentNotification 模型。

如何设置 :ipn_url 以正确地将 IPN 回调写入我的 PaymentNotification 模型。到目前为止,我尝试了以下方法:

1)添加ipn_url: "http://my-app-name.com/payment_notifications"到流程方法(选项下)或payment_notifications_url

2) 尝试此GitHub 问题页面底部建议的解决方案

3) 使用 Paypal 的即时支付通知 (IPN) 模拟器发送到“http://my-app-name.com/payment_notifications”,但出现错误:IPN 交付失败。HTTP 错误代码 401:未经授权

编辑

我已经能够成功模拟将 IPN 传送到我的 payment_notifications_url。现在我只需要弄清楚如何指向重复出现的 gem 将 ipn 发送到那里。

任何指针将不胜感激。以下是我当前的一些代码。如果我忘记了任何相关部分,请告诉我。

贝宝支付模式

 class PaypalPayment
   def initialize(subscription)
     @subscription = subscription
   end

   def checkout_details
     process :checkout_details
   end

   def checkout_url(options)
     process(:checkout, options).checkout_url
   end

   def make_recurring
     process :request_payment
     process :create_recurring_profile, period: :monthly, frequency: 1, start_at: Time.zone.now
   end

   def cancel_recurring
     process :cancel
   end

 private

   def process(action, options = {})
     options = options.reverse_merge(
       token: @subscription.paypal_payment_token,
       payer_id: @subscription.paypal_customer_token,
       description: @subscription.plan.name,
       amount: @subscription.plan.monthly_price,
       currency: "JPY"
     )
     response = PayPal::Recurring.new(options).send(action)
     raise response.errors.inspect if response.errors.present?
     response
   end
 end

PaymentNotifications 控制器

 class PaymentNotificationsController < ApplicationController
   protect_from_forgery :except => [:create]

   def create
     PaymentNotification.create!(:params => params, :status => params[:payment_status], :transaction_id => params[:txn_id])
     render :nothing => true
   end
 end
4

1 回答 1

5

我让它工作了。万一将来有人在使用 PayPal IPN 时遇到问题,以下是我做错的一些事情:

1)在我的订阅控制器中,我调用的是 save_with_payment 方法,而不是调用它if @subscription.saveif @subscription.save_with_payment

2)在我添加的过程方法中ipn_url: "https://my-app-name.com/payment_notifications",

   def process(action, options = {})
     options = options.reverse_merge(
       token: @subscription.paypal_payment_token,
       payer_id: @subscription.paypal_customer_token,
       description: @subscription.plan.name,
       amount: @subscription.plan.monthly_price,
       ipn_url: "https://my-app-name.com/payment_notifications",
       currency: "JPY"
    )
     response = PayPal::Recurring.new(options).send(action)
     raise response.errors.inspect if response.errors.present?
     response
   end

3) 在 PayPal 的开发人员沙箱中,单击“测试帐户”,然后单击“进入沙箱测试站点”橙色按钮。在那里,使用您的沙盒卖家凭据登录。进入“我的帐户”和“个人资料”后,在“销售偏好”下点击“即时付款通知偏好”。将通知 url 设置为与您设置的接收 IPN POST 的 url 匹配,并将消息传递设置为启用。

于 2012-10-01T05:59:51.867 回答