Quick Start
Get your API keys
Your API requests are authenticated using API keys. Any request that doesn't include an API key will return an error.
You can contact HUSKY to generate an API key.
Request Headers
Each API request must include these headers
x-appid
App ID
x-signature
Signature of the request body
Signature
We use "pbkdf2"
1) Prepare payload by sort keys of the payload object by alphabet and serial to JSON string,
function sortKeysFor(obj) {
return Object.keys(obj).sort().reduce(function(map, key) {
map[key] = obj[key]
return map
}, {})
}function sortKeysFor($obj) {
// Get the keys of the associative array and sort them
$keys = array_keys($obj);
sort($keys);
// Create a new associative array with the sorted keys
$sortedObj = [];
foreach ($keys as $key) {
$sortedObj[$key] = $obj[$key];
}
return $sortedObj;
}const payloadText = <App ID> + ':' + JSON.stringify(<Sorted Payload Object>)2) Generate signature
import Crypto from 'crypto'
public generateSignature(payload, AppID, AppSecret) {
const serialzePayload = `${AppID}:${JSON.stringify(sortKeysFor(payload))}`
return Crypto.pbkdf2Sync(serialzePayload, <App Secret>, 1000, 64, 'sha512').toString('hex')
}function generateSignature($payload, $AppID, $AppSecret) {
// Sort the payload object
$sortedPayload = sortKeysFor($payload);
// Convert the sorted payload object to a JSON string
$serializedPayload = $AppID . ':' . json_encode($sortedPayload);
// Generate the PBKDF2 HMAC signature
$iterations = 1000;
$keyLength = 128;
$algorithm = 'sha512';
$signature = hash_pbkdf2($algorithm, $serializedPayload, $AppSecret, $iterations, $keyLength, false);
return $signature;
}3) Send a request
async function sendHuskyPayAPI(payload, action, method = 'POST') {
const serializePayload = JSON.stringify(sortKeysFor(payload))
const signedText = await generateSign(jsonPayload)
const axiosConfig: AxiosRequestConfig = {
method,
url: Env.get('HUSKYPAY_ENDPOINT') + '/' + action,
headers: {
'x-appid': <AppID>,
'x-signature': signedText,
'Content-Type': 'application/json'
},
data : serializePayload
};
const { data: apiResult } = await axios(axiosConfig)
return apiResult
}function sendHuskyPayAPI($payload, $action, $method = 'POST') {
$AppID = 'your_app_id';
$AppSecret = 'your_app_secret';
$HuskyPayEndpoint = 'your_huskypay_endpoint'; // Replace with your actual endpoint
$serializePayload = json_encode(sortKeysFor($payload));
$signedText = generateSignature($payload, $AppID, $AppSecret);
$url = $HuskyPayEndpoint . '/' . $action;
$headers = [
'x-appid: ' . $AppID,
'x-signature: ' . $signedText,
'Content-Type: application/json'
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($ch, CURLOPT_POSTFIELDS, $serializePayload);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close($ch);
return json_decode($response, true);
}4) Mixed together
import Crypto from 'crypto'
import moment from 'moment-timezone'
import axios, { AxiosRequestConfig } from 'axios';
export default class HuskyPay {
public static action: Object = {
TOPUP: 'payment/deposit',
WITHDRAW: 'payment/withdraw',
TRANSACTIONS: 'payment/report/transactions',
AGENTINFO: 'agent/info',
AGENT_UPDATE_CALLBACK: 'agent/callback',
}
public static status = {
PROCESSING: 0,
SUCCESS: 1,
FAILED: 2,
CANCELLED: 3
}
public static bankCodeMap: Object = {
"014" : "SCB",
"002" : "BBL",
"004" : "KBANK",
"006" : "KTB",
"034" : "BAAC",
"011" : "TTB",
"070" : "ICBC",
"071" : "TCRB",
"017" : "CITI",
"020" : "SCBN",
"022" : "CIMB",
"024" : "UOBT",
"025" : "BAY",
"030" : "GSB",
"031" : "HSBC",
"039" : "MHCB",
"033" : "GHB",
"073" : "LHBANK",
"065" : "TTB",
"067" : "TISCO",
"069" : "KKP",
"066" : "IBANK",
"TMW" : "Truemoney"
}
public static appID() {
return process.env.HUSKYPAY_APPID
}
private static _appSecret() {
return process.env.HUSKYPAY_SECRET
}
private static _sortKeysFor(obj) {
return Object.keys(obj).sort().reduce(function(map, key) {
map[key] = obj[key]
return map
}, {})
}
public static generateSignature(_payload) {
const rawPayloadText = HuskyPay.appID() + ':' + _payload
return Crypto.pbkdf2Sync(rawPayloadText, HuskyPay._appSecret(), 1000, 64, 'sha512').toString('hex')
}
public static verifySignature(receivedSignature, receivedPayload) {
const jsonPayload = JSON.stringify(HuskyPay._sortKeysFor(receivedPayload))
const signedText = await HuskyPay.generateSignature(jsonPayload)
return receivedSignature === signedText
}
public static async sendHuskyPayAPI(action, payload, method = 'post') {
const jsonPayload = JSON.stringify(HuskyPay._sortKeysFor(payload))
const signatureText = await HuskyPay.generateSignature(jsonPayload)
const axiosConfig: AxiosRequestConfig = {
method: method,
url: process.env.HUSKYPAY_ENDPOINT + '/' + action,
headers: {
'x-appid': HuskyPay.appID(),
'x-signature': signatureText,
'Content-Type': 'application/json'
},
data : jsonPayload
};
const { data: apiResult } = await axios(axiosConfig)
return apiResult
}
}<?php
define('HUSKYPAY_ENDPOINT', 'https://<>');
define('HUSKYPAY_APPID', '<APP ID>');
define('HUSKYPAY_SECRET', '<APP SECRET>');
function sortKeysFor($obj) {
$keys = array_keys($obj);
sort($keys);
$sortedObj = [];
foreach ($keys as $key) {
$sortedObj[$key] = $obj[$key];
}
return $sortedObj;
}
function generateSignature($payload) {
$sortedPayload = sortKeysFor($payload);
$serializedPayload = HUSKYPAY_APPID . ':' . json_encode((object)$sortedPayload);
$iterations = 1000;
$keyLength = 128;
$algorithm = 'sha512';
return hash_pbkdf2($algorithm, $serializedPayload, HUSKYPAY_SECRET, $iterations, $keyLength, false);
}
//RETURN true or false
function verifySignature($receivedSignature, $payload) {
return $receivedSignature === generateSignature($payload);
}
function sendHuskyPayAPI($payload, $action, $method = 'POST') {
$serializePayload = json_encode((object)sortKeysFor($payload));
$signedText = generateSignature($payload);
$url = HUSKYPAY_ENDPOINT . "/" . $action;
$headers = [
'x-appid: ' . HUSKYPAY_APPID,
'x-signature: ' . $signedText,
'Content-Type: application/json'
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($ch, CURLOPT_POSTFIELDS, $serializePayload);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close($ch);
return json_decode($response, true);
}
//Example
$payload = array();
$payload['refId'] = 'AK1112233-0011';
$payload['userId'] = 'AK1112233';
$payload['amount'] = 204;
$payload['accountName'] = 'HUSKY NAJA';
$payload['accountNo'] = '4112232325';
$payload['bankCode'] = 'SCB';
$payload['timestamp'] = date("c");
$payload['extraParams'] = json_decode('{}');
print_r(sendHuskyPayAPI($payload, 'payment/deposit'));
Bank Code
1
KBANK
ธนาคารกสิกรไทย
2
SCB
ธนาคารไทยพาณิชย์
3
BBL
ธนาคารกรุงเทพ
4
BAY
ธนาคารกรุงศรีอยุธยา
5
KTB
ธนาคารกรุงไทย
6
TTB
ธนาคารทหารไทยธนชาต
7
GSB
ธนาคารออมสิน
8
BAAC
ธนาคารเพื่อการเกษตรและสหกรณ์การเกษตร
9
CIMB
ธนาคารซีไอเอ็มบีไทย
10
UOB
ธนาคารยูโอบี
11
KKP
ธนาคารเกียรตินาคินภัทร
12
TISCO
ธนาคารทิสโก้
13
CITI
ธนาคารซิตี้แบงก์
14
GHB
ธนาคารอาคารสงเคราะห์
15
SCBT
ธนาคารสแตนดาร์ดชาร์เตอร์ด ประเทศไทย
16
BOC
Bank of China
17
LHBANK
ธนาคารแลนด์ แอนด์ เฮ้าส์ จำกัด (มหาชน)
18
ICBC
ธนาคารพาณิชย์อุตสาหกรรมแห่งประเทศจีน
19
IBANK
ธนาคารอิสลามแห่งประเทศไทย
Limitation
Deposit
Min 10
Max 200,000
Withdraw
Min 100
Max 200,000
Last updated