7

Rails アプリで定期的な支払いを処理するために、 paypal-recurring gemを使用しています。私のコードの大部分はこの優れたRailscastからのものですが、Payment_notification モデルを追加して、IPN コールバックを受け入れ、関連データを保存したいと考えています。このRailscast では、通知の設定方法について説明します。しかし、paypal の定期的な 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: 権限がありません

編集

payment_notifications_url への IPN の配信を正常にシミュレートできました。ここで、繰り返しの宝石をポイントしてそこにipnを送信する方法を理解する必要があります。

任意のポインタをいただければ幸いです。以下は私の現在のコードの一部です。関連する部分を忘れている場合は、お知らせください。

Paypal支払いモデル

 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

私はそれを動かしました。将来誰かがPayPalIPNで問題に遭遇した場合に備えて、私が間違っていたことがいくつかあります。

1)サブスクリプションコントローラーでは、if @subscription.save代わりに呼び出しif @subscription.save_with_paymentていたので、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の開発者サンドボックスで、[テストアカウント]をクリックしてから、[サンドボックステストサイトに入る]オレンジ色のボタンをクリックします。そこに到達したら、サンドボックス販売者の資格情報を使用してログインします。中に入ると、「マイアカウント」と「プロファイル」に移動し、「販売設定」の下で「即時支払い通知設定」をクリックします。IPN POSTを受信するために設定したURLと一致するように通知URLを設定し、メッセージ配信を有効に設定します。

于 2012-10-01T05:59:51.867 に答える