Skip to main content

Payment solution RM 1

Overview

  • Creating payments
  • Creating payouts

Certificate Setup

To generate API certificate for payment, visit: https://merchant.alikassa.com/cabinet/form/setting-api-certs

Save the archive and unpack to get:

  • password.txt
  • private.pem
  • public.pem

We keep only public.pem for signature verification.

Signature Generation

$data = json_encode($data);

$privateKey = openssl_pkey_get_private(
file_get_contents('private.pem'),
file_get_contents('password.txt')
);

if ($privateKey === false) {
throw new \Exception('Error cert.');
}

openssl_sign($data, $sign, $privateKey);
$sign = base64_encode($sign);
import { readFileSync } from 'fs';
import { createSign } from 'crypto';

const dataStr = JSON.stringify(data);
const key = readFileSync('private.pem', 'utf8');
const passphrase = readFileSync('password.txt', 'utf8').trim();
const signer = createSign('SHA256');
signer.update(dataStr);
signer.end();
const sign = signer.sign({ key, passphrase }, 'base64');
import json, base64
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding

data_bytes = json.dumps(data).encode()
with open('password.txt','rb') as f:
password = f.read().strip()
with open('private.pem','rb') as f:
private_key = serialization.load_pem_private_key(f.read(), password=password)
signature = private_key.sign(data_bytes, padding.PKCS1v15(), hashes.SHA256())
sign = base64.b64encode(signature).decode()
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.Signature;
import java.util.Base64;
import org.bouncycastle.openssl.PEMEncryptedKeyPair;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcePEMDecryptorProviderBuilder;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;

byte[] dataBytes = new com.fasterxml.jackson.databind.ObjectMapper().writeValueAsBytes(data);
char[] pass = Files.readString(Paths.get("password.txt")).toCharArray();
PEMParser parser = new PEMParser(Files.newBufferedReader(Paths.get("private.pem")));
PEMEncryptedKeyPair ckp = (PEMEncryptedKeyPair) parser.readObject();
var privateKey = new JcaPEMKeyConverter()
.getKeyPair(ckp.decryptKeyPair(new JcePEMDecryptorProviderBuilder().build(pass)))
.getPrivate();
Signature sig = Signature.getInstance("SHA256withRSA");
sig.initSign(privateKey);
sig.update(dataBytes);
String sign = Base64.getEncoder().encodeToString(sig.sign());
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"crypto/x509"
"encoding/base64"
"encoding/json"
"encoding/pem"
"io/ioutil"
)

dataBytes, _ := json.Marshal(data)
pemBytes, _ := ioutil.ReadFile("private.pem")
passBytes, _ := ioutil.ReadFile("password.txt")
block, _ := pem.Decode(pemBytes)
der, _ := x509.DecryptPEMBlock(block, passBytes)
priv, _ := x509.ParsePKCS1PrivateKey(der)
hash := sha256.Sum256(dataBytes)
sigBytes, _ := rsa.SignPKCS1v15(rand.Reader, priv, crypto.SHA256, hash[:])
sign := base64.StdEncoding.EncodeToString(sigBytes)

Pass the received $sign in the Sign header.

Creating payments

Endpoint

POSThttps://api-merchant.alikassa.com/v1/payment📋

Headers

HeaderValue
Content-Typeapplication/json
AccountYour account uuid, you can find in Accounts
SignRequest signature

Parameters

* - Required fields

NameTypeDescription
amount*decimal (11.2)Amount
order_id*string (128)Your id must be unique
service*string (100)online_banking_myr_hpp
qr_code_myr_hpp
e_wallet_myr_hpp
customer_ip*ipPayer's IP address
customer_code*string (100)Deposit Bank Code
customer_first_name*stringPayer's first name
customer_last_name*stringPayer's last name
success_redirect_idintId of redirect upon successful payment
fail_redirect_idintId of redirect in case of unsuccessful payment
notification_endpoint_idintNotification id
success_redirect_urlstring|max:255Link to redirect after successful payment
fail_redirect_urlstring|max:255Link to redirect after unsuccessful payment
notification_endpoint_urlstring|max:255Link to send a callback after the statuses are finalized

Response

NameDescription
urlLink to payment
payment_statusPayment status
wait — in the process of payment
idAliKassa payment id
uuidAliKassa payment uuid
success_redirect_urlLink to your page for client redirect after successful payment
Important

When creating, always wait, check the payment status via the API or wait for a notification!

Success Response Example (HTTP CODE 200)

{
"url": "https://pay-merchant.alikassa.com/bd291fe1-5c19-4113-ae62-a2d3c4d01d20",
"payment_status": "wait",
"id": 108465371,
"uuid": "bd291fe1-5c19-4113-ae62-a2d3c4d01d20",
"success_redirect_url": null
}

Error Response Example (HTTP CODE 400)

{
"message": "The given data was invalid.",
"errors": {
// ...
}
}

After receiving the url, redirect the client to the link.

Important

If you passed notification_endpoint_id or notification_endpoint_url, you will receive a notification about the payment status change

Deposit Bank Codes

online_banking_myr_hpp

customer_codeBank Name
AFFAffin Bank
ALBAlliance Bank Malaysia Berhad
AMBAmBank Group
BIMBBank Islam Malaysia Berhad
BSNBank Simpanan Nasional
CIMBCIMB Bank Berhad
HLBHong Leong Bank Berhad
HSBCHSBC Bank (Malaysia) Berhad
MBBMaybank Berhad
OCBCOCBC Bank (Malaysia) Berhad
PBBPublic Bank Berhad
RHBRHB Banking Group
UOBUnited Overseas Bank (Malaysia) Bhd
FPXFPX Bank Selection Page
AFFFPXAffin Bank (FPX)
AGROBFPXAgrobank (FPX)
ALBFPXAlliance Bank (FPX)
AMBFPXAmBank (FPX)
BIMBFPXBank Islam (FPX)
BKRFPXBank Rakyat (FPX)
BMMBFPXBank Muamalat (FPX)
BOCMFPXBank of China (FPX)
BSNFPXBSN Bank (FPX)
CIMBFPXCIMB Bank (FPX)
HLBFPXHong Leong Bank (FPX)
HSBCFPXHSBC (FPX)
KFHFPXKuwait Finance House (FPX)
MBBFPXMaybank (FPX)
OCBCFPXOCBC (FPX)
PBBFPXPublic Bank (FPX)
RHBFPXRHB Bank (FPX)
SCTBFPXStandard Chartered Bank (FPX)
UOBFPXUOB (FPX)

qr_code_myr_hpp

customer_codeBank Name
DUITNOWDuitnow

e_wallet_myr_hpp

customer_codeBank Name
TNGODUITNOWTouch N Go
GRABDUITNOWGrabPay
MAEDUITNOWMAE
BOOSTDUITNOWBOOST

Creating payouts

Endpoint

POSThttps://api-merchant.alikassa.com/v1/payout📋

Headers

HeaderValue
Content-Typeapplication/json
AccountYour account uuid, you can find in Accounts
SignRequest signature

Parameters

* - Required fields

NameTypeDescription
amount*decimal (11.2)Amount
order_id*string (128)Your id must be unique (example: "1234")
service*string (100)payment_card_myr
number*string (100)Recipient account number
customer_code*string (100)Payout Bank Code
customer_first_name*string (100)Payer's first name
customer_last_name*string (100)Payer's last name
notification_endpoint_idintNotification id
notification_endpoint_urlstring|max:255Link to send a callback after the statuses are finalized

Response

NameDescription
idAliKassa payment id
payment_statusPayment status
wait — in the process of payment

Payout Bank Codes

payment_card_myr

customer_codeBank Name
BIMBBank Islam Malaysia Berhad
AGROBAgro Bank (Bank Pertanian Malaysia Berhad)
ARBMAl-Rajhi Bank Malaysia
BKRBank Kerjasama Rakyat Malaysia Berhad
BMMBBank Muamalat Malaysia Berhad
BNPPBNP Paribas Malaysia
BOFAMBank of America Malaysia Berhad
BOCMBank of China Malaysia
DBBDeutsche Bank Malaysia Berhad
ICBCMIndustrial and Commercial Bank of China (Malaysia)
JPMCJ.P. Morgan Chase Bank Berhad
MCBMBMizuho Corporate Bank Malaysia Berhad
SMBCSumitomo Mitsui Banking Corporation Malaysia BHD
MBSBMBSB Bank
GXBGXBank
TNGOTouch N Go e-wallet
Important Notes
  • Possible values of payment_status, see the documentation "Payment status"
  • You can find a sample code at the end of the document