Popis API:
Krok 2, vytvoření objektu JSON (příklad v JavaScriptu).
Možné hodnoty pro pole blockchain, vezměte hodnotu z uvozovek (například: tether-trc20):
'tether-erc20' (ERC20 Ethereum USDT, contract: 0xdac17f958d2ee523a2206206994597c13d831ec7)
'tether-bep20' (BEP20 Binance smart chain USDT, contract: 0x55d398326f99059ff775485246999027b3197955)
'tether-trc20' (TRC20 Tron USDT, contract: TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t)
'mitilena-own' (Vanishing Mitilena, VMT token)
'apfcoin' (ERC20 Ethereum APFC, contract: 0x8eD955a2b7d2C3a17a9d05dACa95E01818f8C11e)
let createPaymentObj =
{
userSecret: 'your_API_key', // required
userPaymentId: 'your_payment_id_usually_order_id', // required
blockchain: 'tether-trc20', // required
fiatCode: '3x_ISO_code_of_your_fiat_currency_for example_EUR', // required
customerEmail: 'customer_mail', // required
fiatAmount: 'digit_amount_in_fiat_currency_for_example_100', // number, required
userProductId: 'your_product_id_if_any', // not required
language: 'two_digit_ISO_language_code', // default en, not required [available: en, cz, ru, tr, my, hr, si, ar, swa] - the rest will be an error
// redirectUrl_yours: 'thank_you_page or success_page',
redirectUrl_yours: 'url_on_your_site_where_to_send_user_after_successful_payment', // not required, but very desirable
webHookPostUrl_yours: 'url_on_your_site_where_the_hidden_POST_request_will_go_on_successful_payment,' // required
}
Do hlaviček požadavku je také potřeba vložit váš klíč API: ‚mitilena-signature‘: ‚your_api_key‘
Vypadá to nějak takto:
headers: {
'Content-Type': 'application/json',
accept: 'application/json',
'mitilena-signature': 'your_key',
}
A pošlete jej jako POST požadavek na adresu:
https://mitilena.com/api/generatePayment
Pokud bylo vytvoření faktury úspěšné, odpověď serveru bude s kódem 200 a odpověď bude obsahovat objekt JSON, například něco takového:
Z této odpovědi potřebujete pouze 2 pole, fakturační číslo a platební stránka. Musíte odeslat (přesměrovat) uživatele na platební stránku na web Mitilena Pay [pole paymentPage]!
{
usdtOverAmount: '1.580437',
invoiceId: 'auto-e80099-ef456c-e0de42',
invoiceVs: '0437',
fiatAmount: '1.450',
fiatCurrency: 'EUR',
rateLocalCurrencyToNeededCrypto: '0.917',
rateNeededCryptoToUSD: '0.99959700',
isTrc20: 1,
isErc20: 0,
isBep20: 0,
whenInit: '2023-08-22T11:30:05.000Z',
contractAddress: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',
customerEmail: 'email_customer@email.com',
productId: 85,
expiresAt: '2023-09-05T11:30:05.000Z',
blockchainHash: null,
cryptoShortCode: 'USDT',
cryptoValue: '1.580437',
fiatValue: '1.450',
receivedOnAddress: 'TRHpcBugcdEdD6BdW6k1Grtof6LBvRGWWJ',
txId: 'auto-e80099-ef456c-e0de42',
fiatShortCode: 'EUR',
wasPaid: null,
redirectUrl: 'https://google.com',
paymentPage: 'https://mitilena.com/pay/auto-e80099-ef456c-e0de42/fast/'
}
Pokud dojde k chybě, odpověď serveru bude s kódem 400 a odpověď bude obsahovat řetězec, text chyby.
Životnost takového odkazu je 14 dní. Existují plány, které umožní zvolit dobu životnosti odkazu.
Příklady JavaScriptu (node.js version 16.8)
Request:
const https = require('https');
const url = require('url');
const data = JSON.stringify({
userSecret: '',
userPaymentId: 'userPaymentdId111',
blockchain: 'tether-trc20',
fiatCode: 'EUR',
customerEmail: 'email_customer@email.com',
fiatAmount: 1.45,
userProductId: 'new_someGoodsOk',
language: 'en', // default en, not neccessary
// redirectUrl_yours: 'https://google.com',
redirectUrl_yours: 'https://google.com',
webHookPostUrl_yours: 'https://mitilena.com/mi_webhook/'
});
const myURL = url.parse('https://mitilena.com/api/generatePayment');
const options = {
hostname: myURL.hostname,
port: myURL.port,
path: myURL.pathname,
method: 'POST',
headers: {
'Content-Type': 'application/json',
accept: 'application/json',
'mitilena-signature': '',
},
};
requestAsync(options, data)
.then(dataFObj => {
if (dataFObj.statusCode === 200) {
let tokensObj = JSON.parse(dataFObj.dataRaw);
console.log('success:', tokensObj)
} else {
console.log('error dataFObj', dataFObj);
throw new Error('some errror in postToWebHook ' + dataFObj.dataRaw);
}
})
.catch(e => {
console.log('error request:', e)
})
function requestAsync(optionsArr, dataToPost = false) {
return new Promise((resolve, reject) => {
const req = https.request(optionsArr, (resp) => {
// console.log(`statusCode: ${resp.statusCode}`);
let dataF = '';
// A chunk of data has been received.
resp.on('data', (chunk) => {
dataF += chunk;
});
resp.on('end', () => {
resolve({statusCode: resp.statusCode, dataRaw: dataF});
}).on('error', (err) => {
console.log('Error: ' + err);
reject(err);
});
});
if (dataToPost) {
req.write(dataToPost);
}
req.end();
});
}
Zdá se, že modul url v Node.js výše verze 16 změnil syntaxi, pokud něco, najděte si informace k tomuto tématu nebo zadejte adresu a cestu ručně.
Příklady v PHP a WordPress:
Dotaz pomocí funkce WordPress wp_remote_post(), podívejte se na čistou funkci PHP, bude to vypadat nějak takto:
<?php
$request_body = [
'userSecret' => $this->mitilenaToken,
'userPaymentId' => $order->id,
'blockchain' => 'tether-trc20',
'fiatCode' => $order->currency,
'customerEmail' => $order->get_billing_email(),
'fiatAmount' => $order->get_total(),
'userProductId' => $orderids,
'language' => 'en', // default en, not neccessary
'redirectUrl_yours' => $order->get_checkout_order_received_url(),
'webHookPostUrl_yours' => 'https://mywebsite.com/post-handler.php'
];
$request_headers = [
'content-type' => 'application/json',
'mitilena-signature' => $this->mitilenaToken,
];
$args = [
'method' => 'POST',
'httpversion' => '1.0',
'timeout' => 90,
'headers' => $request_headers,
'body' => ''
];
$environment_url = 'https://mitilena.com/api/generatePayment/';
$result = wp_remote_post($environment_url, array(
'method' => 'POST',
'headers' => $request_headers,
'timeout' => 60, // added
'redirection' => 5, // added
'blocking' => true, // added
'httpversion' => '1.0',
'sslverify' => false,
'body' => json_encode($request_body))
);
$fullObj = json_decode($result['body']);
if (isset($result['response']) && isset($result['response']['code']) && $result['response']['code'] != 200) {
$mi__err_message = 'Unknown error';
if (isset($result['body'])) {
$mi__err_message = 'Error: ' . $result['body'];
}
// error handling + exit
exit;
}
if (!isset($fullObj->paymentPage)) {
http_response_code(400); // Bad Request
echo "Error: No payment page specified";
exit;
}
$paymentPage = $fullObj->paymentPage;
if (strlen($paymentPage) < 5) {
http_response_code(400); // Bad Request
echo "Error: payment page is too short.";
exit;
}
?>
Krok 5, vytvoření obslužného programu WebHook na straně vašeho webu (serveru):
Na příkladu Node.js 16.8 verze a Express.js 4 verze (JavaScript)
const bodyParser = require('body-parser');
const Big = require('big.js')
let endpointSecret = 'copy of the api key value'
// an object called statusObj arrives
app.post('/mi_webhook/', bodyParser.json(), (request, response) => {
try {
let eventObj = request.body;
const signature = request.headers['mitilena-signature'];
console.log({eventObj});
// compare the incoming secret key with your real one
if (signature === endpointSecret) {
if (!eventObj.statusObj) {
return response.status(400).send('Error, no object.');
}
let hookObj = eventObj.statusObj;
if (
typeof hookObj.mitilenaInvoiceId === 'undefined' ||
typeof hookObj.yourPaymentId === 'undefined' ||
typeof hookObj.yourProductName === 'undefined' ||
typeof hookObj.yourProductId === 'undefined' ||
typeof hookObj.secretKey === 'undefined' ||
typeof hookObj.stableCoinAmount === 'undefined' ||
typeof hookObj.stableCoinSymbol === 'undefined' ||
typeof hookObj.stableCoinBlockchain === 'undefined' ||
typeof hookObj.localCurrencyAmount === 'undefined' ||
typeof hookObj.localCurrencyCode === 'undefined' ||
typeof hookObj.wasPaid === 'undefined' ||
typeof hookObj.blockchainHash === 'undefined'
) {
return response.status(400).send('Error, incomplete object.');
}
if (hookObj.wasPaid === true) {
let centsAmount = Big(hookObj.localCurrencyAmount).times(Big(100)).round(0).toNumber();
// put the order in your database as paid and return the status code 200
// this is an example of our code, yours may look different
paymentsModel
.completeUserPayment(hookObj.mitilenaInvoiceId, centsAmount)
.then((okString) => {
return response.status(200).send('all good Mitilena token');
})
.catch((e) => {
console.log('err in completeUserCardPayment', e.message);
return response.status(400).send('error, contact support');
});
} else {
return response.status(400).send('invoice was not paid');
}
} else {
return response.status(400).send('bad Mitilena token');
}
} catch (e) {
console.log('webhook err:', e.message);
return response.status(400).send('bad request, error');
}
});
Použití příkladu PHP:
Vytvořte soubor handleru a umístěte jej na svůj webový server (stránku), aby byl přístupný zvenčí, tedy pokud napíšete úplnou cestu k souboru, aby se otevřel, například https://youwebsite.com/webhook.php (toto je příklad, můžete to udělat jinak, přes směrování atd.).
Jak je uvedeno výše, tuto adresu uveďte v objektu, ve kterém vytváříte platební odkaz, tzn
{….
webHookPostUrl_yours: ‚https://youwebsite.com/webhook.php‘
…}
File contents:
<?php
$mi__jsonData = file_get_contents('php://input');
if (!$mi__jsonData) {
http_response_code(400); // Bad Request
echo 'bad input data';
exit;
}
// Decode the JSON data into a PHP associative array
$mitilena_data = json_decode($mi__jsonData, true);
// Check if decoding was successful
if ($mitilena_data !== null && isset($mitilena_data['statusObj'])) {
$mitilena_data = $mitilena_data['statusObj'];
if (!isset($mitilena_data['secretKey'])) {
http_response_code(400); // Bad Request
echo "Error: Api key of Mitilena (Mitilena Token) is not specified. We can't verify if the request is genuine. Cancellation of a transaction.";
exit;
}
$mitilenaToken = $mitilena_data['secretKey'];
// compare your real API key with the one you received
$realMitilenaToken = 'your_api_key'
if ($mitilenaToken != $realMitilenaToken) {
http_response_code(400); // Bad Request
echo "Error: API token does not match. The website owner must specify the correct Api Mitilena token.";
exit;
}
if (!isset($mitilena_data['yourPaymentId'])) {
http_response_code(400); // Bad Request
echo "Error: No payment id specified";
exit;
}
$mi__paymentId = $mitilena_data['yourPaymentId'];
if (strlen($mi__paymentId) < 1) {
http_response_code(400); // Bad Request
echo "Error: too short payment id.";
exit;
}
function mi__pay_escapeString($var)
{
$var = stripslashes($var);
$var = htmlentities($var);
$var = strip_tags($var);
return $var;
}
// yourPaymentId
try {
$mi__order = ''; // search your database for this order, mi__pay_escapeString($mi__paymentId)
} catch (Throwable $e) {
http_response_code(400); // Bad Request
echo "Error: wrong payment id (order id). {yourPaymentId: \"\"}";
exit;
}
if (!isset($mitilena_data['wasPaid'])) {
http_response_code(400); // Bad Request
echo "Error: No payment status specified";
exit;
}
$mi__wasPaid = $mitilena_data['wasPaid'];
if ($mi__wasPaid == true) {
$blockchainHash = '';
if (isset($mitilena_data['blockchainHash'])) {
$blockchainHash = mi__pay_escapeString($mitilena_data['blockchainHash']);
}
// set the order as paid in your database
// reduce inventory if required
// send the user an email if required
echo 'success';
} else {
echo 'unpaid status received';
}
} else {
// JSON decoding failed
http_response_code(400); // Bad Request
echo "Invalid JSON data";
}
exit;
?>
To je vše, pokud máte nějaké dotazy, ptejte se v komentářích.
Nemáte vývojáře, který by to za vás implementoval? Napište nám na support@mitilena.com, uděláme vám komerční návrh práce vývojáře na propojení kryptoplateb.