Requesting a Payment

The following steps summarize an in-app payment request:

  • 3rd party backend uses the Scan to Pay API to create a transaction code (which contains the amount, references, etc.).
  • The 3rd party app calls Scan to PayKit, passing in this newly created code.
  • The Scan to Pay in-app library will facilitate the payment and call a delegate method to return a result and reference indicating the payment status.
  • The 3rd backend will then query the Scan to Pay system with the returned reference to guarantee the payment status. Alternatively, the 3rd backend will query itself to see if Scan to Pay has notified it of a new payment.
📘

Note

It is imperative that the 3rd party app does not trust the library's result as the final status. A backend API call must be done to verify the payment status from the notification.

Calling the Checkout Method

The following snippet illustrates how to invoke the payment request from Swift:

import Scan to PayKit
@IBAction func checkoutAction(sender: AnyObject) {
let code = "6799782555"
let apiKey = "1234567890"
let system = MPSystem.test

let Scan to Pay = MPScan to Pay(); Scan to Pay.checkout(withCode:code,
apiKey:apiKey, system: system, controller: self, delegate:self)
//or
let preMsisdn = "27123456789"

Scan to Pay.checkout(withCode:code, apiKey:apiKey,
system: system, controller: self, delegate:self, preMSISDN: preMsisdn)
}

Parameters passed:

Name

Type

Description

code

String

This is the code created by calling the Scan to Pay API representing the transaction.

apiKey

String

This is the API key provided by Scan to Pay that will enable the library to be used. This can be found on the Scan to Pay Portal under the Lib Lite Tokens menu item.

system

MPSystem

This value can be Live or Test, representing the Scan to Pay backend system to connect to.

controller

UIViewController

The presenting controller.

delegate

MPScan to PayDelegate

The callback delegate that will receive the results.

preMsisdn

String

This is an optional field if you know the client’s mobile number.

Calling the Preregister Method

The following snippet illustrates how to invoke the pre-register request from Swift:

import Scan to PayKit

@IBAction func preRegister(sender: AnyObject) {
let apiKey = "1234567890"
let system = MPSystem.test

let Scan to Pay = MPScan to Pay(); Scan to Pay.preRegister(apiKey,
system: system, controller: self, delegate:self)
//or
let preMsisdn = "27123456789"
Scan to Pay.preRegister(apiKey,
system: system, controller: self, delegate:self, preMSISDN: preMsisdn)
}

Parameters passed:

Name

Type

Description

apiKey

String

This is the API key provided by Scan to Pay that will enable the library to be used. This can be found on the Scan to Pay Portal under the Lib Lite Tokens menu item.

system

MPSystem

This value can be Live or Test, representing the Scan to Pay backend system to connect to.

controller

UIViewController

The presenting controller.

delegate

MPScan to PayDelegate

The callback delegate that will receive the results.

preMsisdn

String

This is an optional field if you know the client’s mobile number

Calling the Manage Card List

This method allows a 3rd party app to send a request to the Scan to Pay SDK in order for the cardholder to
“manage” their card list. Once invoked, the user is then able to add or delete bank cards.

import Scan to PayKit

@IBAction func manageCardList(sender: AnyObject) {
let apiKey = "1234567890"
let system = MPSystem.test

let Scan to Pay = MPScan to Pay(); Scan to Pay.walletManagement(apiKey,
system: system, controller: self, delegate: self);
//or
let preMsisdn = "27123456789"
Scan to Pay.walletManagement(apiKey,
system: system, controller: self, delegate: self,
preMSISDN: preMsisdn);
}

Parameters passed:

Name

Type

Description

apiKey

String

This is the API key provided by Scan to Pay that will enable the library to be used. This can be found on the Scan to Pay Portal under the Lib Lite Tokens menu item.

system

MPSystem

This value can be Live or Test, representing the Scan to Pay backend system to connect to.

controller

UIViewController

The presenting controller.

delegate

MPScan to PayDelegate

The callback delegate that will receive the results.

preMsisdn

String

This is an optional field if you know the client’s mobile number

Handling the Response

The following snippet illustrates how to implement the delegate to handle the response:

import UIKit
import Scan to PayKit
class ViewController: UIViewController, MPScan to PayDelegate 
{


func Scan to PayInvalidCode() { let alert = UIAlertController(
title: "Scan to Pay Resutl", message: "Invalid Code", preferredStyle: .Alert)
alert.addAction(UIAlertAction( title: "Cancel",
style: .Cancel, handler: nil));
self.presentViewController( alert,
animated: true, completion: nil);
}

func Scan to PayError(error: MPError) { let alert = UIAlertController(
title: "Scan to Pay Resutl", message: "Error", preferredStyle: .Alert)
alert.addAction(UIAlertAction( title: "Cancel",
style: .Cancel, handler: nil));
self.presentViewController( alert,
animated: true, completion: nil);
}

func Scan to PayPaymentFailedWithTransactionReference( transactionReference: String!) 
{
let alert = UIAlertController( title: "Scan to Pay Resutl",
message: "Payment Failed. Ref: \(transactionReference)", preferredStyle: .Alert)
alert.addAction(UIAlertAction( title: "Cancel",
style: .Cancel, handler: nil));
self.presentViewController( alert,
animated: true, completion: nil);
}

func Scan to PayPaymentSucceededWithTransactionReference( transactionReference: String!) 
{
let alert = UIAlertController( title: "Scan to Pay Resutl",
message: "Payment Succeeded. Ref: \(transactionReference)", preferredStyle: .Alert)
alert.addAction(UIAlertAction( title: "Cancel",
style: .Cancel, handler: nil));
self.presentViewController( alert,
 
animated: true, completion: nil);
}

func Scan to PayUserDidCancel() { let alert = UIAlertController(
title: "Scan to Pay Resutl", message: "User did cancel", preferredStyle: .Alert)
alert.addAction(UIAlertAction( title: "Cancel",
style: .Cancel, handler: nil));
self.presentViewController( alert,
animated: true, completion: nil);
}
func Scan to PayUserRegistered() {
let alert = UIAlertController( title: "Scan to Pay Result", message: "User registered", preferredStyle: .alert)
alert.addAction(UIAlertAction( title: "Cancel",
style: .cancel, handler: nil));
self.present( alert, animated: true,
completion: nil);
}

func Scan to PayUserCompletedWallet() {
let alert = UIAlertController( title: "Scan to Pay Result",
message: "User Done with Wallet", preferredStyle: .alert)
alert.addAction(UIAlertAction( title: "Cancel",
style: .cancel, handler: nil));
self.present( alert, animated: true,
completion: nil);
}
}

The following is a breakdown of the delegate callback methods:

Result Code

Description

Extra Values

Scan to PayError

Returned if an error has occurred before the payment

MPError – This enum indicates the type of error that occurred. See the error table below

Scan to PayPaymentSucceededWithTransactionReference

Returned on payment success

transactionReference - This is the reference for the transaction. This reference will be used to tie up the transaction on the 3rd party backend system.

Scan to PayPaymentFailedWithTransactionReference

Returned if they payment failed

transactionReference - This is the reference for the failed transaction in the event the 3rd party needs to request more information regarding the failure.

Scan to PayUserDidCancel

Returned if the user aborted the process

None.

Scan to PayInvalidCode

Returned if the code that was passed is invalid

None.