create payment link
method 2​
this method will create a payment link by a public divit endpoint. the difference between method 1 and this method is your server don't need to make a call. you can just create a payment link and put it on your front-end. the corresponding order will be created when your customer clicks on the link. the limitation is you need to predefine the webhook and success payment url in our system, and you can't provide any customer information.
endpoint: GET {{API_BASE_URL}}/directpay/c/{{merchantID}}/{{branchID}}/fps/act
here is the workflow diagram showing the whole payment process.

steps:
- merchant server create signed URL and render it on the merchant website (step 1)
- customer clicks on the link (step 2)
- divit server creates payment record and redirect user to the payment screen (step 3 - 4)
- customer makes a payment, bank transfer money to divit account (step 5 - 6)
- bank send real-time credit notification to divit server (step 7)
- divit sends webhook call to merchant server, and push notification to divit payment screen (step 8 - 9)
- divit payment screen redirect user back to merchant website (step 10)
configuration​
you need to predefine the webhook endpoint and redirect URLs at the branch details page of the admin-portal.

link type | explanation |
---|---|
paymentWebhookEndpoint | your server endpoint to receive our webhook events. details here |
paymentSuccessScreen | when payment is complete, we will redirect customer to this URL |
paymentFailureScreen | when payment is cancelled, we will redirect customer to this URL |
constructing payment link​
to construct the payment link, you will need to get 3 pieces of information from divit admin-portal:
merchantID
: your merchant account IDbranchID
: each merchant can have multiple branches, if you are freshly signed up, a default branch has already been created for you.- signature key: find the value at the corresponding branch details page at the admin-portal
constructs the payment link by providing the following parameters:
amount
: payment amountcurrency
: currencyexpiredAt
: the unix time that the payment will be expired, e.g. 86400 for 1 day of expirymerchantRef
: unique reference of your order
signs the concatenated string of parameters and a timestamp with the following logic:
// the signature-key should be kept in server-side,
// the following logic should not be run on the front-end, this is just for demo purpose.
//
const signatureKey = `${SIGNATURE KEY}`;
const merchantID = `${YOUR_MERCHANT_ID}`;
const branchID = `${YOUR_BRANCH_ID}`;
const timestamp = 1736845297;
const stringTobeSigned = `/directpay/c/${merchantID}/${branchID}/fps/act?amount=1200¤cy=HKD&expiredAt=1736848897&merchantRef=BspR8bFE`;
let hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, signatureKey);
hmac.update(`${timestamp}:${stringTobeSigned}`);
const signature = hmac.finalize().toString(CryptoJS.enc.Base64);
const host = "{{API_BASE_URL}}";
const actionLink = `${host}${stringTobeSigned}&signature=${encodeURIComponent(signature)}×tamp=${timestamp}`;
caution
the sorting of the parameters will affect the signature output. please make sure they are arranged correctly when you calculating the signature
sample payment link​
<a href="https://sandbox-api.divit.dev/directpay/c/4303c954-afbf-463c-ae37-bdcff2ac106a/69a14250-5459-4980-b47b-2096e19c5087/fps/act?amount=1200¤cy=HKD&expiredAt=1736848897&merchantRef=BspR8bFE&signature=NrrFakSrjZGF6Bg7rhNfyqfCkLjfTOvt%2Bcvf0Rbq5gM%3D×tamp=1736845297">pay now</a>
payment screen​
clicking the payment link will call our server endpoint to create a payment request record instantly, it will then redirect your customer to our payment screen
open the bank app directly​
divit facilitates web-to-app (app-to-app) payments, allowing you to open a banking app with all payment information pre-filled with just one click from the payment screen.
info
using this method 2 request, you can redirect users to their bank's app instead of displaying our payment screen. please contact our support team for more details.
error response​
since the payment link access our public api-endpoint, the error message will be returned as a plain text json message, e.g.
{"code":1013,"message":"failed to load merchant data","errorData":"sql: no rows in result set"}