Notifications
Important Notes
- Notification URLs can be configured during merchant onboarding or via the
notifyUrlparameter in transaction requests. - The
notifyUrlparameter takes precedence. If neither is provided, notifications will not be sent. - Payment results must be determined by webhook notifications. Do not rely solely on the
statusfield in synchronous responses!
Security Hardening Recommendations
The following measures significantly improve the security of your webhook endpoint. We recommend implementing at least one of them.
IP Allowlist
Requests from Onerway to your servers originate from the following IP addresses. We recommend configuring your firewall or application layer to only allow these IPs on your webhook endpoint, rejecting all others to prevent spoofed notification attacks.
| Environment | IP Address |
|---|---|
| Production | 20.68.8.122 |
| Production | 18.207.78.37 |
| Production | 52.70.96.9 |
| Production | 54.160.200.158 |
| Production | 44.219.164.167 |
| Sandbox | 27.109.125.90 |
Active Order Query for Confirmation
Webhook delivery may be subject to network jitter, delays, or delivery failures. After receiving a notification, we recommend calling the Order Query API to actively verify the transaction status, treating the query result as the authoritative source of truth.
This is especially important in the following scenarios
- During the notification retry window (T+30min / T+60min)
- When your webhook endpoint is temporarily unavailable during system maintenance
- When deduplicating repeated notifications
Transaction vs Payment Intent Semantics (applies to merchants using the payment intent model)
transactionId: ID of a single attempt (transaction dimension). Business type isLong, transmitted asStringin JSON.status: Transaction status of the currenttransactionId(transaction dimension).paymentId: Payment intent primary key. OnepaymentIdcan map to multipletransactionIdattempts.paymentStatus: Status of the whole payment intent (payment dimension), independent from current transactionstatus.
Compatibility Note: Merchants not using the payment-intent model can ignore paymentId/paymentStatus and continue handling status only. Merchants using the payment-intent model should handle both status and paymentStatus.
Close-Order Webhook Rule (paymentStatus = N, applies to merchants using the payment intent model)
paymentStatus = N means the payment intent is closed by timeout in one of these scenarios:
- User created an order but did not pay before timeout.
- User made multiple failed attempts and the intent was finally closed by timeout.
For these close-order scenarios, only the webhook of the last transactionId is sent, while payload still includes both status and paymentStatus.
Webhook Retry Mechanism: Up to 3 Deliveries, 30-Minute Intervals
Onerway employs a retry mechanism to ensure reliable notification delivery:
- Initial Notification: Webhook is sent immediately upon transaction completion
- Response Validation:
- ✅ Merchant returns correct response (only
transactionIdvalue, see Response): Notification flow completes, no retries - ❌ Merchant fails to respond correctly (timeout, error response, network failure): Retry mechanism triggered
- Retry Strategy:
- Retry attempts: 2 times
- Retry interval: 30 minutes between each attempt
- Total deliveries: Up to 3 times (1 initial + 2 retries)
Important
- Ensure your webhook endpoint is idempotent (produces the same result when called multiple times) to handle duplicate notifications correctly
- Use
transactionIdas unique identifier for deduplication
Best Practice
Notification Timeline Example:
| Time | Action | Note |
|---|---|---|
| T+0min | Initial notification | Sent immediately after transaction completion |
| T+30min | First retry | If merchant didn't respond correctly |
| T+60min | Second retry | If merchant still didn't respond correctly |
Signature Verification Rules
Unified Signing/Verification Rules
- Request signing and webhook verification use the same algorithm:
ASCII sort -> concatenate values -> append secretKey -> SHA-256. - Use a simple default for request signing: exclude only
sign, and include all other non-empty fields (that is,REQUEST_EXCLUDED_KEYS = ['sign']). - Webhook verification must dynamically exclude fields marked
Noin the Signature column. Do not hardcode aYeswhitelist. - Treat
originTransactionIdas included by default; exclude it only in webhook verification.
Current Webhook Excluded Fields
'originTransactionId', 'originMerchantTxnId', 'customsDeclarationAmount', 'customsDeclarationCurrency', 'paymentMethod', 'walletTypeName', 'periodValue', 'tokenExpireTime', 'sign'
Notification Parameters
| Name | Type | Length | Signature | Description |
|---|---|---|---|---|
notifyType | String | / | Yes | Notification type. See NotifyTypeEnum |
txnType | String | / | Yes | Transaction type. See TxnTypeEnumReturned when |
transactionId | String | 20 | Yes | Onerway transaction ID. |
paymentId | String | / | Yes | Payment intent ID. |
originTransactionId | String | 20 | No | Original transaction ID. Returned in reversal and dispute notifications |
merchantTxnId | String | 64 | Yes | Merchant transaction ID. |
originMerchantTxnId | String | 64 | No | Original merchant transaction ID. Returned in reversal notifications |
merchantNo | String | 20 | Yes | Merchant number. |
responseTime | String | / | Yes | Notification timestamp. Format: |
txnTime | String | / | Yes | Transaction timestamp. Format: |
txnTimeZone | String | / | Yes | Transaction timezone. Example: |
orderAmount | String | 19 | Yes | Order amount. |
orderCurrency | String | 8 | Yes | |
txnAmount | String | 19 | Yes | Settlement amount. |
txnCurrency | String | 8 | Yes | |
settleRate | String | 19 | Yes | Exchange rate. Formula: |
customsDeclarationAmount | String | 19 | No | Customs declarable amount. |
customsDeclarationCurrency | String | 8 | No | |
paymentMethod | String | 64 | No | Payment method. |
walletTypeName | String | 128 | No | Digital wallet type. |
status | String | 1 | Yes | Transaction status. Values:
|
paymentStatus | String | 1 | Yes | Payment intent status. See PaymentStatusEnum |
reason | String | 512 | Yes | Status reason. |
periodValue | String | / | No | Installment period. |
contractId | String | 20 | Yes | Subscription contract ID. |
tokenId | String | 300 | Yes | Payment token. |
cardTokenId | String | 300 | Yes | Card token. |
tokenExpireTime | String | / | No | Token expiration. |
eci | String | 2 | Yes | ECI (Electronic Commerce Indicator). |
chargebackDate | String | / | Yes | Chargeback date. Format: |
importTime | String | / | Yes | Import timestamp. Format: |
appealDueTime | String | / | Yes | Representment deadline. Format: |
chargebackAmount | String | 19 | Yes | Dispute amount. |
chargebackCurrency | String | 8 | Yes | |
chargebackStatus | String | 16 | Yes | Dispute status. See ChargebackStatusEnum |
chargebackArn | String | 128 | Yes | ARN (Acquirer Reference Number). |
chargebackCode | String | 32 | Yes | Reason code. |
chargebackReason | String | 1024 | Yes | Reason description. |
cardBinCountry | String | 64 | Yes | |
expireDate | String | / | Yes | Contract expiration. Format: Has value when |
subscriptionStatus | String | 2048 | Yes | Subscription status. See SubscriptionStatusEnum |
dataStatus | String | 2048 | Yes | Contract status. See DataStatusEnum |
products | String | 1024 | Yes | Product details. |
subscriptionChangeTime | String | / | Yes | Effective date. |
metaData | String | 2048 | Yes | Subscription custom metadata. |
scenarios | String | 2048 | Yes | Subscription event. See ScenariosEnum |
paymentMethodDetails | String | / | Yes | Payment method details in JSON string format. See PaymentMethodDetailsCardfor structure. |
sign | String | / | No |
Webhook Verification Code Examples
<?php
$webhookExcludedKeys = [
'originTransactionId',
'originMerchantTxnId',
'customsDeclarationAmount',
'customsDeclarationCurrency',
'paymentMethod',
'walletTypeName',
'periodValue',
'tokenExpireTime',
'sign'
];
function buildCanonicalString(array $payload, array $excludedKeys): string
{
ksort($payload, SORT_STRING);
$canonicalString = '';
foreach ($payload as $key => $value) {
if (in_array($key, $excludedKeys, true)) {
continue;
}
if ($value === null || $value === '') {
continue;
}
$canonicalString .= (string) $value;
}
return $canonicalString;
}
function generateSignature(
array $payload,
string $secretKey,
array $excludedKeys
): string {
$canonicalString = buildCanonicalString($payload, $excludedKeys);
return hash('sha256', $canonicalString . $secretKey);
}
function verifySignature(
array $payload,
string $secretKey,
array $excludedKeys
): bool {
$signature = (string) ($payload['sign'] ?? '');
$computedSignature = generateSignature($payload, $secretKey, $excludedKeys);
return hash_equals($computedSignature, $signature);
}
$payload = json_decode(file_get_contents('php://input'), true);
$secretKey = 'your-secret-key';
if (!verifySignature($payload, $secretKey, $webhookExcludedKeys)) {
http_response_code(400);
exit('invalid signature');
}
echo (string) $payload['transactionId'];2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// Dependency: Spring Web (spring-boot-starter-web)
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ResponseStatusException;
@RestController
public class WebhookController {
private static final Set<String> WEBHOOK_EXCLUDED_KEYS = Set.of(
"originTransactionId",
"originMerchantTxnId",
"customsDeclarationAmount",
"customsDeclarationCurrency",
"paymentMethod",
"walletTypeName",
"periodValue",
"tokenExpireTime",
"sign"
);
@PostMapping("/webhook")
public String webhook(@RequestBody Map<String, Object> payload) {
String secretKey = "your-secret-key";
boolean valid = verifySignature(payload, secretKey, WEBHOOK_EXCLUDED_KEYS);
if (!valid) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Invalid signature");
}
return String.valueOf(payload.get("transactionId"));
}
public static String buildCanonicalString(
Map<String, Object> payload,
Set<String> excludedKeys
) {
TreeMap<String, Object> sortedPayload = new TreeMap<>(payload);
StringBuilder canonicalString = new StringBuilder();
for (Map.Entry<String, Object> entry : sortedPayload.entrySet()) {
if (excludedKeys.contains(entry.getKey())) {
continue;
}
Object value = entry.getValue();
if (value == null || "".equals(value)) {
continue;
}
canonicalString.append(value);
}
return canonicalString.toString();
}
public static String generateSignature(
Map<String, Object> payload,
String secretKey,
Set<String> excludedKeys
) {
String dataToSign = buildCanonicalString(payload, excludedKeys) + secretKey;
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(dataToSign.getBytes(StandardCharsets.UTF_8));
return byte2Hex(md.digest());
} catch (NoSuchAlgorithmException e) {
throw new IllegalStateException("SHA-256 not available", e);
}
}
public static boolean verifySignature(
Map<String, Object> payload,
String secretKey,
Set<String> excludedKeys
) {
String signature = String.valueOf(payload.getOrDefault("sign", ""));
String computedSignature = generateSignature(payload, secretKey, excludedKeys);
return computedSignature.equals(signature);
}
private static String byte2Hex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b & 0xFF));
}
return sb.toString();
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
Response
Important
Return only the transactionId value. Do not include any other parameters or JSON structure.
Notification Examples
Payment Success
{
"notifyType": "TXN",
"paymentId": "2031908578247712768",
"transactionId": "2028704543449423872",
"txnType": "SALE",
"merchantNo": "800209",
"merchantTxnId": "1b580d11-5d46-4a7a-995d-5c0d3df2f314",
"responseTime": "2026-03-03 13:30:30",
"txnTime": "2026-03-03 13:30:29",
"txnTimeZone": "+08:00",
"orderAmount": "10.00",
"orderCurrency": "USD",
"status": "S",
"paymentStatus": "S",
"cardBinCountry": "SG",
"reason": "{\"respCode\":\"20000\",\"respMsg\":\"Success\"}",
"sign": "b20de0b547d63c3b65c7aabb71eccff3e53184347e183ef675c157a3901ed6ea",
"paymentMethod": "VISA",
"paymentMethodDetails": "{\"card\":{\"checks\":{\"addressCheck\":null,\"postalCodeCheck\":null,\"avsResultRawCode\":null,\"threeDSecureResult\":{\"version\":\"UNKNOWN\",\"authenticationFlow\":\"FRICTIONLESS\",\"chargebackLiability\":\"MERCHANT\",\"transStatus\":null,\"transStatusReason\":null,\"veresEnrolled\":null,\"eci\":\"05\",\"cvvResult\":null,\"avsFullResult\":null,\"cavvResult\":\"MjAyNi0wMy0wM1QxMzozMDozMC4zNjA=\"}},\"holderName\":\"CL BRW2\",\"year\":\"2026\",\"month\":\"05\",\"cardType\":null,\"productCategory\":null,\"issuer\":null,\"authorizationCode\":null,\"cardNumber\":\"476134******1390\"}}" // Card details (JSON string format, participates in signature)
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"notifyType": "TXN",
"transactionId": "1925132987104890880",
"txnType": "SALE",
"merchantNo": "800259",
"merchantTxnId": "G_jN_p_xBdNWhrAE0Co6dQQ5whaYl1Oh07",
"responseTime": "2025-05-21 18:14:23",
"txnTime": "2025-05-21 18:14:06",
"txnTimeZone": "+08:00",
"orderAmount": "5.00",
"orderCurrency": "USD",
"status": "S",
"cardBinCountry": "NZ",
"reason": "{\"respCode\":\"20000\",\"respMsg\":\"Success\"}",
"sign": "7bd1c8fd54c86873f7c9c70e77d968d5725ac85ccc8b6938f2c2dc74a0c917bd",
"paymentMethod": "VISA",
"walletTypeName": "ApplePay",
"channelRequestId": "8002591925133054498705409"
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"notifyType": "TXN",
"transactionId": "2028706179144097792",
"txnType": "SALE",
"merchantNo": "800209",
"merchantTxnId": "0199407e-b2fa-4840-a396-213a8d631c88",
"responseTime": "2026-03-03 13:37:41",
"txnTime": "2026-03-03 13:36:59",
"txnTimeZone": "+08:00",
"orderAmount": "6.00",
"orderCurrency": "USD",
"status": "S",
"cardBinCountry": "US",
"reason": "{\"respCode\":\"20000\",\"respMsg\":\"Success\"}",
"sign": "d3cf989e6213422504f95d0ae45b59fdd25f98c7052d02dd22bae4186059f062",
"paymentMethod": "VISA",
"paymentMethodDetails": "{\"card\":{\"checks\":null,\"holderName\":\"Fern Von\",\"year\":\"2028\",\"month\":\"12\",\"cardType\":null,\"productCategory\":null,\"issuer\":\"JPMORGAN CHASE BANK, N.A.\",\"authorizationCode\":null,\"cardNumber\":\"411111******1111\"}}", // Card details (JSON string format, participates in signature)
"walletTypeName": "GooglePay",
"channelRequestId": "8002092028706353840795649"
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Payment Failure
{
"notifyType": "TXN",
"paymentId": "2028705396700000000",
"transactionId": "2028705396755406848",
"txnType": "SALE",
"merchantNo": "800209",
"merchantTxnId": "270377be-3f15-49a1-9949-32989ab56ebf",
"responseTime": "2026-03-03 13:33:54",
"txnTime": "2026-03-03 13:33:52",
"txnTimeZone": "+08:00",
"orderAmount": "10.00",
"orderCurrency": "USD",
"status": "F",
"paymentStatus": "O",
"cardBinCountry": "US",
"reason": "{\"respCode\":\"60005\",\"respMsg\":\"Do not honor\"}",
"sign": "d73aa59020b19b1990b0f1ef8cabf7968e216f16e6bae5c59dd17eb75b3602fb",
"paymentMethod": "VISA",
"paymentMethodDetails": "{\"card\":{\"checks\":{\"addressCheck\":null,\"postalCodeCheck\":null,\"avsResultRawCode\":null,\"threeDSecureResult\":{\"version\":\"UNKNOWN\",\"authenticationFlow\":\"FRICTIONLESS\",\"chargebackLiability\":\"MERCHANT\",\"transStatus\":null,\"transStatusReason\":null,\"veresEnrolled\":null,\"eci\":\"05\",\"cvvResult\":null,\"avsFullResult\":null,\"cavvResult\":\"MjAyNi0wMy0wM1QxMzozMzo1My44MjI=\"}},\"holderName\":\"CL BRW2\",\"year\":\"2026\",\"month\":\"05\",\"cardType\":null,\"productCategory\":null,\"issuer\":\"NETSPEND\",\"authorizationCode\":null,\"cardNumber\":\"400012******8204\"}}", // Card details (JSON string format, participates in signature)
"channelRequestId": "8002092028705400517439489"
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Payment Intent Closed by Timeout (paymentStatus = N)
{
"cardBinCountry": "US",
"channelRequestId": "8006742031908579392495621",
"merchantNo": "800674",
"merchantTxnId": "PlBys270SR453lwcsnXTgL3pCykl879",
"notifyType": "TXN",
"orderAmount": "10.00",
"orderCurrency": "USD",
"paymentId": "2031908578247712768",
"paymentMethod": "VISA",
"paymentMethodDetails": "{\"card\":{\"checks\":{\"addressCheck\":\"notProvided\",\"postalCodeCheck\":\"notProvided\",\"avsResultRawCode\":null,\"threeDSecureResult\":null},\"holderName\":\"Evelyn Victorian\",\"year\":\"2030\",\"month\":\"11\",\"cardType\":null,\"productCategory\":null,\"issuer\":\"JPMORGAN CHASE BANK N.A. - DEBIT\",\"cardBinCountry\":\"US\",\"authorizationCode\":\"295859\",\"cardNumber\":\"442756******1274\"}}",
"paymentStatus": "N",
"reason": "{\"respCode\":\"60005\",\"respMsg\":\"Do not honor\"}",
"responseTime": "2026-03-12 09:42:13",
"sign": "b86b7c1b6e661b61ac1b7fa04e1fe3546a633ca574515bd9e92308b6eea24854",
"status": "F",
"transactionId": "2031908578310627328",
"txnTime": "2026-03-12 09:42:10",
"txnTimeZone": "+08:00",
"txnType": "SALE"
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Token Payment
{
"notifyType": "TXN",
"transactionId": "1982651098431094784", // Card binding transaction ID
"txnType": "BIND_CARD", // Transaction type is BIND_CARD
"merchantNo": "800164",
"merchantTxnId": "800164-1982651068391620608",
"responseTime": "2025-10-27 11:30:33",
"txnTime": "2025-10-27 11:30:32",
"txnTimeZone": "+08:00",
"orderAmount": "0.00",
"orderCurrency": "USD",
"status": "S",
"tokenId": "d488be7426383edf4ce9c087ae47ebdfa2b58ecd462fdbf7eb841d5db04746f4", // Generated tokenId
"tokenExpireTime": "2099-12-31 23:59:59",
"cardBinCountry": "US",
"reason": "{\"respCode\":\"20000\",\"respMsg\":\"Success\"}",
"sign": "3e9ac7102fd9db939549bdadf50e8d85e85132db5cf67d36c44b520f77b32d35",
"paymentMethod": "VISA",
"channelRequestId": "002411"
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"notifyType": "TXN",
"transactionId": "1921386970375127042",
"txnType": "SALE",
"merchantNo": "800209",
"merchantTxnId": "5ddbee02-908f-44f9-a7a8-ac1c391f00b5",
"responseTime": "2025-05-11 10:09:02",
"txnTime": "2025-05-11 10:08:46",
"txnTimeZone": "+08:00",
"orderAmount": "500.00",
"orderCurrency": "USD",
"status": "S", // Final status after 3DS verification
"tokenId": "f7d54297b989d2acf4eb6791213cf2bd9d2c842ea05b0a91c8dd85f4f9e4915b",
"eci": "05", // ECI value indicates 3DS authentication result
"cardBinCountry": "US",
"reason": "{\"respCode\":\"20000\",\"respMsg\":\"Success\"}",
"sign": "5f654896436263215a0dea3798e67d5c714f3e54f57f9bf55fd08568db1d1b63",
"paymentMethod": "VISA",
"channelRequestId": "8002091921386975378677761"
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Subscription - Initial Charge
{
"notifyType": "TXN",
"transactionId": "1919772912060342272",
"txnType": "SALE",
"merchantNo": "800209",
"merchantTxnId": "ec91ee2b-7ba9-444f-8875-955fe94fadf3",
"responseTime": "2025-05-06 23:15:33",
"txnTime": "2025-05-06 23:15:20",
"txnTimeZone": "+08:00",
"orderAmount": "2.00",
"orderCurrency": "USD",
"status": "S",
"contractId": "1919772912228114432",
"tokenId": "195f7e75785863a66d3801ae02c12e24ea16abe164303cf3e3fd10e04d5e4188",
"cardBinCountry": "US",
"reason": "{\"respCode\":\"20000\",\"respMsg\":\"Success\"}",
"sign": "6e8bd132b805c6ad530857331bef43c25e4c4a544dc2e0494cfd1ad94a7f55dc",
"paymentMethod": "VISA",
"subscriptionManageUrl": "https://sandbox-myscribe.onerway.com/pages/subscription-list/details?contractId=eyJjb250cmFjdElkIjoxOTE5NzcyOTEyMjI4MTE0NDMyLCJtZXJjaGFudE5vIjo4MDAyMDksIm1lcmNoYW50Q3VzdElkIjoiQ3VzdElkLUtYUlAtMzcxMSIsIm5vdGlmaWNhdGlvbkVtYWlsIjpudWxsLCJhcHBJZCI6IjE3Mjc4ODA4NDYzNzg0MDE3OTIifQ==",
"subscriptionStatus": "active",
"dataStatus": "1",
"products": "[{\"currency\":\"USD\",\"name\":\"currant\",\"num\":\"78\",\"price\":\"620.39\",\"type\":\"ullamco et do commodo ut\"},{\"currency\":\"USD\",\"name\":\"strawberry\",\"num\":\"63\",\"price\":\"289.61\",\"type\":\"labore cupidatat Duis elit\"},{\"currency\":\"USD\",\"name\":\"grapefruit\",\"num\":\"24\",\"price\":\"989.09\",\"type\":\"ullamco non\"}]",
"metaData": "eventually",
"channelRequestId": "8002091919772982323052544",
"scenarios": "SUBSCRIPTION_INITIAL"
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"notifyType": "TXN",
"transactionId": "1914230281599320064",
"txnType": "SALE",
"merchantNo": "800209",
"merchantTxnId": "8a4e276e-86c2-4753-b91a-0cc8881e4d0d",
"responseTime": "2025-04-21 16:10:58",
"txnTime": "2025-04-21 16:10:38",
"txnTimeZone": "+08:00",
"orderAmount": "33.00",
"orderCurrency": "USD",
"status": "S",
"contractId": "1914230281792258048",
"tokenId": "7a83c22d55ca1e383fefbf1537c90b065a7324aee29a36d4b39c66da377a9b57",
"cardBinCountry": "US",
"reason": "{\"respCode\":\"20000\",\"respMsg\":\"Success\"}",
"sign": "432894a2c697e01e4fe86eaa4f2564fb13ea97d0b4662a45fc83d1aa076985d1",
"paymentMethod": "VISA",
"subscriptionStatus": "active",
"dataStatus": "1",
"products": "[{\"currency\":\"USD\",\"name\":\"mandarin\",\"num\":\"47\",\"price\":\"234.19\",\"type\":\"eu dolore in\"}]",
"metaData": "pfft",
"channelRequestId": "8002091914230287013908481",
"scenarios": "SUBSCRIPTION_INITIAL"
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Subscription - Renewal Charge
{
"notifyType": "TXN",
"transactionId": "1925220046993756162",
"txnType": "SALE",
"merchantNo": "800272",
"merchantTxnId": "1925220044372316160",
"responseTime": "2025-05-22 00:00:08",
"txnTime": "2025-05-22 00:00:02",
"txnTimeZone": "+08:00",
"orderAmount": "0.95",
"orderCurrency": "USD",
"status": "S",
"contractId": "1920300901562982400",
"tokenId": "a22e5904e7e6a7864947c216cd1169d2f1f12ff6663472cf1f4918b659106420",
"cardBinCountry": "US",
"reason": "{\"respCode\":\"20000\",\"respMsg\":\"Success\"}",
"sign": "3d121d47adb826eb47f8aa8fd34d4ef8877990d5c529affb81e59b5340ba690c",
"paymentMethod": "VISA",
"subscriptionManageUrl": "https://sandbox-myscribe.onerway.com/pages/subscription-list/details?contractId=eyJjb250cmFjdElkIjoxOTIwMzAwOTAxNTYyOTgyNDAwLCJtZXJjaGFudE5vIjo4MDAyNzIsIm1lcmNoYW50Q3VzdElkIjoiNjc3NjVjYmIzYjJmNzRkZjQyODIwM2RlIiwibm90aWZpY2F0aW9uRW1haWwiOm51bGwsImFwcElkIjoiMTc5NjAwNzY3NDM4NDg3OTYxNiJ9",
"subscriptionStatus": "active",
"dataStatus": "1",
"products": "[{\"name\":\"Unlimited\",\"price\":\"0.95\",\"num\":\"1\",\"currency\":\"USD\"}]",
"channelRequestId": "8002721925220051493982208",
"scenarios": "SUBSCRIPTION_RENEWAL"
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"notifyType": "TXN",
"transactionId": "1920133309141491712",
"txnType": "SALE",
"merchantNo": "800209",
"merchantTxnId": "d9de61b7-3480-48ed-90e6-4b0b9e2e4640",
"responseTime": "2025-05-07 23:07:18",
"txnTime": "2025-05-07 23:07:09",
"txnTimeZone": "+08:00",
"orderAmount": "20.00",
"orderCurrency": "USD",
"status": "S",
"contractId": "1919772912228114432",
"tokenId": "195f7e75785863a66d3801ae02c12e24ea16abe164303cf3e3fd10e04d5e4188",
"cardBinCountry": "US",
"reason": "{\"respCode\":\"20000\",\"respMsg\":\"Success\"}",
"sign": "cd220e77f9566e6cf20869c712c01dff34af9d0b52ffe2194510d88288827265",
"paymentMethod": "VISA",
"subscriptionManageUrl": "https://sandbox-myscribe.onerway.com/pages/subscription-list/details?contractId=eyJjb250cmFjdElkIjoxOTE5NzcyOTEyMjI4MTE0NDMyLCJtZXJjaGFudE5vIjo4MDAyMDksIm1lcmNoYW50Q3VzdElkIjoiQ3VzdElkLUtYUlAtMzcxMSIsIm5vdGlmaWNhdGlvbkVtYWlsIjpudWxsLCJhcHBJZCI6IjE3Mjc4ODA4NDYzNzg0MDE3OTIifQ==",
"subscriptionStatus": "active",
"dataStatus": "1",
"products": "[{\"name\":\"passionfruit\",\"desc\":null,\"price\":\"696.29\",\"num\":\"90\",\"currency\":\"USD\"},{\"name\":\"kiwiberry\",\"desc\":null,\"price\":\"948.79\",\"num\":\"36\",\"currency\":\"USD\"}]",
"metaData": "eventually",
"channelRequestId": "8002091920133320860106752",
"scenarios": "SUBSCRIPTION_CHANGED"
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"notifyType": "TXN",
"transactionId": "1920061365985615872",
"txnType": "SALE",
"merchantNo": "800209",
"merchantTxnId": "6a28ac11-d98c-4323-84a7-426b9322c4f7",
"responseTime": "2025-05-07 18:21:21",
"txnTime": "2025-05-07 18:21:17",
"txnTimeZone": "+08:00",
"orderAmount": "2.00",
"orderCurrency": "USD",
"status": "S",
"contractId": "1919781071080529920",
"tokenId": "b05d9de9836fe3e0dce5ba42078885cb90c729fe0604219a9cf24c092e71eb60",
"cardBinCountry": "US",
"reason": "{\"respCode\":\"20000\",\"respMsg\":\"Success\"}",
"sign": "345f09b2240dcd2084605c28024b4d6fe7da4f84e59a7268b92bb66a36c433b3",
"paymentMethod": "VISA",
"subscriptionStatus": "active",
"dataStatus": "1",
"products": "[{\"currency\":\"USD\",\"name\":\"feijoa\",\"num\":\"88\",\"price\":\"968.79\",\"type\":\"consectetur adipisicing reprehenderit sint\"},{\"currency\":\"USD\",\"name\":\"avocado\",\"num\":\"52\",\"price\":\"414.89\",\"type\":\"consectetur labore\"}]",
"metaData": "vary",
"channelRequestId": "8002091920061371823816709",
"scenarios": "SUBSCRIPTION_RENEWAL"
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Authorization
{
"notifyType": "TXN",
"transactionId": "1914565388776378368", // Required as originTransactionId for capture
"txnType": "AUTH",
"merchantNo": "800209",
"merchantTxnId": "4f581f27-fe1a-4a80-8e10-2b3751ffb785",
"responseTime": "2025-04-22 14:22:51",
"txnTime": "2025-04-22 14:22:42",
"txnTimeZone": "+08:00",
"orderAmount": "83.00",
"orderCurrency": "USD",
"status": "S",
"eci": "05",
"cardBinCountry": "US",
"reason": "{\"respCode\":\"20000\",\"respMsg\":\"Success\"}",
"sign": "ec866293c15c4def1bad161c13f77153d560660065807612547d1c05a5de47bc",
"paymentMethod": "VISA",
"channelRequestId": "8002091914565512046706689"
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"notifyType": "TXN",
"transactionId": "1921486705937219584",
"txnType": "CAPTURE",
"merchantNo": "800209",
"merchantTxnId": "6b38115b-f2a2-446e-aaa7-7fbaa106adf4",
"responseTime": "2025-05-11 16:50:01",
"txnTime": "2025-05-11 16:45:05",
"txnTimeZone": "+08:00",
"orderAmount": "54.00",
"orderCurrency": "USD",
"status": "S", // Success status for completed capture
"cardBinCountry": "US",
"reason": "{\"respCode\":\"20000\",\"respMsg\":\"Success\"}",
"sign": "74204385718b9327a8a3f3af03d16fd5130b2b9673277730aad4f627e2d32f19",
"paymentMethod": "VISA",
"channelRequestId": "8002091921486708126392321"
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"notifyType": "TXN",
"transactionId": "1921498535157956608",
"txnType": "VOID",
"merchantNo": "800209",
"merchantTxnId": "507df80b-243a-459b-bd76-bee35e7f0328",
"responseTime": "2025-05-11 17:35:02",
"txnTime": "2025-05-11 17:32:05",
"txnTimeZone": "+08:00",
"orderAmount": "10.00",
"orderCurrency": "USD",
"status": "S", // Success status for completed reversal
"cardBinCountry": "US",
"reason": "{\"respCode\":\"20000\",\"respMsg\":\"Success\"}",
"sign": "2fe73005baa11e3823a4b641393e2c7b79ee7d80b850c5185cdb3b11c6ee3170",
"paymentMethod": "VISA",
"channelRequestId": "8002091921498536260804609"
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Refund
{
"notifyType": "TXN",
"transactionId": "1982640556668747776",
"txnType": "REFUND",
"merchantNo": "800256",
"merchantTxnId": "1275019066607111",
"originMerchantTxnId": "1275019066607111",
"responseTime": "2025-10-27 10:55:03",
"txnTime": "2025-10-27 10:48:40",
"txnTimeZone": "+08:00",
"orderAmount": "100.00",
"orderCurrency": "USD",
"status": "S",
"cardBinCountry": "PL",
"reason": "{\"respCode\":\"20000\",\"respMsg\":\"Success\"}",
"sign": "6f62d353d2abd843d34864a3ee78c03cec2eb8ba1713c62c5db5d748b6a44840",
"paymentMethod": "VISA",
"channelRequestId": "8002561982640570996350977"
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Refund Audit Result
{
"notifyType": "REFUND_AUDIT",
"transactionId": "1925739837181530114",
"merchantNo": "800209",
"merchantTxnId": "R-b20e9b40-4479-4ab7-aa40-69463f7dea45",
"originMerchantTxnId": "TX_zvKa3GX7_59496",
"responseTime": "2025-05-23 10:26:06",
"txnTimeZone": "+08:00",
"orderAmount": "45.00",
"orderCurrency": "USD",
"status": "F", // F for Failed/Rejected
"sign": "d01abdaf733086272252ea1548644bef007e50aaa18329d737a8d103e5f4efa7"
}2
3
4
5
6
7
8
9
10
11
12
13
Chargeback
{
"notifyType": "CHARGEBACK",
"merchantNo": "800209",
"transactionId": "1925859837858942976",
"originTransactionId": "1925119888343830528",
"originMerchantTxnId": "TX_h2oS4AqU_51232",
"importTime": "2025-05-23 18:22:20",
"chargebackDate": "2025-05-23",
"chargebackAmount": 1.0,
"chargebackCurrency": "USD",
"chargebackStatus": "NEW",
"chargebackArn": "0523",
"chargebackCode": "123",
"chargebackReason": "NOF",
"appealReason": null,
"appealDueTime": "2025-05-31 18:22:20",
"sign": "6f2e6e180fa3f8f90985ac67e2f130fe59e6f8f4e5ad7d8ab56887fd6ef8704c"
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18