Here are preparation list you might required during this integration:
Authorizing Your Request
The important thing that you need to know when you want to perform a direct integration is the API authentication. By default, all of Indodana Merchant API endpoints are secured and you will need to authenticate your request. To be able to execute the API successfully, you will need to authorize yourself by presenting a valid Authorizationheader in your HTTP request.
To generate the Authorization header, please refer to the following snippets of code.
As you can see, the content of Authorization header is generated by creating a sha256 hash of apiKey:nonce. The sha256 hash algorithm should take the MERCHANT_SECRET_KEY as the secret key. The example result of the above snippets when you try to ran the code should be as follow
After you have successfully created the Authorization header, then you can proceed on the next step to develop the integration according to scenario:
Check transaction status
Refund / cancel transaction
Purchase Transaction Checkout
POSThttps://{baseUrl}/v3/checkout_url
This checkout API v3 enables QuickPay integration. You need to pass valid x-user-token on the header so user can enjoy the easy & fast checkout experience.
Don't worry if you don't have the Indodana QuickPay user token for current checkout user in the first place, our checkout page already handle the flow and you need to store the token every time Indodana sends the token via callback to your system and use this token for subsequent transaction.
In times of operating, there are several times that you may need to provide / check the status of the transaction (e.g: at the time of customer inquiry, or when you need to synchronize the state of the transaction). Indodana has provided an API endpoint for the merchants to easily check their transaction status.
There are several transaction statuses that the merchant needs to be aware of:
INITIATED - Transaction has been created by Indodana
EXPIRED - Customer failed to complete the transaction
PAID - Transaction passed the fraud detection and is confirmed to-be-paid by Indodana
REJECTED - If the transactions is identified as fraudulent transactions or in blacklisted merchants
It's really simple to check your transaction status. This is the code that will be required to perform the transaction status check.
constPromise=require('bluebird')constsuperagent=Promise.promisifyAll(require('superagent'));constpath=require('path')// Variable authorization should contain value of : // 'Bearer <api-key>:<nonce>:<signature>'var authorization =generateAuthorizationHeader()var baseUrl ="https://stg-k-api.indodanafinance.com/chermes/merchant"var endpoint =`${baseUrl}/v1/transactions/qris/check_status`var payload = {"merchantOrderId":"<MERCHANT-ORDER-ID>"}superagent.get(endpoint).set('Authorization', authorization).query(payload).send().endAsync().then(response => {// Do something with response.bodyconsole.log(response.body) }).catch(err => {// Handle errorconsole.log(err.response.text) });
Merchant is able to void / cancel a completed transaction. Note that, there are two types of cancellation. The first is FULL CANCELLATION - when the amount that is posted in the Refund / Cancellation request is the same as the transaction amount. The second is PARTIAL CANCELLATION - when the amount that is posted in the Refund / Cancellation request is different / less than the transaction amount.
It is required for merchant to include the cancellation reason, the preferred cancellation reason that given to Indodana are:
Expired - when the seller does not give a response for the transaction after the predetermined time
Out of Stock - when the seller does not give a response for the transaction after the predetermined time
Items Returned - when the customer has cancelled the transaction because there was an issue with the item
Others - any other reason beside the three above
Full Cancellation
constPromise=require('bluebird')constsuperagent=Promise.promisifyAll(require('superagent'));constpath=require('path')// Variable authorization should contain value of : // 'Bearer <api-key>:<nonce>:<signature>'var authorization =generateAuthorizationHeader()var baseUrl ="https://stg-k-api.indodanafinance.com/chermes/merchant"var endpoint =`${baseUrl}/v3/order_cancellation`var payload = {"refundId":"<MERCHANT-REFUND-ID>","merchantOrderId":"<MERCHANT-ORDER-ID>","cancellationAmount":100000,"cancellationReason":"Out of stock","cancelledBy":"<SELLER/CUSTOMER>","cancellationDate":"2019-09-12T18:18:18+07:00"}superagent.post(endpoint).set('Authorization', authorization).send(payload).endAsync().then(response => {// Do something with response.bodyconsole.log(response.body) }).catch(err => {// Handle errorconsole.log(err.response.text) });
Indodana QuickPay user token. You can pass null if user account not connected yet in your platform.
Authorization*
string
The generated authentication signature with format
Bearer {api_key}:{nonce}:{signature}
merchantUserKey*
string
User identifier in merchant's platform. Indodana will send the Indodana QuickPay user token alongside this information so you know the owner of the token.
transactionDetails*
object
<Transaction> - Detail of the transaction.
customerDetails*
object
<Customer> -Detail of the customer.
sellers*
array
Array of <Seller> - Detail of the sellers involved in the transaction. May contain more than 1 seller.
billingAddress*
object
<Address> - Billing address of the customer for the transaction.
shippingAddress*
string
(Required only for goods, for service / digital product is not required) <Address> - Shipping address of the customer for the transaction.
paymentType*
string
(Required for active Indodana QuickPay user token) Installment options / payment terms chosen by the customer. Possible values: 30_days, 3_months, 6_months, 12_months
approvedNotificationUrl*
string
The URL that will be called by Indodana when the transaction is approved and successful.
cancellationRedirectUrl*
string
The URL for user to be redirected if transaction's cancelled in Indodana's checkout page.
backToStoreUrl*
string
The URL for user to be redirected after completes the checkout process.
expirationAt
string
Timestamp when the transaction expired on merchant's platform.
metadata
object
Key value pair contains additional information of transaction