Підпис даних

Підпис даних

Всі запити до платіжного шлюзу UPC e-Commerce Connect підписуються цифровим підписом, на основі приватного ключа.

Генерація ключів

Згенерувати ключі торговця та необхідний сертифікат потрібно за допомогою програми OpenSSL

Формування підпису для платежу

Генерація підписи на прикладі PHP:

<?php
$MerchantID = 1234567;
$TerminalID = E1111111;
$CurrencyID = 980;
$OrderID = rand(1, 4000);
$PurchaseTime = 20241022094755;
$TotalAmount = 100;
#Строка для підпису
$data = "$MerchantID;$TerminalID;$PurchaseTime;$OrderID;$CurrencyID;$TotalAmount;;";
$fp = fopen("privateKey512.pem", "r");
$priv_key = fread($fp, 8192);
fclose($fp);
$pkeyid = openssl_get_privatekey($priv_key);
openssl_sign( $data , $signature, $pkeyid, OPENSSL_ALGO_SHA512);
openssl_free_key($pkeyid);

#Конвертація підпису в формат base64
$b64sign = base64_encode($signature);

?>
<form action="https://ecg.test.upc.ua/go/pay" method="post"> - URL тестового сервера
    <input name="Version" type="hidden" value="1" />
    <input name="MerchantID" type="hidden" value="1234567" />
    <input name="TerminalID" type="hidden" value="E1111111" />
    <input name="TotalAmount" type="hidden" value="100" />
    <input name="Currency" type="hidden" value="980" />
    <input name="locale" type="hidden" value="en" />
    <input name="PurchaseTime" type="hidden" value="<?php echo $PurchaseTime ?>">
    <input name="OrderID" type="hidden" value="12" />
    <input name="Signature" type="hidden" value="<?php echo "$b64sign" ?>" />
    <input type="submit" />
</form>


Поля записуються в $ data в представленому нижче порядку: 

MerchantId;TerminalId;PurchaseTime;OrderId,Delay;CurrencyId,AltCurrencyId;Amount,AltAmount;SessionData(SD);


Кількість знаків; має залишатися постійним. Якщо якесь поле відсутнє, то ставиться два знаки;;
Приклади:
Якщо відсутня SessionData (SD), то data буде виглядати наступним чином:
 

MerchantId;TerminalId;PurchaseTime;OrderId,Delay;CurrencyId,AltCurrencyId; Amount,AltAmount;;

Якщо відсутні поля Delay або AltCurrency, AltAmount, то кома перед цими полями опускається: 

MerchantId;TerminalId;PurchaseTime;OrderId;CurrencyId,AltCurrencyId;Amount,AltAmount;;
MerchantId;TerminalId;PurchaseTime;OrderId,Delay;CurrencyId;Amount;;
MerchantId;TerminalId;PurchaseTime;OrderId;CurrencyId;Amount;;


Якщо в запиті на шлюз присутній поле Ref3, то воно повинно брати участь в формуванні підпису: 

MerchantId;TerminalId;PurchaseTime;OrderId;CurrencyId;Amount;SessionData(SD);Ref3;


Формування підпису для повернення / реверсал

Якщо виконується запит на повернення / реверсал то дані повинні бути доповнені наступними полями: ApprovalCode, RRN. У разі якщо запит містить поля RefundAmount і / або Ref3, то ці поля також повинні брати участь в підпису. Розглянемо приклад datafile, c використанням всіх полів:

MerchantId;TerminalId;PurchaseTime;OrderId;CurrencyId;Amount;SessionData(SD);ApprovalCode;RRN;RefundAmount;Ref3;

Якщо відсутня опциональное поле (RefundAmount або Ref3), то дане поле опускається. Наприклад:

MerchantId;TerminalId;PurchaseTime;OrderId;CurrencyId;Amount;SessionData(SD);ApprovalCode;RRN;Ref3;

MerchantId;TerminalId;PurchaseTime;OrderId;CurrencyId;Amount;SessionData(SD);ApprovalCode;RRN;RefundAmount;

MerchantId;TerminalId;PurchaseTime;OrderId;CurrencyId;Amount;SessionData(SD);ApprovalCode;RRN;


Перевірка підпису від платіжного шлюзу UPC e-Commerce Connect

Для перевірки підпису даних зі шлюзу в стрічці $data необхідно сформувати дані у відповідності до того, що було отримано в Notify Request.

Для прикладу:

MerchantId;TerminalId;PurchaseTime;OrderId,Delay;Xid;CurrencyId,AltCurrencyId;Amount,AltAmount;SessionData;TranCode;ApprovalCode;

Якщо в авторизаційному запиті не було вказано тегів Delay, AltCurrencyId, AltAmount, SessionData то ці теги вказувати не потрібно, а кома перед ними опускається.

Дані будуть виглядати наступним чином:

MerchantId;TerminalId;PurchaseTime;OrderId;Xid;CurrencyId;Amount;;TranCode;ApprovalCode;

Для перевірки підпису необхідно використовувати сертифікат наданий UPC. Для тестового та робочого середовища вони різні.

Тестовий сертифікат

Робочий сертифікат

Приклад перевірки підпису на PHP:

<?php 

// $data містить значення полів для перевірки підпису

$signature = $HTTP_POST_VARS["Signature"]; 
$signature = base64_decode($signature) ; 

// витягти сертифікат
$fp = fopen("/opt/deploy/certs/server.crt", "r"); 
$cert = fread($fp, 8192); fclose($fp); 
$pubkeyid = openssl_get_publickey($cert); 

// перевірка підпису
$ok = openssl_verify($data, $signature, $pubkeyid); 
if ($ok == 1) { echo "good"; } 
    elseif ($ok == 0) { echo "bad"; } 
    else {echo "ugly, error checking signature";} 

?>

Для перевірки підпису даних зі шлюзу по транзакції з використанням токена карти, дані повинні бути
сформовані в наступному порядку:

MerchantId;TerminalId;PurchaseTime;OrderId;Xid;CurrencyId;Amount;;TranCode;ApprovalCode;UPCToken;UPCTokenExp;

Дивись також приклади реалізації на інших мовах програмування


Дивіться на цій сторінці: