Local Payment Methods
Local Payment Methods (LPMs) provide alternative payment options beyond credit cards, enabling merchants to accept region-specific payment methods popular in various countries. These methods may include e-wallets, bank transfers, QR code payments, and other local payment options.
Local Payment Advantages
- Broader Market Access: Accept payments from customers who prefer or only use local payment methods
- Higher Conversion Rates: Offer payment options that customers are familiar with and trust
- Lower Processing Fees: Many local payment methods have lower processing costs than credit cards
- Reduced Fraud Risk: Most local payment methods have built-in security verification
API Request Parameters
Key Parameters for Local Payments
When integrating local payment methods, you need to set these key parameters:
productType: Must be set to
LPMS
for all local payment transactions.lpmsInfo: JSON format string containing local payment method details, including
lpmsType
and method-specific fields.subscription: For supported local payment methods that offer subscription capabilities (such as
DANA
,WeChat
).subProductType: Must be set to
SUBSCRIBE
for local payment methods that offer subscription capabilities.
Note
- All
JSON
fields must be stringified before submission - Nested objects must be serialized to
JSON
string format JSON
fields must not contain unescaped special characters- Arrays in
JSON
should be properly formatted - Example of
JSON
string field:
{
"object": "{\"obj-key1\":\"v1\",\"obj-key2\":\"v2\"}",
"complex": "{\"k1\":\"v1\",\"array\":\"[{\\\"obj-key3\\\":\\\"v3\\\",\\\"obj-key4\\\":\\\"v4\\\"}]\"}"
}
2
3
4
Parameter | Type | Length | Required | Signed | Description |
---|---|---|---|---|---|
billingInformation | String | / | Yes | Yes | Billing information in JSON string format. See TransactionAddress |
lpmsInfo | String | / | Conditional | Yes | Local payment method information in JSON string format. See LpmsInfo |
merchantNo | String | 20 | Yes | Yes | Merchant number assigned by |
merchantTxnId | String | 64 | Yes | Yes | Unique transaction identifier for each customer payment. Must be unique for each transaction request. |
merchantTxnOriginalId | String | 128 | No | Yes | Master transaction ID generated by merchant. IDs can be duplicate but only one transaction with the same ID can succeed |
merchantTxnTime | String | / | No | Yes | Transaction timestamp (Format: |
merchantTxnTimeZone | String | 64 | No | Yes | Transaction timezone |
mpiInfo | String | / | Conditional | Yes | 3DS verification result information in JSON string format. See MpiInfo |
orderAmount | String | 19 | Yes | Yes | Order amount in units of currency with max 2 decimal places |
orderCurrency | String | 8 | Yes | Yes | Order currency code. See ISO 4217 |
osType | String | 16 | Conditional | Yes | Operating system type. See OsTypeEnum |
paymentMode | String | 16 | No | Yes | Payment mode. Default is |
productType | String | 16 | Yes | Yes | See ProductTypeEnum |
risk3dsStrategy | String | 16 | Conditional | Yes | 3DS risk control strategy. See Risk3dsStrategyEnum |
shippingInformation | String | / | Yes | Yes | Shipping information in JSON string format. See TransactionAddress |
sign | String | / | Yes | No | Digital signature string for request verification. Please refer to Signature for signature generation method. |
subProductType | String | 16 | Yes | Yes | See SubProductTypeEnum |
subscription | String | / | Conditional | Yes | Subscription configuration in JSON format including frequency, billing cycle, and subscription type (managed / self-managed). |
txnOrderMsg | String | / | Yes | Yes | Transaction business information in JSON string format. See TxnOrderMsg |
txnType | String | 16 | Yes | Yes | Transaction type. See TxnTypeEnum |
TransactionAddress
Name | Type | Length | Required | Signature | Description |
---|---|---|---|---|---|
firstName | String | 64 | No | No | First name |
lastName | String | 64 | No | No | Last name |
jpFirstName | String | 64 | No | No | (Japanese Katakana) First name |
jpLastName | String | 64 | No | No | (Japanese Katakana) Last name |
phone | String | 32 | No | No | Phone number |
String | 256 | Yes | No | Email address | |
postalCode | String | 32 | No | No | Postal code |
address | String | 256 | No | No | Address |
country | String | 64 | Yes | No | |
province | String | 64 | Conditional | No | |
city | String | 64 | No | No | City |
street | String | 64 | No | No | Street |
number | String | 64 | No | No | House/Building number |
identityNumber | String | 64 | No | No | ID number |
birthDate | String | 64 | No | No | Birth date, format is |
LpmsInfo
Name | Type | Length | Required | Signature | Description |
---|---|---|---|---|---|
lpmsType | String | 64 | Yes | No | Local payment method type.
for all supported payment methods. Each LPMS type has different integration requirements and processing timeframes. |
bankName | String | 128 | Conditional | No | Bank name.
for supported banks and their exact identifiers. for valid Polish bank options. |
walletAccountId | String | / | Conditional | No | Wallet/local account identifier.
|
walletAccountName | String | / | Conditional | No | Wallet/local account name.
|
iBan | String | 64 | Conditional | No | International Bank Account Number (IBAN).
|
prepaidNumber | String | / | Conditional | No | Prepaid card or voucher number.
|
Subscription
Subscription Support for Local Payment Methods
The following local payment methods currently support subscription payments:
DANA
WeChat
GCash
TOUCH_GO_EWALLET
These payment methods follow a two-step process:
- Initial zero-amount subscription registration (contract establishment)
- Subsequent billing using the established contract and token
Name | Type | Length | Required | Description |
---|---|---|---|---|
requestType | String | 1 | Yes | Subscription request type: |
merchantCustId | String | 40 | Yes | Unique identifier for the user in the merchant's system, used to associate the user with subscription information. This ID will be used for subscription creation, query, and management. Please ensure its uniqueness in your system. |
productName | String | 256 | Conditional | Subscription product name, used to distinguish different subscription services or plans. If not provided, each user can only create one subscription; if provided, the same user can subscribe to multiple different products. |
frequencyType | String | 1 | Yes | Subscription cycle unit: Non-managed subscription mode only supports |
frequencyPoint | String | 2 | Yes | Suggested subscription cycle value, indicating how many days between billings. |
expireDate | String | 10 | Yes | Subscription termination date, format is |
mode | String | 1 | Yes | Signing mode:
|
selfExecute | String | 1 | Yes | Subscription billing mode: |
// Self-managed subscription - Sign-only mode, no immediate billing
// For local payment methods like WeChat, DANA, GCash, or TOUCH_GO_EWALLET
"subscription": "{\"requestType\":\"0\",\"merchantCustId\":\"custId_xxx\",\"productName\":\"Self-managed-Sign only\",\"frequencyType\":\"D\",\"frequencyPoint\":\"1\",\"expireDate\":\"2025-01-01\",\"selfExecute\":\"2\",\"mode\":\"1\"}"
2
3
4
// Self-managed subscription - Immediate billing mode, bills immediately
// Typically used for credit card payments or some local payment methods
"subscription": "{\"requestType\":\"0\",\"merchantCustId\":\"custId_xxx\",\"productName\":\"Self-managed-Immediate billing\",\"frequencyType\":\"D\",\"frequencyPoint\":\"1\",\"expireDate\":\"2025-01-01\",\"selfExecute\":\"2\",\"mode\":\"2\"}"
2
3
4
// Self-managed subscription - Renewal billing, using existing subscription contract to initiate a new billing cycle
// Use the contractId and tokenId received from the initial subscription webhook
"subscription": "{\"requestType\":\"1\",\"contractId\":\"contractId_xxx\",\"tokenId\":\"tokenId_xxx\",\"merchantCustId\":\"custId_xxx\"}"
2
3
4
// Example for DANA, WeChat, GCash, or TOUCH_GO_EWALLET subscription
// Zero-amount initial transaction to establish the contract
"lpmsInfo": "{\"lpmsType\":\"DANA\",\"iBan\":\"DE89370400440532013000\"}",
"productType": "LPMS",
"subProductType": "SUBSCRIBE",
"subscription": "{\"requestType\":\"0\",\"merchantCustId\":\"custId_xxx\",\"frequencyType\":\"D\",\"frequencyPoint\":\"1\",\"expireDate\":\"2025-01-01\",\"selfExecute\":\"2\",\"mode\":\"1\"}"
2
3
4
5
6
7
Self-Managed Subscription Features
- Manual Billing: Merchants must initiate all subsequent charges manually, as Onerway will not automatically process future payments
- No Customer Management Interface: No
subscriptionManageUrl
is provided, so customers cannot manage subscriptions through the Onerway platform - No Email Notifications: The system does not automatically send subscription confirmation emails to customers
- Subscription Resource Management: Merchants must securely store
contractId
andtokenId
for future billing operations - Subsequent Billing Process: Merchants need to refer to the Subscription Billing documentation to initiate subsequent charges
TxnOrderMsg
Name | Type | Length | Required | Signature | Description |
---|---|---|---|---|---|
returnUrl | String | 256 | Yes | No | Synchronous return address. After the customer completes payment, the |
products | String | 1024 | Yes | No | |
transactionIp | String | 64 | Conditional | No | Cardholder transaction |
appId | String | 20 | Yes | No | Store |
javaEnabled | Boolean | / | Conditional | No | Whether the cardholder's browser has |
colorDepth | String | 64 | Conditional | No | Cardholder screen color depth, retrieved via: |
screenHeight | String | 64 | Conditional | No | Cardholder's screen resolution, retrieved via: |
screenWidth | String | 64 | Conditional | No | Cardholder's screen resolution, retrieved via: |
timeZoneOffset | String | 64 | Conditional | No | Cardholder browser's time zone, retrieved via: |
accept | String | 2048 | Conditional | No | Cardholder browser's |
userAgent | String | 2048 | Conditional | No | Cardholder's browser type, retrieved via: |
contentLength | String | 64 | Conditional | No | Content length of the cardholder's browser content beyond the headers |
language | String | 64 | Conditional | No | Cardholder's browser language, retrieved via: |
periodValue | String | / | Conditional | No | Installment payment period. |
notifyUrl | String | 256 | Yes | No |
Products
Name | Type | Length | Required | Description |
---|---|---|---|---|
name | String | 256 | Yes | Product name |
price | String | 1024 | Yes | Product unit price |
num | String | 20 | Yes | Product quantity |
desc | String | 1024 | No | Product description |
currency | String | 256 | Yes | Currency code following ISO 4217 standard |
type | String | 256 | No | Product classification. See StoreProductTypeEnum |
products
must be in JSON
string format
Examples:
If type is discount, the discount amount should be passed as a negative number\"[{\\\"name\\\":\\\"Pro1\\\",\\\"price\\\":\\\"50.00\\\",\\\"num\\\":\\\"2\\\",\\\"currency\\\":\\\"USD\\\"},{\\\"name\\\":\\\"Pro2\\\",\\\"price\\\":\\\"100\\\",\\\"num\\\":\\\"1\\\",\\\"currency\\\":\\\"USD\\\"}]\"
\"[{\\\"name\\\":\\\"Pro1\\\",\\\"price\\\":\\\"50.00\\\",\\\"num\\\":\\\"2\\\",\\\"currency\\\":\\\"USD\\\"},{\\\"name\\\":\\\"Pro2\\\",\\\"price\\\":\\\"100\\\",\\\"num\\\":\\\"1\\\",\\\"currency\\\":\\\"USD\\\"},{\\\"name\\\":\\\"discount\\\",\\\"price\\\":\\\"-10\\\",\\\"num\\\":\\\"1\\\",\\\"currency\\\":\\\"USD\\\",\\\"type\\\":\\\"discount\\\"}]\"
\"[{\\\"name\\\":\\\"Pro1\\\",\\\"price\\\":\\\"50.00\\\",\\\"num\\\":\\\"2\\\",\\\"currency\\\":\\\"USD\\\"},{\\\"name\\\":\\\"Pro2\\\",\\\"price\\\":\\\"100\\\",\\\"num\\\":\\\"1\\\",\\\"currency\\\":\\\"USD\\\"},{\\\"name\\\":\\\"shipping fee\\\",\\\"price\\\":\\\"10\\\",\\\"num\\\":\\\"1\\\",\\\"currency\\\":\\\"USD\\\",\\\"type\\\":\\\"shipping_fee\\\"}]\"
\"[{\\\"name\\\":\\\"Pro1\\\",\\\"price\\\":\\\"50.00\\\",\\\"num\\\":\\\"2\\\",\\\"currency\\\":\\\"USD\\\"},{\\\"name\\\":\\\"Pro2\\\",\\\"price\\\":\\\"100\\\",\\\"num\\\":\\\"1\\\",\\\"currency\\\":\\\"USD\\\"},{\\\"name\\\":\\\"shipping fee\\\",\\\"price\\\":\\\"10\\\",\\\"num\\\":\\\"1\\\",\\\"currency\\\":\\\"USD\\\",\\\"type\\\":\\\"shipping_fee\\\"},{\\\"name\\\":\\\"discount\\\",\\\"price\\\":\\\"-10\\\",\\\"num\\\":\\\"1\\\",\\\"currency\\\":\\\"USD\\\",\\\"type\\\":\\\"discount\\\"}]\"
Note that price * num (product amount) + price * num (discount amount) - price * num (shipping fee) = orderAmount (order transaction amount)
Response
Name | Type | Description |
---|---|---|
respCode | String | Response code from |
respMsg | String | Response message from |
data | Object |
data
Name | Type | Description |
---|---|---|
transactionId | String | Transaction order number created by |
responseTime | String | Interface response time
|
txnTime | String | Transaction completion time
|
txnTimeZone | String | Transaction time zone
|
orderAmount | String | Order amount |
orderCurrency | String | Transaction order currency
|
txnAmount | String | Order amount after conversion to settlement currency |
txnCurrency | String | Settlement currency
|
status | String | Transaction processing result
|
redirectUrl | String | Redirection URL for 3D Secure verification |
contractId | String | Subscription contract number |
tokenId | String | Payment token |
eci | String | Electronic Commerce Indicator |
periodValue | String | Installment payment number of periods |
codeForm | String | Code form for specific payment methods
|
presentContext | String | Context information for presentation layer |
actionType | String | Action type for the transaction
|
subscriptionManageUrl | String | Subscription management URL |
sign | String |
Local Payment Integration Process
The Local Payment integration process consists of three main phases as illustrated below:
1. Payment Initiation
In this phase:
- Customer selects a local payment method on the merchant's website/application
- Merchant system collects and transmits the payment data to Onerway
- The payment request includes the
lpmsInfo
parameter with the selected payment method specified vialpmsType
productType
is set toLPMS
andsubProductType
is typically set toDIRECT
- Merchant is responsible for presenting available payment options based on the customer's region/currency
2. Payment Processing
In this phase:
- Onerway processes the payment request and generates a payment order
- Onerway returns
status=R
with aredirectUrl
to the local payment platform - Merchant must redirect the customer to complete the payment
- After payment completion, the local payment platform redirects the customer back to the merchant's
returnUrl
- The
returnUrl
will include query parameters such astransactionId
andstatus
to indicate payment status - The final payment result is sent via webhook to the merchant's
notifyUrl
Payment Timing
Some local payment methods are not instantaneous. The webhook notification will be sent only when the payment reaches a final state. Merchants should design their user experience accordingly.
3. Payment Result Notification
In this phase:
- Onerway sends detailed payment result data to the
notifyUrl
via HTTPPOST
- The webhook contains complete transaction information including
transactionId
,status
,paymentMethod
, andsignature
for verification - Merchant system must respond with
transactionId
to acknowledge receipt of the webhook - If no successful response is received, Onerway will retry sending the webhook up to
3
times at 30-minute intervals
4. Subscription Flow for Local Payments
For subscription-enabled local payment methods, the flow includes additional steps:
Subscription integration involves:
Initial Subscription Setup:
- Merchant sends request with
subProductType=SUBSCRIBE
and subscription configuration - Customer authorizes the subscription agreement with the local payment provider
- Merchant receives a webhook with
txnType=BIND_CARD
,orderAmount=0.00
, andscenarios=SUBSCRIPTION_INITIAL
- Critical values (
contractId
andtokenId
) must be stored for future billing
- Merchant sends request with
Recurring Billing:
- Based on the subscription frequency, Onerway initiates billing using the stored token
- Merchant receives a webhook with
txnType=SALE
and the actual billing amount - The same
contractId
andtokenId
from initial setup are included in these webhooks
Subscription Support Limitations
Not all local payment methods support subscriptions. Currently, only DANA
, WeChat
, GCash
, and TOUCH_GO_EWALLET
offer subscription capabilities. Each method may have specific requirements or limitations.
API Usage Examples
Standard Local Payment Request (DANA)
{
"billingInformation": "{\"address\":\"370 Feest Pike\",\"city\":\"Port Webster\",\"country\":\"ID\",\"email\":\"Emmett.Ankunding95@yahoo.com\",\"firstName\":\"Eden\",\"identityNumber\":\"21589551116\",\"lastName\":\"Langosh\",\"phone\":\"14988671499\",\"postalCode\":\"12192-3718\",\"province\":\"CO\"}",
"lpmsInfo": "{\"lpmsType\":\"DANA\",\"bankName\":null,\"iBan\":\"DE89370400440532013000\",\"walletAccountId\":null,\"walletAccountName\":null,\"prepaidNumber\":null}",
"merchantCustId": "CustId-04IK-L1S3",
"merchantNo": "800209",
"merchantTxnId": "2ee5097c-48e3-44e4-b008-0590119995b3",
"merchantTxnTime": "2025-05-11 17:49:22",
"orderAmount": "100",
"orderCurrency": "IDR",
"productType": "LPMS",
"shippingInformation": "{\"address\":\"71463 Myrna Ridge\",\"city\":\"West Marlene\",\"country\":\"ID\",\"email\":\"Lori_Simonis98@hotmail.com\",\"firstName\":\"Elyssa\",\"identityNumber\":\"55296378622\",\"lastName\":\"Becker\",\"phone\":\"19175504257\",\"postalCode\":\"59143-0170\",\"province\":\"CO\"}",
"sign": "24fd8bfc66b6f031fd27bc52ab91388f44bac7d4edc752cc7f2932908b4e9d97",
"subProductType": "DIRECT",
"txnOrderMsg": "{\"accept\":\"*/*\",\"appId\":\"1727880846378401792\",\"colorDepth\":\"32\",\"contentLength\":\"16384\",\"javaEnabled\":true,\"language\":\"en-US\",\"products\":\"[{\\\"currency\\\":\\\"IDR\\\",\\\"name\\\":\\\"cavalo\\\",\\\"num\\\":\\\"25\\\",\\\"price\\\":\\\"733.39\\\",\\\"type\\\":\\\"dolor\\\"},{\\\"currency\\\":\\\"IDR\\\",\\\"name\\\":\\\"dried apricot\\\",\\\"num\\\":\\\"18\\\",\\\"price\\\":\\\"320.45\\\",\\\"type\\\":\\\"Excepteur\\\"},{\\\"currency\\\":\\\"IDR\\\",\\\"name\\\":\\\"nashi pear\\\",\\\"num\\\":\\\"66\\\",\\\"price\\\":\\\"965.59\\\",\\\"type\\\":\\\"consectetur laboris dolore\\\"}]\",\"returnUrl\":\"https://docs.onerway.com/\",\"notifyUrl\":\"https://docs.onerway.com/apis\",\"screenHeight\":\"480\",\"screenWidth\":\"1366\",\"timeZoneOffset\":\"-120\",\"transactionIp\":\"220.14.137.207\",\"userAgent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36\"}",
"txnType": "SALE"
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"respCode": "20000",
"respMsg": "Success",
"data": {
"transactionId": "1921503197131046912",
"responseTime": "2025-05-11 17:50:39",
"txnTime": "2025-05-11 17:50:36",
"txnTimeZone": "+08:00",
"orderAmount": "100.00",
"orderCurrency": "IDR",
"txnAmount": null,
"txnCurrency": null,
"status": "R",
"redirectUrl": "https://sandbox-stc.onerway.com/local-payment?orderId=8002091921503201446731776&returnUrl=https://sandbox-gw-dmz.onerway.com/front/return/8002091921503201446731776",
"contractId": null,
"tokenId": null,
"eci": null,
"periodValue": null,
"codeForm": null,
"presentContext": null,
"actionType": "RedirectURL",
"subscriptionManageUrl": null,
"sign": "f809e578ab27b6ac1599d365fa4b39f5107ab5ad65ac11dbede4725362ea441d"
}
}
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": "1921503197131046912",
"txnType": "SALE",
"merchantNo": "800209",
"merchantTxnId": "2ee5097c-48e3-44e4-b008-0590119995b3",
"responseTime": "2025-05-11 17:51:15",
"txnTime": "2025-05-11 17:50:36",
"txnTimeZone": "+08:00",
"orderAmount": "100.00",
"orderCurrency": "IDR",
"status": "S",
"reason": "{\"respCode\":\"20000\",\"respMsg\":\"Success\"}",
"sign": "55ab708f7a91a8faad33c6b804796a84170a84fc8d48f04876c903bf83b343cc",
"paymentMethod": "DANA",
"channelRequestId": "8002091921503201446731776"
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Local Payment with Subscription (Example)
Subscription Flow for Local Payment Methods
For local payment methods that support subscriptions (such as DANA
, WeChat
, GCash
, and TOUCH_GO_EWALLET
), the subscription process typically follows a two-step flow:
Initial Subscription Setup: A zero-amount transaction to establish the subscription contract
- The system creates a contract and token for future billing
- Transaction type will be
BIND_CARD
despite not being a card transaction - Appears in webhooks with
scenarios: "SUBSCRIPTION_INITIAL"
Subsequent Billing: Actual payment transactions using the established contract
- Uses the
contractId
andtokenId
from the initial setup - Regular transaction with the subscription amount
- Uses the
{
"billingInformation": "{\"country\":\"ID\",\"email\":\"abel.wang@onerway.com\",\"firstName\":\"CL\",\"lastName\":\"BRW2\",\"phone\":\"17700492982\",\"address\":\"Apt. 870\",\"city\":\"Hayward\",\"postalCode\":\"66977\",\"identityNumber\":\"12345678\"}",
"lpmsInfo": "{\"lpmsType\":\"DANA\",\"iBan\":\"DE89370400440532013000\"}",
"merchantNo": "800209",
"merchantTxnId": "1746975870000",
"merchantTxnTime": "2025-05-11 23:04:30",
"merchantTxnTimeZone": "+08:00",
"orderAmount": "20000",
"orderCurrency": "IDR",
"productType": "LPMS",
"shippingInformation": "{\"country\":\"ID\",\"email\":\"abel.wang@onerway.com\",\"firstName\":\"CL\",\"lastName\":\"BRW2\",\"phone\":\"17700492982\",\"address\":\"Apt. 870\",\"city\":\"Hayward\",\"postalCode\":\"66977\",\"identityNumber\":\"12345678\"}",
"sign": "ccc3fe125e4f842cc6d0c36fabd5f69c0c89af295cef7a7b05614c055e203a37",
"subProductType": "SUBSCRIBE", // For subscription payments
"subscription": "{\"requestType\":\"0\",\"merchantCustId\":\"1746975870000\",\"expireDate\":\"2034-10-17\",\"frequencyType\":\"D\",\"frequencyPoint\":\"1\",\"tokenId\":\"\",\"contractId\":\"\"}",
"txnOrderMsg": "{\"returnUrl\":\"https:/docs.onerway.com/\",\"products\":\"[{\\\"price\\\":\\\"20000\\\",\\\"num\\\":\\\"1\\\",\\\"name\\\":\\\"iphone11\\\",\\\"currency\\\":\\\"IDR\\\"}]\",\"transactionIp\":\"127.0.0.1\",\"appId\":\"1727880846378401792\",\"javaEnabled\":false,\"colorDepth\":\"24\",\"screenHeight\":\"1080\",\"screenWidth\":\"1920\",\"timeZoneOffset\":\"-480\",\"accept\":\"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\",\"userAgent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36\",\"contentLength\":\"340\",\"language\":\"en-USen-US\",\"notifyUrl\":\"https://www.merchant-store-website.com/\"}",
"txnType": "SALE"
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"respCode": "20000",
"respMsg": "Success",
"data": {
"transactionId": "1921582195139805184",
"responseTime": "2025-05-11 23:04:34",
"txnTime": "2025-05-11 23:04:31",
"txnTimeZone": "+08:00",
"orderAmount": "0.00", // Zero amount for initial subscription setup
"orderCurrency": "IDR",
"txnAmount": null,
"txnCurrency": null,
"status": "R",
"redirectUrl": "https://sandbox-stc.onerway.com/local-payment?orderId=8002091921510358975213568&returnUrl=https://sandbox-gw-dmz.onerway.com/front/return/8002091921510358975213568",
"contractId": null,
"tokenId": "",
"eci": null,
"periodValue": null,
"codeForm": null,
"presentContext": null,
"actionType": "RedirectURL",
"subscriptionManageUrl": null,
"sign": "1b46d107b1d4c2b34797d1e30cea3ae0d18a72684e5c2ec17725e3951c38a6f2"
}
}
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": "1921582195139805184",
"txnType": "BIND_CARD", // Note: This is BIND_CARD despite not being a card transaction
"merchantNo": "800209",
"merchantTxnId": "1746975870000",
"responseTime": "2025-05-11 23:04:31",
"txnTime": "2025-05-11 23:04:31",
"txnTimeZone": "+08:00",
"orderAmount": "0.00", // Zero amount for contract establishment
"orderCurrency": "IDR",
"status": "S",
"contractId": "1921582195420823553", // Contract ID for future billing
"tokenId": "e0ed3f5ea3a4c402df66a9e37f84159ab86edf50d5df7b1943fa7e6024a14209", // Token for future billing
"tokenExpireTime": "2099-12-31 23:59:59",
"reason": "{\"respCode\":\"20000\",\"respMsg\":\"Success\"}",
"sign": "3d6c9c205bb7802a836cf2761a8595655aa47eb6742c427b4f8eabdfe639b944",
"paymentMethod": "DANA",
"subscriptionStatus": "active",
"dataStatus": "1",
"products": "[{\"price\":\"20000\",\"num\":\"1\",\"name\":\"iphone11\",\"currency\":\"IDR\"}]",
"channelRequestId": "8002091921582200847998976",
"scenarios": "SUBSCRIPTION_INITIAL" // Indicates this is the initial subscription setup
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"notifyType": "TXN",
"transactionId": "1921583161943654402",
"txnType": "SALE", // Regular SALE transaction
"merchantNo": "800209",
"merchantTxnId": "1746975870000",
"responseTime": "2025-05-11 23:08:24",
"txnTime": "2025-05-11 23:08:21",
"txnTimeZone": "+08:00",
"orderAmount": "20000.00", // Actual billing amount
"orderCurrency": "IDR",
"status": "S",
"contractId": "1921582195420823553", // Same contract ID from initial setup
"tokenId": "e0ed3f5ea3a4c402df66a9e37f84159ab86edf50d5df7b1943fa7e6024a14209", // Same token from initial setup
"reason": "{\"respCode\":\"20000\",\"respMsg\":\"Success\"}",
"sign": "bc7e1b705f9b30c6b5f0d4385a7e2d3fb4fae1199630166cba49a527b6bd3934",
"paymentMethod": "DANA",
"subscriptionStatus": "active",
"dataStatus": "1",
"products": "[{\"price\":\"20000\",\"num\":\"1\",\"name\":\"iphone11\",\"currency\":\"IDR\"}]",
"channelRequestId": "8002091921583164418039809"
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Common Error Scenarios and Solutions
Common Error Codes
Handling Subscription Transactions
For local payment methods that support subscriptions, it's important to understand and properly implement the two-step transaction flow:
Initial Zero-Amount Contract Establishment
Webhook Identification: The initial subscription setup can be identified by:
txnType
: "BIND_CARD" (despite not being a card transaction)orderAmount
: "0.00"scenarios
: "SUBSCRIPTION_INITIAL"
Data Storage: When receiving this webhook, you should:
- Store the
contractId
andtokenId
securely in your database - Associate them with the customer's profile
- Update the subscription status based on
subscriptionStatus
- Set the subscription expiration based on
expireTime
- Store the
Subsequent Billing Transactions
Webhook Identification: The actual billing transactions can be identified by:
txnType
: "SALE"- Non-zero
orderAmount
- The same
contractId
andtokenId
as the initial setup
Data Handling: When receiving these webhooks, you should:
- Record the payment against the subscription
- Update billing records in your system
- Track payment history for the subscription
- Verify the
subscriptionStatus
to ensure the subscription remains active
Implementation Note
Some local payment methods may require separate authentication for each billing cycle despite using the same contract. Your implementation should account for potential redirections for customer authentication on subsequent billings.
Additionally, while the initial webhook has orderAmount=0.00
, your original request should include the actual subscription amount in the orderAmount
field and product details. This amount will be used for reference and will appear in subsequent billing transactions.
Supported Local Payment Methods
Here is a summary of the popular local payment methods supported by Onerway:
Type | Name | Countries (ISO Standard) | Supported Currencies | Required Fields | Transaction Limit |
---|---|---|---|---|---|
Alipay+ | Alipay+ | Worldwide | EUR, USD, GBP | email, country | No limit |
GB | GBP | email, country | No limit | ||
AlipayHK | AlipayHK | AT, BE, BG, HR, CY, CZ, DK, EE, FI, FR, DE, GR, HU, IE, IT, LV, LT, LU, MT, NL, PL, PT, RO, SK, SI, ES, SE, IS, LI, NO, GB, CH | GBP, USD, EUR, HKD, MYR, PHP, IDR, KRW, THB, CNY | email, country | No limit |
AlipayCN | AlipayCN | AT, BE, BG, HR, CY, CZ, DK, EE, FI, FR, DE, GR, HU, IE, IT, LV, LT, LU, MT, NL, PL, PT, RO, SK, SI, ES, SE, IS, LI, NO, GB, CH | EUR, GBP, USD, AUD, CNY, HKD, THB, MYR, KRW, IDR, PHP | email, country | No limit |
Kakao_Pay | Kakao Pay | AT, BE, BG, HR, CY, CZ, DK, EE, FI, FR, DE, GR, HU, IE, IT, LV, LT, LU, MT, NL, PL, PT, RO, SK, SI, ES, SE, IS, LI, NO, GB, CH | USD, GBP, EUR, KRW, HKD, MYR, PHP, IDR, CNY, THB | email, country | No limit |
Klarna | Klarna | AU, AT, BE, FI, FR, DE, GR, IE, IT, NL, PT, ES, CZ, DK, NO, PL, SE, CH, GB | AUD, EUR, CZK, DKK, NOK, PLN, SEK, CHF, GBP | email, country, language, products | No limit |
Boleto | Boleto | BR | BRL, EUR, USD | email, country, identityNumber, province, street, city, postalCode | No limit |
BankTransfer | BankTransfer | BR, PH, JP | BRL, EUR, USD, PHP, JPY | email, country, identityNumber, province, street, city, postalCode, name | Min Value: 1 |
Banrisul | Banrisul | BR | BRL, EUR, USD | email, country, identityNumber, province, street, city, postalCode | No limit |
Bradesco | Bradesco | BR | BRL, EUR, USD | email, country, identityNumber, province, street, city, postalCode | No limit |
Banco do Brasil | Banco do Brasil | BR | BRL, EUR, USD | email, country, identityNumber, province, street, city, postalCode | No limit |
Itau | Itau | BR | BRL, EUR, USD | email, country, identityNumber, province, street, city, postalCode | No limit |
MercadoPago | MercadoPago | BR, MX | BRL, EUR, USD, MXN | email, country, identityNumber, province, street, city, postalCode | No limit |
PIX | PIX | BR | BRL, EUR, USD | email, country, identityNumber, province, street, city, postalCode | No limit |
Servipag | Servipag | CL | CLP, EUR, USD | email, country | No limit |
Sencillito | Sencillito | CL | CLP, EUR, USD | email, country | No limit |
Webpay | Webpay | CL | CLP, EUR, USD | email, country | No limit |
Multicaja | Multicaja | CL | CLP, EUR, USD | email, country | No limit |
Baloto | Baloto | CO | COP, EUR, USD | email, country | No limit |
EFT | EFT | CO | COP, EUR, USD | email, country, identityNumber, bankName | No limit |
Efecty | Efecty | CO | COP, EUR, USD | email, country | No limit |
SPEI | SPEI | MX | MXN, USD | email, country | No limit |
OXXO | OXXO | MX | MXN, USD | email, country | No limit |
OXXOPAY | OXXOPAY | MX | MXN, USD | email, country | No limit |
PagoEfectivo | PagoEfectivo | PE | PEN, USD | email, country | No limit |
safetypay-cash | SafetyPay Cash | PE, EC | PEN, USD | email, country | No limit |
safetypay-online | SafetyPay Online | PE, EC | PEN, USD | email, country | No limit |
PayU | PayU | PL, CZ | PLN, CZK | email, country | No limit |
Przelewy24 | Przelewy24 | PL | PLN | email, country, bankName | No limit |
Pagosnet | Pagosnet | BO | BOB, USD | email, country | No limit |
SEPADD | SEPADD | AT, BE, BG, HR, CY, CZ, DK, EE, FI, FR, DE, GR, HU, IE, IT, LV, LT, LU, MT, NL, PL, PT, RO, SK, SI, ES, SE, IS, LI, NO, AD, SM, MC, VA, PF, TF, GI, GG, IM, JE, BL, PM, CH, GB, WF | EUR | Cashier Payment: email, country | 0.10 EUR ~ 1,000 EUR |
Sofort | Sofort | AT, BE, DE, NL, ES, CH | EUR, CHF | email, country | No limit |
Giropay | Giropay | DE | EUR | email, country | No limit |
iDEAL | iDEAL | NL | AUD, CAD, DKK, EUR, GBP, HKD, NOK, SEK, USD | email, country | No limit |
Konbini | Konbini | JP | JPY | country | Min Value: 1 Max Value: 300,000 |
PayEasy | PayEasy | JP | JPY | Cashier Payment: country | Min Value: 1 Max Value: 300,000 |
POLi | POLi | AU | AUD | email, country | No limit |
Bancontact | Bancontact | BE | EUR | email, country | No limit |
OVO | OVO | ID | IDR | country | Min Value: 1 Max Value: 10,000 |
MyBank | MyBank | IT | EUR | email, country | No limit |
Dragonpay | Dragonpay | Worldwide | PHP | email, country | No limit |
Skrill | Skrill | Worldwide | EUR, GBP, USD | email, country | No limit |
eNETS | eNETS | SG | SGD | email, country | No limit |
PayseraWallet | PayseraWallet | LT, LV, EE | EUR | email, country | No limit |
LithuanianBanks | LithuanianBanks | LT | EUR | email, country | No limit |
PaySafeCard | PaySafeCard | AT, AU, BE, BG, CA, CH, CY, CZ, DE, DK, ES, FI, FR, GB, GE, GI, GR, HR, HU, IE, IT, LI, LT, LU, MT, MX, NL, NZ, NO, PE, PL, PT, RO, SE, SI, SK, UY | AUD, CAD, CHF, EUR, GBP, NOK, PLN, RON, SEK, USD | email, country | No limit |
Paysafecash | Paysafecash | AT, BE, CA, CH, CY, CZ, DK, ES, FR, GB, GR, HR, HU, IE, IT, LU, LT, MT, NL, PL, PT, RO, SE, SI, SK | AUD, CAD, CHF, EUR, GBP, NOK, PLN, RON, SEK, USD | email, country | No limit |
Payconiq | Payconiq | BE, NL, LU | EUR | email, country | No limit |
Trustly | Trustly | DE, DK, EE, ES, FI, GB, LT, LV, NL, NO, PL, SE, SK | DKK, EUR, GBP, NOK, PLN, SEK | email, country | No limit |
GCash | GCash | PH | PHP | email, identityNumber, name | 1 PHP ~ 10000 PHP (Equivalent) |
GrabPay | GrabPay | PH | PHP | email, identityNumber, name |
|
PayMaya | PayMaya | PH | PHP | email, identityNumber, name | 1 PHP ~ 50000 PHP (Equivalent) |
ELEVEN | ELEVEN | PH | PHP | email, identityNumber, name | 1 PHP ~ 10000 PHP (Equivalent) |
GrabPay SG | GrabPay SG | SG | SGD | country | Min Value: 0.01 |
TrueMoney Wallet | TrueMoney Wallet | TH | THB | Cashier Payment: country | Min Value: 20.00 Max Value: 100,000.00 |
Rabbit_Line_pay | Rabbit Line Pay | TH | THB | country | Min Value: 20.00 Max Value: 150,000.00 |
PromptPay | PromptPay | TH | THB | country | Min Value: 20.00 Max Value: 150,000.00 |
KRUNGSRI_ONLINE | Krungsri Online | TH | THB | country | Min Value: 20.00 Max Value: 150,000.00 |
BUALUANG_IBANKING | Bualuang iBanking | TH | THB | country | Min Value: 20.00 Max Value: 150,000.00 |
CITI_POINTS | Pay with Points - Citi Rewards Points | TH | THB | country | Min Value: 20.00 Max Value: 150,000.00 |
K_PLUS | K PLUS | TH | THB | country | Min Value: 20.00 Max Value: 150,000.00 |
MCASH | MCASH | MY | MYR | country | Min Value: 1.00 |
TOUCH_GO_EWALLET | Touch 'n Go eWallet | MY | MYR | country | Min Value: 1.00 |
ShopeePay | ShopeePay | MY, ID | MYR, IDR | country | Min Value: 1.00 |
Boost | Boost | MY | MYR | country | Min Value: 1.00 |
BNI | BNI VA | ID | IDR | country | Min Value: 1 Max Value: 10,000 |
MANDIRI | Mandiri ATM | ID | IDR | country | Min Value: 1 Max Value: 10,000 |
Maybank | Maybank VA | ID | IDR | country | Min Value: 1 Max Value: 10,000 |
PERMATA | Permata VA | ID | IDR | country | Min Value: 1 Max Value: 10,000 |
BRI | BRI VA | ID | IDR | country | Min Value: 1 Max Value: 10,000 |
CIMB | CIMB VA | ID | IDR | country | Min Value: 1 Max Value: 10,000 |
DANA | DANA | ID | IDR | country | Min Value: 1 Max Value: 10,000 |
QRIS | QRIS | ID | IDR | country | Min Value: 1 Max Value: 10,000 |
AKULAKU | AKULAKU | ID | IDR | country | Min Value: 1 Max Value: 10,000 |
BankTransfer | Bank Transfer Japan | JP | JPY | Cashier Payment: country | Min Value: 1 |
Paypay | PayPay | JP | JPY | country | Min Value: 1 Max Value: 1,000,000 |
LINE_Pay | LINE Pay | JP | JPY | country | Min Value: 1 Max Value: 1,000,000 |
Merpay | merPay | JP | JPY | country | Min Value: 1 Max Value: 1,000,000 |
Rakuten_Pay | Rakuten Pay | JP | JPY | country | Min Value: 100 Max Value: 9,999,999 |
BitCash | Bit Cash | JP | JPY | Cashier Payment: country | Min Value: 1 Max Value: 20,000 |
Net_Cash | Net Cash | JP | JPY | Cashier Payment: country | Min Value: 1 Max Value: 20,000 |
WebMoney | Web Money | JP | JPY | Cashier Payment: country | Min Value: 1 Max Value: 20,000 |
au | au KDDI | JP | JPY | country | Min Value: 1 Max Value: 100,000 |
SoftBank | SoftBank | JP | JPY | country | Min Value: 1 Max Value: 100,000 |
NTT_Docomo | NTT Docomo | JP | JPY | country | Min Value: 1 Max Value: 100,000 |
Paidy | Paidy | JP | JPY | country | Min Value: 1 Max Value: 1,000,000 |
BLIK | BLIK | PL | PLN | Cashier Payment: country | Minimum transaction amount: 0.01 PLN Maximum transaction amount: 50,000 PLN/transaction (most issuers have a limit of 10,000 PLN/transaction) |
BLIK_SEAMLESS | BLIK_Seamless | PL | PLN | Cashier Payment: country | Minimum transaction amount: 0.01 PLN Maximum transaction amount: 50,000 PLN/transaction (most issuers have a limit of 10,000 PLN/transaction) |
Regional Requirements
Some local payment methods may require additional merchant registration or have specific regional requirements. Contact Onerway support for detailed requirements for each payment method.
Implementation Best Practices
- Currency Matching: Ensure the transaction currency matches the supported currencies for the selected payment method
- Return URL Handling: Implement proper handling of the return URL to process the payment status parameters
- User Experience: Display clear payment instructions and status updates to customers
- Payment Method Selection: Filter available payment methods based on the customer's region and currency
- Webhook Verification: Always verify webhook signatures to prevent tampering
- Error Handling: Implement robust error handling with clear customer messaging
- Transaction Tracking: Maintain a transaction log for reconciliation and troubleshooting
- Delayed Settlement: Some local payment methods have delayed settlement - design your system accordingly
- Timeout Handling: Implement proper timeout handling for transactions that remain in pending state
- Subscription Management: For subscription-enabled methods, securely store contract and token information
- User Interface: Provide a seamless transition to and from the local payment platform
- Mobile Optimization: Ensure your redirection flow works well on mobile devices, as many local payment methods are mobile-first
Merchant Integration Checklist
Before going live with Local Payment integration, ensure you have:
- Region-specific payment method configuration
- Currency validation for each payment method
- Proper redirection handling with clear user instructions
- Return URL handling to update payment status
- Webhook handling and verification
- Transaction status tracking system
- Error messaging tailored for different payment methods
- Thorough testing in sandbox environment with each payment method
- Mobile-optimized payment flow
- Customer support procedures for payment issues
- Subscription management system for storing contract and token information
- Process for handling the dual-webhook flow for subscription transactions