Advertisement
  1. Code
  2. PayPal

Integración PayPal Parte 2: PayPal REST API

Scroll to top
Read Time: 21 min
This post is part of a series called PayPal Integration.
PayPal Integration Part 1: PayPal Payment Buttons
PayPal Integration Part 3: PayPal Webhooks

Spanish (Español) translation by Rodney Martinez (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

En este tutorial, voy a mostrarle cómo puede tomar pagos usando la PayPal REST API y C#. Todas las bibliotecas que tienen para diferentes lenguajes de programación como Ruby, Node.js, Python, PHP son muy similares, así que todos los conceptos aquí aplica para todas las bibliotecas.

Configuración del Proyecto

Para iniciar, he creado un proyecto MVC en Visual Studio 2015: File > New > Project, y seleccione ASP.NET Application.

Setting up a ProjectSetting up a ProjectSetting up a Project

Seleccione la plantilla ASP.NET 5 Web Application, la cual usa la nueva MVC 6. Es parecido a MVC 5 si es que usted ya está familiarizado con ella.

ASPNET MVC5ASPNET MVC5ASPNET MVC5

Como puede ver en la foto debajo, he añadido algunos archivos y carpetas para la solución. Las dos cosas más importantes son:

  1. En References, he eliminado el objeto DNX Core 5.0, que es el que nos permitiría ejecutar este proyecto en Mac OS X o Linux, pero la biblioteca de PayPal que necesitamos aún no ha sido actualizada.
  2. He añadido la carpeta "Services", en donde voy a envolver la lógica para las llamadas PayPal, así que podemos conservar los controladores bien y al mínimo.
Solution ExplorerSolution ExplorerSolution Explorer

Instale PayPal SDK usando NuGet. Clic-derecho sobre el nombre de la solución y seleccione Manage NuGet Packages, y luego busque "PayPal" para instalarlo.

Package ManagerPackage ManagerPackage Manager

Crear una PayPal App

Para integrar nuestra aplicación con PayPal, necesitamos navegar a PayPal Developers, y luego debajo de REST API apps, hacer clic en Create App.

PayPal Developer App DashboardPayPal Developer App DashboardPayPal Developer App Dashboard

Asigne un nombre a su aplicación y escoja una cuenta Sandbox Deleloper que esté asociada con la app. Para propósitos de prueba, luego podemos navegar a http://sandbox.paypal.com e iniciar sesión con los detalles de registro Sandbox para probar la cuenta PayPal y las transacciones.

PayPal Developer AppPayPal Developer AppPayPal Developer App

Después de hacer clic en Create App, veremos una pantalla de confirmación con el Client ID y Secret tokens.

PayPal App CredentialsPayPal App CredentialsPayPal App Credentials

Copie el clientId y and clientSecret tokens al archivo appsettings.json a como puede ver en la siguiente captura de pantalla:

Application Settings JSONApplication Settings JSONApplication Settings JSON

Probando los Pagos

PayPal ofrece una opción de prueba para pagos; Sandbox environment for testing. Puede crear compradores de prueba y cuentas de vendedores desde aquí. Cuando usted se registre, tendrá una cuenta Business en el Sandbox que está unido a su cuenta developer.

Para probar una nueva cuenta de prueba, inicie sesión en Developer site, y luego haga clic en la pestaña Dashboard y diríjase hacia Sandbox > Accounts. Aquí puede ver la lista de las cuentas de prueba si es que tiene alguna:

PayPal SandboxPayPal SandboxPayPal Sandbox

Si todavía no ha creado sus cuentas de prueba, entonces continúe y haga clic en Create Account, en la parte superior a la derecha, para crear al menos una cuenta personal de prueba y una cuenta de prueba business.

PayPal Test AccountPayPal Test AccountPayPal Test Account

Después de crear las cuentas de pruebas, puede iniciar sesión a través de www.sandbox.paypal.com con el correo electrónico y la clave de prueba que usted asigno a cada cuenta en el formulario anterior. Esto es muy útil para probar que cuando usted está comprando algo con la 'cuenta de prueba personal' los fondos están siendo transferidos a su 'cuenta de prueba business'. Ahora está listo para comenzar a integrar con PayPal y probar que los fondos son trasladados desde una cuenta hacia otra.

Único Pago PayPal

PayPal ofrece diferentes métodos de pago. Usted puede usar pagos directos de tarjetas de crédito, lo que significa que sus clientes no conseguirán ver la página de acceso PayPal o un resumen —ya que todo ocurre en su sitio web. Usted necesita ser un PCI obediente para esto y, le recomiendo usar Stripe, ya que sólo necesita SSL para usar su biblioteca JavaScript. Por otro lado, para tomar pagos por medio de PayPal payments, esto toma tres pasos:

  1. Especificar una información de pago para crear un pago; create a payment.
  2. Get payment approval, conseguir la aprobación del pago, para redireccionar a su cliente a PayPal para aprobar la transacción.
  3. Execute the payment, ejecutar el pago para capturar los fondos después PayPal redirecciona a su cliente de vuelta a su sitio.

En mi proyecto MVC, en la carpeta Services, he creado la clase PayPalPaymentService donde he agregado estos métodos:

1
public static Payment CreatePayment(string baseUrl, string intent)
2
{
3
    // ### Api Context

4
    // Pass in a `APIContext` object to authenticate 

5
    // the call and to send a unique request id 

6
    // (that ensures idempotency). The SDK generates

7
    // a request id if you do not pass one explicitly. 

8
    var apiContext = PayPalConfiguration.GetAPIContext();
9
10
    // Payment Resource

11
    var payment = new Payment()
12
    {
13
        intent = intent,    // `sale` or `authorize`

14
        payer = new Payer() { payment_method = "paypal" },
15
        transactions = GetTransactionsList(),
16
        redirect_urls = GetReturnUrls(baseUrl, intent)
17
    };
18
19
    // Create a payment using a valid APIContext

20
    var createdPayment = payment.Create(apiContext);
21
22
    return createdPayment;
23
}
24
25
private static List<Transaction> GetTransactionsList()
26
{
27
    // A transaction defines the contract of a payment

28
    // what is the payment for and who is fulfilling it. 

29
    var transactionList = new List<Transaction>();
30
31
    // The Payment creation API requires a list of Transaction; 

32
    // add the created Transaction to a List

33
    transactionList.Add(new Transaction()
34
    {
35
        description = "Transaction description.",
36
        invoice_number = GetRandomInvoiceNumber(),
37
        amount = new Amount()
38
        {
39
            currency = "USD",
40
            total = "100.00",       // Total must be equal to sum of shipping, tax and subtotal.

41
            details = new Details() // Details: Let's you specify details of a payment amount.

42
            {
43
                tax = "15",
44
                shipping = "10",
45
                subtotal = "75"
46
            }
47
        },
48
        item_list = new ItemList()
49
        {
50
            items = new List<Item>()
51
            {
52
                new Item()
53
                {
54
                    name = "Item Name",
55
                    currency = "USD",
56
                    price = "15",
57
                    quantity = "5",
58
                    sku = "sku"
59
                }
60
            }
61
        }
62
    });
63
    return transactionList;
64
}
65
66
private static RedirectUrls GetReturnUrls(string baseUrl, string intent)
67
{
68
    var returnUrl = intent == "sale" ? "/Home/PaymentSuccessful" : "/Home/AuthorizeSuccessful";
69
70
    // Redirect URLS

71
    // These URLs will determine how the user is redirected from PayPal 

72
    // once they have either approved or canceled the payment.

73
    return new RedirectUrls()
74
    {
75
        cancel_url = baseUrl + "/Home/PaymentCancelled",
76
        return_url = baseUrl + returnUrl
77
    };
78
}
79
80
public static Payment ExecutePayment(string paymentId, string payerId)
81
{
82
    // ### Api Context

83
    // Pass in a `APIContext` object to authenticate 

84
    // the call and to send a unique request id 

85
    // (that ensures idempotency). The SDK generates

86
    // a request id if you do not pass one explicitly. 

87
    var apiContext = PayPalConfiguration.GetAPIContext();
88
    
89
    var paymentExecution = new PaymentExecution() { payer_id = payerId };
90
    var payment = new Payment() { id = paymentId };
91
92
    // Execute the payment.

93
    var executedPayment = payment.Execute(apiContext, paymentExecution);
94
95
    return executedPayment;
96
}

Hay algunos parámetros que están siendo añadidos en esta llamada:

  • Intent: Con tres valores posibles: 'sale' para pagos inmediatos, 'authorize' para autorizar un pago para tomarlo después o 'order' para crear una orden. Cuando consigue la authorization para una pago para capturarlo después, usted tiene 3 días garantizado, aunque usted puede intentar capturar el pago hasta 29 días después.
  • Payer: La fuente de los fondos para este pago y los métodos de pago que están siendo usados —PayPal Wallet payment, Bank Direct Debit or Direct Credit card.
  • Transactions: Esto es utilizado para especificar la cantidad de pago y, de manera opcional, especificar los objetos por los cuales el cliente está pagando. Además, puede especificar el subtotal, el envío y los impuesto si es necesario.
  • Redirect URLs: Especificar la URL para la cual PayPal redireccionará sus clientes después de la transacción, para que usted pueda actualizar su base de datos y mostrar un mensaje de confirmación.

Las funciones anteriores pueden ser utilizadas desde su controladores como éste:

1
public IActionResult CreatePayment()
2
{
3
    var payment = PayPalPaymentService.CreatePayment(GetBaseUrl(), "sale");
4
    
5
    return Redirect(payment.GetApprovalUrl());
6
}
7
8
public IActionResult PaymentCancelled()
9
{
10
    // TODO: Handle cancelled payment

11
    return RedirectToAction("Error");
12
}
13
14
public IActionResult PaymentSuccessful(string paymentId, string token, string PayerID)
15
{
16
    // Execute Payment

17
    var payment = PayPalPaymentService.ExecutePayment(paymentId, PayerID);
18
19
    return View();
20
}

Como usted puede ver, he creado tres acciones:

  • CreatePayment: Esta es la acción que activa el pago. Está haciendo una llamada a PayPal para crear el pago Payment, luego está redireccionando al usuario a PayPal para aprobar la transacción.
  • PaymentSuccessful: Esta es la acción donde PayPal redirecciona de vuelta a nuestro cliente después de una pago exitoso. En este punto podemos ejecutar el pago para conseguir que los fondos sean transferidos a nuestra cuenta merchant.
  • PaymentCancelled: Esta acción es donde el usuario es redireccionado desde PayPal si el usuario cancela el proceso de aprobación. En este momento, probablemente usted querrá dar la opción al cliente para tratar de nuevo o para contactarse con usted.

Autorice un Pago para Capturarlo Después

Este escenario es muy parecido al caso anterior. Tal vez querrá usar este método si está tratando de tomar pedidos reservados para un producto que aún no está disponible. Los pasos para conseguir este pago son:

  1. Authorize the payment: autorizar el pago, el parámetro 'indent' para esta llamada debería ser 'authorize'.
  2. Capture the payment: o capturar el pago, tenga en cuenta que las autorizaciones están garantizadas para más de 3 días, aunque usted puede intentar capturar un pago hasta más de 29 días.

Para implementar este tipo de pagos, solamente he agregado un método nuevo a la clase PayPalPaymentService para capturar el pago:

1
public static Capture CapturePayment(string paymentId)
2
{
3
    var apiContext = PayPalConfiguration.GetAPIContext();
4
5
    var payment = Payment.Get(apiContext, paymentId);
6
    var auth = payment.transactions[0].related_resources[0].authorization;
7
8
    // Specify an amount to capture.  By setting 'is_final_capture' to true, all remaining funds held by the authorization will be released from the funding instrument.

9
    var capture = new Capture()
10
    {
11
        amount = new Amount()
12
        {
13
            currency = "USD",
14
            total = "4.54"
15
        },
16
        is_final_capture = true
17
    };
18
19
    // Capture an authorized payment by POSTing to

20
    // URI v1/payments/authorization/{authorization_id}/capture

21
    var responseCapture = auth.Capture(apiContext, capture);
22
23
    return responseCapture;
24
}

Luego, desde el HomeController, he agregado dos acciones nuevas para mostrar este tipo de pago:

1
public IActionResult AuthorizePayment()
2
{
3
    var payment = PayPalPaymentService.CreatePayment(GetBaseUrl(), "authorize");
4
    
5
    return Redirect(payment.GetApprovalUrl());
6
}
7
8
public IActionResult AuthorizeSuccessful(string paymentId, string token, string PayerID)
9
{
10
    // Capture Payment

11
    var capture = PayPalPaymentService.CapturePayment(paymentId);
12
13
    return View();
14
}
  • AuthorizePayment es la acción que activa el pago. Es parecida a la función anterior 'CreatePayment', pero estamos pasando 'authorize' como el parámetro 'intent' en este caso.
  • AuthorizeSuccessful es la acción donde su cliente será redireccionado después de haber aprobado con éxito el pago en PayPal. En este punto estoy capturando el pago, pero usted podría guardar el pago en su base de datos y capturar el pago cuando usted lo necesite.

En estos códigos de muestra, por simpleza, he codificado los valores de las variables de pago. En su aplicación real, probablemente usted las envolverá en métodos que tomaran todos estos valores como variables para que todo pueda ser ajustado de forma dinámica y reutilizarlo.

Suscripciones

A esto se le llama "Billing Plans" en PayPal,  Usando la PayPal REST API, usted puede crear, actualizar o eliminar planes de facturación, esto es algo que usted podría usar si usted quiere construir un panel de control para controlar estas cosas para su negocio.

Los pasos para crear cargos periódicos a sus clientes serían:

  1. Create a billing plan, crear un plan de facturación y; activate it, activarlo. Después de crear un Billing Plan, éste está en una condición CREATED. Necesita ser activado para hacer una consulta PATH.
  2. Create a billing agreement, crear un acuerdo de facturación y; execute it, ejecutarlo: La respuesta a la llamada para Create un acuerdo de facturación incluye los enlaces approval_url y execute_url. Necesitamos conseguir la aprobación para el acuerdo de facturación y luego ejecutar el acuerdo de facturación.

Planes de Facturación

Crear un Plan de Facturación

Crear un plan de facturación que defina los periodos de facturación. Esto es un resumen de los parámetros que necesitamos pasar para crear un plan.

  • Name: Nombre del plan de facturación.
  • Description: Una descripción del plan de facturación.
  • Type: Los valores permitidos son 'FIXED'; para un número fijo de pagos periódicos, o 'INFINITE' para un plan que se repite hasta que es cancelado manualmente.
  • Merchant Preferences: Este es un objeto que específica las preferencias tales como la configuración de la tarifa, máximos intentos fallados de un pago, devolver una URL, cancelar una URL, notificar URL, donde PayPal redireccionará al usuario después de un pago.
  • Payment Definitions: Un objeto Array de las definiciones de pago para este plan. Normalmente, este array tendría uno o dos definiciones de pagos. Si queremos ofrecer una versión gratuita o una prueba a un precio de descuento, entonces configuramos dos definiciones de pagos. El primero será la definición para el período de prueba, y la segunda definición sería para un pago regular. Las propiedades para una definición de pago Payment Definition son name, type (prueba o regular), frequency (día, semana, mes, año), frequency interval (si ajustamos la frequency a 'WEEK', es decir, semana, y la frequency interval a '1', entonces estamos definiendo un pago semanal), amount, la cantidad que se va a cargar a un cliente y cycles, que es el número total de pagos. Charge Models, es para especificar el costo de envío y el impuesto adicional para el valor de la cantidad para el plan.

Este es un fragmento de código que muestra como crear un Billing Plan:

1
// Define the plan and attach the payment definitions and merchant preferences.

2
// More Information: https://developer.paypal.com/webapps/developer/docs/api/#create-a-plan

3
var billingPlan = new Plan
4
{
5
    name = "Tuts+ Plus",
6
    description = "Monthly plan for courses.",
7
    type = "fixed",
8
    // Define the merchant preferences.

9
    // More Information: https://developer.paypal.com/webapps/developer/docs/api/#merchantpreferences-object

10
    merchant_preferences = new MerchantPreferences()
11
    {
12
        setup_fee = GetCurrency("0"), // $0

13
        return_url = "returnURL", // Retrieve from config

14
        cancel_url = "cancelURL", // Retrieve from config

15
        auto_bill_amount = "YES",
16
        initial_fail_amount_action = "CONTINUE",
17
        max_fail_attempts = "0"
18
    },
19
    payment_definitions = new List<PaymentDefinition>
20
    {
21
        // Define a trial plan that will only charge $9.99 for the first

22
        // month. After that, the standard plan will take over for the

23
        // remaining 11 months of the year.

24
        new PaymentDefinition()
25
        {
26
            name = "Trial Plan",
27
            type = "TRIAL",
28
            frequency = "MONTH",
29
            frequency_interval = "1",
30
            amount = GetCurrency("0"), // Free for the 1st month

31
            cycles = "1",
32
            charge_models = new List<ChargeModel>
33
            {
34
                new ChargeModel()
35
                {
36
                    type = "TAX",
37
                    amount = GetCurrency("1.65") // If we need to charge Tax

38
                },
39
                new ChargeModel()
40
                {
41
                    type = "SHIPPING",
42
                    amount = GetCurrency("9.99") // If we need to charge for Shipping

43
                }
44
            }
45
        },
46
        // Define the standard payment plan. It will represent a monthly

47
        // plan for $19.99 USD that charges once month for 11 months.

48
        new PaymentDefinition
49
        {
50
            name = "Standard Plan",
51
            type = "REGULAR",
52
            frequency = "MONTH",
53
            frequency_interval = "1",
54
            amount = GetCurrency("15.00"),
55
            // > NOTE: For `IFNINITE` type plans, `cycles` should be 0 for a `REGULAR` `PaymentDefinition` object.

56
            cycles = "11",
57
            charge_models = new List<ChargeModel>
58
            {
59
                new ChargeModel
60
                {
61
                    type = "TAX",
62
                    amount = GetCurrency("2.47")
63
                },
64
                new ChargeModel()
65
                {
66
                    type = "SHIPPING",
67
                    amount = GetCurrency("9.99")
68
                }
69
            }
70
        }
71
    }
72
};
73
74
// Get PayPal Config

75
var apiContext = PayPalConfiguration.GetAPIContext();
76
77
// Create Plan

78
plan.Create(apiContext);

Un plan de facturación recién creado está en una condición CREATED. Actívelo para la condición ACTIVE, para que sus clientes puedan suscribirse al plan. Para activar el plan, necesitamos hacer un PATCH request:

1
// Activate the plan

2
var patchRequest = new PatchRequest()
3
{
4
    new Patch()
5
    {
6
        op = "replace",
7
        path = "/",
8
        value = new Plan() { state = "ACTIVE" }
9
    }
10
};
11
plan.Update(apiContext, patchRequest);

Como puede ver, las bibliotecas PayPal son una envoltura directa sobre su REST API, lo cual es bueno, pero la API también es muy compleja comparada a otras como Stripe. Por esta razón, es una muy buena opción envolver por completo la comunicación PayPal en objetos con APIs claras y sencillas par nuestras aplicaciones. Aquí puede ver lo que esto código envolvió en múltiples funciones tomando parámetros como:

1
public static Plan CreatePlanObject(string planName, string planDescription, string returnUrl, string cancelUrl,
2
    string frequency, int frequencyInterval, decimal planPrice,
3
    decimal shippingAmount = 0, decimal taxPercentage = 0, bool trial = false, int trialLength = 0, decimal trialPrice = 0)
4
{
5
    // Define the plan and attach the payment definitions and merchant preferences.

6
    // More Information: https://developer.paypal.com/docs/rest/api/payments.billing-plans/

7
    return new Plan
8
    {
9
        name = planName,
10
        description = planDescription,
11
        type = PlanType.Fixed,
12
13
        // Define the merchant preferences.

14
        // More Information: https://developer.paypal.com/webapps/developer/docs/api/#merchantpreferences-object

15
        merchant_preferences = new MerchantPreferences()
16
        {
17
            setup_fee = GetCurrency("1"),
18
            return_url = returnUrl,
19
            cancel_url = cancelUrl,
20
            auto_bill_amount = "YES",
21
            initial_fail_amount_action = "CONTINUE",
22
            max_fail_attempts = "0"
23
        },
24
        payment_definitions = GetPaymentDefinitions(trial, trialLength, trialPrice, frequency, frequencyInterval, planPrice, shippingAmount, taxPercentage)
25
    };
26
}
27
28
private static List<PaymentDefinition> GetPaymentDefinitions(bool trial, int trialLength, decimal trialPrice,
29
    string frequency, int frequencyInterval, decimal planPrice, decimal shippingAmount, decimal taxPercentage)
30
{
31
    var paymentDefinitions = new List<PaymentDefinition>();
32
33
    if (trial)
34
    {
35
        // Define a trial plan that will charge 'trialPrice' for 'trialLength'

36
        // After that, the standard plan will take over.

37
        paymentDefinitions.Add(
38
            new PaymentDefinition()
39
            {
40
                name = "Trial",
41
                type = "TRIAL",
42
                frequency = frequency,
43
                frequency_interval = frequencyInterval.ToString(),
44
                amount = GetCurrency(trialPrice.ToString()),
45
                cycles = trialLength.ToString(),
46
                charge_models = GetChargeModels(trialPrice, shippingAmount, taxPercentage)
47
            });
48
    }
49
50
    // Define the standard payment plan. It will represent a 'frequency' (monthly, etc)

51
    // plan for 'planPrice' that charges 'planPrice' (once a month) for #cycles.

52
    var regularPayment = new PaymentDefinition
53
    {
54
        name = "Standard Plan",
55
        type = "REGULAR",
56
        frequency = frequency,
57
        frequency_interval = frequencyInterval.ToString(),
58
        amount = GetCurrency(planPrice.ToString()),
59
        // > NOTE: For `IFNINITE` type plans, `cycles` should be 0 for a `REGULAR` `PaymentDefinition` object.

60
        cycles = "11",
61
        charge_models = GetChargeModels(trialPrice, shippingAmount, taxPercentage)
62
    };
63
    paymentDefinitions.Add(regularPayment);
64
65
    return paymentDefinitions;
66
}
67
68
private static List<ChargeModel> GetChargeModels(decimal planPrice, decimal shippingAmount, decimal taxPercentage)
69
{
70
    // Create the Billing Plan

71
    var chargeModels = new List<ChargeModel>();
72
    if (shippingAmount > 0)
73
    {
74
        chargeModels.Add(new ChargeModel()
75
        {
76
            type = "SHIPPING",
77
            amount = GetCurrency(shippingAmount.ToString())
78
        });
79
    }
80
    if (taxPercentage > 0)
81
    {
82
        chargeModels.Add(new ChargeModel()
83
        {
84
            type = "TAX",
85
            amount = GetCurrency(String.Format("{0:f2}", planPrice * taxPercentage / 100))
86
        });
87
    }
88
89
    return chargeModels;
90
}

Actualizando el Plan de Facturación

Usted puede actualizar la información para un plan de facturación que ya existe por medio de una solicitud 'PATCH'. Esta es una función que envuelve esa llamada:

1
public static void UpdateBillingPlan(string planId, string path, object value)
2
{
3
    // PayPal Authentication tokens

4
    var apiContext = PayPalConfiguration.GetAPIContext();
5
6
    // Retrieve Plan

7
    var plan = Plan.Get(apiContext, planId);
8
9
    // Activate the plan

10
    var patchRequest = new PatchRequest()
11
    {
12
        new Patch()
13
        {
14
            op = "replace",
15
            path = path,
16
            value = value
17
        }
18
    };
19
    plan.Update(apiContext, patchRequest);
20
}

Para actualizar la descripción del Billing Plan, plan de facturación, entonces podemos llamar esta función y pasar los parámetros correctos:

1
UpdateBillingPlan(
2
    planId: "P-5FY40070P6526045UHFWUVEI", 
3
    path: "/", 
4
    value: new Plan { description = "new description" });

Borrar un Plan de Facturación

Lo ideal, cuando no quiera aceptar clientes nuevos a un plan de facturación 'Billing Plan', es que querrá actualizarlo a la condición 'INACTIVE'. Esto no afectará a los acuerdos de facturación que ya existen en este plan: Esto se puede hacer simplemente haciendo una llamada a la función UpdateBillingPlan:

1
UpdateBillingPlan(
2
    planId: "P-5FY40070P6526045UHFWUVEI",
3
    path: "/",
4
    value: new Plan { state = "INACTIVE" });

Acuerdos de Facturación

Creando un Acuerdo de Facturación

Una vez que ha creado uno o más planes de facturación, querrá empezar que los clientes se inscriban a sus planes de suscripción. Para hacer esto, necesita coleccionar los detalles de sus clientes y hacer una solicitud a PayPal. Para probar esta funcionalidad, he agregado varias acciones al HomeController:

1
public IActionResult Subscribe()
2
{
3
    var plan = PayPalSubscriptionsService.CreateBillingPlan("Tuts+ Plan", "Test plan for this article", GetBaseUrl());
4
5
    var subscription = PayPalSubscriptionsService.CreateBillingAgreement(plan.id, 
6
        new PayPal.Api.ShippingAddress
7
        {
8
            city = "London", 
9
            line1 = "line 1",
10
            postal_code = "SW1A 1AA",
11
            country_code = "GB"
12
        }, "Pedro Alonso", "Tuts+", DateTime.Now);
13
    
14
    return Redirect(subscription.GetApprovalUrl());
15
}
16
17
public IActionResult SubscribeSuccess(string token)
18
{
19
    // Execute approved agreement

20
    PayPalSubscriptionsService.ExecuteBillingAgreement(token);
21
22
    return View();
23
}
24
25
public IActionResult SubscribeCancel(string token)
26
{
27
    // TODO: Handle cancelled payment

28
    return RedirectToAction("Error");
29
}
  • Subscribe: Esta es la primera acción que es llamada. Esto crea una prueba de un plan de facturación 'Billing Plan' y luego una acuerdo de facturación 'Billing Agreement' (suscripción) para que ese plan sea creado y el usuario sea redireccionado hacia PayPal para confirmar el pago.
  • SubscribeSuccess: Esta acción es uno usado como 'Return URL' después de una suscripción exitosa. El token identificador del acuerdo es pasado en la cadena de consulta, y usamos este token para ejecutar el acuerdo de facturación y activarlo.
  • SubscribeCancel: Esta acción es una que usamos para 'Cancel URL'. Si por alguna razón el pago falla, o su cliente cancela el pago en PayPal, entonces el usuario es llevado a esta acción y usted necesita controlar esto. Tal vez ofrecer la opción de probar otra vez.

Como puede ver en el fragmento de código anterior, he envuelto la mayor parte de la funcionalidad en varios métodos. El primero método es "CreateBillingPlan", que ya explicamos como funciona en la sección anterior. El segundo método es "CreateBillingAgreement" que es usado para suscribir un usuario a un plan:

1
public static Agreement CreateBillingAgreement(string planId, ShippingAddress shippingAddress, 
2
    string name, string description, DateTime startDate)
3
{
4
    // PayPal Authentication tokens

5
    var apiContext = PayPalConfiguration.GetAPIContext();
6
7
    var agreement = new Agreement()
8
    {
9
        name = name,
10
        description = description,
11
        start_date = startDate.ToString("yyyy-MM-ddTHH:mm:ss") + "Z",
12
        payer = new Payer() { payment_method = "paypal" },
13
        plan = new Plan() { id = planId },
14
        shipping_address = shippingAddress
15
    };
16
    
17
    var createdAgreement = agreement.Create(apiContext);
18
    return createdAgreement;
19
}

El tercer método es "ExecuteBillingAgreement". Después de una suscripción exitosa aprobada, usamos el token devuelto para activar la suscripción.

1
public static void ExecuteBillingAgreement(string token)
2
{
3
    // PayPal Authentication tokens

4
    var apiContext = PayPalConfiguration.GetAPIContext();
5
6
    var agreement = new Agreement() { token = token };
7
    var executedAgreement = agreement.Execute(apiContext);
8
}

Suspender un Acuerdo de Facturación

Use este método para suspender un acuerdo:

1
public static void SuspendBillingAgreement(string agreementId)
2
{
3
    var apiContext = PayPalConfiguration.GetAPIContext();
4
5
    var agreement = new Agreement() { id = agreementId };
6
    agreement.Suspend(apiContext, new AgreementStateDescriptor()
7
        { note = "Suspending the agreement" });
8
}

Reactivar un Acuerdo de Facturación

Este método es muy parecido al anterior:

1
public static void ReactivateBillingAgreement(string agreementId)
2
{
3
    var apiContext = PayPalConfiguration.GetAPIContext();
4
5
    var agreement = new Agreement() { id = agreementId };
6
    agreement.ReActivate(apiContext, new AgreementStateDescriptor()
7
        { note = "Reactivating the agreement" });
8
}

Cancelar un Acuerdo de Facturación

Use esta función para cancelar un plan:

1
public static void CancelBillingAgreement(string agreementId)
2
{
3
    var apiContext = PayPalConfiguration.GetAPIContext();
4
5
    var agreement = new Agreement() { id = agreementId };
6
    agreement.Cancel(apiContext, new AgreementStateDescriptor()
7
        { note = "Cancelling the agreement" });
8
}

Actualice un Acuerdo de Facturación

Esta opción es muy limitada y lo que esperaría desde esta llamada es la posibilidad de cambiar el plan de suscripción, para actualizaciones o bajar la categoría de un cliente. Esto no tiene respaldo en una llamada única como ocurre en Stripe. Necesita manejar este escenario para cancelar el acuerdo actual y crear uno nuevo para actualizaciones o para cambio de categoría. No es lo ideal, pero podría cambiar en el futuro.

Conclusión

Esto es un resumen de las funciones más comunes que las personas pueden usar para integrar con PayPal. Su API es mucho mayor que los métodos de integración que se han explicado en este artículo, además, usted puede emitir reembolsos y reembolsos parciales, y éstos tienen muchas opciones diferentes para muchos casos en las muestras que hemos abordado en este artículo. Si está más interesado en conseguir más detalles acerca de cualquier integración específica, por favor, deje una sugerencia en los comentarios.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.