eWallet
eWallet Integration
eWallet is a digital wallet payment method fully integrated through the SNAP BI standard. Winpay supports integration of various popular eWallets such as Speedcash, OVO, DANA, ShopeePay, and AstraPay in real-time via SNAP API.
Sequence Diagram
The following diagram explains the eWallet transaction flow:

Description:
| No | Process | Related documents | Description |
|---|---|---|---|
| 1 | Generate Signature | Signature Generation | Before requesting the Create eWallet URL API, you are required to generate a signature for authentication on the Create eWallet URL API. |
| 2 | Assign Signature to X-Signature Header | The generated signature can be placed in the X-Signature header when requesting the Create eWallet URL. | |
| 3 | Completing Header & Body Request Create eWallet | Header | You can complete the Header & Body before requesting the Create eWallet URL. |
| 4 | Request Create URL eWallet | Request | In this step, you can request the Create eWallet URL API to obtain the eWallet payment URL. |
| 5 | Response URL eWallet | Response | After creating the eWallet URL, you will receive the eWallet payment URL to be paid at the associated provider. |
| 6 | Payment (User) | The user makes a payment using the eWallet application. | |
| 7 | Payment (eWallet) | The eWallet provider sends a payment instruction to Winpay. | |
| 8 | Response Success (eWallet Payment) | Winpay responds with a successful payment to the eWallet provider. | |
| 9 | Response Success (User Payment) | The eWallet provider responds with a successful payment to the user. | |
| 10 | Sending Payment Notification | Payment Callback | After the payment process from the user to the eWallet provider and the provider to Winpay is complete, Winpay will send a payment notification to the merchant to notify them that the payment was successful. |
Supported Payment Methods
The supported payment methods by Winpay eWallet are as follows:
| Channel Code | Institution |
|---|---|
| SC | Speedcash |
| OVO | OVO |
| DANA | DANA |
| SPAY | ShopeePay |
eWallet transaction
1. Payment (Create eWallet Payment)
This service is used to make eWallet payment transactions.
Payload Request
| Field Name | Data Type | Mandatory | Description |
|---|---|---|---|
| partnerReferenceNo | String | Y | Transaction Number Length: 5-50Allowed Characters: letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-) |
| amount | Object | Y | Object amount |
| amount.value | String | Y | Transaction value Length: 1-12Allowed Chars: 0-9 |
| amount.currency | String | Y | Currency code Length: 3Allowed Value: IDR |
| urlParam | Array | Y | Array url |
| urlParam.url | String | Y | Url callback |
| urlParam.type | String | Y | Tipe callback Allowed Value: PAY_NOTIFY dan PAY_RETURN |
| urlParam.isDeeplink | String | Y | Flag to determine whether the callback URL is a deeplink or not Allowed Value: N |
| validUpTo | String | Y | Transaction time ends Format: YYYY-MM-DDTHH:mm:ssZ (ISO8601) Must be more than 1 minute and a maximum of 3 months from the time of request |
| additionalInfo | Object | Y | Object additionalInfo |
| additionalInfo.channel | String | Y | Channel eWallet Allowed Value: SC, OVO, DANA, SPAY |
| additionalInfo.customerPhone | String | Y | Customer phone number |
| additionalInfo.customerName | String | Y | Customer name Lenght: 5-25 Allowed characters: letters (a-z, A-Z), numbers (0-9), hyphens (-), and spaces (\s) |
{
"partnerReferenceNo": "000000000056",
"amount": {
"value": "10000.00",
"currency": "IDR"
},
"urlParam": [
{
"url": "https://test1.bi.go.id/v1/test",
"type": "PAY_NOTIFY",
"isDeeplink": "N"
},
{
"url": "https://test1.bi.go.id/v1/test",
"type": "PAY_RETURN",
"isDeeplink": "N"
}
],
"validUpTo": "2023-09-05T17:10:11+07:00",
"additionalInfo": {
"channel": "SPAY",
"customerPhone": "0895633156874",
"customerName": "Chus Pandi"
}
}
Response Payload
| Parameters | Data Type | Description |
|---|---|---|
| responseCode | String | Code response |
| responseMessage | String | Message response |
| partnerReferenceNo | String | Transaction number |
| appRedirectUrl | String | Url deeplink |
| webRedirectUrl | String | Url redirect |
| additionalInfo | Object | Object response |
| contractId | String | Generated transaction identifier in Winpay system |
| expiredTime | String | ewallet expiration in ISO8601 format |
| channel | String | Channel eWallet |
| instructions | Array | Array of payment instructions |
{
"responseCode": "2005400",
"responseMessage": "Success",
"partnerReferenceNo": "000000000056",
"appRedirectUrl": "",
"webRedirectUrl": "https://pay.uat.airpay.co.id/h5pay/pay?type=start&medium_index=dFhkbmR1bTBIamhWwwGYax2gqqaG0bwCV3nlkmQLDsIkIhz-8m0VHcHV0nVvrpd3jK_DCulreFD1J5whxFwzXw&order_key=dabvhWOGQdcTs-dR3s_sFR69_X188lg92nPv2v0-uT1zpS7nWhxcDJuuOzUln7Z1PPVTPc6MyF6Vrw&source=web&token=dFhkbmR1bTBIamhWwwGYax2gqqaG0bwCV3nlkmQLDsIkIhz-8m0VHcHV0nVvrpd3jK_DCulreFD1J5whxFwzXw",
"additionalInfo": {
"contractId": "so4c0a61fa-5ad4-4fee-99ed-2a7b06b30c4b",
"expiredTime": "2023-09-05T17:10:11+07:00",
"channel": "SPAY",
"instructions": []
}
}
List Response Codes
| Response Code | Response Message | Description |
|---|---|---|
| 2005400 | Success | |
| 4005400 | Bad Request | General request failed error, including message parsing failed. |
| 4005401 | Invalid field format { field name } | |
| 4005402 | Invalid mandatory field {field name} | |
| 4015400 | Invalid signature | X-Signature wrong |
| 4045416 | Partner not found | X-Partner-ID not registered |
| 4095400 | Cannot use same X-EXTERNAL-ID in same day | X-External-ID has already been used on the same day |
| 4095401 | Duplicate partnerReferenceNo | partnerReferenceNo has been used before |
| 5005400 | General Error | General Error. |
| 5005401 | Internal Server Error | Unknown Internal Server Failure, Please retry the process again. |
2. Payment Status
This service is used to check the payment status from eWallet.
Payload Request
| Field Name | Data Type | Mandatory | Description |
|---|---|---|---|
| originalPartnerReferenceNo | String | Y | Transaction number corresponds to the partnerReferenceNo field at the time of payment creation Length: 5-50Allowed Characters: letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-) |
| additionalInfo | Object | Y | Object additionalInfo |
| additionalInfo.contractId | String | Y | Generated transaction identifier in Winpay system |
| additionalInfo.channel | String | Y | Channel eWallet |
{
"originalPartnerReferenceNo": "000000000053",
"additionalInfo": {
"contractId": "so748b157a-c7b2-4b2b-81cd-00fdd94c82bd",
"channel": "SPAY"
}
}
Response Payload
| Parameters | Data Type | Description |
|---|---|---|
| responseCode | String | Code response |
| responseMessage | String | Message response |
| originalPartnerReferenceNo | String | Transaction number |
| serviceCode | String | Service code |
| latestTransactionStatus | String | Transaction status, Transaction success or failed based on this status Length: 2 Values: 00 => Payment Received07 => Unpaid |
| additionalInfo | Object | Object response |
| contractId | String | Generated transaction identifier in Winpay system |
{
"responseCode": "2005500",
"responseMessage": "Successful",
"originalPartnerReferenceNo": "000000000053",
"serviceCode": "54",
"latestTransactionStatus": "07",
"additionalInfo": {
"contractId": "so748b157a-c7b2-4b2b-81cd-00fdd94c82bd"
}
}
List Response Codes
| Response Code | Response Message | Description |
|---|---|---|
| 2005500 | Success | |
| 4005500 | Bad Request | General request failed error, including message parsing failed. |
| 4005501 | Invalid field format { field name } | |
| 4005502 | Invalid mandatory field {field name} | |
| 4015500 | Invalid signature | X-Signature wrong |
| 4045501 | Transaction not found | partnerReferenceNo and contractId not found |
| 4045516 | Partner not found | X-Partner-ID not registered |
| 4095500 | Cannot use same X-EXTERNAL-ID in same day | X-External-ID has already been used on the same day |
| 5005500 | General Error | General Error. |
| 5005501 | Internal Server Error | Unknown Internal Server Failure, Please retry the process again. |
| 5005502 | reqbill not found | contractIdnot found |
3. Payment Cancel
This service is used to cancel eWallet payment transactions. Only unpaid transactions can be cancelled.
Payload Request
| Field Name | Data Type | Mandatory | Description |
|---|---|---|---|
| originalPartnerReferenceNo | String | Y | Transaction number corresponds to the partnerReferenceNo field at the time of payment creation Length: 5-50Allowed Characters: letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-) |
| reason | String | Y | Cancellation reason |
| additionalInfo | Object | Y | Additional information about the object |
| contractId | String | Y | Generated transaction identifier in Winpay system |
| channel | String | Y | Channel eWallet |
{
"originalPartnerReferenceNo": "0000000000568",
"reason": "Network timeout",
"additionalInfo": {
"contractId": "soe1f74b38-e689-4747-b4bd-5dd876928349",
"channel": "SPAY"
}
}
Response Payload
| Parameters | Data Type | Description |
|---|---|---|
| responseCode | String | Response Code |
| responseMessage | String | Message response |
| additionalInfo | Object | Object response |
| contractId | String | Generated transaction identifier in Winpay system |
{
"responseCode": "2005700",
"responseMessage": "Successful",
"additionalInfo": {
"contractId": "soe1f74b38-e689-4747-b4bd-5dd876928349"
}
}
List Response Codes
| Response Code | Response Message | Description |
|---|---|---|
| 2005700 | Success | |
| 4005700 | Bad Request | General request failed error, including message parsing failed. |
| 4005701 | Invalid field format { field name } | |
| 4005702 | Invalid mandatory field {field name} | |
| 4015700 | Invalid signature | X-Signature wrong |
| 4045701 | Transaction not found | partnerReferenceNo and contractId not found |
| 4045716 | Partner not found | X-Partner-ID not registered |
| 4095700 | Cannot use same X-EXTERNAL-ID in same day | X-External-ID has already been used on the same day |
| 5005700 | General Error | General Error. |
| 5005701 | Internal Server Error | Unknown Internal Server Failure, Please retry the process again. |
| 5005702 | reqbill not found | contractId not found |
Handle Payment Callback
After the customer makes a payment, Winpay will send a callback to the merchant to notify the payment status. The merchant must implement a service to receive callbacks from Winpay.
We will send a callback to the merchant 3x until the merchant responds with the expected response. However, if the first callback attempt is successful, we will not send another callback.
Callback Info
eWallet payment callback service sent by the Winpay system to the Merchant server.
Header structure
| Header | Value | Description |
|---|---|---|
| Content-Type | application/json | |
| X-Timestamp | 2023-08-24T17:07:05+07:00 | ISO8601 String |
| X-Partner-ID | {partnerId} | |
| X-Signature | {signature} | |
| X-External-ID | {externalId} | |
| Channel-ID | {channelId} |
Callback Payload
| Parameters | Data Type | Description |
|---|---|---|
| originalPartnerReferenceNo | String | Transaction number corresponds to the field partnerReferenceNo at the time of creation payment |
| originalReferenceNo | String | Payment reference number Winpay, unique pertransaksi |
| merchantId | String | Merchant ID |
| amount | Object | Object amount |
| amount.value | String | Transaction value Length: 1-12Allowed Chars: 0-9 |
| amount.currency | String | Currency code Length: 3Allowed Value: IDR |
| latestTransactionStatus | String | Transaction status, transaction success atau failed based on this status 00 - Success 01 - Initiated 02 - Paying 03 - Pending04 - Refunded05 - Canceled06 - Failed07 - Not found |
| additionalInfo | Object | Object additionalInfo |
| additionalInfo.channel | String | Channel eWallet |
| additionalInfo.contractId | String | Generated transaction identifier in Winpay system |
| additionalInfo.feeAmount | String | Administrative feewinpay |
| additionalInfo.nettAmount | String | Total value received merchant |
{
"originalPartnerReferenceNo": "000000000689",
"originalReferenceNo": "53586",
"merchantId": "170041",
"amount": {
"value": "10000.00",
"currency": "IDR"
},
"latestTransactionStatus": "00",
"additionalInfo": {
"channel": "OVO",
"contractId": "ov384a48e3-f6be-4755-ae85-20a3682b7cb0",
"feeAmount": "148.50",
"nettAmount": "9851.50"
}
}
Expected Response
The expected response from the merchant is as follows:
{
"responseCode": "2005600",
"responseMessage": "Successful"
}