{"id":36970224,"url":"https://github.com/veneliniliev/borica-3ds","last_synced_at":"2026-01-13T21:46:01.964Z","repository":{"id":48905290,"uuid":"299261050","full_name":"veneliniliev/borica-3ds","owner":"veneliniliev","description":"PHP Borica EMV 3DS library","archived":false,"fork":false,"pushed_at":"2025-12-12T11:12:56.000Z","size":136,"stargazers_count":24,"open_issues_count":1,"forks_count":5,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-12-13T18:42:13.922Z","etag":null,"topics":["3ds","borica","borica-3ds","cards","payment-gateway","payments","php"],"latest_commit_sha":null,"homepage":"https://veneliniliev.com","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/veneliniliev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-09-28T09:40:12.000Z","updated_at":"2025-12-12T11:12:59.000Z","dependencies_parsed_at":"2025-10-01T05:21:05.650Z","dependency_job_id":null,"html_url":"https://github.com/veneliniliev/borica-3ds","commit_stats":null,"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/veneliniliev/borica-3ds","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veneliniliev%2Fborica-3ds","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veneliniliev%2Fborica-3ds/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veneliniliev%2Fborica-3ds/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veneliniliev%2Fborica-3ds/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/veneliniliev","download_url":"https://codeload.github.com/veneliniliev/borica-3ds/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veneliniliev%2Fborica-3ds/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28401084,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-13T14:36:09.778Z","status":"ssl_error","status_checked_at":"2026-01-13T14:35:19.697Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["3ds","borica","borica-3ds","cards","payment-gateway","payments","php"],"created_at":"2026-01-13T21:46:01.143Z","updated_at":"2026-01-13T21:46:01.959Z","avatar_url":"https://github.com/veneliniliev.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PHP Borica EMV 3DS\n\n## Requirements\n\n- PHP \u003e= 5.6 (including 8.5)\n- ext-mbstring\n- ext-openssl\n- ext-curl\n- ext-json\n\n## Installation\n\nInstall the package via Composer:\n\n```shell script\ncomposer require veneliniliev/borica-3ds\n```\n\n### Version Compatibility\n\n| Library Version | Supported Signing Schemas                       | Default Signing Schema | PHP Support      |\n|-----------------|-------------------------------------------------|------------------------|------------------|\n| ^2.0           | MAC_EXTENDED, MAC_ADVANCED, MAC_GENERAL         | MAC_GENERAL           | PHP 5.6 - 8.5    |\n| ^1.0           | MAC_EXTENDED, MAC_ADVANCED                      | MAC_ADVANCED          | PHP 5.6 - 8.5    |\n\n### Signing Schema Information\n\n- **MAC_GENERAL**: The latest schema with enhanced security (default in v2.0+)\n- **MAC_EXTENDED**: Extended schema with additional fields\n- **MAC_ADVANCED**: Advanced schema with specific field requirements\n\nYou can switch between signing schemas using the following methods:\n- `setSigningSchemaMacGeneral()` - Use MAC_GENERAL schema\n- `setSigningSchemaMacExtended()` - Use MAC_EXTENDED schema\n- `setSigningSchemaMacAdvanced()` - Use MAC_ADVANCED schema\n\nFor more methods, read [api documentation](API.md).\n\nFor official Borica resources like their API documentation, public keys for validation and more visit https://3dsgate-dev.borica.bg/\n\n## Certificates\n\n### Generate private key\n\n```shell script\n# Production key\nopenssl genrsa -out production.key -aes256 2048\n# Development key\nopenssl genrsa -out development.key -aes256 2048\n```\n\n### Generate CSR\n\n**IMPORTANT**: in `Organizational Unit Name (eg, section)` enter your terminal ID and\nin `Common Name (eg, fully qualified host name)` enter your domain name.\n\n```shell script\n# Production csr\nopenssl req -new -key production.key -out VNNNNNNN_YYYYMMDD_P.csr\n# Development csr\nopenssl req -new -key development.key -out VNNNNNNN_YYYYMMDD_D.csr\n```\n\nИмената на файловете се създават по следната конвенция: **VNNNNNNN_YYYYMMDD_T**, където:\n\n- **VNNNNNNN** – TID на терминала, предоставен от Финансовата Институция\n- **YYYYMMDD** – дата на заявка\n- **T** – тип на искания сертификат, значения – **D** – за development среда, **Р** – за продукционна среда\n\n## Usage\n\n**IMPORTANT**: Switch signing schema MAC_EXTENDED / MAC_ADVANCED / MAC_GENERAL with methods:\n\n````php\n$saleRequest-\u003esetSigningSchemaMacGeneral(); // use MAC_GENERAL\n$saleRequest-\u003esetSigningSchemaMacExtended(); // use MAC_EXTENDED\n$saleRequest-\u003esetSigningSchemaMacAdvanced(); // use MAC_ADVANCED\n````\n\nDefault signing schema is **MAC_GENERAL**!\n\n### Sale request\n\n````php\nuse VenelinIliev\\Borica3ds\\SaleRequest;\n// ...\n$saleRequest = (new SaleRequest())\n    -\u003esetAmount(123.32)\n    -\u003esetOrder(123456)\n    -\u003esetDescription('test')\n    -\u003esetMerchantUrl('https://test.com') // optional\n    -\u003esetTerminalID('\u003cTID - V*******\u003e')\n    -\u003esetMerchantId('\u003cMID - 15 chars\u003e')\n    -\u003esetPrivateKey('\\\u003cpath to certificate.key\u003e', '\u003cpassword / or use method from bottom\u003e')\n    -\u003esetMInfo(array( // Mandatory cardholderName and ( email or MobilePhone )\n        'email'=\u003e'user@sample.com',\n        'cardholderName'=\u003e'CARDHOLDER NAME', // Max 45 chars\n        'mobilePhone'=\u003e array( \n            'cc'=\u003e'359', // Country code\n            'subscriber'=\u003e'8939999888', // Subscriber number\n        ),\n        'threeDSRequestorChallengeInd'=\u003e'04', //  Optional for Additional Authentication\n    ))\n    //-\u003esetSigningSchemaMacGeneral(); // use MAC_GENERAL\n    //-\u003esetSigningSchemaMacExtended(); // use MAC_EXTENDED\n    //-\u003esetSigningSchemaMacAdvanced(); // use MAC_ADVANCED\n    -\u003esetPrivateKeyPassword('test');\n\n$formHtml = $saleRequest-\u003egenerateForm(); // only generate hidden html form with filled inputs \n// OR\n$saleRequest-\u003esend(); // generate and send form with js \n````\n\n### Sale response\n\nCatch response from borica on `BACKREF` url\n\n`-\u003esetPublicKey` is the Borica public key and not the one you've generated. You can download borica key for DEV and PROD environment from here: https://3dsgate-dev.borica.bg/\n\n```php\nuse VenelinIliev\\Borica3ds\\SaleResponse;\n// ....\n$isSuccessfulPayment = (new SaleResponse())\n            -\u003esetPublicKey('\u003cpath to public certificate.cer\u003e') # Borica public key for the specific env\n            -\u003esetResponseData($_POST) //Set POST data from borica response\n            //-\u003esetSigningSchemaMacGeneral(); // use MAC_GENERAL\n            //-\u003esetSigningSchemaMacExtended(); // use MAC_EXTENDED\n            //-\u003esetSigningSchemaMacAdvanced(); // use MAC_ADVANCED\n            -\u003eisSuccessful();\n```\n\n#### Get response code\n\n```php\nuse VenelinIliev\\Borica3ds\\SaleResponse;\n// ...\n$saleResponse= (new SaleResponse())\n               -\u003esetPublicKey('\u003cpath to public certificate.cer\u003e')  # Borica public key for the specific env\n               //-\u003esetSigningSchemaMacGeneral(); // use MAC_GENERAL\n               //-\u003esetSigningSchemaMacExtended(); // use MAC_EXTENDED\n               //-\u003esetSigningSchemaMacAdvanced(); // use MAC_ADVANCED\n\n// ...\n// automatic fill data from $_POST or can be set by -\u003esetResponseData(\u003carray\u003e)\n// ...\n\n$saleResponse-\u003egetResponseCode(); // return RC from response\n$saleResponse-\u003egetVerifiedData('\u003ckey from post request ex: RC\u003e'); // return verified data from post by key\n$saleResponse-\u003eisSuccessful(); // RC === 00 and data is verified\n```\n\nResponse codes table\n\n| Response Code (RC) | RC DESCRIPTION                  |    \n|--------------------|---------------------------------|   \n| 00                 | Sucessfull                      |\n|                    | =\u003e Timeout                      |\n| \"01\"               | Refer to card issuer            |\n| \"04\"               | Pick Up                         |\n| \"05\"               | Do not Honour                   |\n| \"13\"               | Invalid amount                  |\n| \"30\"               | Format error                    |\n| \"65\"               | Soft Decline                    |\n| \"91\"               | Issuer or switch is inoperative |\n| \"96\"               | System Malfunction              |   \n\n### Transaction status check\n\n```php\n use VenelinIliev\\Borica3ds\\Enums\\TransactionType;\n use VenelinIliev\\Borica3ds\\StatusCheckRequest;\n // ...\n $statusCheckRequest = (new StatusCheckRequest())\n    //-\u003einDevelopment()\n    -\u003esetPrivateKey('\\\u003cpath to certificate.key\u003e', '\u003cpassword / or use method from bottom\u003e')\n    -\u003esetPublicKey('\u003cpath to public certificate.cer\u003e')\n    -\u003esetTerminalID('\u003cTID - V*******\u003e')\n    -\u003esetOrder('\u003corder\u003e')\n    -\u003esetOriginalTransactionType(TransactionType::SALE()) // transaction type\n    //-\u003esetSigningSchemaMacGeneral(); // use MAC_GENERAL\n    //-\u003esetSigningSchemaMacExtended(); // use MAC_EXTENDED\n    //-\u003esetSigningSchemaMacAdvanced(); // use MAC_ADVANCED\n\n        \n//send to borica\n$statusCheckResponse = $statusCheckRequest-\u003esend();\n \n// get data from borica response\n$verifiedResponseData = $statusCheckResponse-\u003egetResponseData();\n\n// get field from borica response\n$statusCheckResponse-\u003egetVerifiedData('\u003cfield from response. ex: ACTION');\n\n```\n\n### Reversal request\n\n```php\n use VenelinIliev\\Borica3ds\\ReversalRequest;\n // ...\n $reversalRequest = (new ReversalRequest())\n        //-\u003einDevelopment()\n        -\u003esetPrivateKey('\\\u003cpath to certificate.key\u003e', '\u003cpassword / or use method from bottom\u003e')\n        -\u003esetPublicKey('\u003cpath to public certificate.cer\u003e')\n        -\u003esetTerminalID('\u003cTID - V*******\u003e')\n        -\u003esetAmount(123.32)\n        -\u003esetOrder(123456)\n        -\u003esetDescription('test reversal')\n        -\u003esetMerchantId('\u003cMID - 15 chars\u003e')\n        -\u003esetRrn('\u003cRRN - Original transaction reference (From the sale response data)\u003e')\n        -\u003esetIntRef('\u003cINT_REF - Internal reference (From the sale response data)\u003e')\n        //-\u003esetSigningSchemaMacGeneral(); // use MAC_GENERAL\n        //-\u003esetSigningSchemaMacExtended(); // use MAC_EXTENDED\n        //-\u003esetSigningSchemaMacAdvanced(); // use MAC_ADVANCED\n        \n//send reversal request to borica\n$reversalRequestResponse = $reversalRequest-\u003esend();\n\n// get data from borica reversal response\n$verifiedResponseData = $reversalRequestResponse-\u003egetResponseData();\n\n// get field from borica reversal response\n$reversalRequestResponse-\u003egetVerifiedData('STATUSMSG');\n```\n### Pre-authorisation\n\nYou can also send pre-authorisation requests like this \n\n````php\nuse VenelinIliev\\Borica3ds\\PreAuthorisationRequest;\n// ...\n$preAuthorisationRequest = (new PreAuthorisationRequest())\n    -\u003esetAmount(123.32)\n    -\u003esetOrder(123456)\n    -\u003esetDescription('test')\n    -\u003esetMerchantUrl('https://test.com') // optional\n    -\u003esetTerminalID('\u003cTID - V*******\u003e')\n    -\u003esetMerchantId('\u003cMID - 15 chars\u003e')\n    -\u003esetPrivateKey('\\\u003cpath to certificate.key\u003e', '\u003cpassword / or use method from bottom\u003e')\n    -\u003esetMInfo(array( // Mandatory cardholderName and ( email or MobilePhone )\n        'email'=\u003e'user@sample.com',\n        'cardholderName'=\u003e'CARDHOLDER NAME', // Max 45 chars\n        'mobilePhone'=\u003e array( \n            'cc'=\u003e'359', // Country code\n            'subscriber'=\u003e'8939999888', // Subscriber number\n        ),\n        'threeDSRequestorChallengeInd'=\u003e'04', //  Optional for Additional Authentication\n    ))\n    //-\u003esetSigningSchemaMacGeneral(); // use MAC_GENERAL\n    //-\u003esetSigningSchemaMacExtended(); // use MAC_EXTENDED\n    //-\u003esetSigningSchemaMacAdvanced(); // use MAC_ADVANCED\n    -\u003esetPrivateKeyPassword('test');\n\n$formHtml = $preAuthorisationRequest-\u003egenerateForm(); // only generate hidden html form with filled inputs \n// OR\n$preAuthorisationRequest-\u003esend(); // generate and send form with js \n````\n\n### Pre-authorisation completion\n\nAfter successful pre-authorisation in 30 days you can make only successful/failed completion.\n\n```php\n $response = (new PreAuthorisationCompletionRequest())\n    //-\u003einDevelopment()\n    -\u003esetPrivateKey('\\\u003cpath to certificate.key\u003e', '\u003cpassword / or use method from bottom\u003e')\n    -\u003esetPublicKey('\u003cpath to public certificate.cer\u003e')\n    -\u003esetTerminalID('\u003cTID - V*******\u003e')\n    -\u003esetAmount(123.32)\n    -\u003esetOrder(123456)\n    -\u003esetDescription('test reversal')\n    -\u003esetMerchantId('\u003cMID - 15 chars\u003e')\n    -\u003esetRrn('\u003cRRN - Original transaction reference (From the sale response data)\u003e')\n    -\u003esetIntRef('\u003cINT_REF - Internal reference (From the sale response data)\u003e')\n    //-\u003esetSigningSchemaMacGeneral(); // use MAC_GENERAL\n    //-\u003esetSigningSchemaMacExtended(); // use MAC_EXTENDED\n    //-\u003esetSigningSchemaMacAdvanced(); // use MAC_ADVANCED\n    -\u003esend();\n\n$isSuccessful = $response-\u003egetVerifiedData('ACTION') === Action::SUCCESS \u0026\u0026\n    $response-\u003eisSuccessful();\n```\n### Pre-authorisation reversal\n\nThe pre-authorisation reversal request is almost the same as completion request. But this request require the amount to\nbe the same as the amount of the pre-authorisation.\n```php\n$response = (new PreAuthorisationReversalRequest())\n    //-\u003einDevelopment()\n    -\u003esetPrivateKey('\\\u003cpath to certificate.key\u003e', '\u003cpassword / or use method from bottom\u003e')\n    -\u003esetPublicKey('\u003cpath to public certificate.cer\u003e')\n    -\u003esetTerminalID('\u003cTID - V*******\u003e')\n    -\u003esetAmount(123.32)\n    -\u003esetOrder(123456)\n    -\u003esetDescription('test reversal')\n    -\u003esetMerchantId('\u003cMID - 15 chars\u003e')\n    -\u003esetRrn('\u003cRRN - Original transaction reference (From the sale response data)\u003e')\n    -\u003esetIntRef('\u003cINT_REF - Internal reference (From the sale response data)\u003e')\n    //-\u003esetSigningSchemaMacGeneral(); // use MAC_GENERAL\n    //-\u003esetSigningSchemaMacExtended(); // use MAC_EXTENDED\n    //-\u003esetSigningSchemaMacAdvanced(); // use MAC_ADVANCED\n    -\u003esend();\n\n$isSuccessful = $response-\u003egetVerifiedData('ACTION') === Action::SUCCESS \u0026\u0026\n    $response-\u003eisSuccessful();\n```\n\n### Determine the response\n\nYou can use the determineResponse() get the instance of correct response class. If you do not provide an array with data\nit will take the data from $_POST.\n\n```php\n$boricaResponse = (Response::determineResponse())\n```\n\n### Methods\n\n#### Set environments\n\nDefault environment is **production**!\n\n```php\n$saleRequest-\u003esetEnvironment(true); // set to production\n$saleRequest-\u003esetEnvironment(false); // set to development\n$saleRequest-\u003einDevelopment(); // set to development\n$saleRequest-\u003einProduction(); // set to production\n\n$saleRequest-\u003eisProduction(); // check is production environment?\n$saleRequest-\u003eisDevelopment(); // check is development environment?\n```\n\n#### Configure language\n\nThe library supports setting the language for the user payment form. Use the `setLang` method to set a specific language based on the enum `VenelinIliev\\Borica3ds\\Enums\\Language`. Supported languages are **Bulgarian (BG)** and **English (EN)**.\n\n```php\nuse VenelinIliev\\Borica3ds\\SaleRequest;\nuse VenelinIliev\\Borica3ds\\Enums\\Language;\n\n$saleRequest = (new SaleRequest())\n    -\u003esetAmount(100.50) // Transaction amount.\n    -\u003esetOrder('123456') // Unique order number.\n    -\u003esetDescription('Test product purchase') // Order description.\n    -\u003esetTerminalID('\u003cTID - V*******\u003e') // Terminal ID.\n    -\u003esetMerchantId('\u003cMID - 15 chars\u003e') // Merchant ID.\n    -\u003esetPrivateKey('\u003cpath to private key\u003e', '\u003cpassword\u003e')\n    -\u003esetLang(Language::EN()); // Set transaction language to English.\n\n// Alternatively, set the language to Bulgarian.\n$saleRequest-\u003esetLang(Language::BG());\n```\n\nIf an invalid language code is provided, the library will throw a `ParameterValidationException`.\n\nExample with an invalid language code:\n\n```php\n$saleRequest-\u003esetLang('DE'); // Throws exception because 'DE' is not supported.\n```\n\nUsing `setLang` ensures that users are presented with a language-specific payment form, delivering a more user-friendly experience.\n\n### Configure currency\n\nWith Bulgaria joining the Eurozone, you can now set the currency to EUR using the `setCurrency` method.\n\n```php\nuse VenelinIliev\\Borica3ds\\SaleRequest;\n\n$saleRequest = (new SaleRequest())\n    -\u003esetAmount(100.50) // Transaction amount.\n    -\u003esetOrder('123456') // Unique order number.\n    -\u003esetDescription('Test product purchase') // Order description.\n    -\u003esetTerminalID('\u003cTID - V*******\u003e') // Terminal ID.\n    -\u003esetMerchantId('\u003cMID - 15 chars\u003e') // Merchant ID.\n    -\u003esetPrivateKey('\u003cpath to private key\u003e', '\u003cpassword\u003e')\n    -\u003esetCurrency('EUR'); // Set transaction currency to Euro\n```\n\nThis is especially important following Bulgaria's adoption of the Euro as its official currency.\n\n### Additional Configuration Options\n\n#### Set country code\n\n```php\n$saleRequest-\u003esetCountryCode('BG'); // Set the country code (2-letter ISO code)\n```\n\n#### Set merchant GMT timezone\n\n```php\n$saleRequest-\u003esetMerchantGMT('+02'); // Set the merchant's timezone offset\n```\n\n#### Set merchant name\n\n```php\n$saleRequest-\u003esetMerchantName('My Company Ltd.'); // Set the merchant's name\n```\n\n#### Set notification email\n\n```php\n$saleRequest-\u003esetEmailAddress('notification@mycompany.com'); // Set notification email address\n```\n\n#### Set 'AD.CUST_BOR_ORDER_ID' field\n\n```php\n$saleRequest-\u003esetAdCustBorOrderId('ORDER123456'); // Set identifier for the bank's financial files\n```\n\n### Advanced Transaction Types\n\n#### Pre-authorisation\n\nYou can send pre-authorisation requests:\n\n```php\nuse VenelinIliev\\Borica3ds\\PreAuthorisationRequest;\n\n$preAuthorisationRequest = (new PreAuthorisationRequest())\n    -\u003esetAmount(123.32)\n    -\u003esetOrder(123456)\n    -\u003esetDescription('test pre-authorisation')\n    -\u003esetMerchantUrl('https://test.com') // optional\n    -\u003esetTerminalID('\u003cTID - V*******\u003e')\n    -\u003esetMerchantId('\u003cMID - 15 chars\u003e')\n    -\u003esetPrivateKey('\\\u003cpath to certificate.key\u003e', '\u003cpassword\u003e')\n    -\u003esetMInfo(array( // Mandatory cardholderName and ( email or MobilePhone )\n        'email'=\u003e'user@sample.com',\n        'cardholderName'=\u003e'CARDHOLDER NAME', // Max 45 chars\n        'mobilePhone'=\u003e array(\n            'cc'=\u003e'359', // Country code\n            'subscriber'=\u003e'8939999888', // Subscriber number\n        ),\n    ))\n    -\u003esetPrivateKeyPassword('test');\n\n$formHtml = $preAuthorisationRequest-\u003egenerateForm(); // only generate hidden html form with filled inputs\n// OR\n$preAuthorisationRequest-\u003esend(); // generate and send form with js\n```\n\n#### Pre-authorisation completion\n\nAfter successful pre-authorisation, you can complete the transaction within 30 days:\n\n```php\nuse VenelinIliev\\Borica3ds\\PreAuthorisationCompletionRequest;\n\n$response = (new PreAuthorisationCompletionRequest())\n    //-\u003einDevelopment()\n    -\u003esetPrivateKey('\\\u003cpath to certificate.key\u003e', '\u003cpassword\u003e')\n    -\u003esetPublicKey('\u003cpath to public certificate.cer\u003e')\n    -\u003esetTerminalID('\u003cTID - V*******\u003e')\n    -\u003esetAmount(123.32)\n    -\u003esetOrder(123456)\n    -\u003esetDescription('pre-authorisation completion')\n    -\u003esetMerchantId('\u003cMID - 15 chars\u003e')\n    -\u003esetRrn('\u003cRRN - Original transaction reference\u003e')\n    -\u003esetIntRef('\u003cINT_REF - Internal reference\u003e')\n    //-\u003esetSigningSchemaMacGeneral(); // use MAC_GENERAL\n    //-\u003esetSigningSchemaMacExtended(); // use MAC_EXTENDED\n    //-\u003esetSigningSchemaMacAdvanced(); // use MAC_ADVANCED\n    -\u003esend();\n\n$isSuccessful = $response-\u003egetVerifiedData('ACTION') === \\VenelinIliev\\Borica3ds\\Enums\\Action::SUCCESS \u0026\u0026\n    $response-\u003eisSuccessful();\n```\n\n#### Pre-authorisation reversal\n\nYou can reverse a pre-authorisation:\n\n```php\nuse VenelinIliev\\Borica3ds\\PreAuthorisationReversalRequest;\n\n$response = (new PreAuthorisationReversalRequest())\n    //-\u003einDevelopment()\n    -\u003esetPrivateKey('\\\u003cpath to certificate.key\u003e', '\u003cpassword\u003e')\n    -\u003esetPublicKey('\u003cpath to public certificate.cer\u003e')\n    -\u003esetTerminalID('\u003cTID - V*******\u003e')\n    -\u003esetAmount(123.32)\n    -\u003esetOrder(123456)\n    -\u003esetDescription('pre-authorisation reversal')\n    -\u003esetMerchantId('\u003cMID - 15 chars\u003e')\n    -\u003esetRrn('\u003cRRN - Original transaction reference\u003e')\n    -\u003esetIntRef('\u003cINT_REF - Internal reference\u003e')\n    //-\u003esetSigningSchemaMacGeneral(); // use MAC_GENERAL\n    //-\u003esetSigningSchemaMacExtended(); // use MAC_EXTENDED\n    //-\u003esetSigningSchemaMacAdvanced(); // use MAC_ADVANCED\n    -\u003esend();\n\n$isSuccessful = $response-\u003egetVerifiedData('ACTION') === \\VenelinIliev\\Borica3ds\\Enums\\Action::SUCCESS \u0026\u0026\n    $response-\u003eisSuccessful();\n```\n\n#### Transaction status check\n\nCheck the status of a transaction:\n\n```php\nuse VenelinIliev\\Borica3ds\\Enums\\TransactionType;\nuse VenelinIliev\\Borica3ds\\StatusCheckRequest;\n\n$statusCheckRequest = (new StatusCheckRequest())\n    //-\u003einDevelopment()\n    -\u003esetPrivateKey('\\\u003cpath to certificate.key\u003e', '\u003cpassword\u003e')\n    -\u003esetPublicKey('\u003cpath to public certificate.cer\u003e')\n    -\u003esetTerminalID('\u003cTID - V*******\u003e')\n    -\u003esetOrder('\u003corder\u003e')\n    -\u003esetOriginalTransactionType(TransactionType::SALE()) // transaction type\n    //-\u003esetSigningSchemaMacGeneral(); // use MAC_GENERAL\n    //-\u003esetSigningSchemaMacExtended(); // use MAC_EXTENDED\n    //-\u003esetSigningSchemaMacAdvanced(); // use MAC_ADVANCED\n\n//send to borica\n$statusCheckResponse = $statusCheckRequest-\u003esend();\n\n// get data from borica response\n$verifiedResponseData = $statusCheckResponse-\u003egetResponseData();\n\n// get field from borica response\n$statusCheckResponse-\u003egetVerifiedData('\u003cfield from response. ex: ACTION');\n```\n\n#### Reversal request\n\nReverse a completed transaction:\n\n```php\nuse VenelinIliev\\Borica3ds\\ReversalRequest;\n\n$reversalRequest = (new ReversalRequest())\n    //-\u003einDevelopment()\n    -\u003esetPrivateKey('\\\u003cpath to certificate.key\u003e', '\u003cpassword\u003e')\n    -\u003esetPublicKey('\u003cpath to public certificate.cer\u003e')\n    -\u003esetTerminalID('\u003cTID - V*******\u003e')\n    -\u003esetAmount(123.32)\n    -\u003esetOrder(123456)\n    -\u003esetDescription('reversal')\n    -\u003esetMerchantId('\u003cMID - 15 chars\u003e')\n    -\u003esetRrn('\u003cRRN - Original transaction reference\u003e')\n    -\u003esetIntRef('\u003cINT_REF - Internal reference\u003e')\n    //-\u003esetSigningSchemaMacGeneral(); // use MAC_GENERAL\n    //-\u003esetSigningSchemaMacExtended(); // use MAC_EXTENDED\n    //-\u003esetSigningSchemaMacAdvanced(); // use MAC_ADVANCED\n\n//send reversal request to borica\n$reversalRequestResponse = $reversalRequest-\u003esend();\n\n// get data from borica reversal response\n$verifiedResponseData = $reversalRequestResponse-\u003egetResponseData();\n\n// get field from borica reversal response\n$reversalRequestResponse-\u003egetVerifiedData('STATUSMSG');\n```\n\n### Determine Response Type\n\nYou can use the `determineResponse()` method to automatically get the correct response instance:\n\n```php\nuse VenelinIliev\\Borica3ds\\Response;\n\n$boricaResponse = Response::determineResponse(); // Will auto-detect the response type from $_POST data\n// OR\n$boricaResponse = Response::determineResponse($customData); // Process with custom data array\n\n// The returned response object will be the correct type based on the transaction type\n// and can be used with all the standard response methods like isSuccessful(), getVerifiedData(), etc.\n```\n\n### Response Code and Action Enums\n\nThe library includes enums for response codes and actions:\n\n```php\n// Action constants\nuse VenelinIliev\\Borica3ds\\Enums\\Action;\n\n// Action values:\n// Action::SUCCESS = '0' - Transaction successfully completed\n// Action::DUPLICATE = '1' - Duplicate transaction found\n// Action::DECLINE = '2' - Transaction declined\n// Action::PROCESSING_ERROR = '3' - Transaction processing error\n// Action::DUPLICATE_DECLINE = '6' - Duplicate, declined transaction\n// Action::DUPLICATE_AUTHENTICATION_ERROR = '7' - Duplicate, authentication error\n// Action::DUPLICATE_NO_RESPONSE = '8' - Duplicate, no response\n// Action::SOFT_DECLINE = '21' - Soft decline\n\n// TransactionType values:\n// TransactionType::SALE = 1\n// TransactionType::PRE_AUTHORISATION = 12\n// TransactionType::PRE_AUTHORISATION_COMPLETION = 21\n// TransactionType::PRE_AUTHORISATION_REVERSAL = 22\n// TransactionType::TRANSACTION_STATUS_CHECK = 90\n// TransactionType::REVERSAL = 24\n```\n\n### Credit cards for testing\n\n#### Cards\n\n| Тип на карта | Номер на карта (PAN) | Реакция на APGW / Reponse code                                                          | Response Code Описание          | Изисква тестов ACS    |\n|--------------|----------------------|-----------------------------------------------------------------------------------------|---------------------------------|-----------------------|\n| Mastecard    | 5100770000000022     | Response code = 00                                                                      | Successfully completed          | Не                    |\n| Mastecard    | 5555000000070019     | Response code = 04                                                                      | Pick Up                         | Не                    |\n| Mastecard    | 5555000000070027     | Системата се забавя 30 сек. за авторизация, Response code = 13                          | Invalid amount                  | Не                    |\n| Mastecard    | 5555000000070035     | Timeout, Response code = 91                                                             | Issuer or switch is inoperative | Не                    |\n| Visa         | 4341792000000044     | Response code = 00 Това е пълен тест с автентификация от тестов Visa ACS и авторизация. | Successfully Completed          | Да, паролата е 111111 |\n\n#### Карти, за които се получава съответен резултат при транзакция според сумата\n\n| Тип на карта | Номер на карта (PAN) | Реакция на APGW / RC                     | Изисква тестов ACS    |     |\n|--------------|----------------------|------------------------------------------|-----------------------|-----|\n| Visa         | 4010119999999897     | Зависи от сумата. Виж таблицата по-долу. | Не                    |     |\n| Mastecard    | 5100789999999895     |                                          | Да, паролата е 111111 |     |\n\n| Сума от | Сума до | Реакция на APGW / Reponse code | RC Описание                     | Коментар              |\n|---------|---------|--------------------------------|---------------------------------|-----------------------|\n| 1.00    | 1.99    | 01                             | Refer to card issuer            |                       |\n| 2.00    | 2.99    | 04                             | Pick Up                         |                       |\n| 3.00    | 3.99    | 05                             | Do not Honour                   |                       |\n| 4.00    | 4.99    | 13                             | Invalid amount                  | Response after 30 sec |\n| 5.00    | 5.99    | 30                             | Format error                    |                       |\n| 6.00    | 6.99    | 91                             | Issuer or switch is inoperative |                       |\n| 7.00    | 7.99    | 96                             | System Malfunction              |                       |\n| 8.00    | 8.99    |                                | Timeout                         |                       |\n| 30.00   | 40.00   | 01                             | Refer to card issuer            |                       |\n| 50.00   | 70.00   | 04                             | Pick Up                         |                       |\n| 80.00   | 90.00   | 05                             | Do not Honour                   |                       |\n| 100.00  | 110.00  | 13                             | Invalid amount                  | Response after 30 sec |\n| 120.00  | 130.00  | 30                             | Format error                    |                       |\n| 140.00  | 150.00  | 91                             | Issuer or switch is inoperative |                       |\n| 160.00  | 170.00  | 96                             | System Malfunction              |                       |\n| 180.00  | 190.00  |                                | Timeout                         |                       |\n\n## Todo\n\n- laravel integration\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fveneliniliev%2Fborica-3ds","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fveneliniliev%2Fborica-3ds","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fveneliniliev%2Fborica-3ds/lists"}