2012-09-30 24 views
7

Estoy usando el paypal-recurring gem para manejar pagos recurrentes en una aplicación de Rails. La mayoría de mi código proviene de este excelente Railscast, pero también deseo agregar un modelo de notificación de pago para aceptar la devolución de llamada IPN y almacenar cualquier dato relevante. Este Railscast repasa cómo configurar las notificaciones. Sin embargo, me está resultando difícil descifrar cómo enviar la devolución de llamada IPN de la gema recurrente de paypal a mi modelo PaymentNotification.Rieles: manejo de la devolución de llamada del IPN de PayPal usando la gema recurrente de paypal

Cómo puedo configurar: ipn_url para escribir correctamente la devolución de llamada IPN a mi modelo PaymentNotification. Probé la siguiente hasta el momento:

1) Adición de ipn_url: "http://my-app-name.com/payment_notifications" con el método de proceso (en las opciones) o payment_notifications_url

2) Tratar la solución sugerida en la parte inferior de esta GitHub issue page

3) Uso de instantánea de PayPal Simulador de notificación de pago (IPN) para enviar a "http://my-app-name.com/payment_notifications", pero aparece un error: Falló la entrega de IPN. código de error HTTP 401: no autorizado

EDITAR

he sido capaz de simular con éxito la entrega del IPN a mi payments_notifications_url. Ahora solo necesito descubrir cómo señalar la gema recurrente para enviar el ipn a allí.

Cualquier puntero sería muy apreciado. A continuación se muestra parte de mi código actual. Si me olvido de alguna pieza relevante, házmelo saber.

PaypalPayment Modelo

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 controlador

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 
+0

puede ayudarme por favor aquí, estoy un poco confundido sobre cómo cancelar la suscripción de PayPal. http://stackoverflow.com/questions/21372793/link-to-paypal-to-cancel-paypal-recurring-rails –

Respuesta

5

Lo tengo trabajo. En caso de que alguien en el futuro se mete en problemas con PayPal IPN, aquí hay algunas cosas que tenía mal:

1) en mi Controlador Suscripciones estaba llamando if @subscription.save en lugar de if @subscription.save_with_payment así fue en realidad ni siquiera se llama el método save_with_payment.

2) En el método de proceso que añade 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) En sandbox de desarrolladores de PayPal, haga clic en '' cuentas de prueba y haga clic en el botón naranja 'Sandbox Test Site Enter'. Una vez allí, inicie sesión con sus credenciales de vendedor sandbox. Una vez dentro, vaya a 'Mi cuenta' y 'Perfil' y en 'Preferencias de venta', haga clic en 'Preferencias de notificación de pago instantánea'. Configure su url de notificación para que coincida con la url que configuró para recibir IPN POST y configure la entrega de mensajes en habilitada.