Checkout
Tip
- All requests use
POST
- Content type is
application/json
Brief Description
Use this API to create a hosted checkout order and obtain the cashier page URL for the payer.
Request URL
Request Method
- Method: POST
- Content-Type: application/json
| Header |
Required |
Type |
Description |
| merchantNo |
Yes |
String |
Merchant number |
Body
| Parameter |
Required |
Type |
Description |
| sign |
Yes |
String |
The sign field is generated by sorting all fields except sign in alphabetical order and concatenating them as key1=value1key2=value2. Use app secret as salt for MD5 encryption. The sign field should be in lowercase. |
| timestamp |
Yes |
String |
Timestamp (e.g. 1715941383720) |
| tradeNo |
Yes |
String |
Unique transaction number (recommended format: yyyymmddhhmmss + random number) |
| amount |
Yes |
String |
Transaction amount: For KHR, only whole numbers are supported (unit: KHR). For USD, up to two decimal places are supported (unit: USD). |
| userId |
Yes |
String |
Merchant-side user identifier. This value must uniquely identify the user within the merchant system. |
| firstname |
Yes |
String |
Payer's legal first name. The submitted payer information must match the actual payer information. |
| lastname |
Yes |
String |
Payer's legal last name. The submitted payer information must match the actual payer information. |
| mobile |
Yes |
String |
The payer's actual mobile phone number. For Cambodia mobile numbers, the format should be 8 to 9 digits, excluding the country code. |
| email |
Yes |
String |
Payer's email address. |
| channelCode |
Yes |
String |
Refer to the Deposit WayCode appendix. |
| wayCode |
Yes |
String |
Refer to the Deposit WayCode appendix. |
| notifyUrl |
Yes |
String |
Asynchronous callback URL |
| returnUrl |
Yes |
String |
URL to redirect the customer after successful authorization |
| remark |
Yes |
String |
Remarks (this field will be returned asโis) |
Request Body Example
{
"sign": "8df3188b3c9a9b6dcd11a5f1b7f9a24e",
"timestamp": "1778918400000",
"tradeNo": "KHPI202605160001",
"amount": "30000",
"userId": "79x7p10nh4xd121m",
"mobile": "12345678",
"firstname": "Sok",
"lastname": "Dara",
"email": "sok.dara@example.com",
"channelCode": "KHQR",
"wayCode": "KHQR",
"notifyUrl": "https://merchant.example.com/webhooks/vexora/deposit",
"returnUrl": "https://merchant.example.com/payments/KHPI202605160001/return",
"remark": "checkout_KHPI202605160001"
}
Response
| Parameter |
Required |
Type |
Description |
| msg |
Yes |
String |
Request result (success only indicates successful request, not for merchant logic judgment) |
| code |
Yes |
String |
Request response code (0000 indicates successful request, not for merchant logic judgment). For specific error codes, refer to the business error code enumeration |
| timestamp |
Yes |
String |
Transaction time |
| success |
Yes |
String |
Transaction result |
| data |
Yes |
Object |
Response object |
| data.tradeNo |
Yes |
String |
Merchant transaction number |
| data.platFormTradeNo |
Yes |
String |
Unique transaction number |
| data.status |
Yes |
String |
Transaction results,Merchants can process subsequent workflows based on the returned status in the transaction result. For details, please refer to the status code reference table. |
| data.message |
Yes |
String |
Error description |
| data.remark |
Yes |
String |
Returned content of the request (as is) |
| data.paymentLink |
Yes |
String |
Hosted cashier URL |
| data.payInfo |
No |
String |
For payment information, the original QR code is currently returned only in the case of KHQR. |
| data.payInfoVA |
No |
Object |
VA payment information. Account information is returned when the payment method is VA. |
| data.payInfoVA.bankName |
No |
String |
Bank associated with the VA |
| data.payInfoVA.virtualAccountNumber |
No |
String |
VA account number |
| data.payInfoVA.virtualAccountHolder |
No |
String |
VA account holder name |
| data.payInfoVa.virtualAccountRemark |
No |
String |
Transaction remark. The payer must be reminded to fill in this remark when making the payment. |
| data.payInfoVA.registrationTimestamp |
No |
String |
VA creation time |
| data.payInfoVA.expirationTimestamp |
No |
String |
VA expiration time |
| data.payInfoVa.orderAmount |
No |
String |
Original order amount submitted by the merchant when the order was created. This amount does not change due to a subsidy. Downstream systems must subtract subsidyAmount from this value to calculate and display the actual amount payable by the user. The original order amount and the agreed clearing and settlement basis are not affected by the subsidy. |
| data.payInfoVa.subsidyAmount |
No |
String |
Subsidy amount applied to reduce the amount payable by the user. When there is no subsidy, the subsidy feature is disabled, or no subsidy rule is matched, a zero-value amount string is returned instead of an empty value; for example, USD returns "0.00". The original order amount and the agreed clearing and settlement basis are not affected by the subsidy. |
KHQR Successful Response Example
{
"msg": "success",
"code": "0000",
"timestamp": 1778918400123,
"success": true,
"data": {
"tradeNo": "KHPI202605160001",
"platFormTradeNo": "VXKHPI8F3K29D0QPLM7X2",
"status": "0015",
"message": "Processing",
"remark": "checkout_KHPI202605160001",
"paymentLink": "https://checkout.vexora.com/pay?token=khpi_8f3k29d0qplm7x2a9bc45de7812fg90",
"payInfo": "00020101021229390013khqr@vexora0109KHPI000102030208DaraSok5204599953031165405300005802KH5910VEXORA DEMO6010PHNOMPENH6304A13B"
}
}
VA Successful Response Example
{
"msg": "success",
"code": "0000",
"timestamp": 1778918400123,
"success": true,
"data": {
"tradeNo": "KHPI202605160002",
"platFormTradeNo": "VXKHPI9G4L30E1RQMN8Y3",
"status": "0015",
"message": "Processing",
"remark": "checkout_KHPI202605160002",
"paymentLink": "https://checkout.vexora.com/pay?token=khpi_9g4l30e1rqmn8y3b0cd56ef8923gh01",
"payInfoVA": {
"bankName": "ABA Bank",
"virtualAccountNumber": "123456789012",
"virtualAccountHolder": "VEXORA DEMO",
"registrationTimestamp": "2026-05-16 10:00:00",
"expirationTimestamp": "2026-05-16 11:00:00"
}
}
}