Documentation Index
Fetch the complete documentation index at: https://waffo.com/docs/llms.txt
Use this file to discover all available pages before exploring further.
Integration
Which integration method is recommended?
Which integration method is recommended?
What is the difference between ONE_TIME_PAYMENT and DIRECT_PAYMENT?
What is the difference between ONE_TIME_PAYMENT and DIRECT_PAYMENT?
DIRECT_PAYMENT is an early product that is largely unused today. New merchants should integrate ONE_TIME_PAYMENT directly.At the system level, the two are identical. The difference is in the business relationship:- ONE_TIME_PAYMENT: Waffo acts as PSP, providing full acquiring services (information flow + fund settlement)
- DIRECT_PAYMENT: Waffo acts as ISV/PG, providing only system connectivity (no fund handling)
Why does the amount need to be a String type?
Why does the amount need to be a String type?
0.1 + 0.2 = 0.30000000000000004, which is unacceptable in financial scenarios.What are the currency precision requirements?
What are the currency precision requirements?
- Same-currency orders: Most currencies require 2 decimal places per ISO 4217, but
IDR,COP,KES, andTWDmust not have decimals - Cross-currency orders: All currency amounts must conform to ISO 4217 precision, with no exceptions
How do I test Webhooks locally?
How do I test Webhooks locally?
Parameters
How should I pass payMethodType and payMethodName?
How should I pass payMethodType and payMethodName?
- Omit both: The user selects a payment method on the Waffo checkout page
- Card payments: Pass
payMethodType="CREDITCARD,DEBITCARD"and omitpayMethodName. Waffo automatically determines the card network from the card BIN the user enters, supporting Visa/Mastercard and credit/debit cards in a single order - VA (virtual account): Pass
payMethodType="VA"and omitpayMethodName; the user selects a bank on the checkout page - Specify a particular method: Pass both
payMethodTypeandpayMethodName. You can look up the exact values on the Payin page in the Portal
Can I omit userEmail?
Can I omit userEmail?
- Send a fixed-format value such as
userId@examples.com(replace with the actual userId) - Contact Waffo to have Waffo overwrite it to
userId@examples.comformat on your behalf (requires merchant authorization)
After going live, passing the user’s real email is recommended. Avoid using strings like test or reusing the same email across multiple users, as this may trigger risk controls.
Should I pass orderExpiredAt?
Should I pass orderExpiredAt?
What is the difference between same-currency and cross-currency orders?
What is the difference between same-currency and cross-currency orders?
- Same-currency: The merchant’s pricing currency matches the user’s local currency (e.g., IDR pricing → Indonesian user pays in IDR)
- Cross-currency: The merchant’s pricing currency differs from the user’s payment currency (e.g., USD pricing → Indonesian user pays in IDR via DANA)
payMethodCountry when either payMethodType or payMethodName is not specified. userCurrency is optional.When should I pass payMethodCountry?
When should I pass payMethodCountry?
- Global cards (CREDITCARD/DEBITCARD): Do not pass this field—global cards do not belong to any specific country.
Payments
Which should I use, webUrl or deeplinkUrl from orderAction?
Which should I use, webUrl or deeplinkUrl from orderAction?
orderAction.actionType:actionType = "WEB"→ usewebUrlactionType = "DEEPLINK"→ usedeeplinkUrl
webUrl is present. If you pass userTerminal=APP, some wallet payment methods that require external authorization return a deeplink.In the sandbox, deeplinks cannot launch real wallet apps because a simulator is used. Verify this behavior in production.
What should I do if the order creation returns orderStatus = AUTHORIZATION_REQUIRED?
What should I do if the order creation returns orderStatus = AUTHORIZATION_REQUIRED?
What should I do if I receive an UnknownStatus exception?
What should I do if I receive an UnknownStatus exception?
- When creating an order: If you can confirm the user cannot complete payment under the error condition (e.g., payment methods that require returning a checkout URL), you may abandon the order.
- When refunding: You must retry with the same
refundRequestId. Do not abandon the request.
The user paid successfully but I didn't receive a Webhook—what should I do?
The user paid successfully but I didn't receive a Webhook—what should I do?
- Verify that
notifyUrlis HTTPS and publicly reachable - Verify that the callback port is 80 or 443 (Waffo production only accepts standard ports)
- Verify that the response body is
{"message": "success"}and Content-Type isapplication/json - Verify that the response includes the
X-SIGNATUREheader - Proactively call the inquiry API to get the latest status
- If you still don’t receive it, contact Waffo technical support
Is the inquiry API required?
Is the inquiry API required?
- Query proactively when the user lands on a success/failure page to give the smoothest experience
- Retrieve the result for historical orders
- Fall back to the inquiry API when Webhook signature verification fails
Can I use multiple payment methods at the same time?
Can I use multiple payment methods at the same time?
payMethodType / payMethodName, the checkout displays all available payment methods for the user to choose from.Signature & security
What are the common reasons for signature verification failures?
What are the common reasons for signature verification failures?
- Incorrect private key format: The key must be in PKCS#8 format
- Incorrect signing content: The entire HTTP body must be signed; you cannot sign only selected fields
What are the minimum requirements for RSA keys?
What are the minimum requirements for RSA keys?
Can the sandbox and production environments use the same set of keys?
Can the sandbox and production environments use the same set of keys?
App integration
What should I pay attention to when integrating the checkout in a merchant App?
What should I pay attention to when integrating the checkout in a merchant App?
- Confirm that the App and WebView allow opening external Apps or external browser pages
- Confirm that the App and WebView support download, copy, and long-press save behavior. QR, OTC, and bank-transfer style payment methods may depend on these capabilities
- Confirm that query parameters are preserved when URLs are passed between the native App and WebView
- When loading via WebView, set
userTerminaltoAPP - For detailed limitations, see Payment method integration notes
Can merchants integrate Google Pay / Apple Pay on their own?
Can merchants integrate Google Pay / Apple Pay on their own?
| Comparison | Using Waffo checkout | Self-integration |
|---|---|---|
| GP/AP developer account | Not required | Required |
| Domain registration and verification | Required | Required |
| Managing encryption certificates/keys | Handled by Waffo | Managed by merchant |
| Server-side token processing/decryption | Handled by Waffo | Managed by merchant |
| PCI DSS compliance | Not required | May be required |
| Checkout UI | Provided by Waffo | Built by merchant |
| Integration complexity | Low | High |
Does PayMe payment launch the App?
Does PayMe payment launch the App?