PAGO INAPP - iOS
En esta sección vamos a explicar como realizar la integración inApp y cuales funcionalidades disponibles del framework SDKInApp para el sistema operativo iOS.
Configuración
Para realizar este tipo de integración, es necesario tener una configuración previa:
- En primer lugar, integrar la libreria en el proyecto:
Marcar la opción de "Copy items if needed".
- Añadir los binarios al proyecto: En el apartado de
"Frameworks, Libraries, and Embedded Content" del Target
seleccionar "Embed & Sign”.
- Importar TPVVInLibrary al proyecto.
- En SWIFT:
import TPVVInLibrary
- En Objective:
#import <TPVVInLibrary/TPVVInLibrary-Swift.h>
- En SWIFT:
- Opción Enable Bitcode: Para un correcto “Build” y ejecución de la App, es recomendable acceder a la opción de “Enable Bitcode” y ponerla a "NO". Esta opción podrá encontrarla en Build Settings del correspondiente Target.
- Publicar en el App Store: Para poder realizar la subida
de la aplicación en el App Store debe tener la librería
integrada del framework para dispositivos móviles físicos.
Además son necesarios 2 requisitos:
- Utilizar una versión de xcode 11.1 o superior para el desarrollo de la app.
- Utilizar como SDK de base la versión de iOS 13.
- Configuración de parámetros:
Parámetro Configuración Tipo Descripción Licencia de la aplicación TPVVConfiguration.shared.appLicense = "XXXXXXXXXX" Obligatorio Es un código alfanumérico proporcionado por Redsys para validar las aplicaciones que hacen uso de la librería. Entorno TPVVConfiguration.shared.appEnviroment = EnviromentType.Real
TPVVConfiguration.shared.appEnviroment = EnviromentType.TestObligatorio Entorno donde va a realizarse la integración. El valor utilizado dependerán del entorno donde quiera realizarse la integración: test o real. Fuc del comercio TPVVConfiguration.shared.appFuc = "XXXXXXXXXXX" Obligatorio Código de identificación del comercio: Terminal TPVVConfiguration.shared.appTerminal = "XX" Obligatorio El terminal registrado para realizar el pago Código moneda TPVVConfiguration.shared.appCurrency = "978" Obligatorio Código de la moneda utilizada, por defecto "978" corresponde a euros Nombre del titular TPVVConfiguration.shared.appMerchantTitular = "XXX" Opcional Nombre del titular del pago Métodos de Pago: TPVVConfiguration.shared.appMerchantPayMethods = PaymentMethod.card Opcional Forma de pago con tarjeta(Aplica para el pago a través de WebView). Posibles valores: - Card : pago por tarjeta
- Transfer : pago por transferencia
- Domiciliation : pago por domiciliación
- Paypal : pago con PayPal:
- ImmediatePayment : pago con Bizum
Url del comercio TPVVConfiguration.shared.appMerchantURL = "XXX" Opcional Url del comercio Nombre del comercio TPVVConfiguration.shared.appMerchantName = "XXX" Opcional Nombre del comercio Datos adicionales TPVVConfiguration.shared.appMerchantData = "XXX" Opcional En este campo, el comercio puede introducir aquellos datos que considere oportunos (referencias internas, datos propios del negocio). Tras el pago, este campo se le devolverá en la notificación al comercio. Descripción del comercio TPVVConfiguration.shared.appMerchantDescription = "XXX" Opcional Descripción del comercio. Grupo de comercios TPVVConfiguration.shared.appMerchantGroup = "XX" Opcional En el caso en el que el comercio pertecezca a un grupo de comercios
Parámetro Configuración Tipo Descripción Licencia de la aplicación TPVVConfiguration.shared.appLicense = @"XXXXXXXXX"; Obligatorio Es un código alfanumérico proporcionado por Redsys para validar las aplicaciones que hacen uso de la librería. Entorno TPVVConfiguration.shared.appEnviroment = EnviromentTypeReal;
TPVVConfiguration.shared.appEnviroment = EnviromentTypeTest;Obligatorio Entorno donde va a realizarse la integración. El valor utilizado dependerán del entorno donde quiera realizarse la integración: test o real. Fuc del comercio TPVVConfiguration.shared.appFuc = @“XXXXXXXXX”; Obligatorio Código de identificación del comercio: Terminal TPVVConfiguration.shared.appTerminal = @"XX"; Obligatorio El terminal registrado para realizar el pago Código moneda TPVVConfiguration.shared.appCurrency = @"978"; Obligatorio Código de la moneda utilizada, por defecto "978" corresponde a euros Nombre del titular TPVVConfiguration.shared.appMerchantTitular = @"XXX"; Opcional Nombre del titular del pago Métodos de Pago: TPVVConfiguration.shared.appMerchantPayMethods = PaymentMethodCard; Opcional Forma de pago con tarjeta(Aplica para el pago a través de WebView). Posibles valores: - Card : pago por tarjeta
- Transfer : pago por transferencia
- Domiciliation : pago por domiciliación
- Paypal : pago con PayPal:
- ImmediatePayment : pago con Bizum
Url del comercio TPVVConfiguration.shared.appMerchantURL = @"XXX"; Opcional Url del comercio Nombre del comercio TPVVConfiguration.shared.appMerchantName = @"XXX"; Opcional Nombre del comercio Datos adicionales TPVVConfiguration.shared.appMerchantData = @"XXX"; Opcional En este campo, el comercio puede introducir aquellos datos que considere oportunos (referencias internas, datos propios del negocio). Tras el pago, este campo se le devolverá en la notificación al comercio. Descripción del comercio TPVVConfiguration.shared.appMerchantDescription = @"XXX"; Opcional Descripción del comercio. Grupo de comercios TPVVConfiguration.shared.appMerchantGroup = @"XX"; Opcional En el caso en el que el comercio pertecezca a un grupo de comercios
Pago Directo
Para realizar un pago directo es necesario haber configurado previamente los parámetros obligatorios en el objeto TPVVConfiguration. Tras fijar éstos parámetros, en cada pago es necesario indicar los siguientes campos:
- orderNumber: Código alfanumérico identificativo de la operación que tiene que ser único. [OBLIGATORIO]
- amount: Importe de la operación. [OBLIGATORIO]
- identifier: En caso de no indicar nada realiza un
pago normal, en caso de introducir una referencia valida se
realiza un pago con referencia, y por último, para realizar un
pago con solicitud de referencia hay que utilizar el valor de la
constante
TPVVConfiguration.shared.REQUEST_REFERENCE
. [OPCIONAL] - productDescription: Descripción del pago. [OPCIONAL]
- transactionType: Utilizando las constantes
definidas en
TPVVConstants
. [OBLIGATORIO]- Normal: TPVVConstants.PAYMENT_TYPE_NORMAL
- Preautorización: TPVVConstants.PAYMENT_TYPE_PREAUTHORIZATION
- Tradicional: TPVVConstants.PAYMENT_TYPE_TRADITIONAL
- Autenticación: TPVVConstants.PAYMENT_TYPE_AUTHENTICATION
- Normal: TransactionTypeNormal;
- Preautorización:TransactionTypePreauthorization;
- Tradicional:TransactionTypeTraditional;
- Autenticación:TransactionTypePaymentTypeAuthentication;
- extraParams: Diccionario de variables con clave-valor. En caso de querer utilizar parámetros adicionales en la operación se deben introducir tantas como se desee; en caso contrario, dejar vacío. [OPCIONAL]
- uiViewConfig:Personalización de la vista del pago directo. [OBLIGATORIO]
Personalización
Es posible personalizar algunos aspectos de la pantalla del pago directo tales como el logo, fondo de pantalla, colores y literales.
Para llevar a cabo la configuración de la pantalla del pago directo se hace uso del objeto del tipo TPVInAppUIConfig.:
- Logo (logo)
- Color de fondo de pantalla (setBackgroundViewColor)
- Imagen de fondo de pantalla (setBackgroundImageView)
- Texto de botón cancelar (setCancelButtonText)
- Texto de botón Continuar (setContinueButtonText)
- Texto, color y fuente de número de tarjeta (setNumberCardLabel)
- Texto color y fuente de fecha de caducidad (setExpireDateLabel)
- Texto color y fuente de código de seguridad (setCVVLabel)
- Texto color y fuente de texto descriptivo (setInfoPaymentLabel)
Ejemplo de personalización:
//Se instancia la personalización
let labelCardNumber: PaymentUILabelConfig = PaymentUILabel.create(text: "N.º de tarjeta", textColor:
.black, textFont: .systemFont(ofSize: 16, weight: .semibold))
let labelExpiredDate: PaymentUILabelConfig = PaymentUILabel.create(text: "Caducidad", textColor:
.black, textFont: .systemFont(ofSize: 16, weight: .semibold))
let labelCVC: PaymentUILabelConfig = PaymentUILabel.create(text: "Cód. seguridad", textColor: .black,
textFont: .systemFont(ofSize: 16, weight: .semibold))
let infoPayment: PaymentUILabelConfig = PaymentUILabel.create(text: "Por favor, compruebe que el
número de tarjeta y el resto de datos son exactamente los mismos que aparecen en la tarjeta.",
textColor: .black, textFont: .systemFont(ofSize: 16, weight: .semibold))
let extraParams: [String:String] = [“Extra1”:”valor1”,”Extra2”:”valor2”]
let uiConfig = TPVInAppUIConfig()
.setCancelButtonText("Cancelar")
.setContinueButtonText("Continuar")
.setNumberCardLabel(labelCardNumber)
.setExpireDateLabel(labelExpiredDate)
.setCVVLabel(labelCVC)
.setInfoPaymentLabel(infoPayment)
.setLogo(logo: UIImage(named:"logoEntidad"))
.setBackgroundImageView(image: UIImage(named:"background"))
.setBackgorundViewColor(color: .lightGray)
//Se crea el objeto de pago
let dpView = DirectPaymentViewController(orderNumber: order, amount: amount.floatValue,
productDescription: productDescription, transactionType: operationTypeValue, identifier:
paymentIdentifier, extraParams: extraParams, uiViewConfig: uiConfig)
dpView.delegate = self
present(dpView, animated: true, completion: nil)
//Se instancia la personalización
PaymentUILabelConfig *labelCardNumber = [[PaymentUILabelConfig alloc]
initWithText:@"Número Card" textColor:UIColor.blackColor textFont:[UIFont
fontWithName:@"HelveticaNeue" size:16]];
PaymentUILabelConfig *labelExpiredDate = [[PaymentUILabelConfig alloc]
initWithText:@"Expiry date" textColor:UIColor.blackColor textFont:[UIFont
fontWithName:@"HelveticaNeue" size:16]];
PaymentUILabelConfig *labelCVC = [[PaymentUILabelConfig alloc]
initWithText:@"Security code"
textColor:UIColor.blackColor textFont:[UIFont fontWithName:@"HelveticaNeue" size:16]];
PaymentUILabelConfig *infoPayment = [[PaymentUILabelConfig alloc]
initWithText:@"Payment info"
textColor:UIColor.blackColor textFont:[UIFont fontWithName:@"HelveticaNeue" size:16]];
NSMutableDictionary *extraParams = [[NSMutableDictionary alloc]
initWithObjectsAndKeys:@{ @”Extra1” : “valor1”, @”Extra2” : “valor2”};
TPVInAppUIConfig *config = [TPVInAppUIConfig new];
[config setCancelButtonText:@"Cancel"];
[config setContinueButtonText:@"Continue"];
[config setNumberCardLabel:labelCardNumber];
[config setExpireDateLabel:labelExpiredDate];
[config setCVVLabel:labelCVC];
[config setInfoPaymentLabel:infoPayment];
[config setLogoWithLogo:[UIImage imageNamed:@"appleIcon"]];
[config setBackgroundImageViewWithImage:[UIImage imageNamed:@"background"]];
[config setBackgorundViewColorWithColor:UIColor.lightGrayColor];
//Se crea el objeto de pago
DirectPaymentViewController *pay = [[DirectPaymentViewController alloc]
initWithOrderNumber:@"" amount: amount productDescription:@""
transactionType:TransactionTypeNormal identifier:@"" extraParams: extraParams
uiViewConfig:config];
pay.delegate = self;
[self presentViewController:pay animated:true completion:nil];
Pago WebView
Las operaciones de pago WebView, se realizan mediante la propia web del comercio, con la única diferencia de que la vista se encuentra adaptada para dispositivos móviles. Este tipo de pago soporta tanto pagos normales como pagos por referencia.
- orderNumber: Código alfanumérico identificativo de la operación que tiene que ser único. [OBLIGATORIO]
- amount: Importe de la operación.
- identifier: En caso de no indicar nada realiza un pago normal, en caso de introducir una referencia valida se realiza un pago con referencia, y por último, para realizar un pago con solicitud de referencia hay que utilizar el valor de la constante TPVVConfiguration.shared.REQUEST_REFERENCE. [OPCIONAL]
- productDescription: Descripción del pago. [OPCIONAL]
- transactionType: Utilizando las constantes
definidas en TPVVConstants. [OBLIGATORIO]
- Normal: TPVVConstants.PAYMENT_TYPE_NORMAL
- Preautorización: TPVVConstants.PAYMENT_TYPE_PREAUTHORIZATION
- Tradicional: TPVVConstants.PAYMENT_TYPE_TRADITIONAL
- Autenticación: TPVVConstants.PAYMENT_TYPE_AUTHENTICATION
- Normal: TransactionTypeNormal;
- Preautorización:TransactionTypePreauthorization;
- Tradicional:TransactionTypeTraditional;
- Autenticación:TransactionTypePaymentTypeAuthentication;
- extraParams: Diccionario de variables con clave-valor. En caso de querer utilizar parámetros adicionales en la operación se deben introducir tantas como se desee; en caso contrario, dejar vacío. [OPCIONAL]
- Idioma: Para los lenguajes hay que indicar un código de
idioma válido, en caso de no indicar nada se configura por
defecto en español.
TPVVConfiguration.shared.appMerchantConsumerLanguage = "X"
TPVVConfiguration.shared.appMerchantConsumerLanguage = @"X"; - Redirección a las URl de resultado: Existe la
posibilidad de redireccionar a una URL definida por el
desarrollador tras realizar la operación. Una para el caso en
que la operación se realice correctamente y otra en caso de
error.
TPVVConfiguration.shared.appURLOK = "XXX" TPVVConfiguration.shared.appURLKO = "XXX"
TPVVConfiguration.shared.appURLKO = @"XXX"; TPVVConfiguration.shared.appURLOK = @"XXX";
A continuación se presenta un ejemplo en Swift y en Objective.
let wpView = WebViewPaymentController(orderNumber: order, amount: amount.floatValue,
productDescription: productDescription, transactionType: operationTypeValue, identifier:””,
extraParams: extraParams)
wpView.delegate = self
present(wpView, animated: true, completion: nil)
Para poder obtener la respuesta de la operación deberá implementar el siguiente delegado WebViewPaymentResponseDelegate
extension WebViewPaymentTableViewController: WebViewPaymentResponseDelegate {
func responsePaymentKO(response: (WebViewPaymentResponseKO)) {
}
func responsePaymentOK(response: (WebViewPaymentResponseOK)) {
}
}
WebViewPaymentController *pay = [[WebViewPaymentController alloc] initWithOrderNumber:@"" amount:
amount productDescription:@"" transactionType:TransactionTypeNormal identifier:@"" extraParams:
extraParams];
pay.delegate = self;
[self presentViewController:pay animated:true completion:nil];
Para poder obtener la respuesta de la operación deberá implementar el siguiente delegado WebViewPaymentResponseDelegate
@interface ViewController () <WebViewPaymentResponseDelegate>
@end
- (void)responsePaymentKOWithResponse:(WebViewPaymentResponseKO *)response{
}
- (void)responsePaymentOKWithResponse:(WebViewPaymentResponseOK *)response {
}
Respuesta de la operación
En función del resultado de la operación recibiremos un objeto ResultResponse con los datos de la operación o un objeto del tipo ErrorResponse con el código de error y la descripción.
ResultResponse
public var code: Int
public var desc: String
public var Ds_Card_Country: String
public var Ds_Amount:String
public var Ds_MerchantData:String
public var Ds_Currency:String
public var Ds_Order:String
public var Ds_MerchantCode:String
public var Ds_Card_Type:String
public var Ds_Card_Brand:String
public var Ds_AuthorisationCode:String
public var Ds_Language:String
public var Ds_SecurePayment:String
public var Ds_Response:String
public var Ds_TransactionType:String
public var Ds_Terminal:String
public var Ds_ExpiryDate:String
public var Ds_Merchant_Identifier:String
public var Ds_Extra_Params:[String:String]
@interface DirectPaymentResponseOK : NSObject
@property (nonatomic) NSInteger code;
@property (nonatomic, copy) NSString * _Nonnull desc;
@property (nonatomic, copy) NSString * _Nonnull Ds_Card_Country;
@property (nonatomic, copy) NSString * _Nonnull Ds_Amount;
@property (nonatomic, copy) NSString * _Nonnull Ds_MerchantData;
@property (nonatomic, copy) NSString * _Nonnull Ds_Currency;
@property (nonatomic, copy) NSString * _Nonnull Ds_Order;
@property (nonatomic, copy) NSString * _Nonnull Ds_MerchantCode;
@property (nonatomic, copy) NSString * _Nonnull Ds_Card_Type;
@property (nonatomic, copy) NSString * _Nonnull Ds_Card_Brand;
@property (nonatomic, copy) NSString * _Nonnull Ds_AuthorisationCode;
@property (nonatomic, copy) NSString * _Nonnull Ds_Language;
@property (nonatomic, copy) NSString * _Nonnull Ds_SecurePayment;
@property (nonatomic, copy) NSString * _Nonnull Ds_Response;
@property (nonatomic, copy) NSString * _Nonnull Ds_TransactionType;
@property (nonatomic, copy) NSString * _Nonnull Ds_Terminal;
@property (nonatomic, copy) NSString * _Nonnull Ds_ExpiryDate;
@property (nonatomic, copy) NSString * _Nonnull Ds_Merchant_Identifier;
@property (nonatomic, copy) NSMutableDictionary * _Nonnull Ds_Extra_Params;
ErrorResponse
public var code:Int
public var desc:String
@interface DirectPaymentResponseKO : NSObject
@property (nonatomic) NSInteger code;
@property (nonatomic, copy) NSString * _Nonnull desc;
Código | Descripción |
---|---|
11 | La firma del mensaje no es correcta |
29 | Fallo en la criptografía del servicio |
31 | La aplicación es incorrecta |
60 | Formato de JSON incorrecto |
61 | Error al obtener la clave de firma del comercio |
62 | Tipo de firma del terminal no soportado |
78 | Error propio del TPV virtual de Redsys (Código SIS en la descripción) |
5548 | Error genérico (Detalles en la descripción) |
5550 | Error de conexión (Detalles en la descripción) |
5551 | Sin parámetros en la respuesta |