Guía de integración para iOS
Para integrar el SDK de pago en su aplicación y realizar un pago, son necesarios 4 pasos:
- Añadir el SDK de pago a su aplicación
- Inicializar el SDK
- Realizar un pago
- Verificar el estado de la transacción
En esta página también encontrará:
- Consultar nuestros ejemplos de integración
- Personalizar el SDK
- Habilitar la funcionalidad de escaneo de la tarjeta
Para optimizar la eficiencia de nuestro soporte, nuestro SDK puede enviar mensajes Sentry a nuestros servidores cuando se produce una situación inusual o un problema. En este caso, no se transfieren datos sensibles ni datos de su aplicación.
Consultar nuestros ejemplos de integración
Encontrará varios ejemplos de códigos de integración de nuestro SDK en diferentes idiomas en el repositorio de Github
Añadir el SDK de pago a su aplicación
Existen varias maneras de integrar el SDK en un proyecto Xcode:
Mediante CocoaPods
Para integrar el SDK a su proyecto Xcode usando CocoaPods, indíquelo en su PodFile:
target 'MyApp' do use_frameworks! pod 'LyraPaymentSDK' end
A continuación, instálelo con
pod update
.
A través de Carthage
Para integrar el SDK en su proyecto Xcode usando Carthage, indique en su
Cartfile
las dependencias necesarias para nuestro SDK:# Payment SDK Mobile & dependencies github "CosmicMind/Material" == 3.1.8 github "SnapKit/SnapKit" == 5.0.1 github "getsentry/sentry-cocoa" "7.13.0" binary "https://raw.githubusercontent.com/lyra/ios-sdk/2.0.0/LyraPaymentSDK.json" == 2.0.0 binary "https://raw.githubusercontent.com/lyra/sentry-client-cocoa/2.0.0/sentry_client_cocoa.json" == 2.0.0 # Your dependencies ...
Agregue el
LyraPaymentSDK.xcframework
a su proyecto de iOS junto con las dependencias especificadas en suCartfile
.
Le recomendamos que actualice periódicamente el SDK de pago para asegurar un nivel de seguridad óptimo para sus pagos.
Para mantenerse informado de las nuevas versiones del SDK, consulte periódicamente nuestro repositorio de GitHub.
Inicializar el SDK
Como se menciona en el capítulo sobre el funcionamiento de la solución, es necesario inicializar el SDK cuando inicie su aplicación, generalmente con el método “didFinishLaunchingWithOptions” de su AppDelegate.
Para hacer esto, simplemente llame al método initialize con los siguientes parámetros después de importar el framework import LyraPaymentSDK
:
Parámetro | Formato | DESCRIPCIÓN |
---|---|---|
publicKey | String | Votre clé publique (disponible dans le BO marchand : Paramètres->Boutique->Clés de l'API REST, cf. la page Prérequis). |
options | [String: Any] | Diccionario que le permite configurar el comportamiento del SDK. |
Ejemplo de llamada:
//Configure SDK options var configurationOptions = [String : Any]() configurationOptions[Lyra.apiServerName] = apiServerName //Initialize Payment SDK do { try Lyra.initialize(publicKey, configurationOptions) } catch { }
//Configure SDK options NSMutableDictionary *configurationOptions = [[NSMutableDictionary alloc] init]; [configurationOptions setValue:apiServerName forKey:Lyra.apiServerName]; //Initialize Payment SDK [Lyra initialize:publicKey :configurationOptions error:&error];
Las claves posibles en este diccionario son:
Claves | Formato del valor | DESCRIPCIÓN | Obligatorio |
---|---|---|---|
apiServerName | String | Votre nom du serveur de l'API REST (disponible dans le BO marchand : Paramètres > Boutique > Clés de l'API REST), cf. la page Prérequis). | Obligatorio |
cardScanningEnabled | Bool | Activa/desactiva la función de escaneo de mapas, véase Activar la función de escaneo de tarjetas. | Opcional |
También se debe tener en cuenta que el SDK no permite múltiples procesos en paralelo. Durante el proceso de la primera llamada, las demás llamadas serán ignoradas (sin callback, sin excepción).
Realizar un pago
La realización de un pago se divide en 2 etapas: la inicialización de la visualización del formulario de pago y el procesamiento del pago en sí.
Inicialización de la visualización del formulario de pago
Cuando el usuario decide pagar, debe inicializar la visualización del formulario de pago.
Para hacer esto, debe llamar a su servidor comercial, verificar las compras del usuario allí y luego generar un identificador de formulario (llamado formToken) llamando al servicio web Charge/CreatePayment (nuevamente desde su servidor). En esta solicitud, debe pasar un parámetro formTokenVersion que coincida con el resultado del método getFormTokenVersion del SDK. La respuesta del servicio web o este token de formulario debe devolverse a su aplicación móvil.
El siguiente código de ejemplo se basa en los ejemplos de código iOS y en el servidor del vendedor a su disposición.
// 1. Init server comunication class for get createPayment context let serverCommunication = ServerCommunication() // 2. Execute getProcessPaymentContext for get the formToken (required param in SDK process method) serverCommunication.getPaymentContext { (getContextSuccess, formToken, error) in ... let objectResponse = json as? [String: Any] let serverResponse = objectResponse["answer"] as? [String: Any] let formToken = serverReponse["formToken"] as? String }
// 1. Init server comunication class for get createPayment context ServerCommunication *serverComunication = [[ServerCommunication alloc] init]; // 2. Execute getProcessPaymentContext for get the formToken (required param in SDK process method) [_serverComunication getProcessPaymentContext:^(BOOL getContextSuccess, NSString *formToken, NSError* error) { ... NSDictionary *objectResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError]; NSDictionary *serverResponse = [objectResponse objectForKey:@"answer"]; NSString* formToken = (NSString*)[serverResponse objectForKey:@"formToken"]; }];
- La validación del carrito es una etapa crucial: usted es responsable de comprobar en sus servidores que el monto corresponde al carrito antes de enviárnoslo.
- Llamar al servicio web desde la aplicación móvil significa poner sus claves de llamadas a su disposición (y a disposición de posibles piratas informáticos), lo que va en contra de las normas de seguridad.
Visualización de la pantalla de pago
Una vez que se recibe el formToken en la aplicación móvil, debe pasarlo a nuestro SDK de pago llamando al método process con los siguientes parámetros y después de importar el framework import LyraPaymentSDK
:
Parámetro | Formato | DESCRIPCIÓN |
---|---|---|
contextViewController | UIViewController | Corresponde al ViewController de la aplicación cliente desde el cual se iniciará el proceso de pago. |
formToken | String | El formToken, extraído de la respuesta del createPayment llamado anteriormente. |
onSuccess | LyraHandlerOnSuccess | Llamada a la función callback si el pago se ha realizado sin problemas. |
onError | LyraHandlerOnError | Función de devolución de llamada llamada si el pago falló o no pudo iniciarse. Esto puede ocurrir si el pago fue rechazado o si se produjo un error funcional o técnico durante el pago. Para obtener más información, consulte: Manejo de errores. |
El SDK se encarga de verificar la coherencia del formToken antes de mostrar los medios de pago disponibles.
Ejemplo de llamada:
Lyra.process(self, formToken, onSuccess: { ( _ lyraResponse: LyraResponse) -> Void //Verify the payment using your server: Check the response integrity by verifying the hash on your server self.verifyPayment(lyraResponse) }, onError: { (_ error: LyraError, _ lyraResponse: LyraResponse?) -> Void //TODO: Handle Payment SDK error in process payment request self.showMessage("Payment fail: \(error.errorMessage)") })
[Lyra processWithContextViewController:self formToken: formToken onSuccess:^(LyraResponse *lyraResponse //Verify the payment using your server: Check the response integrity by verifying the hash on your server [self verifyPayment:lyraResponse]; } onError:^(LyraError *lyraError, LyraResponse *lyraResponse) { //TODO: Handle Payment SDK error in process payment request [self showMessage: [NSString stringWithFormat:@"Payment fail: %@", lyraError.errorMessage]]; } error:&error];
Descripción del objeto LyraResponse
El objeto LyraResponse se devuelve tanto en onSuccess como en onError. Es un objeto de tipo JSONObject. En caso de éxito, es necesario comprobar su integridad antes de mostrar el resultado del pago.
En caso de que la transacción haya sido iniciada por el lado del servidor, es posible obtener la información del pago de manera sencilla.
Ejemplo:
{ "kr-hash":"80f5188e757c1828e8d4ccab87467eb50c4299e4057fa03b3f3185342f6d509c", "kr-hash-algorithm":"sha256_hmac", "kr-answer-type":"V4\/Payment", "kr-answer": "{ "shopId":"65512466", "orderCycle":"CLOSED", "orderStatus":"PAID", "serverDate":"2019-03-01T10:54:45+00:00", "orderDetails":{ "orderTotalAmount":1100, "orderEffectiveAmount":1100, "orderCurrency":"EUR", "mode":"TEST", "orderId":null, "_type":"V4\/OrderDetails" }, "customer":{ "billingDetails":{ "address":null, "category":null, "cellPhoneNumber":null, ... }, "email":null, "reference":null, "shippingDetails":{ "address":null, "address2":null, "category":null, ... }, "extraDetails":{ "browserAccept":null, "fingerPrintId":null, "ipAddress":"77.136.84.251", "browserUserAgent":"{\"deviceName\":\"Xiaomi Mi MIX 2S\",\"os\":\"Android\",\"osVersion\":\"[9]\",\"sdkVersion\":28,\"isMobile\":true}", "_type":"V4\/Customer\/ExtraDetails" }, "shoppingCart":{ "insuranceAmount":null, "shippingAmount":null, "taxAmount":null, "cartItemInfo":null, "_type":"V4\/Customer\/ShoppingCart" }, "_type":"V4\/Customer\/Customer" }, "transactions":[ { "shopId":"65512466", "uuid":"64d704a9bb664898954c3ef537982f99", "amount":1100, "currency":"EUR", "paymentMethodType":"CARD", "status":"PAID", "detailedStatus":"AUTHORISED", "operationType":"DEBIT", "creationDate":"2019-03-01T10:54:44+00:00", ... } ], "_type":"V4\/Payment" }" }
La respuesta contiene los mismos elementos que los enviados en la IPN:
Parámetro | DESCRIPCIÓN |
---|---|
kr-hash | Hash del objeto JSON almacenado en kr-answer. Así podrá confirmar la autenticidad de la respuesta |
kr-hash-algorithm | Algoritmo utilizado para calcular el hash |
kr-hash-key | Clave utilizada para firmar kr-answer |
kr-answer-type | Tipo del objeto JSON almacenado en kr-answer |
kr-answer | Objeto que contiene los objetos transacciones completos codificados en JSON |
El objeto kr-answer contiene los elementos descritos aquí.
En algunos casos, puede ser que la transacción no se pueda iniciar en el lado del servidor. Será posible encontrar el error devuelto por la API en el json (puede encontrar el formato aquí: Códigos de error).
Verificar el estado de la transacción
Una vez el pago finalizado, haya sido aceptado o rechazado, se le notificará de dos maneras:
- mediante una llamada (IPN) al servidor del vendedor, si este último está registrado en nuestra plataforma de pago,
- mediante llamada de las callback onSuccess u onError por parte de la aplicación móvil.
Es necesario comprobar la integridad del mensaje (consulte aquí para obtener más detalles) e iniciar el procesamiento comercial del lado servidor (al recibir la IPN).
Nuestros ejemplos de código proporcionan un ejemplo de comprobación de la integridad de los mensajes a través de su servidor de vendedor: el endPoint verifyResult llamado en el método verifyResult de la aplicación.
El siguiente código de ejemplo se basa en los ejemplos de código iOS y en el servidor del vendedor a su disposición.
func verifyPayment(_ lyraResponse: LyraResponse) { serverCommunication.verifyPayment(lyraResponse, onVerifyPaymentCompletion: { (paymentVerified, isConnectionError) in if paymentVerified { self.showMessage("Payment success") } else { self.showMessage("Payment verification fail") } }) }
- (void) verifyPayment:(LyraResponse*) lyraResponse { [_serverComunication verifyPayment:lyraResponse withCompletion:^(BOOL paymentVerified, BOOL isErrorConnection) { if(paymentVerified) [self showMessage: @"Payment success"]; else [self showMessage: @"Payment verification fail"]; }]; }
Personalizar el SDK
Se puede personalizar el SDK de modo que las vistas generadas desde el SDK (formulario de pago) se muestren en los mismos colores y la misma fuente que las utilizadas en su aplicación.
Puede definir:
- un color principal,
- un color secundario,
- la fuente a utilizar en todos los textos que se muestran en el SDK.
El color principal permite modificar:
- el color de fondo del encabezado,
- el color de fondo del botón “Pagar”,
- el color del mensaje de cierre de la ventana emergente de ayuda sobre el CVV,
- el color del mensaje de cierre de la ventana emergente de ayuda sobre la elección de la marca,
- el color de resalte y descripción del campo cuando se edita,
- el color del texto en el mensaje de pago en curso,
- el color del indicador giratorio en el mensaje de pago en curso.
El color secundario permite modificar:
- El color del logotipo de la flecha de retroceso en el encabezado del SDK,
- el color de los textos en el encabezado del SDK,
- el color del texto en el botón “Pagar”.
Para personalizar el SDK de pago, simplemente añada un archivo PaymentSdkTheme.plist a su proyecto e indique en este archivo los colores a utilizar en código hexadecimal:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PaymentSDKColor</key>
<dict>
<key>PaymentSDK_PrimaryColor</key>
<string>#293C7A</string>
<key>PaymentSDK_SecondaryColor</key>
<string>#FFFFFF</string>
</dict>
</dict>
</plist>
Es también posible cambiar la fuente utilizada con la tecla PaymentSDKFont
. Precaución: Para que se tenga en cuenta la fuente que se utilizará, debe agregarse a su aplicación, en su proyecto de iOS.
También se puede personalizar el texto del botón de pago. Para ello, al llamar a Lyra.process(), envíe el texto que desea como valor de Lyra.customPayButtonLabel
en el diccionario de opciones. El diccionario de opciones es un parámetro facultativo. Por ejemplo:
Lyra.process(self, formToken, onSuccess: { ( _ lyraResponse: LyraResponse) -> Void //Verify the payment using your server: Check the response integrity by verifying the hash on your server self.verifyPayment(lyraResponse) }, onError: { (_ error: LyraError, _ lyraResponse: LyraResponse?) -> Void //TODO: Handle Payment SDK error in process payment request self.showMessage("Payment fail: \(error.errorMessage)") }, [Lyra.customPayButtonLabel: "MyCustomLabel"])
Habilitar la funcionalidad de escaneo de la tarjeta
Es posible, en el SDK, activar la funcionalidad de escaneo de tarjetas. Esta función permite a un usuario no introducir los datos de su tarjeta manualmente, sino utilizar la cámara de su dispositivo móvil para escanearla y rellenar automáticamente el formulario de pago.
Para habilitar esta funcionalidad, debe:
Integrar la biblioteca LyraCardsRecognizer en su proyecto Xcode
- Mediante CocoaPods
Para integrar la biblioteca a su proyecto Xcode utilizando CocoaPods, indíquelo en su PodFile:
target 'MyApp' do pod 'LyraCardsRecognizer' end
A continuación, instálelo con
pod update
.- A través de Carthage
Para integrar la biblioteca LyraCardsRecognizer en su proyecto Xcode usando Carthage, indique en su
Cartfile
:binary "https://raw.githubusercontent.com/lyra/ios-cards-camera-recognizer/2.0.0/LyraCardsRecognizer.json" == 2.0.0
Agregue el archivo
LyraCardsRecognizer.xcframework
a su proyecto de iOS.Al inicializar el SDK, envíe true como valor para la clave cardScanningEnabled en el diccionario de las opciones de configuración (consulte Inicialización del SDK).
//Active card scan configurationOptions[Lyra.cardScanningEnabled] = true
//Active card scan [configurationOptions setValue:[NSNumber numberWithBool:true] forKey:Lyra.cardScanningEnabled];
- En el archivo Info.plist de su aplicación, añada la clave NSCameraUsageDescription y describa la razón para usar la cámara.
