Руководство по подключению автоматизированных банковских систем (АБС), мобильных приложений банков и платёжных шлюзов к открытому межбанковскому клирингу HeyPay.
POST /heypay/apibank/api/resolve для проверки существования номера в целевом банке.
POST /heypay/apibank/api/transfer. Шлюз HeyPay списывает сумму с корсчёта банка-отправителя и начисляет банку-получателю.
UTR и отправляет подписанный Webhook в АБС банка-получателя для финального зачисления.
Каждый запрос от сервера банка должен содержать HTTP-заголовки аутентификации:
X-HeyPay-Client-ID: bid_xxxxxxxxxxxx X-HeyPay-Client-Secret: bsec_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Content-Type: application/json
Получение полного списка всех подключенных банков-участников сети для отображения в мобильном приложении банка.
curl -X GET https://heycat.online/heypay/apibank/api/banks
Проверка номера телефона / счета получателя перед отправкой перевода.
curl -X POST https://heycat.online/heypay/apibank/api/resolve -H "Content-Type: application/json" -d '{
"recipient_bank_id": "heycat",
"recipient_account": "+79991234567"
}'
Инициирование межбанковского клиринга со списанием с корсчета банка-отправителя.
curl -X POST https://heycat.online/heypay/apibank/api/transfer -H "X-HeyPay-Client-ID: bid_xxxxxxxx" -H "X-HeyPay-Client-Secret: bsec_xxxxxxxx" -H "Content-Type: application/json" -d '{
"sender_account": "+79001112233",
"sender_name": "Алексей С.",
"recipient_bank_id": "heycat",
"recipient_account": "+79991234567",
"amount": 500.00,
"comment": "Оплата услуг",
"external_ref": "ABS-TX-9841"
}'
curl -X GET https://heycat.online/heypay/apibank/api/balance -H "X-HeyPay-Client-ID: bid_xxxxxxxx" -H "X-HeyPay-Client-Secret: bsec_xxxxxxxx"
При поступлении перевода на клиента вашего банка, HeyPay Switch отправляет HTTP POST на ваш webhook_transfer_url:
{
"event": "interbank.incoming_transfer",
"utr": "HP-4F2A-8B1E",
"sender_bank_id": "bnk_alpha",
"sender_bank_name": "AlphaSand Bank",
"sender_account": "+79001112233",
"recipient_bank_id": "bnk_yourbank",
"recipient_account": "+79991234567",
"amount": 500.00,
"currency": "ANL",
"comment": "Оплата услуг",
"external_ref": "ABS-TX-9841"
}
Подпись передается в заголовке X-HeyPay-Signature:
sha256(utr + amount + client_secret).
<?php
class HeyPayBankClient {
private $clientId;
private $clientSecret;
private $apiBase;
public function __construct($clientId, $clientSecret, $apiBase = "https://heycat.online") {
$this->clientId = $clientId;
$this->clientSecret = $clientSecret;
$this->apiBase = rtrim($apiBase, '/');
}
public function sendTransfer($fromAccount, $senderName, $toBankId, $toAccount, $amount, $comment = "", $extRef = null) {
$url = $this->apiBase . "/heypay/apibank/api/transfer";
$data = [
"sender_account" => (string)$fromAccount,
"sender_name" => (string)$senderName,
"recipient_bank_id" => (string)$toBankId,
"recipient_account" => (string)$toAccount,
"amount" => (float)$amount,
"comment" => $comment,
"external_ref" => $extRef ?: ("REF-" . time())
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Content-Type: application/json",
"X-HeyPay-Client-ID: " . $this->clientId,
"X-HeyPay-Client-Secret: " . $this->clientSecret
]);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$res = curl_exec($ch);
curl_close($ch);
return json_decode($res, true);
}
public function verifyIncomingWebhook($rawJson, $receivedSignature) {
$data = json_decode($rawJson, true);
if (!$data) return false;
$check = $data['utr'] . $data['amount'] . $this->clientSecret;
return hash_equals(hash('sha256', $check), (string)$receivedSignature);
}
}
?>
import requests
import hashlib
class HeyPayBankGateway:
def __init__(self, client_id, client_secret, api_base="https://heycat.online"):
self.client_id = client_id
self.client_secret = client_secret
self.api_base = api_base.rstrip('/')
def send_transfer(self, sender_account, sender_name, recipient_bank_id, recipient_account, amount, comment=""):
url = f"{self.api_base}/heypay/apibank/api/transfer"
headers = {
"Content-Type": "application/json",
"X-HeyPay-Client-ID": self.client_id,
"X-HeyPay-Client-Secret": self.client_secret
}
payload = {
"sender_account": sender_account,
"sender_name": sender_name,
"recipient_bank_id": recipient_bank_id,
"recipient_account": recipient_account,
"amount": float(amount),
"comment": comment
}
r = requests.post(url, json=payload, headers=headers)
return r.json()
def verify_webhook(self, utr, amount, signature):
raw = f"{utr}{amount}{self.client_secret}"
expected = hashlib.sha256(raw.encode()).hexdigest()
return expected == signature