Skip to main content

Account Binding

Recurring payments offers a one-click payment experience for your website or mobile app enabling payments via MoMo E-Wallet. Your customers need to once authorize and link their MoMo account with your application (binding) and later enjoy fast checkout every time.

Process Flow

Binding (and payment)

Token_flow

  • URL can serve the dual purpose of account binding AND / OR request payment at the same time. If Merchant wants to bind account ONLY, amount (data field within URL) is set at 0 VNĐ; if Merchant wants to bind account AND request payment, amount is set at or greater than 1.000 VNĐ.
  • URL's default expire time is 15 minutes, but can be customized for each Merchant.

Next payments using token

Token_flow

API Configuration

HTTP Information

Initiate binding method

HTTP Request

POST /v2/gateway/api/create

AttributeTypeRequiredDescription
partnerCodeString(20)Merchant ID Integration information
partnerNameStringPartner name
storeIdStringStore ID
requestIdString(50)Request ID, unique for each request, MoMo's partner uses the requestId field for idempotency control
amountLongOrder amount in VND (0 or greater)
orderIdString(50)Partner Transaction ID
Regex: ^[0-9a-zA-Z]([-_.]*[0-9a-zA-Z]+)*$
orderInfoString(200)Order info from merchant
orderGroupIdLongThe orderGroupId will be provided by MoMo to classify groups of orders for further operational activities. Please contact MoMo to use this field.
redirectUrlString(200)MoMo Payment will redirect end-user back to Vendor using this URL, to notify result for end-user using HTTP GET request type
ipnUrlString(200)MoMo Payment will notify this URL. Vendor server needs to build this URL to receive results sent from MoMo, using HTTP POST request type with header application/json.
partnerClientIdStringVendor’s unique identifier for each user (e.g.: user ID or email).
This ID will be linked with end-user’s MoMo account.
Regex: ^[0-9a-zA-Z]([-_.@]*[0-9a-zA-Z]+)*$
extraDataStringDefault value is empty ""
Encode base64 follow Jsonformat: {"key": "value"}
Example with data: {"username": "momo"}=> data of extraData: eyJ1c2VybmFtZSI6ICJtb21vIn0=
requestTypeString(20)linkWallet
userInfoObjectUser Info
Example Data: {"partnerClientAlias": "abc@gmail.com" }
langString(20)Language return: vi or en
signatureString(65)Signature to confirm information. Secure transaction in Hmac_SHA256  algorithm with format: a String sort all key name of data field from a-z:
accessKey=$accessKey&amount=$amount&extraData=$extraData
&ipnUrl=$ipnUrl&orderId=$orderId&orderInfo=$orderInfo
&partnerClientId=$partnerClientId&partnerCode=
$partnerCode&redirectUrl=$redirectUrl&requestId=
$requestId&requestType=$requestType

Data of userInfo

AttributeTypeRequiredDescription
partnerClientAliasStringAn identifier of the user account (ex: phone number, email, name or nickname,..,), which will be displayed for user recognition during binding and checking payment history.

In addition, in case the merchant has a partnerClientId code that wants to link with multi MoMo wallets (rule 1: multi), the merchant can transmit additional code nxxx_partnerClientId with xxx being the link number. For example, for the first time binding for user A, merchant transmits n000_abc@gmail.com, and user A needs to binding for a second time, merchant will transmit n001_abc@gmail.com.

Example Request

{
"partnerCode": "MOMOIQA420180417",
"accessKey": "SvDmj2cOTYZmQQ3H",
"requestId": "1516771499398",
"amount": "0",
"orderId": "1516771499398",
"ipnUrl": "http://localhost:1001",
"redirectUrl": "http://localhost:8081",
"partnerClientId": "abc@gmail.com",
"requestType": "linkWallet",
"userInfo": {
"partnerClientAlias": "abc@gmail.com"
},
"lang": "vi",
"signature": "ca3c203f0c16873e688fada17…ee116b636ff407d6fe39"
}
HTTP Response
AttributeTypeRequiredDescription
partnerCodeStringIntegration information
requestIdStringSame as the original request
orderIdStringPartner Transaction ID
Regex: ^[0-9a-zA-Z]([-_.]*[0-9a-zA-Z]+)*$
payUrlStringURL for switching from the partner's page to the MoMo payment page
deeplinkStringURL to open MoMo application directly (Customers must install MoMo app first) and payment confirmation screen.
qrCodeUrlStringData to generate QR code if you want customers to scan the QR code directly on your purchase page or to print it on the invoice. Note: This URL is NOT containing the image of the QR code, you need to use an external library to generate the QR code.
deeplinkMiniAppStringURL to open the MoMo app's payment confirmation screen. Apply when partner's website is embedded into MoMo app.
resultCodeintError code
messageStringError description, error language is based on lang
responseTimeLongTime to respond payment results to partner Format: timestamp
partnerClientIdString(50)Vendor’s unique identifier for each user (e.g.: user ID or email). This ID will be linked with end-user’s MoMo account.

Example Response

{
"partnerCode": "MOMOIOLD20190129",
"requestId": "1616577794003",
"orderId": "1616577794003:0123456778",
"amount": 10000,
"responseTime": 1616577795018,
"message": "Thành công",
"resultCode": 0,
"payUrl": "https://test-payment.momo.vn/gateway/pay?t=TU9NT...NTY3Nzg=",
"qrCodeUrl": "https://test-payment.momo.vn/gateway/pay?t=TU9NT...NTY3Nzg=",
"deeplink": "momo://?action=link&amount=1...25c&source=websdk&type=sale&v=1.1",
"partnerClientId": "932024090117"
}

Processing payment result

For more information, see Payment Notification.

Parameter description

Description for parameters which are used by MoMo in the URL redirectUrl and the body content of ipnUrl.

AttributeTypeRequiredDescription
partnerCodeStringIntegration information
requestIdStringEach Request’s Identification
amountLongAmount to pay
orderIdStringPartner Transaction ID
orderTypeStringmomo_wallet
orderInfoStringOrder info
partnerClientIdStringIdentifier of user
callbackTokenStringToken info used to get payment token
transIdLongMoMo's transaction ID
resultCodeIntegerOrder status
messageStringdescription of resultCode based on lang
payTypeStringPayment Type: webApp, app,qror miniapp
responseTimeLongTime to return payment result in miliseconds
extraDataStringAdditional info
signatureStringSignature to confirm information. Secure transaction in Hmac_SHA256  algorithm with format: a String sort all key name of data field from a-z:
accessKey=$accessKey&amount=$amount&callbackToken=
$callbackToken&extraData=$extraData&message=$message
&orderId=$orderId&orderInfo=$orderInfo&orderType=
$orderType&partnerClientId=$partnerClientId
&partnerCode=$partnerCode&payType=$payType&requestId=
$requestId&responseTime=$responseTime&resultCode=
$resultCode&transId=$transId

The signature is encrypted using secretKey and accessKey, so you must keep it secret, not expose to any chat channels, or in source code, git, etc.

Receive recurring token

After receiving callbackToken from transaction result, merchant will send a request to MoMo to get user's token info

HTTP Request

POST /v2/gateway/api/tokenization/bind

ParameterTypeRequiredDescription
partnerCodeStringIntegration information
callbackTokenStringcallbackToken as access token, received from payment result
requestIdString(50)Request ID, unique for each request, MoMo's partner uses the requestId field for idempotency control
orderIdStringMust match with the orderId when calling linkWallet
partnerClientIdStringMust match with the partnerClientId when calling linkWallet
langStringLanguage¸ of returned message (vi or en)
signatureStringSignature to confirm information. Secure transaction in Hmac_SHA256  algorithm with format: a String sort all key name of data field from a-z:
accessKey=$accessKey&callbackToken=$callbackToken&orderId=
$orderId&partnerClientId=$partnerClientId&partnerCode=
$partnerCode&requestId=$requestId

Example request

{
"partnerCode": "MOMO_ATM_DEV",
"requestId": "03dc5a00-b37c-11e9-b3a3-2f10f50d933d",
"callbackToken": "v2/qml0PbOlrBYjFlZv…8StiawfZPiKoUGvywNHV",
"orderId": "03dc32f0-b37c-11e9-b3a3-2f10f50d933d",
"partnerClientId": "user@momo.vn",
"signature": "fa8b66df31cc7045783323f1e4492d7b71c1de4c9e1b71002f95a1aa869e885a",
"lang": "vi"
}
HTTP Response
AttributeTypeRequiredDescription
partnerCodeStringIntegration information
requestIdStringEach Request’s Identification
orderIdStringPartner Transaction ID
Regex: ^[0-9a-zA-Z]([-_.]*[0-9a-zA-Z]+)*$entification
aesTokenStringtoken object json encrypted using AES
resultCodeIntegerOrder status
partnerClientIdString Vendor’s unique identifier for each user (e.g.: user ID or email). This ID will be linked with end-user’s MoMo account
responseTimeLongTime to respond payment results to partner Format: timestamp
messageStringResult description based on lang

Data of token after decrypted

AttributeTypeRequiredDescription
valueStringToken Value using for pay token
userAliasStringMoMo masked wallet ID (only show last 4 digits)
profileIdStringMoMo hash wallet ID

Example response

{
"partnerCode": "MOMO_ATM_DEV",
"requestId": "03dc5a00-b37c-11e9-b3a3-2f10f50d933d",
"orderId": "03dc32f0-b37c-11e9-b3a3-2f10f50d933d",
"partnerClientId": "user@momo.vn",
"resultCode": 0,
"responseTime": 145784525,
"message": "Success",
"aesToken": "NplHKEhGuFoo5o5vbMeJwrsk7wXEPnCjSZv6DgivW1a8JKw1gdXq2WS7UsPwoJv0yf6rbGiVV6nOKAxU8kTNg4SZraqJnf7GAq9OSE2LiNs="
}

After receiving aesToken from MoMo, Merchant server must decrypt aesToken to get real token and store it in the Merchant's system. Decrypting payment token by AES algorithm will require secret key, which can be found in https://business.momo.vn

For more information, see AES Encryption.

Pay using Token

HTTP Request

POST /v2/gateway/api/tokenization/pay

ParameterTypeRequiredDescription
partnerCodeStringIntegration information
partnerNameStringPartner name
storeIdStringStore ID
orderIdStringPartner Transaction ID
Regex: ^[0-9a-zA-Z]([-_.]*[0-9a-zA-Z]+)*$
amountLongPayment amountMin: 1.000 VND
Payment amountMax: 30.000.000 VND
Currency: VND.
requestIdString(50)Request ID, unique for each request, MoMo's partner uses the requestId field for idempotency control
tokenStringEncrypt a object json by RSA using public Key RSA Encryption
partnerClientIdStringMerchant's unique user info
orderInfoStringShort information
orderGroupIdLongThe orderGroupId will be provided by MoMo to classify groups of orders for further operational activities. Please contact MoMo to use this field.
autoCaptureBooleanIf set to false, the payment will not be automatically captured.
redirectUrlString2in1 will be applied only when redirectUrl is available, in order to redirect back from MoMo to merchant page after user direct payment
Supported: AppLink and WebLink.
ipnUrlStringMerchant’s API Endpoint. 2in1 will be applied only when ipnUrl is available, in order to send payment results via IPN method after a user direct pament.
extraDataStringDefault value is empty ""
Encode base64 follow Jsonformat: {"key": "value"}
Example with data: {"username": "momo"}=> data of extraData: eyJ1c2VybmFtZSI6ICJtb21vIn0=
userInfoObjectUser Info
Example Data: `{"partnerClientAlias": "abc@gmail.com" }
langStringLanguage of returned message (vi or en)
signatureStringSignature to confirm information. Secure transaction in Hmac_SHA256  algorithm with format, a String sort all key name of data field from a-z:
accessKey=$accessKey&amount=$amount&extraData=$extraData
&orderId=$orderId&orderInfo=$orderInfo&partnerClientId=
$partnerClientId&partnerCode=$partnerCode&requestId=
$requestId&token=$token

Data of token before encrypted

AttributeTypeRequiredDescription
valueStringToken Value as recurring token
requireSecurityCodeBoolean- If set to false, the security code parameter is not used and payment will be directly sent to the payment provider.
- If set to true, it means that you detect suspicious / risky activities from user’s account and request to validate user’s identity before payment. MoMo will help to make two-factor authentication (such as OTP,...). In this case, MoMo responses result code 8200, which means "waiting for 2FA confirmation". A call for Two-factor Authentication Confirmation from your site will be needed to process payment.

Data of userInfo

AttributeTypeRequiredDescription
partnerClientAliasStringAn identifier of the user account (ex: phone number, email, name or nickname,..,), which will be displayed for user recognition during binding and checking payment history.

In addition, in case the merchant has a partnerClientId code that wants to link with multi MoMo wallets (rule 1: multi), the merchant can transmit additional code nxxx_partnerClientId with xxx being the link number. For example, for the first time binding for user A, merchant transmits n000_abc@gmail.com, and user A needs to binding for a second time, merchant will transmit n001_abc@gmail.com.

Example request

{
"token": "sa5s4a54s5a4s5a4s5",
"partnerCode": "MOMO_ATM_DEV",
"partnerName": "Test",
"storeId": "MoMo test store",
"ipnUrl": "abc.com",
"redirectUrl": "abc.com",
"orderId": "12545465654656",
"amount": "20000",
"lang": "vi",
"autoCapture": true,
"orderInfo": "Thanh toan MoMo",
"requestId": "365656d56sd",
"extraData": "",
"partnerClientId": "test@momo.vn",
"signature": "2512s1d2s1ds21d2s1d1ce5d1a251#@"
}

HTTP Response

AttributeTypeRequiredDescription
partnerCodeStringIntegration information
orderIdStringPartner Transaction ID
Regex: ^[0-9a-zA-Z]([-_.]*[0-9a-zA-Z]+)*$entification
requestIdStringEach Request’s Identification
amountLongAmount to pay
transIdLongMoMo's transaction ID
responseTimeLongTime to respond payment results to partner Format: timestamp
partnerClientIdStringVendor’s unique identifier for each user (e.g.: user ID or email). This ID will be linked with end-user’s MoMo account.
resultCodeIntegerOrder status
messageStringResult description, language is based on lang
payUrlStringURL for switching from the partner's page to the MoMo payment page
deeplinkStringURL to open MoMo application directly (Customers must install MoMo app first) and payment confirmation screen.
qrCodeUrlStringData to generate QR code if you want customers to scan the QR code directly on your purchase page or to print it on the invoice. Note: This URL is NOT containing the image of the QR code, you need to use an external library to generate the QR code.

Example response

{
"partnerCode": "MOMO_ATM_DEV",
"requestId": "1599645548172",
"orderId": "1599645548172:0123456778",
"amount": 50000,
"responseTime": 145758545,
"partnerClientId": "user@momo.vn",
"resultCode": 0,
"message": "Success"
}
  • If you receive resultCode 8000, payUrl and deeplink are supported in order to redirect user to the payment provider for re-authorizing (user direct payment).
  • If you receive resultCode 8200, a call for Two-factor Authentication Confirmation from your site will be needed to process payment.

Two-factor authentication confirm

After receiving 8200 for Pay using token request, you need to send a Two-factor authentication Confirm to ask for processing payment. This request includes the securityCode recorded from user (ex: OTP inputted by user from your interface). Success response means the securityCode is correct, two-factor authentication is passed and payment using token will be processed.

Rules for securityCode

  • You can only request a limited number of SMS per user per day. The default limit is 5 SMS/user/day, and can be changed for each Merchant. Delay time between 2 continuous requests is 3 seconds.
  • Merchant cannot request to send/confirm securityCode for a user’s account until next day if the Merchant has sent 5 wrong confirm securityCode request for that user in a round.
  • Expiring time for each securityCode is 5 minutes.
HTTP Request

POST /v2/gateway/api/tokenization/verify

ParameterTypeRequiredDescription
partnerCodeStringIntegration information
orderIdStringPartner Transaction ID
Regex: ^[0-9a-zA-Z]([-_.]*[0-9a-zA-Z]+)*$
Must be orderId with pay token
requestIdString(50)Request ID, unique for each request, MoMo's partner uses the requestId field for idempotency control
securityCodeStringsecurityCode that Merchant’s system recorded from user’s input
tokenStringEncrypt a object json by RSA using public Key RSA Encryption
langStringLanguage of returned message (vi or en)
signatureStringSignature to confirm information. Secure transaction in Hmac_SHA256  algorithm with format, a String sort all key name of data field from a-z:
accessKey=$accessKey&amount=$amount&extraData=$extraData
&orderId=$orderId&orderInfo=$orderInfo&partnerClientId=
$partnerClientId&partnerCode=$partnerCode&requestId=
$requestId&token=$token

HTTP Response

AttributeTypeRequiredDescription
partnerCodeStringIntegration information
orderIdStringPartner Transaction ID
Regex: ^[0-9a-zA-Z]([-_.]*[0-9a-zA-Z]+)*$entification
requestIdStringEach Request’s Identification
amountLongAmount to pay
transIdLongMoMo's transaction ID
responseTimeLongTime to respond payment results to partner Format: timestamp
partnerClientIdStringVendor’s unique identifier for each user (e.g.: user ID or email). This ID will be linked with end-user’s MoMo account.
resultCodeIntegerOrder status
messageStringResult description, language is based on lang
payUrlStringURL for switching from the partner's page to the MoMo payment page
deeplinkStringURL to open MoMo application directly (Customers must install MoMo app first) and payment confirmation screen.
qrCodeUrlStringData to generate QR code if you want customers to scan the QR code directly on your purchase page or to print it on the invoice. Note: This URL is NOT containing the image of the QR code, you need to use an external library to generate the QR code.

Delete token

Merchant can request to delete token

HTTP Request

POST /v2/gateway/api/tokenization/delete

ParameterTypeRequiredDescription
partnerCodeStringIntegration information
requestIdString(50)Request ID, unique for each request, MoMo's partner uses the requestId field for idempotency control
orderIdStringOrderId of partner, unique for each request
storeIdStringstore Identification
tokenStringEncrypt a object json by RSA using public Key RSA Encryption
partnerClientIdStringMerchant's unique user info
langStringLanguage of returned message (vi or en)
signatureStringSignature to confirm information. Secure transaction in Hmac_SHA256  algorithm with format: a String sort all key name of data field from a-z:
accessKey=$accessKey&orderId=$orderId&partnerClientId=
$partnerClientId&partnerCode=$partnerCode&requestId=
$requestId&token=$token

Example request

{
"partnerCode": "MOMO_ATM_DEV",
"requestId": "15454561",
"orderId": "sa1s5a1",
"lang": "en",
"partnerClientId": "test@momo.vn",
"token": "sa1a25s1a21s2a1asasa21s2a1s2",
"signature": "xmznmznxkakajdkkcbkscbkbcs@#dczcxz"
}
HTTP Response
AttributeTypeRequiredDescription
partnerCodeStringIntegration information
requestIdStringEach Request’s Identification
messageStringResult description, language is based on lang
resultCodeIntegerOrder status
partnerClientIdString Merchant's unique user info
responseTimeLongTime to respond payment results to partner Format: timestamp

Example response

{
"partnerCode": "MOMO_ATM_DEV",
"orderId": "1600838954650:0123456778",
"requestId": "1600838954650",
"resultCode": 0,
"message": "Success",
"partnerClientId": "test@momo.vn",
"responseTime": 14548754653232
}

Unbind

  • Request header: application/json
  • Response header: application/json

MoMo also allowed to unbind (token to be provoked) from MoMo App

Merchant have to provide the endpoint to receive notify unbind sent from MoMo, using HTTP POST

HTTP Request
AttributeTypeRequiredDescription
partnerCodeStringMerchant ID
requestIdStringUnique ID for each request
orderIdStringOrderId of MoMo, unique for each request
requestTypeStringunbind
partnerClientIdStringVendor’s unique identifier of each user (e.g.: user ID or email) that linked with MoMo wallet
tokenTypeStringwallet
signatureStringSignature to confirm information. Secure transaction in Hmac_SHA256  algorithm with format
accessKey=$accessKey&orderId=$orderId&partnerClientId=$partnerClientId
&partnerCode=$partnerCode&requestId=$requestId
&requestType=$requestType&tokenType=$tokenType

Example

{
"partnerCode": "MOMOIQA420180417",
"requestId": "0e0ceb2a-ea06-4ca7-b63a-e5c8948a5bfc",
"orderId": "012457855:231454545",
"partnerClientId": "sangle@mservice.com.vn",
"requestType": "unbind",
"tokenType": "wallet",
"signature": "bd4df3f3bad6815a9a7be1f1f5c8576f3f97eab25327247425f12a3fb4a78873"
}

You need to respond with HTTP code 204 (No Content)!

Callback Token inquiry

Vendor system cannot receive or record callbackToken, Vendor can request MoMo Payment to query callbackToken. Note that callbackToken has a default expire date of 10 minutes, counting from the time it is generated.

Request header: application/json - Response header: application/json

HTTP Request

POST /v2/gateway/api/tokenization/cbQuery

AttributeTypeRequiredDescription
partnerCodeStringMerchant ID
requestIdStringRequest ID, unique for each request
orderIdStringIt must be matched with orderId used in linkWallet
partnerClientIdStringIt must be matched with partnerClientId used in linkWallet
langStringvi or en
signatureStringSignature to confirm information. Secure transaction in Hmac_SHA256  algorithm with format: a String sort all key name of data field from a-z:
accessKey=$accessKey&orderId=$orderId
&partnerClientId=$partnerClientId&partnerCode=$partnerCode
&requestId=$requestId

Example

{
"partnerCode": "123456",
"requestId": "1527246504579",
"orderId": "1527246478428",
"partnerClientId": "MoMoAccountTest",
"lang": "vi",
"signature": "13be80957a5ee32107198920fa26aa85a4ca238a29f46e292e8c33dd9186142a"
}
HTTP Response
AttributeTypeDescription
partnerCodeStringMerchant ID
requestIdStringRequest ID, unique for each request
orderIdStringPartner Transaction ID
Regex: ^[0-9a-zA-Z]([-_.]*[0-9a-zA-Z]+)*$, stored on MoMo payment system
callbackTokenStringThe callback token generated by MoMo.
resultCodeintResult code
messageStringDescription regarding result code, based on lang
responseTimelongResponse time

Example

{
"partnerCode": "123456",
"requestId": "1527246504579",
"orderId": "1527246478428",
"callbackToken ": "u7YYQZnAbLQivB0p5SHT9LIhjshqarXyobE_WzCCa4vDt58r",
"resultCode": 0,
"message": "Success",
"responseTime": 127264428
}

Result Codes & Messages

These result codes and messages are exclusively assigned for the Account Binding flow within Tokenization Payments. Additionally, kindly locate other result codes and messages in the comprehensive list of result codes provided here.

Result codeDescriptionFinal StatusRecommended actionsType
0Successful.Yes
2001Transaction failed due to invalid token.YesThe token has been deleted, please update accordingly.Merchant error
2007Transaction failed due to inactive token.YesThe token is inactive due to user decided to temporary lock the binding.User error
2012Request rejected due to invalid token.YesThe token does not exist or has been deleted. Token status can not be updated.Merchant error
3001Binding failed because user has denied to confirm the authorization.YesUser error
3002Binding rejected due to authorization restrictions.YesPlease contact MoMo for the restriction details.System error
3003Unbinding rejected due to authorization restrictions.YesPlease contact MoMo for the restriction details.System error
3004Token cannot be provoked due to pending transactions.YesPlease contact MoMo for the restriction details.System error
4010OTP verification failed.YesUser authentication failed. Please request another authentication verification for retry.User error
4011OTP is not sent or expired.YesPlease request to send another OTP.User error
4016Unavailable because of too many failed attempts. Please try again in a day later.YesUser error
4017Failed authentication. Please try again with another security code.YesUser error
4018Failed authentication. Please try again with the latest security code.YesUser error
4019Security code has been expired. Please send another request to make new authentication.YesUser error
4020Failed to send security code. Please try again with another request.YesPlease contact MoMo for the restriction details.System error
8000Transaction is pre-authorized, waiting for user confirmation.NoPlease wait for the user to confirm the payment for the transaction to be authorized.User error
8200Transaction is being authenticated, waiting for 2FA confirmation.NoMerchant needs to send 2FA confirmation in order to process payment.User error
9000Transaction is authorized successfully.NoFor 1-step payment, please mark this transaction as success.
For 2-step payment, please proceed with either capture or cancel request. For binding, please proceed to request the recurring token.
Pending

See also