Non-Periodic Auto Debit
This document describes the relevant integration steps for non-periodic auto debit, specifically including: binding the payment method, obtaining the result of binding the payment method, initiating the direct debit, and obtaining the direct debit result, etc.
1. Preparation Items
According to the guidance in "Configuration and Signature", obtain the merchant self-service platform account, obtain the merchant appId and secret key, configure the asynchronous notification address, and configure the public key and private key.
2. Interaction Process
3. Auto Debit Rules
Merchant auto debits can be divided into the first deduction and subsequent direct debits; the first deduction requires the user to bind the payment method, and subsequent direct debits are deductions initiated by the merchant, and the user does not need to participate in the deduction process;
For the first deduction, the Payment Cashier mode, API mode, and Pre-component mode are supported for integration; for subsequent deductions, the user does not need to participate, and only the API needs to be used to complete the deduction;
For the first deduction, the transaction amount (totalAmount) supports 0 yuan and specific amounts greater than 0 yuan; if the transaction amount is 0 yuan, it means only binding the payment method; if the transaction amount is greater than 0, it means initiating the payment and binding the payment method; after the transaction is successful, PayerMax will generate a token (paymentTokenID) for the user's payment method and notify the merchant, which is used for subsequent direct debits;
For subsequent deductions, providing the paymentTokenID to replace the user's payment method can complete the deduction.
4. Binding the Payment Method
Core parameter description:
totalAmount: The transaction amount, which supports passing 0 or an amount greater than 0;
paymentDetail.mitType: The auto debit type, SCHEDULED indicates periodic subscription, and UNSCHEDULED indicates non-periodic auto debit;
paymentDetail.tokenForFutureUse: true/false, whether to generate a token for subsequent direct debits; when binding the payment method for the first time, this value should be passed as true;
paymentDetail.merchantInitiated: true/false, whether it is a transaction initiated by the merchant; when binding the payment method for the first time, the user needs to participate in completing the authentication or authorization, and the value should be passed as false.
4.1 Binding the Payment Method Using the PayerMax Payment Cashier
For the interface document of binding the payment method in the Checkout mode, please refer to the Checkout - Place Order API document. The request addresses for different environments are as follows:
Prod request address: https://pay-gate.payermax.com/aggregate-pay/api/gateway/orderAndPay
Test request address: https://pay-gate-uat.payermax.com/aggregate-pay/api/gateway/orderAndPay
When the transaction amount is greater than 0 yuan, the request parameter example is as follows:
{
"version": "1.5",
"keyVersion": "1",
"requestTime": "2022-01-17T09:05:52.194+00:00",
"appId": "bbd8d2639a7c4dfd8df7d005294390df",
"merchantNo": "020113838535952",
"data": {
"outTradeNo": "APIFOXDEV1745388079422", // Unique order number for the merchant's order placement
"subject": "Direct Debit Title", // Title
"totalAmount": 10, // Direct debit amount
"currency": "USD", // Direct debit currency
"userId": "test1111", // User ID
"language": "en",
"reference": "test subscription",
"frontCallbackUrl": "http://www.frontCallbackUrl.com",
"notifyUrl": "http://www.notifyUrl.com",
"integrate": "Hosted_Checkout", // Fixed value: Hosted_Checkout
"expireTime": "1800",
"paymentDetail": {
"paymentMethodType": "CARD", // Required, value is CARD
"mitType": "SCHEDULED", // Required, MIT type, SCHEDULED for periodic direct debits, UNSCHEDULED for non-periodic direct debits
"tokenForFutureUse": true, // Required, value is true, generate paymentTokenID for subsequent direct debits
"merchantInitiated": false // Required, false indicates that it is not initiated by the merchant and the user participates; true indicates that it is initiated by the merchant and the user does not need to participate
}
}
}
When the transaction amount is 0, the request parameter example is as follows:
{
"version": "1.5",
"keyVersion": "1",
"requestTime": "2022-01-17T09:05:52.194+00:00",
"appId": "bbd8d2639a7c4dfd8df7d005294390df",
"merchantNo": "020113838535952",
"data": {
"outTradeNo": "APIFOXDEV1745388079422", // Unique order number for the merchant's order placement
"subject": "Direct Debit Title", // Title
"totalAmount": 0, // Direct debit amount
"currency": "USD", // Direct debit currency
"userId": "test1111", // User ID
"language": "en",
"reference": "test subscription",
"frontCallbackUrl": "http://www.frontCallbackUrl.com",
"notifyUrl": "http://www.notifyUrl.com",
"integrate": "Hosted_Checkout", // Fixed value: Hosted_Checkout
"expireTime": "1800",
"paymentDetail": {
"paymentMethodType": "CARD", // Required, value is CARD
"mitType": "SCHEDULED", // Required, MIT type, SCHEDULED for periodic direct debits, UNSCHEDULED for non-periodic direct debits
"tokenForFutureUse": true, // Required, value is true, generate paymentTokenID for subsequent direct debits
"merchantInitiated": false // Required, false indicates that it is not initiated by the merchant and the user participates; true indicates that it is initiated by the merchant and the user does not need to participate
}
}
}
Example of the Response:
{
"msg": "Success.",
"code": "APPLY_SUCCESS",
"data": {
// PayerMax Checkout address
"redirectUrl": "https://cashier-n-uat.payermax.com/static/processApiV2.html?tradeToken=T2025042306527802000033&integrate=DIRECT_API&country=UN&payRequestNo=20250423060120EP4366527897000250005&merchantId=010213834784554&merchantAppId=6666c8b036a24579974497c2f9a33333&token=902170aeaadb4621af8d9530398d0efa&orderLan=en&countryLan=en&strategyLan=LUBCO&pmaxLinkV=1",
"outTradeNo": "APIFOXDEV1745388079422",
"tradeToken": "T2025042306527802000033",
"status": "PENDING"
}
}
4.2 Binding the Payment Method in Direct API Mode
For the API document of binding the payment method in API mode, please refer to the Direct API Payment API document. The request addresses for different environments are as follows:
Prod request address: https://pay-gate.payermax.com/aggregate-pay/api/gateway/orderAndPay
Test request address: https://pay-gate-uat.payermax.com/aggregate-pay/api/gateway/orderAndPay
Example of Request Parameters:
{
"version": "1.5",
"keyVersion": "1",
"requestTime": "2022-01-17T09:05:52.194+00:00",
"appId": "bbd8d2639a7c4dfd8df7d005294390df",
"merchantNo": "020113838535952",
"data": {
"outTradeNo": "APIFOXDEV1745388079422", // Unique order number for the merchant's order placement
"subject": "Direct Debit Title", // Title
"totalAmount": 10, // Direct debit amount
"currency": "USD", // Direct debit currency
"userId": "test1111", // User ID
"language": "en",
"reference": "test subscription",
"frontCallbackUrl": "http://www.frontCallbackUrl.com",
"notifyUrl": "http://www.notifyUrl.com",
"integrate": "Direct_Payment", // Fixed value: Direct_Payment
"expireTime": "1800",
"terminalType": "WEB", // Terminal type, WEB, WAP or APP
"osType": "ANDROID", // Operating system type ANDROID or IOS
"paymentDetail": {
"paymentMethodType": "CARD", // Required, value is CARD
"mitType": "SCHEDULED", // Required, MIT type, SCHEDULED for periodic direct debits, UNSCHEDULED for non-periodic direct debits
"tokenForFutureUse": true, // Required, value is true, generate paymentTokenID for subsequent direct debits
"merchantInitiated": false, // false indicates that the user needs to participate; true indicates that it is a direct debit initiated by the merchant and the user does not need to participate
"cardInfo": { // Required Card information
"cardIdentifierNo": "4001563861135570",
"cardHolderFullName": "James Smith",
"cardExpirationMonth": "05",
"cardExpirationYear": "25",
"cvv": "123"
}
}
}
}
Example of the Response:
{
"msg": "Success.",
"code": "APPLY_SUCCESS",
"data": {
// 3ds Challenge page address
"redirectUrl": "https://cashier-n-uat.payermax.com/static/processApiV2.html?tradeToken=T2025042306527802000033&integrate=DIRECT_API&country=UN&payRequestNo=20250423060120EP4366527897000250005&merchantId=010213834784554&merchantAppId=6666c8b036a24579974497c2f9a33333&token=902170aeaadb4621af8d9530398d0efa&orderLan=en&countryLan=en&strategyLan=LUBCO&pmaxLinkV=1",
"outTradeNo": "APIFOXDEV1745388079422",
"tradeToken": "T2025042306527802000033",
"status": "PENDING"
}
}
4.3 Binding the Payment Method Using the Front-end Component
For binding the payment method using the front-end component, the merchant needs to complete the integration through two steps. For details, please refer to: "Integration Process".
When binding the payment method using the front-end component, the merchant's server needs to call two API interfaces provided by PayerMax: Apply Drop-in Session and Front-end Component Payment . The request addresses of the Apply Drop-in Session interface in different environments are as follows:
Prod request address: https://pay-gate.payermax.com/aggregate-pay/api/gateway/applyDropinSession
Test request address: https://pay-gate-uat.payermax.com/aggregate-pay/api/gateway/applyDropinSession
Example of Input Parameters for the Apply Drop-in Session Request:
{
"version": "1.5",
"keyVersion": "1",
"requestTime": "2022-01-17T09:05:52.194+00:00",
"appId": "3b242b56a8b64274bcc37dac281120e3",
"merchantNo": "020213827212251",
"data": {
"totalAmount": "10", // Direct debit amount
"mitType": "SCHEDULED", // Required, value is SCHEDULED or UNSCHEDULED
"currency": "USD", // Required
"country": "SA", // Not required
"userId": "U10001", // Required, user ID
"componentList": [ // Required, payment methods supported by the component
"CARD"
]
}
}
Example of the Response:
{
"code": "APPLY_SUCCESS",
"msg": "Success.",
"data": {
"clientKey": "37114858239eur2384237r810482390",
"sessionKey": "bdsf8982348974hhf82934bf8239424"
}
}
The request addresses for different environments of the front-end component Payment interface are as follows:
Prod request address: https://pay-gate.payermax.com/aggregate-pay/api/gateway/orderAndPay
Test request address: https://pay-gate-uat.payermax.com/aggregate-pay/api/gateway/orderAndPay
Example of Request Parameters:
{
"version": "1.5",
"keyVersion": "1",
"requestTime": "2022-01-17T09:05:52.194+00:00",
"appId": "bbd8d2639a7c4dfd8df7d005294390df",
"merchantNo": "020113838535952",
"data": {
"outTradeNo": "APIFOXDEV1745388079422", // Unique order number for the merchant's order placement
"subject": "Direct Debit Title", // Title
"totalAmount": 10, // Direct debit amount
"currency": "USD", // Direct debit currency
"userId": "test1111", // User ID
"language": "en",
"reference": "test mit",
"frontCallbackUrl": "http://www.frontCallbackUrl.com",
"notifyUrl": "http://www.notifyUrl.com",
"integrate": "Direct_Payment", // Fixed value: Direct_Payment
"expireTime": "1800",
"terminalType": "WEB", // Terminal type, WEB, WAP or APP
"osType": "ANDROID", // Operating system type ANDROID or IOS
"paymentDetail": {
"paymentToken": "CPT4f200d278f3a454b9e91c81edc641e2b", // Required
"sessionKey": "bdsf8982348974hhf82934bf8239424", // Required
"mitType": "SCHEDULED", // Required, MIT type, SCHEDULED for periodic direct debits, UNSCHEDULED for non-periodic direct debits
"tokenForFutureUse": true, // Required, value is true, generate paymentTokenID for subsequent direct debits
"merchantInitiated": false // Required, false indicates that it is not initiated by the merchant and the user participates; true indicates that it is initiated by the merchant and the user does not need to participate
}
}
}
Example of the Response:
{
"code": "APPLY_SUCCESS",
"msg": "",
"data": {
// 3ds verification address
"redirectUrl": "https://cashier-n-uat.payermax.com/index.html#/cashier/home?merchantId=020213827212251&merchantAppId=3b242b56a8b64274bcc37dac281120e3&country=ID&tradeToken=TOKEN20220117091121294138752&language=en&token=IHjqkZ8%2F%2FFcnfDPxWTvJFOrulUAKfXFUkxHJSiTdlnjnX1G6AOuTiSl6%2BN05EzxTaJkcSsSyGh5a1q%2FACwWN0sDD%2FgwY5YdWu3ghDcH2wqm%2BJIcEh0qZqo%2BQFnXp65bvkLZnY7VO7HwZGzyrpMBlPhfRCQxwBbc6lJcSYuPf%2Fe8%3D&amount=10000¤cy=IDR&frontCallbackUrl=https%3A%2F%2Fwww.payermax.com",
"outTradeNo": "P1642410680681",
"tradeToken": "T2024062702289232000001",
"status": "PENDING"
}
}
5. Obtaining the Result of Binding the Payment Method
Merchants can receive the result of binding the payment method through the notifyUrl address provided when binding the payment method. For the detailed result message, please refer to: Result Notifications.
Example of notification parameters for successful binding of the payment method:
{
"appId": "d68f5da6a0174388821a64114c6b322c",
"code": "APPLY_SUCCESS",
"data": {
"channelNo": "TPC425300174064927201759000685",
"completeTime": "2025-02-27T09:41:12.267Z",
"country": "UN",
"currency": "USD",
"outTradeNo": "20250227174104451122388",
"paymentDetails": [
{
"cardInfo": {
"cardIdentifierName": "**D",
"cardIdentifierNo": "424242******0000",
"cardOrg": "VISA",
"country": "GB"
},
"paymentMethodType": "CARD",
"paymentTokenID": "PMTOKEN20250227071843552050007000094"
}
],
"reference": "reference",
"status": "SUCCESS",
"thirdChannelNo": "mtjxuvedrz58345",
"totalAmount": 10,
"tradeToken": "T2025022709425329000091"
},
"keyVersion": "1",
"merchantNo": "P01010118267336",
"msg": "Success.",
"notifyTime": "2025-02-27T09:41:12 +0000",
"notifyType": "PAYMENT"
}
After the payment method is successfully bound, PayerMax will generate a paymentTokenID, which needs to be used for subsequent direct debits.
Example of notification parameters for failed binding of the payment method:
{
"appId": "d68f5da6a0174388821a64114c6b322c",
"code": "PAYMENT_FAILED",
"data": {
"channelNo": "TPC462800174064934688659000687",
"completeTime": "2025-02-27T09:44:00.216Z",
"country": "UN",
"currency": "USD",
"outTradeNo": "20250227174218727122389",
"paymentDetails": [
{
"cardInfo": {
"cardIdentifierName": "**D",
"cardIdentifierNo": "424242******0000",
"cardOrg": "VISA"
},
"paymentMethodType": "CARD"
}
],
"reference": "reference",
"status": "FAILED",
"thirdChannelNo": "dycbhzfsmz69480",
"totalAmount": 10,
"tradeToken": "T2025022709462829000092"
},
"keyVersion": "1",
"merchantNo": "P01010118267336",
"msg": "Provider failed to process.",
"notifyTime": "2025-02-27T09:44:00 +0000",
"notifyType": "PAYMENT"
}
6. Initiating a Auto Debit
Parameter description:
totalAmount: The transaction amount must be greater than 0;
integrate: Pass the fixed value Direct_Payment;
paymentDetail.mitType: The direct debit type, SCHEDULED is for periodic subscription, and UNSCHEDULED is for non-periodic auto debit;
paymentDetail.tokenForFutureUse: true/false, whether to generate a token for subsequent direct debits; for subsequent deductions, pass false or do not pass it;
paymentDetail.merchantInitiated: true/false, whether it is a transaction initiated by the merchant; for subsequent deductions, it is initiated by the merchant and the user does not need to participate, so pass the value as true.
paymentDetail.paymentTokenID: The Token returned by PayerMax after the binding method is successful.
For the API document of subsequent direct debits, please refer to the Direct API Payment API document. The request addresses for different environments are as follows:
Prod request address: https://pay-gate.payermax.com/aggregate-pay/api/gateway/orderAndPay
Test request address: https://pay-gate-uat.payermax.com/aggregate-pay/api/gateway/orderAndPay
Example of Request Parameters:
{
"version": "1.5",
"keyVersion": "1",
"requestTime": "2022-01-17T09:05:52.194+00:00",
"appId": "bbd8d2639a7c4dfd8df7d005294390df",
"merchantNo": "020113838535952",
"data": {
"outTradeNo": "APIFOXDEV1745388079422", // Unique order number for the merchant's order placement
"subject": "Direct Debit Title", // Title
"totalAmount": 10, // Direct debit amount
"currency": "USD", // Direct debit currency
"userId": "test1111", // User ID
"language": "en",
"reference": "test subscription",
"frontCallbackUrl": "http://www.frontCallbackUrl.com",
"notifyUrl": "http://www.notifyUrl.com",
"integrate": "Direct_Payment", // Fixed value: Direct_Payment
"expireTime": "1800",
"terminalType": "WEB", // Terminal type, WEB, WAP or APP
"osType": "ANDROID", // Operating system type ANDROID or IOS
"paymentDetail": {
"paymentMethodType": "CARD", // Required, value is CARD
"mitType": "SCHEDULED", // Required, MIT type, SCHEDULED for periodic direct debits, UNSCHEDULED for non-periodic direct debits
"tokenForFutureUse": false, // Required, value is true, generate paymentTokenID for subsequent direct debits
"merchantInitiated": true, // false indicates that the user needs to participate; true indicates that it is a direct debit initiated by the merchant and the user does not need to participate
"paymentTokenID": "PMTOKEN20230424072005899168200035002", // The Token value returned by PayerMax to the merchant after the first direct debit is successful
}
}
}
Example of the Response:
{
"msg": "Success.",
"code": "APPLY_SUCCESS",
"data": {
"outTradeNo": "APIFOXDEV1745388079422",
"tradeToken": "T2025042306527802000033",
"status": "SUCCESS"
}
}
7. Obtaining the Direct Debit Result
Whether it is binding the payment method or subsequent direct debits, after the deduction is successful or fails, PayerMax will notify the merchant of the deduction result, and the merchant can also actively query the direct debit result.
7.1 Obtaining the Payment Result Using a Callback
Merchants can receive the payment result through the notifyUrl address provided during payment. For the detailed notification message, please refer to: Result Notifications.
Example of notification parameters for successful auto debit:
{
"appId": "d68f5da6a0174388821a64114c6b322c",
"code": "APPLY_SUCCESS",
"data": {
"channelNo": "TPC425300174064927201759000685",
"completeTime": "2025-02-27T09:41:12.267Z",
"country": "US",
"currency": "USD",
"outTradeNo": "20250227174104451122388",
"paymentDetails": [
{
"cardInfo": {
"cardIdentifierName": "**D",
"cardIdentifierNo": "424242******0000",
"cardOrg": "VISA",
"country": "GB"
},
"paymentMethodType": "CARD",
"paymentTokenID": "PMTOKEN20250227071843552050007000094"
}
],
"reference": "reference",
"status": "SUCCESS",
"thirdChannelNo": "mtjxuvedrz58345",
"totalAmount": 10,
"tradeToken": "T2025022709425329000091"
},
"keyVersion": "1",
"merchantNo": "P01010118267336",
"msg": "Success.",
"notifyTime": "2025-02-27T09:41:12 +0000",
"notifyType": "PAYMENT"
}
Example of notification parameters for failed auto debit:
{
"appId": "d68f5da6a0174388821a64114c6b322c",
"code": "PAYMENT_FAILED",
"data": {
"channelNo": "TPC462800174064934688659000687",
"completeTime": "2025-02-27T09:44:00.216Z",
"country": "US",
"currency": "USD",
"outTradeNo": "20250227174218727122389",
"paymentDetails": [
{
"cardInfo": {
"cardIdentifierName": "**D",
"cardIdentifierNo": "424242******0000",
"cardOrg": "VISA"
},
"paymentMethodType": "CARD"
}
],
"reference": "reference",
"status": "FAILED",
"thirdChannelNo": "dycbhzfsmz69480",
"totalAmount": 10,
"tradeToken": "T2025022709462829000092"
},
"keyVersion": "1",
"merchantNo": "P01010118267336",
"msg": "Provider failed to process.",
"notifyTime": "2025-02-27T09:44:00 +0000",
"notifyType": "PAYMENT"
}
After receiving the notification result, the correct code and message need to be responded to PayerMax. Otherwise, PayerMax will think that the merchant has not received the notification message normally and will retry the notification 6 times.
Example of Merchant Response Parameters:
{
"msg": "Success",
"code": "SUCCESS"
}
7.2 Obtaining the Payment Result Using a Query
For the API document of obtaining the payment result, please refer to the Transaction Inquiry API document. The request addresses for different environments are as follows:
Prod request address: https://pay-gate.payermax.com/aggregate-pay/api/gateway/orderQuery
Test request address: https://pay-gate-uat.payermax.com/aggregate-pay/api/gateway/orderQuery
Example of request parameters for querying the auto debit result:
{
"version": "1.5",
"keyVersion": "1",
"requestTime": "2022-01-17T07:51:15.597+00:00",
"appId": "a0dddd1f622243cb9aa1b676e808b5f8",
"merchantNo": "02021382719993",
"data": {
"outTradeNo": "P1642410680681"
}
}
Example of response parameters for querying the auto debit result:
{
"msg": "Success.",
"code": "APPLY_SUCCESS",
"data": {
"reference": "reference query and callback return",
"country": "SA",
"totalAmount": 10,
"outTradeNo": "P1642410680681",
"currency": "USD",
"channelNo": "DMCP000000000177005",
"thirdChannelNo": "4ikqJ6ktEqyRawE1dvqb9c",
"paymentCode": "2312121212",
"tradeToken": "T2024062702289232000001",
"completeTime": "2023-10-20T03:28:23.092Z",
"paymentDetails": [
{
"targetOrg": "*",
"cardInfo": {
"cardOrg": "VISA",
"country": "UN",
"cardIdentifierNo": "400555******0001",
"cardIdentifierName": "**ngwei"
},
"paymentTokenID": "PMTOKEN20250224063712195626335000250",
"payAmount": 10,
"exchangeRate": "1",
"paymentMethod": "CARD",
"payCurrency": "USD",
"paymentMethodType": "CARD"
}
],
"status": "SUCCESS",
"resultMsg": ""
}
}
8. Unbinding the Payment Method
After the user cancels the auto debit, the merchant needs to unbind the payment method for the user. For the API document of unbinding the payment method, please refer to removePaymentToken. The request addresses for different environments are as follows:
Prod request address: https://pay-gate.payermax.com/aggregate-pay/api/gateway/removePaymentToken
Test request address: https://pay-gate-uat.payermax.com/aggregate-pay/api/gateway/removePaymentToken
Example of Request Parameters:
{
"version": "1.5",
"keyVersion": "1",
"requestTime": "2022-01-22T10:00:00.500+08:00",
"appId": "46153e2b787241ae8b01857bb087d1bd",
"merchantNo": "010229810189301",
"data": {
"userId": "TEST",
"paymentTokenID": "PMTOKEN20230424072005899168200035002",
"removeReason": "remove"
}
}
Example of the Response:
{
"code": "APPLY_SUCCESS",
"msg": "Success",
"data": {
"paymentTokenID": "PMTOKEN20230424072005899168200035002",
"userId": "Test",
"paymentTokenStatus": "Deleted"
}
}