Tokenization - Drop In Payment Integration
This document describes the integration process of Tokenization Drop In integration model.
With the pre-built front-end UI components, PayerMax can dynamically display payment information input forms according to the different payment methods selected by users. At the same time, merchants can also customize the language, style and other features of the components.
For more information about the Drop In component model, please refer to Overview of Integration Modes.
1. Integration Preparation
Upload test merchant public key, get the platform public key, AppID, test merchant number and other integration information;
Configure the callback address (WebHook), including the payment result callback address, refund result callback address, and so on;
Understand the principles of request message signing and verification, for generating a
sign
signature string for each HTTP request Header.
2. Interaction Process
3. Interface List
Associative Interaction Timing | Calling direction | Interface Type | Interface PATH |
1.3 Getting Drop in Initialization Information | Merchant -> PayerMax | Back-end Interface | /applyDropinSession |
1.6 Create and mount PayerMax components | Merchant Client -> PayerMax Drop In JS SDK | Front-end Interface | PMdropin.create |
1.6 Create and mount PayerMax components | Merchant Client -> PayerMax Drop In JS SDK | Front-end Interface | PMdropin.mount |
1.6 Create and mount PayerMax components | Merchant Client -> PayerMax Drop In JS SDK | Front-end Interface | PMdropin.on |
2.2 Get paymentToken | Merchant Client -> PayerMax Drop In JS SDK | Front-end Interface | PMdropin.emit |
3.4 Creating a payment, calling the Drop In ordering interface | Merchant -> PayerMax | Back-end Interface | /orderAndPay |
4.1 Asynchronous notification of payment results | PayerMax -> 商户 | Back-end Interface | /collectResultNotifyUrl |
5.1 Check Payment Transactions | Merchant -> PayerMax | Back-end Interface | /orderQuery |
4. Environmental Information
Test environment request address:https://
pay-gate-uat.payermax.com
/aggregate-pay/api/gateway/<Interface PATH>
Integrated Environment:https://
pay-gate.payermax.com
/aggregate-pay/api/gateway/<Interface PATH>
5. Integration Steps
5.1 Getting Drop in Initialization Information
The merchant server through the /applyDropinSession API interface, initiates an HTTP POST request to obtain the client token clientKey
and the session token sessionKey
required for the initialization of the drop in.
/applyDropinSession API Example of an interface request:
curl --request POST \
--url https://pay-gate-uat.payermax.com/aggregate-pay/api/gateway/applyDropinSession \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--header 'sign: FPFVT3o227JrFRbqu19boZCpVVTF9KznxyRawUmxpfXilHV/0yK46haPhAjNu1hPUMy7Vw/ILXhfzffNm4Fj0a pWknlTY9OJxnSoQxS9BTFtc61tn5yV1q69x/kkBl82/qwg+XTJ4fOzy7Mar3VaC1E2PlDA6RkkKBUyNE6RYgsd B+Su7an4+4HVTNAnoe74WyvBgxTLMNg28igBTdqxaO3w/UBY6ObVp7vkqkQGdL1Y+HgmMYaAVwrM3+ALWGId0s J+YqTY4WJ+0xCRGhaSnybiIjZsQEYyID68WNUfuavDLDsEhaMm/HfQvf5p0R1Ltovp3wwJnEbQcjY458iX5A==' \
--data '{
"version": "1.4",
"keyVersion": "1",
"requestTime": "2025-05-14T16:30:27.174+08:00",
"appId": "test516e8ab74578be8eecd8c4803fbe",
"merchantNo": "TEST010117960578",
"data": {
"country": "MY", # Acquiring country
"currency": "MYR", # Order currency
"totalAmount":"50", # Order amount
"tokenForFutureUse": true, # If true is passed, it means that the token payment request is requested, and the Token protocol will be displayed on the component
"userId": "20220622_00086", # User ID, must be unique
"componentList":["CARD"] # Specify the payment method available for this order
}
}'
The actual payment methods available for this order can be specified via the request parameter componentList
, the value of which must be a payment method that has been contracted by the merchant. Merchants can check their contracted payment methods via Merchant Platform(MMC) or consult PayerMax technical support.
/applyDropinSession API Example of an interface response:
{
"msg": "success",
"code": "APPLY_SUCCESS",
"data": {
"sessionKey": "bf2c47b085e24c299e45dd56fd751a70",
"clientKey": "bbd8d2639a7c4dfd8df7d005294390df"
}
}
5.2 Render the Drop in
- Introduce the CDN package on the relevant HTML page.
<script src="https://cdn.payermax.com/dropin/js/pmdropin.min.js"></script>
- Embed an
iframes
on the merchant page by going over thediv
tag.
<div class="frame-card">
<!-- 表单内容 -->
</div>
- Initialize PayerMax Frames。
// Initialize the card component, please refer to https://docs.payermax.com/doc-center/receipt/front-end-component/configuration-card.html
const card = PMdropin.create('card', {
clientKey: "client public key", // data.clientKey obtained in step 1.1
sessionKey: "session token", // data.sessionKey obtained in step 1.1
sandbox: false, // default is false, that is, production environment
hideSaveCard: false, //Whether to hide the save card information option, the default is false display
hideCardBrands: false, //Whether to hide the upper left corner card brand logo, the default is false display
hideRecommendAccount: true //Whether to hide the recommendation card on the component, the default is false display
});
// Mounting example
card.mount('.frame-card'); // Mount to the first matched dom element
// Component loading completion time
card.on('ready', () => {
// Remove custom loading
})
- Listen to form filling status and set payment button dynamically (optional). By listening to the events of the form, you can monitor the legitimacy of the information filled in by the user in real time, so as to dynamically set whether the button can be clicked or not.
card.on('form-check', (res) => {
// res.isFormValid is the form status. The value is false/true
// true means the form passes the validation and can be paid, false means the validation doesn't pass and can't be paid, and the pay button can't be clicked.
console.log('[dropin][form-check]:', res)
})
- Check the token payment agreement.
If the Token payment protocol is not checked, the normal payment process will be followed. After the payment is completed, the merchant's PaymentTokenID
will not be returned. Only when the user checks the Token protocol and the payment is completed, the merchant's PaymentTokenID
will be returned.
Download the complete Drop In Integration DEMO, replace sessionKey
and clientKey
, then you can run it locally and view the frontend component integration sample.
5.3 Create Payment
- Merchant client: the user clicks to initiate a payment, checks if the payment is available, and gets the
paymentToken
.
card.emit('setDisabled', true) // Freeze the form after clicking the payment button to prevent repeated payment submission
card.emit('canMakePayment')
card.emit('canMakePayment')
.then(res => {
if (res.code === 'APPLY_SUCCESS') {
const paymentToken = res.data.paymentToken // Payment token, payment interface usage
// Initiate payment interface
// The merchant requests the backend interface to place an order,
// The merchant constructs the request parameters with params, and needs to bring paymentToken.
// res.data.agreementAccepted = true, indicating that the user has checked the token agreement,
// res.data.agreementAccepted = false, indicating that the user has not checked the token agreement,
// Only when res.data.agreementAccepted = true, the merchant can send data.paymentDetail.tokenForFutureUse = true when calling the orderAndPay interface, otherwise the order will fail
_postapi('orderAndPay',params).then(res =>{
const code = (res || {}).code
//The merchant returns the payment result to the front end
if (code == 'APPLY_SUCCESS') {
//Payment is successful, display the payment result
} else {
//Payment failed, display payment result
}
}
card.emit('setDisabled', false) // Unfreeze the form after the payment interface is completed
}
})
.catch(err => {
card.emit('setDisabled', false) // Unfreeze the form after an exception occurs
})
canMakePayment
returns the following result:
{
"code": "APPLY_SUCCESS",
"message": "",
"data": {
"paymentToken": "xxxxxxx",
"cardBinNo": "123456",
"maskCardNumber": "123456****1234",
"cardHolderFullName": "zhangsan",
"cardOrg": "VISA",
"cardType": "CREDIT",
"cardIssuingCountry": "SA",
"cardExpirationMonth": "12",
"cardExpirationYear": "33",
"agreementAccepted": true // true indicates that the merchant agrees to the token agreement
}
}
- Merchant server: calls the /orderAndPay API interface to initiate the HTTP POST request and create the payment.
Note:
After the payment is created, the merchant can specify the payment shutdown time in seconds for a single payment via the interface entry expireTime
, the value of which must be greater than 1800 (30 minutes) and less than 86400 (24 hours). If the value passed in is less than 1800, the system will reset to the minimum value of 30min; if the value passed in is less than 86400, the system will reset to the maximum value of 86400. If the merchant doesn't specify it, the specific shutdown time will be different according to the payment method used.
/orderAndPay API Example of an interface request:
curl --request POST \
--url 'https://pay-gate-uat.payermax.com/aggregate-pay/api/gateway/orderAndPay' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--header 'sign: FPFVT3o227JrFRbqu19boZCpVVTF9KznxyRawUmxpfXilHV/0yK46haPhAjNu1hPUMy7Vw/ILXhfzffNm4Fj0apWknlTY9OJxnSoQxS9BTFtc61tn5yV1q69x/kkBl82/qwg+XTJ4fOzy7Mar3VaC1E2PlDA6RkkKBUyNE6RYgsdB+Su7an4+4HVTNAnoe74WyvBgxTLMNg28igBTdqxaO3w/UBY6ObVp7vkqkQGdL1Y+HgmMYaAVwrM3+ALWGId0sJ+YqTY4WJ+0xCRGhaSnybiIjZsQEYyID68WNUfuavDLDsEhaMm/HfQvf5p0R1Ltovp3wwJnEbQcjY458iX5A==' \
--data '{
"requestTime": "2025-05-28T03:52:42.591-02:00",
"keyVersion": "1",
"appId": "tested7c863c439a9e29b4519867965a",
"version": "1.4",
"merchantNo": "TEST10116880289",
"data": {
"integrate": "Direct_Payment", # In front-end component mode, specify Direct_Payment
"totalAmount": 39.99,
"country": "SA",
"expireTime": "3600",
"paymentDetail": {
# When paying, obtain the value through the canMakePayment event response of the emit interface of the JS SDK, which is not empty.
"paymentToken": "TEST12637c2c2d942239d9a2661c4ad14f9",
"buyerInfo": {
"clientIp": "176.16.34.144",
"userAgent": "Chrome"
},
# When paying, obtain the response from the create interface of the JS SDK, non-empty
"sessionKey": "test29632c3643768e3b65ef6a31c9ce", # Non-empty in front component mode
"tokenForFutureUse": true
// TokenForFutureUse must pass true if two conditions are met:
// 1. Apply Paymentession requires tokenForFutureUse=true
// 2. The user must have selected the token protocol on the component
// If the above two conditions are not met, but the interface passes tokenForFutureUse=true, the order will fail verification
},
"frontCallbackUrl": "https://front.your.com/pay/index.html",
"subject": "River Game HK Limited",
"outTradeNo": "ov1_da78b1f3c2f9443b966347fc89305fc9",
"notifyUrl": "https://notify.your.com/pay/paymentWebHookPayerMaxServlet",
"currency": "SAR",
"userId": "1822613953000446",
"terminalType": "WEB"
}
}'
/orderAndPay API Example of an interface response:
{
"msg": "Success.",
"code": "APPLY_SUCCESS",
"data": {
"outTradeNo": "test_da78b1f3c2f9443b966347fc89305fc9",
"tradeToken": "T2024052805951921811176",
"status": "SUCCESS"
}
}
5.4 Get Payment Results
For orders paid with tokens, after payment is completed, the paymentTokenID
will be returned in the result notification. After the merchant obtains the paymentTokenID
, it needs to be saved and the paymentTokenID
belongs to which user and which payment method; this will facilitate the use of paymentTokenID
to replace payment elements (card number and other information) to complete the payment in subsequent payments.
5.4.1 Adoption of notification of payment results
See Get Payment Result Integration - Adoption of Payment Result Notification.
Token payment notification example:
curl --request POST \
--url https://pay-gate-uat.payermax.com/collectResultNotifyUrl \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--header 'sign: FPFVT3o227JrFRbqu19boZCpVVTF9KznxyRawUmxpfXilHV/0yK46haPhAjNu1hPUMy7Vw/ILXhfzffNm4Fj0apWknlTY9OJxnSoQxS9BTFtc61tn5yV1q69x/kkBl82/qwg+XTJ4fOzy7Mar3VaC1E2PlDA6RkkKBUyNE6RYgsdB+Su7an4+4HVTNAnoe74WyvBgxTLMNg28igBTdqxaO3w/UBY6ObVp7vkqkQGdL1Y+HgmMYaAVwrM3+ALWGId0sJ+YqTY4WJ+0xCRGhaSnybiIjZsQEYyID68WNUfuavDLDsEhaMm/HfQvf5p0R1Ltovp3wwJnEbQcjY458iX5A==' \
--data '{
"appId": "ff4f0273d212386sdxxxxxxxxx",
"code": "APPLY_SUCCESS",
"data": {
"country": "UN",
"totalAmount": 9.99,
"channelNo": "PPC8xxxx017516227301xxxx",
"outTradeNo": "ORDxxxx51006xx",
"completeTime": "2025-07-04T09:52:11.249Z",
"currency": "USD",
"tradeToken": "T20xxx704098xxxx349xx",
"paymentDetails": [
{
"cardInfo": {
"cardOrg": "VISA",
"country": "NZ",
"cardIdentifierNo": "123456******1234",
"cardIdentifierName": "Z**************"
},
"paymentTokenID": "PMTOKEN20230424072005899168200035002", //This field is returned only when Token is paid
"paymentMethodType": "CARD"
}
],
"thirdChannelNo": "151764",
"status": "SUCCESS"
},
"keyVersion": "1",
"merchantNo": "P01010118640464",
"msg": "Success.",
"notifyTime": "2025-07-04T09:52:11.280Z",
"notifyType": "PAYMENT"
}'
Merchant response parameter example:
{
"msg": "Success",
"code": "SUCCESS"
}
5.4.2 Inquiry via Payment Orders
See Get Payment Result Integration - Inquiry via payment order.
Query input parameters:
curl --request POST \
--url https://pay-gate-uat.payermax.com/aggregate-pay/api/gateway/orderQuery \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--header 'sign: FPFVT3o227JrFRbqu19boZCpVVTF9KznxyRawUmxpfXilHV/0yK46haPhAjNu1hPUMy7Vw/ILXhfzffNm4Fj0apWknlTY9OJxnSoQxS9BTFtc61tn5yV1q69x/kkBl82/qwg+XTJ4fOzy7Mar3VaC1E2PlDA6RkkKBUyNE6RYgsdB+Su7an4+4HVTNAnoe74WyvBgxTLMNg28igBTdqxaO3w/UBY6ObVp7vkqkQGdL1Y+HgmMYaAVwrM3+ALWGId0sJ+YqTY4WJ+0xCRGhaSnybiIjZsQEYyID68WNUfuavDLDsEhaMm/HfQvf5p0R1Ltovp3wwJnEbQcjY458iX5A==' \
--data '{
"version": "1.4",
"keyVersion": "1",
"requestTime": "2022-01-17T07:51:15.597+00:00",
"appId": "a0dddd1f622243cb9aa11234e808b5f8",
"merchantNo": "02021382716699",
"data": {
"outTradeNo": "P164241068068119384" # Merchant order number
}
}'
Response result:
{
"msg": "Success.",
"code": "APPLY_SUCCESS",
"data": {
"reference": "reference查询和回调返回",
"country": "SA",
"totalAmount": 10,
"outTradeNo": "P164241068068119384",
"currency": "SAR",
"channelNo": "DMCP000000000177005",
"thirdChannelNo": "4ikqJ6ktEqyRawE1dvqb9c",
"paymentCode": "2312121212",
"tradeToken": "T2024062702289232000001",
"completeTime": "2023-10-20T03:28:23.092Z",
"paymentDetails": [
{
"cardInfo": {
"cardOrg": "VISA",
"country": "SA",
"cardIdentifierNo": "400555******0001",
"cardIdentifierName": "**ngwei"
},
"paymentMethodType": "CARD",
"paymentTokenID": "PMTOKEN20230424072005899168200035002", //This field is returned only when Token is paid
"payAmount": 10,
"exchangeRate": "1",
"paymentMethod": "CARD",
"payCurrency": "SAR"
}
],
"status": "SUCCESS",
"resultMsg": ""
}
}
5.5 Payment Using PaymentTokenID
Follow the above 4 steps, after the user completes the payment, PayerMax will return the PaymentTokenID
to the merchant. The merchant needs to save the PaymentTokenID
and record which user and payment method the paymentTokenID
belongs to; When making subsequent payments, the merchant uses /orderAndPay API to pass the payment method
, user ID
and PaymentTokenID
to PayerMax to complete the deduction, and no longer needs to send sensitive card information such as cardInfo
.
5.5.1 Create Payment
Merchants integrate /orderAndPay API through API mode to complete order payment.
/orderAndPay API Interface request example:
curl --request POST \
--url 'https://pay-gate-uat.payermax.com/aggregate-pay/api/gateway/orderAndPay' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--header 'sign: FPFVT3o227JrFRbqu19boZCpVVTF9KznxyRawUmxpfXilHV/0yK46haPhAjNu1hPUMy7Vw/ILXhfzffNm4Fj0apWknlTY9OJxnSoQxS9BTFtc61tn5yV1q69x/kkBl82/qwg+XTJ4fOzy7Mar3VaC1E2PlDA6RkkKBUyNE6RYgsdB+Su7an4+4HVTNAnoe74WyvBgxTLMNg28igBTdqxaO3w/UBY6ObVp7vkqkQGdL1Y+HgmMYaAVwrM3+ALWGId0sJ+YqTY4WJ+0xCRGhaSnybiIjZsQEYyID68WNUfuavDLDsEhaMm/HfQvf5p0R1Ltovp3wwJnEbQcjY458iX5A==' \
--data '{
"requestTime": "2025-05-28T03:52:42.591-02:00",
"keyVersion": "1",
"appId": "tested7c863c439a9e29b4519867965a",
"version": "1.4",
"merchantNo": "TEST10116880289",
"data": {
"integrate": "Direct_Payment", # In API mode, specify Direct_Payment
"totalAmount": 39.99,
"country": "SA",
"expireTime": "3600",
"paymentDetail": {
"buyerInfo": {
"clientIp": "176.16.34.144",
"userAgent": "Chrome"
},
"paymentMethodType": "CARD",
"paymentTokenID": "PMTOKEN20230424072005899168200035002"
},
"frontCallbackUrl": "https://front.your.com/pay/index.html",
"subject": "River Game HK Limited",
"outTradeNo": "ov1_da78b1f3c2f9443b966347fc89305fc9",
"notifyUrl": "https://notify.your.com/pay/paymentWebHookPayerMaxServlet",
"currency": "SAR",
"userId": "1822613953000446",
"terminalType": "WEB"
}
}'
Response result when No 3ds verification required
:
{
"msg": "Success.",
"code": "APPLY_SUCCESS",
"data": {
"outTradeNo": "test_da78b1f3c2f9443b966347fc89305fc9",
"tradeToken": "T2024052805951921811176",
"status": "SUCCESS"
}
}
Response result when 3ds verification required
:
{
"msg": "Success.",
"code": "APPLY_SUCCESS",
"data": {
// If the payment is subject to 3ds verification, the 3ds verification address will be returned and the user needs to complete the verification
"redirectUrl": "https://cashier-n.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": "test_da78b1f3c2f9443b966347fc89305fc9",
"tradeToken": "T2024052805951921811176",
"status": "PENDING"
}
}
5.5.2 Get Payment Results
To obtain the payment result, please refer to Adoption of notification of payment results and Inquiry via Payment Orders in step 4.
6. PaymentTokenID Management
Merchants can query all PaymentTokenID
s bound to a user through the PaymentTokenID Query API interface. When a user wants to remove the bound PaymentTokenID
, the merchant can remove the PaymentTokenID
through the PaymentTokenID Unbinding API.
6.1 Query PaymentTokenID
Merchants can query all PaymentTokenID
s bound to a user based on the payment method, or specify a PaymentTokenID
to query. The query result will return the corresponding masked card number and the status of the corresponding PaymentTokenID
.
PaymentTokenID query API Interface request example:
{
"version": "1.5",
"keyVersion": "1",
"requestTime": "{{requestTime}}",
"appId": "6666c8b036a24579974497c2f9a33333",
"merchantNo": "010213834784554",
"data": {
"userId": "songjiuhuaTest", // Required
"tokenScope": "tokenAcq", // Required, fixed value tokenAcq
"paymentMethodType": "CARD", // Optional
"targetOrg": null, // Optional This field is optional when the value of paymentMethodType is not CARD.
"cardOrg": "MASTERCARD", // Optional. This field is optional when the value of paymentMethodType is CARD.
"paymentTokenID": "PMTOKEN20250626075108220812006000001" // Optional. If not filled, all paymentTokenIDs bound to the user will be returned.
}
}
PaymentTokenID query API interface response example:
{
"msg": "",
"code": "APPLY_SUCCESS",
"data": {
"tokenList": [
{
"tokenScope": "tokenMit",
"cardInfo": "538774******9957",
"merchantInitiated": true,
"paymentTokenStatus": "Activated",
"userId": "songjiuhuaTest",
"paymentTokenExpiry": "2099-12-31T23:59:59.000Z",
"targetOrg": "",
"ifCVV": "N",
"paymentTokenID": "PMTOKEN20250523093224475590582000114",
"accountDisplay": "",
"paymentMethodType": "CARD",
"brand": "MASTERCARD"
},
{
"tokenScope": "tokenMit",
"cardInfo": "538774******1234",
"merchantInitiated": true,
"paymentTokenStatus": "Activated",
"userId": "songjiuhuaTest",
"paymentTokenExpiry": "2099-12-31T23:59:59.000Z",
"targetOrg": "",
"ifCVV": "N",
"paymentTokenID": "PMTOKEN20250523092615726590582000110",
"accountDisplay": "",
"paymentMethodType": "CARD",
"brand": "MASTERCARD"
}
]
}
}
6.2 Unbinding PaymentTokenID
When the user wants to remove the bound PaymentTokenID
, the merchant can remove the PaymentTokenID
through this interface. After removing the PaymentTokenID
, the merchant will no longer be able to use the PaymentTokenID
to initiate payment.
PaymentTokenID unbinding API Interface request example:
{
"version": "1.2",
"keyVersion": "1",
"requestTime": "2022-01-22T10:00:00.500+08:00",
"appId": "46153e2b787241ae8b01857bb087d1bd",
"merchantNo": "010229810189301",
"data": {
"userId": "songjiuhuaTest",
"paymentTokenID": "PMTOKEN20250523093224475590582000114",
"removeReason": "user want to remove it"
}
}
PaymentTokenID unbinding API Interface response example:
{
"code": "APPLY_SUCCESS",
"msg": "Success",
"data": {
"paymentTokenID": "PMTOKEN20250523093224475590582000114",
"userId": "songjiuhuaTest",
"paymentTokenStatus": "Deleted"
}
}
7. Test Go Live
After the merchant has completed the above integration steps, he/she can initiate the actual payment request for preliminary testing and validation, please refer to Integration Testing - Start a test for the specific steps.
After the test is passed and before the final release, the merchant must contact PayerMax technical support to submit the order information for the test so that PayerMax can check the request logs and data to confirm that you have correctly integrated the relevant capabilities, as described in Integration Testing - Initiate Acceptance.
After passing the acceptance test, the merchant can configure integration information for production environments and prepare for the opening of the volume.
In addition, under Acquiring Product Integration, there are integration documents for the various payment methods supported by PayerMax, which contain instructions for testing each payment method.
8. Troubleshooting
For response errors during testing or acceptance, you can refer to Troubleshooting - Error Code. Meanwhile, in FAQs, we summarize and list all kinds of common problems and how to deal with them.
You can also contact PayerMax technical support team directly for any questions during integration, testing and acceptance.