Перейти к основному содержимому

Платёжное решение RM 1

Обзор

  • Создание платежей
  • Создание выплат

Настройка сертификата

По ссылке https://merchant.alikassa.com/cabinet/form/setting-api-certs сгенерируйте «API сертификат на платежи», сохраните архив, распакуйте

Получите:

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

Мы сохраняем у себя только public.pem для проверки подписи.

Генерация подписи

$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('Ошибка сертификата.');
}

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('SHA1');
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.SHA1())
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("SHA1withRSA");
sig.initSign(privateKey);
sig.update(dataBytes);
String sign = Base64.getEncoder().encodeToString(sig.sign());
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha1"
"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 := sha1.Sum(dataBytes)
sigBytes, _ := rsa.SignPKCS1v15(rand.Reader, priv, crypto.SHA1, hash[:])
sign := base64.StdEncoding.EncodeToString(sigBytes)

Полученную подпись sign передайте в заголовке Sign.

Создание платежей

URL

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

Заголовки

ЗаголовокЗначение
Content-Typeapplication/json
AccountВаш uuid счета (вы можете найти в разделе Счета)
SignПодпись запроса

Параметры

* - Обязательные поля

НазваниеТипОписание
amount*decimal (11.2)Сумма
order_id*string (128)Ваш id (должен быть уникальный)
service*string (100)online_banking_myr_hpp
qr_code_myr_hpp
e_wallet_myr_hpp
customer_ip*ipIP адрес плательщика
customer_code*string (100)Код банка для пополнения
customer_first_name*stringИмя плательщика
customer_last_name*stringФамилия плательщика
success_redirect_idintId редиректа при успешной оплате
fail_redirect_idintId редиректа при неуспешной оплате
notification_endpoint_idintId уведомления
success_redirect_urlstring|max:255Ссылка для редиректа после успешной оплаты
fail_redirect_urlstring|max:255Ссылка для редиректа после неуспешной оплаты
notification_endpoint_urlstring|max:255Ссылка для отправки колбека после финализации статусов

Ответ

НазваниеОписание
urlСсылка на оплату
payment_statusСтатус платежа
wait — в процессе оплаты
idId платежа AliKassa
uuidUUID платежа AliKassa
success_redirect_urlСсылка на вашу страницу, для редиректа клиента после успешной оплаты
Важно

При создании всегда wait, проверяйте статус платежа через API или ждите получение уведомления!

Пример успешного ответа (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
}

Пример ошибки ответа (HTTP CODE 400)

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

После получения url переадресуйте клиента по ссылке.

Важно

Если вы передали notification_endpoint_id или notification_endpoint_url, то вы получите уведомление о смене статуса оплаты

Коды банков для пополнения

online_banking_myr_hpp

customer_codeНазвание банка
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_codeНазвание банка
DUITNOWDuitnow

e_wallet_myr_hpp

customer_codeНазвание банка
TNGODUITNOWTouch N Go
GRABDUITNOWGrabPay
MAEDUITNOWMAE
BOOSTDUITNOWBOOST

Создание выплат

URL

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

Заголовки

ЗаголовокЗначение
Content-Typeapplication/json
AccountВаш uuid счета (вы можете найти в разделе Счета)
SignПодпись запроса

Параметры

* - Обязательные поля

НазваниеТипОписание
amount*decimal (11.2)Сумма
order_id*string (128)Ваш id (должен быть уникальный) (пример: "1234")
service*string (100)payment_card_myr
number*string (100)Номер счета получателя
customer_code*string (100)Код банка для выплат
customer_first_name*string (100)Имя плательщика
customer_last_name*string (100)Фамилия плательщика
notification_endpoint_idintId уведомления
notification_endpoint_urlstring|max:255Ссылка для отправки колбека после финализации статусов

Ответ

НазваниеОписание
idId платежа AliKassa
payment_statusСтатус платежа
wait — в процессе оплаты

Коды банков для выплат

payment_card_myr

customer_codeНазвание банка
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
Важные замечания
  • Возможные значения payment_status, смотрите в документации "Статус платежа"
  • Пример кода найдете в конце документа