Skip to content

Latest commit

 

History

History
272 lines (203 loc) · 10.7 KB

authorize-payment-objc.md

File metadata and controls

272 lines (203 loc) · 10.7 KB

Autorizar el pago en una aplicación iOS (Objective C)

La biblioteca de Khipu Inside se llama khenshin y se distribuye como un Cocoapod.

En este repositorio se encuentra una App de demostración en la carpeta app/ios/objc . Para ejecutarla se debe abrir con XCode.

Los pasos necesarios para utilizar la biblioteca nativa iOS para B2app son:

  1. Agregar cocoapod khenshin
  2. Flags de compilación
  3. Inicialización de la biblioteca
  4. Invocar Khipu desde tu app

Tamaño de la biblioteca (cuanto afecta a tu aplicación)

La biblioteca khenshin se distribuye como un Cocoapod Universal, es decir, que incluye versiones en las cuatro arquitecturas soportadas por iOS, tanto para simuladores como para dispositivos físicos.

El tamaño de la biblioteca se detalla según la siguiente tabla dependiendo de la arquitectura en que se utilice.

Arquitectura Tamaño
Arm64 12MB
Armv7 11MB
i386 11MB
x86_64 11MB

khenshin utiliza, además, otras bibliotecas como dependencia, el tamaño final que agregará a tu aplicación depende del grado de duplicidad de esas bibliotecas. A modo de ejemplo. Una applicación vacía, que sólo utiliza khenshin y en una arquitectura determinada es de 32MB, es decir, el tamaño que khenshin agregará a tu aplicación varía entre 11 y 32MB dependiendo del grado de intersección de las bibliotecas utilizadas.

Las bibliotecas que khenshin utiliza como dependencia son las siguientes:

PODS:
  - ActionSheetPicker-3.0 (2.3.0)
  - AFNetworkActivityLogger (3.0.0):
    - AFNetworking/NSURLSession (~> 3.0)
  - AFNetworking (3.1.0):
    - AFNetworking/NSURLSession (= 3.1.0)
    - AFNetworking/Reachability (= 3.1.0)
    - AFNetworking/Security (= 3.1.0)
    - AFNetworking/Serialization (= 3.1.0)
    - AFNetworking/UIKit (= 3.1.0)
  - AFNetworking-Synchronous/3.x (1.1.0):
    - AFNetworking (~> 3.0)
  - AFNetworking/NSURLSession (3.1.0):
    - AFNetworking/Reachability
    - AFNetworking/Security
    - AFNetworking/Serialization
  - AFNetworking/Reachability (3.1.0)
  - AFNetworking/Security (3.1.0)
  - AFNetworking/Serialization (3.1.0)
  - AFNetworking/UIKit (3.1.0):
    - AFNetworking/NSURLSession
  - BEMCheckBox (1.4.1)
  - FMDB (2.7.5):
    - FMDB/standard (= 2.7.5)
  - FMDB/standard (2.7.5)
  - IQKeyboardManager (5.0.3)
  - JSONModel (1.7.0)
  - khenshin (1.548):
    - ActionSheetPicker-3.0 (= 2.3.0)
    - AFNetworkActivityLogger (= 3.0.0)
    - AFNetworking (= 3.1.0)
    - AFNetworking-Synchronous/3.x (= 1.1.0)
    - BEMCheckBox (= 1.4.1)
    - FMDB (= 2.7.5)
    - IQKeyboardManager (= 5.0.3)
    - JSONModel (= 1.7.0)
    - PPTopMostController (= 0.0.1)
    - RaptureXML (= 1.0.1)
    - TTTAttributedLabel (= 2.0.0)
  - PPTopMostController (0.0.1)
  - RaptureXML (1.0.1)
  - Toast (3.1.0)
  - TTTAttributedLabel (2.0.0)

Es importante mencionar que el tamaño al que nos referimos en este documento corresponde al tamaño de la aplicación instalada, lo que el usuario debe descargar de Apple Store es siempre menor y depende de optimizaciones que haga Apple con la aplicación.

Agregar cocoapod khenshin

Para instalar khenshin en tu proyecto es necesario utilizar cocoapods, para eso se debe crear o modificar un archivo Podfile para que contenga la referencia al pod de khenshin.

target 'Khipu Inside Demo' do
    # Uncomment this line if you're using Swift or would like to use dynamic frameworks
    use_frameworks!

    # Pods for Khipu Inside Demo
    pod 'khenshin' #Fija la versión antes de pasar a producción
end

Luego, para instalar el Pod se debe ejecutar pod install que descargará el pod de khenshin, todas sus dependencias y modificará el proyecto Xcode para incluirlas.

> pod install
Analyzing dependencies
Downloading dependencies
Using AFNetworkActivityLogger (3.0.0)
Using AFNetworking (3.1.0)
Using AFNetworking-Synchronous (1.1.0)
Using ActionSheetPicker-3.0 (2.3.0)
Using BEMCheckBox (1.4.1)
Using FMDB (2.7.5)
Using IQKeyboardManager (5.0.3)
Using JSONModel (1.7.0)
Using PPTopMostController (0.0.1)
Using RaptureXML (1.0.1)
Using TTTAttributedLabel (2.0.0)
Using Toast (3.1.0)
Using khenshin (1.599)
Generating Pods project
Integrating client project
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 11 total pods installed.

Si tu proyecto era del tipo .xcodeproj, ahora tendrás un proyecto del tipo .xcworkspace, de ahora en adelante debes abrir éste con Xcode.

Flags de compilación

Valida que tu proyecto tenga configurada la banderas -ObjC y -l"xml2"

Project -> Build Settings -> Other Linker Flags -> -Objc -l"xml2"

Inicialización de la biblioteca

En el archivo AppDelegate.m debes inicializar khenshin en el selector didFinishLaunchingWithOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    [KhenshinInterface initWithBuilderBlock:^(KhenshinBuilder *builder) {
        builder.APIUrl = @"https://khipu.com/app/enc/";
    }];
    return YES;
}

Parámetros de inicialización de khenshin

En la sección anterior se utilizó la construcción minimal de khenshin, a continuación veremos todos los parámetros opcionales.

    [KhenshinInterface initWithBuilderBlock:^(KhenshinBuilder *builder) {
        # Obligatorios
        builder.APIUrl = @"https://khipu.com/app/enc/";

        # Los siguientes parámetros son opcionales

        # Permitir guardar credenciales bancarias en el dispositivo, pre-determinado no
        builder.allowCredentialsSaving = YES;

        # Estilo del botón continuar, puede ser:
        # - KHMainButtonDefault: Botón en la barra de herramientas, pre-determinado
        # - KHMainButtonFatOnForm: Botón en los formularios con fondo sólido
        # - KHMainButtonSkinnyOnForm: Botón en los formularios sin fondo
        builder.mainButtonStyle = KHMainButtonFatOnForm;

        # Esconder la barra de navegación estilo browser, pre-determinado: no
        builder.hideWebAddressInformationInForm = YES;

        # Usar el logo de la app en la barra centrar del toolbar, pre-determinado: no
        builder.useBarCenteredLogoInForm = YES;

        # Logo para usar en la barra (UIImage), pre-determinado: nil
        builder.barCenteredLogo = [[UIImage alloc] init];

        # Logo para usar en la izquierda de la barra (UIImage), pre-determinado: nil
        builder.barLeftSideLogo = [[UIImage alloc] init];

        # Color principal de la app, barra principal y botones principales (UIColor)
        builder.principalColor = [UIColor blueColor];

        # Color principal oscuro, para barra de status (UIColor)
        builder.darkerPrincipalColor = [UIColor blackColor];

        # Color secundario (UIColor)
        builder.secondaryColor = [UIColor redColor];

        # Color de fondo de los formularios (UIColor)
        builder.backgroundColor = [UIColor whiteColor];

        # Tinte para la barra principal
        builder.barTintColor = [UIColor whiteColor];

        # Color para el indicador de progreso
        builder.progressColor = [UIColor redColor];

        # Tamaño del font de la barra de navegación
        builder.navigationFontSize = 10.0;

        # Color del texto de la barra de navegación
        builder.navigationBarTextTint = [UIColor whiteColor];

        # Color del texto en formularios
        builder.textColorHex = @"#000000";

        # Color de los controles en formularios
        builder.normalControlColorHex = @"#333333";

        # Font normal a usar
        builder.font = [UIFont fontWithName:@"My-Font-Regular" size:16.0];

        # Font bold a usar
        builder.fontBold = [UIFont fontWithName:@"My-Font-Bold" size:16.0];

        # Font light a usar
        builder.fontLight = [UIFont fontWithName:@"My-Font-Light" size:16.0];

        # No desplegar las páginas de salida, en vez, retornar directamente a la aplicación host.
        builder.skipExitPage = YES;

        # Mantener cookies entre una ejecución y otra
        builder.keepCookies = YES;

        # Imagen para poner en el fondo de los formularios
        builder.backgroundImage = [[UIImage alloc] init];

        # Imagen para usar como spinner de progreso
        builder.spinnerImage = [[UIImage alloc] init];
        
        # Separador de decimales
        builder.decimalSeparator = @",";

        # Separador de miles
        builder.groupingSeparator = @".";        

        # Vista que se usa en el encabezado de los formularios khenshin, debe ser del tipo UIView<ProcessHeader>
        PaymentProcessHeader *processHeader = [[[NSBundle mainBundle] loadNibNamed:@"PaymentProcessHeader" owner:self options:nil] objectAtIndex:0];        
        builder.processHeader = processHeader;

        # Vista que se usar al terminar un pago exitoso, debe ser del tipo UIViewController<ProcessExit>
        PaymentProcessSuccess *processSuccess = [[[NSBundle mainBundle] loadNibNamed:@"PaymentProcessSuccess" owner:self options:nil] objectAtIndex:0];        
        builder.processSuccess = processSuccess;

        # Vista que se usar al terminar un pago con error, debe ser del tipo UIViewController<ProcessExit>
        PaymentProcessFailure *processFailure = [[[NSBundle mainBundle] loadNibNamed:@"PaymentProcessFailure" owner:self options:nil] objectAtIndex:0];        
        builder.processFailure = processFailure;

        # Vista que se usar al terminar un pago con dudas sobre el resultado, debe ser del tipo UIViewController<ProcessExit>
        PaymentProcessWarning *processWarning = [[[NSBundle mainBundle] loadNibNamed:@"PaymentProcessWarning" owner:self options:nil] objectAtIndex:0];        
        builder.processWarning = processWarning;
        

    }];

}

Invocar Khipu desde tu app

Para invocar Khipu se utiliza el método startEngineWithPaymentExternalId de la clase KhenshinInterface, para esto es necesario contar con el ID de pago generado en pasos anteriores.

    [KhenshinInterface startEngineWithPaymentExternalId:<ID de pago>
                                         userIdentifier:@""
                                      isExternalPayment:YES
                                                success:^(NSURL *returnURL){
        NSLog(@"SUCCESS");
    }
                                                failure:^(NSURL *returnURL){
        NSLog(@"FAILURE");
    }
                                               animated:NO];

Recordar que siempre se debe esperar la notificación por API de khipu para considerar que un pago aprobado. Como se explican en la documentación del proceso de pago.