Procesar tarjetas de crédito es, lamentablemente, mucho más difícil de lo que podemos esperar, como desarrolladores. Dado que es una tarea tan común, ¿es realmente necesario que saltemos a través de innumerables aros (rodeados de fuego, por supuesto) con el único propósito de procesar un pago? Los comerciantes? Puertas de acceso? SSL? ¿Seguridad? Muy rápidamente, una operación aparentemente simple puede convertirse en una tarea abrumadoramente confusa y, lo que es más importante, peligrosa. Cada vez que te encuentres manejando los datos confidenciales de un usuario, será mejor que estés alerta..
Stripe traduce una operación complicada, confusa y peligrosa en una simple llamada a la API.¿No sería asombroso si hubiera un servicio que hiciera este proceso tan fácil como sea posible? Un servicio construido por desarrolladores para desarrolladores. ¡Qué pensamiento! Entrar en la raya; No hay cuentas mercantiles, no hay pasarelas. Una llamada a la API, junto con algunas pautas de seguridad, es todo lo que necesita para comenzar a aceptar pagos con tarjeta de crédito hoy..
Si bien Stripe no es gratis, solo piden el 2.9% de cada cargo (mas .30 centavos). Eso es. Sin tarifas de instalación, tarifas de almacenamiento, costos ocultos, nada de eso. Sólo el 2,9%. No está mal!
¿Vendido? Yo fui también. Procesemos nuestro primer pago de prueba. Por supuesto, antes de comenzar, visita. raya.com
, cree una nueva cuenta (gratuita) y complete los distintos formularios, como el descriptor del estado de cuenta y su información bancaria.
Cargar a un usuario requiere dos pasos básicos:
Naturalmente, el primer paso es crear un formulario de pago para su producto. Tienes dos opciones: usar Stripe's revisa script, que creará automáticamente el formulario, validará la entrada del usuario y generará el token único para los datos de la tarjeta de crédito del usuario. En situaciones en que la configuración y el estilo son flexibles, esta es una excelente ruta a seguir. Inserte una etiqueta de script, junto con un puñado de atributos HTML5 personalizados, y listo.!
Stripe ofrece una forma integrable que agiliza el proceso de aceptación de pagos..
Sin embargo, en la mayoría de las situaciones, necesitarás un control total. Como tal, para los fines de este artículo, usaremos un formulario personalizado. En esta sección, lograremos tres cosas:
Un formulario de pago básico podría ser:
Observe cómo no requerimos mucha información para procesar una tarjeta de crédito. Técnicamente, la única información que Stripe exige es un número de tarjeta de crédito y la fecha de vencimiento. Sin embargo, como regla general, cuanta más información obtenga del usuario, mejor. En caso de disputarse el cargo, esta información adicional será útil. O, en otras palabras, cuanta más información solicite, más probable será que el verdadero propietario de la tarjeta de crédito esté realizando la transacción. La clave es encontrar la línea entre suficiente y tanto que el usuario no se molesta en rellenar el formulario. Como mínimo, solicite el nombre del usuario, la dirección de correo electrónico, el número de la tarjeta de crédito, la fecha de vencimiento y el número de CVC.
Para continuar perforando su cabeza, nunca permita que datos confidenciales de tarjetas de crédito toquen su servidor. Hacerlo tiene el potencial de crear un mundo de daño, si se realiza incorrectamente. En su lugar, tome el camino fácil: asegúrese de que entrada
s para los datos de la tarjeta de crédito del usuario no contienen nombre
atributos Al omitir este atributo, los datos no se pueden publicar en su servidor.
Preste mucha atención a los atributos personalizados en las entradas, como data-stripe = "número"
. Stripe ofrece un plugin, raya.js
, que asiste en el proceso de compilación de los datos proporcionados por el usuario y la generación del token. Stripe buscará esos atributos y buscará sus valores respectivos.
Para hacer uso de raya.js
, haga referencia al script dentro de su proyecto y configure su clave publicable, que se le proporcionará cuando se registre con Stripe. También usaremos jQuery en este artículo, aunque ciertamente no es obligatorio.
Pensar en setPublishableKey
como una forma de identificar su sitio web cuando se comunica con Stripe. Al registrarse, se le presentarán dos versiones diferentes de esta clave, para pruebas y producción, respectivamente.
A continuación, debemos crear el token único de un solo uso para los datos de la tarjeta de crédito del usuario. Podemos usar el Raya
Objeto, proporcionado por el script que importamos, para este propósito. Aún mejor, no debemos preocuparnos por serializar los datos del formulario de pago; simplemente pase a través del formulario jQuery object, y Stripe se encargará del resto.
// Event Listeners $ ('# payment-form'). On ('submit', generateToken); var generateToken = function (e) var form = $ (esto); // No presionar el botón comprar ahora más de una vez form.find ('button'). Prop ('disabled', true); // Crear el token, basado en el objeto de formulario Stripe.create (form, stripeResponseHandler); // Evita que el formulario envíe e.preventDefault (); ; var stripeResponseHandler = function (status, response) ;
Con este bit de JavaScript, cuando se envíe el formulario de pago, Stripe intentará generar un token de un solo uso, utilizando los datos relacionados de las entradas que incluyen raya-
Atributos específicos personalizados. El segundo argumento a la crear
El método es una devolución de llamada que recibirá el token (response.id
) desde el servidor de Stripe, y proceder en consecuencia.
Dentro de esta devolución de llamada, es importante verificar el resultado (si toda la información se proporcionó correctamente), inserte el token en un entrada
, y enviar el formulario a su servidor. Nuevamente, tenga en cuenta que la información de la tarjeta de crédito no debe llegar a su servidor, solo el token y los datos no confidenciales. Esto es importante, así que escriba la aceptación o las pruebas funcionales para verificarlo..
Su devolución de llamada puede parecer así:
var stripeResponseHandler = function (status, response) var form = $ ('# payment-form'); // ¿Algún error de validación? if (response.error) // Mostrar al usuario lo que hizo incorrectamente form.find ('. payment-errors'). text (response.error.message); // Haga que el envío vuelva a hacer clic en form.find ('botón'). Prop ('deshabilitado', falso); else // De lo contrario, ¡estamos listos! Presentar el formulario. // Insertar el token único en la forma $ ('', ' tipo ':' oculto ',' nombre ':' stripeToken ',' valor ': response.id). appendTo (formulario); // Llame al método de envío nativo en el formulario // para evitar que el envío se cancele form.get (0) .submit (); ;
Es realmente muy simple! Envíe una solicitud AJAX a la API de Stripe (utilizando su útil complemento de JavaScript), obtenga el token generado, insértelo en el formulario y publíquelo en su servidor!
Si sigue adelante, en este punto, ha generado con éxito un token de un solo uso y enviado el formulario de pago. Ahora, es el momento de que el idioma del servidor que elija para crear físicamente el cargo. Recuerde, en la sección anterior, no se hizo ningún cargo. Solo generamos un token que representaba los datos de la tarjeta de crédito..
Stripe ofrece varias bibliotecas del lado del servidor para registrar nuevos cargos, o incluso para organizar suscripciones. Hay muchas posibilidades de que su idioma preferido esté representado (PHP, Ruby, Python, etc.).
Al igual que en la sección anterior, el envío de un nuevo cargo puede realizarse en unos pocos pasos:
Consulte la página de la biblioteca de Stripe para obtener instrucciones de instalación. Si usa PHP, como veremos en este artículo, le recomendamos que aproveche Composer para descargar el paquete Stripe.
"require": "stripe / stripe-php": "dev-master"
Composer es el futuro de la gestión de dependencias de PHP, así que suba a bordo ahora, si aún no lo ha hecho. Una carga básica de rayas puede tomar la forma de:
// Establezca su clave API Stripe :: setApiKey ("YOUR API KEY"); intente Stripe_Charge :: create (['amount' => 2000, // esto es en centavos: $ 20 'currency' => 'usd', 'card' => $ _POST ['stripeToken'], 'description' => 'Describe tu producto']); catch (Stripe_CardError $ e) // Rechazado. No procese su compra. // Regresa y dile al usuario que pruebe una nueva tarjeta
¡Eso es! La clave API lo autenticará como un usuario de Stripe válido. Similar a la clave publicable, Stripe le proporcionará dos versiones diferentes de esta clave: una para pruebas y producción, respectivamente.
Tenga en cuenta que todos los cargos a Stripe deben declararse en centavos (según la moneda, por supuesto). Si los precios se almacenan en su base de datos como dólares, euros o libras, entonces querrá compensar en consecuencia, al realizar el cargo..
Si no se produce ninguna excepción, puede estar seguro de que el cargo se ha procesado correctamente. Continúe ofreciendo al usuario su descarga digital o registre su compra en su sistema.
Lo creas o no, el trabajo de Stripe está terminado. Sin duda, hay más que puede hacer, como crear clientes y administrar suscripciones, pero, cuando se trata de simplemente procesar un pago único, ¡ya ha terminado! ... Excepto que no está.
Mientras que sí, el trabajo de Stripe ha terminado, el tuyo, por otro lado, no lo está. Independientemente del proveedor de pagos, cada vez que trabaje con información de tarjeta de crédito, la seguridad debe ser una de las principales preocupaciones. Ya hemos dado los primeros pasos, asegurándonos de que los datos de la tarjeta de crédito nunca toquen el servidor, pero aún hay más por hacer. Luego debemos asegurar la conexión del usuario a su servidor. En otras palabras, necesita un certificado SSL. Bajo ninguna circunstancia debes saltarte este paso.!
“SSL (Secure Sockets Layer) es la tecnología de seguridad estándar para establecer un enlace cifrado entre un servidor web y un navegador. Este enlace garantiza que todos los datos transmitidos entre el servidor web y los navegadores permanezcan privados e integrales ". - info.ssl.com
Cuando un usuario ofrece a un sitio web la información de su tarjeta de crédito, esperará verla. https
dentro de la barra de direcciones. Afortunadamente, comprar un certificado SSL es mucho más fácil de lo que solía ser. De hecho, la mayoría de los hosts ofrecen un complemento SSL, que convierte todo el proceso en un solo clic. Lo mismo es cierto para varias opciones de SaaS, como Pagoda Box o Heroku.
Propina: Una vez que habilite SSL, es posible que las imágenes y los activos se rompan. Para solucionar esto, asegúrese de que todas las direcciones URL utilizan
https
, más bien quehttp
. O, como mejor solución, use las URL relativas al protocolo.
Con esta técnica, popularizada por Paul Irish, si la página actual utiliza HTTPS, el activo también se solicitará con HTTPS..
Suponiendo que su host ofrezca un complemento SSL de un solo clic, simplemente apunte a su usuario hacia la https: //
versión de la página de orden, y ya está todo listo para ir!
Los ejemplos en este artículo son simples y en su mayoría procedimentales. Sin embargo, hay muchas posibilidades de que trabaje con un marco que admita múltiples entornos, enrutamiento e instalaciones de prueba. Utilice los siguientes consejos como una ventaja para integrar Stripe con el marco de su elección..
¡Claramente, no desea utilizar números de tarjeta de crédito reales para probar sus formularios de pago! Afortunadamente, Stripe ya ha pensado en esto; incluyen una cantidad de números de tarjetas de crédito que simulan respuestas específicas, como un cargo exitoso, un número no válido, un código CVC incorrecto y muchos más.
Aquí hay algunos números de tarjeta a los que frecuentemente harás referencia:
Cuando trabaje con Stripe, tendrá dos claves únicas, que representan la API y las claves publicables. Además, hay variantes de prueba y producción para cada uno de estos. La mayoría de los marcos ofrecen una forma de administrar múltiples entornos. De esta manera, para el desarrollo, su aplicación utilizará correctamente las claves de prueba, mientras que, una vez implementadas, se hará referencia a las versiones de producción..
A continuación se muestra un proyecto específico de Laravel. Laravel proporciona un sistema de entorno simple. Agregue un archivo de configuración dentro de una carpeta que corresponda al nombre del entorno, y esos valores tomarán prioridad sobre los valores predeterminados.
Primero, establecemos las claves de producción:
'CLAVE DE PRODUCCIÓN', 'publishableKey' => 'CLAVE DE PRODUCCIÓN PUBLICABLE'];
Y para el desarrollo, anulamos las claves de producción con sus homólogos de prueba:
'TEST API KEY', 'publishableKey' => 'TEST PUBLISHABLE KEY'];
Ahora, cuando la aplicación requiere la clave API, usando Config :: get ('stripe.apiKey')
, el valor que se devuelve será determinado por el entorno. Éxito!
Un error común que los desarrolladores principiantes cometen al vincular sus aplicaciones con varios proveedores, como Stripe. A su aplicación no le debe importar qué proveedor de facturación se está utilizando. Sólo le preocupa el hecho de que uno está disponible. Al codificar las referencias a Stripe en sus clases, está creando una conexión directa entre las dos, una que probablemente será difícil de cambiar.
Pregúntese: "Si, en el futuro, necesito cambiar a Stripe con un proveedor diferente, ¿qué tan difícil será?" Pista: algo mayor que "sólo un momento"Es un olor de código.
En su lugar, codificar a una interfaz - tal vez BillingProvider
o BillingGateway
. De esta manera, puede crear varias implementaciones de la interfaz: una para Stripe, o una para un servicio completamente diferente, si es necesario. Estas diversas implementaciones albergarán la funcionalidad específica del servicio. Si, en algún momento, encuentra un proveedor de facturación más barato que Stripe, cambiando la implementación de Stripe de BillingProvider
con un ServiceX
La versión solo tomará un momento, es decir, una vez que haya creado la nueva implementación que consulta el ServiceX
API de facturación.
Aquí hay un esqueleto de cómo podría verse esto:
// Definir la interfaz BillingProvider cargo de función pública ($ creditInfo); // Crear una clase de implementación Stripe StripeBilling cargo de función pública ($ creditInfo) // Stripe_Charge :: charge (...); // Crear una clase de implementación ServiceX ServiceXBilling cargo de función pública ($ creditInfo) // cargo del usuario con ServiceX
Ahora que tenemos dos implementaciones, podemos hacer referencia a nuestro servicio de facturación preferido actual, utilizando la inyección de dependencia.
clase PaymentController protegido $ facturación; función pública __construct (BillingProvider $ billing) $ this-> billing = $ billing;
Con este estilo de desarrollo, si finalmente necesita alejarse de Stripe, no será necesario tocar el controlador. Debido a que Stripe no está codificado, no sabe la diferencia!
Cuando venda productos digitales, pregúntese: “¿Qué debe hacer el comprador si algo sale mal en mi parte?” Proporcione siempre alguna forma para que el comprador se comunique con usted o con su compañía. ¿Qué sucede si el correo electrónico de confirmación que incluye un enlace para descargar el archivo digital nunca llega a la bandeja de entrada del comprador? Que deberían hacer?
Un sitio de soporte, o incluso una simple dirección de correo electrónico en la página de inicio debería ayudar en estas situaciones inevitables.
Si debe comprar manualmente un certificado SSL, hay una serie de servicios para elegir. Según la experiencia previa, puede esperar pasar de treinta minutos a una hora para preparar las cosas. Tenga en cuenta que la mayoría de los certificados no son gratuitos y pueden oscilar entre $ 10 y $ 500, según el proveedor..
El equipo de Stripe recomienda DigiCert y Namecheap, sin embargo, si lo prefiere, podría considerar una solución gratuita, como StartSSL.
Un error frecuente se deriva del uso de datos de formulario para contener el precio del producto que se está comprando, posiblemente a través de una entrada oculta. Debido a que un usuario puede editar fácilmente el valor de esta entrada, no es prudente depender de él. Siempre obtenga el precio del producto desde el lado del servidor. Nunca confíes en el formulario para decírtelo. Una simple consulta de base de datos es la opción preferida..
El activo que está vendiendo nunca debe ser accesible para el público, incluso si la URL es, en su opinión, lo suficientemente larga y confusa hasta el punto de que la mayoría nunca lo aprendería. Esta es una mala práctica por varias razones.
En su lugar, cree un descargas
tabla que contiene códigos de compra únicos, junto con sus ID de productos asociados. De esta manera, cuando una URI, como / descargas / 23gsfga831g
, Se solicita, su solicitud:
Para ir más lejos, también puede imponer un límite de descarga. Permitir esto simplemente requeriría que un download_count
campo se agrega a la compras
mesa. Con cada solicitud, ese número debe incrementarse en uno. Una vez que este número llegue a su umbral designado, la descarga ya no debería proporcionarse. Esto puede ser útil en casos en los que desea asegurarse de que los enlaces de descarga no se compartan.
Lo maravilloso de Stripe es que traduce una operación complicada, confusa y peligrosa en una llamada API simple y simple. No hay cuentas mercantiles, ni pasarelas, ni cargos ocultos. Hay una razón por la que dicen que Stripe es ridículamente fácil de usar. Es!