-
-
Save dimitarminchev/08d8ab833fa481a8cc5c1e365a16c05e to your computer and use it in GitHub Desktop.
| <?php | |
| /* | |
| # Borica Request 4.0 | |
| Изпращане на заявка за извършване на електронно плащане: [borica_request.php](https://gist.github.com/dimitarminchev/08d8ab833fa481a8cc5c1e365a16c05e) | |
| - Документация: [Borica APGW e-Gateway Resources](https://3dsgate-dev.borica.bg/) | |
| - Автор: [доц. д-р Димитър Минчев](http://www.minchev.eu) | |
| - Eлектронна поща: [[email protected]](mailto:[email protected]) | |
| */ | |
| // Gateway | |
| $GATEWAY = "https://3dsgate-dev.borica.bg/cgi-bin/cgi_link"; // Development | |
| // $GATEWAY = "https://3dsgate.borica.bg/cgi-bin/cgi_link"; // Production | |
| // DATA: MAC_GENERAL = TERMINAL, TRTYPE, AMOUNT, CURRENCY, ORDER, DESC, MERCHANT, MERCH_NAME, ADDENDUM, AD.CUST_BOR_ORDER_ID, TIMESTAMP, NONCE, P_SIGN | |
| $TERMINAL = "V1800001"; // Идентификатор на терминала получен от БОРИКА, Размер: 8 | |
| $TRTYPE = "1"; // Тип на транзацията: 1, 12, 21, 22, 24, 90, Разпер: 1-2 | |
| $AMOUNT = "1.23"; // Сума на плащането, Формат: xx.xx, Размер: 1-12 | |
| $CURRENCY = "BGN"; // Валута на плащането, Размер: 3, Формат: ISO-4217 | |
| $ORDER = "001234"; // Номер поръчка, Размер: 6 | |
| $DESC = "Наименование на поръчката"; // Наименование на поръчката, Размер: 8-50 | |
| $MERCHANT = "V1800001"; // Идентификатор на търговеца получен от БОРИКА, Размер: 10-15, Тест: $MERCHANT = "1600000001"; | |
| $MERCH_NAME = "Наименование на търговеца"; // Наименование на търговеца, Размер: 18 | |
| $ADDENDUM = "AD,TD"; | |
| $AD_CUST_BOR_ORDER_ID = $ORDER."@".$ORDER; // ORDER + 16 символа | |
| $TIMESTAMP = gmdate("YmdHis"); // Формат: YYYYMMDDHHMMSS, UTC, Размер: 14 | |
| $NONCE = strtoupper(bin2hex(openssl_random_pseudo_bytes(16))); // Формиране на сигнатура за подписване, Размер: 1-64 | |
| $RFU = "-"; // Резервирано поле за бъдеща употреба | |
| $COUNTRY = "BG"; // Страна, Размер: 2 | |
| $MERCH_GMT = "+03"; // Часова зона на търговеца: GMT 3 | |
| $MERCH_URL = "https://www.xxx.bg"; // Линк на страницата на търговеца, Размер: 1-250 | |
| $BACKREF = "https://www.xxx.bg/borica_response.php"; // Линк при връщане след плащане, Размер: 1-250 | |
| $EMAIL = "[email protected]"; // Електронна поща, Размер: 26 | |
| // SIGN: MAC_GENERAL = TERMINAL, TRTYPE, AMOUNT, CURRENCY, ORDER, TIMESTAMP, NONCE, RFU | |
| $P_SIGN = | |
| strlen($TERMINAL).$TERMINAL. | |
| strlen($TRTYPE).$TRTYPE. | |
| strlen($AMOUNT).$AMOUNT. | |
| strlen($CURRENCY).$CURRENCY. | |
| strlen($ORDER).$ORDER. | |
| strlen($TIMESTAMP).$TIMESTAMP. | |
| strlen($NONCE).$NONCE. | |
| $RFU; | |
| // Информация за цифровия частен ключ | |
| $private_key = '-----BEGIN PRIVATE KEY----- | |
| MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5z1/LHY1GcX9f | |
| vMOBZPx3edgmqFkPd7eV136Nog9+VeM4UMfg22d64LAwpRHdfFigTPkc9leR68xT | |
| JXGeiiGJSaG+Vb9oUK3yb9W7YMhk1vJy4p2oyo77Sirki4bhh8RPIVWAqeVUgEL/ | |
| f5ZuZSNzB2cFkUOknbRwM/j98fft4lgZN/nYkYjW22UaPA7ULEBMxmQUKrJKi04S | |
| PVIG1iKzLh3jVyRsxi+giFrlQ+/jVWA0wJm8B25jsRcwObjL6+MczutVKmaNjaVy | |
| FNkBtLOWSCf4A6i4xOfafWoEx4tEa4Dl5PTqQI4PBvH6SW3lKulfNpa5m1wvnlA3 | |
| hFy9IfUPAgMBAAECggEBAJz/stI9yxQ9bEGpjovzlzsgcdngHzhpkG6EocLsryix | |
| S4dXAjxlRp9V4KmJoHnDymLQByFIqJ98XK3YkpNB5apJ0+euLkfm+8NAaZik404J | |
| LNyTzGFFneCIP4vStQo1HFM8ODG53DM1GOcnmCT5QiW8mHjk0AH02vR/haCU5kdR | |
| qQeMBnGAuqOcO3T7QcuK2AMO7BoGrkq0+V58DyCdf1UpeLoi71HCdBpj8FPHcU0H | |
| ScsPUrWXSkJSVj7R68AUtI4Sss3CEk7DbbSLcW1DfmX6esujM/fx1SLc9Bue4Ipa | |
| 0ec7wKvvMbLap0gWOOxZGRtxS9ALJ3T75AOjDx38q6ECgYEA86cPMYUePy/l9CEu | |
| F2fsr0LnpB3clwEhhMeIIjKMCTVnPlHMy8Sm9WrRdErKMpsIbOWgeIqUaPPCt3NZ | |
| FTgJnIJnFR4KI5qPOb3ZRA9OI6eliVvdgxe7e/bHe74b/v/uE6378ddtniHCIvgk | |
| 6Oi9/luImv3kYzX1pmJr/8VZQdECgYEAwznqU1QiPaUFtZwkb3hIoTcIYlKwIbmP | |
| 3HYdsS2p20WHh3XJC9nojABIBgJJYKdACzQyIy1FJJ3ga0fgkSZ5KL1LXmclXXL6 | |
| lzdQNIyF/boRP+XC7fB9MNwIClqJCnmciKWE4xCt9GgEiLnJDYnOhGiQ50BuxJFn | |
| RU6RxjAPoN8CgYEA3LmYr/mx/vf7T3/Ha3jAF716b1iF/14M6WaA0soLxkPUtcYQ | |
| yv/paCZOfRVLuzBrH4ueJdUUwUciPGKIbwqG2nvfumeuM7bOzTZJXrimxvIWqirI | |
| rvuO4qwa5uTAI+/h034n4VyRd1GJt3gop75Ab+6oABDFF4NIeGRtBhXX2CECgYB9 | |
| /QRCHouyaKsUlt3UqjWFBPT+LwrH2O8EgZ2L2EJD5c0fGF5UrZ4rq4rPhe5A1+62 | |
| zEqG9RIoHVLVKR+9zKxoJDFdjQdKFYeuyt2R7BYUtl2ndOmlkIvaWkU+GUtTXUQt | |
| 01O9DeiVUAONEQi1GfgS70CEXMqfRI725UuiMSYE1QJ/EkPO8VPbWf+BgKovYFf1 | |
| AsStOfMMvrgVn8e/vZmWluaGb40L34Dxuvv3YRk1EsQFirGZ5XDDCm5r8H1IY8Ne | |
| PXnxLP2opIuch1JHQdebFZqN1C68pX6hopEixOmwShhaNXNJ5RN8c9q+4NXIu73n | |
| lKFJBDsxoMVB/VEoVeQEMg== | |
| -----END PRIVATE KEY-----'; | |
| $private_pass = ''; | |
| /* | |
| // Отваряне на файла съдържащ цифровия частен ключ | |
| $private_key_file = "private.key"; | |
| $fp = fopen($private_key_file, "r"); | |
| $private_key = fread($fp, filesize($private_key_file)); | |
| fclose($fp); | |
| */ | |
| // Подписване на съобщението с цифров сертификат | |
| $private_key_id = openssl_get_privatekey($private_key, $private_pass); | |
| openssl_sign($P_SIGN, $signature, $private_key_id, OPENSSL_ALGO_SHA256); | |
| openssl_free_key($private_key_id); | |
| // Формиране окончателна подписана сигнатура | |
| $P_SIGN = strtoupper(bin2hex($signature)); | |
| // Формуляр за извършване на плащане | |
| echo<<<EOT | |
| <h1>Borica Request 4.0</h1> | |
| <pre> | |
| GATEWAY: $GATEWAY | |
| TERMINAL: $TERMINAL | |
| TRTYPE: $TRTYPE | |
| AMOUNT: $AMOUNT | |
| CURRENCY: $CURRENCY | |
| ORDER: $ORDER | |
| DESC: $DESC | |
| MERCHANT: $MERCHANT | |
| MERCH_NAME: $MERCH_NAME | |
| MERCH_NAME: $ADDENDUM | |
| AD_CUST_BOR_ORDER_ID: $AD_CUST_BOR_ORDER_ID | |
| TIMESTAMP: $TIMESTAMP | |
| NONCE: $NONCE | |
| RFU: $RFU | |
| COUNTRY: $COUNTRY | |
| MERCH_GMT: $MERCH_GMT | |
| MERCH_URL: $MERCH_URL | |
| BACKREF: $BACKREF | |
| EMAIL: $EMAIL | |
| P_SIGN: $P_SIGN | |
| </pre> | |
| <form action="$GATEWAY" method="post"> | |
| <!-- TERMINAL: 8 --> | |
| <input type="hidden" name="TERMINAL" value="$TERMINAL" /> | |
| <!-- TRTYPE: 1, 12, 21, 22, 24, 90 --> | |
| <input type="hidden" name="TRTYPE" value="$TRTYPE" /> | |
| <!-- AMOUNT: 1-12 --> | |
| <input type="hidden" name="AMOUNT" value="$AMOUNT" /> | |
| <!-- CURRENCY: 3 --> | |
| <input type="hidden" name="CURRENCY" value="$CURRENCY" /> | |
| <!-- ORDER: 6 --> | |
| <input type="hidden" name="ORDER" value="$ORDER" /> | |
| <!-- DESC: 8-50 --> | |
| <input type="hidden" name="DESC" value="$DESC" /> | |
| <!-- MERCHANT: 10-15 --> | |
| <input type="hidden" name="MERCHANT" value="$MERCHANT" /> | |
| <!-- MERCH_NAME: 18 --> | |
| <input type="hidden" name="MERCH_NAME" value="$MERCH_NAME" /> | |
| <!-- ADDENDUM --> | |
| <input type="hidden" name="ADDENDUM" value="$ADDENDUM" /> | |
| <!-- AD.CUST_BOR_ORDER_ID --> | |
| <input type="hidden" name="AD.CUST_BOR_ORDER_ID" value="$AD_CUST_BOR_ORDER_ID" /> | |
| <!-- TIMESTAMP: 14 --> | |
| <input type="hidden" name="TIMESTAMP" value="$TIMESTAMP" /> | |
| <!-- NONCE: 64 --> | |
| <input type="hidden" name="NONCE" value="$NONCE" /> | |
| <!-- RFU: - --> | |
| <input type="hidden" name="RFU" value="-" /> | |
| <!-- COUNTRY: 2 --> | |
| <input type="hidden" name="COUNTRY" value="$COUNTRY" /> | |
| <!-- MERCH_GMT: 3 --> | |
| <input type="hidden" name="MERCH_GMT" value="$MERCH_GMT" /> | |
| <!-- MERCH_URL: 1-250 --> | |
| <input type="hidden" name="MERCH_URL" value="$MERCH_URL" /> | |
| <!-- BACKREF: 1-250 --> | |
| <input type="hidden" name="BACKREF" value="$BACKREF" /> | |
| <!-- EMAIL: 26 --> | |
| <input type="hidden" name="EMAIL" value="$EMAIL" /> | |
| <!-- P_SIGN: 512 --> | |
| <input type="hidden" name="P_SIGN" value="$P_SIGN" /> | |
| <!-- BUTTON --> | |
| <input type="submit" value="Payment" /> | |
| </form> | |
| EOT; |
Здравейте @dimitarminchev, използвах Вашия код за тестови цели, но ако сменя BACKREF, не се актуализира. Има някакъв кеш или нещо друго трябва да се направи?
Благодаря!
Здравейте, получих известие от Борика, че ми изтичат сертификатите и сега с генерирането на новите ми изпратих и нова документация Версия: 5.0 / 29.05.2024 в моято има задължително поле M_INFO:
"Опционален Ннабор от данни по протокола EMV
3DS v.2
Трябва да бъде Base64 Basic-encoded string of
JSON-formatted “parameter”:”value” data.
Задължителни данни
- Име и фамилия на картодържател ( до 45
символа на латиница),- е-mail и / или телефонен номер"
и оставам с впечатлението, че трябва да поискам от клиента Името написано на картата с която ще плаща преди да изпратя заявката към Борика !?!?
@smilegalaxy обърни се към банката ако ти е нужна повече информация, но да, вече в m_info е нужно да се подава допълнителна информация като Имена и/или имейл адрес в документацията беше описано кое е задължително. Като информация би следвало да я имаш ако е онлайн магазин. На мен ми е интересно дали тази информация ще бъде сравнявана с истинската която е на картата, за момента си работи с всичко въведено, конкретно за името.
Иначе, аз съм си ъпдейтнал друга библиотека която ползвам https://github.com/dyanakiev-forks/borica-emv-3ds в нея подавам инфото по-следния начин:
$borica = $this->initBorica();
$boricaRequest = new SaleRequest();
$boricaRequest->setTransactionType(TransactionType::SALE)
->setAmount($amount)
->setCurrency('BGN')
->setOrder($borica_6digits_order)
->setDescription($description)
->setMerchantName($this->merchantName)
->setMerchantUrl($this->merchantUrl)
->setMerchant($this->merchant)
->setTerminal($this->terminal)
->setEmail($this->email)
->setCountry('bg')
->setLanguage('EN')
->setMerchantTimezone($this->timezoneOffset)
->setTimestamp(time())
->setNonce(strtoupper(bin2hex(openssl_random_pseudo_bytes(16))))
->setOrderIdentifier($boricaRequest->getOrder().'ORD@<п>')
->setAddendum('AD,TD')
->setMInfo(json_encode([
'cardholderName' => $payment->cardholder_name,
'email' => $payment->cardholder_email,
], JSON_UNESCAPED_UNICODE))
->sign($borica);
Бях разбрал, че CardholderName е името изписано на картата, а реално е името на потребителя - данни, които разбира се имам.
Здравейте,
<iframe src="https://3dsgate-dev.borica.bg/cgi-bin/cgi_link" width="600" height="400" ></iframe>. Може ли някакво примерче. Благодаря предварително!Позволено ли е да вградя https://3dsgate-dev.borica.bg/cgi-bin/cgi_link в iframe на сайта, като нещо от типа: