En este tutorial, le mostraré cómo puede realizar pagos utilizando la API REST de PayPal y C #. Todas las bibliotecas que tienen para diferentes idiomas como Ruby, Node.js, Python, PHP son muy similares, por lo que todos los conceptos aquí se aplican a todas las bibliotecas..
Para empezar, he creado un proyecto MVC en Visual Studio 2015: Archivo> Nuevo> Proyecto, y seleccione Aplicación ASP.NET.
Selecciona el Aplicación Web ASP.NET 5 Plantilla, que utiliza el nuevo MVC 6. Es similar a MVC 5 si está familiarizado con él.
Como puede ver en la foto de abajo, he agregado algunos archivos y carpetas a la solución. Las dos cosas principales a tener en cuenta son:
Instalar PayPal SDK utilizando NuGet. Botón derecho del ratón en el nombre de la solución y seleccione Administrar paquetes de NuGet, y luego busque "PayPal" e instálelo.
Para integrar nuestra aplicación con PayPal, debemos navegar a los Desarrolladores de PayPal, y luego debajo de Aplicaciones API REST, haga clic en Crear aplicación.
Asigne un nombre a su aplicación y elija una cuenta de desarrollador de sandbox asociada con la aplicación. Para propósitos de prueba, podemos navegar a http://sandbox.paypal.com e iniciar sesión con los detalles de inicio de sesión de sandbox para ver las transacciones y la cuenta de PayPal de prueba.
Después de hacer clic en Crear aplicación, Vemos la pantalla de confirmación con el ID de cliente y los tokens secretos..
Copie los tokens clientId y clientSecret a appsettings.json
, Como puedes ver en la siguiente captura de pantalla:
PayPal proporciona un entorno de Sandbox para pruebas. Puede crear cuentas de comprador y vendedor de prueba desde allí. Cuando te registres, tendrás una cuenta Business en el Sandbox que está vinculada a tu cuenta de desarrollador..
Para crear una nueva cuenta de prueba, inicie sesión en el sitio del desarrollador y luego haga clic en Tablero pestaña y navega hasta Sandbox> Cuentas. Aquí puede ver la lista de cuentas de prueba si tiene alguna:
Si aún no ha creado sus cuentas de prueba, siga adelante y haga clic en Crear una cuenta, en la parte superior derecha, para crear al menos una cuenta personal de prueba y una cuenta comercial de prueba.
Después de crear las cuentas de prueba, puede iniciar sesión a través de www.sandbox.paypal.com con la dirección de correo electrónico de prueba y la contraseña que asignó a cada cuenta en el formulario anterior. Esto es realmente útil para probar que cuando compra algo con su 'cuenta de prueba personal', los fondos se transfieren a su 'cuenta de prueba'. Ahora está listo para comenzar a integrarse con PayPal y probar que los fondos se están moviendo de una cuenta a otra.
PayPal ofrece diferentes métodos de pago. Puede usar pagos directos con tarjeta de crédito, lo que significa que sus clientes no pueden ver la página de inicio de sesión de PayPal o su resumen, todo sucede en su sitio web. Necesitas ser compatible con PCI para esto, y recomiendo usar Stripe, ya que solo necesitas SSL usando su biblioteca de JavaScript. Por otro lado, para realizar pagos a través de pagos de PayPal, toma tres pasos:
En mi proyecto MVC, en el Servicios carpeta, he creado la clase PayPalPaymentService en la que he agregado estos métodos:
Public static Payment CreatePayment (string baseUrl, string intent) // ### Api Context // Pase un objeto 'APIContext' para autenticar // la llamada y enviar un id de solicitud único // (que garantiza la idempotencia). El SDK genera // un ID de solicitud si no pasa uno explícitamente. var apiContext = PayPalConfiguration.GetAPIContext (); // Recurso de pago var payment = new Payment () intent = intent, // 'sale' o 'authorize' payer = new Payer () payment_method = "paypal", transaction = GetTransactionsList (), redirect_urls = GetReturnUrls (baseUrl , intención); // Crear un pago utilizando un APIContext válido var createdPayment = payment.Create (apiContext); retorno creadoPago; lista estática privadaGetTransactionsList () // Una transacción define el contrato de un pago // para qué es el pago y quién lo está cumpliendo. var transactionList = nueva lista (); // La API de creación de pagos requiere una lista de transacciones; // agregar la Transacción creada a una lista transactionList.Add (new Transaction () description = "Descripción de la transacción.", invoice_number = GetRandomInvoiceNumber (), cantidad = new Amount () currency = "USD", total = "100.00" , // El total debe ser igual a la suma de envío, impuestos y subtotal. Detalles = nuevo Detalles () // Detalles: le permite especificar los detalles de un monto de pago. Impuesto = "15", envío = "10", subtotal = "75", item_list = new ItemList () items = new List - () nuevo artículo () nombre = "Nombre del artículo", moneda = "USD", precio = "15", cantidad = "5", sku = "sku"); return transactionList; Private static RedirectUrls GetReturnUrls (string baseUrl, string intent) var returnUrl = intent == "sale"? "/ Home / PaymentSuccessful": "/ Home / AuthorizeSuccessful"; // Redirigir URLs // Estas URL determinarán cómo se redirige al usuario desde PayPal // una vez que hayan aprobado o cancelado el pago. return new RedirectUrls () cancel_url = baseUrl + "/ Home / PaymentCancelled", return_url = baseUrl + returnUrl; pago estático público ExecutePayment (string paymentId, string payerId) // ### Api Context // Pase un objeto 'APIContext' para autenticar // la llamada y enviar un id de solicitud único // (que garantiza la idempotencia). El SDK genera // un ID de solicitud si no pasa uno explícitamente. var apiContext = PayPalConfiguration.GetAPIContext (); var paymentExecution = new PaymentExecution () payer_id = payerId; var payment = new Payment () id = paymentId; // Ejecutar el pago. var executPayment = payment.Execute (apiContext, paymentExecution); pago ejecutado de vuelta;
Hay algunos parámetros que se pasan en esta llamada:
Las funciones anteriores se pueden utilizar desde su controlador de esta manera:
público IActionResult CreatePayment () var payment = PayPalPaymentService.CreatePayment (GetBaseUrl (), "sale"); return Redirect (payment.GetApprovalUrl ()); público IActionResult PaymentCancelled () // TODO: Manejar devolución de pago cancelada RedirectToAction ("Error"); público IActionResult PaymentSuccessful (cadena ID de pago, cadena token, cadena PayerID) // Ejecutar Pago var payment = PayPalPaymentService.ExecutePayment (paymentId, PayerID); volver View ();
Como puedes ver, he creado tres acciones:
Este escenario es muy similar al caso anterior. Es posible que desee utilizar este método si está intentando realizar pedidos anticipados para un producto que aún no está disponible. Los pasos para obtener este pago son:
Para implementar este tipo de pago, solo he agregado un nuevo método a la clase PayPalPaymentService para capturar el pago:
CapturePayment estático público CapturePayment (string paymentId) var apiContext = PayPalConfiguration.GetAPIContext (); var payment = Payment.Get (apiContext, paymentId); var auth = payment.transactions [0] .related_resources [0] .authorization; // Especifique una cantidad para capturar. Al establecer 'is_final_capture' en verdadero, todos los fondos restantes en poder de la autorización se liberarán del instrumento de financiamiento. var captura = nueva Captura () cantidad = nueva Cantidad () moneda = "USD", total = "4.54", is_final_capture = true; // Capturar un pago autorizado mediante POSTing a // URI v1 /pagos/autorization/ permission_id ID / capture var responseCapture = auth.Capture (apiContext, capture); return responseCapture;
Luego, desde el HomeController, he agregado dos nuevas acciones para mostrar este tipo de pago:
público IActionResult AuthorizePayment () var payment = PayPalPaymentService.CreatePayment (GetBaseUrl (), "autorize"); return Redirect (payment.GetApprovalUrl ()); público IActionResult AuthorizeSuccessful (string paymentId, string token, string PayerID) // Capture Payment var capture = PayPalPaymentService.CapturePayment (paymentId); volver View ();
En estos ejemplos de código, por simplicidad, he codificado los valores de las variables de pago. En su aplicación real, probablemente los envolverá en métodos que toman todos esos valores como variables para que todo se pueda configurar dinámicamente y reutilizarse..
Esto se denomina "Planes de facturación" en PayPal: puede crear planes de pago recurrente y suscribir a sus clientes a un plan de facturación mediante la creación de un acuerdo de facturación. Mediante la API REST de PayPal, puede crear, actualizar o eliminar planes de facturación; Esto es algo que podría usar si desea crear un panel de administración para administrar estas cosas para su negocio..
Los pasos para crear cargos recurrentes para sus clientes serían:
Crea un plan de facturación que defina los periodos de facturación. Este es un resumen de los parámetros que debemos pasar para crear un plan..
Este es un fragmento de código que muestra cómo crear un plan de facturación:
// Defina el plan y adjunte las definiciones de pago y las preferencias del comerciante. // Más información: https://developer.paypal.com/webapps/developer/docs/api/#create-a-plan var billingPlan = plan nuevo name = "Tuts + Plus", description = "Plan mensual de cursos. ", escriba =" arreglado ", // Defina las preferencias del comerciante. // Más información: https://developer.paypal.com/webapps/developer/docs/api/#merchantpreferences-object merchant_preferences = new MerchantPreferences () setup_fee = GetCurrency ("0"), // $ 0 return_url = "returnURL ", // Recuperar de config cancel_url =" cancelURL ", // Recuperar de config auto_bill_amount =" YES ", initial_fail_amount_action =" CONTINUE ", max_fail_attempts =" 0 ", payment_definitions = new List// Defina un plan de prueba que solo cobrará $ 9.99 por el primer // mes. Después de eso, el plan estándar asumirá los // meses restantes del año. new PaymentDefinition () name = "Plan de prueba", escriba = "TRIAL", frequency = "MONTH", frequency_interval = "1", cantidad = GetCurrency ("0"), // Gratis para los ciclos del 1er mes = "1 ", charge_models = nueva lista new ChargeModel () type = "TAX", amount = GetCurrency ("1.65") // Si necesitamos cobrar Impuestos, new ChargeModel () type = "SHIPPING", amount = GetCurrency ("9.99") / / Si necesitamos cobrar por el envío, // Defina el plan de pago estándar. Representará un // plan mensual por $ 19.99 USD que se cobra una vez al mes durante 11 meses. nueva Definición de pago nombre = "Plan estándar", tipo = "REGULAR", frecuencia = "MES", frecuencia_intervalo = "1", cantidad = GetCurrency ("15.00"), //> NOTA: Para los planes de tipo 'IFNINITE', los ciclos 'deben ser 0 para un objeto' REGULAR "de definición de pago '. cycles =" 11 ", charge_models = new List new ChargeModel type = "TAX", amount = GetCurrency ("2.47"), new ChargeModel () type = "SHIPPING", amount = GetCurrency ("9.99"); // Obtener configuración de PayPal var apiContext = PayPalConfiguration.GetAPIContext (); // Crear plan plan. Crear (apiContext);
Un plan de facturación recién creado está en un estado CREADO. Actívelo al estado ACTIVO para que sus clientes puedan suscribirse al plan. Para activar el plan, necesitamos hacer una solicitud de PATCH:
// Active el plan var patchRequest = new PatchRequest () new Patch () op = "replace", path = "/", value = new Plan () state = "ACTIVE"; plan.Update (apiContext, patchRequest);
Como puede ver, las bibliotecas de PayPal son un envoltorio directo sobre su API REST, lo cual es bueno, pero la API también es realmente compleja en comparación con otras como Stripe. Por este motivo, es realmente una buena opción envolver todas las comunicaciones de PayPal en objetos con API más claras y sencillas para nuestras aplicaciones. Aquí puede ver cómo se ve este código envuelto en múltiples funciones que toman parámetros:
Plan público público CreatePlanObject (cadena planName, cadena planDescription, cadena returnUrl, cadena cancelUrl, frecuencia de cadena, int frequencyInterval, decimal planPrice, decimal shippingAmount = 0, decimal taxPercentage = 0, bool trial = false, int trialLength = 0, decimal trialPrice = 0 ) // Defina el plan y adjunte las definiciones de pago y las preferencias del comerciante. // Más información: https://developer.paypal.com/docs/rest/api/payments.billing-plans/ return new Plan name = planName, description = planDescription, type = PlanType.Fixed, // Define the merchant preferencias // Más información: https://developer.paypal.com/webapps/developer/docs/api/#merchantpreferences-object merchant_preferences = new MerchantPreferences () setup_fee = GetCurrency ("1"), return_url = returnUrl, cancel_url = cancelUrl , auto_bill_amount = "YES", initial_fail_amount_action = "CONTINUE", max_fail_attempts = "0", payment_definitions = GetPaymentDefinitions (trial, trialLength, trialPrice, frequency, frequencyInterval, planPrice, shippingAmount, taxPercentage)); lista estática privadaGetPaymentDefinitions (bool trial, int trialLength, decimal trialPrice, string frequency, int frequencyInterval, decimal planPrice, decimal shippingAmount, decimal taxPercentage) var paymentDefinitions = new List (); if (trial) // Defina un plan de prueba que cobrará 'trialPrice' por 'trialLength' // Después de eso, el plan estándar asumirá el control. paymentDefinitions.Add (new PaymentDefinition () name = "Trial", type = "TRIAL", frequency = frequency, frequency_interval = frequencyInterval.ToString (), cantidad = GetCurrency (trialPrice.ToString ()), ciclos = trialLength.ToString ( ), charge_models = GetChargeModels (trialPrice, shippingAmount, taxPercentage)); // Definir el plan de pago estándar. Representará una 'frecuencia' (mensual, etc.) // plan para 'planPrice' que cobra 'planPrice' (una vez al mes) para #cycles. var regularPayment = new PaymentDefinition name = "Standard Plan", type = "REGULAR", frequency = frequency, frequency_interval = frequencyInterval.ToString (), amount = GetCurrency (planPrice.ToString ()), //> NOTE: For 'IFNINITE 'planes tipo', 'ciclos' debe ser 0 para un objeto 'REGULAR "Definición de pago'. cycles =" 11 ", charge_models = GetChargeModels (trialPrice, shippingAmount, taxPercentage); paymentDefinitions.Add (regularPayment); return paymentDefinitions; Lista GetChargeModels (plan decimal, precio de envío decimal, porcentaje de impuestos decimal) // Crear el plan de facturación var chargeModels = nueva lista (); if (shippingAmount> 0) chargeModels.Add (new ChargeModel () type = "SHIPPING", monto = GetCurrency (shippingAmount.ToString ())); if (taxPercentage> 0) chargeModels.Add (new ChargeModel () type = "TAX", cantidad = GetCurrency (String.Format ("0: f2", planPrice * taxPercentage / 100)))); devolver chargeModels;
Puede actualizar la información de un plan de facturación existente realizando una solicitud de "PATCH". Esta es una función que envuelve esa llamada:
public static void UpdateBillingPlan (string PlanId, string path, valor del objeto) // Tokens de autenticación de PayPal var apiContext = PayPalConfiguration.GetAPIContext (); // Recuperar plan var plan = Plan.Get (apiContext, planId); // Activar el plan var patchRequest = new PatchRequest () new Patch () op = "replace", path = path, value = value; plan.Update (apiContext, patchRequest);
Para actualizar la descripción del plan de facturación, podemos llamar a esta función y pasar los parámetros correctos:
UpdateBillingPlan (planId: "P-5FY40070P6526045UHFWUVEI", ruta: "/", valor: nuevo Plan description = "new description");
Idealmente, cuando no quiera aceptar nuevos clientes a un plan de facturación, querrá actualizarlo al estado "INACTIVO". Esto no afectará los acuerdos de facturación existentes en este plan. Esto se puede hacer simplemente llamando a la función UpdateBillingPlan:
UpdateBillingPlan (planId: "P-5FY40070P6526045UHFWUVEI", ruta: "/", valor: nuevo Plan state = "INACTIVE");
Una vez que haya creado uno o más planes de facturación, desea comenzar a que los clientes se suscriban a sus planes de suscripción. Para hacer esto, debe recopilar sus datos de cliente y realizar una solicitud a PayPal. Para poder probar esta funcionalidad, he agregado varias acciones al HomeController:
public IActionResult Subscribe () var plan = PayPalSubscriptionsService.CreateBillingPlan ("Tuts + Plan", "Plan de prueba para este artículo", GetBaseUrl ()); var abono = PayPalSubscriptionsService.CreateBillingAgreement (plan.id, nuevo PayPal.Api.ShippingAddress city = "London", line1 = "line 1", postal_code = "SW1A 1AA", country_code = "GB", "Pedro Alonso", "Tuts +", DateTime.Now); return Redirect (abono.GetApprovalUrl ()); público IActionResult SubscribeSuccess (token de cadena) // Ejecutar acuerdo aprobado PayPalSubscriptionsService.ExecuteBillingAgreement (token); volver View (); public IActionResult SubscribeCancel (token de cadena) // TODO: Manejar devolución de pago cancelada RedirectToAction ("Error");
Como puede ver en el fragmento de código anterior, he incluido la mayor parte de la funcionalidad en varios métodos. El primero es "CreateBillingPlan" que se explicó en la sección anterior. El segundo es "CreateBillingAgreement" que se utiliza para suscribir a un usuario a un plan:
acuerdo estático público CreateBillingAgreement (string PlanId, ShippingAddress shippingAddress, string string, description, DateTime startDate) // Tokens de autenticación de PayPal var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = new Agreement () name = name, description = description, start_date = startDate.ToString ("yyyy-MM-ddTHH: mm: ss") + "Z", payer = new Payer () payment_method = "paypal ", plan = new Plan () id = planId, shipping_address = shippingAddress; var createdAgreement = agreement.Create (apiContext); volver creado Acuerdo;
El tercer método es "ExecuteBillingAgreement". Después de una aprobación exitosa de la suscripción, usamos el token devuelto para activar la suscripción:
public static void ExecuteBillingAgreement (token de cadena) // Tokens de autenticación de PayPal var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = new Agreement () token = token; var executeAgreement = agreement.Execute (apiContext);
Utilice este método para suspender un acuerdo:
public static void SuspendBillingAgreement (string agreementId) var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = new Agreement () id = agreementId; agreement.Suspend (apiContext, new AgreementStateDescriptor () note = "Suspendiendo el acuerdo");
Este es realmente similar al anterior:
public static void ReactivateBillingAgreement (string agreementId) var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = new Agreement () id = agreementId; agreement.ReActivate (apiContext, new AgreementStateDescriptor () note = "Reactivating the agreement");
Utilice esta función para cancelar un plan:
public static void CancelBillingAgreement (string agreementId) var apiContext = PayPalConfiguration.GetAPIContext (); var agreement = new Agreement () id = agreementId; agreement.Cancel (apiContext, new AgreementStateDescriptor () note = "Cancelando el acuerdo");
Esta opción es muy limitada, y lo que esperaría de esta llamada es la posibilidad de cambiar el plan de suscripción, para actualizar o degradar a un cliente. Esto no se admite en una sola llamada, ya que está en Stripe. Debe manejar este escenario cancelando el acuerdo actual y creando uno nuevo para actualizaciones o degradaciones. No es ideal, pero podría cambiar en el futuro..
Esta es una descripción general de las funciones más comunes que las personas utilizan para integrarse con PayPal. Su API es mucho más grande que los métodos de integración que se explican en este artículo. También puede emitir reembolsos y reembolsos parciales, y tienen muchas opciones diferentes para los casos perimetrales en las muestras que se tratan en este artículo. Si está interesado en obtener más detalles sobre cualquier integración específica, deje una sugerencia en los comentarios..