vm-labs / borica
Package that enables the communication with BORICA via their API
Installs: 3 396
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 6
Forks: 2
Open Issues: 0
Type:symfony-bundle
pkg:composer/vm-labs/borica
Requires
- php: ^7.2
- symfony/config: ^4.4
- symfony/dependency-injection: ^4.4
- symfony/form: ^4.4
- symfony/http-client: ^5.1
- symfony/http-kernel: ^4.4
- symfony/validator: ^4.4
README
This is implementation of the BORICA API for adding payments with their service. EMV 3DS protocol.
Content
Installation
Install using composer:
composer require vm-labs/borica
Enable the Bundle
# config/bundles.php <?php return [ ... Borica\BoricaBundle::class => ['all' => true], ];
Configuration
# config/packages/borica.yaml borica_api: test_url: # default https://3dsgate-dev.borica.bg/cgi-bin/cgi_link prod_url: # default https://3dsgate.borica.bg/cgi-bin/cgi_link profiles: config_1: terminal_id: # terminal id private_key: # path to private key private_key_password: # private key password public_key: # path to public key merchant: 1600000001 merchant_name: 'Payment' merchant_url: 'https://localhost' extended_mac: false # default true config_2: # optional terminal_id: # terminal id ...
Usage
Currently possible requests are - payment, cancellation and status of transaction.
The communication and transmission of parameters is done through HTML forms and HTTP post to the e-Commerce CGI server of BORICA. So with the current implementation you can check if the data is valid or take the form for a specific transaction.
Payment request
use Borica\Entity\Request as BoricaRequest; use Borica\Manager\RequestManager; class PaymentController extends AbstractController { public function __invoke(RequestManager $requestManager) { $request = new BoricaRequest(); $request->setAmount(29); $request->setDescription('Payment details.'); # You can check that the data is valid or pick up the list of errors before submitting the form. if (!$paymentRequest->isValidData()) { $errorList = $paymentRequest->getErrorList(); // ... } $paymentRequest = $requestManager->payment($request, 'config_1'); // the second argument is required if you have more than one configuration return $this->render('payment-details.html.twig', [ 'form' => $paymentRequest->getForm()->createView(), ]); } }
Response
use Borica\Manager\ResponseManager; class PaymentResponseController extends AbstractController { public function __invoke(ResponseManager $responseManager) { $boricaResponse = $this->responseManager->response(); # Verification of the signature in response from APGW if (!$boricaResponse->isValid()) { // ... } # Check if the borica response is completed successfully. if (!$boricaResponse->isSuccessful()) { $responseCode = $boricaResponse->getResponseCode(); // ... } $response = $boricaResponse->getData(); $orderId = $response->getOrderId(); // ... } }
Status
use Borica\Entity\Request as BoricaRequest; use Borica\Manager\RequestManager; class StatusRequestController extends AbstractController { public function __invoke(RequestManager $requestManager) { $request = new BoricaRequest(); $request->setOrder($order); $statusRequest = $requestManager->status($request); if (!$paymentRequest->isValidData()) { $errorList = $paymentRequest()->getErrorList(); // ... } $boricaResponse = $statusRequest->request(); if ($boricaResponse->isValid()) { // ... } if ($boricaResponse->isSuccessful()) { // ... } } }
Credit cards
| Card number | Response code | 3DS password |
|---|---|---|
| 5100770000000022 | 00 | - |
| 4341792000000044 | 00 | 111111 |
| 5555000000070019 | 04 | - |
| 5555000000070027 | 13 | - |
| 5555000000070035 | 91 | - |
| 4010119999999897 | amount dependant | - |
| 5100789999999895 | amount dependant | 111111 |
Amount dependant
| Amount | Response code | Description |
|---|---|---|
| 1,00 - 1,99 | 01 | Refer to card issuer |
| 2,00 - 2,99 | 04 | Pick up |
| 3,00 - 3,99 | 05 | Do not honour |
| 4,00 - 4,99 | 13 | Invalid amount |
| 5,00 - 5,99 | 30 | Format error |
| 6,00 - 6,99 | 91 | Issuer or switch is inoperative |
| 7,00 - 7,99 | 96 | System Malfunction |
| 8,00 - 8,99 | - | Timeout |
| 30,00 - 40,00 | 01 | Refer to card issuer |
| 50,00 - 70,00 | 04 | Pick up |
| 80,00 - 90,00 | 05 | Do not Honour |
| 100,00 - 110,00 | 13 | Invalid amount |
| 120,00 - 130,00 | 30 | Format error |
| 140,00 - 150,00 | 91 | Issuer or switch is inoperative |
| 160,00 - 170,00 | 96 | System Malfunction |
| 180,00 - 190,00 | - | Timeout |
| 10000,65 - 10000,65 | 65/1A | Soft Decline |
Response codes
ISO_8583
| Response Code | Description |
|---|---|
| 00 | Successfully completed |
| 01 | Refer to card issuer |
| 04 | Pick Up |
| 05 | Do not Honour |
| 06 | Error |
| 12 | Invalid transaction |
| 13 | Invalid amount |
| 14 | No such card |
| 15 | No such issuer |
| 17 | Customer cancellation |
| 30 | Format error |
| 35 | Pick up, card acception contact acquirer |
| 36 | Pick up, card restricted |
| 37 | Pick up, call acquirer security |
| 38 | Pick up, allowable PIN tries exceeded |
| 39 | No credit account |
| 40 | Requested function not supported |
| 41 | Pick up, lost card |
| 42 | No universal account |
| 43 | Pick up, stolen card |
| 54 | Expired card / target |
| 55 | Incorrect PIN |
| 56 | No card record |
| 57 | Transaction not permitted to cardholder |
| 58 | Transaction not permitted to terminal |
| 59 | Suspected fraud |
| 85 | No reason to decline |
| 88 | Cryptographic failure |
| 89 | Authentication failure |
| 91 | Issuer or switch is inoperative |
| 95 | Reconscile error / auth not found |
| 96 | System malfunction |
APGW response codes
| Response Code | Descriptioin |
|---|---|
| -1 | A mandatory request field is not filled in |
| -2 | CGI request validation failed |
| -3 | Acquirer host (TS) does not respond or wrong format of e-gateway response template file |
| -4 | No connection to the acquirer host (TS) |
| -5 | The acquirer host (TS) connection failed during transaction processing |
| -6 | e-Gateway configuration error |
| -7 | The acquirer host (TS) response is invalid, e.g. mandatory fields missing |
| -8 | Error in the "Card number" request field |
| -9 | Error in the "Card expiration date" request field |
| -10 | Error in the "Amount" request field |
| -11 | Error in the "Currency" request field |
| -12 | Error in the "Merchant ID" request field |
| -13 | The referrer IP address (usually the merchant's IP) is not the one expected |
| -14 | No connection to the internet terminal PIN pad or agent program is not running on the internet terminal computer/workstation |
| -15 | Error in the "RRN" request field |
| -16 | Another transaction is being performed on the terminal |
| -17 | The terminal is denied access to e-Gateway |
| -18 | Error in the CVC2 or CVC2 Description request fields |
| -19 | Error in the authentication information request or authentication failed |
| -20 | The permitted time interval (1 hour by default) between the transaction timestamp request field and the e-Gateway time was exceeded |
| -21 | The transaction has already been executed |
| -22 | Transaction contains invalid authentication information |
| -23 | Invalid transaction context |
| -24 | Transaction context data mismatch |
| -25 | Transaction canceled (e.g. by user) |
| -26 | Invalid action BIN |
| -27 | Invalid merchant name |
| -28 | Invalid incoming addendum(s) |
| -29 | Invalid/duplicate authentication reference |
| -30 | Transaction was declined as fraud |
| -31 | Transaction already in progress |
| -32 | Duplicate declined transaction |
| -33 | Customer authentication by random amount or verify one-time code in progress |
| -34 | Mastercard Installment customer choice in progress |
| -35 | Mastercard Installments auto canceled |
| -36 | Mastercard Installment user canceled |