Integration Guide
Preparation
Make sure you already have Client ID & Secret Key to continue this section. Please refer to this section.
Integration steps
Here is the overview of how to integrate with Checkout:
- Obtain
payment.url
on Backend - Display DOKU Checkout Payment Page on Frontend
- Create test payment
- Acknowledge payment result
Checkout Sequence Diagram
.jpg)
1. Obtain payment.url
on Backend
To obtain the payment.url
, you will need to hit this API through your Backend:
API Request
Type | Value |
---|---|
HTTP Method | POST |
API endpoint (Sandbox) | https://api-sandbox.doku.com/checkout/v1/payment |
API endpoint (Production) | https://api.doku.com/checkout/v1/payment |
Here is the sample of request header to obtain payment.url
:
Client-Id: MCH-0001-10791114622547
Request-Id: fdb69f47-96da-499d-acec-7cdc318ab2fe
Request-Timestamp: 2020-08-11T08:45:42Z
Signature: HMACSHA256=1jap2tpgvWt83tG4J7IhEwUrwmMt71OaIk0oL0e6sPM=
Request Header Explanation
Parameter | Description |
---|---|
Client-Id | Client ID retrieved from DOKU Back Office |
Request-Id | Unique random string (max 128 characters) generated from merchant side to protect duplicate request |
Request-Timestamp | Timestamp request on UTC time in ISO8601 UTC+0 format. It means to proceed transaction on UTC+7 (WIB), merchant need to subtract time with 7. Ex: to proceed transaction on September 22th 2020 at 08:51:00 WIB, the timestamp should be 2020-09-22T01:51:00Z |
Signature | Security parameter that needs to be generated on merchant Backend and placed to the header request to ensure that the request is coming from valid merchant. Please refer to this section to generate the signature |
Here is the sample of request body to obtain payment.url
, you can send a simple request for a basic payment page and you can send the parameter according to your needs:
- Basic Request
- Full Request
{
"order": {
"amount": 20000,
"invoice_number": "INV-20210231-0001"
},
"payment": {
"payment_due_date": 60
}
}
Request Body Explanation
Parameter | Type | Mandatory | Description |
---|---|---|---|
order.amount | number | Mandatory | In IDR Currency and without decimal Allowed chars: numeric Max length: 12 |
order.invoice_number | string | Mandatory | Generated by merchant to identify the order Allowed chars: alphabetic, numeric, special chars Max length: 64 Notes: If you have Credit Card channel activated, the maximum length is 30 chars due to the acquirer's requirements |
payment.payment_due_date | number | Mandatory | In minutes Allowed chars: numeric Max Length: 8 |
{
"order": {
"amount": 80000,
"invoice_number": "INV-{{$timestamp}}",
"currency": "IDR",
"callback_url": "http://doku.com/",
"callback_url_cancel": "https://doku.com",
"language":"EN",
"auto_redirect":true,
"disable_retry_payment" :true,
"line_items": [
{
"id":"001",
"name":"Fresh flowers",
"quantity":1,
"price":40000,
"sku": "FF01",
"category": "gift-and-flowers",
"url": "http://doku.com/",
"image_url":"http://doku.com/",
"type":"ABC"
},
{
"id":"002",
"name":"T-shirt",
"quantity":1,
"price":40000,
"sku": "T01",
"category": "clothing",
"url": "http://doku.com/",
"image_url":"http://doku.com/",
"type":"ABC"
}
]
},
"payment": {
"payment_due_date": 60,
"payment_method_types": [
"VIRTUAL_ACCOUNT_BCA",
"VIRTUAL_ACCOUNT_BANK_MANDIRI",
"VIRTUAL_ACCOUNT_BANK_SYARIAH_MANDIRI",
"VIRTUAL_ACCOUNT_DOKU",
"VIRTUAL_ACCOUNT_BRI",
"VIRTUAL_ACCOUNT_BNI",
"VIRTUAL_ACCOUNT_BANK_PERMATA",
"VIRTUAL_ACCOUNT_BANK_CIMB",
"VIRTUAL_ACCOUNT_BANK_DANAMON",
"ONLINE_TO_OFFLINE_ALFA",
"CREDIT_CARD",
"DIRECT_DEBIT_BRI",
"EMONEY_SHOPEEPAY",
"EMONEY_OVO",
"QRIS",
"PEER_TO_PEER_AKULAKU",
"PEER_TO_PEER_KREDIVO",
"PEER_TO_PEER_INDODANA"
]
},
"customer":{
"id":"JC-01",
"name":"Zolanda",
"last_name":"Anggraeni",
"phone":"628121212121",
"email": "zolanda@example.com",
"address":"taman setiabudi",
"postcode":"120129",
"state":"Jakarta",
"city":"Jakarta Selatan",
"country":"ID"
},
"shipping_address":{
"first_name":"Zolanda",
"last_name":"Anggraeni",
"address":"Jalan Teknologi Indonesia No. 25",
"city":"Jakarta",
"postal_code":"12960",
"phone":"081513114262",
"country_code":"IDN"
},
"billing_address":{
"first_name":"Zolanda",
"last_name":"Anggraeni",
"address":"Jalan Teknologi Indonesia No. 25",
"city":"Jakarta",
"postal_code":"12960",
"phone":"081513114262",
"country_code":"IDN"
},
"additional_info":{
"allow_tenor" : [0,3,6,12],
"close_redirect" : "www.doku.com",
"doku_wallet_notify_url" : "https://dw-notify.free.beeceptor.com"
}
}
Request Body Explanation
Parameter | Type | Mandatory | Description |
---|---|---|---|
order.amount | number | Mandatory | In IDR Currency and without decimal Allowed chars: numeric Max length: 12 |
order.invoice_number | string | Mandatory | Generated by merchant to identify the order Allowed chars: alphabetic, numeric, special chars Max length: 64 Notes: If you have Credit Card channel activated, the maximum length is 30 chars due to the acquirer's requirements |
order.currency | string | Optional | 3 alphabetic currency code ISO 4217 Allowed chars: alphabetic Min-max Length: 3 Default value: IDR |
order.callback_url | string | Conditional | Merchant URL that will redirected to after the order completed. This paramater mandatory if you want to use Jenius Allowed chars: alphabetic, numeric, special chars |
order.callback_url_cancel | string | Conditional | Merchant URL that will redirected if order cancelled. Allowed chars: alphabetic, numeric, special chars. This parameter mandatory for payment channel Indodana Allowed chars:^[a-zA-Z0-9()\-=\\.\?;,+\/:&_ %]$# |
order.language | string | Optional | Default language shown when redirect to checkout page Max length: 2 |
order.auto_redirect | boolean | Mandatory | If true : Result transaction page redirect to callback url. If false : Result transaction page redirect to payment result |
order.disable_retry_payment | boolean | Conditional | Only applied if merchant sends this parameter with value true . If the merchant does not send this parameter or send false or the customer fails to pay, the result page will appear in Checkout and the customer can retry payment or change payment options (if there are more than one channel option). Applied for : Credit Card , DOKU Wallet , Akulaku , OVO , ShopeePay |
order.line_items.id | string | Conditional | SKU/item ID of the item in this transaction. This parameter is mandatory if you want to use Akulaku, Kredivo and Indodana. Allowed chars: alphabetic, numeric, special chars Max Length: 64 |
order.line_items.name | string | Conditional | Name of the product item. This parameter is mandatory if you want to use Kredivo, Jenius and Indodana Allowed chars: alphabetic, numeric, special chars Max Length: 255 |
order.line_items.price | number | Conditional | Price of the product item. Total price and quantity must match with the order.amount . This paramater mandatory if you want to use Kredivo, Akulaku and JeniusAllowed chars: numeric Max Length: 12 |
order.line_items.quantity | number | Conditional | Quantity of the product item. This paramater mandatory if you want to use Kredivo, Akulaku, Indodana and Jenius Allowed chars: numeric Max Length: 4 |
order.line_items.sku | string | Conditional | SKU of the product item. This paramater mandatory if you want to use Kredivo, Akulaku and Indodana. |
order.line_items.category | string | Conditional | Category of the product item. This paramater mandatory if you want to use Kredivo, Akulaku and Indodana. |
order.line_items.url | string | Conditional | URL to the product item on merchant site. This paramater mandatory if you want to use Kredivo and Indodana. |
order.line_items.image_url | string | Conditional | URL the image of the product item on merchant site. This paramater mandatory if you want to use Indodana. |
order.line_items.type | string | Conditional | Type of the item in this transaction. This paramater mandatory if you want to Indodana. |
payment.payment_method_types | array | Optional | Payment method that will shown to users in Checkout Page. Payment method list available in the section below Default: All channels that active on your account |
payment.payment_due_date | number | Mandatory | In minutes Allowed chars: numeric Max Length: 8 |
customer.id | string | Conditional | Unique customer identifier generated by merchant. This parameter mandatory to enable Tokenized payments (Direct Debit, Credit Card tokenization) and Akulaku. Allowed chars: alphabetic, numeric, special chars Max Length: 50 |
customer.name | string | Conditional | Customer name. This parameter mandatory to enable Akulaku, Indodana and Jenius. Allowed chars: alphabetic Max Length: 255 |
customer.last_name | string | Optional | Customer last name. Allowed chars: alphabetic ,numeric ,special chars Max Length: 16 |
customer.email | string | Conditional | Customer email. This parameter mandatory to enable Indodana Allowed chars: alphabetic, numeric, special chars Max Length: 128 |
customer.phone | string | Conditional | Customer phone number. This parameter mandatory to enable Indodana and Jenius. Format: {calling_code}{phone_number} . Example: 6281122334455Allowed chars: numeric Max Length: 16 |
customer.address | string | Conditional | Customer address. This parameter mandatory to enable Akulaku. Allowed chars: alphabetic, numeric, special chars Max Length: 400 |
customer.postcode | string | Conditional | Customer postcode. This parameter mandatory to enable Akulaku. |
customer.state | string | Conditional | Customer state. This parameter mandatory to enable Akulaku. |
customer.city | string | Conditional | Customer city. This parameter mandatory to enable Akulaku. |
customer.country | string | Optional | 2 alphabetic country code ISO 3166-1 Allowed chars: alphabetic Min-max Length: 2 |
shipping_address.first_name | string | Conditional | Customer's first name used as shipping address. This parameter mandatory if you want to use Kredivo and Indodana. |
shipping_address.last_name | string | Optional | Customer's last name used as shipping address. |
shipping_address.address | string | Conditional | Customer's address used as shipping address. This parameter mandatory if you want to use Kredivo and Indodana. |
shipping_address.city | string | Conditional | City of customer's shipping address. This parameter mandatory if you want to use Kredivo and Indodana. |
shipping_address.postal_code | string | Conditional | Postal code of customer's shipping address. This parameter mandatory if you want to use Kredivo and Indodana. |
shipping_address.phone | string | Conditional | Customer's phone used as shipping address. This parameter mandatory if you want to use Kredivo and Indodana. |
shipping_address.country_code | string | Conditional | Country of customer's shipping address. This parameter mandatory if you want to use Kredivo and Indodana. |
billing_address.first_name | string | Conditional | Customer's first name used as billing address. This parameter mandatory if you want to use Indodana. |
billing_address.last_name | string | Conditional | Customer's last name used as billing address. This parameter mandatory if you want to use Indodana. |
billing_address.address | string | Conditional | Customer's address used as billing address. This parameter mandatory if you want to use Indodana. |
billing_address.city | string | Conditional | City of customer's billing address. This parameter mandatory if you want to use Indodana. |
billing_address.postal_code | string | Conditional | Postal code of customer's billing address. This parameter mandatory if you want to use Indodana. |
billing_address.phone | string | Conditional | Customer's phone used as billing address. This parameter mandatory if you want to use Indodana. |
billing_address.country_code | string | Conditional | Country of customer's billing address. This parameter mandatory if you want to use Indodana. |
additional_info.allow_tenor | number | Optional | Transaction only accept installment tenor listed here 0,3,6,12 . If you want to hide the βno installmentβ option, please do not put 0 (zero) in the parameter |
additional_info.close_redirect | string | Optional | Merchant can set the URL redirect of checkout page iframe |
additional_info.doku_wallet_notify_url | string | Optional | Notification url set in this parameter, only for doku wallet payment channel |
Pro Tips
You can define the payment method that will be shown in the payment page through the DOKU Back Office or by inputing the array list of payment method in the payment.payment_method_types
. If you send only one payment method, then your customer will redirected directly to defined payment method.
Payment Method List
Here is the payment method list available:
- Virtual Account
- Online to Offline
- Credit Card
- E-money
- Direct Debit
- Paylater
Name | Value |
---|---|
BCA VA | VIRTUAL_ACCOUNT_BCA |
Bank Mandiri VA | VIRTUAL_ACCOUNT_BANK_MANDIRI |
Bank Syariah Indonesia VA | VIRTUAL_ACCOUNT_BANK_SYARIAH_MANDIRI |
BRI VA | VIRTUAL_ACCOUNT_BRI |
BNI VA | VIRTUAL_ACCOUNT_BNI |
DOKU VA | VIRTUAL_ACCOUNT_DOKU |
PERMATA VA | VIRTUAL_ACCOUNT_PERMATA |
CIMB VA | VIRTUAL_ACCOUNT_CIMB |
Danamon VA | VIRTUAL_ACCOUNT_DANAMON |
Name | Value |
---|---|
Alfa Group (Alfamart, Alfamidi, Dan+Dan) | ONLINE_TO_OFFLINE_ALFA |
Name | Value |
---|---|
Credit Card | CREDIT_CARD |
Name | Value |
---|---|
QRIS | QRIS |
OVO | EMONEY_OVO |
SHOPEE PAY | EMONEY_SHOPEE_PAY |
DOKU WALLET | EMONEY_DOKU |
Name | Value |
---|---|
Direct Debit BRI | DIRECT_DEBIT_BRI |
Name | Value |
---|---|
AKULAKU | PEER_TO_PEER_AKULAKU |
KREDIVO | PEER_TO_PEER_KREDIVO |
INDODANA | PEER_TO_PEER_INDODANA |
API Response
After hitting the above API request, DOKU will give the response.
Here is the sample of response header:
Type | Value |
---|---|
HTTP Status | 200 |
Result | SUCCESS |
Client-Id: MCH-0001-10791114622547
Request-Id: fdb69f47-96da-499d-acec-7cdc318ab2fe
Response-Timestamp: 2020-08-11T08:45:42Z
Signature: HMACSHA256=vl9DBTX5KhEiXmnpOD0TSm8PYQknuHPdyHSTSc3W6Ps=
Response Header Explanation
Parameter | Description |
---|---|
Client-Id | Same as the request |
Request-Id | Same as the request |
Response-Timestamp | Timestamp Response on UTC with format ISO8601 UTC+0 from DOKU |
Signature | Signature generated by DOKU based on the response body |
Here is the sample of response body:
{
"message": [
"SUCCESS"
],
"response": {
"order": {
"amount": "80000",
"invoice_number": "INV-1677749345",
"currency": "IDR",
"session_id": "f3cc59e620c54b2aaa773f6ed6a98895",
"callback_url": "http://doku.com/",
"callback_url_cancel": "https://doku.com",
"line_items": [
{
"name": "Fresh flowers",
"quantity": 1,
"price": "40000",
"sku": "FF01",
"category": "gift-and-flowers",
"url": "http://doku.com/",
"image_url": "http://doku.com/",
"type": "ABC"
},
{
"name": "T-shirt",
"quantity": 1,
"price": "40000",
"sku": "T01",
"category": "clothing",
"url": "http://doku.com/",
"image_url": "http://doku.com/",
"type": "ABC"
}
],
"language": "EN",
"disable_retry_payment": true,
"auto_redirect": true
},
"payment": {
"payment_method_types": [
"CREDIT_CARD",
"ONLINE_TO_OFFLINE_ALFA",
"VIRTUAL_ACCOUNT_BCA",
"DIRECT_DEBIT_BRI",
"CREDIT_CARD",
"QRIS",
"VIRTUAL_ACCOUNT_BANK_PERMATA",
"PEER_TO_PEER_KREDIVO",
"EMONEY_OVO",
"VIRTUAL_ACCOUNT_BANK_DANAMON",
"PEER_TO_PEER_INDODANA",
"PEER_TO_PEER_AKULAKU",
"VIRTUAL_ACCOUNT_BANK_CIMB",
"VIRTUAL_ACCOUNT_BANK_MANDIRI",
"VIRTUAL_ACCOUNT_DOKU",
"VIRTUAL_ACCOUNT_BNI",
"VIRTUAL_ACCOUNT_BRI",
"VIRTUAL_ACCOUNT_BANK_SYARIAH_MANDIRI"
],
"payment_due_date": 180,
"token_id": "f3cc59e620c54b2aaa773f6ed6a9889520232902162906009",
"url": "https://app-uat.doku.com/checkout/link/f3cc59e620c54b2aaa773f6ed6a9889520232902162906009",
"expired_date": "20230302192904"
},
"customer": {
"id": "JC-01",
"state": "Jakarta",
"city": "Jakarta Selatan",
"postcode": "120129",
"email": "zolanda@example.com",
"phone": "628121212121",
"name": "Zolanda",
"last_name": "Anggraeni",
"address": "taman setiabudi",
"country": "ID"
},
"additional_info": {
"allow_tenor": [
0,
3,
6,
12
],
"close_redirect": "www.doku.com",
"doku_wallet_notify_url": "https://dw-notify.free.beeceptor.com",
"doku_wallet_sac_id": "SAC_001"
},
"uuid": 2225230302162905985107180586827000113908,
"headers": {
"request_id": "32a53bdd-a94d-4ee1-bd1a-854a2f7cffb5",
"signature": "HMACSHA256=tK3zNthfy1FOUiJdKhJTf5N6Lzx4rmcPXQDxLJhonqk=",
"date": "2023-03-02T09:29:04Z",
"client_id": "MCH-0003-8279340109246"
},
"shipping_address": {
"address": "Jalan Teknologi Indonesia No. 25",
"city": "Jakarta",
"phone": "081513114262",
"first_name": "Zolanda",
"last_name": "Anggraeni",
"postal_code": "12960",
"country_code": "IDN"
},
"billing_address": {
"address": "Jalan Teknologi Indonesia No. 25",
"city": "Jakarta",
"phone": "081513114262",
"first_name": "Zolanda",
"last_name": "Anggraeni",
"postal_code": "12960",
"country_code": "IDN"
}
}
}
Response Body Explanation
Parameter | Type | Mandatory | Description |
---|---|---|---|
message | array | Mandatory | Message will display the result of the request. If there are some errors on your request, they will be diplayed in this parameter. |
response.order.amount | number | Mandatory | Same as the request |
response.order.invoice_number | string | Mandatory | Same as the request |
response.order.currency | string | Optional | Same as the request |
response.order.session_id | string | Optional | Unique session ID generated by DOKU |
response.order.callback_url | string | Optional | Same as the request |
response.order.callback_url_cancel | string | Optional | Same as the request |
response.order.line_items.name | string | Optional | Same as the request |
response.order.line_items.quantity | number | Optional | Same as the request |
response.order.line_items.price | number | Optional | Same as the request |
response.order.line_items.sku | string | Optional | Same as the request |
response.order.line_items.category | string | Optional | Same as the request |
response.order.line_items.url | string | Optional | Same as the request |
response.order.line_items.image_url | string | Optional | Same as the request |
response.order.line_items.type | string | Optional | Same as the request |
response.order.language | string | Optional | Same as the request |
response.order.disable_retry_payment | boolean | Optional | Same as the request |
response.order.auto_redirect | boolean | Optional | Same as the request |
response.payment.payment_method_types | array | Optional | Payment method that will be displayed on the Checkout Page |
response.payment.payment_due_date | number | Mandatory | Same as the request |
response.payment.token_id | string | Mandatory | Token generated by DOKU for the Checkout Page |
response.payment.url | string | Mandatory | Checkout page URL to display for the customer |
response.payment.expired_date | string | Mandatory | Date time of payment page will be expired with the format of yyyyMMddHHmmss . The expired date uses UTC+7 time. Use this to set the expiry order on merchant side |
response.customer.id | string | Optional | Same as the request |
response.customer.state | string | Optional | Same as the request |
response.customer.city | string | Optional | Same as the request |
response.customer.postcode | string | Optional | Same as the request |
response.customer.email | string | Optional | Same as the request |
response.customer.phone | string | Optional | Same as the request |
response.customer.name | string | Optional | Same as the request |
response.customer.last_name | string | Optional | Same as the request |
response.customer.address | string | Optional | Same as the request |
response.customer.country | string | Optional | Same as the request |
response.additional_info.allow_tenor | string | Optional | Same as the request |
response.additional_info.close_redirect | string | Optional | Same as the request |
response.additional_info.doku_wallet_notify_url | string | Optional | Same as the request |
response.uuid | string | Optional | Unique number generated by DOKU |
response.headers.requestId | string | Optional | Same as the request |
response.headers.signature | string | Optional | Same as the request |
response.headers.date | string | Optional | Same as the request |
response.headers.clientId | string | Optional | Same as the request |
response.shipping_address.address | string | Optional | Same as the request |
response.shipping_address.city | string | Optional | Same as the request |
response.shipping_address.phone | string | Optional | Same as the request |
response.shipping_address.first_name | string | Optional | Same as the request |
response.shipping_address.last_name | string | Optional | Same as the request |
response.shipping_address.postal_code | string | Optional | Same as the request |
response.shipping_address.country_code | string | Optional | Same as the request |
response.billing_address.address | string | Optional | Same as the request |
response.billing_address.city | string | Optional | Same as the request |
response.billing_address.phone | string | Optional | Same as the request |
response.billing_address.first_name | string | Optional | Same as the request |
response.billing_address.last_name | string | Optional | Same as the request |
response.billing_address.postal_code | string | Optional | Same as the request |
response.billing_address.country_code | string | Optional | Same as the request |
2. Display DOKU Checkout Payment Page on Frontend
Once you have the payment.url
, you can now display the payment page by embedding the DOKU Checkout JS on your HTML file.
Simply import the jokul-checkout-1.0.0.js
and then call the loadJokulCheckout()
with the payment.url
:
Type | Value |
---|---|
JS Sandbox | https://sandbox.doku.com/jokul-checkout-js/v1/jokul-checkout-1.0.0.js |
JS Production | https://jokul.doku.com/jokul-checkout-js/v1/jokul-checkout-1.0.0.js |
Alternative Implementation
If you want your customers redirected to the payment page instead the payment page is popped up on your website, you can simply use the payment.url
value without importing the JS file.
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://sandbox.doku.com/jokul-checkout-js/v1/jokul-checkout-1.0.0.js"></script>
</head>
<body>
<button id="checkout-button">Checkout Now</button>
<script type="text/javascript">
var checkoutButton = document.getElementById('checkout-button');
// Example: the payment page will show when the button is clicked
checkoutButton.addEventListener('click', function () {
loadJokulCheckout('https://jokul.doku.com/checkout/link/SU5WFDferd561dfasfasdfae123c20200510090550775'); // Replace it with the response.payment.url you retrieved from the response
});
</script>
</body>
</html>
Viewport
The viewport
on the <head>
tag is important to ensure that the payment page is load correctly.
After implementing the steps above, you can see the Checkout as follows:

Or you can try the demo here:
Try Checkout Demo3. Creating Test Payment
Create a test payment to make sure that the DOKU Checkout has been successfully integrated. Simply initiate the payment from your page and then make the payment from our Simulator.
After the payment is completed, your customers will be redirected to callback_url
that defined in the request.
4. Acknowledge payment result
After the payment is being made by your customer, DOKU will send HTTP Notification to your defined Notification URL
. Learn how to handle the notification from DOKU:
Checkout Implementation
Checkout User Experience is designed to increase merchant's payment success rate, meaning that it allows merchant's customers to change payment method if one is failed. Therefore, merchant must ignore the transaction.status
FAILED
. Instead, merchant are required to set the expiry time on merchant side based on the payment.expired_date
in the API response, so that if there is no SUCCESS
transaction in between the time period, then merchant must flag the transaction status as cancelled on their side.
Additional features
We provide various additional features to suited your needs. Learn more here.
Custom Checkout Page Color
You can change the Checkout page color according to your brand color to make a good harmony with your brand. Follow the given steps:
Checkout Custom Color

- Login to DOKU Back Office
- Go to Configuration > Checkout Page
- Scroll to Interface Settings
- Fill the color with the HEX color code you wish for each element of the checkout page. For example:
#FFFFFF
- Click Save Interface Configuration button
Track Checkout Page with Google analytics
If you wish to track the usage of the checkout page through your Google Analytics, please follow given steps below:
Checkout Google Analytics

- Login to DOKU Back Office
- Go to Configuration > Checkout Page
- Scroll to System Settings section
- Input your Google Analytics tracking ID
- Click Save button
QRIS on Checkout
Activation
If you are interested to activate QRIS on Checkout, you can contact our team to get sandbox credential and production credential.
After you have the credential, you can setup the QRIS credential according to the environment (sandbox / production). Here is the steps:
Checkout QRIS Activation

- Login to DOKU Back Office
- Go to Configuration > Checkout Page
- Scroll to QRIS credential
- Input the credential given
- Click Submit button
- Your customer can now see the QRIS at the Checkout Payment Page
Integration
After you activated the QRIS on the Checkout Configuration, you should now see QRIS as one of the payment method available for your customers.
Checkout QRIS Payment Interface

Testing Payment
You can simulate the payment through our simulator.
Payment Notification
To receive payment notification, please inform the notification URL that you wish to receive the notification to our integration team. After our integration team configured it for you, then you will receive the notification.
The notification format will not be the same with other DOKU channel, here is the notification format for QRIS:
Type | Value |
---|---|
HTTP Method | POST |
Request Parameters
Name | Description |
---|---|
TXNDATE | Transaction Date time Format: yyyyMMddHHmmss |
TXNSTATUS | Transaction status Possible value: S for Success, F for Failed |
ACQUIRER | Acquirer name Allowed chars: alphabetic, numeric, special characters |
MERCHANTPAN | Merchant DOKU QRIS PAN Allowed chars: alphabetic, numeric, special characters |
ISSUERNAME | Issuer name Allowed chars: alphabetic, numeric, special characters |
ISSUERID | Issuer ID Allowed chars: numeric |
CONVENIENCEFEE | Convenience Fee Allowed chars: numeric Format: XXXX |
INVOICE | Purchase payment Invoice number Allowed chars: alphabetic, numeric, special characters |
AMOUNT | Purchase amount Allowed chars: numeric Format: XXXX |
TRANSACTIONID | Transaction ID generated by DOKU Allowed chars: alphabetic, numeric |
WORDS | Security parameter from DOKU. Hashed SHA1 from element: (ISSUERID + TXNDATE + MERCHANTPAN + INVOICE + sharedKey) |
CUSTOMERPAN | Customer QRIS PAN Allowed chars: alphabetic, numeric, special characters |
TERMINALID | Terminal ID from QR Allowed chars: alphabetic, numeric, special characters |
ORIGIN | Transaction origin Possible value: ONUS, INBOUND |
REFERENCEID | Reference number from issuer Allowed chars: alphabetic, numeric, special characters |
Validate WORDS
You must validate the WORDS
to ensure the authenticity of the notification is coming from DOKU.
Split Settlement
If you are a platform or a marketplace, you can use this feature to settle the funds to your sellers or partners programmatically, save many operational efforts.
What's next?
Congratulations! Now you are ready for going live. Make sure you have registered to our Production environment and the business has been approved by our team.