--- ###### tags: `Banks` --- # Tatra Banka API Pilot 2 | Version |Date |Author | Comment | | ------------- |---------- |------------- | ---------| |0.1 |27.06.2019 |Alexey Krichun | Initial proposition |0.2 |01.07.2019 |Alexey Krichun | Update after review |0.2.1| 02.07.2019| Daniel Meltzer| add iOS part| |0.3| 03.07.2019| Alexey Krichun, Daniel Meltzer| Changed BalanceData field types| |0.4| 15.07.2019| Alexey Krichun| Update PayKeyErrorFactory, authRequiredError, autorizePayment| |0.5| 18.07.2019| Oleksii Serha| Update setup api call, authRequiredError(), wrongPinError()| |0.6| 19.07.2019| Andrey Savitskiy| Update errors api call, authRequired:, wrongPinError:| |0.7| 24.07.2019| Oleksii Serha| added new error - missingContactPermissionError()| |0.8| 13.08.2019| Andrey Savitskiy| Replace authorizePayment: completion block| |0.9| 14.08.2019| Evgen Sagidulin| Added `redirectionUri` parameter to TATRASetupData model| |0.10| 03.09.2019| Andrey Savitskiy| Updated `bankTempOOSError` method in error factory| |0.11| 04.09.2019| Andrey Savitskiy, Oleksii Serha| Updated `TBSetupData` for Android and IOS| This is a general callback interface, will be used across the documentation. #### Android ```java interface CompletionCallback<DATA> { void onSuccess(); void onSuccess(DATA data); void onError(Error error); } ``` #### iOS will be using blocks ## 1. Flow Lifecycle ### 1.1 Flow Started This method is invoked each time a flow starts, after tapping the PayKey button. #### Android ```java void onFlowStart(Context context); ``` #### iOS ```objectivec= - (void)onFlowStart; ``` ### 1.2 Flow Ended This method is invoked each time a flow ends, after user aborts the flow by tapping exit button or close of keyboard. #### Android ```java void onFlowStop(Context context); ``` #### iOS ```objectivec= - (void)onFlowStop; ``` ## 2. Flow Action Interface Methods ### 2.1 Setup This call will provide the setup data for the available flows. #### Android ```java= void setup(CompletionCallback<TBSetupData> completion); class TBSetupData { Boolean isActivated; String descriptionValidationRegex; String phoneValidationRegex; int descriptionValidationLength; BigDecimal minTransactionAmount; BigDecimal maxTransactionAmount; Uri redirectionUri; } ``` #### iOS ```objectivec= - (void)fetchSetupData:(nonnull TATRAFetchSetupDataCompletionBlock)completion; typedef void (^TATRAFetchSetupDataCompletionBlock)(__kindof PKError *_Nullable error, TATRASetupData * _Nonnull setupData); ``` ```objectivec= @interface TATRASetupData : PKSetupData @property (nonatomic, copy) NSString* descriptionValidationRegex; @property (nonatomic, copy) NSNumber* descriptionValidationLength; @property (nonatomic, copy) NSString* phoneValidationRegex; @property (nonatomic, assign) BOOL isActivated; @property (nonatomic, copy) NSString* redirectionUri; + (instancetype)setupDataWithDescriptionValidationRegex:(NSString*)descriptionRegex descriptionLength:(NSNumber*)length phoneValidationRegex:(NSString*)phoneRegex isActivate:(BOOL)isActivate amountValues:(PKAmountValues*)amountValues redirectionUri:(NSString*)redirectionUri; @end ``` ```objectivec= @interface PKSetupData : NSObject <NSCoding> @property (nonatomic, readonly) PKAmountValues* makePaymentValues; + (instancetype)setupDataWithAmountValues:(PKAmountValues*)amountValues; @end ``` ```objectivec= @interface PKAmountValues : NSObject<NSCoding> @property (nonatomic, readonly) NSNumber* minValue; @property (nonatomic, readonly) NSNumber* maxValue; +(instancetype)amountWithMinValue:(NSNumber *)minValue maxValue:(NSNumber *)maxValue; @end ``` ### 2.2 Errors Each api call can return an error. Each error type will show a different screen or a behavior in the flow. ### 2.2.1 Fatal Error This error is irrecoverable. The user will be able to exit the flow. ### 2.2.2 Error Factory A factory with the required errors will be provided as part of the SDK. Additional errors can be created programatically using the `Error` class. #### Android ```java= class PayKeyErrorFactory { static Error generalError(String title, String message); static Error authRequiredError(String title, boolean showConditions); static Error executePaymentError(String title, String message); static Error amountLimitError(String title, String message); static Error sameRecipientError(String title, String message); static Error serviceUnavaiableError(String title, String message); static Error networkError(String title, String message); static Error wrongPinError(String title, boolean applicationBlocked); static Error bankTempOOSError(String paymentId); static Error missingContactPermissionError(String title, String subtitle, Uri uri); } ``` #### iOS ```objectivec @interface TATRAErrorFactory : NSObject +(PKError*)generalError:(NSString*)title message:(NSString*)message; +(PKError*)executePaymentError:(NSString*)title message:(NSString*)message; +(PKError*)amountLimitError:(NSString*)title message:(NSString*)message; +(PKError*)sameRecipientError:(NSString*)title message:(NSString*)message; +(PKError*)serviceUnavaiableError:(NSString*)title message:(NSString*)message; +(PKError*)networkError:(NSString*)title message:(NSString*)message; +(PKError*)authRequired:(NSNumber*)showConditions title:(NSString*)title; +(PKError*)wrongPinError:(NSNumber*)applicationBlocked title:(NSString*)title; +(PKError*)bankTempOOSError:(NSString *)paymentId; @end ``` ## 3. Contacts ### 3.1 Top Contacts This api call will retrieve the list of top contacts to be presented #### Android ```java void getTopContacts(CompletionCallback<List<TTContact>> completion); class TTContact { String fullName; String phone; Uri image; } ``` #### iOS ```objectivec= - (void)fetchTopContacts:(nonnull TATRAContactsCompletionBlock)completion; typedef void (^TATRAContactsCompletionBlock)(__kindof PKError *_Nullable error, NSArray<TATRAContact*> * _Nonnull contacts); ``` TATRAContact ```objectivec= @interface TATRAContact : PKContact @property (nonatomic, strong, nullable) UIImage* icon; @property (nonatomic, strong) NSString* fullName; @end ``` PKContact ```objectivec= @interface PKContact : NSObject <PKContact, NSCoding> @end @protocol PKContact <NSObject> @property (nonatomic, strong) NSArray<PKPhoneNumber*>* phones; @end ``` ### 3.2 Additional Contacts This api call will return a list of all contacts to be presented in a contact list #### Android ```java void getContacts(CompletionCallback<List<TTContact>> completion) ``` #### iOS ```objectivec= - (void)fetchContacts:(nonnull TATRAContactsCompletionBlock)completion; typedef void (^TATRAContactsCompletionBlock)(__kindof PKError *_Nullable error, NSArray<TATRAContact*> * _Nonnull contacts); ``` ## 4. Payment ### 4.1 Execute Payment This api call will provide the gathered details collected during the user journey. The returned string will hold the text to be presented on the authentication screen. #### Android ```java void executePayment(TransactionRequest details, CompletionCallback<String> completion) class TransactionRequest { BigDecimal amount; String messageForRecipient; TTContact recepient; } ``` #### iOS ```objectivec= - (void)executePayment:(TATRARequest* _Nonnull)request completion:(nonnull TATRAPaymentCompletionBlock)completion; typedef void (^TATRAPaymentCompletionBlock)(__kindof PKError *_Nullable error, NSString* _Nullable confirmationString); @interface TATRARequest : NSObject @property (nonatomic, strong) TATRAContact* contact; @property (nonatomic, strong) NSNumber* amount; @property (nonatomic, copy) NSString* reference; @end ``` ### 4.2 Payment Authorization This api call will provide the auth data entered by the user for authentication. The returned string will be pated to the input field to share with a receiver. #### Android ```java void authorizePayment(AuthData data, CompletionCallback<String> completion); class AuthData { String pincode; } ``` #### iOS ```objectivec= - (void)authorizePayment:(NSString* _Nonnull)pincode completion:(nonnull TATRAPaymentCompletionBlock)completion; typedef void (^TATRAPaymentCompletionBlock)(__kindof PKError *_Nullable error, NSString* _Nullable confirmationString); ``` ### 4.3 Resubmit Payment If the `authorizePayment` request returns the `bankTempOOSError`, a confirmation screen will be shown and if users selects to retry the payment, the following API call will be called: #### Android ```java void resubmitPayment(String paymentId, CompletionCallback<String> completion) ``` #### iOS ```objectivec= - (void)resubmitPayment:(NSString* _Nonnull)paymentId completion:(nonnull TATRAPaymentCompletionBlock)completion; ``` ## 5. Account Balance This API call will return the current balance data. #### Android ```java void getBalance(CompletionCallback<BalanceData> completion) class BalanceData { BigDecimal balance; Date dueDate; } ``` #### iOS ```objectivec= -(void)fetchBalance:(TATRABalanceCompletionBlock _Nonnull)completion; typedef void (^TATRABalanceCompletionBlock)(__kindof PKError *_Nullable error, TATRABalanceData* _Nullable balanceData); @interface TATRABalanceData : NSObject @property (strong,nonatomic)NSNumber* balance; @property (strong,nonatomic)NSDate* dueDate; @end ``` ## 6. Get IBAN This API call will return the IBAN. #### Android ```java void getIban(CompletionCallback<String> completion) ``` #### iOS ```objectivec= - (void)getIban:(nonnull TATRAIBANCompletionBlock)completion; typedef void (^TATRAIBANCompletionBlock)(__kindof PKError *_Nullable error, NSString* _Nullable iban); ``` ## 7. Authorization If the authorization is required on `getBalance()` or `getIban()` calls, these calls should return an 'Auth Required' error (created by `ErrorFactory.authRequiredError()`/`[TATRAErrorFactory authRequired]` . The user will enter the PIN code and the following API call will be called: #### Android ```java void authorize(AuthData data, CompletionCallback<Void> completion) ``` #### iOS ```objectivec= - (void)authorize:(NSString* _Nonnull)pincode completion:(nonnull TATRAGeneralCompletionBlock)completion; ```