El SDK de JavaScript de PayPal expone dinámicamente objetos y métodos basados en los componentes que seleccione. Añada componentes a su <script> pasándolos en la URL src usando el parámetro de consulta components.
El SDK de JavaScript admite los siguientes componentes:
buttons (predeterminado)
marks
card-fields
funding-eligibility
messages
Importante: Esta es la versión 2 de la guía de referencia del SDK de JavaScript. Versión 1 es una integración heredada.
Botones
El componente de botones de pago muestra automáticamente todos los botones elegibles en una única ubicación en su página. Consulte la integración de pagos estándar.
import { loadScript } from "@paypal/paypal-js";
let paypal;
try {
paypal = await loadScript({ clientId: "YOUR_CLIENT_ID" });
} catch (error) {
console.error("failed to load the PayPal JS SDK script", error);
}
if (paypal) {
try {
await paypal.Buttons({
style: {
layout: 'vertical',
color: 'blue',
shape: 'rect',
label: 'paypal'
}
}).render("#paypal-button-container");
} catch (error) {
console.error("failed to render the PayPal Buttons", error);
}
}
Layout
Establezca la opción style.layout para determinar cómo aparecen los botones cuando hay múltiples botones disponibles:
Valor
Descripción
Diseño
vertical
Predeterminado. Los botones se apilan verticalmente con un máximo de 6 botones. Recomendado cuando:
Presenta una lista dinámica de opciones de pago en páginas de pago y carrito de compras.
Utiliza Checkout como plataforma de pagos completa.
Móvil
Venmo está disponible en móvil solo en mercados de EE.UU.
Web
horizontal
Los botones se apilan horizontalmente con un máximo de 2 botones. Recomendado cuando:
Coloca botones en una página de producto, junto al producto.
El espacio en la página es limitado.
Ya se proporcionan opciones de pago alternativas.
Móvil
Venmo está disponible en móvil solo en mercados de EE.UU.
Web
¿Qué botones veré?
Los botones que aparecen se deciden automáticamente, basándose en varios factores, incluyendo:
País del comprador
Tipo de dispositivo
Fuentes de financiación que el comprador ha optado por ver
Como resultado, cada comprador ve una combinación única de botones. Las ofertas de Pay Later varían según el país y tienen diferentes botones. Para evitar que aparezcan ciertos botones, consulte Deshabilitar financiación en la referencia del SDK de JavaScript.
Color
Establezca la opción style.color a uno de estos valores:
Valor
Descripción
Botón
gold
Recomendado
La gente de todo el mundo nos conoce por el color dorado y la investigación lo confirma. Pruebas exhaustivas determinaron el tono y la forma exactos que ayudan a aumentar la conversión. Úselo en su sitio web para aprovechar el reconocimiento y la preferencia de PayPal.
blue
Primera alternativa
Si el dorado no funciona para su sitio, pruebe el botón azul de PayPal. La investigación muestra que la gente sabe que es nuestro color de marca, lo que proporciona un halo de confianza y seguridad a su experiencia.
silverwhiteblack
Segundas alternativas
Si el dorado o el azul no funcionan para el diseño o la estética de su sitio, pruebe los botones plateado, blanco o negro. Debido a que estos colores son menos capaces de atraer la atención de la gente, recomendamos estos colores de botón como segunda alternativa.
Shape
Establezca la opción style.shape a uno de estos valores:
Valor
Descripción
Botón
rect
Recomendado
La forma de botón predeterminada.
pill
Redondea los lados del botón.
sharp
Da al botón esquinas afiladas.
borderRadius
style.borderRadius se utiliza para definir un radio de borde personalizado de los botones.
Para definir el radio del borde de los botones, establezca la opción style.borderRadius a un número que sea mayor o igual a 0.
Nota
Si se definen tanto style.borderRadius como style.shape, style.borderRadius tendrá prioridad.
import { loadScript } from "@paypal/paypal-js";
let paypal;
try {
paypal = await loadScript({ clientId: "YOUR_CLIENT_ID" });
} catch (error) {
console.error("failed to load the PayPal JS SDK script", error);
}
if (paypal) {
try {
await paypal.Buttons({
style: {
borderRadius: 10,
}
}).render("#paypal-button-container");
} catch (error) {
console.error("failed to render the PayPal Buttons", error);
}
}
Tamaño
El botón se adapta al tamaño de su elemento contenedor por defecto.
Su elemento contenedor de botón necesita ser lo suficientemente ancho para sus botones de pago horizontales.
Height
Para personalizar la altura del botón, establezca la opción style.height a un valor entre 25 y 55. El botón tiene una altura máxima predeterminada de 55px. Elimine esta limitación y establezca la altura del botón para llenar su contenedor padre:
Establezca style.disableMaxHeight a true.
Seleccione una fuente de financiación válida: fundingSource: 'paypal' | 'venmo' | 'paylater' | 'credit'
Cambie el valor de height a nivel del contenedor padre.
Si se definen tanto style.disableMaxHeight como style.height en el botón de PayPal, se lanzará un error y el botón no se renderizará. Debe elegir uno u otro.
Establezca la opción message.amount para mostrar la oferta más relevante y el desglose de precios a sus clientes.
Para definir la cantidad del mensaje, establezca la opción message.amount a un número mayor que 0. Este valor debe reflejar el valor actual del producto o carrito que se utilizará una vez que se haya iniciado una sesión de pago.
Valor
Descripción
Mensaje
undefined
Predeterminado. Cuando no se proporciona un valor de cantidad, se muestra un mensaje genérico.
100
Un ejemplo de cantidad calificada para Pay in 4 con un desglose de cantidad semanal.
2000
Un ejemplo de cantidad calificada para Pay Monthly con un desglose de cantidad mensual.
Align
Establezca la opción message.align para alinear el contenido del mensaje con los botones.
Valor
Descripción
Mensaje
center
Predeterminado. Alineado en el centro entre los bordes de los botones.
left
Alineado al borde izquierdo de los botones.
right
Alineado al borde derecho de los botones.
Color
Establezca la opción message.color para cambiar el color del mensaje de negro o blanco dependiendo del fondo de su sitio web para que el mensaje sea visible.
Valor
Descripción
Mensaje
black
Predeterminado. Texto negro con un logo de PayPal coloreado y texto de enlace azul.
white
Texto blanco con un logo de PayPal blanco y texto de enlace blanco.
Position
Establezca la opción message.position para colocar el mensaje encima o debajo de los botones.
Valor
Descripción
Mensaje
top
Posicionar el mensaje encima de los botones.
bottom
Predeterminado. Posicionar el mensaje debajo de los botones.
Nota: Cuando el botón de Tarjeta de Débito/Crédito está presente como parte de su pila de botones, solo se admite top y será el valor predeterminado.
displayOnly
El parámetro displayOnly determina los métodos de pago que ven sus clientes. Por defecto, los compradores ven todos los métodos de pago elegibles. Las opciones pasadas a displayOnly se aplican en orden de izquierda a derecha.
Tenemos las siguientes opciones disponibles:
Valor
Descripción
vaultable
Mostrar solo los métodos de pago que admiten guardar. Su integración, configuración de comerciante y ubicación del cliente determinan qué métodos de pago se pueden guardar.
import { loadScript } from "@paypal/paypal-js";
let paypal;
try {
paypal = await loadScript({ clientId: "YOUR_CLIENT_ID" });
} catch (error) {
console.error("failed to load the PayPal JS SDK script", error);
}
if (paypal) {
try {
await paypal.Buttons({
displayOnly: ["vaultable"],
}).render("#paypal-button-container");
} catch (error) {
console.error("failed to render the PayPal Buttons", error);
}
}
createOrder
La función createOrder configura los detalles de la transacción. Pase createOrder como parámetro en paypal.Buttons(). Cuando el comprador selecciona el botón de PayPal, createOrder inicia la ventana de PayPal Checkout. El comprador inicia sesión y aprueba la transacción en el sitio web paypal.com.
app.post("/my-server/create-paypal-order", async (req, res) => {
const order = await createOrder();
res.json(order);
});
// use la API de órdenes para crear una orden
function createOrder() {
// cree accessToken usando su clientID y clientSecret
// para el ejemplo completo, por favor vea la guía de Integración Estándar
// https://developer.paypal.com/docs/multiparty/checkout/standard/integrate/
const accessToken = "REPLACE_WITH_YOUR_ACCESS_TOKEN";
return fetch ("https://api-m.sandbox.paypal.com/v2/checkout/orders", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${accessToken}`,
}
body: JSON.stringify({
"purchase_units": [
{
"amount": {
"currency_code": "USD",
"value": "100.00"
},
"reference_id": "d9f80740-38f0-11e8-b467-0ed5f89f718b"
}
],
"intent": "CAPTURE",
"payment_source": {
"paypal": {
"experience_context": {
"payment_method_preference": "IMMEDIATE_PAYMENT_REQUIRED",
"payment_method_selected": "PAYPAL",
"brand_name": "EXAMPLE INC",
"locale": "en-US",
"landing_page": "LOGIN",
"shipping_preference": "GET_FROM_FILE",
"user_action": "PAY_NOW",
"return_url": "https://example.com/returnUrl",
"cancel_url": "https://example.com/cancelUrl"
}
}
}
})
})
.then((response) => response.json());
}
Orders v2 API options
intent: La intención de capturar el pago inmediatamente o autorizar un pago para un pedido después de su creación. Los valores son:
CAPTURE: Predeterminado. El comerciante tiene la intención de capturar el pago inmediatamente después de que el cliente realice el pago.
AUTHORIZE: El comerciante tiene la intención de autorizar un pago y retener fondos después de que el cliente realice el pago. Los pagos autorizados están garantizados hasta 3 días pero están disponibles para capturar hasta 29 días. Después del período de honor de 3 días, el pago autorizado original expira y necesita volver a autorizar el pago. Necesita hacer una solicitud separada para capturar pagos bajo demanda. Esta intención no es compatible cuando tiene más de 1 purchase_unit dentro de su pedido.
purchase_units: Requerido. Un array de unidades de compra. Cada unidad de compra establece un contrato entre un pagador y un beneficiario. Cada unidad de compra representa un pedido completo o parcial que el pagador tiene la intención de comprar al beneficiario. Consulte la definición del objeto de solicitud de unidad de compra para obtener información adicional.
payment_source: Opcionalmente defina el payment_source al crear el pedido. Esta fuente de pago puede ser paypal, un token de bóveda, información de card para comerciantes compatibles con PCI, o métodos de pago alternativos como blik y apple_pay. Para más información, consulte API de Pedidos v2 y payment_source.
createSubscription
Proporciona una experiencia de suscripción simplificada y segura. PayPal presenta automáticamente los tipos de pago a sus compradores, facilitándoles completar su compra utilizando métodos como Pago con Venmo, PayPal Credit y pagos con tarjeta de crédito sin reintegración a medida que estén disponibles.
Pase vault=true e intent=subscription en el SDK de JavaScript para configurar una suscripción, en lugar de una transacción única.
import { loadScript } from "@paypal/paypal-js";
let paypal;
try {
paypal = await loadScript({
clientId: "YOUR_CLIENT_ID",
vault: true,
intent: "subscription"
});
} catch (error) {
console.error("failed to load the PayPal JS SDK script", error);
}
if (paypal) {
try {
await paypal.Buttons().render("#paypal-button-container");
} catch (error) {
console.error("failed to render the PayPal Buttons", error);
}
}
Finalmente, implemente la función createSubscription que se llama cuando el comprador selecciona el botón de PayPal.
Acciones
create — Crea una suscripción para su plan e incluye el ID del plan, detalles del suscriptor, envío y otros detalles. El plan_id debe pertenecer al client-id configurado en el script.
Opciones de actions.subscription.create: Consulte el endpoint crear suscripción para ver las opciones soportadas definidas en el cuerpo de la solicitud. También consulte crear un botón de pago para la suscripción para más ejemplos.
paypal.Buttons({
createSubscription(data, actions) {
return actions.subscription.create({
"plan_id": "YOUR_PLAN_ID"
});
},
onApprove(data) {
alert(`Has creado con éxito la suscripción ${data.subscriptionID}`);
}
}).render("#paypal-button-container");
import { loadScript } from "@paypal/paypal-js";
let paypal;
try {
paypal = await loadScript({
clientId: "YOUR_CLIENT_ID",
vault: true,
intent: "subscription"
});
} catch (error) {
console.error("failed to load the PayPal JS SDK script", error);
}
if (paypal) {
try {
await paypal.Buttons({
createSubscription(data, actions) {
return actions.subscription.create({
"plan_id": "YOUR_PLAN_ID"
});
},
onApprove(data) {
alert(`Te has suscrito con éxito a ${data.subscriptionID}`);
}
}).render("#paypal-button-container");
} catch (error) {
console.error("failed to render the PayPal Buttons", error);
}
}
revise: Actualiza la suscripción que podría estar en estado ACTIVE o SUSPENDED. Consulte actualizar o degradar una suscripción para hacer una revisión utilizando la API de Suscripciones.
onApprove
Captura los fondos de la transacción y muestra un mensaje que indica al comprador que el pago se realizó con éxito. El método se llama después de que el comprador aprueba la transacción en el sitio web paypal.com.
Para la lista de detalles del pedido que recibe de /my-server/capture-paypal-order, consulte capturar pago para pedido en la referencia de la API de Pedidos.
onCancel
Cuando un comprador cancela un pago, normalmente regresa a la página principal. En su lugar, puede usar la función onCancel para mostrar una página de cancelación o regresar al carrito de compras.
import { loadScript } from "@paypal/paypal-js";
let paypal;
try {
paypal = await loadScript({
clientId: "YOUR_CLIENT_ID",
});
} catch (error) {
console.error("failed to load the PayPal JS SDK script", error);
}
if (paypal) {
try {
await paypal.Buttons({
onError(error) {
window.location.assign("/your-error-page-here");
}
}).render("#paypal-button-container");
} catch (error) {
console.error("failed to render the PayPal Buttons", error);
}
}
Nota: Este manejador de errores es general. No se espera que los errores en este punto se manejen más allá de mostrar un mensaje o página de error genérico.
onInit / onClick
Se llama cuando el botón se renderiza por primera vez. Puede usarlo para validaciones en su página si no puede hacerlo antes de renderizar. Por ejemplo, habilitar botones cuando pase la validación del formulario o deshabilitar si falla.
Atributos de datos
fundingSource: La fuente de financiación del botón que se seleccionó. Consulte las fuentes de financiación en la guía de botones independientes.
import { loadScript } from "@paypal/paypal-js";
let paypal;
try {
paypal = await loadScript({
clientId: "YOUR_CLIENT_ID",
});
} catch (error) {
console.error("failed to load the PayPal JS SDK script", error);
}
if (paypal) {
try {
await paypal.Buttons().render("#paypal-button-container");
} catch (error) {
console.error("failed to render the PayPal Buttons", error);
}
}
onShippingChange
Obsoleto: Consulte onShippingAddressChange y onShippingOptionsChange
Mientras el comprador está en el sitio de PayPal, puede actualizar su carrito de compras para reflejar la dirección de envío que seleccionó en PayPal. Puede usar el callback para:
Validar que admite la dirección de envío.
Actualizar los costos de envío.
Cambiar los artículos en el carrito.
Informar al comprador que no admite su dirección de envío.
Disponibilidad: La función onShippingChange no es compatible con Suscripciones.
Atributos de datos
data: Un objeto que contiene la dirección de envío del comprador. Consiste en los siguientes campos:
orderID (requerido): Un ID que representa un pedido.
paymentID (opcional): Un ID que representa un pago.
paymentToken (requerido): Un ID o token que representa el recurso.
shipping_address (requerido): La ciudad, estado, país y código postal seleccionados por el comprador.
city: Ciudad de la dirección de envío.
state: Estado o provincia de la dirección de envío.
country_code: País de la dirección de envío.
postal_code: Código postal o código postal de la dirección de envío.
selected_shipping_option (opcional): Opción de envío seleccionada por el comprador.
label: Etiqueta personalizada del método de envío.
type: Tipo de método de envío (SHIPPING o PICKUP).
amount: Costo adicional para este método.
currency_code: Código de moneda ISO, como USD.
value: Formato decimal en cadena, como 1.00.
Acciones
actions: Un objeto que contiene métodos para actualizar el contenido del carrito del comprador e interactuar con PayPal Checkout. Consiste en los siguientes métodos:
resolve: Indica a PayPal que no necesita hacer ningún cambio en el carrito del comprador.
reject: Indica a PayPal que no admitirá la dirección de envío proporcionada por el comprador.
order: Método de API de pedido del lado del cliente.
PATCH: Para hacer la actualización, pase un array de operaciones de cambio en la solicitud, como se describe en la referencia de la API de actualización de pedido. La respuesta devuelve una promesa.
Ejemplos
Este ejemplo muestra no admitir transacciones internacionales:
import { loadScript } from "@paypal/paypal-js";
let paypal;
try {
paypal = await loadScript({ clientId: "YOUR_CLIENT_ID" });
} catch (error) {
console.error("failed to load the PayPal JS SDK script", error);
}
if (paypal) {
try {
await paypal.Buttons({
onShippingChange(data, actions) {
if (data.shipping_address.country_code !== "US") {
return actions.reject();
}
return actions.resolve();
}
}).render("#paypal-button-container");
} catch (error) {
console.error("failed to render the PayPal Buttons", error);
}
}
Este ejemplo muestra una situación más compleja en la que un estado tiene envío gratuito, pero el envío de tarifa fija es el estándar para el resto de los EE. UU.:
import { loadScript } from "@paypal/paypal-js";
let paypal;
try {
paypal = await loadScript({ clientId: "YOUR_CLIENT_ID" });
} catch (error) {
console.error("failed to load the PayPal JS SDK script", error);
}
if (paypal) {
try {
await paypal.Buttons({
async onShippingChange(data, actions) {
if (data.shipping_address.country_code !== 'US') {
return actions.reject();
}
await fetch("/my-server/patch-paypal-order", {
method: "PATCH",
body: JSON.stringify({
shippingAddress: data.shipping_address
})
});
return actions.resolve();
}
}).render("#paypal-button-container");
} catch (error) {
console.error("failed to render the PayPal Buttons", error);
}
}
onShippingAddressChange
Mientras el comprador está en el sitio de PayPal, puedes actualizar su carrito de compras para reflejar la dirección de envío que seleccionó en PayPal. Puedes usar la función de devolución para:
Validar que admites la dirección de envío.
Actualizar los costos de envío.
Cambiar los artículos en el carrito.
Informar al comprador que no admites su dirección de envío.
Disponibilidad: La función onShippingAddressChange no es compatible con Suscripciones.
Atributos de datos
data: Un objeto que contiene la dirección de envío del comprador. Consiste en las siguientes propiedades:
errors: Errores para mostrar al usuario.
ADDRESS_ERROR: "Tu pedido no puede ser enviado a esta dirección."
COUNTRY_ERROR: "Tu pedido no puede ser enviado a este país."
STATE_ERROR: "Tu pedido no puede ser enviado a este estado."
ZIP_ERROR: "Tu pedido no puede ser enviado a este código postal."
orderID: Un ID que representa un pedido.
paymentID: Un ID que representa un pago.
paymentToken: Un ID o token que representa un recurso.
shippingAddress: La ciudad, estado, país y código postal seleccionados por el comprador.
city: Ciudad de la dirección de envío.
countryCode: País de la dirección de envío.
postalCode: Código postal o código postal de la dirección de envío.
state: Estado o provincia de la dirección de envío.
Acciones
actions: Un objeto que contiene un método para interactuar con PayPal Checkout. Consiste en la siguiente propiedad:
reject: Indica a PayPal que no admitirás la dirección de envío proporcionada por el comprador.
Ejemplos
Este ejemplo muestra cómo rechazar transacciones internacionales usando actions.reject():
import { loadScript } from "@paypal/paypal-js";
let paypal;
try {
paypal = await loadScript({ clientId: "YOUR_CLIENT_ID" });
} catch (error) {
console.error("failed to load the PayPal JS SDK script", error);
}
if (paypal) {
try {
await paypal.Buttons({
onShippingOptionsChange(data, actions) {
if (data.selectedShippingOption.type === 'PICKUP') {
return actions.reject(data.errors?.STORE_UNAVAILABLE);
}
}
}).render("#paypal-button-container");
} catch (error) {
console.error("failed to render the PayPal Buttons", error);
}
}
Marcas
Usa marcas cuando los botones de PayPal se presentan junto con otras fuentes de financiación en la página y los botones de PayPal se muestran cuando el comprador selecciona un botón de radio. Consulta Mostrar otros métodos de pago.
Comúnmente usado para botones independientes cuando necesitas verificar si la fuente de financiación es elegible.
// Recorrer cada fuente de financiación / método de pago
paypal.getFundingSources().forEach(function(fundingSource) {
// Inicializar las marcas
var mark = paypal.Marks({
fundingSource: fundingSource
});
// Verificar si la marca es elegible
if (mark.isEligible()) {
// Renderizar la marca independiente para esa fuente de financiación
mark.render('#paypal-mark-container');
}
});
paypal.Marks().render(container)
Renderiza los botones de radio que se pasan en el selector de contenedor.
paypal.Marks().render('#paypal-marks-container');
<!-- Renderizar los botones de radio y las marcas -->
<label>
<input type="radio" name="payment-option" value="paypal" checked>
<div id="paypal-marks-container"></div>
</label>
<label>
<input type="radio" name="payment-option" value="alternate">
</label>
<div id="paypal-buttons-container"></div>
<div id="alternate-button-container">
<button>Pagar con un método diferente</button>
</div>
<script>
paypal.Marks().render('#paypal-marks-container');
paypal.Buttons().render('#paypal-buttons-container');
document.querySelectorAll('input[name=payment-option]').forEach(function (el) {
el.addEventListener('change', function (event) {
if (event.target.value === 'paypal') {
document.body.querySelector('#alternate-button-container').style.display = 'none';
document.body.querySelector('#paypal-buttons-container').style.display = 'block';
}
if (event.target.value === 'alternate') {
document.body.querySelector('#alternate-button-container').style.display = 'block';
document.body.querySelector('#paypal-buttons-container').style.display = 'none';
}
});
});
document.body.querySelector('#alternate-button-container').style.display = 'none';
</script>
Campos de tarjeta
Usa campos de tarjeta alojados por PayPal para aceptar y guardar tarjetas de crédito y débito sin manejar información de tarjetas. PayPal maneja todos los problemas de seguridad y cumplimiento asociados con el procesamiento de tarjetas.
Solicitud: Inicializar cardFields
Inicializa el componente de campos de tarjeta creando una instancia de paypal.CardFields:
Puedes pasar las siguientes opciones al instanciar el componente de campos de tarjeta:
Opción
Descripción
Requerido
createOrder
La función de devolución para crear el pedido en tu servidor.
Sí
onApprove
La función de devolución para capturar el pedido en tu servidor.
Sí
onError
La función de devolución para capturar errores durante el pago.
Sí
inputEvents
Objeto que contiene funciones de devolución para eventos de entrada.
No
style
Objeto de estilo personalizado.
No
createOrder
Crea un ID de pedido para cualquier caso que implique una compra. Esta función de devolución se llama cada vez que el pagador envía los campos de tarjeta.
Configura tu servidor para llamar a la API de Crear Pedido. El botón presionado en el lado del cliente determina la fuente de pago enviada. En el siguiente ejemplo, el pagador optó por enviar su tarjeta como fuente de pago.
Solicitud: Crear pedido con una tarjeta como fuente de pago
Para casos de uso de 3D Secure, puedes elegir qué presentar al cliente si cierran el modal de verificación. Esto también significará que la transacción fue cancelada.
const cardFields = paypal.CardFields({
// ...
onCancel: () => {
console.log("Your order was cancelled due to incomplete verification");
},
// ...
});
Propiedades de Campos de Tarjeta
Las siguientes propiedades de campo de tarjeta se utilizan para capturar un pago. Usa el método render() para renderizar estas instancias al DOM.
Propiedad
Tipo
Campo creado
Requerido
CVVField
Función
CVV o CID de la tarjeta, un código de 3 o 4 dígitos
Sí
ExpiryField
Función
Fecha de vencimiento de la tarjeta
Sí
NameField
Función
Nombre para la tarjeta
No
NumberField
Función
Número de tarjeta
Sí
Opciones de campo de tarjeta
Personaliza las funciones de devolución de eventos o el estilo de cada campo con las siguientes opciones:
Opción
Tipo
Descripción
Requerido
inputEvents
Objeto
Un objeto que contiene funciones de devolución para cuando ocurre un evento de entrada específico para un campo.
No
style
Objeto
Estiliza un campo con propiedades CSS soportadas.
No
placeholder
String
Cada campo de tarjeta tiene un texto de marcador de posición predeterminado. Pasa un objeto de marcador de posición para personalizar este texto.
No
Ejemplo: Propiedades de campo de tarjeta
const cardNameContainer = document.getElementById("card-name-field-container");
const nameField = cardField.NameField({
placeholder: "Ingresa tu nombre completo como aparece en tu tarjeta",
inputEvents: {
onChange: (event)=> {
console.log("devuelve un stateObject", event);
}
},
style: {
".invalid": {
"color": "purple",
}
}
});
});
nameField.render(cardNameContainer);
const cardNumberContainer = document.getElementById("card-number-field-container");
const numberField = cardField.NumberField(/*options*/);
numberField.render(cardNumberContainer);
const cardExpiryContainer = document.getElementById("card-expiry-field-container");
const expiryField = cardField.ExpiryField(/*options*/);
expiryField.render(cardExpiryContainer);
const cardCvvContainer = document.getElementById("card-cvv-field-container");
const cvvField = cardField.CVVField(/*options*/);
cvvField.render(cardCvvContainer);
Estilizar campos de tarjeta
Cambia el diseño, ancho, alto y estilo exterior de los campos de tarjeta. Modifica los elementos que proporcionas como contenedores con tus hojas de estilo actuales. Por ejemplo, input: { border: 1px solid #333; }.
Propiedades CSS soportadas
Las propiedades CSS listadas son las únicas propiedades soportadas en la configuración de pagos avanzados con tarjeta de crédito y débito. Si especificas una propiedad CSS no soportada, se registra una advertencia en la consola del navegador.
appearance
color
direction
font
font-family
font-size
font-size-adjust
font-stretch
font-style
font-variant
font-variant-alternates
font-variant-caps
font-variant-east-asian
font-variant-ligatures
font-variant-numeric
font-weight
letter-spacing
line-height
opacity
outline
padding
padding-bottom
padding-left
padding-right
padding-top
text-shadow
transition
-moz-appearance
-moz-osx-font-smoothing
-moz-tap-highlight-color
-moz-transition
-webkit-appearance
-webkit-osx-font-smoothing
-webkit-tap-highlight-color
-webkit-transition
Estilizar campos padre
Pasa un objeto de estilo al componente padre cardField para aplicar el objeto a cada campo.
Pasa un objeto style a un campo de tarjeta individual para aplicar el objeto solo a ese campo. Esto anula cualquier objeto pasado a través de un componente padre.
Puedes pasar un objeto inputEvents a un componente padre cardField o a cada campo de tarjeta individualmente.
Pasa un objeto inputEvents al componente padre cardField para aplicar el objeto a cada campo.
Pasa un objeto inputEvents a un campo de tarjeta individual para aplicar el objeto solo a ese campo. Esto anula cualquier objeto pasado a través de un componente padre.
Funciones de devolución de eventos de entrada soportadas
Puedes pasar las siguientes funciones de devolución al objeto inputEvents:
Nombre del Evento
Descripción
onChange
Se llama cuando cambia la entrada en cualquier campo.
onFocus
Se llama cuando cualquier campo obtiene el foco.
onBlur
Se llama cuando cualquier campo pierde el foco.
onInputSubmitRequest
Se llama cuando un pagador envía el campo.
Ejemplo: inputEvents en componente padre
Pasa el objeto inputEvents al componente padre CardFields.
const cardField = paypal.CardFields({
inputEvents: {
onChange: function(data) => {
// Hacer algo cuando cambia una entrada
},
onFocus: function(data) => {
// Hacer algo cuando un campo obtiene el foco
},
onBlur: function(data) => {
// Hacer algo cuando un campo pierde el foco
}
onInputSubmitRequest: function(data) => {
if (data.isFormValid) {
// Enviar el formulario de tarjeta para el pagador
} else {
// Informar al pagador que algunos campos no son válidos
}
}
}
})
Ejemplo: inputEvents en componente individual
Pasa el objeto inputEvents a cada componente de campo individual:
const cardField = paypal.CardFields(/* options */)
const nameField = cardField.NameField({
inputEvents: {
onChange: function(data) => {
// Hacer algo cuando cambia la entrada solo del campo de nombre
},
onFocus: function(data) => {
// Hacer algo cuando solo el campo de nombre obtiene el foco
},
onBlur: function(data) => {
// Hacer algo cuando solo el campo de nombre pierde el foco
}
onInputSubmitRequest: function(data) => {
if (data.isFormValid) {
// Enviar el formulario de tarjeta para el pagador
} else {
// Informar al pagador que algunos campos no son válidos
}
}
}
});
objeto-estado-muestra
Cada una de las funciones de devolución de eventos devuelve un objeto de estado similar al siguiente ejemplo:
Los siguientes métodos son soportados en campos de tarjeta padre:
getState()
isEligible()
submit()
getState() -> {promise | void}
Devuelve una promesa que se resuelve en un stateObject. Incluye el estado de todos los campos, posibles tipos de tarjeta y un array de errores.
Ejemplo
const cardField = paypal.CardFields(/* options */)
// ...
// Renderizar los campos de tarjeta
// ...
cardFields.getState().then((data) => {
// Enviar solo si el estado actual
// del formulario es válido
if (data.isFormValid) {
cardFields.submit().then(() => {
//Envío exitoso
}).catch((error) => {
//Error de envío
});
}
});
isEligible() -> {Boolean}
Verifica si una instancia de cardField puede renderizarse basándose en la configuración y reglas de negocio.
// Añadir listener de clic al botón de envío proporcionado por el comerciante
// y llamar a la función submit en el componente CardField
multiCardFieldButton.addEventListener("click", () => {
cardField.submit().then(() => {
console.log("Envío de Campos de Tarjeta");
}).catch((err) => {
console.log("Hubo un error con los campos de tarjeta: ", err);
});
});
Métodos en campos de tarjeta individuales
Los siguientes métodos son soportados en campos de tarjeta individuales:
addClass()
clear()
focus()
removeAttribute()
removeClass()
render()
setAttribute()
setMessage()
close()
Método
Descripción
addClass() -> {promise | void}
Añade una clase a un campo. Usa este método para actualizar estilos de campo cuando ocurren eventos en otro lugar durante el pago.
clear() -> {void}
Limpia el valor del campo.
focus() -> {void}
Enfoca el campo.
removeAttribute() -> {promise | void}
Elimina un atributo de un campo donde se llama
Puedes eliminar los siguientes atributos con removeAttribute:
aria-invalid
aria-required
disabled
placeholder
removeClass() -> {promise | void}
Pasa el nombre de la clase como una cadena en removeClass para eliminar una clase de un campo. Usa este método para actualizar estilos de campo cuando ocurren eventos en otro lugar en el flujo de pago.
render() -> {promise | void}
Renderiza los campos de tarjeta individuales al DOM para el pago.
Pasa la referencia del elemento HTML o la cadena del selector CSS para el campo de entrada.
setAttribute() -> {promise | void}
Establece los atributos y valores soportados de un campo. Pasa atributos y valores como cadenas.
setMessage() -> {void}
Establece un mensaje en un campo para lectores de pantalla. Pasa el mensaje como una cadena en setMessage.
const cardNumberContainer = document.getElementById("card-number-field-container");
const cardField = paypal.CardFields(/* options */)
cardField.NumberField(/* options */).render(cardNumberContainer);
// O usar una cadena de selector
cardField.NumberField(/*options*/).render("#card-number-field-container")
setAttribute()
const cardField = paypal.CardFields(/* options */)
const nameField = cardField.NameField(/* options */)
nameField.setAttribute("placeholder", "Ingresa tu nombre completo");
nameField.render(cardNameContainer);
setMessage()
const cardField = paypal.CardFields(/* options */)
const nameField = cardField.NameField(/* options */)
nameField.render(cardNameContainer);
nameField.setMessage("Ingresa tu nombre completo");
Type definitions
cardSecurityCode
cardType
cardFieldData
stateObject
cardSecurityCode
Información sobre el código de seguridad de una tarjeta.
Propiedad
Tipo
Descripción
name
String
El nombre de un código de seguridad para una tarjeta. Los valores válidos son CVV, CID y CVC.
size
Number
La longitud esperada del código de seguridad, típicamente 3 o 4 dígitos.
cardType
Información sobre el tipo de tarjeta enviada en el array cards como parte del stateObject.
Propiedad
Tipo
Descripción
type
String
El tipo de tarjeta legible por código. Los valores válidos son:
american-express
diners-club
discover
jcb
maestro
mastercard
unionpay
visa
elo
hiper, hipercard
code
Object cardSecurityCode
Contiene datos sobre los requisitos de código de seguridad de la marca de la tarjeta. Por ejemplo, en una tarjeta Visa, el CVV es 3 dígitos. En una tarjeta American Express, el CID es 4 dígitos.
niceType
String
El tipo de tarjeta legible por humanos. Los valores válidos son:
American Express
Diner Club
discover
JCB
Maestro
Mastercard
UnionPay
Visa
Elo
Hiper,Hipercard
cardFieldData
Los datos de campo para pagos con tarjeta se envían para cada campo de tarjeta en el stateObject.
Propiedad
Tipo
Descripción
isFocused
Boolean
Muestra si el campo de entrada está actualmente enfocado.
isEmpty
Boolean
Muestra si el usuario ha ingresado un valor en la entrada.
isPotentiallyValid
Boolean
Muestra si la entrada actual puede ser válida. Por ejemplo, si un pagador ingresa 41 para el número de tarjeta, la entrada puede volverse válida. Sin embargo, si el pagador ingresa 4x, la entrada no puede volverse válida.
isValid
Boolean
Muestra si la entrada es válida y puede ser enviada.
stateObject
cards
Array de cardType
Devuelve un array de tarjetas potenciales. Si se ha determinado el tipo de tarjeta, el array contiene solo 1 tarjeta.
emittedBy
String
El nombre del campo asociado con un evento. emittedBy no se incluye si es devuelto por getState. Los valores válidos son "name","number", "cvv", y "expiry".
errors
Array
Array de campos de tarjeta que actualmente no son válidos. Los valores potenciales son "INELIGIBLE_CARD_VENDOR","INVALID_NAME", "INVALID_NUMBER", "INVALID_EXPIRY"o "INVALID_CVV".
isFormValid
Boolean
Muestra si el formulario es válido.
fields
Object
Contiene datos sobre el campo en el contexto del evento. Los valores válidos son "cardNameField", "cardCvvField", "cardNumberField"y "cardExpiryField". Cada una de estas claves contiene un objeto de tipo cardFieldData.
Ejemplo completo
El siguiente ejemplo muestra cómo podría aparecer un script completo de campos de tarjeta alojados en HTML:
<html>
<head>
<meta charset="UTF-8">
<title>Página de Pago</title>
</head>
<body>
<div id="checkout-form">
<div id="card-name-field-container"></div>
<div id="card-number-field-container"></div>
<div id="card-expiry-field-container"></div>
<div id="card-cvv-field-container"></div>
<button id="multi-card-field-button" type="button">Pagar ahora con Campos de Tarjeta</button>
</div>
</body>
<script src="https://www.paypal.com/sdk/js?client-id=<your-client-id>&components=card-fields"></script>
<script>
// Objeto de estilos personalizado (opcional)
const styleObject = {
input: {
"font-size": "16 px",
"font-family": "monospace",
"font-weight": "lighter",
color: "blue",
},
".invalid": {
color: "purple",
},
":hover": {
color: "orange",
},
".purple": {
color: "purple",
},
};
// Crear el componente de campos de tarjeta y definir funciones de devolución
const cardField = paypal.CardFields({
style: styleObject,
createOrder: function (data, actions) {
return fetch("/api/paypal/order/create/", {
method: "post",
})
.then((res) => {
return res.json();
})
.then((orderData) => {
return orderData.id;
});
},
onApprove: function (data, actions) {
const { orderID } = data;
return fetch('/api/paypal/orders/${orderID}/capture/', {
method: "post",
})
.then((res) => {
return res.json();
})
.then((orderData) => {
// Redirigir a la página de éxito
});
},
inputEvents: {
onChange: function (data) {
// Manejar un evento de cambio en cualquiera de los campos
},
onFocus: function(data) {
// Manejar un evento de foco en cualquiera de los campos
},
onBlur: function(data) {
// Manejar un evento de desenfoque en cualquiera de los campos
},
onInputSubmitRequest: function(data) {
// Manejar un intento de enviar el formulario de tarjeta completo
// mientras se enfoca cualquiera de los campos
}
},
});
// Definir el contenedor para cada campo y el botón de envío
const cardNameContainer = document.getElementById("card-name-field-container"); // Campo opcional
const cardNumberContainer = document.getElementById("card-number-field-container");
const cardCvvContainer = document.getElementById("card-cvv-field-container");
const cardExpiryContainer = document.getElementById("card-expiry-field-container");
const multiCardFieldButton = document.getElementById("multi-card-field-button");
// Renderizar cada campo después de verificar la elegibilidad
if (cardField.isEligible()) {
const nameField = cardField.NameField();
nameField.render(cardNameContainer);
const numberField = cardField.NumberField();
numberField.render(cardNumberContainer);
const cvvField = cardField.CVVField();
cvvField.render(cardCvvContainer);
const expiryField = cardField.ExpiryField();
expiryField.render(cardExpiryContainer);
// Añadir listener de clic al botón de envío y llamar a la función submit en el componente CardField
multiCardFieldButton.addEventListener("click", () => {
cardField
.submit()
.then(() => {
// Manejar un pago exitoso
})
.catch((err) => {
// Manejar un pago fallido
});
});
}
</script>
</html>
Elegibilidad de financiación
Los botones de pago renderizan automáticamente todos los botones elegibles en una sola ubicación en tu página por defecto.
Si tu caso de uso lo permite, puedes renderizar botones individuales e independientes para cada método de pago soportado. Por ejemplo, renderizar los botones de PayPal, Venmo, PayPal Credit y métodos de pago alternativos en diferentes partes de la página de pago, junto a diferentes botones de radio, o en páginas completamente diferentes.
Incluso con botones independientes, tus integraciones aprovechan la lógica de elegibilidad que proporciona el SDK de JavaScript de PayPal, lo que significa que solo los botones apropiados para el comprador actual se muestran automáticamente.
Verifica la elegibilidad de financiación de las fuentes de financiación actuales.
paypal.isFundingEligible(fundingSource);
Financiación
Esta tabla incluye las fuentes de financiación disponibles. Los botones de pago renderizan automáticamente todos los botones elegibles en una sola ubicación en tu página por defecto. Si necesitas anular esto, puedes especificar los botones que quieres mostrar siguiendo la guía de Botones de pago independientes.
Esta tabla incluye las fuentes de financiación disponibles. Los botones de pago renderizan automáticamente todos los botones elegibles en una sola ubicación en tu página por defecto. Si necesitas anular esto, puedes especificar los botones que quieres mostrar siguiendo la guía de Botones de pago independientes.
Fuente de financiación
Botón de pago
paypal.FUNDING.PAYPAL
PayPal
paypal.FUNDING.CARD
Tarjetas de crédito o débito
paypal.FUNDING.CREDIT
PayPal Credit
paypal.FUNDING.VENMO
Venmo
paypal.FUNDING.SEPA
SEPA-Lastschrift
paypal.FUNDING.BANCONTACT
Bancontact
paypal.FUNDING.EPS
eps
paypal.FUNDING.GIROPAY
giropay (Legacy) *
paypal.FUNDING.IDEAL
iDEAL
paypal.FUNDING.MERCADOPAGO
Mercado Pago
paypal.FUNDING.MYBANK
MyBank
paypal.FUNDING.P24
Przelewy24
paypal.FUNDING.SOFORT
SOFORT (Legacy) *
Importante: giropay fue descontinuado el 30 de junio de 2024. PayPal no admitirá pagos con giropay a partir del 1 de julio de 2024. Ofrece a tus usuarios PayPal wallet y otros métodos de pago alternativos. Más información .
Importante: Sofort fue descontinuado el 18 de abril de 2024. PayPal no admitirá pagos con Sofort a partir del 19 de abril de 2024. Ofrece a tus usuarios PayPal wallet y otros métodos de pago alternativos. Más información .
Mensajes
Usa cuando quieras mostrar mensajes de Pago Posterior en tu sitio. Debido a que las ofertas de Pago Posterior difieren por país, ciertas opciones para el componente messages se renderizan de manera diferente dependiendo de la ubicación del comprador. Para detalles completos, así como ejemplos específicos por país, consulta la Referencia de Pago Posterior.