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 | Transaction billing information in JSON string format. See TransactionAddressfor complete structure. |
lpmsInfo | String | / | Conditional | Yes | Local payment method information in JSON string format. See LpmsInfofor complete structure. |
merchantNo | String | 20 | Yes | Yes | Merchant number assigned by |
merchantTxnId | String | 64 | Yes | Yes | Unique transaction identifier for each customer payment, generated by the merchant system. |
merchantTxnOriginalId | String | 128 | No | Yes | Master transaction ID generated by merchant for grouping related transactions. |
merchantTxnTime | String | / | No | Yes | Transaction timestamp when the merchant initiated the transaction. |
merchantTxnTimeZone | String | 64 | No | Yes | Transaction timezone offset for the merchant transaction time. |
mpiInfo | String | / | Conditional | Yes | 3DS verification result information in JSON string format. See MpiInfofor complete structure. |
orderAmount | String | 19 | Yes | Yes | Transaction amount in the specified currency, formatted as a decimal string. |
orderCurrency | String | 8 | Yes | Yes | Three-letter currency code according to ISO 4217 standard for the transaction amount. |
osType | String | 16 | Conditional | Yes | Operating system type for mobile and app-based transactions. See OsTypeEnumfor available options. |
paymentMode | String | 16 | No | Yes | Payment mode indicating the platform or environment for the transaction. See PaymentModeEnumfor all available options. |
productType | String | 16 | Yes | Yes | Payment method category that determines which payment options are available to customers. See ProductTypeEnumfor all available options. |
risk3dsStrategy | String | 16 | Conditional | Yes | 3DS risk control strategy for fraud prevention. See Risk3dsStrategyEnumfor available options. |
shippingInformation | String | / | Yes | Yes | Transaction shipping information in JSON string format. See TransactionAddressfor complete structure. |
sign | String | / | Yes | No | Digital signature string for request verification and security. Please refer to Signature for signature generation method. |
subProductType | String | 16 | Yes | Yes | Specific implementation method within the selected product type, defining how the payment is processed. See SubProductTypeEnumfor all available options. |
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 TxnOrderMsgfor complete structure. |
txnType | String | 16 | Yes | Yes | Transaction type that defines the payment operation to be performed. See TxnTypeEnumfor all available options and detailed usage scenarios. |
TransactionAddress
Name | Type | Length | Required | Signature | Description |
---|---|---|---|---|---|
firstName | String | 64 | No | No | Customer first name. |
lastName | String | 64 | No | No | Customer last name. |
jpFirstName | String | 64 | No | No | First name in Japanese Katakana. |
jpLastName | String | 64 | No | No | Last name in Japanese Katakana. |
phone | String | 32 | No | No | Customer phone number in international format. |
String | 256 | Yes | No | Customer email address. | |
postalCode | String | 32 | No | No | Postal/ZIP code. |
address | String | 256 | No | No | Full address in a single field. |
country | String | 64 | Yes | No | |
province | String | 64 | Conditional | No | |
city | String | 64 | No | No | City name. |
street | String | 64 | No | No | Street name. |
number | String | 64 | No | No | House/Building number. |
identityNumber | String | 64 | No | No | Government-issued ID number. |
birthDate | String | 64 | No | No | Birth date in |
LpmsInfo
Name | Type | Length | Required | Signature | Description |
---|---|---|---|---|---|
lpmsType | String | 64 | Yes | No | Local payment method type. Please refer to LpmsTypeEnumfor all supported payment methods. |
bankName | String | 128 | Conditional | No | Bank name. When for supported banks. When for valid Polish bank options. |
walletAccountId | String | / | Conditional | No | Wallet/local account identifier. Required in these scenarios:
|
walletAccountName | String | / | Conditional | No | Wallet/local account name. Required when |
iBan | String | 64 | Conditional | No | International Bank Account Number (IBAN). Required for transfers in regions that use IBAN for bank identification. |
prepaidNumber | String | / | Conditional | No | Prepaid card or voucher number. Required for certain Japanese payment methods like |
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. See RequestTypeEnum |
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: Self-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 | Subscription authorization mode. See SubscriptionModeEnum |
selfExecute | String | 1 | Yes | Subscription billing mode. See SubscriptionExecuteModeEnum |
// 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 payment completion, customer is redirected to this URL |
products | String | 1024 | Yes | No | List of product information purchased by the customer See Productsfor complete structure. |
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 | Response data. Refer to object data |
data
Name | Type | Description |
---|---|---|
transactionId | String | Transaction order number created by |
responseTime | String | Interface response time Format: |
txnTime | String | Transaction completion time Format: |
txnTimeZone | String | Transaction time zone Format: |
orderAmount | String | Order amount |
orderCurrency | String | |
txnAmount | String | Order amount after conversion to settlement currency |
txnCurrency | String | |
status | String | Transaction processing result Refer to TxnStatusEnum |
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 See CodeFormEnum |
presentContext | String | Context information for presentation layer |
actionType | String | Action type for the transaction See ActionTypeEnum |
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 |
---|---|---|---|---|---|
JdPay | JdPay | GB | GBP, EUR, CNY, SGD, USD, JPY, HKD, AUD, CAD | country | No 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: 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 | Checkout: email, country API: email, country, IBAN | 0.10 - 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 | 1 - 300,000 |
PayEasy | PayEasy | JP | JPY | Checkout: country API: country, firstName, lastName, jpFirstName, jpLastName, phone | 1 - 300,000 |
POLi | POLi | AU | AUD | email, country | No limit |
Bancontact | Bancontact | BE | EUR | email, country | No limit |
OVO | OVO | ID | IDR | country | 1 - 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 - 10,000 PHP |
GrabPay | GrabPay | PH | PHP | email, identityNumber, name | Min: 1 PHP |
PayMaya | PayMaya | PH | PHP | email, identityNumber, name | 1 - 50,000 PHP |
ELEVEN | ELEVEN | PH | PHP | email, identityNumber, name | 1 - 10,000 PHP |
GrabPay SG | GrabPay SG | SG | SGD | country | Min: 0.01 |
TrueMoney Wallet | TrueMoney Wallet | TH | THB | Checkout: country API: country, phone | 20 - 100,000 |
Rabbit_Line_pay | Rabbit Line Pay | TH | THB | country | 20 - 150,000 |
PromptPay | PromptPay | TH | THB | country | 20 - 150,000 |
KRUNGSRI_ONLINE | Krungsri Online | TH | THB | country | 20 - 150,000 |
BUALUANG_IBANKING | Bualuang iBanking | TH | THB | country | 20 - 150,000 |
CITI_POINTS | Pay with Points - Citi Rewards | TH | THB | country | 20 - 150,000 |
K_PLUS | K PLUS | TH | THB | country | 20 - 150,000 |
MCASH | MCASH | MY | MYR | country | Min: 1.00 |
TOUCH_GO_EWALLET | Touch 'n Go eWallet | MY | MYR | country | Min: 1.00 |
ShopeePay | ShopeePay | MY, ID | MYR, IDR | country | Min: 1.00 |
Boost | Boost | MY | MYR | country | Min: 1.00 |
BNI | BNI VA | ID | IDR | country | 1 - 10,000 |
MANDIRI | Mandiri ATM | ID | IDR | country | 1 - 10,000 |
Maybank | Maybank VA | ID | IDR | country | 1 - 10,000 |
PERMATA | Permata VA | ID | IDR | country | 1 - 10,000 |
BRI | BRI VA | ID | IDR | country | 1 - 10,000 |
CIMB | CIMB VA | ID | IDR | country | 1 - 10,000 |
DANA | DANA | ID | IDR | country | 1 - 10,000 |
QRIS | QRIS | ID | IDR | country | 1 - 10,000 |
AKULAKU | AKULAKU | ID | IDR | country | 1 - 10,000 |
BankTransfer | Bank Transfer Japan | JP | JPY | Checkout: country API: country, firstName, lastName, jpFirstName, jpLastName, phone | Min: 1 |
Paypay | PayPay | JP | JPY | country | 1 - 1,000,000 |
LINE_Pay | LINE Pay | JP | JPY | country | 1 - 1,000,000 |
Merpay | merPay | JP | JPY | country | 1 - 1,000,000 |
Rakuten_Pay | Rakuten Pay | JP | JPY | country | 100 - 9,999,999 |
BitCash | Bit Cash | JP | JPY | Checkout: country API: country, prepaidNumber | 1 - 20,000 |
Net_Cash | Net Cash | JP | JPY | Checkout: country API: country, prepaidNumber | 1 - 20,000 |
WebMoney | Web Money | JP | JPY | Checkout: country API: country, prepaidNumber | 1 - 20,000 |
au | au KDDI | JP | JPY | country | 1 - 100,000 |
SoftBank | SoftBank | JP | JPY | country | 1 - 100,000 |
NTT_Docomo | NTT Docomo | JP | JPY | country | 1 - 100,000 |
Paidy | Paidy | JP | JPY | country | 1 - 1,000,000 |
BLIK | BLIK | PL | PLN | Checkout: country API: country, walletAccountId | 0.01 - 50,000 PLN (most issuers: 10,000 PLN) |
BLIK_SEAMLESS | BLIK Seamless | PL | PLN | Checkout: country API: country, walletAccountId | 0.01 - 50,000 PLN (most issuers: 10,000 PLN) |
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