跳转到内容

Product overview

EVO payment provides Original Credit Transactions for several business scenarios such as tax refund and online gaming.

How it works

This diagram below describes the whole workflow of Payout.

Step1: Check if the card is available

EVO Payment provides the ability to validate the card with a zero-auth transaction before starting the Original Credit Transactions. Please see chapter Account Status Inquiry (ASI) for more details.This step is optional for users.

Step2: Collect user’s payout information

Collect your user’s payout information based on the API Specification, then send them to your host.Please note that if the user selects to pay with a card, the merchant must obtain the PCI DSS compliance. You have 2 ways to collect card details:

  1. Use EVO Payment client-side solution to securely encrypt your user's card details.

This option ensures you meet the PCI DSS compliance, as you're only required to submit PCI DSS Self-f-A-Assessment Questionnaire A (SAQ A). See EVO Payment SDK Integration Guide for more details.

  1. Collect and send raw card data.

This option requires you to assess your PCI DSS compliance according to PCI DSS Self-f-A-Assessment Questionnaire D (SAQ D), the most extensive form of self-certification.In the scenario of Original Credit Transactions, the user only needs to send the card number or encrypted card number.

Step3: Make a payout

  1. When it’s only a payout transaction

After the user chooses the card and submits the required payout information, you needs to make a payout request to EVO Payment.From your server, you can make an HTTP POST request to EVO Payment endpoint.

/g2/v1/payment/mer/{sid}/payout

and specify the parameters below.

Body parameterRequiredDescription
merchantTransInfoMThe reference for the payout, including a unique merchantTransID and merchantTransTime to specify the time you initiate the request.
transAmountMThe currency and value of the payout. The value must follow the currency's minor unit.
paymentMethodMUse paymentMethod.type to specify different payout method type, such as card, with different payout information that you collect in the previous step.
transInitiatorMThe information of device to initiate the transaction.
tradeInfoMThis field is used to indicate the specific scenario of Original Credit Transaction.
senderInfoMDetail information about the sender who will send the money to the receiver card. Specify this parameter if you can obtain the information from the user. This helps EVO Payment laundering and fraud detection, and increases payout success rates.
recipientInfoMDetail information about the receiver who will receive the money from the sender. Specify this parameter if you can obtain the information from the user. This helps to increase payout success rates.
webhookOThe URL to receive notification. Specify this to get the notification from EVO Payment after the payout has succeeded.
metadataOA self-defined reference information that you can specify in the request, and will be echoed back in the response. The metadata message in the response is the same as the metadata in your request message, except of GET request. The metadata in GET response message is the same as the metadata in the POST request message. And the metadata in the notification is the same as the metadata in the POST request message.

More details about the paymentMethod object: Below is take an example in card scenario

  1. paymentMethod.type: Set as card in your request.
  2. paymentMethod.card.payoutCardInfo.cardNumber: Set as card number of the receiver

More details about the tradeInfo object:

tradeInfo.tradeType:

This field is used to define the specific scenario of Original Credit Transaction the user has to use different value in different scenario. For now, EVO Payment can support four valid values:

  • Funds_Disbursement: used for tax refund, Payroll, Game Top-up etc.
  • Online_Gambling_Payout: used for online gaming.
  • Account_Transfer: used for Original Credit Transaction between two accounts that belong to one person in P2P scenario.
  • Personal_Transfer: used for Original Credit Transaction between two people in P2P scenario.

Here is an example of using Visa card to make a 10 USD payout:

js
curl-X POST https://{DOMAIN_NAME.com}/g2/v1/payment/mer/{sid}/payout \
-H "Content-Type: application/json" \
-H "DateTime: 2021-12-31T08:30:59+0800" \
-H "MsgID: 2d21a5715c034efb7e0aa383b885fc7a" \
-H "SignType: SHA256" \
-H "Authorization: YOUR_MESSAGE_SIGNATURE" \
-d'{
    "transInitiator": {
        "platform": "WEB"
    },
    "merchantTransInfo": {
        "merchantTransID": "{{merchantTransID}}",
        "merchantTransTime": "{{merTransTime}}"
    },
    "tradeInfo": {
        "tradeType": "Account_Transfer",
        "purposeOfPayment": "13"
    },
    "transAmount": {
        "currency": "HKD",
        "value": "1.00"
    },
    "paymentMethod": {
        "type": "card",
        "card": {
            "payoutCardInfo": {
                "cardNumber": "5204730000009725"
            }
        }
    },
    "senderInfo": {
        "name": {
            "firstName": "test1",
            "middleName": "test2",
            "lastName": "test3"
        },
        "address": {
            "street": "UL",
            "city": "UA",
            "stateOrProvince": "LA",
            "country": "USA"
        },
        "dateOfBirth": "20000415",
        "accountNumber": "123456",
        "accountType": "Card_Account"
    },
    "recipientInfo": {
        "name": {
            "firstName": "ABC",
            "middleName": "DFG",
            "lastName": "QWE"
        },
        "address": {
            "street": "AC",
            "city": "YU",
            "stateOrProvince": "AL",
            "country": "USA"
        }
    },
    "webhook": "",
    "metadata": "123"
}

Here is an example of receiving a response:

js
{
    "metadata": "123",
    "paymentMethod": {
        "payoutCard": {
            "first6No": "476134",
            "fundingType": "credit",
            "issuingCountry": "SGP",
            "last4No": "0019",
            "paymentBrand": "Visa",
            "productID":"N"
        },
        "isNetworkToken": false
    },
    "payout": {
        "evoTransInfo": {
            "evoTransID": "pay_250904100221000118184371",
            "evoTransTime": "2025-09-04T02:02:21Z",
            "retrievalReferenceNum": "524710336595",
            "traceNum": "336595"
        },
        "merchantTransInfo": {
            "merchantTransID": "T509041756951340689",
            "merchantTransTime": "2025-09-04T10:02:20+08:00"
        },
        "pspTransInfo": {
            "authorizationCode": "016407",
            "pspTransTime": "2025-09-04T02:02:20Z",
            "pspTransID":"MCS0X349T0908",
            "retrievalReferenceNum": "524710336595"
        },
        "status": "Success",
        "transAmount": {
            "currency": "HKD",
            "value": "1.00"
        }
    },
    "pspData": {
        "merchantID": "OCT000415123456",
        "name": "Visa"
    },
    "result": {
        "code": "S0000",
        "message": "Success",
        "pspMessage": "Approved or completed successfully",
        "pspResponseCode": "00"
    }
}
  1. When it's an OCT transaction in P2P scenario

In P2P scenario, when the user decides to send two requests to complete the money transfer, the user has to send an AFT request (POST Payment) and an OCT request (POST payout). The OCT request has to link the AFT request’s merchantTransID in the request URL so that the necessary information can be linked.

Here is an example of request URL when the OCT happens in P2P scenario
(the value of the merchantTransID is an example, this merchantTransID belongs to the AFT transaction)

/g2/v1/payment/mer/{sid}/payout?merchantTransID=T509091757387259148

Step4:Present the payout result

After the user confirms the payout, you can use the result.code and payout.status to inform the user of the payout status.

Result codeDescription
S0000Success
V0008Field { } is not applied with
C0004Request resource merchantTransID {XXX} not exist
B0005Unsupported function {XXX}, please check your profile setup in EVO Payment
B0006Unsupported payment brand {XXX}, please check your profile setup in EVO Payment
B0033The transaction was rejected for security violation

For other possible result.code values and recommended messages that you can present to your user, see A Appendix in EVO Payment API Specification.

Get the payout detail

The user can send GET Payout to get the detail information of the payout.
From your server, you can make an HTTP GET request to EVO Payment endpoint
(the value of the merchantTransID is an example)
This merchantTransID belongs to the Payout transaction that you want to get
/g2/v1/payment/mer/{sid}/payout?merchantTransID=T509091757387259148
The response is the same as the response of POST payout