Saltar al contenido principal

Ejemplo de integración con PayPal

En este tutorial, mostraremos cómo integrar PayPal y revisaremos nuevos nodos.

1. Seguimiento del evento de creación de pedido

1.1. Evento "order created" en el módulo "Events".

Para rastrear eventos en el módulo "Integrations", crea un evento en el módulo "Events".

El bloque Events se describe aquí.

1.2. Seguimiento del evento de creación de pedido.

  • Arrastra el nodo "events" al área de trabajo.
  • Cambia el valor en el campo "Set" a "orderEvent".
  • El evento se guardará en el objeto "msg.orderEvent" y se podrá utilizar en otros nodos.
  • Selecciona de la lista el evento creado "order created" y haz clic en "submit".

En este ejemplo, nos suscribimos al evento de creación de pedido y guardamos el evento en "msg.orderEvent" para su uso posterior.

Más información sobre el nodo Events se puede encontrar aquí.

2. Creación de una sesión de pago

2.1. Crea una cuenta de pago

Antes de comenzar la integración, crea una cuenta personalizada para PayPal.

Se describe cómo hacerlo aquí.

2.2. Crea una sesión de pago

  • Arrastra el nodo "admin-api" al área de trabajo y conéctalo con el nodo del paso anterior.
  • Selecciona el método "Creating a payment session" e inserta el código de la descripción a continuación en el campo "Request body".
{
"orderId": {{orderEvent.order.id}},
"type": "session"
}

Aquí extraemos el identificador del pedido del objeto "msg.orderEvent" y formamos la solicitud para crear una sesión de pago. La solicitud para crear la sesión acepta los parámetros: "orderId" - el identificador y "type" - el tipo de sesión de pago (session o intent).

Más información sobre el nodo admin-api se puede encontrar aquí.

2.3. Establece el identificador obtenido en msg.paymentSessionId

  • Arrastra el nodo "function" al área de trabajo y conéctalo con el nodo del paso anterior.
  • Inserta el código del ejemplo en el campo "Function".

Aquí establecemos en "msg.paymentSessionId" el identificador de la sesión de pago obtenido como resultado de la ejecución del nodo anterior.

msg.paymentSessionId = msg.payload.id

return msg

Más información sobre el nodo Function se puede encontrar aquí.

3. Autenticación en PayPal

3.1. Establece los parámetros para la autenticación en PayPal

  • Arrastra el nodo "function" al área de trabajo y conéctalo con el nodo del paso anterior.
  • Inserta el código del ejemplo en el campo "Function".

Aquí establecemos el valor en los campos "payload" y "headers" del objeto "msg". Estos valores son necesarios para ejecutar el siguiente nodo.

// establecemos el cuerpo de la solicitud
msg.payload = {
grant_type: 'client_credentials',
}
// establecemos los encabezados
msg.headers = {
'Content-Type': 'application/x-www-form-urlencoded',
Accept: 'application/json',
}

return msg

Más información sobre los parámetros para el pago se puede encontrar en la documentación de PayPal.

Más información sobre el nodo Function se puede encontrar aquí.

3.2. Solicitud para obtener el token de acceso

  • Arrastra el nodo "http request" al área de trabajo y conéctalo con el nodo del paso anterior.
  • Selecciona en el campo Method la opción "POST".
  • Selecciona en el campo Data la opción "Send as request body".
  • Inserta en el campo Link el enlace https://api-m.sandbox.paypal.com/v1/oauth2/token.
  • Selecciona en el campo Return la opción "Object JSON".
  • Selecciona "Use Authentication".
  • En el campo "Username" ingresa tu client ID, y en el campo "Password" tu client secret para PayPal.

Esta solicitud es necesaria para obtener el "access_token".

Más información sobre la autenticación se puede encontrar en la documentación de PayPal.

Más información sobre el nodo http request se puede encontrar aquí.

3.3. Establece los parámetros para crear el enlace de pago

  • Arrastra el nodo "function" al área de trabajo y conéctalo con el nodo del paso anterior.
  • Inserta el código del ejemplo en el campo "Function".

En este ejemplo, se forma una solicitud para crear un enlace de pago basada en los datos de los nodos anteriores.

// access_token para paypal, obtenido en el nodo "paypal auth"
const accessToken = msg.payload.access_token
// datos del pedido, obtenidos en el nodo "order created"
// el objeto order corresponde al pedido de la API de orders https://oneentry.cloud/instructions/api
const order = msg.orderEvent.order
// identificador de la sesión de pago, obtenido en el nodo "create payment session"
const paymentSessionId = msg.paymentSessionId

// formamos los datos para paypal basados en los datos del pedido
const items = order.products.map((product) => {
return {
name: product.title,
description: 'tu descripción',
quantity: String(product.quantity),
unit_amount: {
currency_code: order.currency,
value: product.price,
},
}
})

const totalSum = parseFloat(order.totalSum)

const data = {
intent: 'CAPTURE',
purchase_units: [
{
items,
custom_id: String(paymentSessionId),
amount: {
currency_code: order.currency,
value: totalSum,
breakdown: {
item_total: {
currency_code: order.currency,
value: totalSum,
},
},
},
payment_instruction: {
billingId: String(order.id),
},
},
],
payment_source: {
paypal: {
experience_context: {
payment_method_preference: 'UNRESTRICTED',
payment_method_selected: 'PAYPAL',
brand_name: 'EXAMPLE INC',
locale: 'en-US',
landing_page: 'LOGIN',
shipping_preference: 'NO_SHIPPING',
user_action: 'PAY_NOW',
return_url: 'https://example.com/return',
cancel_url: 'https://example.com/cancel',
},
},
},
}

// Cuerpo de la solicitud
msg.payload = data
// Encabezados de la solicitud
msg.headers = {
'Content-Type': 'application/json',
Authorization: `Bearer ${accessToken}`,
Prefer: 'return=representation',
}

return msg

Más información se puede encontrar en la documentación de PayPal.

Más información sobre el nodo Function se puede encontrar aquí.

4. Creación del enlace de pago

En este ejemplo se utiliza el nodo "http request". Se puede usar para realizar solicitudes http.

  • Arrastra el nodo "http request" al área de trabajo y conéctalo con el nodo del paso anterior.
  • Selecciona en el campo Method la opción "POST".
  • Selecciona en el campo Data la opción "Send as request body".
  • Inserta en el campo Link el enlace https://api-m.sandbox.paypal.com/v2/checkout/orders.
  • Selecciona en el campo Return la opción "Object JSON".

En este ejemplo, hemos hecho una solicitud a PayPal para generar un enlace de pago con los datos del nodo anterior.

Más información se puede encontrar en la documentación de PayPal.

Más información sobre el nodo http request se puede encontrar aquí.

5. Actualización de la sesión de pago

  • Arrastra el nodo "admin-api" al área de trabajo y conéctalo con el nodo del paso anterior.
  • Selecciona el método "Payment session update".
  • Inserta el código de la descripción a continuación en el campo "Query parameters".
{
"id": {{paymentSessionId}}
}
  • Inserta el código de la descripción a continuación en el campo "Request body".
{
"paymentUrl": "{{{payload.links.1.href}}}"
}

Aquí extraemos el identificador del enlace de pago "msg.paymentSessionId" y el enlace de pago "msg.payload.links[0].href" de las solicitudes anteriores.

Más información sobre los valores devueltos se puede encontrar en la documentación de PayPal.

Más información sobre el nodo admin-api se puede encontrar aquí.

6. Agregar endpoint para obtener el enlace de pago

6.1. Establece el tópico "createPaymentLink"

  • Arrastra el nodo "function" al área de trabajo y conéctalo con el nodo del paso anterior.
  • Inserta el código del ejemplo en el campo "Function".

Esto es necesario para identificar el flujo actual.

msg.topic = 'createPaymentLink'

return msg

Más información sobre el nodo Function se puede encontrar aquí.

6.2. Crea un endpoint para obtener el enlace de pago

  • Arrastra el nodo "http in" al área de trabajo.
  • Selecciona el método "POST".
  • Ingresa el enlace /get-payment-link.

Este endpoint será necesario para obtener el enlace de pago actual.

Más información sobre el nodo http in se puede encontrar aquí.

6.3. Establece el tópico "getPaymentLink"

  • Arrastra el nodo "function" al área de trabajo y conéctalo con el nodo del paso anterior.
  • Inserta el código del ejemplo en el campo "Function".

Esto es necesario para identificar el flujo actual.

msg.topic = 'getPaymentLink'

return msg

Más información sobre el nodo Function se puede encontrar aquí.

6.4. Guarda los datos en el contexto

  • Arrastra el nodo "function" al área de trabajo y conéctalo con el nodo del paso anterior.
  • Inserta el código del ejemplo en el campo "Function".

Esto es necesario para formar la respuesta.

// obtener el id del pedido actual
const orderId = msg.payload.orderId
// clave del contexto actual
const contextKey = `payment_link_${orderId}`
// obtener la API de OneEntry
const api = global.get('api')
// datos del contexto actual
const contextData = flow.get(contextKey) || {}
// establecer datos en el contexto por tópico
if (msg.topic === 'createPaymentLink') {
contextData.paymentSessionId = msg.paymentSessionId
contextData.createPaymentLinkCompleted = true
}
if (msg.topic === 'getPaymentLink') {
contextData.getPaymentLinkCompleted = true
contextData.res = msg.res
}
// establecer datos del contexto en el contexto
flow.set(contextKey, contextData)
// si createPaymentLink y getPaymentLink se completaron, enviar respuesta con la sesión actual
if (
contextData.createPaymentLinkCompleted &&
contextData.getPaymentLinkCompleted
) {
// obtener la sesión de pago por id de la API
const paymentSession = await api.getPaymentSessionById({
id: contextData.paymentSessionId,
})
msg.payload = paymentSession
msg.res = contextData.res

// limpiar la API
flow.set(contextKey, null)

return msg
}

return null

Más información sobre el nodo Function se puede encontrar aquí.

6.5. Punto de salida para el enlace de pago

  • Arrastra el nodo "http response" al área de trabajo y conéctalo con el nodo del paso anterior.

Esto es necesario para devolver la respuesta a la solicitud.

Más información sobre el nodo http response se puede encontrar aquí.

7. Configuración de webhooks para PayPal

7.1. Punto de entrada para PayPal

  • Arrastra el nodo "http in" al área de trabajo.
  • Selecciona el método "POST".
  • Ingresa el enlace /paypal.

Este endpoint será necesario para actualizar el estado del pago a través de PayPal.

Más información sobre el nodo http in se puede encontrar aquí.

7.2. Respuesta a la solicitud

  • Arrastra el nodo "function" al área de trabajo y conéctalo con el nodo del paso anterior.
  • Inserta el código del ejemplo en el campo "Function".

Esto es necesario para formar la respuesta.

msg.payload = {
ok: true,
}

return msg

Más información sobre el nodo function se puede encontrar aquí.

7.3. Punto de salida para PayPal

  • Arrastra el nodo "http response" al área de trabajo y conéctalo con el nodo del paso anterior.

Este nodo es necesario para devolver la respuesta a la solicitud.

Más información sobre el nodo http response se puede encontrar aquí.

7.4. Obtener el estado del pago

  • Arrastra el nodo "function" al área de trabajo y conéctalo con el nodo del paso anterior.
  • Inserta el código del ejemplo en el campo "Function".

En este nodo, tomamos el valor obtenido del nodo "paypal webhook" y lo guardamos en "msg.status" para usarlo en el siguiente nodo.

msg.status = msg.payload.resource.status

return msg

Más información sobre el nodo Function se puede encontrar aquí.

7.5. Verificación del estado del pago

  • Arrastra el nodo "switch" al área de trabajo y conéctalo con el nodo del paso anterior.
  • En "Property" escribe el valor "status".
  • Agrega la primera regla para la verificación. Selecciona la condición "==", en el valor ingresa "APPROVED".
  • Agrega la segunda regla para la verificación. Selecciona la condición "else".

Este nodo verificará el valor de "msg.status" en relación con las reglas establecidas. Si el valor es "APPROVED", se ejecutarán los nodos de la primera rama, de lo contrario, se ejecutarán los de la segunda.

Más información sobre el nodo switch se puede encontrar aquí.

7.6. Obtener el identificador de la sesión de pago

  • Arrastra el nodo "function" al área de trabajo y conéctalo con el nodo del paso anterior.
  • Inserta el código del ejemplo en el campo "Function".

En este nodo, tomamos el identificador de la sesión de pago que guardamos en el nodo "set payment data".

msg.paymentSessionId = parseInt(
msg.payload.resource.purchase_units[0].custom_id,
10
)

return msg

Más información sobre los valores devueltos se puede encontrar en la documentación de PayPal.

Más información sobre el nodo Function se puede encontrar aquí.

7.7. Actualización del estado del pago

  • Arrastra el nodo "admin-api" al área de trabajo y conéctalo con el nodo del paso anterior.
  • Selecciona el método "Payment session update".
  • Inserta el código de la descripción a continuación en el campo "Query parameters".
{
"id": {{paymentSessionId}}
}
  • Inserta el código de la descripción a continuación en el campo "Request body".
{
"status": "completed"
}

Aquí actualizamos el estado del pago por su identificador de "msg.paymentSessionId".

Más información sobre el nodo admin-api se puede encontrar aquí.

7.8. Agrega el webhook en el panel de PayPal

El enlace a tu proyecto + /api/admin/workflows/endpoints/paypal.

Ejemplo:

https://<tu-proyecto>.oneentry.cloud/api/admin/workflows/endpoints/paypal

Más información se puede encontrar en la documentación de PayPal.

8. Verificación de la integración

8.1. Crea un pedido

IMG1

IMG2

Cómo crear un pedido se describe en la documentación de la API.

8.2. Obtén el enlace de pago

IMG3

  • Realiza una solicitud POST a https://<tu-proyecto>.oneentry.cloud/api/admin/workflows/endpoints/get-payment-link, en lugar de https://<tu-proyecto>.oneentry.cloud inserta el enlace a tu proyecto.

  • En el cuerpo de la solicitud, indica el identificador del pedido creado anteriormente:

{
"orderId": 15
}

8.3. Paga el pedido

IMG4

8.4. Verifica el estado del pedido

IMG5