MoMo Wallet

MoMo is a mobile wallet and digital payment application that allows users to make cash transfers, pay more than 100 types of bills, recharge mobile phone accounts, settle personal loans, and purchase services including software licenses, online game vouchers, as well as airline and movie tickets.

📘

API Method

PGW SDK API Interface

🚧

References

SDK Payment Classes
SDK Payment Enums

1. Generate Payment Token

To prepare a payment token request, refer to the required parameters below.

📘

Payment Token API

Refer to: Payment Token API

{
    "merchantID": "JT04",
    "invoiceNo": "1595219400",
    "description": "2 days 1 night hotel room",
    "amount": 10.0,
    "currencyCode": "THB",
    "nonceStr": "a8092512-b144-41b0-8284-568bb5e9264c",
    "paymentChannel": ["DPAY"]
}

2. Receive Payment Token Response

To receive a payment token response, refer to the sample payment token response below. The response will contain the payment token ID which must be passed to the merchant application.

String paymentToken = "roZG9I1hk/GYjNt+BYPYbxQtKElbZDs9M5cXuEbE+Z0QTr/yUcl1oG7t0AGoOJlBhzeyBtf5mQi1UqGbjC66E85S4m63CfV/awwNbbLbkxsvfgzn0KSv7JzH3gcs/OIL";
NSString *paymentToken = @"roZG9I1hk/GYjNt+BYPYbxQtKElbZDs9M5cXuEbE+Z0QTr/yUcl1oG7t0AGoOJlBhzeyBtf5mQi1UqGbjC66E85S4m63CfV/awwNbbLbkxsvfgzn0KSv7JzH3gcs/OIL";
let paymentToken: String = "roZG9I1hk/GYjNt+BYPYbxQtKElbZDs9M5cXuEbE+Z0QTr/yUcl1oG7t0AGoOJlBhzeyBtf5mQi1UqGbjC66E85S4m63CfV/awwNbbLbkxsvfgzn0KSv7JzH3gcs/OIL"

3. Prepare E-Wallet Payment Request

To prepare an e-wallet payment request, refer to the sample code below.

📘

Payment Request Parameters

Refer to Payment Request API Parameters

🚧

Payment Channel Matrix

Refer to the payment channel codes for the MoMo Wallet e-wallet below.

Category CodeGroup CodeChannelNameCountry
DPAYEWALLETMOMOMoMo WalletMY
PaymentCode paymentCode = new PaymentCode("MOMO");
 
PaymentRequest paymentRequest = new DigitalPaymentBuilder(paymentCode)
                                .setName("DavidBilly")
                                .setEmail("[email protected]")
                                .setAccountNo("0070000001")
                                .build();
PaymentCode *paymentCode = [[PaymentCode alloc] initWithChannelCode: @"MOMO"];
          
PaymentRequest *paymentRequest = [[[[[[DigitalPaymentBuilder alloc] initWithPaymentCode: paymentCode]
                                       name: @"DavidBilly"]
                                       email: @"[email protected]"]
                                       accountNo: @"0070000001"]
                                       build];
let paymentCode: PaymentCode = PaymentCode(channelCode: "MOMO")
 
let paymentRequest: PaymentRequest = DigitalPaymentBuilder(paymentCode: paymentCode)
                                     .name("DavidBilly")
                                     .email("[email protected]")
                                     .accountNo("0070000001")
                                     .build()

4. Construct Transaction Request

To prepare a transaction request, refer to the parameters and sample code below.

📘

Transaction Request API Parameters

Refer to: Do Payment Request API Parameters

TransactionResultRequest transactionResultRequest = new TransactionResultRequestBuilder(paymentToken)
                                                    .with(paymentRequest)
                                                    .build();
TransactionResultRequest *transactionResultRequest = [[[[TransactionResultRequestBuilder alloc] initWithPaymentToken: paymentToken]
                                                         withPaymentRequest: paymentRequest]
                                                         build];
let transactionResultRequest: TransactionResultRequest = TransactionResultRequestBuilder(paymentToken: paymentToken)
                                                         .with(paymentRequest)
                                                         .build()

5. Execute Payment Request

To receive a transaction request response, refer to the parameters below.

📘

Transaction Response API Parameter

Refer to: Do Payment Response API Parameters

🚧

References

Response Code
To view payment process flows based on response code, refer to: Payment Flow Response Codes

PGWSDK.getInstance().proceedTransaction(transactionResultRequest, new APIResponseCallback<TransactionResultResponse>() {
    
     @Override
     public void onResponse(TransactionResultResponse response) {
    
          if(response.getResponseCode().equals(APIResponseCode.TransactionAuthenticateRedirect) || response.getResponseCode().equals(APIResponseCode.TransactionAuthenticateFullRedirect)) {
    
                String redirectUrl = response.getData(); //Open WebView
          } else if(response.getResponseCode().equals(APIResponseCode.TransactionExternalApplication)) {
    
               //Step 6: Construct deep link payment request.
          } else {
    
               //Get error response and display error.
          }
     }
    
     @Override
     public void onFailure(Throwable error) {
    
          //Get error response and display error.
     }
});
[[PGWSDK shared] proceedTransactionWithTransactionResultRequest: transactionResultRequest response: ^(TransactionResultResponse * _Nonnull response) {
              
     if([response.responseCode isEqualToString: APIResponseCode.TransactionAuthenticateRedirect] || [response.responseCode isEqualToString: APIResponseCode.TransactionAuthenticateFullRedirect]) {
                  
          NSString *redirectUrl = response.data; //Open WebView
     } else if([response.responseCode isEqualToString: APIResponseCode.TransactionExternalApplication]) {
                  
          //Step 6: Construct deep link payment request.     
     } else {
                  
          //Get error response and display error.
     }
} failure: ^(NSError * _Nonnull error) {
              
     //Get error response and display error.
}];
PGWSDK.shared.proceedTransaction(transactionResultRequest: transactionResultRequest, { (response: TransactionResultResponse) in
      
     if response.responseCode == APIResponseCode.TransactionAuthenticateRedirect || response.responseCode == APIResponseCode.TransactionAuthenticateFullRedirect {
                   
           let redirectUrl: String = response.data //Open WebView
     } else if response.responseCode == APIResponseCode.TransactionExternalApplication {
                
           //Step 6: Construct deep link payment request.
      } else {
                   
           //Get error response and display error.
      }
}) { (error: NSError) in
               
     //Get error response and display error.
}

👍

Callback for PGW Payment Authentication

Refer to: Handle PGW Payment Authentication

6. Construct Deep Link Payment Request

PaymentProviderRequest paymentProviderRequest = new PaymentProviderBuilder(getActivity())
                                                               .setTransactionResultResponse(response)
                                                               .build();
 
               PGWSDKHelper.getInstance().proceedDeepLinkPayment(paymentProviderRequest, new PaymentResultResponseCallback<DeepLinkPaymentResultResponse>() {
 
                  @Override
                  public void onResponse(DeepLinkPaymentResultResponse response) {
                             
                       if(response.getResponseCode().equalsIgnoreCase(DeepLinkPaymentResponseCode.PaymentTransactionStatusInquiry)) {
 
                            //Inquiry payment result by using payment token.
                       }
                  }
 
                  @Override
                  public void onFailure(Throwable error) {
 
                       //Get error response and display error.
                  }
              });
PaymentProviderRequest *paymentProviderRequest = [[[[PaymentProviderBuilder alloc] init]
                                                               transactionResultResponse: response]
                                                               build];
              
          [[PGWSDKHelper shared] proceedDeepLinkPaymentWithPaymentProviderRequest: paymentProviderRequest response: ^(DeepLinkPaymentResultResponse * _Nonnull response) {
   
               if([response.responseCode isEqualToString: DeepLinkPaymentResponseCode.PaymentTransactionStatusInquiry]) {
                      
                     //Inquiry payment result by using payment token.
               }
           } failure: ^(NSError * _Nonnull error) {
                   
                //Get error response and display error.
           }];      
let paymentProviderRequest: PaymentProviderRequest = PaymentProviderBuilder()
                                                               .transactionResultResponse(response)
                                                               .build()
                  
           PGWSDKHelper.shared.proceedDeepLinkPayment(paymentProviderRequest: paymentProviderRequest, { (response: DeepLinkPaymentResultResponse) in
 
                if response.responseCode == DeepLinkPaymentResponseCode.PaymentTransactionStatusInquiry {
 
                     //Inquiry payment result by using payment token.
                }
           }) { (error: NSError) in
 
                 //Get error response and display error.
           }

📘

Payment Inquiry API

Refer to: Payment Inquiry API

Full Sample Code

The following sample code demonstrates requests and parameters for each step of the process.

//Step 2: Generate payment token id.
String paymentToken = "roZG9I1hk/GYjNt+BYPYbxQtKElbZDs9M5cXuEbE+Z0QTr/yUcl1oG7t0AGoOJlBhzeyBtf5mQi1UqGbjC66E85S4m63CfV/awwNbbLbkxsvfgzn0KSv7JzH3gcs/OIL";
    
//Step 3: Construct e-wallet request.
PaymentCode paymentCode = new PaymentCode("MOMO");
 
PaymentRequest paymentRequest = new DigitalPaymentBuilder(paymentCode)
                                .setName("DavidBilly")
                                .setEmail("[email protected]")
                                .setAccountNo("0070000001")
                                .build();
    
//Step 4: Construct transaction request.
TransactionResultRequest transactionResultRequest = new TransactionResultRequestBuilder(paymentToken)
                                                    .with(paymentRequest)
                                                    .build();
    
//Step 5: Execute payment request.
PGWSDK.getInstance().proceedTransaction(transactionResultRequest, new APIResponseCallback<TransactionResultResponse>() {
    
     @Override
     public void onResponse(TransactionResultResponse response) {
    
          if(response.getResponseCode().equals(APIResponseCode.TransactionAuthenticateRedirect) || response.getResponseCode().equals(APIResponseCode.TransactionAuthenticateFullRedirect)) {
    
                String redirectUrl = response.getData(); //Open WebView
          } else if(response.getResponseCode().equals(APIResponseCode.TransactionExternalApplication)) {
    
               //Step 6: Construct deep link payment request.
               PaymentProviderRequest paymentProviderRequest = new PaymentProviderBuilder(getActivity())
                                                               .setTransactionResultResponse(response)
                                                               .build();
 
               PGWSDKHelper.getInstance().proceedDeepLinkPayment(paymentProviderRequest, new PaymentResultResponseCallback<DeepLinkPaymentResultResponse>() {
 
                  @Override
                  public void onResponse(DeepLinkPaymentResultResponse response) {
                             
                       if(response.getResponseCode().equalsIgnoreCase(DeepLinkPaymentResponseCode.PaymentTransactionStatusInquiry)) {
 
                            //Inquiry payment result by using payment token.
                       }
                  }
 
                  @Override
                  public void onFailure(Throwable error) {
 
                       //Get error response and display error.
                  }
              });
          } else {
    
               //Get error response and display error.
          }
     }
    
     @Override
     public void onFailure(Throwable error) {
    
          //Get error response and display error.
     }
});
//Step 2: Generate payment token id.
NSString *paymentToken = @"roZG9I1hk/GYjNt+BYPYbxQtKElbZDs9M5cXuEbE+Z0QTr/yUcl1oG7t0AGoOJlBhzeyBtf5mQi1UqGbjC66E85S4m63CfV/awwNbbLbkxsvfgzn0KSv7JzH3gcs/OIL";
   
//Step 3: Construct e-wallet request.
PaymentCode *paymentCode = [[PaymentCode alloc] initWithChannelCode: @"MOMO"];
          
PaymentRequest *paymentRequest = [[[[[[DigitalPaymentBuilder alloc] initWithPaymentCode: paymentCode]
                                       name: @"DavidBilly"]
                                       email: @"[email protected]"]
                                       accountNo: @"0070000001"]
                                       build];
   
//Step 4: Construct transaction request. 
TransactionResultRequest *transactionResultRequest = [[[[TransactionResultRequestBuilder alloc] initWithPaymentToken: paymentToken]
                                                         withPaymentRequest: paymentRequest]
                                                         build];
       
//Step 5: Execute payment request.
[[PGWSDK shared] proceedTransactionWithTransactionResultRequest: transactionResultRequest response: ^(TransactionResultResponse * _Nonnull response) {
              
     if([response.responseCode isEqualToString: APIResponseCode.TransactionAuthenticateRedirect] || [response.responseCode isEqualToString: APIResponseCode.TransactionAuthenticateFullRedirect]) {
                  
          NSString *redirectUrl = response.data; //Open WebView
     } else if([response.responseCode isEqualToString: APIResponseCode.TransactionExternalApplication]) {
                  
          //Step 6: Construct deep link payment request.
          PaymentProviderRequest *paymentProviderRequest = [[[[PaymentProviderBuilder alloc] init]
                                                               transactionResultResponse: response]
                                                               build];
              
          [[PGWSDKHelper shared] proceedDeepLinkPaymentWithPaymentProviderRequest: paymentProviderRequest response: ^(DeepLinkPaymentResultResponse * _Nonnull response) {
   
               if([response.responseCode isEqualToString: DeepLinkPaymentResponseCode.PaymentTransactionStatusInquiry]) {
                      
                     //Inquiry payment result by using payment token.
               }
           } failure: ^(NSError * _Nonnull error) {
                   
                //Get error response and display error.
           }];        
     } else {
                  
          //Get error response and display error.
     }
} failure: ^(NSError * _Nonnull error) {
              
     //Get error response and display error.
}];
//Step 2: Generate payment token id.
let paymentToken: String = "roZG9I1hk/GYjNt+BYPYbxQtKElbZDs9M5cXuEbE+Z0QTr/yUcl1oG7t0AGoOJlBhzeyBtf5mQi1UqGbjC66E85S4m63CfV/awwNbbLbkxsvfgzn0KSv7JzH3gcs/OIL"
      
//Step 3: Construct e-wallet request.
let paymentCode: PaymentCode = PaymentCode(channelCode: "MOMO")
 
let paymentRequest: PaymentRequest = DigitalPaymentBuilder(paymentCode: paymentCode)
                                     .name("DavidBilly")
                                     .email("[email protected]")
                                     .accountNo("0070000001")
                                     .build()
           
//Step 4: Construct transaction request.
let transactionResultRequest: TransactionResultRequest = TransactionResultRequestBuilder(paymentToken: paymentToken)
                                                         .with(paymentRequest)
                                                         .build()
           
//Step 5: Execute payment request.
PGWSDK.shared.proceedTransaction(transactionResultRequest: transactionResultRequest, { (response: TransactionResultResponse) in
      
     if response.responseCode == APIResponseCode.TransactionAuthenticateRedirect || response.responseCode == APIResponseCode.TransactionAuthenticateFullRedirect {
                   
           let redirectUrl: String = response.data //Open WebView
     } else if response.responseCode == APIResponseCode.TransactionExternalApplication {
                
           //Step 6: Construct deep link payment request.
           let paymentProviderRequest: PaymentProviderRequest = PaymentProviderBuilder()
                                                               .transactionResultResponse(response)
                                                               .build()
                  
           PGWSDKHelper.shared.proceedDeepLinkPayment(paymentProviderRequest: paymentProviderRequest, { (response: DeepLinkPaymentResultResponse) in
 
                if response.responseCode == DeepLinkPaymentResponseCode.PaymentTransactionStatusInquiry {
 
                     //Inquiry payment result by using payment token.
                }
           }) { (error: NSError) in
 
                 //Get error response and display error.
           }
      } else {
                   
           //Get error response and display error.
      }
}) { (error: NSError) in
               
     //Get error response and display error.
}