-
-
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; |
Здравейте, получих известие от Борика, че ми изтичат сертификатите и сега с генерирането на новите ми изпратих и нова документация Версия: 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 е името изписано на картата, а реално е името на потребителя - данни, които разбира се имам.
Здравейте @dimitarminchev, използвах Вашия код за тестови цели, но ако сменя BACKREF, не се актуализира. Има някакъв кеш или нещо друго трябва да се направи?
Благодаря!