File manager - Edit - /home/u816558632/domains/postills.com/public_html/public/razorpay.tar
Back
razorpay/.travis.yml 0000644 00000003273 15002216177 0010532 0 ustar 00 dist: precise language: php php: - 7.3 - 7.4 - 8.0 - 8.1 install: composer install before_script: - cp phpunit.xml.dist phpunit.xml # These two are required in the build step for non-composer-tests - mkdir -p libs - cd libs && wget https://github.com/rmccue/Requests/archive/v2.0.4.zip -O requests.zip && unzip requests.zip && rm requests.zip && cd .. - rm -rf libs/Requests-2.0.4/examples libs/Requests-2.0.4/docs libs/Requests-2.0.4/bin libs/Requests-2.0.4/tests script: # Run a syntax validation check on all PHP files - find . -path ./vendor -prune -o -iname '*.php' |xargs -n1 php -l - ./vendor/bin/phpunit notifications: slack: secure: fLT1x7BCXi8+sP1Qk1lP74+60JIBCw2clUTSOmB0OuoQGWYIJ4qelKcGH5FFsADGuC1GX2pf0fKRiLdavVrGpBkD4MGFPpyYKPYb0S/FyArN3PjdaNvAqE1VgQCtKkbugP5bHH9bp631+lo2EGQVLWTjlwiijWbCEyDu3L0YVMY= # We are doing the releases for non-composer folks # So this includes the vendor directory before_deploy: - echo $TRAVIS_TAG > version.txt - cat release.txt |zip -r@ "razorpay-php.zip" deploy: provider: releases # Otherwise, we lose the vendor/ directory skip_cleanup: true api_key: secure: bHcu1jUASH6aVSD1LmzXdjQC4hc0o8EBbVs9X8e5j+/OC7+UuBBRu+jh6gQje/XWu9Nj1W2LkWhv0IKX1tJbcs0uRstggx+xC0ZayRzkscsqErqeM4WeyJjxe5ewb2eeGujtl9+WWFB3wpUQJtxXaaPuGYtroYGGYuI23wzKN4A= # travis doesn't support multi file deployes yet, not that we need them file: razorpay-php.zip on: # Only do the release for one build every tag php: 7.3 # GitHub refuses to accept releases that are not tagged tags: true # Allow builds for non-master branches as well all_branches: true # Only do the releases if the repo is not a fork repo: razorpay/razorpay-php razorpay/.gitignore 0000644 00000000067 15002216177 0010407 0 ustar 00 composer.lock phpunit.xml vendor/ reports/ **/.DS_Store razorpay/composer.json 0000644 00000002125 15002216177 0011136 0 ustar 00 { "name": "razorpay/razorpay", "description": "Razorpay PHP Client Library", "keywords": ["razorpay", "api", "php", "client"], "authors": [ { "name": "Abhay Rana", "email": "nemo@razorpay.com", "homepage": "https://captnemo.in", "role": "Developer" }, { "name": "Shashank Kumar", "email": "shashank@razorpay.com", "role": "Developer" } ], "support": { "email": "contact@razorpay.com", "issues": "https://github.com/Razorpay/razorpay-php/issues", "source": "https://github.com/Razorpay/razorpay-php" }, "homepage": "https://docs.razorpay.com", "license": "MIT", "require": { "php": ">=7.3", "rmccue/requests": "^2.0", "ext-json": "*" }, "require-dev": { "raveren/kint": "1.*", "phpunit/phpunit": "^9" }, "autoload": { "psr-4": { "Razorpay\\Api\\": "src/", "Razorpay\\Tests\\": "tests/" }, "files" : ["Deprecated.php"] } } razorpay/phpunit.xml.dist 0000644 00000002023 15002216177 0011564 0 ustar 00 <?xml version="1.0" encoding="UTF-8"?> <!-- http://www.phpunit.de/manual/current/en/appendixes.configuration.html --> <phpunit backupGlobals="false" backupStaticAttributes="false" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" bootstrap="tests/bootstrap.php"> <coverage> <include> <directory>./src</directory> </include> <exclude/> </coverage> <php> <!-- copy this file to phpunit.xml and replace with your API key to run tests --> <!-- Also uncomment the following two lines--> <!--<server name="KEY_ID" value="" /> <server name="KEY_SECRET" value="" /> --> </php> <testsuites> <testsuite name="default"> <directory>./non_composer_tests/</directory> </testsuite> <testsuite name="default"> <directory>./tests</directory> </testsuite> </testsuites> </phpunit> razorpay/Deprecated.php 0000644 00000001134 15002216177 0011164 0 ustar 00 <?php /** * Backwards compatibility layer for Requests. * * Allows for Composer to autoload the old PSR-0 classes via the custom autoloader. * This prevents issues with _extending final classes_ (which was the previous solution). * * Please see the Changelog for the 2.0.4 release for upgrade notes. * * @package Requests * * @deprecated 2.0.4 Use the PSR-4 class names instead. */ define("REQUESTS_SILENCE_PSR0_DEPRECATIONS",true); if (class_exists('WpOrg\Requests\Autoload') === false) { require_once __DIR__. 'libs/Requests-2.0.4/src/Autoload.php'; } WpOrg\Requests\Autoload::register(); razorpay/release.txt 0000644 00000000120 15002216177 0010566 0 ustar 00 src/ libs/ README.md Razorpay.php composer.lock composer.json doc.md version.txt razorpay/.semgrepignore 0000644 00000000000 15002216177 0011251 0 ustar 00 razorpay/non_composer_tests/RazorpayTest.php 0000644 00000000675 15002216177 0015527 0 ustar 00 <?php namespace Razorpay\Api\Test; include 'Razorpay.php'; use Razorpay\Api\Api; class RazorpayTest extends \PHPUnit_Framework_TestCase { function setUp() { $this->api = new Api($_SERVER['KEY_ID'], $_SERVER['KEY_SECRET']); } public function testApiAccess() { $this->assertInstanceOf('Razorpay\Api\Api', $this->api); } public function testRequests() { $this->assertTrue(class_exists('\Requests')); } } razorpay/documents/token.md 0000644 00000024272 15002216177 0012066 0 ustar 00 ## Tokens ### Fetch token by payment id ```php $api->payment->fetch($paymentId); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | paymentId* | string | The id of the payment to be fetched | **Response:** ```json { "id": "pay_FHfqtkRzWvxky4", "entity": "payment", "amount": 100, "currency": "INR", "status": "captured", "order_id": "order_FHfnswDdfu96HQ", "invoice_id": null, "international": false, "method": "card", "amount_refunded": 0, "refund_status": null, "captured": true, "description": null, "card_id": "card_F0zoXUp4IPPGoI", "bank": null, "wallet": null, "vpa": null, "email": "gaurav.kumar@example.com", "contact": "+919876543210", "customer_id": "cust_DtHaBuooGHTuyZ", "token_id": "token_FHfn3rIiM1Z8nr", "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "fee": 0, "tax": 0, "error_code": null, "error_description": null, "error_source": null, "error_step": null, "error_reason": null, "acquirer_data": { "auth_code": "541898" }, "created_at": 1595449871 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch tokens by customer id ```php $api->customer->fetch($customerId)->tokens()->all(); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | customerId* | string | The id of the customer to be fetched | **Response:** ```json { "entity":"collection", "count":1, "items":[ { "id":"token_HouA2OQR5Z2jTL", "entity":"token", "token":"2JPRk664pZHUWG", "bank":null, "wallet":null, "method":"card", "card":{ "entity":"card", "name":"Gaurav Kumar", "last4":"8950", "network":"Visa", "type":"credit", "issuer":"STCB", "international":false, "emi":false, "sub_type":"consumer", "expiry_month":12, "expiry_year":2021, "flows":{ "otp":true, "recurring":true } }, "recurring":true, "recurring_details":{ "status":"confirmed", "failure_reason":null }, "auth_type":null, "mrn":null, "used_at":1629779657, "created_at":1629779657, "expired_at":1640975399, "dcc_enabled":false, "billing_address":null } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch particular token ```php $api->customer->fetch($customerId)->tokens()->fetch($tokenId); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | customerId* | string | The id of the customer to be fetched | | tokenId* | string | The id of the token to be fetched | **Response:** ```json { "id": "token_Hxe0skTXLeg9pF", "entity": "token", "token": "F85BgXnGVwcuqV", "bank": null, "wallet": null, "method": "card", "card": { "entity": "card", "name": "ankit", "last4": "5449", "network": "MasterCard", "type": "credit", "issuer": "UTIB", "international": false, "emi": false, "sub_type": "consumer", "expiry_month": 12, "expiry_year": 2024, "flows": { "recurring": true } }, "recurring": true, "auth_type": null, "mrn": null, "used_at": 1632976165, "created_at": 1631687852, "expired_at": 1634215992, "dcc_enabled": false } ``` ------------------------------------------------------------------------------------------------------- ### Delete token ```php $api->customer->fetch($customerId)->tokens()->delete($tokenId); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | customerId* | string | The id of the customer to be fetched | | tokenId* | string | The id of the token to be fetched | **Response:** ```json { "deleted": true } ``` ------------------------------------------------------------------------------------------------------- ### Fetch VPA tokens of a customer id ```php $api->customer->fetch($customerId)->tokens()->all(); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | customerId* | string | The id of the customer to be fetched | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "token_EeroOjvOvorT5L", "entity": "token", "token": "4ydxm47GQjrIEx", "bank": null, "wallet": null, "method": "card", "card": { "entity": "card", "name": "Gaurav Kumar", "last4": "8430", "network": "Visa", "type": "credit", "issuer": "HDFC", "international": false, "emi": true, "expiry_month": 12, "expiry_year": 2022, "flows": { "otp": true, "recurring": true } }, "vpa": null, "recurring": false, "auth_type": null, "mrn": null, "used_at": 1586976724, "created_at": 1586976724, "expired_at": 1672511399, "dcc_enabled": false } ] } ``` ------------------------------------------------------------------------------------------------------- ### Create a token ```php $api->token->create(array( "customer_id" => "cust_1Aa00000000001", "method" => "card", "card" => array( "number" => "4111111111111111", "cvv" => "123", "expiry_month" => "12", "expiry_year" => "21", "name" => "Gaurav Kumar" ), "authentication" => array( "provider" => "razorpay", "provider_reference_id" => "pay_123wkejnsakd", "authentication_reference_number" => "100222021120200000000742753928" ), "notes" => array() )); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | customerId* | string | The id of the customer to be fetched | | method* | string | The type of object that needs to be tokenised. Currently, `card` is the only supported value. | | card* | object | All keys listed [here](https://razorpay.com/docs/partners/aggregators/partner-auth/token-sharing/#create-token-on-behalf-of-a-sub-merchant) are supported | | authentication | object | All keys listed [here](https://razorpay.com/docs/partners/aggregators/partner-auth/token-sharing/#create-token-on-behalf-of-a-sub-merchant) are supported | **Response:** ```json { "id": "token_IJmat4GwYATMtx", "entity": "token", "method": "card", "card": { "last4": "1111", "network": "Visa", "type": "credit", "issuer": "IDFB", "international": false, "emi": false, "sub_type": "consumer" }, "customer": { "id": "cust_1Aa00000000001", "entity": "customer", "name": "Bob", "email": "bob@gmail.com", "contact": "9000090000", "gstin": null, "notes": { "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey… decaf." }, "created_at": 1658390470 }, "expired_at": 1701368999, "customer_id": "cust_1Aa00000000001", "compliant_with_tokenisation_guidelines": true, "status": "active", "notes": [] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch token ```php $api->token->fetch(array("id" => "token_4lsdksD31GaZ09")); ``` **Parameters:** | Name | Type | Description | |-------------|-------------|---------------------------------------------| | id* | string | The unique identifier of a sub-merchant account generated by Razorpay. | **Response:** ```json { "id": "token_4lsdksD31GaZ09", "entity": "token", "customer_id": "cust_1Aa00000000001", "method": "card", "card": { "last4": "3335", "network": "Visa", "type": "debit", "issuer": "HDFC", "international": false, "emi": true, "sub_type": "consumer", "token_iin": "453335" }, "compliant_with_tokenisation_guidelines": true, "expired_at": 1748716199, "status": "active", "status_reason": null, "notes": [] } ``` ------------------------------------------------------------------------------------------------------- ### Delete a token ```php $api->token->delete(array("id" => "token_4lsdksD31GaZ09")); ``` **Parameters:** | Name | Type | Description | |-------------|-------------|---------------------------------------------| | id* | string | The unique identifier of a sub-merchant account generated by Razorpay. | **Response:** ```json [] ``` ------------------------------------------------------------------------------------------------------- ### Process a Payment on another PA/PG with Token ```php $api->token->processPaymentOnAlternatePAorPG(array("id"=>"spt_4lsdksD31GaZ09")); ``` **Parameters:** | Name | Type | Description | |-------------|-------------|---------------------------------------------| | id* | string | The unique identifier of the token whose details are to be fetched. | **Response:** ```json { "card": { "number": "4016981500100002", "expiry_month" : "12", "expiry_year" : 2021 } } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/recurring-payments/upi/tokens/)** razorpay/documents/refund.md 0000644 00000017620 15002216177 0012230 0 ustar 00 ## Refunds ### Create a normal refund ```php $api->payment->fetch($paymentId)->refund(array("amount"=> "100", "speed"=>"normal", "notes"=>array("notes_key_1"=>"Beam me up Scotty.", "notes_key_2"=>"Engage"), "receipt"=>"Receipt No. 31")); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | paymentId* | string | The id of the payment | | amount | integer | The amount to be captured (should be equal to the authorized amount, in paise) | | | speed | string | Here, it must be normal | | notes | array | A key-value pair | | receipt | string | A unique identifier provided by you for your internal reference. | **Response:** ```json { "id": "rfnd_FP8QHiV938haTz", "entity": "refund", "amount": 500100, "receipt": "Receipt No. 31", "currency": "INR", "payment_id": "pay_FCXKPFtYfPXJPy", "notes": [], "acquirer_data": { "arn": null }, "created_at": 1597078866, "batch_id": null, "status": "processed", "speed_processed": "normal", "speed_requested": "normal" } ``` ------------------------------------------------------------------------------------------------------- ### Create an instant refund ```php $api->payment->fetch($paymentId)->refund(array("amount"=> "100","speed"=>"optimum","receipt"=>"Receipt No. 31")); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | paymentId* | string | The id of the payment | | amount | integer | The amount to be captured (should be equal to the authorized amount, in paise) | | speed* | string | Here, it must be optimum | | receipt | string | A unique identifier provided by you for your internal reference. | **Response:** ```json { "id": "rfnd_FP8R8EGjGbPkVb", "entity": "refund", "amount": 500100, "currency": "INR", "payment_id": "pay_FC8MmhMBZPKDHF", "notes": { "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey… decaf." }, "receipt": "Receipt No. 31", "acquirer_data": { "arn": null }, "created_at": 1597078914, "batch_id": null, "status": "processed", "speed_requested": "optimum" } ``` ------------------------------------------------------------------------------------------------------- ### Fetch multiple refunds for a payment ```php $api->payment->fetch($paymentId)->fetchMultipleRefund($option); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | paymentId* | string | The id of the payment | | from | timestamp | timestamp after which the payments were created | | to | timestamp | timestamp before which the payments were created | | count | integer | number of payments to fetch (default: 10) | | skip | integer | number of payments to be skipped (default: 0) | **Refund:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "rfnd_FP8DDKxqJif6ca", "entity": "refund", "amount": 300100, "currency": "INR", "payment_id": "pay_FIKOnlyii5QGNx", "notes": { "comment": "Comment for refund" }, "receipt": null, "acquirer_data": { "arn": "10000000000000" }, "created_at": 1597078124, "batch_id": null, "status": "processed", "speed_processed": "normal", "speed_requested": "optimum" } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch a specific refund for a payment ```php $api->payment->fetch($paymentId)->fetchRefund($refundId); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | paymentId* | string | The id of the payment to be fetched | | refundId* | string | The id of the refund to be fetched | **Response:** ```json { "id": "rfnd_FP8DDKxqJif6ca", "entity": "refund", "amount": 300100, "currency": "INR", "payment_id": "pay_FIKOnlyii5QGNx", "notes": { "comment": "Comment for refund" }, "receipt": null, "acquirer_data": { "arn": "10000000000000" }, "created_at": 1597078124, "batch_id": null, "status": "processed", "speed_processed": "normal", "speed_requested": "optimum" } ``` ------------------------------------------------------------------------------------------------------- ### Fetch all refunds ```php $options = array("count" => 2); $api->refund->all($options); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | from | timestamp | timestamp after which the payments were created | | to | timestamp | timestamp before which the payments were created | | count | integer | number of payments to fetch (default: 10) | | skip | integer | number of payments to be skipped (default: 0) | **Response:** ```json { "entity": "collection", "count": 2, "items": [ { "id": "rfnd_FFX6AnnIN3puqW", "entity": "refund", "amount": 88800, "currency": "INR", "payment_id": "pay_FFX5FdEYx8jPwA", "notes": { "comment": "Issuing an instant refund" }, "receipt": null, "acquirer_data": {}, "created_at": 1594982363, "batch_id": null, "status": "processed", "speed_processed": "optimum", "speed_requested": "optimum" } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch particular refund ```php $api->refund->fetch($refundId); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | refundId* | string | The id of the refund to be fetched | **Response:** ```json { "id": "rfnd_EqWThTE7dd7utf", "entity": "refund", "amount": 6000, "currency": "INR", "payment_id": "pay_EpkFDYRirena0f", "notes": { "comment": "Issuing an instant refund" }, "receipt": null, "acquirer_data": { "arn": "10000000000000" }, "created_at": 1589521675, "batch_id": null, "status": "processed", "speed_processed": "optimum", "speed_requested": "optimum" } ``` ------------------------------------------------------------------------------------------------------- ### Update the refund ```php $api->refund->fetch($refundId)->edit(array('notes'=> array('notes_key_1'=>'Beam me up Scotty.', 'notes_key_2'=>'Engage'))); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | refundId* | string | The id of the refund to be fetched | | notes* | array | A key-value pair | **Response:** ```json { "id": "rfnd_FP8DDKxqJif6ca", "entity": "refund", "amount": 300100, "currency": "INR", "payment_id": "pay_FIKOnlyii5QGNx", "notes": { "notes_key_1": "Beam me up Scotty.", "notes_key_2": "Engage" }, "receipt": null, "acquirer_data": { "arn": "10000000000000" }, "created_at": 1597078124, "batch_id": null, "status": "processed", "speed_processed": "normal", "speed_requested": "optimum" } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/refunds/)** razorpay/documents/paymentVerfication.md 0000644 00000007452 15002216177 0014616 0 ustar 00 ## payment verification ### Verify payment verification ```php $api->utility->verifyPaymentSignature(array('razorpay_order_id' => $razorpayOrderId, 'razorpay_payment_id' => $razorpayPaymentId, 'razorpay_signature' => $razorpaySignature)); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | orderId* | string | The id of the order to be fetched | | paymentId* | string | The id of the payment to be fetched | | signature* | string | Signature returned by the Checkout. This is used to verify the payment. | ------------------------------------------------------------------------------------------------------- ### Verify subscription verification ```php $api->utility->verifyPaymentSignature(array('razorpay_subscription_id' => $razorpaySubscriptionId, 'razorpay_payment_id' => $razorpayPaymentId, 'razorpay_signature' => $razorpaySignature)); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | subscriptionId* | string | The id of the subscription to be fetched | | paymentId* | string | The id of the payment to be fetched | | signature* | string | Signature returned by the Checkout. This is used to verify the payment. | ------------------------------------------------------------------------------------------------------- ### Verify paymentlink verification ```php $api->utility->verifyPaymentSignature(array('razorpay_payment_link_id' => $razorpayPaymentlinkId, 'razorpay_payment_id' => $razorpayPaymentId, 'razorpay_payment_link_reference_id' => $razorpayPaymentLinkReferenceId, 'razorpay_payment_link_status' => $razorpayPaymentLinkStatus, 'razorpay_signature' => $razorpayPaymentLinkSignature)); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | razorpayPaymentlinkId* | string | The id of the paymentlink to be fetched | | razorpayPaymentId* | string | The id of the payment to be fetched | | razorpayPaymentLinkReferenceId* | string | A reference number tagged to a Payment Link | | razorpayPaymentLinkStatus* | string | Current status of the link | | razorpayPaymentLinkSignature* | string | Signature returned by the Checkout. This is used to verify the payment. | ------------------------------------------------------------------------------------------------------- ### Verify webhook signature ```php $webhookBody = '{"entity":"event","account_id":"acc_Hn1ukn2d32Fqww","event":"payment.authorized","contains":["payment"],"payload":{"payment":{"entity":{"id":"pay_JTVtDcN1uRYb5n","entity":"payment","amount":22345,"currency":"INR","status":"authorized","order_id":"order_JTVsulofMPyzBY","invoice_id":null,"international":false,"method":"card","amount_refunded":0,"refund_status":null,"captured":false,"description":"#JT8o1jsTyzrywc","card_id":"card_JTVtDjPwZbFbTM","card":{"id":"card_JTVtDjPwZbFbTM","entity":"card","name":"gaurav","last4":"4366","network":"Visa","type":"credit","issuer":"UTIB","international":false,"emi":true,"sub_type":"consumer","token_iin":null},"bank":null,"wallet":null,"vpa":null,"email":"you@example.com","contact":"+919999999999","notes":{"policy_name":"Jeevan Saral"},"fee":null,"tax":null,"error_code":null,"error_description":null,"error_source":null,"error_step":null,"error_reason":null,"acquirer_data":{"auth_code":"472379"},"created_at":1652183214}}},"created_at":1652183218}'; $webhookSignature = "27209ba357bf7b7b461a4c1d7f54d5a8bb6b0b4b2f5fa4aebf1f1c861a05d18a"; $webhookSecret = "test"; $api->utility->verifyWebhookSignature($webhookBody, $webhookSignature, $webhookSecret); ``` **PN: * indicates mandatory fields** <br> <br> razorpay/documents/registeremandate.md 0000644 00000034733 15002216177 0014274 0 ustar 00 ## Register emandate and charge first payment together ### Create customer ```php $api->customer->create(array('name' => 'Razorpay User', 'email' => 'customer@razorpay.com','contact'=>'9123456780', 'fail_existing'=> '0', 'notes'=> array('notes_key_1'=> 'Tea, Earl Grey, Hot','notes_key_2'=> 'Tea, Earl Grey… decaf'))); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | name* | string | Name of the customer | | email | string | Email of the customer | | contact | string | Contact number of the customer | | fail_existing | string | If a customer with the same details already exists, the request throws an exception by default. Possible value is `0` or `1`| | notes | array | A key-value pair | **Response:** ```json { "id": "cust_1Aa00000000003", "entity": "customer", "name": "Gaurav Kumar", "email": "Gaurav.Kumar@example.com", "contact": "9000000000", "gstin": null, "notes": { "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey… decaf." }, "created_at": 1582033731 } ``` ------------------------------------------------------------------------------------------------------- ### Create order ```php $api->order->create(array('amount' => 0, 'currency' => 'INR', 'method'=>'emandate', 'customer_id'=>$customerId, 'receipt'=>'Receipt No. 5', 'notes'=> array('note_key 1'=> 'Beam me up Scotty','note_key 2'=> 'Engage'), 'token'=>array('first_payment_amount'=>100, 'auth_type'=>'netbanking' ,'max_amount'=>'9999900','expire_at'=>'4102444799', 'notes'=>array('note_key 1'=> 'Tea, Earl Grey… decaf.','note_key 2'=> 'Tea. Earl Gray. Hot.'), 'bank_account'=>array('beneficiary_name'=>'Gaurav Kumar', 'account_number'=>'11214311215411', 'account_type'=>'savings', 'ifsc_code'=>'HDFC0001233')))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | amount* | integer | The amount to be captured (should be equal to the authorized amount, in paise) | | currency* | string | The currency of the payment (defaults to INR) | | customerId* | string | The id of the customer to be fetched | | payment_capture* | boolean | Indicates whether payment status should be changed to `captured` automatically or not. Possible values: true - Payments are captured automatically. false - Payments are not captured automatically.| | method* | string | Payment method used to make the registration transaction. Possible value is `emandate`. | | receipt | string | Your system order reference id. | | token | array | All parameters listed [here](https://razorpay.com/docs/api/payments/recurring-payments/emandate/auto-debit/#112-create-an-order) are supported | | auth_type | string | Possible values is `netbanking`, `debitcard` or `aadhaar` | | max_amount | integer | The maximum amount, in paise, that a customer can be charged in one transaction. The value can range from `500` - `100000000`. | | expire_at | integer | The timestamp, in Unix format, till when you can use the token (authorization on the payment method) to charge the customer subsequent payments. | | notes | object | A key-value pair | **Response:** For create order response please click [here](https://razorpay.com/docs/api/recurring-payments/emandate/auto-debit/#112-create-an-order) ------------------------------------------------------------------------------------------------------- ### Create an Authorization Payment Please refer this [doc](https://razorpay.com/docs/api/recurring-payments/emandate/auto-debit/#113-create-an-authorization-payment) for authorization payment ----------------------------------------------------------------------------------------------------- ### Create registration link ```php $api->subscription->createSubscriptionRegistration(array('customer'=>array('name'=>'Gaurav Kumar','email'=>'gaurav.kumar@example.com','contact'=>'9123456780'),'type'=>'link','amount'=>0,'currency'=>'INR','description'=>'Registration Link for Gaurav Kumar','subscription_registration'=>array('first_payment_amount'=>100, 'method'=>'emandate', 'auth_type'=>'netbanking' ,'max_amount'=>'50000','expire_at'=>'1634215992','bank_account'=>array('beneficiary_name'=>'Gaurav Kumar', 'account_number'=>'11214311215411', 'account_type'=>'savings', 'ifsc_code'=>'HDFC0001233')),'receipt'=>'Receipt No. 5','email_notify'=>1,'sms_notify'=>1,'expire_by'=>1634215992, 'notes'=> array('note_key 1'=> 'Beam me up Scotty','note_key 2'=> 'Tea. Earl Gray. Hot.'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|---------------------------------------------------------------| | customer | array | Details of the customer to whom the registration link will be sent. | | type* | array | the value is `link`. | | amount* | integer | The amount to be captured (should be equal to the authorized amount, in paise) | | currency* | string | The currency of the payment (defaults to INR) | | description* | string | A brief description of the payment. | | subscription_registration | array | All parameters listed [here](https://razorpay.com/docs/api/payments/recurring-payments/emandate/auto-debit/#121-create-a-registration-link) are supported | | receipt | string | Your system order reference id. | | sms_notify | boolean | SMS notifications are to be sent by Razorpay (default : 1) | | email_notify | boolean | Email notifications are to be sent by Razorpay (default : 1) | | expire_by | integer | The timestamp, in Unix format, till when the customer can make the authorization payment. | | notes | array | A key-value pair | **Response:** For create registration link response please click [here](https://razorpay.com/docs/api/recurring-payments/emandate/auto-debit/#12-using-a-registration-link) ------------------------------------------------------------------------------------------------------- ## Create an order to charge the customer ```php $api->order->create(array('amount' => '100', 'currency' => 'INR', 'payment_capture' => true, 'receipt' => 'Receipt No. 1', 'notes'=> array('key1'=> 'value3','key2'=> 'value2'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | amount* | integer | The amount to be captured (should be equal to the authorized amount, in paise) | | currency* | string | The currency of the payment (defaults to INR) | | receipt | string | Your system order reference id. | | payment_capture* | boolean | Indicates whether payment status should be changed to `captured` automatically or not. Possible values: true - Payments are captured automatically. false - Payments are not captured automatically.| | notes | array | A key-value pair | **Response:** ```json { "id":"order_1Aa00000000002", "entity":"order", "amount":1000, "amount_paid":0, "amount_due":1000, "currency":"INR", "receipt":"Receipt No. 1", "offer_id":null, "status":"created", "attempts":0, "notes":{ "notes_key_1":"Tea, Earl Grey, Hot", "notes_key_2":"Tea, Earl Grey… decaf." }, "created_at":1579782776 } ``` ------------------------------------------------------------------------------------------------------- ## Create a recurring payment ```php $api->payment->createRecurring(['email'=>'gaurav.kumar@example.com','contact'=>'9123456789','amount'=>1000,'currency'=>'INR','order_id'=>$orderid,'customer_id'=>$customerId,'token'=>$tokenId,'recurring'=>'1','description'=>'Creating recurring payment for Gaurav Kumar', 'notes'=> array('key1'=> 'value3','key2'=> 'value2')); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | email* | string | The customer's email address | | contact* | string | The customer's phone number | | amount* | integer | The amount to be captured (should be equal to the authorized amount, in paise) | | currency* | string | The currency of the payment (defaults to INR) | | orderId* | string | The id of the order to be fetched | | customerId* | string | The id of the customer to be fetched | | tokenId* | string | The id of the token to be fetched | | recurring* | boolean | Possible values is `0` or `1` | | description | string | A brief description of the payment. | | notes | array | A key-value pair | **Response:** ```json { "razorpay_payment_id" : "pay_1Aa00000000001", "razorpay_order_id" : "order_1Aa00000000001", "razorpay_signature" : "9ef4dffbfd84f1318f6739a3ce19f9d85851857ae648f114332d8401e0949a3d" } ``` ------------------------------------------------------------------------------------------------------- ## Send/Resend notifications ```php $api->invoice->fetch($invoiceId)->notifyBy($medium); ``` **Parameters:** | Name | Type |Description | |-----------------|---------|------------------------------------------------------------------------------| | invoiceId* | string | The id of the invoice to be fetched | | medium* | string | Possible values are `sms` or `email` | **Response:** ```json { "success": true } ``` ------------------------------------------------------------------------------------------------------- ## Cancel registration link ```php $api->invoice->fetch($invoiceId)->cancel(); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | invoiceId* | string | The id of the invoice to be fetched | **Response:** ```json { "id": "inv_FHrfRupD2ouKIt", "entity": "invoice", "receipt": "Receipt No. 1", "invoice_number": "Receipt No. 1", "customer_id": "cust_BMB3EwbqnqZ2EI", "customer_details": { "id": "cust_BMB3EwbqnqZ2EI", "name": "Gaurav Kumar", "email": "gaurav.kumar@example.com", "contact": "9123456780", "gstin": null, "billing_address": null, "shipping_address": null, "customer_name": "Gaurav Kumar", "customer_email": "gaurav.kumar@example.com", "customer_contact": "9123456780" }, "order_id": "order_FHrfRw4TZU5Q2L", "line_items": [], "payment_id": null, "status": "cancelled", "expire_by": 4102444799, "issued_at": 1595491479, "paid_at": null, "cancelled_at": 1595491488, "expired_at": null, "sms_status": "sent", "email_status": "sent", "date": 1595491479, "terms": null, "partial_payment": false, "gross_amount": 100, "tax_amount": 0, "taxable_amount": 0, "amount": 100, "amount_paid": 0, "amount_due": 100, "currency": "INR", "currency_symbol": "₹", "description": "Registration Link for Gaurav Kumar", "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "comment": null, "short_url": "https://rzp.io/i/QlfexTj", "view_less": true, "billing_start": null, "billing_end": null, "type": "link", "group_taxes_discounts": false, "created_at": 1595491480, "idempotency_key": null } ``` ------------------------------------------------------------------------------------------------------- ## Fetch token by payment id ```php $api->payment->fetch($paymentId); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | paymentId* | string | The id of the payment to be fetched | **Response:** For fetch token by payment id response please click [here](https://razorpay.com/docs/api/recurring-payments/emandate/auto-debit/#21-fetch-token-by-payment-id) ------------------------------------------------------------------------------------------------------- ## Fetch tokens by customer id ```php $api->customer->fetch($customerId)->tokens()->all(); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | customerId* | string | The id of the customer to be fetched | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "token_FHf94Uym9tdYFJ", "entity": "token", "token": "2wDPM7VAlXtjAR", "bank": "HDFC", "wallet": null, "method": "emandate", "vpa": null, "recurring": true, "recurring_details": { "status": "confirmed", "failure_reason": null }, "auth_type": "netbanking", "mrn": null, "used_at": 1595447381, "created_at": 1595447381, "bank_details": { "beneficiary_name": "Gaurav Kumar", "account_number": "1121431121541121", "ifsc": "HDFC0000001", "account_type": "savings" }, "max_amount": 9999900, "expired_at": 1689971140, "dcc_enabled": false } ] } ``` ------------------------------------------------------------------------------------------------------- ## Delete tokens ```php $api->customer->fetch($customerId)->tokens()->delete($tokenId); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | customerId* | string | The id of the customer to be fetched | | tokenId* | string | The id of the token to be fetched | **Response:** ```json { "deleted": true } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/recurring-payments/emandate/auto-debit/)** razorpay/documents/webhook.md 0000644 00000015615 15002216177 0012405 0 ustar 00 ## Webhook ### Create a Webhook ```php $accountId = "acc_GP4lfNA0iIMn5B"; $api->account->fetch($accountId)->webhooks()->create(array( "url" => "https://google.com", "alert_email" => "gaurav.kumar@example.com", "secret" => "12345", "events" => array( "payment.authorized", "payment.failed", "payment.captured", "payment.dispute.created", "refund.failed", "refund.created" ) )); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | | url* | string | The URL where you receive the webhook payload when an event is triggered. The maximum length is 255 characters. | | alert_email | string | This is the email address to which notifications must be sent in case of webhook failure. | | secret | string | A secret for the webhook endpoint that is used to validate that the webhook is from Razorpay. | | events | string | The required events from the list of Active Events. For example `payment.authorized`, `payment.captured`, `payment.failed`, `payment.dispute.created`, `refund.failed`, `refund.created` and so on. | **Response:** ```json { "id": "JebiXkKGYwua5L", "created_at": 1654605478, "updated_at": 1654605478, "service": "beta-api-live", "owner_id": "JOGUdtKu3dB03d", "owner_type": "merchant", "context": [], "disabled_at": 0, "url": "https://google.com", "alert_email": "gaurav.kumar@example.com", "secret_exists": true, "entity": "webhook", "active": true, "events": [ "payment.authorized", "payment.failed", "payment.captured", "payment.dispute.created", "refund.failed", "refund.created" ] } ``` ------------------------------------------------------------------------------------------------------- ### Edit Webhook ```php $accountId = "acc_GP4lfNA0iIMn5B"; $webhookId = "HK890egfiItP3H"; $api->account->fetch($accountId)->webhooks()->edit($webhookId, array( "url" => "https://www.linkedin.com", "events" => array( "refund.created" ) )); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | | webhookId* | string | The unique identifier of the webhook whose details are to be updated | | url | string | The URL where you receive the webhook payload when an event is triggered. The maximum length is 255 characters. | | events | string | The required events from the list of Active Events. For example `payment.authorized`, `payment.captured`, `payment.failed`, `payment.dispute.created`, `refund.failed`, `refund.created` and so on. | **Response:** ```json { "id": "HK890egfiItP3H", "created_at": 1623060358, "updated_at": 1623067148, "service": "beta-api-test", "owner_id": "H3kYHQ635sBwXG", "owner_type": "merchant", "context": [], "disabled_at": 0, "url": "https://www.linkedin.com", "alert_email": "gaurav.kumar@example.com", "secret_exists": true, "entity": "webhook", "active": true, "events": [ "refund.created" ] } ``` ------------------------------------------------------------------------------------------------------- ### Delete an account ```php $accountId = "acc_GP4lfNA0iIMn5B"; $webhookId = "HK890egfiItP3H"; $api->account->fetch($accountId)->webhooks()->delete($webhookId); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | accountId* | string | The unique identifier of a sub-merchant account that must be deleted. | | webhookId* | string | The unique identifier of the webhook whose details are to be updated | **Response:** ```json [] ``` ------------------------------------------------------------------------------------------------------- ### Fetch a webhook ```php $accountId = "acc_GP4lfNA0iIMn5B"; $webhookId = "HK890egfiItP3H"; $api->account->fetch($accountId)->webhooks()->fetch($webhookId); ``` **Parameters:** | Name | Type | Description | |-------------|-------------|---------------------------------------------| | accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | | webhookId* | string | The unique identifier of the webhook whose details are to be updated | **Response:** ```json { "id": "HK890egfiItP3H", "created_at": 1623060358, "updated_at": 1623060358, "owner_id": "H3kYHQ635sBwXG", "owner_type": "merchant", "context": [], "disabled_at": 0, "url": "https://en1mwkqo5ioct.x.pipedream.net", "alert_email": "gaurav.kumar@example.com", "secret_exists": true, "entity": "webhook", "active": true, "events": [ "payment.authorized", "payment.failed", "payment.captured", "payment.dispute.created", "refund.failed", "refund.created" ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch all Webhooks ```php $accountId = "acc_GP4lfNA0iIMn5B"; $api->account->fetch($accountId)->webhooks()->all(); ``` **Parameters:** | Name | Type | Description | |-------------|-------------|---------------------------------------------| | accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | | from | integer | Timestamp, in seconds, from when the webhooks are to be fetched. | | to | integer | Timestamp, in seconds, till when the webhooks are to be fetched. | | count | integer | Number of webhooks to be fetched. The default value is `10` and the maximum value is `100`. This can be used for pagination, in combination with `skip`. | | skip | integer | Number of records to be skipped while fetching the webhooks. This can be used for pagination, in combination with `count`. | **Response:** ```json { "id": "HK890egfiItP3H", "created_at": 1623060358, "updated_at": 1623060358, "owner_id": "H3kYHQ635sBwXG", "owner_type": "merchant", "context": [], "disabled_at": 0, "url": "https://en1mwkqo5ioct.x.pipedream.net", "alert_email": "gaurav.kumar@example.com", "secret_exists": true, "entity": "webhook", "active": true, "events": [ "payment.authorized", "payment.failed", "payment.captured", "payment.dispute.created", "refund.failed", "refund.created" ] } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/partners/webhooks)** razorpay/documents/settlement.md 0000644 00000037240 15002216177 0013131 0 ustar 00 ## Settlements ### Fetch all settlements ```php $api->settlement->all($options); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | from | timestamp | timestamp after which the settlement were created | | to | timestamp | timestamp before which the settlement were created | | count | integer | number of settlements to fetch (default: 10) | | skip | integer | number of settlements to be skipped (default: 0) | **Response:** ```json { "entity": "collection", "count": 2, "items": [ { "id": "setl_DGlQ1Rj8os78Ec", "entity": "settlement", "amount": 9973635, "status": "processed", "fees": 471699, "tax": 42070, "utr": "1568176960vxp0rj", "created_at": 1568176960 }, { "id": "setl_4xbSwsPABDJ8oK", "entity": "settlement", "amount": 50000, "status": "processed", "fees": 123, "tax": 12, "utr": "RZRP173069230702", "created_at": 1509622306 } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch a settlement ```php $api->settlement->fetch($settlementId); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | $settlementId* | string | The id of the settlement to be fetched | **Response:** ```json { "id": "setl_DGlQ1Rj8os78Ec", "entity": "settlement", "amount": 9973635, "status": "processed", "fees": 471699, "tax": 42070, "utr": "1568176960vxp0rj", "created_at": 1568176960 } ``` ------------------------------------------------------------------------------------------------------- ### Settlement report for a month ```php $api->settlement->reports(array("year"=>2020,"month"=>09)); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | year* | integer | The year the settlement was received in the `YYYY` format. For example, `2020` | | month* | integer | The month the settlement was received in the `MM` format. For example, `09` | | day | integer | The date the settlement was received in the `DD` format. For example, `01` | | count | integer | number of settlements to fetch (default: 10) | | skip | integer | number of settlements to be skipped (default: 0) | **Response:** ```json { "entity": "collection", "count": 4, "items": [ { "entity_id": "pay_DEXrnipqTmWVGE", "type": "payment", "debit": 0, "credit": 97100, "amount": 100000, "currency": "INR", "fee": 2900, "tax": 0, "on_hold": false, "settled": true, "created_at": 1567692556, "settled_at": 1568176960, "settlement_id": "setl_DGlQ1Rj8os78Ec", "posted_at": null, "credit_type": "default", "description": "Recurring Payment via Subscription", "notes": "{}", "payment_id": null, "settlement_utr": "1568176960vxp0rj", "order_id": "order_DEXrnRiR3SNDHA", "order_receipt": null, "method": "card", "card_network": "MasterCard", "card_issuer": "KARB", "card_type": "credit", "dispute_id": null }, { "entity_id": "rfnd_DGRcGzZSLyEdg1", "type": "refund", "debit": 242500, "credit": 0, "amount": 242500, "currency": "INR", "fee": 0, "tax": 0, "on_hold": false, "settled": true, "created_at": 1568107224, "settled_at": 1568176960, "settlement_id": "setl_DGlQ1Rj8os78Ec", "posted_at": null, "credit_type": "default", "description": null, "notes": "{}", "payment_id": "pay_DEXq1pACSqFxtS", "settlement_utr": "1568176960vxp0rj", "order_id": "order_DEXpmZgffXNvuI", "order_receipt": null, "method": "card", "card_network": "MasterCard", "card_issuer": "KARB", "card_type": "credit", "dispute_id": null }, { "entity_id": "trf_DEUoCEtdsJgvl7", "type": "transfer", "debit": 100296, "credit": 0, "amount": 100000, "currency": "INR", "fee": 296, "tax": 46, "on_hold": false, "settled": true, "created_at": 1567681786, "settled_at": 1568176960, "settlement_id": "setl_DGlQ1Rj8os78Ec", "posted_at": null, "credit_type": "default", "description": null, "notes": null, "payment_id": "pay_DEApNNTR6xmqJy", "settlement_utr": "1568176960vxp0rj", "order_id": null, "order_receipt": null, "method": null, "card_network": null, "card_issuer": null, "card_type": null, "dispute_id": null }, { "entity_id": "adj_EhcHONhX4ChgNC", "type": "adjustment", "debit": 0, "credit": 1012, "amount": 1012, "currency": "INR", "fee": 0, "tax": 0, "on_hold": false, "settled": true, "created_at": 1567681786, "settled_at": 1568176960, "settlement_id": "setl_DGlQ1Rj8os78Ec", "posted_at": null, "description": "test reason", "notes": null, "payment_id": null, "settlement_utr": null, "order_id": null, "order_receipt": null, "method": null, "card_network": null, "card_issuer": null, "card_type": null, "dispute_id": null } ] } ``` ------------------------------------------------------------------------------------------------------- ### Settlement recon ```php $api->settlement->settlementRecon(array('year' => 2018, 'month' => 2, 'day'=>11)); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | year* | integer | The year the settlement was received in the `YYYY` format. For example, `2020` | | month* | integer | The month the settlement was received in the `MM` format. For example, `09` | | day | integer | The day the settlement was received in the `DD` format. For example, | **Response:** ```json { "entity": "collection", "count": 4, "items": [ { "entity_id": "pay_DEXrnipqTmWVGE", "type": "payment", "debit": 0, "credit": 97100, "amount": 100000, "currency": "INR", "fee": 2900, "tax": 0, "on_hold": false, "settled": true, "created_at": 1567692556, "settled_at": 1568176960, "settlement_id": "setl_DGlQ1Rj8os78Ec", "posted_at": null, "credit_type": "default", "description": "Recurring Payment via Subscription", "notes": "{}", "payment_id": null, "settlement_utr": "1568176960vxp0rj", "order_id": "order_DEXrnRiR3SNDHA", "order_receipt": null, "method": "card", "card_network": "MasterCard", "card_issuer": "KARB", "card_type": "credit", "dispute_id": null }, { "entity_id": "rfnd_DGRcGzZSLyEdg1", "type": "refund", "debit": 242500, "credit": 0, "amount": 242500, "currency": "INR", "fee": 0, "tax": 0, "on_hold": false, "settled": true, "created_at": 1568107224, "settled_at": 1568176960, "settlement_id": "setl_DGlQ1Rj8os78Ec", "posted_at": null, "credit_type": "default", "description": null, "notes": "{}", "payment_id": "pay_DEXq1pACSqFxtS", "settlement_utr": "1568176960vxp0rj", "order_id": "order_DEXpmZgffXNvuI", "order_receipt": null, "method": "card", "card_network": "MasterCard", "card_issuer": "KARB", "card_type": "credit", "dispute_id": null }, { "entity_id": "trf_DEUoCEtdsJgvl7", "type": "transfer", "debit": 100296, "credit": 0, "amount": 100000, "currency": "INR", "fee": 296, "tax": 46, "on_hold": false, "settled": true, "created_at": 1567681786, "settled_at": 1568176960, "settlement_id": "setl_DGlQ1Rj8os78Ec", "posted_at": null, "credit_type": "default", "description": null, "notes": null, "payment_id": "pay_DEApNNTR6xmqJy", "settlement_utr": "1568176960vxp0rj", "order_id": null, "order_receipt": null, "method": null, "card_network": null, "card_issuer": null, "card_type": null, "dispute_id": null }, { "entity_id": "adj_EhcHONhX4ChgNC", "type": "adjustment", "debit": 0, "credit": 1012, "amount": 1012, "currency": "INR", "fee": 0, "tax": 0, "on_hold": false, "settled": true, "created_at": 1567681786, "settled_at": 1568176960, "settlement_id": "setl_DGlQ1Rj8os78Ec", "posted_at": null, "description": "test reason", "notes": null, "payment_id": null, "settlement_utr": null, "order_id": null, "order_receipt": null, "method": null, "card_network": null, "card_issuer": null, "card_type": null, "dispute_id": null } ] } ``` ------------------------------------------------------------------------------------------------------- ### Create on-demand settlement ```php $api->settlement->createOndemandSettlement(array("amount"=> 1221, "settle_full_balance"=> false, "description"=>"Testing","notes" => array("notes_key_1"=> "Tea, Earl Grey, Hot","notes_key_2"=> "Tea, Earl Grey… decaf."))); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | amount*| integer | Maximum amount that can be settled | | settle_full_balance* | boolean | true or false | | description | string | The description may not be greater than 30 characters | | notes | array | A key-value pair | **Response:** ```json { "id": "setlod_FNj7g2YS5J67Rz", "entity": "settlement.ondemand", "amount_requested": 200000, "amount_settled": 0, "amount_pending": 199410, "amount_reversed": 0, "fees": 590, "tax": 90, "currency": "INR", "settle_full_balance": false, "status": "initiated", "description": "Need this to make vendor payments.", "notes": { "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey… decaf." }, "created_at": 1596771429, "ondemand_payouts": { "entity": "collection", "count": 1, "items": [ { "id": "setlodp_FNj7g2cbvw8ueO", "entity": "settlement.ondemand_payout", "initiated_at": null, "processed_at": null, "reversed_at": null, "amount": 200000, "amount_settled": null, "fees": 590, "tax": 90, "utr": null, "status": "created", "created_at": 1596771429 } ] } } ``` ------------------------------------------------------------------------------------------------------- ### Fetch all on-demand settlements ```php $api->settlement->fetchAllOndemandSettlement($options); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | from | timestamp | timestamp after which the payments were created | | to | timestamp | timestamp before which the payments were created | | count | integer | number of payments to fetch (default: 10) | | skip | integer | number of payments to be skipped (default: 0) | **Response:**<br> For all on-demand settlements response please click [here](https://razorpay.com/docs/api/settlements/#fetch-all-on-demand-settlements) ------------------------------------------------------------------------------------------------------- ### Fetch on-demand settlement by ID ```php $api->settlement->fetch($settlementId)->fetchOndemandSettlementById(); ``` **Parameters:** | Name | Type | Description | |------------|--------|-----------------------------------| | $settlementId* | string | Settlement Id of the On-demand settlement| **Response:**<br> For on-demand settlement by ID response please click [here](https://razorpay.com/docs/api/settlements/#fetch-on-demand-settlements-by-id) ------------------------------------------------------------------------------------------------------- ### Fetch Instant Settlement With ID With Payout Details ```php $settlementId = "setlod_MI0c34SIRVT25W"; $api->settlement->fetchOndemandSettlementById($settlementId,["expand[]"=> "ondemand_payouts"]); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | expand[] | string | Possible value is `ondemand_payouts` | **Response:** ```json { "id": "setlod_FNj7g2YS5J67Rz", "entity": "settlement.ondemand", "amount_requested": 200000, "amount_settled": 199410, "amount_pending": 0, "amount_reversed": 0, "fees": 590, "tax": 90, "currency": "INR", "settle_full_balance": false, "status": "processed", "description": "Need this to buy stock.", "notes": { "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey, decaf." }, "created_at": 1596771429, "ondemand_payouts": { "entity": "collection", "count": 1, "items": [ { "id": "setlodp_FNj7g2cbvw8ueO", "entity": "settlement.ondemand_payout", "initiated_at": 1596771430, "processed_at": 1596778752, "reversed_at": null, "amount": 200000, "amount_settled": 199410, "fees": 590, "tax": 90, "utr": "022011173948", "status": "processed", "created_at": 1596771429 } ] } } ``` ------------------------------------------------------------------------------------------------------- ### Fetch All Instant Settlements With Payout Details ```php $api->settlement->fetchAllOndemandSettlement(["expand[]"=> "ondemand_payouts"]); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | expand[] | string | Possible value is `ondemand_payouts` | **Response:** ```json { "entity": "collection", "count": 2, "items": [ { "id": "setlod_FNj7g2YS5J67Rz", "entity": "settlement.ondemand", "amount_requested": 200000, "amount_settled": 199410, "amount_pending": 0, "amount_reversed": 0, "fees": 590, "tax": 90, "currency": "INR", "settle_full_balance": false, "status": "processed", "description": "Need this to make vendor payments.", "notes": { "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey, decaf." }, "created_at": 1596771429, "ondemand_payouts": { "entity": "collection", "count": 1, "items": [ { "id": "setlodp_FNj7g2cbvw8ueO", "entity": "settlement.ondemand_payout", "initiated_at": 1596771430, "processed_at": 1596778752, "reversed_at": null, "amount": 200000, "amount_settled": 199410, "fees": 590, "tax": 90, "utr": "022011173948", "status": "processed", "created_at": 1596771429 } ] } } ] } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/settlements/)** razorpay/documents/subscription.md 0000644 00000051347 15002216177 0013475 0 ustar 00 ## Subscriptions ### Create subscription ```php $api->subscription->create(array("plan_id" => "plan_Jc7wDk5iZX88wx","total_count" => 6,"quantity" => 1,"customer_notify" => 1,"start_at" => 1580453311,"expire_by" => 1580626111,"addons" => array(array("item" => array("name" => "Delivery charges","amount" => 30000,"currency" => "INR"))),"offer_id" => "offer_JCTD1XMlUmzF6Z","notes" => array("notes_key_1" => "Tea, Earl Grey, Hot","notes_key_2" => "Tea, Earl Grey… decaf."))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | plan_id* | string | The unique identifier for a plan that should be linked to the subscription.| | total_count* | string | The number of billing cycles for which the customer should be charged | | customer_notify | boolean | Indicates whether the communication to the customer would be handled by you or us | | quantity | integer | The number of times the customer should be charged the plan amount per invoice | | start_at | integer | The timestamp, in Unix format, for when the subscription should start. If not passed, the subscription starts immediately after the authorization payment. | | expire_by | integer | The timestamp, in Unix format, till when the customer can make the authorization payment. | | addons | array | All parameters listed [here](https://razorpay.com/docs/api/payments/subscriptions/#create-a-subscription) are supported | | notes | array | Notes you can enter for the contact for future reference. | | offer_id | string | The unique identifier of the offer that is linked to the subscription. | **Response:** ```json { "id": "sub_00000000000001", "entity": "subscription", "plan_id": "plan_00000000000001", "status": "created", "current_start": null, "current_end": null, "ended_at": null, "quantity": 1, "notes":{ "notes_key_1":"Tea, Earl Grey, Hot", "notes_key_2":"Tea, Earl Grey… decaf." }, "charge_at": 1580453311, "start_at": 1580626111, "end_at": 1583433000, "auth_attempts": 0, "total_count": 6, "paid_count": 0, "customer_notify": true, "created_at": 1580280581, "expire_by": 1580626111, "short_url": "https://rzp.io/i/z3b1R61A9", "has_scheduled_changes": false, "change_scheduled_at": null, "source": "api", "offer_id":"offer_JHD834hjbxzhd38d", "remaining_count": 5 } ``` ------------------------------------------------------------------------------------------------------- ### Create subscription link ```php $api->subscription->create(array("plan_id" => "plan_Jc7wDk5iZX88wx","total_count" => 12,"quantity" => 1,"start_at" => 1561852800,"expire_by" => 1561939199,"customer_notify" => 1,"addons" => array(array("item" => array("name" => "Delivery charges","amount" => 30000,"currency" => "INR"))),"offer_id" => "offer_JCTD1XMlUmzF6Z","notes" => array("notes_key_1" => "Tea, Earl Grey, Hot","notes_key_2" => "Tea, Earl Grey… decaf."),"notify_info" => array("notify_phone" => "9123456789","notify_email" => "gaurav.kumar@example.com"))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | plan_id* | string | The unique identifier for a plan that should be linked to the subscription.| | total_count* | string | The number of billing cycles for which the customer should be charged | | customer_notify | boolean | Indicates whether the communication to the customer would be handled by you or us | | quantity | integer | The number of times the customer should be charged the plan amount per invoice | | start_at | integer | The timestamp, in Unix format, for when the subscription should start. If not passed, the subscription starts immediately after the authorization payment. | | expire_by | integer | The timestamp, in Unix format, till when the customer can make the authorization payment. | | addons | array | All parameters listed [here](https://razorpay.com/docs/api/payments/subscriptions/#create-a-subscription-link) are supported | | notes | array | Notes you can enter for the contact for future reference. | | notify_info | array | All parameters listed [here](https://razorpay.com/docs/api/payments/subscriptions/#create-a-subscription-link) are supported | | offer_id | string | The unique identifier of the offer that is linked to the subscription. | **Response:** ```json { "id":"sub_00000000000002", "entity":"subscription", "plan_id":"plan_00000000000001", "status":"created", "current_start":null, "current_end":null, "ended_at":null, "quantity":1, "notes":{ "notes_key_1":"Tea, Earl Grey, Hot", "notes_key_2":"Tea, Earl Grey… decaf." }, "charge_at":1580453311, "start_at":1580453311, "end_at":1587061800, "auth_attempts":0, "total_count":12, "paid_count":0, "customer_notify":true, "created_at":1580283117, "expire_by":1581013800, "short_url":"https://rzp.io/i/m0y0f", "has_scheduled_changes":false, "change_scheduled_at":null, "source": "api", "offer_id":"offer_JHD834hjbxzhd38d", "remaining_count":12 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch all subscriptions ```php $api->subscription->all($options); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | from | timestamp | timestamp after which the payments were created | | to | timestamp | timestamp before which the payments were created | | count | integer | number of subscriptions to fetch (default: 10) | | skip | integer | number of subscriptions to be skipped (default: 0) | | plan_id | string | The unique identifier of the plan for which you want to retrieve all the subscriptions | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "sub_00000000000001", "entity": "subscription", "plan_id": "plan_00000000000001", "customer_id": "cust_D00000000000001", "status": "active", "current_start": 1577355871, "current_end": 1582655400, "ended_at": null, "quantity": 1, "notes": { "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey… decaf." }, "charge_at": 1577385991, "offer_id": "offer_JHD834hjbxzhd38d", "start_at": 1577385991, "end_at": 1603737000, "auth_attempts": 0, "total_count": 6, "paid_count": 1, "customer_notify": true, "created_at": 1577356081, "expire_by": 1577485991, "short_url": "https://rzp.io/i/z3b1R61A9", "has_scheduled_changes": false, "change_scheduled_at": null, "remaining_count": 5 } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch particular subscription ```php $api->subscription->fetch($subscriptionId); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | subscriptionId* | string | The id of the subscription to be fetched | **Response:** ```json { "id": "sub_00000000000001", "entity": "subscription", "plan_id": "plan_00000000000001", "customer_id": "cust_D00000000000001", "status": "active", "current_start": 1577355871, "current_end": 1582655400, "ended_at": null, "quantity": 1, "notes":{ "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey… decaf." }, "charge_at": 1577385991, "start_at": 1577385991, "end_at": 1603737000, "auth_attempts": 0, "total_count": 6, "paid_count": 1, "customer_notify": true, "created_at": 1577356081, "expire_by": 1577485991, "short_url": "https://rzp.io/i/z3b1R61A9", "has_scheduled_changes": false, "change_scheduled_at": null, "source": "api", "offer_id":"offer_JHD834hjbxzhd38d", "remaining_count": 5 } ``` ------------------------------------------------------------------------------------------------------- ### Cancel particular subscription ```php $api->subscription->fetch($subscriptionId)->cancel($options); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | subscriptionId* | string | The id of the subscription to be cancelled | | cancel_at_cycle_end | boolean | Possible values:<br>0 (default): Cancel the subscription immediately. <br> 1: Cancel the subscription at the end of the current billing cycle. | **Response:** ```json { "id": "sub_00000000000001", "entity": "subscription", "plan_id": "plan_00000000000001", "customer_id": "cust_D00000000000001", "status": "cancelled", "current_start": 1580453311, "current_end": 1581013800, "ended_at": 1580288092, "quantity": 1, "notes":{ "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey… decaf." }, "charge_at": 1580453311, "start_at": 1577385991, "end_at": 1603737000, "auth_attempts": 0, "total_count": 6, "paid_count": 1, "customer_notify": true, "created_at": 1580283117, "expire_by": 1581013800, "short_url": "https://rzp.io/i/z3b1R61A9", "has_scheduled_changes": false, "change_scheduled_at": null, "source": "api", "offer_id":"offer_JHD834hjbxzhd38d", "remaining_count": 5 } ``` ------------------------------------------------------------------------------------------------------- ### Update particular subscription ```php $api->subscription->fetch($subscriptionId)->update($options); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | subscriptionId* | string | The id of the subscription to be updated | | options | array | All parameters listed [here](https://razorpay.com/docs/api/subscriptions/#update-a-subscription) for update | **Response:** ```json { "id":"sub_00000000000002", "entity":"subscription", "plan_id":"plan_00000000000002", "customer_id":"cust_00000000000002", "status":"authenticated", "current_start":null, "current_end":null, "ended_at":null, "quantity":3, "notes":{ "notes_key_1":"Tea, Earl Grey, Hot", "notes_key_2":"Tea, Earl Grey… decaf." }, "charge_at":1580453311, "start_at":1580453311, "end_at":1606588200, "auth_attempts":0, "total_count":6, "paid_count":0, "customer_notify":true, "created_at":1580283807, "expire_by":1580626111, "short_url":"https://rzp.io/i/yeDkUKy", "has_scheduled_changes":false, "change_scheduled_at":null, "source": "api", "offer_id":"offer_JHD834hjbxzhd38d", "remaining_count":6 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch details of pending update ```php $api->subscription->fetch($subscriptionId)->pendingUpdate() ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | subscriptionId* | string | The id of the subscription to fetch pending update | **Response:** ```json { "id":"sub_00000000000001", "entity":"subscription", "plan_id":"plan_00000000000003", "customer_id":"cust_00000000000001", "status":"active", "current_start":1580284732, "current_end":1580841000, "ended_at":null, "quantity":25, "notes":{ "notes_key_1":"Tea, Earl Grey, Hot", "notes_key_2":"Tea, Earl Grey… decaf." }, "charge_at":1580841000, "start_at":1580284732, "end_at":1611081000, "auth_attempts":0, "total_count":6, "paid_count":1, "customer_notify":true, "created_at":1580284702, "expire_by":1580626111, "short_url":"https://rzp.io/i/fFWTkbf", "has_scheduled_changes":true, "change_scheduled_at":1557253800, "source": "api", "offer_id":"offer_JHD834hjbxzhd38d", "remaining_count":5 } ``` ------------------------------------------------------------------------------------------------------- ### Cancel a update ```php $api->subscription->fetch($subscriptionId)->cancelScheduledChanges(); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | subscriptionId* | string | The id of the subscription to be cancel an update | **Response:** ```json { "id": "sub_00000000000001", "entity": "subscription", "plan_id": "plan_00000000000003", "customer_id": "cust_00000000000001", "status": "active", "current_start": 1580284732, "current_end": 1580841000, "ended_at": null, "quantity": 1, "notes": { "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey… decaf." }, "charge_at": 1580841000, "start_at": 1580284732, "end_at": 1611081000, "auth_attempts": 0, "total_count": 6, "paid_count": 1, "customer_notify": true, "created_at": 1580284702, "expire_by": 1580626111, "short_url": "https://rzp.io/i/fFWTkbf", "has_scheduled_changes": false, "change_scheduled_at": 1527858600, "source": "api", "offer_id":"offer_JHD834hjbxzhd38d", "remaining_count": 5 } ``` ------------------------------------------------------------------------------------------------------- ### Pause a subscription ```php $api->subscription->fetch($subscriptionId)->pause(array('pause_at'=>'now')); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | subscriptionId* | string | The id of the subscription to be paused | | pause_at | string | To pause the subscription, possible values: `now` | **Response:** ```json { "id": "sub_00000000000001", "entity": "subscription", "plan_id": "plan_00000000000001", "status": "paused", "current_start": null, "current_end": null, "ended_at": null, "quantity": 1, "notes":{ "notes_key_1":"Tea, Earl Grey, Hot", "notes_key_2":"Tea, Earl Grey… decaf." }, "charge_at": null, "start_at": 1580626111, "end_at": 1583433000, "auth_attempts": 0, "total_count": 6, "paid_count": 0, "customer_notify": true, "created_at": 1580280581, "paused_at": 1590280581, "expire_by": 1580626111, "pause_initiated_by": "self", "short_url": "https://rzp.io/i/z3b1R61A9", "has_scheduled_changes": false, "change_scheduled_at": null, "source": "api", "offer_id":"offer_JHD834hjbxzhd38d", "remaining_count": 6 } ``` ------------------------------------------------------------------------------------------------------- ### Resume a subscription ```php $api->subscription->fetch($subscriptionId)->resume(array('resume_at'=>'now')); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | subscriptionId* | string | The id of the subscription to be resumed | | resume_at | string | To resume the subscription, possible values: `now` | **Response:** ```json { "id": "sub_00000000000001", "entity": "subscription", "plan_id": "plan_00000000000001", "status": "active", "current_start": null, "current_end": null, "ended_at": null, "quantity": 1, "notes":{ "notes_key_1":"Tea, Earl Grey, Hot", "notes_key_2":"Tea, Earl Grey… decaf." }, "charge_at": 1580453311, "start_at": 1580626111, "end_at": 1583433000, "auth_attempts": 0, "total_count": 6, "paid_count": 0, "customer_notify": true, "created_at": 1580280581, "paused_at": 1590280581, "expire_by": 1580626111, "pause_initiated_by": null, "short_url": "https://rzp.io/i/z3b1R61A9", "has_scheduled_changes": false, "change_scheduled_at": null, "source": "api", "offer_id":"offer_JHD834hjbxzhd38d", "remaining_count": 6 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch all invoices for a subscription ```php $api->invoice->all(['subscription_id'=>$subscriptionId]); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | subscriptionId* | string | The id of the subscription to fetch invoices | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "inv_00000000000003", "entity": "invoice", "receipt": null, "invoice_number": null, "customer_id": "cust_00000000000001", "customer_details": { "id": "cust_00000000000001", "name": null, "email": "gaurav.kumar@example.com", "contact": "+919876543210", "gstin": null, "billing_address": null, "shipping_address": null, "customer_name": null, "customer_email": "gaurav.kumar@example.com", "customer_contact": "+919876543210" }, "order_id": "order_00000000000002", "subscription_id": "sub_00000000000001", "line_items": [ { "id": "li_00000000000003", "item_id": null, "ref_id": null, "ref_type": null, "name": "Monthly Plan", "description": null, "amount": 99900, "unit_amount": 99900, "gross_amount": 99900, "tax_amount": 0, "taxable_amount": 99900, "net_amount": 99900, "currency": "INR", "type": "plan", "tax_inclusive": false, "hsn_code": null, "sac_code": null, "tax_rate": null, "unit": null, "quantity": 1, "taxes": [] } ], "payment_id": "pay_00000000000002", "status": "paid", "expire_by": null, "issued_at": 1593344888, "paid_at": 1593344889, "cancelled_at": null, "expired_at": null, "sms_status": null, "email_status": null, "date": 1593344888, "terms": null, "partial_payment": false, "gross_amount": 99900, "tax_amount": 0, "taxable_amount": 99900, "amount": 99900, "amount_paid": 99900, "amount_due": 0, "currency": "INR", "currency_symbol": "₹", "description": null, "notes": [], "comment": null, "short_url": "https://rzp.io/i/Ys4feGqEp", "view_less": true, "billing_start": 1594405800, "billing_end": 1597084200, "type": "invoice", "group_taxes_discounts": false, "created_at": 1593344888, "idempotency_key": null } ] } ``` ------------------------------------------------------------------------------------------------------- ### Delete offer linked to a subscription ```php $api->subscription->fetch($subscriptionId)->deleteOffer($offerId); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | subscriptionId* | string | The id of the subscription to offer need to be deleted | | offerId* | string | The id of the offer linked to subscription | **Response:** ```json { "id": "sub_I3GGEs7Xgmnozy", "entity": "subscription", "plan_id": "plan_HuXrfsI0ZZ3peu", "customer_id": "cust_I3FToKbnExwDLu", "status": "active", "current_start": 1632914901, "current_end": 1635445800, "ended_at": null, "quantity": 1, "notes": [], "charge_at": 1635445800, "start_at": 1632914901, "end_at": 1645986600, "auth_attempts": 0, "total_count": 6, "paid_count": 1, "customer_notify": true, "created_at": 1632914246, "expire_by": 1635532200, "short_url": "https://rzp.io/i/SOvRWaYP81", "has_scheduled_changes": false, "change_scheduled_at": null, "source": "dashboard", "payment_method": "card", "offer_id": null, "remaining_count": 5 } ``` ------------------------------------------------------------------------------------------------------- ### Authentication Transaction Please refer this [doc](https://razorpay.com/docs/api/subscriptions/#authentication-transaction) for authentication of transaction ------------------------------------------------------------------------------------------------------- ### Payment verification ```php $api->utility->verifyPaymentSignature($options) ``` Please refer this [doc](https://razorpay.com/docs/api/subscriptions/#payment-verification) for payment verification ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/subscriptions/#subscriptions)** razorpay/documents/transfer.md 0000644 00000054220 15002216177 0012566 0 ustar 00 ## Transfers ### Create transfers from payment ```php $api->payment->fetch($paymentId)->transfer(array('transfers' => array(array('account' => 'acc_I0QRP7PpvaHhpB','amount' => 100,'currency' => 'INR','notes' => array ('name' => 'Gaurav Kumar','roll_no' => 'IEC2011025',),'linked_account_notes' => array ('roll_no'),'on_hold' => true,'on_hold_until' => 1671222870)))); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | paymentId* | string | The id of the payment to be fetched | | transfers | array | All parameters listed [here](https://razorpay.com/docs/api/route/#create-transfers-from-payments) are supported | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "trf_Jhf4Ak94xAcyeS", "entity": "transfer", "status": "pending", "source": "pay_I7watngocuEY4P", "recipient": "acc_HjVXbtpSCIxENR", "amount": 100, "currency": "INR", "amount_reversed": 0, "notes": { "name": "Gaurav Kumar", "roll_no": "IEC2011025" }, "linked_account_notes": [ "roll_no" ], "on_hold": true, "on_hold_until": 1671222870, "recipient_settlement_id": null, "created_at": 1655272292, "processed_at": null, "error": { "code": null, "description": null, "reason": null, "field": null, "step": null, "id": "trf_Jhf4Ak94xAcyeS", "source": null, "metadata": null } } ] } ``` ------------------------------------------------------------------------------------------------------- ### Create transfers from order ```php $api->order->create(array('amount' => 2000,'currency' => 'INR','transfers' => array(array('account' => 'acc_CPRsN1LkFccllA','amount' => 1000,'currency' => 'INR','notes' => array('branch' => 'Acme Corp Bangalore North','name' => 'Gaurav Kumar'),'linked_account_notes' => array('branch'),'on_hold' => 1,'on_hold_until' => 1671222870),array('account' => 'acc_CNo3jSI8OkFJJJ','amount' => 1000,'currency' => 'INR','notes' => array('branch' => 'Acme Corp Bangalore South','name' => 'Saurav Kumar'),'linked_account_notes' => array('branch'),'on_hold' => 0)))); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | amount* | integer | The transaction amount, in paise | | currency* | string | The currency of the payment (defaults to INR) | | receipt | string | A unique identifier provided by you for your internal reference. | | transfers | array | All parameters listed [here](https://razorpay.com/docs/api/route/#create-transfers-from-orders) are supported | **Response:** ```json { "id": "order_Jhf1Sn06my7AUb", "entity": "order", "amount": 2000, "amount_paid": 0, "amount_due": 2000, "currency": "INR", "receipt": null, "offer_id": "offer_JGQvQtvJmVDRIA", "offers": [ "offer_JGQvQtvJmVDRIA" ], "status": "created", "attempts": 0, "notes": [], "created_at": 1655272138, "transfers": [ { "id": "trf_Jhf1SpAYVIeRoP", "entity": "transfer", "status": "created", "source": "order_Jhf1Sn06my7AUb", "recipient": "acc_HjVXbtpSCIxENR", "amount": 1000, "currency": "INR", "amount_reversed": 0, "notes": { "branch": "Acme Corp Bangalore North", "name": "Gaurav Kumar" }, "linked_account_notes": [ "branch" ], "on_hold": true, "on_hold_until": 1671222870, "recipient_settlement_id": null, "created_at": 1655272138, "processed_at": null, "error": { "code": null, "description": null, "reason": null, "field": null, "step": null, "id": "trf_Jhf1SpAYVIeRoP", "source": null, "metadata": null } } ] } ``` ------------------------------------------------------------------------------------------------------- ### Direct transfers ```php $api->transfer->create(array('account' => $accountId, 'amount' => 500, 'currency' => 'INR')); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | accountId* | string | The id of the account to be fetched | | amount* | integer | The amount to be captured (should be equal to the authorized amount, in paise) | | currency* | string | The currency of the payment (defaults to INR) | **Response:** ```json { "id": "trf_JhdmwXgQpEk38N", "entity": "transfer", "status": "processed", "source": "acc_HZbJUcl6DBDLIN", "recipient": "acc_HjVXbtpSCIxENR", "amount": 100, "currency": "INR", "amount_reversed": 0, "fees": 1, "tax": 0, "notes": [], "linked_account_notes": [], "on_hold": false, "on_hold_until": null, "recipient_settlement_id": null, "created_at": 1655267791, "processed_at": 1655267792, "error": { "code": null, "description": null, "reason": null, "field": null, "step": null, "id": "trf_JhdmwXgQpEk38N", "source": null, "metadata": null } } ``` ------------------------------------------------------------------------------------------------------- ### Fetch transfer for a payment ```php $api->payment->fetch($paymentId)->transfers(); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | paymentId* | string | The id of the payment to be fetched | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "trf_JGQjgcy8zHFq7e", "entity": "transfer", "status": "partially_reversed", "source": "order_JGQjgaUikLJo8n", "recipient": "acc_HalyQGZh9ZyiGg", "amount": 500, "currency": "INR", "amount_reversed": 100, "fees": 1, "tax": 0, "notes": { "branch": "Acme Corp Bangalore South", "name": "Saurav Kumar" }, "linked_account_notes": [ "branch" ], "on_hold": true, "on_hold_until": 1679691505, "settlement_status": "on_hold", "recipient_settlement_id": null, "created_at": 1649326643, "processed_at": 1649326701, "error": { "code": null, "description": null, "reason": null, "field": null, "step": null, "id": "trf_JGQjgcy8zHFq7e", "source": null, "metadata": null } } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch transfer for an order ```php $api->order->fetch($orderId)->transfers(array('expand[]'=>'transfers')); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | orderId* | string | The id of the order to be fetched | | expand* | string | Supported value is `transfer` | **Response:** ```json { "id": "order_JfOO8JYmAtYRL0", "entity": "order", "amount": 2000, "amount_paid": 0, "amount_due": 2000, "currency": "INR", "receipt": null, "offer_id": "offer_JGQvQtvJmVDRIA", "offers": [ "offer_JGQvQtvJmVDRIA" ], "status": "created", "attempts": 0, "notes": [], "created_at": 1654776878, "transfers": { "entity": "collection", "count": 2, "items": [ { "id": "trf_JfOO8LGAPdwky4", "entity": "transfer", "status": "created", "source": "order_JfOO8JYmAtYRL0", "recipient": "acc_HjVXbtpSCIxENR", "amount": 1000, "currency": "INR", "amount_reversed": 0, "fees": 0, "tax": null, "notes": { "branch": "Acme Corp Bangalore North", "name": "Gaurav Kumar" }, "linked_account_notes": [ "branch" ], "on_hold": true, "on_hold_until": 1671222870, "settlement_status": null, "recipient_settlement_id": null, "created_at": 1654776878, "processed_at": null, "error": { "code": null, "description": null, "reason": null, "field": null, "step": null, "id": "trf_JfOO8LGAPdwky4", "source": null, "metadata": null } }, { "id": "trf_JfOO8M4p6tQZ6g", "entity": "transfer", "status": "created", "source": "order_JfOO8JYmAtYRL0", "recipient": "acc_HalyQGZh9ZyiGg", "amount": 1000, "currency": "INR", "amount_reversed": 0, "fees": 0, "tax": null, "notes": { "branch": "Acme Corp Bangalore South", "name": "Saurav Kumar" }, "linked_account_notes": [ "branch" ], "on_hold": false, "on_hold_until": null, "settlement_status": null, "recipient_settlement_id": null, "created_at": 1654776878, "processed_at": null, "error": { "code": null, "description": null, "reason": null, "field": null, "step": null, "id": "trf_JfOO8M4p6tQZ6g", "source": null, "metadata": null } } ] } } ``` ------------------------------------------------------------------------------------------------------- ### Fetch transfer ```php $api->transfer->fetch($transferId); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | transferId* | string | The id of the transfer to be fetched | **Response:** ```json { "id": "trf_IJOI2DHWQYwqU3", "entity": "transfer", "status": "created", "source": "order_IJOI2CD6CNIywP", "recipient": "acc_HjVXbtpSCIxENR", "amount": 100, "currency": "INR", "amount_reversed": 0, "fees": 0, "tax": null, "notes": { "branch": "Acme Corp Bangalore North", "name": "Gaurav Kumar" }, "linked_account_notes": [ "branch" ], "on_hold": true, "on_hold_until": 1671222870, "settlement_status": null, "recipient_settlement_id": null, "created_at": 1636435963, "processed_at": null, "error": { "code": null, "description": null, "reason": null, "field": null, "step": null, "id": "trf_IJOI2DHWQYwqU3", "source": null, "metadata": null } } ``` ------------------------------------------------------------------------------------------------------- ### Fetch transfers for a settlement ```php $api->transfer->all(array('recipient_settlement_id'=> $recipientSettlementId)); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | recipientSettlementId* | string | The recipient settlement id obtained from the settlement.processed webhook payload. | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "trf_HWjmkReRGPhguR", "entity": "transfer", "status": "processed", "source": "pay_HWjY9DZSMsbm5E", "recipient": "acc_HWjl1kqobJzf4i", "amount": 1000, "currency": "INR", "amount_reversed": 0, "fees": 3, "tax": 0, "notes": [], "linked_account_notes": [], "on_hold": false, "on_hold_until": null, "settlement_status": "settled", "recipient_settlement_id": "setl_HYIIk3H0J4PYdX", "created_at": 1625812996, "processed_at": 1625812996, "error": { "code": null, "description": null, "reason": null, "field": null, "step": null, "id": "trf_HWjmkReRGPhguR", "source": null, "metadata": null } } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch settlement details ```php $api->transfer->all(array('expand[]'=> 'recipient_settlement')); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | expand* | string | Supported value is `recipient_settlement` | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "trf_JhdmwXgQpEk38N", "entity": "transfer", "status": "processed", "source": "acc_HZbJUcl6DBDLIN", "recipient": "acc_HjVXbtpSCIxENR", "amount": 100, "currency": "INR", "amount_reversed": 0, "fees": 1, "tax": 0, "notes": [], "linked_account_notes": [], "on_hold": false, "on_hold_until": null, "settlement_status": null, "recipient_settlement_id": null, "recipient_settlement": null, "created_at": 1655267791, "processed_at": 1655267792, "error": { "code": null, "description": null, "reason": null, "field": null, "step": null, "id": "trf_JhdmwXgQpEk38N", "source": null, "metadata": null } } ] } ``` ------------------------------------------------------------------------------------------------------- ### Refund payments and reverse transfer from a linked account ```php $api->payment->fetch("pay_JsPSazUg9UnOX2")->refund(array('amount'=> '100','reverse_all'=>'1')); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | paymentId* | string | The id of the payment to be fetched | | amount* | integer | The amount to be captured (should be equal to the authorized amount, in paise) | | reverse_all | boolean | Reverses transfer made to a linked account. Possible values:<br> * `1` - Reverses transfer made to a linked account.<br>* `0` - Does not reverse transfer made to a linked account.| **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "pay_JHAe1Zat55GbZB", "entity": "payment", "amount": 5000, "currency": "INR", "status": "captured", "order_id": "order_IluGWxBm9U8zJ8", "invoice_id": null, "international": false, "method": "netbanking", "amount_refunded": 0, "refund_status": null, "captured": true, "description": "Test Transaction", "card_id": null, "bank": "KKBK", "wallet": null, "vpa": null, "email": "gaurav.kumar@example.com", "contact": "+919999999999", "notes": { "address": "Razorpay Corporate Office" }, "fee": 118, "tax": 18, "error_code": null, "error_description": null, "error_source": null, "error_step": null, "error_reason": null, "acquirer_data": { "bank_transaction_id": "7003347" }, "created_at": 1649488316 } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch payments of a linked account ```php $api->setHeader('X-Razorpay-Account', 'acc_IRQWUleX4BqvYn'); $api->payment->all(); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | X-Razorpay-Account | string | The linked account id to fetch the payments received by linked account | **Response:** ```json { "entity": "collection", "count": 2, "items": [ { "id": "pay_E9uth3WhYbh9QV", "entity": "payment", "amount": 100, "currency": "INR", "status": "captured", "order_id": null, "invoice_id": null, "international": null, "method": "transfer", "amount_refunded": 0, "refund_status": null, "captured": true, "description": null, "card_id": null, "bank": null, "wallet": null, "vpa": null, "email": "", "contact": null, "notes": [], "fee": 0, "tax": 0, "error_code": null, "error_description": null, "created_at": 1580219046 } ] } ``` ------------------------------------------------------------------------------------------------------- ### Reverse transfers from all linked accounts ```php $api->transfer->fetch($transferId)->reverse(array('amount'=>'100')); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | transferId* | string | The id of the transfer to be fetched | | amount | integer | The amount to be captured (should be equal to the authorized amount, in paise) | **Response:** ```json { "id": "rfnd_JJFNlNXPHY640A", "entity": "refund", "amount": 100, "currency": "INR", "payment_id": "pay_JJCqynf4fQS0N1", "notes": [], "receipt": null, "acquirer_data": { "arn": null }, "created_at": 1649941680, "batch_id": null, "status": "processed", "speed_processed": "normal", "speed_requested": "normal" } ``` ------------------------------------------------------------------------------------------------------- ### Hold settlements for transfers ```php $api->payment->fetch($paymentId)->transfer(array('transfers' => array(array('account' => 'acc_I0QRP7PpvaHhpB','amount' => 100,'currency' => 'INR','on_hold' => true)))); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | paymentId* | string | The id of the payment to be fetched | | transfers | array | All parameters listed [here](https://razorpay.com/docs/api/route/#hold-settlements-for-transfers) are supported | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "trf_JhemwjNekar9Za", "entity": "transfer", "status": "pending", "source": "pay_I7watngocuEY4P", "recipient": "acc_HjVXbtpSCIxENR", "amount": 100, "currency": "INR", "amount_reversed": 0, "notes": [], "linked_account_notes": [], "on_hold": true, "on_hold_until": null, "recipient_settlement_id": null, "created_at": 1655271313, "processed_at": null, "error": { "code": null, "description": null, "reason": null, "field": null, "step": null, "id": "trf_JhemwjNekar9Za", "source": null, "metadata": null } } ] } ``` ------------------------------------------------------------------------------------------------------- ### Modify settlement hold for transfers ```php $api->transfer->fetch($transferId)->edit(array('on_hold' => '1', 'on_hold_until' => '1679691505')); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | transferId* | string | The id of the transfer to be fetched | | on_hold* | boolean | Possible values is `0` or `1` | | on_hold_until | integer | Timestamp, in Unix, that indicates until when the settlement of the transfer must be put on hold | **Response:** ```json { "id": "trf_JOmyyZ7lsxDzwF", "entity": "transfer", "status": "reversed", "source": "acc_HZbJUcl6DBDLIN", "recipient": "acc_HjVXbtpSCIxENR", "amount": 100, "currency": "INR", "amount_reversed": 100, "fees": 1, "tax": 0, "notes": [], "linked_account_notes": [], "on_hold": true, "on_hold_until": null, "settlement_status": null, "recipient_settlement_id": null, "created_at": 1651151707, "processed_at": 1651151708, "error": { "code": null, "description": null, "reason": null, "field": null, "step": null, "id": "trf_JOmyyZ7lsxDzwF", "source": null, "metadata": null } } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/route/#transfers/)** razorpay/documents/customer.md 0000644 00000025470 15002216177 0012610 0 ustar 00 ## Customer ### Create customer ```php $api->customer->create(array('name' => 'Razorpay User', 'email' => 'customer@razorpay.com','contact'=>'9123456780','notes'=> array('notes_key_1'=> 'Tea, Earl Grey, Hot','notes_key_2'=> 'Tea, Earl Grey… decaf'))); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | name* | string | Name of the customer | | email | string | Email of the customer | | contact | string | Contact number of the customer | | fail_existing | string | If a customer with the same details already exists, the request throws an exception by default. Possible value is `0` or `1`| | gstin | string | Customer's GST number, if available. For example, 29XAbbA4369J1PA | | notes | array | A key-value pair | **Response:** ```json { "id" : "cust_1Aa00000000004", "entity": "customer", "name" : "Gaurav Kumar", "email" : "gaurav.kumar@example.com", "contact" : "9123456780", "gstin": "29XAbbA4369J1PA", "notes":{ "notes_key_1":"Tea, Earl Grey, Hot", "notes_key_2":"Tea, Earl Grey… decaf." }, "created_at ": 1234567890 } ``` ------------------------------------------------------------------------------------------------------- ### Edit customer ```php $api->customer->fetch($customerId)->edit(array('name' => 'Razorpay User', 'email' => 'customer@razorpay.com', 'contact' => '9999999999')); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | customerId* | string | The id of the customer to be updated | | email | string | Email of the customer | | contact | string | Contact number of the customer | | notes | array | A key-value pair | **Response:** ```json { "id": "cust_1Aa00000000003", "entity": "customer", "name": "Gaurav Kumar", "email": "Gaurav.Kumar@example.com", "contact": "9000000000", "gstin": null, "notes": { "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey… decaf." }, "created_at": 1582033731 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch all customer ```php $api->customer->all($options); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | count | integer | number of payments to fetch (default: 10) | | skip | integer | number of payments to be skipped (default: 0) | **Response:** ```json { "entity":"collection", "count":1, "items":[ { "id":"cust_1Aa00000000001", "entity":"customer", "name":"Gaurav Kumar", "email":"gaurav.kumar@example.com", "contact":"9876543210", "gstin":"29XAbbA4369J1PA", "notes":{ "note_key_1":"September", "note_key_2":"Make it so." }, "created_at ":1234567890 } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch a customer ```php $api->customer->fetch($customerId); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | customerId* | string | The id of the customer to be fetched | **Response:** ```json { "id" : "cust_1Aa00000000001", "entity": "customer", "name" : "Saurav Kumar", "email" : "Saurav.kumar@example.com", "contact" : "+919000000000", "gstin":"29XAbbA4369J1PA", "notes" : [], "created_at ": 1234567890 } ``` ------------------------------------------------------------------------------------------------------- ### Add Bank Account of Customer ```php $customerId = "cust_N5mywh91sXB69O" $api->customer->fetch($customerId)->addBankAccount([ "ifsc_code" => "UTIB0000194", "account_number" => "919999999999", "beneficiary_name" => "Pratheek", "beneficiary_address1" => "address 1", "beneficiary_address2" => "address 2", "beneficiary_address3" => "address 3", "beneficiary_address4" => "address 4", "beneficiary_email" => "random@email.com", "beneficiary_mobile" => "8762489310", "beneficiary_city" => "Bangalore", "beneficiary_state" => "KA", "beneficiary_country" => "IN", ]); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | customerId* | string | Customer's bank account number | | account_number | integer | The id of the customer to be fetched | | account_number | string | The name of the beneficiary associated with the bank account. | | beneficiary_name | string | The virtual payment address. | | beneficiary_address1 | string | The id of the customer to be fetched | | beneficiary_email | string | Email address of the beneficiary. | | beneficiary_mobile | integer | Mobile number of the beneficiary. | | beneficiary_city | string | The name of the city of the beneficiary. | | beneficiary_state | string | The state of the beneficiary. | | beneficiary_pin | interger | The pin code of the beneficiary's address. | | ifsc_code | string | The IFSC code of the bank branch associated with the account. | **Response:** ```json { "id" : "cust_1Aa00000000001", "entity": "customer", "name" : "Saurav Kumar", "email" : "Saurav.kumar@example.com", "contact" : "+919000000000", "gstin":"29XAbbA4369J1PA", "notes" : [], "created_at ": 1234567890 } ``` ------------------------------------------------------------------------------------------------------- ### Delete Bank Account of Customer ```php $customerId = "cust_N5mywh91sXB69O" $bankAccountId = "ba_N6aM8uo64IzxHu" $api->customer->fetch($customerId)->deleteBankAccount($bankAccountId); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | customerId* | string | Customer's bank account number | | bank_id | string | The bank_id that needs to be deleted. | **Response:** ```json { "id": "ba_Evg09Ll05SIPSD", "ifsc": "ICIC0001207", "bank_name": "ICICI Bank", "name": "Test R4zorpay", "account_number": "XXXXXXXXXXXXXXX0434", "status": "deleted" } ``` ------------------------------------------------------------------------------------------------------- ### Eligibility Check API ```php $api->customer->requestEligibilityCheck(array( "inquiry" => "affordability", "amount" => 500000, "currency" => "INR", "customer" => array( "id" => "cust_MVSyUEwC4qb5sN", "contact" => "+918220276214", "ip" => "105.106.107.108", "referrer" => "https://merchansite.com/example/paybill", "user_agent" => "Mozilla/5.0", ) )); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | customerId* | string | Customer's bank account number | | bank_id | string | The bank_id that needs to be deleted. | **Response:** ```json { "amount": "500000", "customer": { "id": "KkBhM9EC1Y0HTm", "contact": "+918220722114" }, "instruments": [ { "method": "emi", "issuer": "HDFC", "type": "debit", "eligibility_req_id": "elig_KkCNLzlNeMYQyZ", "eligibility": { "status": "eligible" } }, { "method": "paylater", "provider": "getsimpl", "eligibility_req_id": "elig_KkCNLzlNeMYQyZ", "eligibility": { "status": "eligible" } }, { "method": "paylater", "provider": "icic", "eligibility_req_id": "elig_KkCNLzlNeMYQyZ", "eligibility": { "status": "eligible" } }, { "method": "cardless_emi", "provider": "walnut369", "eligibility_req_id": "elig_KkCNLzlNeMYQyZ", "eligibility": { "status": "ineligible", "error": { "code": "GATEWAY_ERROR", "description": "The customer has not been approved by the partner.", "source": "business", "step": "inquiry", "reason": "user_not_approved" } } }, { "method": "cardless_emi", "provider": "zestmoney", "eligibility_req_id": "elig_KkCNLzlNeMYQyZ", "eligibility": { "status": "ineligible", "error": { "code": "GATEWAY_ERROR", "description": "The customer has exhausted their credit limit.", "source": "business", "step": "inquiry", "reason": "credit_limit_exhausted" } } }, { "method": "paylater", "provider": "lazypay", "eligibility_req_id": "elig_KkCNLzlNeMYQyZ", "eligibility": { "status": "ineligible", "error": { "code": "GATEWAY_ERROR", "description": "The order amount is less than the minimum transaction amount.", "source": "business", "step": "inquiry", "reason": "min_amt_required" } } } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch Eligibility by id ```php $api->customer->fetchEligibility("elig_F1cxDoHWD4fkQt"); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | customerId* | string | Customer's bank account number | | bank_id | string | The bank_id that needs to be deleted. | **Response:** ```json { "instruments": [ { "method": "paylater", "provider": "lazypay", "eligibility_req_id": "elig_LBwGKVvS2X48Lq", "eligibility": { "status": "eligible" } }, { "method": "paylater", "provider": "getsimpl", "eligibility_req_id": "elig_LBwGKVvS2X48Lq", "eligibility": { "status": "ineligible", "error": { "code": "GATEWAY_ERROR", "description": "The customer has exhausted their credit limit", "source": "gateway", "step": "inquiry", "reason": "credit_limit_exhausted" } } } ] } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/customers/)** razorpay/documents/item.md 0000644 00000012665 15002216177 0011707 0 ustar 00 ## items ### Create item ```php $api->Item->create(array("name" => "Book / English August","description" => "An indian story, Booker prize winner.","amount" => 20000,"currency" => "INR")); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | name* | string | Name of the item. | | description | string | A brief description of the item. | | amount* | integer | Amount of the order to be paid | | currency* | string | Currency of the order. Currently only `INR` is supported. | **Response:** ```json { "id": "item_JInaSLODeDUQiQ", "active": true, "name": "Book / English August", "description": "An indian story, Booker prize winner.", "amount": 20000, "unit_amount": 20000, "currency": "INR", "type": "invoice", "unit": null, "tax_inclusive": false, "hsn_code": null, "sac_code": null, "tax_rate": null, "tax_id": null, "tax_group_id": null, "created_at": 1649843796 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch all items ```php $api->Item->all($options); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | from | timestamp | timestamp after which the item were created | | to | timestamp | timestamp before which the item were created | | count | integer | number of item to fetch (default: 10) | | skip | integer | number of item to be skipped (default: 0) | | active | boolean | Possible values is `0` or `1` | **Response:** ```json { "entity": "collection", "count": 2, "items": [ { "id": "item_JInaSLODeDUQiQ", "active": true, "name": "Book / English August", "description": "An indian story, Booker prize winner.", "amount": 20000, "unit_amount": 20000, "currency": "INR", "type": "invoice", "unit": null, "tax_inclusive": false, "hsn_code": null, "sac_code": null, "tax_rate": null, "tax_id": null, "tax_group_id": null, "created_at": 1649843796 }, { "id": "item_JIPSg5L06yhHie", "active": false, "name": "Book / Ignited Minds - Updated name!", "description": "New descirption too. :).", "amount": 20000, "unit_amount": 20000, "currency": "INR", "type": "invoice", "unit": null, "tax_inclusive": false, "hsn_code": null, "sac_code": null, "tax_rate": null, "tax_id": null, "tax_group_id": null, "created_at": 1649758835 } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch particular item ```php $api->Item->fetch($itemId); ``` **Parameters** | Name | Type | Description | |----------|--------|-------------------------------------| | itemId* | string | The id of the item to be fetched | **Response:** ```json { "id": "item_JInaSLODeDUQiQ", "active": true, "name": "Book / English August", "description": "An indian story, Booker prize winner.", "amount": 20000, "unit_amount": 20000, "currency": "INR", "type": "invoice", "unit": null, "tax_inclusive": false, "hsn_code": null, "sac_code": null, "tax_rate": null, "tax_id": null, "tax_group_id": null, "created_at": 1649843796 } ``` ------------------------------------------------------------------------------------------------------- ### Update item ```php $api->Item->fetch($itemId)->edit(array("name" => "Book / Ignited Minds - Updated name!","description" => "New descirption too. :).","amount" => 20000,"currency" => "INR","active" => true )); ``` **Parameters** | Name | Type | Description | |----------|--------|-------------------------------------| | itemId* | string | The id of the item to be fetched | | name | string | Name of the item. | | description | string | A brief description of the item. | | amount | integer | Amount of the order to be paid | | currency | string | Currency of the order. Currently only `INR` is supported. | | active | boolean | Possible values is `0` or `1` | **Response:** ```json { "id": "item_JInaSLODeDUQiQ", "active": true, "name": "Book / Ignited Minds - Updated name!", "description": "New descirption too. :).", "amount": 20000, "unit_amount": 20000, "currency": "INR", "type": "invoice", "unit": null, "tax_inclusive": false, "hsn_code": null, "sac_code": null, "tax_rate": null, "tax_id": null, "tax_group_id": null, "created_at": 1649843796 } ``` ------------------------------------------------------------------------------------------------------- ### Delete item ```php $api->Item->fetch($itemId)->delete(); ``` **Parameters** | Name | Type | Description | |----------|--------|-------------------------------------| | itemId* | string | The id of the item to be fetched | **Response:** ```json [] ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/items)** razorpay/documents/payment.md 0000644 00000066100 15002216177 0012417 0 ustar 00 ## Payments ### Capture payment ```php $api->payment->fetch($paymentId)->capture(array('amount'=>$amount,'currency' => 'INR')); ``` **Parameters:** | Name | Type | Description | |-----------|---------|--------------------------------------------------------------------------------| | paymentId* | string | Id of the payment to capture | | amount* | integer | The amount to be captured (should be equal to the authorized amount, in paise) | | currency* | string | The currency of the payment (defaults to INR) | **Response:** ```json { "id": "pay_G8VQzjPLoAvm6D", "entity": "payment", "amount": 1000, "currency": "INR", "status": "captured", "order_id": "order_G8VPOayFxWEU28", "invoice_id": null, "international": false, "method": "upi", "amount_refunded": 0, "refund_status": null, "captured": true, "description": "Purchase Shoes", "card_id": null, "bank": null, "wallet": null, "vpa": "gaurav.kumar@exampleupi", "email": "gaurav.kumar@example.com", "contact": "+919999999999", "customer_id": "cust_DitrYCFtCIokBO", "notes": [], "fee": 24, "tax": 4, "error_code": null, "error_description": null, "error_source": null, "error_step": null, "error_reason": null, "acquirer_data": { "rrn": "033814379298" }, "created_at": 1606985209 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch all payments ```php $api->payment->all($options); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | from | timestamp | timestamp after which the payments were created | | to | timestamp | timestamp before which the payments were created | | count | integer | number of payments to fetch (default: 10) | | skip | integer | number of payments to be skipped (default: 0) | | expand[] | string | Used to retrieve additional information about the payment. Possible value is `cards` or `emi`| **Response:** ```json { "entity": "collection", "count": 2, "items": [ { "id": "pay_G8VaL2Z68LRtDs", "entity": "payment", "amount": 900, "currency": "INR", "status": "captured", "order_id": "order_G8VXfKDWDEOHHd", "invoice_id": null, "international": false, "method": "netbanking", "amount_refunded": 0, "refund_status": null, "captured": true, "description": "Purchase Shoes", "card_id": null, "bank": "KKBK", "wallet": null, "vpa": null, "email": "gaurav.kumar@example.com", "contact": "+919999999999", "customer_id": "cust_DitrYCFtCIokBO", "notes": [], "fee": 22, "tax": 4, "error_code": null, "error_description": null, "error_source": null, "error_step": null, "error_reason": null, "acquirer_data": { "bank_transaction_id": "0125836177" }, "created_at": 1606985740 } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch a payment ```php $api->payment->fetch($paymentId); ``` **Parameters:** | Name | Type | Description | |------------|--------|-----------------------------------| | paymentId* | string | Id of the payment to be retrieved | **Response:** ```json { "id": "pay_G8VQzjPLoAvm6D", "entity": "payment", "amount": 1000, "currency": "INR", "status": "captured", "order_id": "order_G8VPOayFxWEU28", "invoice_id": null, "international": false, "method": "upi", "amount_refunded": 0, "refund_status": null, "captured": true, "description": "Purchase Shoes", "card_id": null, "bank": null, "wallet": null, "vpa": "gaurav.kumar@exampleupi", "email": "gaurav.kumar@example.com", "contact": "+919999999999", "customer_id": "cust_DitrYCFtCIokBO", "notes": [], "fee": 24, "tax": 4, "error_code": null, "error_description": null, "error_source": null, "error_step": null, "error_reason": null, "acquirer_data": { "rrn": "033814379298" }, "created_at": 1606985209 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch payments for an order ```php $api->order->fetch($orderId)->payments(); ``` **Parameters** | Name | Type | Description | |----------|--------|-------------------------------------| | orderId* | string | The id of the order to be retrieve payment info | **Response:** ```json { "count": 1, "entity": "collection", "items": [ { "id": "pay_DovGQXOkPBJjjU", "entity": "payment", "amount": 600, "currency": "INR", "status": "captured", "order_id": "order_DovFx48wjYEr2I", "method": "netbanking", "amount_refunded": 0, "refund_status": null, "captured": true, "description": "A Wild Sheep Chase is a novel by Japanese author Haruki Murakami", "card_id": null, "bank": "SBIN", "wallet": null, "vpa": null, "email": "gaurav.kumar@example.com", "contact": "9364591752", "fee": 70, "tax": 10, "error_code": null, "error_description": null, "error_source": null, "error_step": null, "error_reason": null, "notes": [], "acquirer_data": { "bank_transaction_id": "0125836177" }, "created_at": 1400826750 } ] } ``` ------------------------------------------------------------------------------------------------------- ### Update a payment ```php $api->payment->fetch($paymentId)->edit(array('notes'=> array('key_1'=> 'value1','key_2'=> 'value2'))); ``` **Parameters:** | Name | Type | Description | |-------------|---------|--------------------------------------| | paymentId* | string | Id of the payment to update | | notes* | array | A key-value pair | **Response:** ```json { "id": "pay_CBYy6tLmJTzn3Q", "entity": "payment", "amount": 1000, "currency": "INR", "status": "authorized", "order_id": null, "invoice_id": null, "international": false, "method": "netbanking", "amount_refunded": 0, "refund_status": null, "captured": false, "description": null, "card_id": null, "bank": "UTIB", "wallet": null, "vpa": null, "email": "testme@acme.com", "customer_id": "cust_JR4BVKjKyJ7enk", "notes": { "key1": "value1", "key2": "value2" }, "fee": null, "tax": null, "error_code": null, "error_description": null, "error_source": null, "error_step": null, "error_reason": null, "acquirer_data": { "bank_transaction_id": "0125836177" }, "created_at": 1553504328 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch expanded card or emi details for payments Request #1: Card ```php $api->payment->all(array('expand[]'=>'card')); ``` Request #2: EMI ```php $api->payment->all(array('expand[]'=>'emi')); ``` **Response:**<br> For expanded card or emi details for payments response please click [here](https://razorpay.com/docs/api/payments/#fetch-expanded-card-or-emi-details-for-payments) ------------------------------------------------------------------------------------------------------- ### Fetch card details with paymentId ```php $api->payment->fetch($paymentId)->fetchCardDetails(); ``` **Parameters:** | Name | Type | Description | |-------------|---------|--------------------------------------| | paymentId* | string | Id of the payment to update | **Response:** ```json { "id": "card_6krZ6bcjoeqyV9", "entity": "card", "name": "Gaurav", "last4": "3335", "network": "Visa", "type": "debit", "issuer": "SBIN", "international": false, "emi": null, "sub_type": "business" } ``` ------------------------------------------------------------------------------------------------------- ### Fetch Payment Downtime Details ```php $api->payment->fetchPaymentDowntime(); ``` **Response:** <br> For payment downtime response please click [here](https://razorpay.com/docs/api/payments/downtime/#fetch-payment-downtime-details) ------------------------------------------------------------------------------------------------------- ### Fetch Payment Downtime ```php $api->payment->fetchPaymentDowntimeById($downtimeId); ``` **Parameters:** | Name | Type | Description | |-------------|---------|--------------------------------------| | downtimeId* | string | Id to fetch payment downtime | **Response:** <br> For payment downtime by id response please click [here](https://razorpay.com/docs/api/payments/downtime/#fetch-payment-downtime-details-by-id) ------------------------------------------------------------------------------------------------------- ### Payment capture settings API ```php $api->order->create(array('amount' => 50000,'currency' => 'INR','receipt' => 'rcptid_11','payment' => array('capture' => 'automatic','capture_options' => array('automatic_expiry_period' => 12,'manual_expiry_period' => 7200,'refund_speed' => 'optimum')))); ``` **Parameters:** | Name | Type | Description | |-------------|---------|--------------------------------------| | amount* | integer | Amount of the order to be paid | | currency* | string | Currency of the order. Currently only `INR` is supported. | | receipt | string | Your system order reference id. | | payment | array | please refer this [doc](https://razorpay.com/docs/payments/payments/capture-settings/api/) for params | **Response:** <br> ```json { "id": "order_DBJOWzybf0sJbb", "entity": "order", "amount": 50000, "amount_paid": 0, "amount_due": 50000, "currency": "INR", "receipt": "rcptid_11", "status": "created", "attempts": 0, "notes": [], "created_at": 1566986570 } ``` ------------------------------------------------------------------------------------------------------- ### Create Payment Json ```php $api->payment->createPaymentJson(array('amount' => 100,'currency' => 'INR','email' => 'gaurav.kumar@example.com','contact' => '9123456789','order_id' => 'order_I6LVPRQ6upW3uh','method' => 'card','card' => array('number' => '4854980604708430','cvv' => '123','expiry_month' => '12','expiry_year' => '21','name' => 'Gaurav Kumar'))); ``` **Parameters:** | Name | Type | Description | |-------------|---------|--------------------------------------| | amount* | integer | Amount of the order to be paid | | currency* | string | The currency of the payment (defaults to INR) | | order_id* | string | The unique identifier of the order created. | | email* | string | Email of the customer | | contact* | string | Contact number of the customer | | method* | string | Possible value is `card`, `netbanking`, `wallet`,`emi`, `upi`, `cardless_emi`, `paylater`. | | card | array | All keys listed [here](https://razorpay.com/docs/payments/payment-gateway/s2s-integration/payment-methods/#supported-payment-fields) are supported | | bank | string | Bank code of the bank used for the payment. Required if the method is `netbanking`.| | bank_account | array | All keys listed [here](https://razorpay.com/docs/payments/customers/customer-fund-account-api/#create-a-fund-account) are supported | | vpa | string | Virtual payment address of the customer. Required if the method is `upi`. | | wallet | string | Wallet code for the wallet used for the payment. Required if the method is `wallet`. | | notes | array | A key-value pair | please refer this [doc](https://razorpay.com/docs/payment-gateway/s2s-integration/payment-methods/) for params **Response:** <br> ```json { "razorpay_payment_id": "pay_FVmAstJWfsD3SO", "next": [ { "action": "redirect", "url": "https://api.razorpay.com/v1/payments/FVmAtLUe9XZSGM/authorize" }, { "action": "otp_generate", "url": "https://api.razorpay.com/v1/payments/pay_FVmAstJWfsD3SO/otp_generate?track_id=FVmAtLUe9XZSGM&key_id=<YOUR_KEY_ID>" } ] } ``` ------------------------------------------------------------------------------------------------------- ### OTP Generate ```php $api = new Api("key",""); // Use Only razorpay key $api->payment->otpGenerate($paymentId); ``` **Parameters:** | Name | Type | Description | |-------------|---------|--------------------------------------| | paymentId* | integer | Unique identifier of the payment | **Response:** <br> ```json { "razorpay_payment_id": "pay_FVmAstJWfsD3SO", "next": [ { "action": "otp_submit", "url": "https://api.razorpay.com/v1/payments/pay_FVmAstJWfsD3SO/otp_submit/ac2d415a8be7595de09a24b41661729fd9028fdc?key_id=<YOUR_KEY_ID>" }, { "action": "otp_resend", "url": "https://api.razorpay.com/v1/payments/pay_FVmAstJWfsD3SO/otp_resend/json?key_id=<YOUR_KEY_ID>" } ], "metadata": { "issuer": "HDFC", "network": "MC", "last4": "1111", "iin": "411111" } } ``` ------------------------------------------------------------------------------------------------------- ### OTP Submit ```php $api->payment->fetch($paymentId)->otpSubmit(array('otp'=> '12345')); ``` **Parameters:** | Name | Type | Description | |-------------|---------|--------------------------------------| | paymentId* | integer | Unique identifier of the payment | | otp* | string | The customer receives the OTP using their preferred notification medium - SMS or email | **Response:** <br> Success ```json { "razorpay_payment_id": "pay_D5jmY2H6vC7Cy3", "razorpay_order_id": "order_9A33XWu170gUtm", "razorpay_signature": "9ef4dffbfd84f1318f6739a3ce19f9d85851857ae648f114332d8401e0949a3d" } ``` Failure ```json { "error": { "code" : "BAD_REQUEST_ERROR", "description": "payment processing failed because of incorrect otp" }, "next": ["otp_submit", "otp_resend"] } ``` ------------------------------------------------------------------------------------------------------- ### Create Payment Json (Third party validation) ```php $api->payment->createPaymentJson(array('amount' => 100,'currency' => 'INR','email' => 'gaurav.kumar@example.com','contact' => '9123456789','order_id' => 'order_I6LVPRQ6upW3uh','method' => 'netbanking', 'bank'=>'HDFC')); ``` **Parameters:** | Name | Type | Description | |-------------|---------|--------------------------------------| | amount* | integer | Amount of the order to be paid | | currency* | string | The currency of the payment (defaults to INR) | | order_id* | string | The unique identifier of the order created. | | email* | string | Email of the customer | | contact* | string | Contact number of the customer | | method* | string | Possible value is `netbanking` | | bank* | string | The customer's bank code.For example, `HDFC`.| please refer this [doc](https://razorpay.com/docs/payments/third-party-validation/s2s-integration/netbanking#step-3-create-a-payment) for params **Response:** <br> ```json { "razorpay_payment_id": "pay_GAWOYqPlvrtPSi", "next": [ { "action": "redirect", "url": "https://api.razorpay.com/v1/payments/pay_GAWOYqPlvrtPSi/authorize" } ] } ``` ------------------------------------------------------------------------------------------------------- ### Create Payment UPI s2s / VPA token (Third party validation) ```php $api->payment->createUpi(array("amount" => 200,"currency" => "INR","order_id" => "order_Jhgp4wIVHQrg5H","email" => "gaurav.kumar@example.com","contact" => "9123456789","method" => "upi","customer_id" => "cust_EIW4T2etiweBmG","save" => 1,"ip" => "192.168.0.103","referer" => "http","user_agent" => "Mozilla/5.0","description" => "Test flow","notes" => array("note_key" => "value1"),"upi" => array("flow" => "collect","vpa" => "gauravkumar@exampleupi","expiry_time" => 5))); ``` **Parameters:** | Name | Type | Description | |-------------|---------|--------------------------------------| | amount* | integer | Amount of the order to be paid | | currency* | string | The currency of the payment (defaults to INR) | | order_id* | string | The unique identifier of the order created. | | email* | string | Email of the customer | | customer_id* | string | The id of the customer to be fetched | | contact* | string | Contact number of the customer | | notes | array | A key-value pair | | description | string | Descriptive text of the payment. | | save | boolean | Specifies if the VPA should be stored as tokens.Possible value is `0`, `1` | | callback_url | string | URL where Razorpay will submit the final payment status. | | ip* | string | The client's browser IP address. For example `117.217.74.98` | | referer* | string | Value of `referer` header passed by the client's browser. For example, `https://example.com/` | | user_agent* | string | Value of `user_agent` header passed by the client's browser. For example, `Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36` | | upi* (for Upi only) | array | All keys listed [here](https://razorpay.com/docs/payments/third-party-validation/s2s-integration/upi/collect#step-14-initiate-a-payment) are supported | **Response:** <br> ```json { "razorpay_payment_id": "pay_EAm09NKReXi2e0" } ``` ------------------------------------------------------------------------------------------------------- ### Create Payment UPI s2s / VPA token (Third party validation) ```php $api->payment->createUpi(array("amount" => 200,"currency" => "INR","order_id" => "order_Jhgp4wIVHQrg5H","email" => "gaurav.kumar@example.com","contact" => "9123456789","method" => "upi","customer_id" => "cust_EIW4T2etiweBmG","ip" => "192.168.0.103","referer" => "http","user_agent" => "Mozilla/5.0","description" => "Test flow","notes" => array("note_key" => "value1"),"upi" => array("flow" => "intent"))); ``` **Parameters:** | Name | Type | Description | |-------------|---------|--------------------------------------| | amount* | integer | Amount of the order to be paid | | currency* | string | The currency of the payment (defaults to INR) | | order_id* | string | The unique identifier of the order created. | | email* | string | Email of the customer | | customer_id* | string | The id of the customer to be fetched | | contact* | string | Contact number of the customer | | notes | array | A key-value pair | | description | string | Descriptive text of the payment. | | save | boolean | Specifies if the VPA should be stored as tokens.Possible value is `0`, `1` | | callback_url | string | URL where Razorpay will submit the final payment status. | | ip* | string | The client's browser IP address. For example `117.217.74.98` | | referer* | string | Value of `referer` header passed by the client's browser. For example, `https://example.com/` | | user_agent* | string | Value of `user_agent` header passed by the client's browser. For example, `Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36` | | upi* (for Upi only) | array | All keys listed [here](https://razorpay.com/docs/payments/third-party-validation/s2s-integration/upi/intent/#step-2-initiate-a-payment) are supported | **Response:** <br> ```json { "razorpay_payment_id": "pay_CMeM6XvOPGFiF", "link": "upi://pay?pa=success@razorpay&pn=xyz&tr=xxxxxxxxxxx&tn=gourav&am=1&cu=INR&mc=xyzw" } ``` ------------------------------------------------------------------------------------------------------- ### Valid VPA (Third party validation) ```php $api->payment->validateVpa(array('vpa'=>'gauravkumar@exampleupi')); ``` **Parameters:** | Name | Type | Description | |-------------|---------|--------------------------------------| | vpa* | string | The virtual payment address (VPA) you want to validate. For example, `gauravkumar@exampleupi` | please refer this [doc](https://razorpay.com/docs/payments/third-party-validation/s2s-integration/upi/collect#step-13-validate-the-vpa) for params **Response:** <br> ```json { "vpa": "gauravkumar@exampleupi", "success": true, "customer_name": "Gaurav Kumar" } ``` ------------------------------------------------------------------------------------------------------- ### Fetch payment methods (Third party validation) ```php $api = new Api("key",""); // // Use Only razorpay key $api->payment->fetchPaymentMethods(); ``` **Response:** <br> please refer this [doc](https://razorpay.com/docs/payments/third-party-validation/s2s-integration/methods-api/#fetch-payment-methods) for response ------------------------------------------------------------------------------------------------------- ### OTP Resend ```php $api->payment->fetch($paymentId)->otpResend(); ``` **Parameters:** | Name | Type | Description | |-------------|---------|--------------------------------------| | paymentId* | integer | Unique identifier of the payment | Doc reference [doc](https://razorpay.com/docs/payments/payment-methods/cards/authentication/native-otp/#otp-resend) **Response:** <br> ```json { "next": [ "otp_submit", "otp_resend" ], "razorpay_payment_id": "pay_JWaNvYmrx75sXo" } ``` ------------------------------------------------------------------------------------------------------- ### Fetch a Payment (With Expanded Card Details) ```php $paymentId = "pay_MLzFlOC98cJmHQ"; $api->payment->fetch($paymentId)->expandedDetails(["expand[]"=> "card"]); ``` **Parameters:** | Name | Type | Description | |-------------|---------|--------------------------------------| | paymentId* | integer | Unique identifier of the payment | | expand[] | string | Use to expand the card details when the payment method is `card`. | **Response:** <br> ```json { "id": "pay_H9oR0gLCaVlV6m", "entity": "payment", "amount": 100, "currency": "INR", "status": "failed", "order_id": "order_H9o58N6qmLYQKC", "invoice_id": null, "terminal_id": "term_G5kJnYM9GhhLYT", "international": false, "method": "card", "amount_refunded": 0, "refund_status": null, "captured": false, "description": null, "card_id": "card_H9oR0ocen1cmZq", "card": { "id": "card_H9oR0ocen1cmZq", "entity": "card", "name": "Gaurav", "last4": "1213", "network": "RuPay", "type": "credit", "issuer": "UTIB", "international": false, "emi": false, "sub_type": "business" }, "bank": null, "wallet": null, "vpa": null, "email": "gaurav.kumar@example.com", "contact": "+919000090000", "notes": { "email": "gaurav.kumar@example.com", "phone": "09000090000" }, "fee": null, "tax": null, "error_code": "BAD_REQUEST_ERROR", "error_description": "Card issuer is invalid", "error_source": "customer", "error_step": "payment_authentication", "error_reason": "incorrect_card_details", "acquirer_data": { "auth_code": null, "authentication_reference_number": "100222021120200000000742753928" }, "created_at": 1620807547 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch a Payment (With Expanded Offers Details) ```php $paymentId = "pay_MLzFlOC98cJmHQ"; $api->payment->fetch($paymentId)->expandedDetails(["expand[]"=> "emi"]); ``` **Parameters:** | Name | Type | Description | |-------------|---------|--------------------------------------| | paymentId* | integer | Unique identifier of the payment | | expand[] | string | Use to expand the emi details when the payment method is emi. | **Response:** <br> ```json { "id": "pay_DG4ZdRK8ZnXC3k", "entity": "payment", "amount": 200000, "currency": "INR", "status": "authorized", "order_id": null, "invoice_id": null, "international": false, "method": "emi", "amount_refunded": 0, "refund_status": null, "captured": false, "description": null, "card_id": "card_DG4ZdUO3xABb20", "bank": "ICIC", "wallet": null, "vpa": null, "email": "gaurav@example.com", "contact": "+919972000005", "notes": [], "fee": null, "tax": null, "error_code": null, "error_description": null, "error_source": null, "error_step": null, "error_reason": null, "emi": { "issuer": "ICIC", "rate": 1300, "duration": 6 }, "acquirer_data": { "auth_code": "828553" }, "created_at": 1568026077 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch a Payment (With Expanded UPI Details) ```php $paymentId = "pay_MLzFlOC98cJmHQ"; $api->payment->fetch($paymentId)->expandedDetails(["expand[]"=> "upi"]); ``` **Parameters:** | Name | Type | Description | |-------------|---------|--------------------------------------| | paymentId* | integer | Unique identifier of the payment | | expand[] | string | Use to expand the UPI details when the payment method is upi. | **Response:** <br> ```json { "id": "pay_DG4ZdRK8ZnXC3k", "entity": "payment", "amount": 100, "currency": "INR", "status": "captured", "order_id": "order_GjCr5oKh4AVC51", "invoice_id": null, "international": false, "method": "upi", "amount_refunded": 0, "refund_status": null, "captured": true, "description": "Payment for Adidas shoes", "card_id": null, "bank": null, "wallet": null, "vpa": "gaurav.kumar@upi", "email": "gaurav.kumar@example.com", "contact": "9000090000", "customer_id": "cust_K6fNE0WJZWGqtN", "token_id": "token_KOdY$DBYQOv08n", "notes": [], "fee": 1, "tax": 0, "error_code": null, "error_description": null, "error_source": null, "error_step": null, "error_reason": null, "acquirer_data": { "rrn": "303107535132" }, "created_at": 1605871409, "upi": { "payer_account_type": "credit_card", "vpa": "gaurav.kumar@upi", "flow": "in_app" // appears only for Turbo UPI Payments. } } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/payments/)** razorpay/documents/emandate.md 0000644 00000037165 15002216177 0012531 0 ustar 00 ## Emandates ### Create customer ```php $api->customer->create(array('name' => 'Razorpay User', 'email' => 'customer@razorpay.com','contact'=>'9123456780', 'fail_existing'=> '0', 'notes'=> array('notes_key_1'=> 'Tea, Earl Grey, Hot','notes_key_2'=> 'Tea, Earl Grey… decaf'))); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | name* | string | Name of the customer | | email | string | Email of the customer | | fail_existing | string | If a customer with the same details already exists, the request throws an exception by default. Possible value is `0` or `1`| | contact | string | Contact number of the customer | | notes | array | A key-value pair | **Response:** ```json { "id": "cust_1Aa00000000003", "entity": "customer", "name": "Gaurav Kumar", "email": "Gaurav.Kumar@example.com", "contact": "9000000000", "gstin": null, "notes": { "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey… decaf." }, "created_at": 1582033731 } ``` ------------------------------------------------------------------------------------------------------- ### Create order ```php $api->order->create(array('amount' => 0,'currency' => 'INR','method' => 'emandate','payment_capture' => true, 'customer_id' => 'cust_JdumbHq5F3kKu6','receipt' => 'Receipt No. #19','notes' => array('notes_key_1' => 'Beam me up Scotty','notes_key_2' => 'Engage'),'token' => array('auth_type' => 'netbanking','max_amount' => 9999900,'expire_at' => 4102444799,'notes' => array('notes_key_1' => 'Tea, Earl Grey, Hot','notes_key_2' => 'Tea, Earl Grey… decaf.'),'bank_account' => array('beneficiary_name' => 'Gaurav Kumar','account_number' => '1121431121541121','account_type' => 'savings','ifsc_code' => 'HDFC0000001')))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | amount* | integer | The amount to be captured (should be equal to the authorized amount, in paise) | | currency* | string | The currency of the payment (defaults to INR) | | customerId* | string | The id of the customer to be fetched | | method* | string | Payment method used to make the registration transaction. Possible value is `emandate`. | | receipt | string | Your system order reference id. | | payment_capture* | boolean | Indicates whether payment status should be changed to captured automatically or not. Possible values: true - Payments are captured automatically. false - Payments are not captured automatically. | | token | array | All parameters listed [here](https://razorpay.com/docs/api/payments/recurring-payments/emandate/create-authorization-transaction/#112-create-an-order) are supported| | notes | object | A key-value pair | **Response:** Create order response please click [here](https://razorpay.com/docs/api/recurring-payments/emandate/authorization-transaction/#112-create-an-order) ------------------------------------------------------------------------------------------------------- ### Create an Authorization Payment Please refer this [doc](https://razorpay.com/docs/api/recurring-payments/emandate/authorization-transaction/#113-create-an-authorization-payment) for authorization payment ------------------------------------------------------------------------------------------------------- ### Create registration link ```php $api->subscription->createSubscriptionRegistration(array('customer'=>array('name'=>'Gaurav Kumar','email'=>'gaurav.kumar@example.com','contact'=>'9123456780'),'type'=>'link','amount'=>0,'currency'=>'INR','description'=>'Registration Link for Gaurav Kumar','subscription_registration'=>array('method'=>'emandate', 'auth_type'=>'netbanking', 'max_amount'=>'500', 'bank_account' => array('beneficiary_name' => 'Gaurav Kumar','account_number' => '1121431121541121','account_type' => 'savings','ifsc_code' => 'HDFC0001233'), 'expire_at'=>'1634215992'),'receipt'=>'Receipt No. 5','email_notify'=>1,'sms_notify'=>1,'expire_by'=>1634215992,'notes' => array('note_key 1' => 'Beam me up Scotty','note_key 2' => 'Tea. Earl Gray. Hot.'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | customer* | array | All parameters listed [here](https://razorpay.com/docs/api/payments/recurring-payments/emandate/create-authorization-transaction/#121-create-a-registration-link) are supported | | type* | string | In this case, the value is `link`. | | currency* | string | The 3-letter ISO currency code for the payment. Currently, only `INR` is supported. | | amount* | integer | The payment amount in the smallest currency sub-unit. | | description* | string | A description that appears on the hosted page. For example, `12:30 p.m. Thali meals (Gaurav Kumar`). | | subscription_registration | array | All parameters listed [here](https://razorpay.com/docs/api/payments/recurring-payments/emandate/create-authorization-transaction/#121-create-a-registration-link) are supported | | email_notify | boolean | Email notifications are to be sent by Razorpay (default : 1) | | expire_by | integer | The timestamp, in Unix format, till when the customer can make the authorization payment. | | receipt | string | Your system order reference id. | | notes | array | A key-value pair | **Response:** Create registration link response please click [here](https://razorpay.com/docs/api/payments/recurring-payments/emandate/create-authorization-transaction/#121-create-a-registration-link) ------------------------------------------------------------------------------------------------------- ### Send/Resend notifications ```php $api->invoice->fetch($invoiceId)->notifyBy($medium); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | invoiceId* | string | The id of the invoice to be notified | | medium* | string | `sms`/`email`, Medium through which notification should be sent. | **Response:** ```json { "success": true } ``` ------------------------------------------------------------------------------------------------------- ### Cancel a registration link ```php $api->invoice->fetch($invoiceId)->cancel(); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | invoiceId* | string | The id of the invoice to be cancelled | **Response:** ```json { "id": "inv_FHrfRupD2ouKIt", "entity": "invoice", "receipt": "Receipt No. 1", "invoice_number": "Receipt No. 1", "customer_id": "cust_BMB3EwbqnqZ2EI", "customer_details": { "id": "cust_BMB3EwbqnqZ2EI", "name": "Gaurav Kumar", "email": "gaurav.kumar@example.com", "contact": "9123456780", "gstin": null, "billing_address": null, "shipping_address": null, "customer_name": "Gaurav Kumar", "customer_email": "gaurav.kumar@example.com", "customer_contact": "9123456780" }, "order_id": "order_FHrfRw4TZU5Q2L", "line_items": [], "payment_id": null, "status": "cancelled", "expire_by": 4102444799, "issued_at": 1595491479, "paid_at": null, "cancelled_at": 1595491488, "expired_at": null, "sms_status": "sent", "email_status": "sent", "date": 1595491479, "terms": null, "partial_payment": false, "gross_amount": 100, "tax_amount": 0, "taxable_amount": 0, "amount": 100, "amount_paid": 0, "amount_due": 100, "currency": "INR", "currency_symbol": "₹", "description": "Registration Link for Gaurav Kumar", "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "comment": null, "short_url": "https://rzp.io/i/QlfexTj", "view_less": true, "billing_start": null, "billing_end": null, "type": "link", "group_taxes_discounts": false, "created_at": 1595491480, "idempotency_key": null } ``` ------------------------------------------------------------------------------------------------------- ### Fetch token by payment ID ```php $api->payment->fetch($paymentId); ``` **Parameters:** | Name | Type | Description | |------------|--------|-----------------------------------| | paymentId* | string | Id of the payment to be retrieved | **Response:** ```json { "id": "pay_FHf9a7AO0iXM9I", "entity": "payment", "amount": 0, "currency": "INR", "status": "captured", "order_id": "order_FHf9OwSeyetnKC", "invoice_id": "inv_FHf9P2hhXEti7i", "international": false, "method": "emandate", "amount_refunded": 0, "refund_status": null, "captured": true, "description": null, "card_id": null, "bank": "HDFC", "wallet": null, "vpa": null, "email": "gaurav.kumar@example.com", "contact": "+919876543210", "customer_id": "cust_DtHaBuooGHTuyZ", "token_id": "token_FHf9aAZR9hWJkq", "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "fee": 0, "tax": 0, "error_code": null, "error_description": null, "error_source": null, "error_step": null, "error_reason": null, "acquirer_data": {}, "created_at": 1595447410 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch tokens by customer ID ```php $api->customer->fetch($customerId)->tokens()->all(); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | customerId* | string | The id of the customer to be fetched | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "token_FHf94Uym9tdYFJ", "entity": "token", "token": "2wDPM7VAlXtjAR", "bank": "HDFC", "wallet": null, "method": "emandate", "vpa": null, "recurring": true, "recurring_details": { "status": "confirmed", "failure_reason": null }, "auth_type": "netbanking", "mrn": null, "used_at": 1595447381, "created_at": 1595447381, "bank_details": { "beneficiary_name": "Gaurav Kumar", "account_number": "1121431121541121", "ifsc": "HDFC0000001", "account_type": "savings" }, "max_amount": 9999900, "expired_at": 1689971140, "dcc_enabled": false } ] } ``` ------------------------------------------------------------------------------------------------------- ### Delete token ```php $api->customer->fetch($customerId)->tokens()->delete($tokenId); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | customerId* | string | The id of the customer to be fetched | | tokenId* | string | The id of the token to be fetched | **Response:** ```json { "deleted": true } ``` ------------------------------------------------------------------------------------------------------- ### Create an order to charge the customer ```php $api->order->create(array('amount' => 1000,'currency' => 'INR','payment_capture' => true,'receipt' => 'Receipt No. 1','notes'=> array('notes_key_1' => 'Tea, Earl Grey, Hot', 'notes_key_2' => 'Tea, Earl Grey… decaf.'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | amount* | integer | Amount of the order to be paid | | currency* | string | Currency of the order. Currently only `INR` is supported. | | receipt | string | Your system order reference id. | | notes | array | A key-value pair | | payment_capture | boolean | Indicates whether payment status should be changed to captured automatically or not. Possible values: true - Payments are captured automatically. false - Payments are not captured automatically. | **Response:** ```json { "id":"order_1Aa00000000002", "entity":"order", "amount":1000, "amount_paid":0, "amount_due":1000, "currency":"INR", "receipt":"Receipt No. 1", "offer_id":null, "status":"created", "attempts":0, "notes":{ "notes_key_1":"Tea, Earl Grey, Hot", "notes_key_2":"Tea, Earl Grey… decaf." }, "created_at":1579782776 } ``` ------------------------------------------------------------------------------------------------------- ### Create a Recurring Payment ```php $api->payment->createRecurring(array('email'=>'gaurav.kumar@example.com','contact'=>'9123456789','amount'=>100,'currency'=>'INR','order_id'=>'order_1Aa00000000002','customer_id'=>'cust_1Aa00000000001','token'=>'token_1Aa00000000001','recurring'=>'1','description'=>'Creating recurring payment for Gaurav Kumar')); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | email* | string | The customer's email address. | | contact* | string | The customer's phone number. | | amount* | integer | The amount you want to charge your customer. This should be the same as the amount in the order. | | currency* | string | The 3-letter ISO currency code for the payment. Currently, only `INR` is supported. | | order_id* | string | The unique identifier of the order created. | | customer_id* | string | The `customer_id` for the customer you want to charge. | | token* | string | The `token_id` generated when the customer successfully completes the authorization payment. Different payment instruments for the same customer have different `token_id`.| | recurring* | string | Determines if recurring payment is enabled or not. Possible values:<br>* `1` - Recurring is enabled.* `0` - Recurring is not enabled.| | description | string | A user-entered description for the payment.| | notes | array | Key-value pair that can be used to store additional information about the entity. Maximum 15 key-value pairs, 256 characters (maximum) each. | **Response:** ```json { "razorpay_payment_id" : "pay_1Aa00000000001", "razorpay_order_id" : "order_1Aa00000000001", "razorpay_signature" : "9ef4dffbfd84f1318f6739a3ce19f9d85851857ae648f114332d8401e0949a3d" } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/recurring-payments/emandate/authorization-transaction/)** razorpay/documents/registernach.md 0000644 00000045766 15002216177 0013437 0 ustar 00 ## Register nach and charge first payment together ### Create customer ```php $api->customer->create(array('name' => 'Razorpay User', 'email' => 'customer@razorpay.com','contact'=>'9123456780', 'fail_existing'=> '0', 'notes'=> array('notes_key_1'=> 'Tea, Earl Grey, Hot','notes_key_2'=> 'Tea, Earl Grey… decaf'))); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | name* | string | Name of the customer | | email | string | Email of the customer | | contact | string | Contact number of the customer | | fail_existing | string | If a customer with the same details already exists, the request throws an exception by default. Possible value is `0` or `1`| | notes | array | A key-value pair | **Response:** ```json { "id": "cust_1Aa00000000003", "entity": "customer", "name": "Gaurav Kumar", "email": "Gaurav.Kumar@example.com", "contact": "9000000000", "gstin": null, "notes": { "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey… decaf." }, "created_at": 1582033731 } ``` ------------------------------------------------------------------------------------------------------- ### Create Order ```php $api->order->create(array('amount' => 0, 'currency' => 'INR', 'method'=>'nach', 'customer_id'=>$customerId, 'receipt'=>'Receipt No. 5', 'notes'=> array('note_key 1'=> 'Beam me up Scotty','note_key 2'=> 'Tea. Earl Gray. Hot.'), 'token'=>array('first_payment_amount'=>10000, 'auth_type'=>'physical' ,'max_amount'=>'50000','expire_at'=>'1634215992', 'notes'=>array('note_key 1'=> 'Tea, Earl Grey… decaf.','note_key 2'=> 'Tea. Earl Gray. Hot.'), 'bank_account'=>array('beneficiary_name'=>'Gaurav Kumar', 'account_number'=>'11214311215411', 'account_type'=>'savings', 'ifsc_code'=>'HDFC0001233'), 'nach'=> array('form_reference1'=> 'Recurring Payment for Gaurav Kumar','form_reference2'=> 'Method Paper NACH', 'description'=>'Paper NACH Gaurav Kumar')))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | amount* | integer | The amount to be captured (should be equal to the authorized amount, in paise) | | currency* | string | The currency of the payment (defaults to INR) | | customerId* | string | The id of the customer to be fetched | | method* | string | Payment method used to make the registration transaction. Possible value is `nach`. | | token | array | All parameters listed [here](https://razorpay.com/docs/api/payments/recurring-payments/paper-nach/auto-debit/#112-create-an-order) are supported | | notes | array | A key-value pair | **Response:** ```json { "id":"order_1Aa00000000001", "entity":"order", "amount":0, "amount_paid":0, "amount_due":0, "currency":"INR", "receipt":"rcptid #10", "offer_id":null, "offers":{ "entity":"collection", "count":0, "items":[] }, "status":"created", "attempts":0, "notes": { "notes_key_1": "Beam me up Scotty", "notes_key_2": "Engage" }, "created_at":1579775420, "token":{ "method":"nach", "notes": { "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey… decaf." }, "recurring_status":null, "failure_reason":null, "currency":"INR", "max_amount":10000000, "auth_type":"physical", "expire_at":1580480689, "nach":{ "create_form":true, "form_reference1":"Recurring Payment for Gaurav Kumar", "form_reference2":"Method Paper NACH", "prefilled_form":"https://rzp.io/i/bitw", "upload_form_url":"https://rzp.io/i/gts", "description":"Paper NACH Gaurav Kumar" }, "bank_account":{ "ifsc":"HDFC0000001", "bank_name":"HDFC Bank", "name":"Gaurav Kumar", "account_number":"11214311215411", "account_type":"savings", "beneficiary_email":"gaurav.kumar@example.com", "beneficiary_mobile":"9876543210" }, "first_payment_amount":10000 } } ``` ------------------------------------------------------------------------------------------------------- ### Create an Authorization Payment Please refer this [doc](https://razorpay.com/docs/api/recurring-payments/paper-nach/auto-debit/#113-create-an-authorization-payment) for authorization payment ----------------------------------------------------------------------------------------------------- ### Create registration link ```php $api->subscription->createSubscriptionRegistration(array('customer'=>array('name'=>'Gaurav Kumar','email'=>'gaurav.kumar@example.com','contact'=>'9123456780'),'amount'=>0, 'type'=>'link','currency'=>'INR','description'=>'Registration Link for Gaurav Kumar','subscription_registration'=>array('method'=>'nach', 'auth_type'=>'physical' ,'max_amount'=>'50000','expire_at'=>'1634215992','bank_account'=>array('beneficiary_name'=>'Gaurav Kumar', 'account_number'=>'11214311215411', 'account_type'=>'savings', 'ifsc_code'=>'HDFC0001233'), 'nach'=> array('form_reference1'=> 'Recurring Payment for Gaurav Kumar','form_reference2'=> 'Method Paper NACH')),'receipt'=>'Receipt No. 5','email_notify'=>1,'sms_notify'=>1,'expire_by'=>1634215992, 'notes'=> array('note_key 1'=> 'Beam me up Scotty','note_key 2'=> 'Tea. Earl Gray. Hot.'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|---------------------------------------------------------------| | customer | array | All parameters listed [here](https://razorpay.com/docs/api/payments/recurring-payments/paper-nach/auto-debit/#121-create-a-registration-link) are supported | | type* | array | the value is `link`. | | amount* | integer | The amount to be captured (should be equal to the authorized amount, in paise) | | currency* | string | The currency of the payment (defaults to INR) | | description* | string | A brief description of the payment. | | subscription_registration | array | All parameters listed [here](https://razorpay.com/docs/api/payments/recurring-payments/paper-nach/auto-debit/#121-create-a-registration-link) are supported | | receipt | string | Your system order reference id. | | sms_notify | boolean | SMS notifications are to be sent by Razorpay (default : 1) | | email_notify | boolean | Email notifications are to be sent by Razorpay (default : 1) | | expire_by | integer | The timestamp, in Unix format, till when the customer can make the authorization payment. | | notes | array | A key-value pair | **Response:** ```json { "id": "inv_FHrZiAubEzDdaq", "entity": "invoice", "receipt": "Receipt No. 27", "invoice_number": "Receipt No. 27", "customer_id": "cust_BMB3EwbqnqZ2EI", "customer_details": { "id": "cust_BMB3EwbqnqZ2EI", "name": "Gaurav Kumar", "email": "gaurav.kumar@example.com", "contact": "9123456780", "gstin": null, "billing_address": null, "shipping_address": null, "customer_name": "Gaurav Kumar", "customer_email": "gaurav.kumar@example.com", "customer_contact": "9123456780" }, "order_id": "order_FHrZiBOkWHZPOp", "line_items": [], "payment_id": null, "status": "issued", "expire_by": 1647483647, "issued_at": 1595491154, "paid_at": null, "cancelled_at": null, "expired_at": null, "sms_status": "sent", "email_status": "sent", "date": 1595491154, "terms": null, "partial_payment": false, "gross_amount": 0, "tax_amount": 0, "taxable_amount": 0, "amount": 0, "amount_paid": 0, "amount_due": 0, "currency": "INR", "currency_symbol": "₹", "description": "12 p.m. Meals", "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "comment": null, "short_url": "https://rzp.io/i/bzDYbNg", "view_less": true, "billing_start": null, "billing_end": null, "type": "link", "group_taxes_discounts": false, "created_at": 1595491154, "idempotency_key": null, "token": { "method": "nach", "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "recurring_status": null, "failure_reason": null, "currency": "INR", "max_amount": 50000, "auth_type": "physical", "expire_at": 1947483647, "nach": { "create_form": true, "form_reference1": "Recurring Payment for Gaurav Kumar", "form_reference2": "Method Paper NACH", "prefilled_form": "https://rzp.io/i/exdIzYN", "upload_form_url": "https://rzp.io/i/bzDYbNg", "description": "12 p.m. Meals" }, "bank_account": { "ifsc": "HDFC0001233", "bank_name": "HDFC Bank", "name": "Gaurav Kumar", "account_number": "11214311215411", "account_type": "savings", "beneficiary_email": "gaurav.kumar@example.com", "beneficiary_mobile": "9123456780" }, "first_payment_amount": 0 }, "nach_form_url": "https://rzp.io/i/exdIzYN" } ``` ------------------------------------------------------------------------------------------------------- ## Create an order to charge the customer ```php $api->order->create(array('amount' => '100', 'currency' => 'INR', 'payment_capture' => true, 'receipt' => 'Receipt No. 1', 'notes'=> array('key1'=> 'value3','key2'=> 'value2'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | amount* | integer | The amount to be captured (should be equal to the authorized amount, in paise) | | currency* | string | The currency of the payment (defaults to INR) | | receipt | string | Your system order reference id. | | payment_capture | boolean | Indicates whether payment status should be changed to captured automatically or not. Possible values: true - Payments are captured automatically. false - Payments are not captured automatically. | | notes | array | A key-value pair | **Response:** ```json { "id":"order_1Aa00000000002", "entity":"order", "amount":1000, "amount_paid":0, "amount_due":1000, "currency":"INR", "receipt":"Receipt No. 1", "offer_id":null, "status":"created", "attempts":0, "notes":{ "notes_key_1":"Tea, Earl Grey, Hot", "notes_key_2":"Tea, Earl Grey… decaf." }, "created_at":1579782776 } ``` ------------------------------------------------------------------------------------------------------- ## Create a recurring payment ```php $api->payment->createRecurring(['email'=>'gaurav.kumar@example.com','contact'=>'9123456789','amount'=>1000,'currency'=>'INR','order_id'=>$orderid,'customer_id'=>$customerId,'token'=>$tokenId,'recurring'=>'1','description'=>'Creating recurring payment for Gaurav Kumar', 'notes'=> array('key1'=> 'value3','key2'=> 'value2')); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | email* | string | The customer's email address | | contact* | string | The customer's phone number | | amount* | integer | The amount to be captured (should be equal to the authorized amount, in paise) | | currency* | string | The currency of the payment (defaults to INR) | | orderId* | string | The id of the order to be fetched | | customerId* | string | The id of the customer to be fetched | | tokenId* | string | The id of the token to be fetched | | recurring* | boolean | Possible values is `0` or `1` | | description | string | A brief description of the payment. | | notes | array | A key-value pair | **Response:** ```json { "razorpay_payment_id" : "pay_1Aa00000000001", "razorpay_order_id" : "order_1Aa00000000001", "razorpay_signature" : "9ef4dffbfd84f1318f6739a3ce19f9d85851857ae648f114332d8401e0949a3d" } ``` ------------------------------------------------------------------------------------------------------- ## Send/Resend notifications ```php $api->invoice->fetch($invoiceId)->notifyBy($medium); ``` **Parameters:** | Name | Type |Description | |-----------------|---------|------------------------------------------------------------------------------| | invoiceId* | string | The id of the invoice to be fetched | | medium* | string | Possible values are `sms` or `email` | **Response:** ```json { "success": true } ``` ------------------------------------------------------------------------------------------------------- ## Cancel registration link ```php $api->invoice->fetch($invoiceId)->cancel(); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | invoiceId* | string | The id of the invoice to be fetched | **Response:** ```json { "id": "inv_FHrZiAubEzDdaq", "entity": "invoice", "receipt": "Receipt No. 27", "invoice_number": "Receipt No. 27", "customer_id": "cust_BMB3EwbqnqZ2EI", "customer_details": { "id": "cust_BMB3EwbqnqZ2EI", "name": "Gaurav Kumar", "email": "gaurav.kumar@example.com", "contact": "9123456780", "gstin": null, "billing_address": null, "shipping_address": null, "customer_name": "Gaurav Kumar", "customer_email": "gaurav.kumar@example.com", "customer_contact": "9123456780" }, "order_id": "order_FHrZiBOkWHZPOp", "line_items": [], "payment_id": null, "status": "cancelled", "expire_by": 1647483647, "issued_at": 1595491154, "paid_at": null, "cancelled_at": 1595491339, "expired_at": null, "sms_status": "sent", "email_status": "sent", "date": 1595491154, "terms": null, "partial_payment": false, "gross_amount": 0, "tax_amount": 0, "taxable_amount": 0, "amount": 0, "amount_paid": 0, "amount_due": 0, "currency": "INR", "currency_symbol": "₹", "description": "12 p.m. Meals", "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "comment": null, "short_url": "https://rzp.io/i/bzDYbNg", "view_less": true, "billing_start": null, "billing_end": null, "type": "link", "group_taxes_discounts": false, "created_at": 1595491154, "idempotency_key": null, "token": { "method": "nach", "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "recurring_status": null, "failure_reason": null, "currency": "INR", "max_amount": 50000, "auth_type": "physical", "expire_at": 1947483647, "nach": { "create_form": true, "form_reference1": "Recurring Payment for Gaurav Kumar", "form_reference2": "Method Paper NACH", "prefilled_form": "https://rzp.io/i/tSYd5aV", "upload_form_url": "https://rzp.io/i/bzDYbNg", "description": "12 p.m. Meals" }, "bank_account": { "ifsc": "HDFC0001233", "bank_name": "HDFC Bank", "name": "Gaurav Kumar", "account_number": "11214311215411", "account_type": "savings", "beneficiary_email": "gaurav.kumar@example.com", "beneficiary_mobile": "9123456780" }, "first_payment_amount": 0 }, "nach_form_url": "https://rzp.io/i/tSYd5aV" } ``` ------------------------------------------------------------------------------------------------------- ## Fetch token by payment id ```php $api->payment->fetch($paymentId); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | paymentId* | string | The id of the payment to be fetched | **Response:** ```json { "id": "pay_EnLNTjINiPkMEZ", "entity": "payment", "amount": 0, "currency": "INR", "status": "captured", "order_id": "order_EnLLfglmKksr4K", "invoice_id": "inv_EnLLfgCzRfcMuh", "international": false, "method": "nach", "amount_refunded": 0, "refund_status": null, "captured": true, "description": "Invoice #inv_EnLLfgCzRfcMuh", "card_id": null, "bank": "UTIB", "wallet": null, "vpa": null, "email": "gaurav.kumar@example.com", "contact": "+919876543210", "customer_id": "cust_DtHaBuooGHTuyZ", "token_id": "token_EnLNTnn7uyRg5V", "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "fee": 0, "tax": 0, "error_code": null, "error_description": null, "error_source": null, "error_step": null, "error_reason": null, "acquirer_data": {}, "created_at": 1588827564 } ``` ------------------------------------------------------------------------------------------------------- ## Fetch tokens by customer id ```php $api->customer->fetch($customerId)->tokens()->all(); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | customerId* | string | The id of the customer to be fetched | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "token_EhYgIE3pOyMQpD", "entity": "token", "token": "3mQ5Czc6APNppI", "bank": "HDFC", "wallet": null, "method": "nach", "vpa": null, "recurring": true, "recurring_details": { "status": "confirmed", "failure_reason": null }, "auth_type": "physical", "mrn": null, "used_at": 1587564373, "created_at": 1587564373, "dcc_enabled": false } ] } ``` ------------------------------------------------------------------------------------------------------- ## Delete tokens ```php $api->customer->fetch($customerId)->tokens()->delete($tokenId); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | customerId* | string | The id of the customer to be fetched | | tokenId* | string | The id of the token to be fetched | **Response:** ```json { "deleted": true } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/recurring-payments/paper-nach/auto-debit/)** razorpay/documents/virtualaccount.md 0000644 00000037272 15002216177 0014015 0 ustar 00 ## Virtual account ### Create a virtual account ```php $api->virtualAccount->create(array('receivers' => array('types' => array('bank_account')),'description' => 'Virtual Account created for Raftar Soft','customer_id' => 'cust_CaVDm8eDRSXYME','close_by' => 1681615838,'notes' => array('project_name' => 'Banking Software'))); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | receivers* | array | Array that defines what receivers are available for this Virtual Account | | description | string | A brief description of the virtual account. | | customer_id | string | Unique identifier of the customer to whom the virtual account must be tagged. | | close_by | integer | UNIX timestamp at which the virtual account is scheduled to be automatically closed. | | notes | integer | Any custom notes you might want to add to the virtual account can be entered here. | **Response:** ```json { "id":"va_DlGmm7jInLudH9", "name":"Acme Corp", "entity":"virtual_account", "status":"active", "description":"Virtual Account created for Raftar Soft", "amount_expected":null, "notes":{ "project_name":"Banking Software" }, "amount_paid":0, "customer_id":"cust_CaVDm8eDRSXYME", "receivers":[ { "id":"ba_DlGmm9mSj8fjRM", "entity":"bank_account", "ifsc":"RATN0VAAPIS", "bank_name": "RBL Bank", "name":"Acme Corp", "notes":[], "account_number":"2223330099089860" } ], "close_by":1681615838, "closed_at":null, "created_at":1574837626 } ``` ------------------------------------------------------------------------------------------------------- ### Create a virtual account with TPV ```php $api->virtualAccount->create(array('receivers' => array('types'=> array('bank_account')),'allowed_payers' => array(array('type'=>'bank_account','bank_account'=>array('ifsc'=>'RATN0VAAPIS','account_number'=>'2223330027558515'))),'description' => 'Virtual Account created for Raftar Soft','customer_id' => 'cust_HssUOFiOd2b1TJ', 'notes' => array('project_name' => 'Banking Software'))); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | receivers* | array | Array that defines what receivers are available for this Virtual Account | | allowed_payers* | array | All parameters listed [here](https://razorpay.com/docs/api/smart-collect-tpv/#create-virtual-account) are supported **Response:** ```json { "id":"va_DlGmm7jInLudH9", "name":"Acme Corp", "entity":"virtual_account", "status":"active", "description":"Virtual Account created for Raftar Soft", "amount_expected":null, "notes":{ "project_name":"Banking Software" }, "amount_paid":0, "customer_id":"cust_CaVDm8eDRSXYME", "receivers":[ { "id":"ba_DlGmm9mSj8fjRM", "entity":"bank_account", "ifsc":"RATN0VAAPIS", "bank_name": "RBL Bank", "name":"Acme Corp", "notes":[], "account_number":"2223330099089860" } ], "allowed_payers": [ { "type": "bank_account", "id":"ba_DlGmm9mSj8fjRM", "bank_account": { "ifsc": "UTIB0000013", "account_number": "914010012345679" } }, { "type": "bank_account", "id":"ba_Cmtnm5tSj6agUW", "bank_account": { "ifsc": "UTIB0000014", "account_number": "914010012345680" } } ], "close_by":1681615838, "closed_at":null, "created_at":1574837626 } ``` ------------------------------------------------------------------------------------------------------- ### Create static/dynamic qr ```php $api->virtualAccount->create(array('receivers' => array('types' => array('qr_code')), 'description' => 'First QR code','customer_id'=> 'cust_IOyIY3JvbVny9o', 'amount_expected' => 100, 'notes' => array('receiver_key' => 'receiver_value'))); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | receivers* | array | Array that defines what receivers are available for this Virtual Account | | description | string | A brief description of the payment. | | amount_expected | integer | The maximum amount you expect to receive in this virtual account. Pass `69999` for ₹699.99. | | customer_id | string | Unique identifier of the customer to whom the virtual account must be tagged. | | notes | object | All keys listed [here](https://razorpay.com/docs/payments/payments/payment-methods/bharatqr/api/#create) are supported | **Response:** ```json { "id": "va_4xbQrmEoA5WJ0G", "name": "Acme Corp", "entity": "virtual_account", "status": "active", "description": "First Payment by BharatQR", "amount_expected": null, "notes": { "reference_key": "reference_value" }, "amount_paid": 0, "customer_id": "cust_805c8oBQdBGPwS", "receivers": [ { "id": "qr_4lsdkfldlteskf", "entity": "qr_code", "reference": "AgdeP8aBgZGckl", "short_url": "https://rzp.io/i/PLs03pOc" } ], "close_by": null, "closed_at": null, "created_at": 1607938184 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch virtual account by id ```php $api->virtualAccount->fetch($virtualId); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | virtualId* | string | The id of the virtual to be updated | **Response:** ```json { "id": "va_JccTXwXA6UG4Gi", "name": "ankit", "entity": "virtual_account", "status": "active", "description": null, "amount_expected": null, "notes": [], "amount_paid": 0, "customer_id": null, "receivers": [ { "id": "ba_JccTY5ZkO3ZGHQ", "entity": "bank_account", "ifsc": "RAZR0000001", "bank_name": null, "name": "ankit", "notes": [], "account_number": "1112220057339365" } ], "close_by": null, "closed_at": null, "created_at": 1654171468 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch all virtual account ```php $api->virtualAccount->all($options); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | from | timestamp | timestamp after which the payments were created | | to | timestamp | timestamp before which the payments were created | | count | integer | number of virtual accounts to fetch (default: 10) | | skip | integer | number of virtual accounts to be skipped (default: 0) | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "va_Di5gbNptcWV8fQ", "name": "Acme Corp", "entity": "virtual_account", "status": "closed", "description": "Virtual Account created for M/S ABC Exports", "amount_expected": 2300, "notes": { "material": "teakwood" }, "amount_paid": 239000, "customer_id": "cust_DOMUFFiGdCaCUJ", "receivers": [ { "id": "ba_Di5gbQsGn0QSz3", "entity": "bank_account", "ifsc": "RATN0VAAPIS", "bank_name": "RBL Bank", "name": "Acme Corp", "notes": [], "account_number": "1112220061746877" } ], "close_by": 1574427237, "closed_at": 1574164078, "created_at": 1574143517 } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch payments for a virtual account ```php $api->virtualAccount->fetch($virtualId)->payments($options); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | virtualId* | string | The id of the virtual to be updated | | from | timestamp | timestamp after which the payments were created | | to | timestamp | timestamp before which the payments were created | | count | integer | number of virtual accounts to fetch (default: 10) | | skip | integer | number of virtual accounts to be skipped (default: 0) | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "pay_Di5iqCqA1WEHq6", "entity": "payment", "amount": 239000, "currency": "INR", "status": "captured", "order_id": null, "invoice_id": null, "international": false, "method": "bank_transfer", "amount_refunded": 0, "refund_status": null, "captured": true, "description": "", "card_id": null, "bank": null, "wallet": null, "vpa": null, "email": "saurav.kumar@example.com", "contact": "+919972139994", "customer_id": "cust_DOMUFFiGdCaCUJ", "notes": [], "fee": 2820, "tax": 430, "error_code": null, "error_description": null, "created_at": 1574143644 } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch payment details using id and transfer method ```php $api->payment->fetch($paymentId)->bankTransfer(); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | paymentId* | string | The id of the payment to be updated | **Response:** ```json { "id": "bt_Di5iqCElVyRlCb", "entity": "bank_transfer", "payment_id": "pay_Di5iqCqA1WEHq6", "mode": "NEFT", "bank_reference": "157414364471", "amount": 239000, "payer_bank_account": { "id": "ba_Di5iqSxtYrTzPU", "entity": "bank_account", "ifsc": "UTIB0003198", "bank_name": "Axis Bank", "name": "Acme Corp", "notes": [], "account_number": "765432123456789" }, "virtual_account_id": "va_Di5gbNptcWV8fQ", "virtual_account": { "id": "va_Di5gbNptcWV8fQ", "name": "Acme Corp", "entity": "virtual_account", "status": "closed", "description": "Virtual Account created for M/S ABC Exports", "amount_expected": 2300, "notes": { "material": "teakwood" }, "amount_paid": 239000, "customer_id": "cust_DOMUFFiGdCaCUJ", "receivers": [ { "id": "ba_Di5gbQsGn0QSz3", "entity": "bank_account", "ifsc": "RATN0VAAPIS", "bank_name": "RBL Bank", "name": "Acme Corp", "notes": [], "account_number": "1112220061746877" } ], "close_by": 1574427237, "closed_at": 1574164078, "created_at": 1574143517 } } ``` ------------------------------------------------------------------------------------------------------- ### Refund payments made to a virtual account ```php $api->payment->fetch($paymentId)->refunds(); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | paymentId* | string | The id of the payment to be updated | **Response:** ```json { "id": "rfnd_FP8QHiV938haTz", "entity": "refund", "amount": 500100, "receipt": "Receipt No. 31", "currency": "INR", "payment_id": "pay_FCXKPFtYfPXJPy", "notes": [] "receipt": null, "acquirer_data": { "arn": null }, "created_at": 1597078866, "batch_id": null, "status": "processed", "speed_processed": "normal", "speed_requested": "normal" } ``` ------------------------------------------------------------------------------------------------------- ### Add receiver to an existing virtual account ```php $api->virtualAccount->fetch($virtualId)->addReceiver(array('types' => array('vpa'),'vpa' => array('descriptor'=>'gauravkumar'))); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | virtualId* | string | The id of the virtual to be updated | | types* | array | The receiver type to be added to the virtual account. Possible values are `vpa` or `bank_account` | | vpa["descriptor"] | string | This is a unique identifier provided by you to identify the customer. For example, `gaurikumar` and `akashkumar` are the descriptors | **Response:** For add receiver to an existing virtual account response please click [here](https://razorpay.com/docs/api/smart-collect/#add-receiver-to-an-existing-virtual-account) ------------------------------------------------------------------------------------------------------- ### Add an Allowed Payer Account ```php $api->virtualAccount->fetch($virtualId)->addAllowedPayer(array('type' => 'bank_account','bank_account' => array('ifsc'=>'UTIB0000013','account_number'=>'914010012345679'))); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | virtualId* | string | The id of the virtual to be updated | | type* | string | Possible value is `bank_account` | | bank_account* | array | Indicates the bank account details such as `ifsc` and `account_number` | **Response:** ```json { "id":"va_DlGmm7jInLudH9", "name":"Acme Corp", "entity":"virtual_account", "status":"active", "description":"Virtual Account created for Raftar Soft", "amount_expected":null, "notes":{ "project_name":"Banking Software" }, "amount_paid":0, "customer_id":"cust_CaVDm8eDRSXYME", "receivers":[ { "id":"ba_DlGmm9mSj8fjRM", "entity":"bank_account", "ifsc":"RATN0VAAPIS", "bank_name": "RBL Bank", "name":"Acme Corp", "notes":[], "account_number":"2223330099089860" } ], "allowed_payers": [ { "type": "bank_account", "id":"ba_DlGmm9mSj8fjRM", "bank_account": { "ifsc": "UTIB0000013", "account_number": "914010012345679" } } ], "close_by":1681615838, "closed_at":null, "created_at":1574837626 } ``` ------------------------------------------------------------------------------------------------------- ### Delete an Allowed Payer Account ```php $api->virtualAccount->fetch($virtualId)->deleteAllowedPayer($allowedPayersId); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | virtualId* | string | The id of the virtual to be updated | | allowedPayersId* | string | The id of the allowed payers to be updated | **Response:** ```json null ``` ------------------------------------------------------------------------------------------------------- ### Close virtual account ```php $api->virtualAccount->fetch($virtualId)->close(); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | virtualId* | string | The id of the virtual to be updated | **Response:** For close virtual account response please click [here](https://razorpay.com/docs/api/smart-collect/#close-a-virtual-account) ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/smart-collect/api/)** razorpay/documents/order.md 0000644 00000033457 15002216177 0012066 0 ustar 00 ## Orders ### Create order ```php $api->order->create(array('receipt' => '123', 'amount' => 100, 'currency' => 'INR', 'notes'=> array('key1'=> 'value3','key2'=> 'value2'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | amount* | integer | Amount of the order to be paid | | currency* | string | Currency of the order. Currently only `INR` is supported. | | receipt | string | Your system order reference id. | | notes | array | A key-value pair | |partial_payment | boolean | Indicates whether customers can make partial payments on the invoice . Possible values: true - Customer can make partial payments. false (default) - Customer cannot make partial payments. | **Response:** ```json { "id": "order_EKwxwAgItmmXdp", "entity": "order", "amount": 50000, "amount_paid": 0, "amount_due": 50000, "currency": "INR", "receipt": "receipt#1", "offer_id": null, "status": "created", "attempts": 0, "notes": [], "created_at": 1582628071 } ``` ------------------------------------------------------------------------------------------------------- ### Create order (Third party validation) ```php $api->order->create(array('amount' => 500, 'receipt' => 'BILL13375649', 'method' => 'netbanking', 'currency' => 'INR', 'bank_account'=> array('account_number'=> '765432123456789','name'=> 'Gaurav Kumar','ifsc'=>'HDFC0000053'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | amount* | integer | Amount of the order to be paid | | method | string | The payment method used to make the payment. If this parameter is not passed, customers will be able to make payments using both netbanking and UPI payment methods. Possible values is `netbanking` or `upi`| | notes | array | A key-value pair | | currency* | string | Currency of the order. Currently only `INR` is supported. | | receipt | string | Your system order reference id. | | notes | array | A key-value pair | |bank_account | array | All keys listed [here](https://razorpay.com/docs/payments/third-party-validation/#step-2-create-an-order) are supported | **Response:** ```json { "id": "order_GAWN9beXgaqRyO", "entity": "order", "amount": 500, "amount_paid": 0, "amount_due": 500, "currency": "INR", "receipt": "BILL13375649", "offer_id": null, "status": "created", "attempts": 0, "notes": [], "created_at": 1573044247 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch all orders ```php $api->order->all($options); ``` **Parameters** | Name | Type | Description | |------------|-----------|--------------------------------------------------------------| | from | timestamp | timestamp after which the orders were created | | to | timestamp | timestamp before which the orders were created | | count | integer | number of orders to fetch (default: 10) | | skip | integer | number of orders to be skipped (default: 0) | | authorized | boolean | Orders for which orders are currently in authorized state. | | receipt | string | Orders with the provided value for receipt. | | expand[] | string | Used to retrieve additional information about the payment. Possible value is `payments`,`payments.card`,`transfers` or `virtual_account` | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "order_EKzX2WiEWbMxmx", "entity": "order", "amount": 1234, "amount_paid": 0, "amount_due": 1234, "currency": "INR", "receipt": "Receipt No. 1", "offer_id": null, "status": "created", "attempts": 0, "notes": [], "created_at": 1582637108 } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch particular order ```php $api->order->fetch($orderId); ``` **Parameters** | Name | Type | Description | |----------|--------|-------------------------------------| | orderId* | string | The id of the order to be fetched | **Response:** ```json { "id": "order_IXnOAMw6SSqKvN", "entity": "order", "amount": 100, "amount_paid": 0, "amount_due": 100, "currency": "INR", "receipt": "Receipt no. 1", "offer_id": null, "status": "created", "attempts": 0, "notes": { "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey… decaf." }, "created_at": 1639581113 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch payments for an order ```php $api->order->fetch($orderId)->payments(); ``` **Parameters** | Name | Type | Description | |----------|--------|-------------------------------------| | orderId* | string | The id of the order to be retrieve payment info | **Response:** ```json { "entity":"collection", "count":1, "items":[ { "id":"pay_DaaSOvhgcOfzgR", "entity":"payment", "amount":2200, "currency":"INR", "status":"captured", "order_id":"order_DaaS6LOUAASb7Y", "invoice_id":null, "international":false, "method":"card", "amount_refunded":0, "refund_status":null, "captured":true, "description":"Beans in every imaginable flavour", "card_id":"card_DZon6fd8J3IcA2", "bank":null, "wallet":null, "vpa":null, "email":"gaurav.kumar@example.com", "contact":"+919999999988", "notes":[], "fee":44, "tax":0, "error_code":null, "error_description":null, "created_at":1572505160 } ] } ``` ------------------------------------------------------------------------------------------------------- ### Update order ```php $api->order->fetch($orderId)->edit(array('notes'=> array('notes_key_1'=>'Beam me up Scotty. 1', 'notes_key_2'=>'Engage'))); ``` **Parameters** | Name | Type | Description | |----------|--------|-------------------------------------| | orderId* | string | The id of the order to be retrieve payment info | | notes* | array | A key-value pair | **Response:** ```json { "id":"order_DaaS6LOUAASb7Y", "entity":"order", "amount":2200, "amount_paid":0, "amount_due":2200, "currency":"INR", "receipt":"Receipt #211", "offer_id":null, "status":"attempted", "attempts":1, "notes":{ "notes_key_1":"Tea, Earl Grey, Hot", "notes_key_2":"Tea, Earl Grey… decaf." }, "created_at":1572505143 } ``` ------------------------------------------------------------------------------------------------------- ### Create an order (Magic checkout) ```php $api->order->create(array( "amount" => 50000, "currency" => "INR", "receipt" => "receipt#21", "notes" => array( "key1" => "value3", "key2" => "value2" ), "rto_review" => true, "line_items" => array(array( "type" => "e-commerce", "sku" => "1g234", "variant_id" => "12r34", "price" => "3900", "offer_price" => "3800", "tax_amount" => 0, "quantity" => 1, "name" => "TEST", "description" => "TEST", "weight" => "1700", "dimensions" => array( "length" => "1700", "width" => "1700", "height" => "1700" ), "image_url" => "https://unsplash.com/s/photos/new-wallpaper", "product_url" => "https://unsplash.com/s/photos/new-wallpaper", "notes" => array())), "line_items_total" => "1200", "shipping_fee" => 100, "cod_fee" => 100, "promotions" => array(array( "reference_id" => 1234, "type" => "coupon", "code" => "HDFC2000", "value" => "200", "value_type" => "fixed_amount", "description" => "200 discount on your order" )), "customer" => array( "name" => "Test Rto Order", "contact" => "+919000090000", "email" => "gaurav.kumar@example.com" ), "device_details" => array( "ip" => "127.0.0.1", "user_agent" => "abc" ), "shipping_details" => array( "shipping_address" => array( "line1" => "1", "line2" => "1", "zipcode" => "305001", "contact" => "+919090909090", "city" => "Ajmer", "state" => "Rajasthan", "country" => "IND", "tag" => "home", "landmark" => "Hathibhata" ) ) ) ); ``` **Parameters** | Name | Type | Description | |----------|--------|-------------------------------------| | amount* | integer | The transaction amount, expressed in the currency subunit, such as paise (in case of INR). | | currency* | string | The currency in which the transaction should be made. default value is `INR`| | receipt | string | Your receipt id for this order should be passed here. Maximum length of 40 characters. | | notes | array | Key-value pair that can be used to store additional information about the entity.| | rto_review | boolean | Identifier to mark the order eligible for RTO risk prediction. Possible values is `0` or `1` | | line_items | array | All keys listed [here](https://betasite.razorpay.com/docs/razorpay/IN/payments-magic-new-rto-intelligence/payments/magic-checkout/rto-intelligence/#11-create-an-order) are supported | | line_items_total | integer | Sum of offer_price for all line items added in the cart in paise. | | shipping_fee | integer | Shipping fee charged on the line items in paisa. | | cod_fee | integer | COD fee charged on the line items in paisa. | | promotions | array | Used to pass all offer or discount related information including coupon code discount, method discount and so on. | | customer | array | All keys listed [here](https://betasite.razorpay.com/docs/razorpay/IN/payments-magic-new-rto-intelligence/payments/magic-checkout/rto-intelligence/#11-create-an-order) are supported | | device_details | array | All keys listed [here](https://betasite.razorpay.com/docs/razorpay/IN/payments-magic-new-rto-intelligence/payments/magic-checkout/rto-intelligence/#11-create-an-order) are supported | | shipping_details | array | All keys listed [here](https://betasite.razorpay.com/docs/razorpay/IN/payments-magic-new-rto-intelligence/payments/magic-checkout/rto-intelligence/#11-create-an-order) are supported | **Response:** ```json { "id": "order_MpyV7eOsTBn24z", "entity": "order", "amount": 50000, "amount_paid": 0, "amount_due": 50000, "currency": "INR", "receipt": "receipt#22", "status": "created", "attempts": 0, "notes": { "key1": "value3", "key2": "value2" }, "created_at": 1697698714 } ``` ------------------------------------------------------------------------------------------------------- ### View RTO/Risk Reasons ```php $orderId = "order_DaaS6LOUAASb7Y"; $api->order->fetch($orderId)->viewRtoReview(); ``` **Parameters** | Name | Type | Description | |----------|--------|-------------------------------------| | orderId* | string | The id of the order to be retrieve payment info | | notes* | array | A key-value pair | **Response:** ```json { "risk_tier": "high", "rto_reasons": [ { "reason": "short_shipping_address", "description": "Short shipping address", "bucket": "address" }, { "reason": "address_pincode_state_mismatch", "description": "Incorrect pincode state entered", "bucket": "address" } ] } ``` ------------------------------------------------------------------------------------------------------- ```php $orderId = "order_DaaS6LOUAASb7Y"; $api->order->fetch($orderId)->editFulfillment(array( 'payment_method' => 'upi', 'shipping' => array( 'waybill' => '123456789', 'status' => 'rto', 'provider' => 'Bluedart' ) ) ); ``` **Parameters** | Name | Type | Description | |----------|--------|-------------------------------------| | payment_method | string | The id of the order to be retrieve payment info | | shipping | array | All keys listed [here](https://betasite.razorpay.com/docs/razorpay/IN/payments-magic-new-rto-intelligence/payments/magic-checkout/rto-intelligence/#13-update-the-fulfillment-details) are supported | **Response:** ```json { "entity": "order.fulfillment", "order_id": "EKwxwAgItXXXX", "payment_method": "upi", "shipping": { "waybill": "123456789", "status": "rto", "provider": "Bluedart" } } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/orders/)** razorpay/documents/paymentLink.md 0000644 00000102655 15002216177 0013243 0 ustar 00 ## Payment Links ### Create payment link Request #1 Standard Payment Link ```php $api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100,'expire_by' => 1691097057, 'reference_id' => 'TS1989', 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'+919999999999'), 'notify'=>array('sms'=>true, 'email'=>true) , 'reminder_enable'=>true ,'notes'=>array('policy_name'=> 'Jeevan Bima'),'callback_url' => 'https://example-callback-url.com/', 'callback_method'=>'get')); ``` Request #2 UPI Payment Link ```php $api->paymentLink->create(array('upi_link'=>true,'amount'=>500, 'currency'=>'INR', 'expire_by' => 1691097057, 'reference_id' => 'TS1989','description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar','email' => 'gaurav.kumar@example.com', 'contact'=>'+919999999999'),'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true ,'notes'=>array('policy_name'=> 'Jeevan Bima'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| |upi_link* | boolean | boolean Must be set to true // to creating UPI Payment Link only | |amount* | integer | Amount to be paid using the Payment Link. | |currency | string | A three-letter ISO code for the currency in which you want to accept the payment. For example, INR. | |accept_partial | boolean | Indicates whether customers can make partial payments using the Payment Link. Possible values: true - Customer can make partial payments. false (default) - Customer cannot make partial payments. // UPI Payment Link is not supported partial payment | |description | string | A brief description of the Payment Link | |first_min_partial_amount | integer |Minimum amount, in currency subunits, that must be paid by the customer as the first partial payment. // UPI Payment Link is not supported partial payment | |reference_id | string | AReference number tagged to a Payment Link. | |customer | array | name, email, contact | |expire_by | integer | Timestamp, in Unix, at which the Payment Link will expire. By default, a Payment Link will be valid for six months from the date of creation. | |notify | object | sms or email (boolean) | |notes | json object | Key-value pair that can be used to store additional information about the entity. Maximum 15 key-value pairs, 256 characters (maximum) each. For example, "note_key": "Beam me up Scotty” | **Response:** For create payment link response please click [here](https://razorpay.com/docs/api/payment-links/#create-payment-link) ------------------------------------------------------------------------------------------------------- ### Fetch all payment link ```php $api->paymentLink->all(); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| |payment_id | string | Unique identifier of the payment associated with the Payment Link. | |reference_id | string | The unique reference number entered by you while creating the Payment Link. | **Response:** For fetch all payment link response please click [here](https://razorpay.com/docs/api/payment-links/#all-payment-links) ------------------------------------------------------------------------------------------------------- ### Fetch specific payment link ```php $api->paymentLink->fetch($paymentLinkId); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | paymentLinkId* | string | Unique identifier of the Payment Link. | **Response:** For fetch specific payment link response please click [here](https://razorpay.com/docs/api/payment-links/#specific-payment-links-by-id) ------------------------------------------------------------------------------------------------------- ### Update payment link ```php $api->paymentLink->fetch($paymentLinkId)->edit(array("reference_id"=>"TS42", "expire_by"=>"1640270451" , "reminder_enable"=>0, "notes"=>["policy_name"=>"Jeevan Saral 2"])); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | paymentLinkId* | string | The unique identifier of the Payment Link that needs to be updated. | | accept_partial | boolean | Indicates whether customers can make partial payments using the Payment Link. Possible values: true - Customer can make partial payments. false (default) - Customer cannot make partial payments. | | reference_id | string | Adds a unique reference number to an existing link. | | expire_by | integer | Timestamp, in Unix format, when the payment links should expire. | | notes | string | object Key-value pair that can be used to store additional information about the entity. Maximum 15 key-value pairs, 256 characters (maximum) each. For example, "note_key": "Beam me up Scotty”. | **Response:** For updating payment link response please click [here](https://razorpay.com/docs/api/payment-links/#update-payment-link) ------------------------------------------------------------------------------------------------------- ### Cancel a payment link ```php $api->paymentLink->fetch($paymentLinkId)->cancel(); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | paymentLinkId* | string | Unique identifier of the Payment Link. | **Response:** For canceling payment link response please click [here](https://razorpay.com/docs/api/payment-links/#cancel-payment-link) ------------------------------------------------------------------------------------------------------- ### Send notification ```php $api->paymentLink->fetch($paymentLinkId)->notifyBy($medium); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | paymentLinkId* | string | Unique identifier of the Payment Link that should be resent. | | medium* | string | `sms`/`email`,Medium through which the Payment Link must be resent. Allowed values are: | **Response:** ```json { "success": true } ``` ------------------------------------------------------------------------------------------------------- ### Transfer payments received using payment links ```php $api->paymentLink->create(array('amount'=>20000, 'currency'=>'INR', 'accept_partial'=>false, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'+919999999999'), 'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('order'=>array('transfers'=>array('account'=>'acc_CPRsN1LkFccllA', 'amount'=>500, 'currency'=>'INR', 'notes'=>array('branch'=>'Acme Corp Bangalore North', 'name'=>'Bhairav Kumar' ,'linked_account_notes'=>array('branch'))), array('account'=>'acc_CNo3jSI8OkFJJJ', 'amount'=>500, 'currency'=>'INR', 'notes'=>array('branch'=>'Acme Corp Bangalore North', 'name'=>'Saurav Kumar' ,'linked_account_notes'=>array('branch'))))))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| |amount* | integer | Amount to be paid using the Payment Link. | |options* | array | Options to configure the transfer in the Payment Link. Parent parameter under which the order child parameter must be passed. | **Response:** ```json { "accept_partial": false, "amount": 1500, "amount_paid": 0, "callback_method": "", "callback_url": "", "cancelled_at": 0, "created_at": 1596526969, "currency": "INR", "customer": { "contact": "+919999999999", "email": "gaurav.kumar@example.com", "name": "Gaurav Kumar" }, "deleted_at": 0, "description": "Payment for policy no #23456", "expire_by": 0, "expired_at": 0, "first_min_partial_amount": 0, "id": "plink_FMbhpT6nqDjDei", "notes": null, "notify": { "email": true, "sms": true }, "payments": null, "reference_id": "#aasasw8", "reminder_enable": true, "reminders": [], "short_url": "https://rzp.io/i/ORor1MT", "source": "", "source_id": "", "status": "created", "updated_at": 1596526969, "user_id": "" } ``` ------------------------------------------------------------------------------------------------------- ### Offers on payment links ```php $api->paymentLink->create(array('amount'=>20000, 'currency'=>'INR', 'accept_partial'=>false, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'+919999999999'), 'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>false , 'options'=>array('order'=>array('offers'=>array('offer_I0PqexIiTmMRnA'))))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| |amount* | integer | Amount to be paid using the Payment Link. | |currency | string | A three-letter ISO code for the currency in which you want to accept the payment. For example, INR. | |description | string | A brief description of the Payment Link | |reference_id | string | AReference number tagged to a Payment Link. | |customer | array | name, email, contact | |expire_by | integer | Timestamp, in Unix, at which the Payment Link will expire. By default, a Payment Link will be valid for six months from the date of creation. | |notify | object | sms or email (boolean) | |options* | array | Options to associate the offer_id with the Payment Link. Parent parameter under which the order child parameter must be passed. | **Response:** ```json { "accept_partial": false, "amount": 3400, "amount_paid": 0, "cancelled_at": 0, "created_at": 1600183040, "currency": "INR", "customer": { "contact": "+919999999999", "email": "gaurav.kumar@example.com", "name": "Gaurav Kumar" }, "description": "Payment for policy no #23456", "expire_by": 0, "expired_at": 0, "first_min_partial_amount": 0, "id": "plink_FdLt0WBldRyE5t", "notes": null, "notify": { "email": true, "sms": true }, "payments": null, "reference_id": "#425", "reminder_enable": false, "reminders": [], "short_url": "https://rzp.io/i/CM5ohDC", "status": "created", "user_id": "" } ``` ------------------------------------------------------------------------------------------------------- ### Managing reminders for payment links ```php $api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'+919999999999'), 'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>false)); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| |amount* | integer | Amount to be paid using the Payment Link. | |accept_partial | boolean | Indicates whether customers can make partial payments using the Payment Link. Possible values:true - Customer can make partial payments.false (default) - Customer cannot make partial payments. | |currency | string | A three-letter ISO code for the currency in which you want to accept the payment. For example, INR. | |description | string | A brief description of the Payment Link | |customer | array | name, email, contact | |expire_by | integer | Timestamp, in Unix, at which the Payment Link will expire. By default, a Payment Link will be valid for six months from the date of creation. | |notify | object | sms or email (boolean) | |reminder_enable | boolean | To disable reminders for a Payment Link, pass reminder_enable as false | **Response:** ```json { "amount": 340000, "amount_due": 340000, "amount_paid": 0, "billing_end": null, "billing_start": null, "cancelled_at": null, "comment": null, "created_at": 1592579126, "currency": "INR", "currency_symbol": "₹", "customer_details": { "billing_address": null, "contact": "9900990099", "customer_contact": "9900990099", "customer_email": "gaurav.kumar@example.com", "customer_name": "Gaurav Kumar", "email": "gaurav.kumar@example.com", "gstin": null, "id": "cust_F4WNtqj1xb0Duv", "name": "Gaurav Kumar", "shipping_address": null }, "customer_id": "cust_F4WNtqj1xb0Duv", "date": 1592579126, "description": "Salon at Home Service", "email_status": null, "entity": "invoice", "expire_by": 1608390326, "expired_at": null, "first_payment_min_amount": 0, "gross_amount": 340000, "group_taxes_discounts": false, "id": "inv_F4WfpZLk1ct35b", "invoice_number": null, "issued_at": 1592579126, "line_items": [], "notes": [], "order_id": "order_F4WfpxUzWmYOTl", "paid_at": null, "partial_payment": false, "payment_id": null, "receipt": "5757", "reminder_enable": false, "short_url": "https://rzp.io/i/vitLptM", "sms_status": null, "status": "issued", "tax_amount": 0, "taxable_amount": 0, "terms": null, "type": "link", "user_id": "", "view_less": true } ``` ------------------------------------------------------------------------------------------------------- ### Rename labels in checkout section ```php $api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'+919999999999'), 'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('checkout'=>array('partial_payment'=>array('min_amount_label'=>'Minimum Money to be paid', 'partial_amount_label'=>'Pay in parts', 'partial_amount_description'=>'Pay at least ₹100', 'full_amount_label'=>'Pay the entire amount'))))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| |amount* | integer | Amount to be paid using the Payment Link. | |accept_partial | boolean | Indicates whether customers can make partial payments using the Payment Link. Possible values:true - Customer can make partial payments.false (default) - Customer cannot make partial payments. | |currency | string | A three-letter ISO code for the currency in which you want to accept the payment. For example, INR. | |description | string | A brief description of the Payment Link | |customer | array | name, email, contact | |expire_by | integer | Timestamp, in Unix, at which the Payment Link will expire. By default, a Payment Link will be valid for six months from the date of creation. | |notify | object | sms or email (boolean) | |reminder_enable | boolean | To disable reminders for a Payment Link, pass reminder_enable as false | |options* | array | Options to rename the labels for partial payment fields in the checkout form. Parent parameter under which the checkout and partial_payment child parameters must be passed. | **Response:** ```json { "accept_partial": true, "amount": 1000, "amount_paid": 0, "callback_method": "", "callback_url": "", "cancelled_at": 0, "created_at": 1596193199, "currency": "INR", "customer": { "contact": "+919999999999", "email": "gaurav.kumar@example.com", "name": "Gaurav Kumar" }, "deleted_at": 0, "description": "Payment for policy no #23456", "expire_by": 0, "expired_at": 0, "first_min_partial_amount": 100, "id": "plink_FL4vbXVKfW7PAz", "notes": null, "notify": { "email": true, "sms": true }, "payments": null, "reference_id": "#42321", "reminder_enable": true, "reminders": [], "short_url": "https://rzp.io/i/F4GC9z1", "source": "", "source_id": "", "status": "created", "updated_at": 1596193199, "user_id": "" } ``` ------------------------------------------------------------------------------------------------------- ### Change Business name ```php $api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'+919999999999'), 'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('checkout'=>array('name'=>'Lacme Corp')))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| |amount* | integer | Amount to be paid using the Payment Link. | |currency | string | A three-letter ISO code for the currency in which you want to accept the payment. For example, INR. | |accept_partial | boolean | Indicates whether customers can make partial payments using the Payment Link. Possible values:true - Customer can make partial payments.false (default) - Customer cannot make partial payments. | |first_min_partial_amount | integer | | |description | string | A brief description of the Payment Link | |customer | array | name, email, contact | |notify | object | sms or email (boolean) | |reminder_enable | boolean | To disable reminders for a Payment Link, pass reminder_enable as false | |options* | array | Option to customize the business name. Parent parameter under which the checkout child parameter must be passed.| **Response:** ```json { "accept_partial": true, "amount": 1000, "amount_paid": 0, "callback_method": "", "callback_url": "", "cancelled_at": 0, "created_at": 1596187657, "currency": "INR", "customer": { "contact": "+919999999999", "email": "gaurav.kumar@example.com", "name": "Gaurav Kumar" }, "description": "Payment for policy no #23456", "expire_by": 0, "expired_at": 0, "first_min_partial_amount": 100, "id": "plink_FL3M2gJFs1Jkma", "notes": null, "notify": { "email": true, "sms": true }, "payments": null, "reference_id": "#2234542", "reminder_enable": true, "reminders": [], "short_url": "https://rzp.io/i/at2OOsR", "source": "", "source_id": "", "status": "created", "updated_at": 1596187657, "user_id": "" } ``` ------------------------------------------------------------------------------------------------------- ### Prefill checkout fields ```php $api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'+919999999999'), 'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('checkout'=>array('prefill'=>array('method'=>'card', 'card[name]'=>'Gaurav Kumar', 'card[number]'=>'4111111111111111', 'card[expiry]'=>'12/21', 'card[cvv]'=>'123'))))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| |amount* | integer | Amount to be paid using the Payment Link. | |currency | string | A three-letter ISO code for the currency in which you want to accept the payment. For example, INR. | |accept_partial | boolean | Indicates whether customers can make partial payments using the Payment Link. Possible values:true - Customer can make partial payments.false (default) - Customer cannot make partial payments. | |first_min_partial_amount | integer | | |description | string | A brief description of the Payment Link | |customer | array | name, email, contact | |notify | object | sms or email (boolean) | |reminder_enable | boolean | To disable reminders for a Payment Link, pass reminder_enable as false | |options* | array | Options to customize Checkout. Parent parameter under which the checkout and prefill child parameters must be passed.| **Response:** For prefill checkout fields response please click [here](https://razorpay.com/docs/payment-links/api/new/advanced-options/customize/prefill/) ------------------------------------------------------------------------------------------------------- ### Customize payment methods ```php $api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'+919999999999'), 'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('checkout'=>array('method'=>array('netbanking'=>'1', 'card'=>'1', 'upi'=>'0', 'wallet'=>'0'))))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| |amount* | integer | Amount to be paid using the Payment Link. | |currency | string | A three-letter ISO code for the currency in which you want to accept the payment. For example, INR. | |accept_partial | boolean | Indicates whether customers can make partial payments using the Payment Link. Possible values:true - Customer can make partial payments.false (default) - Customer cannot make partial payments. | |first_min_partial_amount | integer | | |description | string | A brief description of the Payment Link | |customer | array | name, email, contact | |notify | object | sms or email (boolean) | |reminder_enable | boolean | To disable reminders for a Payment Link, pass reminder_enable as false | |options* | array | Options to display or hide payment methods on the Checkout section. Parent parameter under which the checkout and method child parameters must be passed.| **Response:** ```json { "accept_partial": true, "amount": 1000, "amount_paid": 0, "callback_method": "", "callback_url": "", "cancelled_at": 0, "created_at": 1596188371, "currency": "INR", "customer": { "contact": "+919999999999", "email": "gaurav.kumar@example.com", "name": "Gaurav Kumar" }, "deleted_at": 0, "description": "Payment for policy no #23456", "expire_by": 0, "expired_at": 0, "first_min_partial_amount": 100, "id": "plink_FL3YbdvN2Cj6gh", "notes": null, "notify": { "email": true, "sms": true }, "payments": null, "reference_id": "#543422", "reminder_enable": true, "reminders": [], "short_url": "https://rzp.io/i/wKiXKud", "source": "", "source_id": "", "status": "created", "updated_at": 1596188371, "user_id": "" } ``` ------------------------------------------------------------------------------------------------------- ### Set checkout fields as read-only ```php $api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'+919999999999'), 'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('checkout'=>array('readonly'=>array('email'=>'1','contact'=>'1'))))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| |amount* | integer | Amount to be paid using the Payment Link. | |currency | string | A three-letter ISO code for the currency in which you want to accept the payment. For example, INR. | |accept_partial | boolean | Indicates whether customers can make partial payments using the Payment Link. Possible values:true - Customer can make partial payments.false (default) - Customer cannot make partial payments. | |first_min_partial_amount | integer | | |description | string | A brief description of the Payment Link | |customer | array | name, email, contact | |notify | object | sms or email (boolean) | |reminder_enable | boolean | To disable reminders for a Payment Link, pass reminder_enable as false | |options* | array | Options to set contact and email as read-only fields on Checkout. Parent parameter under which the checkout and readonly child parameters must be passed.| **Response:** ```json { "accept_partial": true, "amount": 1000, "amount_paid": 0, "callback_method": "", "callback_url": "", "cancelled_at": 0, "created_at": 1596190845, "currency": "INR", "customer": { "contact": "+919999999999", "email": "gaurav.kumar@example.com", "name": "Gaurav Kumar" }, "deleted_at": 0, "description": "Payment for policy no #23456", "expire_by": 0, "expired_at": 0, "first_min_partial_amount": 100, "id": "plink_FL4GA1t6FBcaVR", "notes": null, "notify": { "email": true, "sms": true }, "payments": null, "reference_id": "#19129", "reminder_enable": true, "reminders": [], "short_url": "https://rzp.io/i/QVwUglR", "source": "", "source_id": "", "status": "created", "updated_at": 1596190845, "user_id": "" } ``` ------------------------------------------------------------------------------------------------------- ### Implement thematic changes in payment links checkout section ```php $api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'+919999999999'), 'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('checkout'=>array('theme'=>array('hide_topbar'=>'true'))))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| |amount* | integer | Amount to be paid using the Payment Link. | |currency | string | A three-letter ISO code for the currency in which you want to accept the payment. For example, INR. | |accept_partial | boolean | Indicates whether customers can make partial payments using the Payment Link. Possible values:true - Customer can make partial payments.false (default) - Customer cannot make partial payments. | |first_min_partial_amount | integer | | |description | string | A brief description of the Payment Link | |customer | array | name, email, contact | |notify | object | sms or email (boolean) | |reminder_enable | boolean | To disable reminders for a Payment Link, pass reminder_enable as false | |options* | array | Options to show or hide the top bar. Parent parameter under which the checkout and theme child parameters must be passed.| **Response:** ```json { "accept_partial": true, "amount": 1000, "amount_paid": 0, "callback_method": "", "callback_url": "", "cancelled_at": 0, "created_at": 1596187814, "currency": "INR", "customer": { "contact": "+919999999999", "email": "gaurav.kumar@example.com", "name": "Gaurav Kumar" }, "description": "Payment for policy no #23456", "expire_by": 0, "expired_at": 0, "first_min_partial_amount": 100, "id": "plink_FL3Oncr7XxXFf6", "notes": null, "notify": { "email": true, "sms": true }, "payments": null, "reference_id": "#423212", "reminder_enable": true, "reminders": [], "short_url": "https://rzp.io/i/j45EmLE", "source": "", "source_id": "", "status": "created", "updated_at": 1596187814, "user_id": "" } ``` ------------------------------------------------------------------------------------------------------- ### Rename labels in payment details section ```php $api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'+919999999999'), 'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('hosted_page'=>array('label'=>array('receipt'=>'Ref No.', 'description'=>'Course Name', 'amount_payable'=>'Course Fee Payable', 'amount_paid'=>'Course Fee Paid', 'partial_amount_due'=>'Fee Installment Due', 'partial_amount_paid'=>'Fee Installment Paid', 'expire_by'=>'Pay Before', 'expired_on'=>'1632223497','amount_due'=>'Course Fee Due'), 'show_preferences'=>array('issued_to'=>false))))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| |amount* | integer | Amount to be paid using the Payment Link. | |currency | string | A three-letter ISO code for the currency in which you want to accept the payment. For example, INR. | |accept_partial | boolean | Indicates whether customers can make partial payments using the Payment Link. Possible values:true - Customer can make partial payments.false (default) - Customer cannot make partial payments. | |first_min_partial_amount | integer | | |description | string | A brief description of the Payment Link | |customer | array | name, email, contact | |notify | object | sms or email (boolean) | |reminder_enable | boolean | To disable reminders for a Payment Link, pass reminder_enable as false | |options* | array | Parent parameter under which the hosted_page and label child parameters must be passed.| **Response:** For rename labels in payment details section response please click [here](https://razorpay.com/docs/payment-links/api/new/advanced-options/customize/rename-payment-details-labels/) ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/payment-links/)** razorpay/documents/document.md 0000644 00000003503 15002216177 0012556 0 ustar 00 ## Document ### Create a Document ```php $payload = array( 'file'=> '/Users/your_name/Downloads/sample_uploaded.pdf' "purpose" => "dispute_evidence" ); $api->document->create($payload); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | file* | string | The URL generated once the business proof document is uploaded. | | purpose | string | Possible value is `dispute_evidence` | **Response:** ```json { "id": "doc_EsyWjHrfzb59Re", "entity": "document", "purpose": "dispute_evidence", "name": "doc_19_12_2020.jpg", "mime_type": "image/png", "size": 2863, "created_at": 1590604200 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch Document Information ```php $documentId = ""; $api->document->fetch($documentId); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | from | timestamp | timestamp after which the addons were created | | to | timestamp | timestamp before which the addons were created | | count | integer | number of addons to fetch (default: 10) | | skip | integer | number of addons to be skipped (default: 0) | **Response:** ```json { "entity": "document", "id": "doc_00000000000000", "purpose": "dispute_evidence", "created_at": 1701701378, "mime_type": "application/pdf", "display_name": "ppm_00000000000000", "size": 404678, "url": "" } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/documents)** razorpay/documents/card.md 0000644 00000045353 15002216177 0011662 0 ustar 00 ## Cards ### Create customer ```php $api->customer->create(array('name' => 'Razorpay User', 'email' => 'customer@razorpay.com','contact'=>'9123456780', 'fail_existing'=> '0', 'notes'=> array('notes_key_1'=> 'Tea, Earl Grey, Hot','notes_key_2'=> 'Tea, Earl Grey… decaf'))); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | name* | string | Name of the customer | | email | string | Email of the customer | | contact | string | Contact number of the customer | | fail_existing | string | If a customer with the same details already exists, the request throws an exception by default. Possible value is `0` or `1`| | notes | array | A key-value pair | **Response:** ```json { "id": "cust_1Aa00000000003", "entity": "customer", "name": "Gaurav Kumar", "email": "Gaurav.Kumar@example.com", "contact": "9000000000", "gstin": null, "notes": { "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey… decaf." }, "created_at": 1582033731 } ``` ------------------------------------------------------------------------------------------------------- ### Create Order ```php $api->order->create(array('amount' => 100, 'currency' => 'INR', 'receipt' => '123', 'customer_id'=> $customerId, 'method'=>'card', 'token'=>array('max_amount'=>'5000', 'expire_at'=>'2709971120', 'frequency'=>'monthly'), 'notes'=> array('key1'=> 'value3','key2'=> 'value2'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | amount* | integer | The amount to be captured (should be equal to the authorized amount, in paise) | | currency* | string | The currency of the payment (defaults to INR) | | customerId* | string | The id of the customer to be fetched | | receipt | string | Your system order reference id. | | method | string | Payment method used to make the registration transaction. Possible value is `card`. | | token | array | All keys listed [here](https://razorpay.com/docs/api/recurring-payments/cards/authorization-transaction/#112-create-an-order) are supported | | notes | array | A key-value pair | **Response:** ```json { "id":"order_1Aa00000000002", "entity":"order", "amount":100, "amount_paid":0, "amount_due":100, "currency":"INR", "receipt":"Receipt No. 1", "method":"card", "description":null, "customer_id":"cust_4xbQrmEoA5WJ01", "token":{ "max_amount":5000, "expire_at":2709971120, "frequency":"monthly" }, "offer_id":null, "status":"created", "attempts":0, "notes":{ "notes_key_1":"Tea, Earl Grey, Hot", "notes_key_2":"Tea, Earl Grey… decaf." }, "created_at":1565172642 } ``` ------------------------------------------------------------------------------------------------------- ### Create registration link ```php $api->subscription->createSubscriptionRegistration(array('customer'=>array('name'=>'Gaurav Kumar','email'=>'gaurav.kumar@example.com','contact'=>'9123456780'),'type'=>'link','amount'=>100,'currency'=>'INR','description'=>'Registration Link for Gaurav Kumar','subscription_registration'=>array('method'=>'card','max_amount'=>'500','expire_at'=>'1634215992'),'receipt'=>'Receipt No. 5','email_notify'=>1,'sms_notify'=>1,'expire_by'=>1634215992, 'notes'=> array('note_key 1'=> 'Beam me up Scotty','note_key 2'=> 'Tea. Earl Gray. Hot.'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | customer | array | All parameters listed [here](https://razorpay.com/docs/api/payments/recurring-payments/cards/create-authorization-transaction/#121-create-a-registration-link) are supported | | type* | array | the value is `link`. | | amount* | integer | The amount to be captured (should be equal to the authorized amount, in paise) | | currency* | string | The currency of the payment (defaults to INR) | | description* | string | A brief description of the payment. | | subscription_registration | array | All keys listed [here](https://razorpay.com/docs/api/recurring-payments/cards/authorization-transaction/#121-create-a-registration-link) are supported | | receipt | string | Your system order reference id. | | sms_notify | boolean | SMS notifications are to be sent by Razorpay (default : 1) | | email_notify | boolean | Email notifications are to be sent by Razorpay (default : 1) | | expire_by | integer | The timestamp, in Unix format, till when the customer can make the authorization payment. | | notes | array | A key-value pair | **Response:** ```json { "id": "inv_FHrXGIpd3N17DX", "entity": "invoice", "receipt": "Receipt No. 24", "invoice_number": "Receipt No. 24", "customer_id": "cust_BMB3EwbqnqZ2EI", "customer_details": { "id": "cust_BMB3EwbqnqZ2EI", "name": "Gaurav Kumar", "email": "gaurav.kumar@example.com", "contact": "9123456780", "gstin": null, "billing_address": null, "shipping_address": null, "customer_name": "Gaurav Kumar", "customer_email": "gaurav.kumar@example.com", "customer_contact": "9123456780" }, "order_id": "order_FHrXGJNngJyEAe", "line_items": [], "payment_id": null, "status": "issued", "expire_by": 4102444799, "issued_at": 1595491014, "paid_at": null, "cancelled_at": null, "expired_at": null, "sms_status": "pending", "email_status": "pending", "date": 1595491014, "terms": null, "partial_payment": false, "gross_amount": 100, "tax_amount": 0, "taxable_amount": 0, "amount": 100, "amount_paid": 0, "amount_due": 100, "currency": "INR", "currency_symbol": "₹", "description": "Registration Link for Gaurav Kumar", "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "comment": null, "short_url": "https://rzp.io/i/VSriCfn", "view_less": true, "billing_start": null, "billing_end": null, "type": "link", "group_taxes_discounts": false, "created_at": 1595491014, "idempotency_key": null } ``` ------------------------------------------------------------------------------------------------------- ## Create an order to charge the customer ```php $api->order->create(array('amount' => '100', 'currency' => 'INR', 'customer_id'=> $customerId, 'method'=>'card', 'receipt' => 'Receipt No. 1', 'token'=>array('max_amount'=>'5000', 'expire_at'=>'2709971120', 'frequency'=>'monthly'), 'notes'=> array('key1'=> 'value3','key2'=> 'value2'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | amount* | integer | The amount to be captured (should be equal to the authorized amount, in paise) | | currency* | string | The currency of the payment (defaults to INR) | | customerId* | string | The id of the customer to be fetched | | method | string | Payment method used to make the registration transaction. Possible value is `card`. | | receipt | string | Your system order reference id. | | token | array | All keys listed [here](https://razorpay.com/docs/api/recurring-payments/cards/subsequent-payments/#31-create-an-order-to-charge-the-customer) are supported | | notes | array | A key-value pair | **Response:** ```json { "id":"order_1Aa00000000002", "entity":"order", "amount":100, "amount_paid":0, "amount_due":100, "currency":"INR", "receipt":"Receipt No. 1", "method":"card", "description":null, "customer_id":"cust_4xbQrmEoA5WJ01", "token":{ "max_amount":5000, "expire_at":2709971120, "frequency":"monthly" }, "offer_id":null, "status":"created", "attempts":0, "notes":{ "notes_key_1":"Tea, Earl Grey, Hot", "notes_key_2":"Tea, Earl Grey… decaf." }, "created_at":1565172642 } ``` ------------------------------------------------------------------------------------------------------- ## Create a recurring payment ```php $api->payment->createRecurring(array('email'=>'gaurav.kumar@example.com','contact'=>'9123456789','amount'=>100,'currency'=>'INR','order_id'=>$orderid,'customer_id'=>$customerId,'token'=>$tokenId,'recurring'=>'1','description'=>'Creating recurring payment for Gaurav Kumar', 'notes'=> array('key1'=> 'value3','key2'=> 'value2'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | email* | string | The customer's email address | | contact* | string | The customer's phone number | | amount* | integer | The amount to be captured (should be equal to the authorized amount, in paise) | | currency* | string | The currency of the payment (defaults to INR) | | orderId* | string | The id of the order to be fetched | | customerId* | string | The id of the customer to be fetched | | tokenId* | string | The id of the token to be fetched | | recurring* | boolean | Possible values is `0` or `1` | | description | string | A brief description of the payment. | | notes | array | A key-value pair | **Response:** ```json { "razorpay_payment_id" : "pay_1Aa00000000001", "razorpay_order_id" : "order_1Aa00000000001", "razorpay_signature" : "9ef4dffbfd84f1318f6739a3ce19f9d85851857ae648f114332d8401e0949a3d" } ``` ------------------------------------------------------------------------------------------------------- ### Create an Authorization Payment Please refer this [doc](https://razorpay.com/docs/api/recurring-payments/cards/authorization-transaction/#113-create-an-authorization-payment) for authorization payment ------------------------------------------------------------------------------------------------------- ## Send/Resend notifications ```php $api->invoice->fetch($invoiceId)->notifyBy($medium); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | invoiceId* | string | The id of the invoice to be fetched | | medium* | string | Possible values are `sms` or `email` | **Response:** ```json { "success": true } ``` ------------------------------------------------------------------------------------------------------- ## Cancel registration link ```php $api->invoice->fetch($invoiceId)->cancel(); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | invoiceId* | string | The id of the invoice to be fetched | **Response:** ```json { "id": "inv_FHrfRupD2ouKIt", "entity": "invoice", "receipt": "Receipt No. 1", "invoice_number": "Receipt No. 1", "customer_id": "cust_BMB3EwbqnqZ2EI", "customer_details": { "id": "cust_BMB3EwbqnqZ2EI", "name": "Gaurav Kumar", "email": "gaurav.kumar@example.com", "contact": "9123456780", "gstin": null, "billing_address": null, "shipping_address": null, "customer_name": "Gaurav Kumar", "customer_email": "gaurav.kumar@example.com", "customer_contact": "9123456780" }, "order_id": "order_FHrfRw4TZU5Q2L", "line_items": [], "payment_id": null, "status": "cancelled", "expire_by": 4102444799, "issued_at": 1595491479, "paid_at": null, "cancelled_at": 1595491488, "expired_at": null, "sms_status": "sent", "email_status": "sent", "date": 1595491479, "terms": null, "partial_payment": false, "gross_amount": 100, "tax_amount": 0, "taxable_amount": 0, "amount": 100, "amount_paid": 0, "amount_due": 100, "currency": "INR", "currency_symbol": "₹", "description": "Registration Link for Gaurav Kumar", "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "comment": null, "short_url": "https://rzp.io/i/QlfexTj", "view_less": true, "billing_start": null, "billing_end": null, "type": "link", "group_taxes_discounts": false, "created_at": 1595491480, "idempotency_key": null } ``` ------------------------------------------------------------------------------------------------------- ## Fetch token by payment id ```php $api->payment->fetch($paymentId); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | paymentId* | string | The id of the payment to be fetched | **Response:** ```json { "id": "pay_FHfqtkRzWvxky4", "entity": "payment", "amount": 100, "currency": "INR", "status": "captured", "order_id": "order_FHfnswDdfu96HQ", "invoice_id": null, "international": false, "method": "card", "amount_refunded": 0, "refund_status": null, "captured": true, "description": null, "card_id": "card_F0zoXUp4IPPGoI", "bank": null, "wallet": null, "vpa": null, "email": "gaurav.kumar@example.com", "contact": "+919876543210", "customer_id": "cust_DtHaBuooGHTuyZ", "token_id": "token_FHfn3rIiM1Z8nr", "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "fee": 0, "tax": 0, "error_code": null, "error_description": null, "error_source": null, "error_step": null, "error_reason": null, "acquirer_data": { "auth_code": "541898" }, "created_at": 1595449871 } ``` ------------------------------------------------------------------------------------------------------- ## Fetch tokens by customer id ```php $api->customer->fetch($customerId)->tokens()->all(); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | customerId* | string | The id of the customer to be fetched | **Response:** ```json { "entity":"collection", "count":1, "items":[ { "id":"token_HouA2OQR5Z2jTL", "entity":"token", "token":"2JPRk664pZHUWG", "bank":null, "wallet":null, "method":"card", "card":{ "entity":"card", "name":"Gaurav Kumar", "last4":"8950", "network":"Visa", "type":"credit", "issuer":"STCB", "international":false, "emi":false, "sub_type":"consumer", "expiry_month":12, "expiry_year":2021, "flows":{ "otp":true, "recurring":true } }, "recurring":true, "recurring_details":{ "status":"confirmed", "failure_reason":null }, "auth_type":null, "mrn":null, "used_at":1629779657, "created_at":1629779657, "expired_at":1640975399, "dcc_enabled":false, "billing_address":null } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch card ```php $api->card->fetch($cardId); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | cardId* | string | card id to be fetched | ```json { "id": "card_JXPULjlKqC5j0i", "entity": "card", "name": "Gaurav", "last4": "4366", "network": "Visa", "type": "credit", "issuer": "UTIB", "international": false, "emi": true, "sub_type": "consumer", "token_iin": null } ``` ------------------------------------------------------------------------------------------------------- ## Delete tokens ```php $api->customer->fetch($customerId)->tokens()->delete($tokenId); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | customerId* | string | The id of the customer to be fetched | | tokenId* | string | The id of the token to be fetched | **Response:** ```json { "deleted": true } ``` ------------------------------------------------------------------------------------------------------- ## Using Card Number/ Tokenised Card Number ```php $api->card->requestCardReference(array("number" =>"4854980604708430")); ``` **Parameters:** | Name | Type | Description | |-------------|---------|------------------------------------------------------------------------------| | number* | string | The card number whose PAR or network reference id should be retrieved. | | tokenised | string | Determines if the card is saved as a token. Possible value is `true` or `false` | **Response:** ```json { "network": "Visa", "payment_account_reference": "V0010013819231376539033235990", "network_reference_id": null } ``` ------------------------------------------------------------------------------------------------------- ## Using Razporpay token ```php $api->card->requestCardReference(array("token" =>"token_4lsdksD31GaZ09")); ``` **Parameters:** | Name | Type | Description | |-------------|---------|------------------------------------------------------------------------------| | token* | string | The token whose PAR or network reference id should be retrieved.| **Response:** ```json { "network": "Visa", "payment_account_reference": "V0010013819231376539033235990", "network_reference_id": null } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/recurring-payments/cards/authorization-transaction/)** razorpay/documents/addon.md 0000644 00000010666 15002216177 0012035 0 ustar 00 ## Addons ### Create an addon ```php $api->subscription->fetch($subscriptionId)->createAddon(array('item' => array('name' => 'Extra Chair', 'amount' => 30000, 'currency' => 'INR'), 'quantity' => 2)); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | subscriptionId* | boolean | The subscription ID to which the add-on is being added. | | items | array | All parameters listed [here](https://razorpay.com/docs/api/payments/subscriptions/#create-an-add-on) | | quantity | integer | This specifies the number of units of the add-on to be charged to the customer. | **Response:** ```json { "id":"ao_00000000000001", "entity":"addon", "item":{ "id":"item_00000000000001", "active":true, "name":"Extra appala (papadum)", "description":"1 extra oil fried appala with meals", "amount":30000, "unit_amount":30000, "currency":"INR", "type":"addon", "unit":null, "tax_inclusive":false, "hsn_code":null, "sac_code":null, "tax_rate":null, "tax_id":null, "tax_group_id":null, "created_at":1581597318, "updated_at":1581597318 }, "quantity":2, "created_at":1581597318, "subscription_id":"sub_00000000000001", "invoice_id":null } ``` ------------------------------------------------------------------------------------------------------- ### Fetch all addons ```php $api->addon->all($options); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | from | timestamp | timestamp after which the addons were created | | to | timestamp | timestamp before which the addons were created | | count | integer | number of addons to fetch (default: 10) | | skip | integer | number of addons to be skipped (default: 0) | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "ao_00000000000002", "entity": "addon", "item": { "id": "item_00000000000002", "active": true, "name": "Extra sweet", "description": "1 extra sweet of the day with meals", "amount": 90000, "unit_amount": 90000, "currency": "INR", "type": "addon", "unit": null, "tax_inclusive": false, "hsn_code": null, "sac_code": null, "tax_rate": null, "tax_id": null, "tax_group_id": null, "created_at": 1581597318, "updated_at": 1581597318 }, "quantity": 1, "created_at": 1581597318, "subscription_id": "sub_00000000000001", "invoice_id": "inv_00000000000001" } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch an addon ```php $api->addon->fetch($addonId); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | addonId* | string | addon id to be fetched | **Response:** ```json { "id":"ao_00000000000001", "entity":"addon", "item":{ "id":"item_00000000000001", "active":true, "name":"Extra appala (papadum)", "description":"1 extra oil fried appala with meals", "amount":30000, "unit_amount":30000, "currency":"INR", "type":"addon", "unit":null, "tax_inclusive":false, "hsn_code":null, "sac_code":null, "tax_rate":null, "tax_id":null, "tax_group_id":null, "created_at":1581597318, "updated_at":1581597318 }, "quantity":2, "created_at":1581597318, "subscription_id":"sub_00000000000001", "invoice_id":null } ``` ------------------------------------------------------------------------------------------------------- ### Delete an addon ```php $api->addon->fetch($addonId)->delete(); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|--------------| | addonId* | string | addon id to be deleted | **Response:** ```json [] ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/subscriptions/#add-ons)** razorpay/documents/account.md 0000644 00000034327 15002216177 0012404 0 ustar 00 ## Account ### Create an Account ```php $api->account->create(array( "email" => "gauriagain.kumar@example.org", "phone" => "9000090000", "legal_business_name" => "Acme Corp", "business_type" => "partnership", "customer_facing_business_name" => "Example", "profile" => array( "category" => "healthcare", "subcategory" => "clinic", "description" => "Healthcare E-commerce platform", "addresses" => array( "operation" => array( "street1" => "507, Koramangala 6th block", "street2" => "Kormanagala", "city" => "Bengaluru", "state" => "Karnataka", "postal_code" => 560047, "country" => "IN" ), "registered" => array( "street1" => "507, Koramangala 1st block", "street2" => "MG Road", "city" => "Bengaluru", "state" => "Karnataka", "postal_code" => 560034, "country" => "IN" ) ), "business_model" => "Online Clothing ( men, women, ethnic, modern ) fashion and lifestyle, accessories, t-shirt, shirt, track pant, shoes." ), "legal_info" => array( "pan" => "AAACL1234C", "gst" => "18AABCU9603R1ZM" ), "brand" => array( "color" => "FFFFFF" ), "notes" => array( "internal_ref_id" => "123123" ), "contact_name" => "Gaurav Kumar", "contact_info" => array( "chargeback" => array( "email" => "cb@example.org" ), "refund" => array( "email" => "cb@example.org" ), "support" => array( "email" => "support@example.org", "phone" => "9999999998", "policy_url" => "https://www.google.com" ) ), "apps" => array( "websites" => array( "https://www.example.org" ), "android" => array( array( "url" => "playstore.example.org", "name" => "Example" ) ), "ios" => array( array( "url" => "appstore.example.org", "name" => "Example" ) ) ) )); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | email* | string | The sub-merchant's business email address. | | phone* | integer | The sub-merchant's business phone number. The minimum length is 8 characters and the maximum length is 15. | | legal_business_name* | string | The name of the sub-merchant's business. For example, Acme Corp. The minimum length is 4 characters and the maximum length is 200. | | customer_facing_business_name | string | The sub-merchant billing label as it appears on the Razorpay Dashboard. The minimum length is 1 character and the maximum length is 255. | | business_type | string | The type of business operated by the sub-merchant.Possible value is `proprietorship`, `partnership`, `private_limited`, `public_limited`, `llp`, `ngo`, `trust`, `society`, `not_yet_registered`, `huf` | | reference_id | string | Partner's external account reference id. The minimum length is 1 character and the maximum length is 512. | | profile | object | All keys listed [here](https://razorpay.com/docs/api/partners/account-onboarding/#create-an-account) are supported | | legal_info | object | All keys listed [here](hhttps://razorpay.com/docs/api/partners/account-onboarding/#create-an-account) are supported | | brand | object | All keys listed [here](https://razorpay.com/docs/api/partners/account-onboarding/#create-an-account) are supported | | notes | object | A key-value pair | | contact_name* | string | The name of the contact. The minimum length is 4 and the maximum length is 255 characters. | | contact_info | object | All keys listed [here](https://razorpay.com/docs/api/partners/account-onboarding/#create-an-account) are supported | | apps | object | All keys listed [here](https://razorpay.com/docs/api/partners/account-onboarding/#create-an-account) are supported | **Response:** ```json { "id": "acc_GRWKk7qQsLnDjX", "type": "standard", "status": "created", "email": "gauriagain.kumar@example.org", "profile": { "category": "healthcare", "subcategory": "clinic", "addresses": { "registered": { "street1": "507, Koramangala 1st block", "street2": "MG Road", "city": "Bengaluru", "state": "KARNATAKA", "postal_code": 560034, "country": "IN" }, "operation": { "street1": "507, Koramangala 6th block", "street2": "Kormanagalo", "city": "Bengaluru", "state": "KARNATAKA", "country": "IN", "postal_code": 560047 } }, "business_model": "Online Clothing ( men, women, ethnic, modern ) fashion and lifestyle, accessories, t-shirt, shirt, track pant, shoes." }, "notes": { "internal_ref_id": "123123" }, "created_at": 1611136837, "phone": "9000090000", "business_type": "partnership", "legal_business_name": "Acme Corp", "customer_facing_business_name": "Example", "legal_info": { "pan": "AAACL1234C", "gst": "18AABCU9603R1ZM" }, "apps": { "websites": [ "https://www.example.org" ], "android": [ { "url": "playstore.example.org", "name": "Example" } ], "ios": [ { "url": "appstore.example.org", "name": "Example" } ] }, "brand": { "color": "#FFFFFF" }, "contact_info": { "chargeback": { "email": "cb@example.org", "phone": null, "policy_url": null }, "refund": { "email": "cb@example.org", "phone": null, "policy_url": null }, "support": { "email": "support@example.org", "phone": "9999999998", "policy_url": "https://www.google.com" } } } ``` ------------------------------------------------------------------------------------------------------- ### Edit Account ```php $accountId = "acc_GP4lfNA0iIMn5B"; $api->account->edit($accountId,array( "customer_facing_business_name" => "ABCD Ltd" )); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | phone | integer | The sub-merchant's business phone number. The minimum length is 8 characters and the maximum length is 15. | | legal_business_name | string | The name of the sub-merchant's business. For example, Acme Corp. The minimum length is 4 characters and the maximum length is 200. | | customer_facing_business_name | string | The sub-merchant billing label as it appears on the Razorpay Dashboard. The minimum length is 1 character and the maximum length is 255. | | profile | object | All keys listed [here](https://razorpay.com/docs/api/partners/account-onboarding/#update-an-account) are supported | | legal_info | object | All keys listed [here](hhttps://razorpay.com/docs/api/partners/account-onboarding/#update-an-account) are supported | | brand | object | All keys listed [here](https://razorpay.com/docs/api/partners/account-onboarding/#update-an-account) are supported | | notes | object | A key-value pair | | contact_name* | string | The name of the contact. The minimum length is 4 and the maximum length is 255 characters. | | contact_info | object | All keys listed [here](https://razorpay.com/docs/api/partners/account-onboarding/#update-an-account) are supported | | apps | object | All keys listed [here](https://razorpay.com/docs/api/partners/account-onboarding/#update-an-account) are supported | **Response:** ```json { "id": "acc_GP4lfNA0iIMn5B", "type": "standard", "status": "created", "email": "gauri@example.org", "profile": { "category": "healthcare", "subcategory": "clinic", "addresses": { "registered": { "street1": "507, Koramangala 1st block", "street2": "MG Road-1", "city": "Bengalore", "state": "KARNATAKA", "postal_code": "560034", "country": "IN" } } }, "notes": [], "created_at": 1610603081, "phone": "9000090000", "reference_id": "randomId", "business_type": "partnership", "legal_business_name": "Acme Corp", "customer_facing_business_name": "ABCD Ltd" } ``` ------------------------------------------------------------------------------------------------------- ### Delete an account ```php $accountId = "acc_GP4lfNA0iIMn5B"; $api->account->delete($accountId); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | accountId* | string | The unique identifier of a sub-merchant account that must be deleted. | **Response:** ```json { "id": "acc_GXQAkO2MrvBYg4", "type": "standard", "status": "suspended", "email": "gaurav.kumar@acme.org", "profile": { "category": "healthcare", "subcategory": "clinic", "addresses": { "registered": { "street1": "507, Koramangala 1st block", "street2": "MG Road", "city": "Bengaluru", "state": "KARNATAKA", "postal_code": "560034", "country": "IN" }, "operation": { "street1": "507, Koramangala 1st block", "street2": "MG Road", "city": "Bengaluru", "state": "KARNATAKA", "country": "IN", "postal_code": "560034" } }, "business_model": "Online Clothing ( men, women, ethnic, modern ) fashion and lifestyle, accessories, t-shirt, shirt, track pant, shoes." }, "notes": { "internal_ref_id": "123123" }, "created_at": 1612425180, "suspended_at": 1612425235, "phone": "9000090000", "reference_id": "account_COdeRandom", "business_type": "partnership", "legal_business_name": "Acme Corp Pvt Ltd", "customer_facing_business_name": "Acme", "legal_info": { "pan": "AAACL1234C", "gst": "18AABCU9603R1ZM" }, "apps": { "websites": [ "https://www.acme.org" ], "android": [ { "url": "playstore.acme.org", "name": "Acme" } ], "ios": [ { "url": "appstore.acme.org", "name": "Acme" } ] }, "brand": { "color": "#FFFFFF" }, "contact_name": "Gaurav Kumar", "contact_info": { "chargeback": { "email": "cb@acme.org", "phone": "9000090000", "policy_url": "https://www.google.com" }, "refund": { "email": "cb@acme.org", "phone": "9898989898", "policy_url": "https://www.google.com" }, "support": { "email": "support@acme.org", "phone": "9898989898", "policy_url": "https://www.google.com" } } } ``` ------------------------------------------------------------------------------------------------------- ### Fetch an account ```php $accountId = "acc_GP4lfNA0iIMn5B"; $api->account->fetch($accountId); ``` **Parameters:** | Name | Type | Description | |-------------|-------------|---------------------------------------------| | accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | **Response:** ```json { "id": "acc_GP4lfNA0iIMn5B", "type": "standard", "status": "created", "email": "gauri@example.org", "profile": { "category": "healthcare", "subcategory": "clinic", "addresses": { "registered": { "street1": "507, Koramangala 1st block", "street2": "MG Road-1", "city": "Bengalore", "state": "KARNATAKA", "postal_code": "560034", "country": "IN" } } }, "notes": [], "created_at": 1610603081, "phone": "9000090000", "reference_id": "randomId", "business_type": "partnership", "legal_business_name": "Acme Corp", "customer_facing_business_name": "Example Pvt. Ltd." } ``` ------------------------------------------------------------------------------------------------------- ### Upload account documents ```php $accountId = "acc_M83Uw27KXuC7c8"; $payload = [ 'file'=> '/Users/your_name/Downloads/sample_uploaded.pdf' "document_type" => "business_proof_url" ]; $api->account->fetch($accoundId)->uploadAccountDoc($payload); ``` **Parameters:** | Name | Type | Description | |-------------|-------------|---------------------------------------------| | accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | | file* | string | The URL generated once the business proof document is uploaded. | | document_type* | string | The documents valid for the proof type to be shared. Possible values : <br> business_proof_of_identification: `shop_establishment_certificate`, `gst_certificate`, `msme_certificate`, `business_proof_url`, `business_pan_url`, <br><br> additional_documents : `form_12_a_url`, `form_80g_url`, `cancelled_cheque` | **Response:** ```json { "business_proof_of_identification": [ { "type": "business_proof_url", "url": "<https://rzp.io/i/bzDKbNg>" } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch account documents ```php $accountId = "acc_M83Uw27KXuC7c8"; $api->account->fetch($accoundId)->fetchAccountDoc(); ``` **Parameters:** | Name | Type | Description | |-------------|-------------|---------------------------------------------| | accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | **Response:** ```json { "business_proof_of_identification": [ { "type": "business_proof_url", "url": "<https://rzp.io/i/bzDKbNg>" } ] } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/partners/account-onboarding/)** razorpay/documents/Iin.md 0000644 00000003435 15002216177 0011463 0 ustar 00 ### Iin ### Token IIN API ```php $tokenIin = "412345"; $api->iin->fetch($tokenIin); ``` **Parameters:** | Name | Type | Description | |------------|--------|-----------------------------------| | tokenIin* | string | The token IIN. | **Response:** ```json { "iin": "412345", "entity": "iin", "network": "Visa", "type": "credit", "sub_type": "business", "issuer_code": "HDFC", "issuer_name": "HDFC Bank Ltd", "international": false, "is_tokenized": true, "card_iin": "411111", "emi":{ "available": true }, "recurring": { "available": true }, "authentication_types": [ { "type":"3ds" }, { "type":"otp" } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch All IINs Supporting Native OTP ```php $api->iin->all(array("flow" => "otp")); ``` **Response:** ```json { "count": 24, "iins": [ "512967", "180005", "401704", "401806", "123456", "411111", "123512967", "180012305", "401123704" ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch All IINs with Business Sub-type ```php $api->iin->all(array("sub_type" => "business")); ``` **Response:** ```json { "count": 24, "iins": [ "512967", "180005", "401704", "401806", "607389", "652203", "414367", "787878", "123456", "411111", "123512967", "180012305", "401123704" ] } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/payments/cards/iin-api/#iin-entity)** razorpay/documents/upi.md 0000644 00000041465 15002216177 0011546 0 ustar 00 ## UPI ### Create customer ```php $api->customer->create(array('name' => 'Razorpay User', 'email' => 'customer@razorpay.com','contact'=>'9123456780', 'fail_existing'=> '0', 'notes'=> array('notes_key_1'=> 'Tea, Earl Grey, Hot','notes_key_2'=> 'Tea, Earl Grey… decaf'))); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | name* | string | Name of the customer | | email | string | Email of the customer | | fail_existing | string | If a customer with the same details already exists, the request throws an exception by default. Possible value is `0` or `1`| | contact | string | Contact number of the customer | | notes | array | A key-value pair | **Response:** ```json { "id": "cust_1Aa00000000003", "entity": "customer", "name": "Gaurav Kumar", "email": "Gaurav.Kumar@example.com", "contact": "9000000000", "gstin": null, "notes": { "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey… decaf." }, "created_at": 1582033731 } ``` ------------------------------------------------------------------------------------------------------- ### Create order ```php $api->order->create(array('amount' => 0,'currency' => 'INR','method' => 'upi','customer_id' => 'cust_4xbQrmEoA5WJ01', 'token' => array('max_amount' => 200000, 'expire_at' => 2709971120, 'frequency' => 'monthly'),'receipt' => 'Receipt No. 1' ,'notes' => array('notes_key_1' => 'Beam me up Scotty','notes_key_2' => 'Engage'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | amount* | integer | Amount of the order to be paid | | currency* | string | Currency of the order. Currently only `INR` is supported. | | method* | string | The authorization method. In this case the value will be `upi` | | receipt | string | Your system order reference id. | | notes | array | A key-value pair | | token* | array | All parameters listed [here](https://razorpay.com/docs/api/payments/recurring-payments/upi/create-authorization-transaction/#112-create-an-order) are supported | **Response:** ```json { "id": "order_1Aa00000000002", "entity": "order", "amount": 100, "amount_paid": 0, "amount_due": 100, "currency": "INR", "receipt": "Receipt No. 1", "offer_id": null, "status": "created", "attempts": 0, "notes": { "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey… decaf." }, "created_at": 1565172642 } ``` ------------------------------------------------------------------------------------------------------- ### Create an Authorization Payment Please refer this [doc](https://razorpay.com/docs/api/recurring-payments/upi/authorization-transaction/#113-create-an-authorization-payment) for authorization payment ------------------------------------------------------------------------------------------------------- ### Create registration link ```php $api->subscription->createSubscriptionRegistration(array('customer'=>array('name'=>'Gaurav Kumar','email'=>'gaurav.kumar@example.com','contact'=>'9123456780'),'type'=>'link','amount'=>100,'currency'=>'INR','description'=>'Registration Link for Gaurav Kumar','subscription_registration'=>array('method'=>'upi', 'max_amount'=>'500', 'expire_at'=>'1634215992', 'frequency'=>'monthly'),'receipt'=>'Receipt No. 5','email_notify'=>1,'sms_notify'=>1,'expire_by'=>1634215992,'notes' => array('note_key 1' => 'Beam me up Scotty','note_key 2' => 'Tea. Earl Gray. Hot.'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | customer | array | All parameters listed [here](https://razorpay.com/docs/api/payments/recurring-payments/upi/create-authorization-transaction/#121-create-a-registration-link) are supported | | type* | string | In this case, the value is `link`. | | currency* | string | The 3-letter ISO currency code for the payment. Currently, only `INR` is supported. | | amount* | integer | The payment amount in the smallest currency sub-unit. | | description* | string | A description that appears on the hosted page. For example, `12:30 p.m. Thali meals (Gaurav Kumar`). | | subscription_registration | array | All parameters listed [here](https://razorpay.com/docs/api/payments/recurring-payments/upi/create-authorization-transaction/#121-create-a-registration-link) are supported | | sms_notify | boolean | SMS notifications are to be sent by Razorpay (default : 1) | | email_notify | boolean | Email notifications are to be sent by Razorpay (default : 1) | | expire_by | integer | The timestamp, in Unix format, till when the customer can make the authorization payment. | | notes | array | A key-value pair | **Response:** ```json { "id": "inv_FHr1ekX0r2VCVK", "entity": "invoice", "receipt": "Receipt No. 23", "invoice_number": "Receipt No. 23", "customer_id": "cust_BMB3EwbqnqZ2EI", "customer_details": { "id": "cust_BMB3EwbqnqZ2EI", "name": "Gaurav Kumar", "email": "gaurav.kumar@example.com", "contact": "9123456780", "gstin": null, "billing_address": null, "shipping_address": null, "customer_name": "Gaurav Kumar", "customer_email": "gaurav.kumar@example.com", "customer_contact": "9123456780" }, "order_id": "order_FHr1ehR3nmNeXo", "line_items": [], "payment_id": null, "status": "issued", "expire_by": 4102444799, "issued_at": 1595489219, "paid_at": null, "cancelled_at": null, "expired_at": null, "sms_status": "pending", "email_status": "pending", "date": 1595489219, "terms": null, "partial_payment": false, "gross_amount": 100, "tax_amount": 0, "taxable_amount": 0, "amount": 100, "amount_paid": 0, "amount_due": 100, "currency": "INR", "currency_symbol": "₹", "description": "Registration Link for Gaurav Kumar", "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "comment": null, "short_url": "https://rzp.io/i/ak1WxDB", "view_less": true, "billing_start": null, "billing_end": null, "type": "link", "group_taxes_discounts": false, "created_at": 1595489219, "idempotency_key": null } ``` ------------------------------------------------------------------------------------------------------- ### Send/Resend notifications ```php $api->invoice->fetch($invoiceId)->notifyBy($medium); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | invoiceId* | string | The id of the invoice to be notified | | medium* | string | `sms`/`email`, Medium through which notification should be sent. | **Response:** ```json { "success": true } ``` ------------------------------------------------------------------------------------------------------- ### Cancel a registration link ```php $api->invoice->fetch($invoiceId)->cancel(); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | invoiceId* | string | The id of the invoice to be cancelled | **Response:** ```json { "amount": 100, "amount_due": 100, "amount_paid": 0, "auth_link_status": "cancelled", "billing_end": null, "billing_start": null, "cancelled_at": 1655110334, "comment": null, "created_at": 1655110315, "currency": "INR", "currency_symbol": "₹", "customer_details": { "billing_address": null, "contact": "9123456780", "customer_contact": "9123456780", "customer_email": "gaurav.kumar@example.com", "customer_name": "Gaurav Kumar", "email": "gaurav.kumar@example.com", "gstin": null, "id": "cust_DzYEzfJLV03rkp", "name": "Gaurav Kumar", "shipping_address": null }, "customer_id": "cust_DzYEzfJLV03rkp", "date": 1655110315, "description": "Registration Link for Gaurav Kumar", "email_status": "sent", "entity": "invoice", "expire_by": 1657699317, "expired_at": null, "first_payment_min_amount": null, "gross_amount": 100, "group_taxes_discounts": false, "id": "inv_Jgv4UErmFzfrA0", "idempotency_key": null, "invoice_number": "Receipt No. #51", "issued_at": 1655110315, "line_items": [], "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "order_id": "order_Jgv4UAyqlixvOB", "paid_at": null, "partial_payment": false, "payment_id": null, "receipt": "Receipt No. #51", "reminder_status": null, "short_url": "https://rzp.io/i/VuAC1WG", "sms_status": "sent", "status": "cancelled", "subscription_status": null, "supply_state_code": null, "tax_amount": 0, "taxable_amount": 0, "terms": null, "type": "link", "user_id": null, "view_less": true } ``` ------------------------------------------------------------------------------------------------------- ### Fetch token by payment ID ```php $api->payment->fetch($paymentId); ``` **Parameters:** | Name | Type | Description | |------------|--------|-----------------------------------| | paymentId* | string | Id of the payment to be retrieved | **Response:** ```json { "id": "pay_FHfAzEJ51k8NLj", "entity": "payment", "amount": 100, "currency": "INR", "status": "captured", "order_id": "order_FHfANdTUYeP8lb", "invoice_id": null, "international": false, "method": "upi", "amount_refunded": 0, "refund_status": null, "captured": true, "description": null, "card_id": null, "bank": null, "wallet": null, "vpa": "gaurav.kumar@upi", "email": "gaurav.kumar@example.com", "contact": "+919876543210", "customer_id": "cust_DtHaBuooGHTuyZ", "token_id": "token_FHfAzGzREc1ug6", "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "fee": 0, "tax": 0, "error_code": null, "error_description": null, "error_source": null, "error_step": null, "error_reason": null, "acquirer_data": { "rrn": "854977234911", "upi_transaction_id": "D0BED5A062ECDB3E9B3A1071C96BB273" }, "created_at": 1595447490 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch tokens by customer ID ```php $api->customer->fetch($customerId)->tokens()->all(); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | customerId* | string | The id of the customer to be fetched | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "token_FHfAzGzREc1ug6", "entity": "token", "token": "9KHsdPaCELeQ0t", "bank": null, "wallet": null, "method": "upi", "vpa": { "username": "gaurav.kumar", "handle": "upi", "name": null }, "recurring": true, "recurring_details": { "status": "confirmed", "failure_reason": null }, "auth_type": null, "mrn": null, "used_at": 1595447490, "created_at": 1595447490, "start_time": 1595447455, "dcc_enabled": false } ] } ``` ------------------------------------------------------------------------------------------------------- ### Delete token ```php $api->customer->fetch($customerId)->tokens()->delete($tokenId); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | customerId* | string | The id of the customer to be fetched | | tokenId* | string | The id of the token to be fetched | **Response:** ```json { "deleted": true } ``` ------------------------------------------------------------------------------------------------------- ### Create an order to charge the customer ```php $api->order->create(array('amount' => 1000,'currency' => 'INR','payment_capture' => true,'receipt' => 'Receipt No. 1','notes'=> array('notes_key_1' => 'Tea, Earl Grey, Hot', 'notes_key_2' => 'Tea, Earl Grey… decaf.'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | amount* | integer | Amount of the order to be paid | | currency* | string | Currency of the order. Currently only `INR` is supported. | | receipt | string | Your system order reference id. | | notes | array | A key-value pair | | payment_capture | boolean | Indicates whether payment status should be changed to captured automatically or not. Possible values: true - Payments are captured automatically. false - Payments are not captured automatically. | **Response:** ```json { "id":"order_1Aa00000000002", "entity":"order", "amount":1000, "amount_paid":0, "amount_due":1000, "currency":"INR", "receipt":"Receipt No. 1", "offer_id":null, "status":"created", "attempts":0, "notes":{ "notes_key_1":"Tea, Earl Grey, Hot", "notes_key_2":"Tea, Earl Grey… decaf." }, "created_at":1579782776 } ``` ------------------------------------------------------------------------------------------------------- ### Create a recurring payment ```php $api->payment->createRecurring(array('email'=>'gaurav.kumar@example.com','contact'=>'9123456789','amount'=>100,'currency'=>'INR','order_id'=>'order_1Aa00000000002','customer_id'=>'cust_1Aa00000000001','token'=>'token_1Aa00000000001','recurring'=>'1','description'=>'Creating recurring payment for Gaurav Kumar', 'notes'=> array('note_key 1' => 'Beam me up Scotty', 'note_key 2' => 'Tea. Earl Gray. Hot.'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | email* | string | The customer's email address. | | contact* | string | The customer's phone number. | | amount* | integer | The amount you want to charge your customer. This should be the same as the amount in the order. | | currency* | string | The 3-letter ISO currency code for the payment. Currently, only `INR` is supported. | | order_id* | string | The unique identifier of the order created. | | customer_id* | string | The `customer_id` for the customer you want to charge. | | token* | string | The `token_id` generated when the customer successfully completes the authorization payment. Different payment instruments for the same customer have different `token_id`.| | recurring* | string | Determines if recurring payment is enabled or not. Possible values:<br>* `1` - Recurring is enabled.* `0` - Recurring is not enabled.| | description | string | A user-entered description for the payment.| | notes | array | Key-value pair that can be used to store additional information about the entity. Maximum 15 key-value pairs, 256 characters (maximum) each. | **Response:** ```json { "razorpay_payment_id" : "pay_1Aa00000000001", "razorpay_order_id" : "order_1Aa00000000001", "razorpay_signature" : "9ef4dffbfd84f1318f6739a3ce19f9d85851857ae648f114332d8401e0949a3d" } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/recurring-payments/upi/authorization-transaction/)** razorpay/documents/productConfiguration.md 0000644 00000045001 15002216177 0015147 0 ustar 00 ## Product Configuration ### Request a Product Configuration ```php $accountId = "acc_GP4lfNA0iIMn5B"; $api->account->fetch($accountId)->products()->requestProductConfiguration(array( "product_name" => "payment_gateway", "tnc_accepted" => true, "ip" => "233.233.233.234" )); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | product_name* | string | The product(s) to be configured. Possible value is `payment_gateway`, `payment_links` | | tnc_accepted | boolean | Pass this parameter to accept terms and conditions. Send this parameter along with the ip parameter when the tnc is accepted. Possible values is `true` | | ip | integer | The IP address of the merchant while accepting the terms and conditions. Send this parameter along with the `tnc_accepted` parameter when the `tnc` is accepted. | **Response:** ```json { "requested_configuration": { "payment_methods": [] }, "active_configuration": { "payment_capture": { "mode": "automatic", "refund_speed": "normal", "automatic_expiry_period": 7200 }, "settlements": { "account_number": null, "ifsc_code": null, "beneficiary_name": null }, "checkout": { "theme_color": "#FFFFFF", "flash_checkout": true, "logo": "https://example.com/your_logo" }, "refund": { "default_refund_speed": "normal" }, "notifications": { "whatsapp": true, "sms": false, "email": [ "b963e252-1201-45b0-9c39-c53eceb0cfd6_load@gmail.com" ] }, "payment_methods": { "netbanking": { "enabled": true, "instrument": [ { "type": "retail", "bank": [ "hdfc", "sbin", "utib", "icic", "scbl", "yesb" ] } ] }, "wallet": { "enabled": true, "instrument": [ "airtelmoney", "freecharge", "jiomoney", "olamoney", "payzapp", "mobikwik" ] }, "upi": { "enabled": true, "instrument": [ "upi" ] } } }, "requirements": [ { "field_reference": "individual_proof_of_address", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/stakeholders/{stakeholderId}/documents", "status": "required", "reason_code": "document_missing" }, { "field_reference": "individual_proof_of_identification", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/stakeholders/{stakeholderId}/documents", "status": "required", "reason_code": "document_missing" }, { "field_reference": "business_proof_of_identification", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/documents", "status": "required", "reason_code": "document_missing" }, { "field_reference": "settlements.beneficiary_name", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/products/acc_prd_HEgNpywUFctQ9e", "status": "required", "reason_code": "field_missing" }, { "field_reference": "settlements.account_number", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/products/acc_prd_HEgNpywUFctQ9e", "status": "required", "reason_code": "field_missing" }, { "field_reference": "settlements.ifsc_code", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/products/acc_prd_HEgNpywUFctQ9e", "status": "required", "reason_code": "field_missing" }, { "field_reference": "contact_name", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0", "status": "required", "reason_code": "field_missing" }, { "field_reference": "name", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/stakeholders", "status": "required", "reason_code": "field_missing" }, { "field_reference": "customer_facing_business_name", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0", "status": "required", "reason_code": "field_missing" }, { "field_reference": "kyc.pan", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/stakeholders", "status": "required", "reason_code": "field_missing" } ], "tnc":{ "id": "tnc_IgohZaDBHRGjPv", "accepted": true, "accepted_at": 1641550798 }, "id": "acc_prd_HEgNpywUFctQ9e", "account_id": "acc_HQVlm3bnPmccC0", "product_name": "payment_gateway", "activation_status": "needs_clarification", "requested_at": 162547884 } ``` ------------------------------------------------------------------------------------------------------- ### Edit a Product Configuration ```php $accountId = "acc_GP4lfNA0iIMn5B"; $productId = "acc_prd_HEgNpywUFctQ9e"; $api->account->fetch($accountId)->products()->edit($productId, array( "notifications" => array( "email" => array( "gaurav.kumar@example.com", "acd@gmail.com" ) ), "checkout" => array( "theme_color" => "#528FFF" ), "refund" => array( "default_refund_speed" => "optimum" ), "settlements" => array( "account_number" => "1234567890", "ifsc_code" => "HDFC0000317", "beneficiary_name" => "Gaurav Kumar" ), "tnc_accepted" => true, "ip" => "233.233.233.234" )); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | notifications | object | All keys listed [here](https://razorpay.com/docs/api/partners/product-configuration/#update-a-product-configuration) are supported | | checkout | object | All keys listed [here](https://razorpay.com/docs/api/partners/product-configuration/#update-a-product-configuration) are supported | | refund | object | All keys listed [here](https://razorpay.com/docs/api/partners/product-configuration/#update-a-product-configuration) are supported | | settlements | object | All keys listed [here](https://razorpay.com/docs/api/partners/product-configuration/#update-a-product-configuration) are supported | | tnc_accepted | boolean | Pass this parameter to accept terms and conditions. Send this parameter along with the ip parameter when the tnc is accepted. Possible value is `true` | | ip | string | The IP address of the merchant while accepting the terms and conditions. Send this parameter along with the tnc_accepted parameter when the `tnc` is accepted. | | payment_methods | All keys listed [here](https://razorpay.com/docs/api/partners/product-configuration/#update-a-product-configuration) are supported | | type | string | Possible value is `domestic` | | issuer | string | The card issuer. Possible values for issuer are `amex`, `dicl`, `maestro`, `mastercard`, `rupay`, `visa`. | | wallet | object | All keys listed [here](https://razorpay.com/docs/api/partners/product-configuration/#update-a-product-configuration) are supported | | instrument(wallet) | string | The wallet issuer. Possible values are `airtelmoney`, `amazonpay`, `freecharge`, `jiomoney`, `mobiwik`, `mpesa`, `olamoney`, `paytm`, `payzapp`, `payumoney`, `phonepe`, `phonepeswitch`, `sbibuddy` | | instrument(wallet) | string | The wallet issuer. Possible values are `airtelmoney`, `amazonpay`, `freecharge`, `jiomoney`, `mobiwik`, `mpesa`, `olamoney`, `paytm`, `payzapp`, `payumoney`, `phonepe`, `phonepeswitch`, `sbibuddy` | | upi | object | All keys listed [here](https://razorpay.com/docs/api/partners/product-configuration/#update-a-product-configuration) are supported | | instrument(upi) | string | The UPI service provider. Possible values are `google_pay`, `upi`| | paylater | object | All keys listed [here](https://razorpay.com/docs/api/partners/product-configuration/#update-a-product-configuration) are supported | | instrument(emi) | string | The Paylater service provider. Possible values are `epaylater`, `getsimpl`| | emi | object | All keys listed [here](https://razorpay.com/docs/api/partners/product-configuration/#update-a-product-configuration) are supported | **Response:** ```json { "id": "acc_GP4lfNA0iIMn5B", "type": "standard", "status": "created", "email": "gauri@example.org", "profile": { "category": "healthcare", "subcategory": "clinic", "addresses": { "registered": { "street1": "507, Koramangala 1st block", "street2": "MG Road-1", "city": "Bengalore", "state": "KARNATAKA", "postal_code": "560034", "country": "IN" } } }, "notes": [], "created_at": 1610603081, "phone": "9000090000", "reference_id": "randomId", "business_type": "partnership", "legal_business_name": "Acme Corp", "customer_facing_business_name": "ABCD Ltd" } ``` ------------------------------------------------------------------------------------------------------- ### Fetch a product configuration ```php $accountId = "acc_GP4lfNA0iIMn5B"; $productId = "acc_prd_HEgNpywUFctQ9e"; $api->account->fetch($accountId)->products()->fetch($productId); ``` **Parameters:** | Name | Type | Description | |-------------|-------------|---------------------------------------------| | accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | | productId* | string | The unique identifier of a product generated by Razorpay. | **Response:** ```json { "requested_configuration": { "payment_methods": [] }, "active_configuration": { "payment_capture": { "mode": "automatic", "refund_speed": "normal", "automatic_expiry_period": 7200 }, "settlements": { "account_number": null, "ifsc_code": null, "beneficiary_name": null }, "checkout": { "theme_color": "#FFFFFF", "flash_checkout": true }, "refund": { "default_refund_speed": "normal" }, "notifications": { "whatsapp": true, "sms": false, "email": [ "b963e252-1201-45b0-9c39-c53eceb0cfd6_load@gmail.com" ] }, "payment_methods": { "netbanking": { "enabled": true, "instrument": [ { "type": "retail", "bank": [ "hdfc", "sbin", "utib", "icic", "scbl", "yesb" ] } ] }, "wallet": { "enabled": true, "instrument": [ "airtelmoney", "freecharge", "jiomoney", "olamoney", "payzapp", "mobikwik" ] }, "upi": { "enabled": true, "instrument": [ "upi" ] } } }, "requirements": [ { "field_reference": "individual_proof_of_address", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/stakeholders/{stakeholderId}/documents", "status": "required", "reason_code": "document_missing" }, { "field_reference": "individual_proof_of_identification", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/stakeholders/{stakeholderId}/documents", "status": "required", "reason_code": "document_missing" }, { "field_reference": "business_proof_of_identification", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/documents", "status": "required", "reason_code": "document_missing" }, { "field_reference": "settlements.beneficiary_name", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/products/acc_prd_HEgNpywUFctQ9e", "status": "required", "reason_code": "field_missing" }, { "field_reference": "settlements.account_number", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/products/acc_prd_HEgNpywUFctQ9e", "status": "required", "reason_code": "field_missing" }, { "field_reference": "settlements.ifsc_code", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/products/acc_prd_HEgNpywUFctQ9e", "status": "required", "reason_code": "field_missing" }, { "field_reference": "contact_name", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0", "status": "required", "reason_code": "field_missing" }, { "field_reference": "name", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/stakeholders", "status": "required", "reason_code": "field_missing" }, { "field_reference": "customer_facing_business_name", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0", "status": "required", "reason_code": "field_missing" }, { "field_reference": "kyc.pan", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/stakeholders", "status": "required", "reason_code": "field_missing" } ], "tnc":{ "id": "tnc_IgohZaDBHRGjPv", "accepted": true, "accepted_at": 1641550798 }, "id": "acc_prd_HEgNpywUFctQ9e", "account_id": "acc_HQVlm3bnPmccC0", "product_name": "payment_gateway", "activation_status": "needs_clarification", "requested_at": 1625478849 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch Terms and Conditions for a Sub-Merchant ```php $productName = "payments"; $api->product->fetchTnc($productName); ``` **Parameters:** | Name | Type | Description | |-------------|-------------|---------------------------------------------| | productName* | string | The product family for which the relevant product to be requested for the sub-merchant. Possible value is `payments` | **Response:** ```json { "entity": "tnc_map", "product_name": "payments", "id": "tnc_map_HjOVhIdpVDZ0FB", "tnc": { "terms": "https://razorpay.com/terms", "privacy": "https://razorpay.com/privacy", "agreement": "https://razorpay.com/agreement" }, "last_published_at": 1640589653 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch a product configuration ```php $accountId = "acc_GP4lfNA0iIMn5B"; $productId = "acc_prd_HEgNpywUFctQ9e"; $api->account->fetch($accountId)->products()->fetch($productId); ``` **Parameters:** | Name | Type | Description | |-------------|-------------|---------------------------------------------| | accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | | productId* | string | The unique identifier of a product generated by Razorpay. | **Response:** ```json { "requested_configuration": { "payment_methods": [] }, "active_configuration": { "payment_capture": { "mode": "automatic", "refund_speed": "normal", "automatic_expiry_period": 7200 }, "settlements": { "account_number": null, "ifsc_code": null, "beneficiary_name": null }, "checkout": { "theme_color": "#FFFFFF", "flash_checkout": true }, "refund": { "default_refund_speed": "normal" }, "notifications": { "whatsapp": true, "sms": false, "email": [ "b963e252-1201-45b0-9c39-c53eceb0cfd6_load@gmail.com" ] }, "payment_methods": { "netbanking": { "enabled": true, "instrument": [ { "type": "retail", "bank": [ "hdfc", "sbin", "utib", "icic", "scbl", "yesb" ] } ] }, "wallet": { "enabled": true, "instrument": [ "airtelmoney", "freecharge", "jiomoney", "olamoney", "payzapp", "mobikwik" ] }, "upi": { "enabled": true, "instrument": [ "upi" ] } } }, "requirements": [ { "field_reference": "individual_proof_of_address", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/stakeholders/{stakeholderId}/documents", "status": "required", "reason_code": "document_missing" }, { "field_reference": "individual_proof_of_identification", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/stakeholders/{stakeholderId}/documents", "status": "required", "reason_code": "document_missing" }, { "field_reference": "business_proof_of_identification", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/documents", "status": "required", "reason_code": "document_missing" }, { "field_reference": "settlements.beneficiary_name", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/products/acc_prd_HEgNpywUFctQ9e", "status": "required", "reason_code": "field_missing" }, { "field_reference": "settlements.account_number", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/products/acc_prd_HEgNpywUFctQ9e", "status": "required", "reason_code": "field_missing" }, { "field_reference": "settlements.ifsc_code", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/products/acc_prd_HEgNpywUFctQ9e", "status": "required", "reason_code": "field_missing" }, { "field_reference": "contact_name", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0", "status": "required", "reason_code": "field_missing" }, { "field_reference": "name", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/stakeholders", "status": "required", "reason_code": "field_missing" }, { "field_reference": "customer_facing_business_name", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0", "status": "required", "reason_code": "field_missing" }, { "field_reference": "kyc.pan", "resolution_url": "/accounts/acc_HQVlm3bnPmccC0/stakeholders", "status": "required", "reason_code": "field_missing" } ], "tnc":{ "id": "tnc_IgohZaDBHRGjPv", "accepted": true, "accepted_at": 1641550798 }, "id": "acc_prd_HEgNpywUFctQ9e", "account_id": "acc_HQVlm3bnPmccC0", "product_name": "payment_gateway", "activation_status": "needs_clarification", "requested_at": 1625478849 } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/partners/product-configuration/)** razorpay/documents/stakeholder.md 0000644 00000024777 15002216177 0013265 0 ustar 00 ## Stakeholders ### Create an Stakeholder ```php $accountId = "acc_GP4lfNA0iIMn5B"; $api->account->fetch("acc_GP4lfNA0iIMn5B")->stakeholders()->create(array( "percentage_ownership" => 10, "name" => "Gaurav Kumar", "email" => "gaurav.kumar@example.com", "relationship" => array( "director" => true, "executive" => false ), "phone" => array( "primary" => "7474747474", "secondary" => "7474747474" ), "addresses" => array( "residential" => array( "street" => "506, Koramangala 1st block", "city" => "Bengaluru", "state" => "Karnataka", "postal_code" => "560034", "country" => "IN" ) ), "kyc" => array( "pan" => "AVOPB1111K" ), "notes" => array( "random_key_by_partner" => "random_value" ) )); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | email | string | The sub-merchant's business email address. | | name* | string | The stakeholder's name as per the PAN card. The maximum length is 255 characters. | | percentage_ownership | float | The stakeholder's ownership of the business in percentage. Only two decimal places are allowed. For example, `87.55`. The maximum length is 100 characters. | | relationship | boolean | The stakeholder's relationship with the account’s business. | | phone | object | All keys listed [here](https://razorpay.com/docs/api/partners/stakeholder/#create-a-stakeholder) are supported | | addresses | object | All keys listed [here](https://razorpay.com/docs/api/partners/stakeholder/#create-a-stakeholder) are supported | | kyc | object | All keys listed [here](https://razorpay.com/docs/api/partners/stakeholder/#create-a-stakeholder) are supported | | notes | object | A key-value pair | **Response:** ```json { "entity": "stakeholder", "relationship": { "director": true }, "phone": { "primary": "7474747474", "secondary": "7474747474" }, "notes": { "random_key_by_partner": "random_value" }, "kyc": { "pan": "AVOPB1111K" }, "id": "sth_GLGgm8fFCKc92m", "name": "Gaurav Kumar", "email": "gaurav.kumar@example.com", "percentage_ownership": 10, "addresses": { "residential": { "street": "506, Koramangala 1st block", "city": "Bengaluru", "state": "Karnataka", "postal_code": "560034", "country": "IN" } } } ``` ------------------------------------------------------------------------------------------------------- ### Edit Stakeholder ```php $accountId = "acc_GP4lfNA0iIMn5B"; $stakeholderId = "sth_GOQ4Eftlz62TSL"; $api->account->fetch($accountId)->stakeholders()->edit($stakeholderId, array( "percentage_ownership" => 20, "name" => "Gauri Kumar", "relationship" => array( "director" => false, "executive" => true ), "phone" => array( "primary" => "9898989898", "secondary" => "9898989898" ), "addresses" => array( "residential" => array( "street" => "507, Koramangala 1st block", "city" => "Bangalore", "state" => "Karnataka", "postal_code" => "560035", "country" => "IN" ) ), "kyc" => array( "pan" => "AVOPB1111J" ), "notes" => array( "random_key_by_partner" => "random_value2" ) )); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | | stakeholderId* | string | The unique identifier of the stakeholder whose details are to be fetched. | | name | string | The stakeholder's name as per the PAN card. The maximum length is 255 characters. | | percentage_ownership | float | The stakeholder's ownership of the business in percentage. Only two decimal places are allowed. For example, `87.55`. The maximum length is 100 characters. | | relationship | boolean | The stakeholder's relationship with the account’s business. | | phone | object | All keys listed [here](https://razorpay.com/docs/api/partners/stakeholder/#update-a-stakeholder) are supported | | addresses | object | All keys listed [here](https://razorpay.com/docs/api/partners/stakeholder/#update-a-stakeholder) are supported | | kyc | object | All keys listed [here](https://razorpay.com/docs/api/partners/stakeholder/#update-a-stakeholder) are supported | | notes | object | A key-value pair | **Response:** ```json { "id": "acc_GP4lfNA0iIMn5B", "type": "standard", "status": "created", "email": "gauri@example.org", "profile": { "category": "healthcare", "subcategory": "clinic", "addresses": { "registered": { "street1": "507, Koramangala 1st block", "street2": "MG Road-1", "city": "Bengalore", "state": "KARNATAKA", "postal_code": "560034", "country": "IN" } } }, "notes": [], "created_at": 1610603081, "phone": "9000090000", "reference_id": "randomId", "business_type": "partnership", "legal_business_name": "Acme Corp", "customer_facing_business_name": "ABCD Ltd" } ``` ------------------------------------------------------------------------------------------------------- ### Fetch all accounts ```php $accountId = "acc_GP4lfNA0iIMn5B"; $api->account->fetch($accountId)->stakeholders()->all(); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | **Response:** ```json { "entity": "collection", "items": [ { "id": "GZ13yPHLJof9IE", "entity": "stakeholder", "relationship": { "director": true }, "phone": { "primary": "9000090000", "secondary": "9000090000" }, "notes": { "random_key_by_partner": "random_value" }, "kyc": { "pan": "AVOPB1111K" }, "name": "Gaurav Kumar", "email": "gaurav.kumar@acme.org", "percentage_ownership": 10, "addresses": { "residential": { "street": "506, Koramangala 1st block", "city": "Bengaluru", "state": "Karnataka", "postal_code": "560034", "country": "in" } } } ], "count": 1 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch an stakeholder ```php $accountId = "acc_GP4lfNA0iIMn5B"; $stakeholderId = "sth_GOQ4Eftlz62TSL"; $api->account->fetch($accountId)->stakeholders()->fetch($stakeholderId); ``` **Parameters:** | Name | Type | Description | |-------------|-------------|---------------------------------------------| | accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | | stakeholderId* | string | The unique identifier of the stakeholder whose details are to be fetched. | **Response:** ```json { "entity": "stakeholder", "relationship": { "director": true }, "phone": { "primary": "9000090000", "secondary": "9000090000" }, "notes": { "random_key_by_partner": "random_value2" }, "kyc": { "pan": "AVOPB1111J" }, "id": "sth_GOQ4Eftlz62TSL", "name": "Gauri Kumar", "email": "gauri@example.com", "percentage_ownership": 20, "addresses": { "residential": { "street": "507, Koramangala 1st block", "city": "Bangalore", "state": "Karnataka", "postal_code": "560035", "country": "in" } } } ``` ### Upload stakeholders documents ```php $accountId = "acc_00000000000001"; $stakeholderId = "sth_00000000000001"; $payload = [ 'file'=> '/Users/your_name/Downloads/sample_uploaded.pdf', "document_type" => "aadhar_front" ]; $api->account->fetch($accountId)->stakeholders()->uploadStakeholderDoc($stakeholderId, $payload); ``` **Parameters:** | Name | Type | Description | |-------------|-------------|---------------------------------------------| | accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | | stakeholderId* | string | The unique identifier of the stakeholder whose details are to be fetched. | | file* | string | The URL generated once the business proof document is uploaded. | | document_type* | string | The documents valid for the proof type to be shared. In case of individual_proof_of_address, both the front and back of a document proof must be uploaded. Possible values : <br> individual_proof_of_identification: `personal_pan` <br><br> individual_proof_of_address : `voter_id_back`, `voter_id_front`, `aadhar_front`, `aadhar_back`, `passport_front`, `passport_back` | **Response:** ```json { "individual_proof_of_address": [ { "type": "aadhar_front", "url": "https://rzp.io/i/bzDAbNg" } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch stakeholders documents ```php $accountId = "acc_00000000000001"; $stakeholderId = "sth_00000000000001"; $api->account->fetch($accountId)->stakeholders()->fetchStakeholderDoc($stakeholderId); ``` **Parameters:** | Name | Type | Description | |-------------|-------------|---------------------------------------------| | accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | **Response:** ```json { "business_proof_of_identification": [ { "type": "business_proof_url", "url": "<https://rzp.io/i/bzDKbNg>" } ] } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/partners/stakeholder)** $result = $api->account->fetch("acc_M83Uw27KXuC7c8")->stakeholders()->fetchStakeholderDoc("sth_M83WuwmrCFa55g", $payload); $result = $api->account->fetch("acc_M83Uw27KXuC7c8")->stakeholders()->uploadStakeholderDoc("sth_M83WuwmrCFa55g", $payload); razorpay/documents/dispute.md 0000644 00000014032 15002216177 0012414 0 ustar 00 ## Document ### Fetch All Disputes ```php $api->dispute->all(); ``` **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "disp_Esz7KAitoYM7PJ", "entity": "dispute", "payment_id": "pay_EsyWjHrfzb59eR", "amount": 10000, "currency": "INR", "amount_deducted": 0, "reason_code": "pre_arbitration", "respond_by": 1590604200, "status": "open", "phase": "pre_arbitration", "created_at": 1590059211, "evidence": { "amount": 10000, "summary": null, "shipping_proof": null, "billing_proof": null, "cancellation_proof": null, "customer_communication": null, "proof_of_service": null, "explanation_letter": null, "refund_confirmation": null, "access_activity_log": null, "refund_cancellation_policy": null, "term_and_conditions": null, "others": null, "submitted_at": null } } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch a Dispute ```php $disputeId = "disp_0000000000000"; $api->dispute->fetch($disputeId); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | id* | string | The unique identifier of the dispute. | **Response:** ```json { "id": "disp_AHfqOvkldwsbqt", "entity": "dispute", "payment_id": "pay_EsyWjHrfzb59eR", "amount": 10000, "currency": "INR", "amount_deducted": 0, "reason_code": "pre_arbitration", "respond_by": 1590604200, "status": "open", "phase": "pre_arbitration", "created_at": 1590059211, "evidence": { "amount": 10000, "summary": "goods delivered", "shipping_proof": null, "billing_proof": null, "cancellation_proof": null, "customer_communication": null, "proof_of_service": null, "explanation_letter": null, "refund_confirmation": null, "access_activity_log": null, "refund_cancellation_policy": null, "term_and_conditions": null, "others": null, "submitted_at": null } } ``` ------------------------------------------------------------------------------------------------------- ### Fetch a Dispute ```php $disputeId = "disp_0000000000000"; $api->dispute->fetch($disputeId)->accept(); ``` **Response:** ```json { "id": "disp_AHfqOvkldwsbqt", "entity": "dispute", "payment_id": "pay_EsyWjHrfzb59eR", "amount": 10000, "currency": "INR", "amount_deducted": 10000, "reason_code": "pre_arbitration", "respond_by": 1590604200, "status": "lost", "phase": "pre_arbitration", "created_at": 1590059211, "evidence": { "amount": 10000, "summary": null, "shipping_proof": null, "billing_proof": null, "cancellation_proof": null, "customer_communication": null, "proof_of_service": null, "explanation_letter": null, "refund_confirmation": null, "access_activity_log": null, "refund_cancellation_policy": null, "term_and_conditions": null, "others": null, "submitted_at": null } } ``` ------------------------------------------------------------------------------------------------------- ### Contest a Dispute ```php //Use this API sample code for draft $disputeId = "disp_0000000000000"; $api->dispute->fetch($disputeId)->contest(array("amount" => 5000, "summary" => "goods delivered", "shipping_proof" => array("doc_EFtmUsbwpXwBH9", "doc_EFtmUsbwpXwBH8"), "others" => array(array("type" => "receipt_signed_by_customer", "document_ids" => array("doc_EFtmUsbwpXwBH1", "doc_EFtmUsbwpXwBH7"))), "action" => "draft")); //Use this API sample code for submit $api->dispute->fetch($disputeId)->contest(array("billing_proof" => array("doc_EFtmUsbwpXwBG9", "doc_EFtmUsbwpXwBG8"), "action" => "submit")); ``` **Response:** ```json // Draft { "id": "disp_AHfqOvkldwsbqt", "entity": "dispute", "payment_id": "pay_EsyWjHrfzb59eR", "amount": 10000, "currency": "INR", "amount_deducted": 0, "reason_code": "chargeback", "respond_by": 1590604200, "status": "open", "phase": "chargeback", "created_at": 1590059211, "evidence": { "amount": 5000, "summary": "goods delivered", "shipping_proof": [ "doc_EFtmUsbwpXwBH9", "doc_EFtmUsbwpXwBH8" ], "billing_proof": null, "cancellation_proof": null, "customer_communication": null, "proof_of_service": null, "explanation_letter": null, "refund_confirmation": null, "access_activity_log": null, "refund_cancellation_policy": null, "term_and_conditions": null, "others": [ { "type": "receipt_signed_by_customer", "document_ids": [ "doc_EFtmUsbwpXwBH1", "doc_EFtmUsbwpXwBH7" ] } ], "submitted_at": null } } //Submit { "id": "disp_AHfqOvkldwsbqt", "entity": "dispute", "payment_id": "pay_EsyWjHrfzb59eR", "amount": 10000, "currency": "INR", "amount_deducted": 0, "reason_code": "chargeback", "respond_by": 1590604200, "status": "under_review", "phase": "chargeback", "created_at": 1590059211, "evidence": { "amount": 5000, "summary": "goods delivered", "shipping_proof": [ "doc_EFtmUsbwpXwBH9", "doc_EFtmUsbwpXwBH8" ], "billing_proof": [ "doc_EFtmUsbwpXwBG9", "doc_EFtmUsbwpXwBG8" ], "cancellation_proof": null, "customer_communication": null, "proof_of_service": null, "explanation_letter": null, "refund_confirmation": null, "access_activity_log": null, "refund_cancellation_policy": null, "term_and_conditions": null, "others": [ { "type": "receipt_signed_by_customer", "document_ids": [ "doc_EFtmUsbwpXwBH1", "doc_EFtmUsbwpXwBH7" ] } ], "submitted_at": 1590603200 } } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/documents)** razorpay/documents/papernach.md 0000644 00000053103 15002216177 0012702 0 ustar 00 ## Paper NACH ### Create customer ```php $api->customer->create(array('name' => 'Razorpay User', 'email' => 'customer@razorpay.com','contact'=>'9123456780', 'fail_existing'=> '0', 'notes'=> array('notes_key_1'=> 'Tea, Earl Grey, Hot','notes_key_2'=> 'Tea, Earl Grey… decaf'))); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | name* | string | Name of the customer | | email | string | Email of the customer | | contact | string | Contact number of the customer | | fail_existing | string | If a customer with the same details already exists, the request throws an exception by default. Possible value is `0` or `1`| | notes | array | A key-value pair | **Response:** ```json { "id": "cust_1Aa00000000003", "entity": "customer", "name": "Gaurav Kumar", "email": "Gaurav.Kumar@example.com", "contact": "9000000000", "gstin": null, "notes": { "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey… decaf." }, "created_at": 1582033731 } ``` ------------------------------------------------------------------------------------------------------- ### Create order ```php $api->order->create(array('amount' => 0,'currency' => 'INR','method' => 'nach','customer_id' => 'cust_1Aa00000000001','receipt' => 'Receipt No. 1', 'notes' => array('notes_key_1' => 'Beam me up Scotty','notes_key_2' => 'Engage'),'token' => array('auth_type' => 'physical','max_amount' => 10000000,'expire_at' => 2709971120,'notes' => array('notes_key_1' => 'Tea, Earl Grey, Hot','notes_key_2' => 'Tea, Earl Grey… decaf.'),'bank_account' => array('account_number' => '11214311215411','ifsc_code' => 'HDFC0000001','beneficiary_name' => 'Gaurav Kumar','account_type' => 'savings'),'nach' => array('form_reference1' => 'Recurring Payment for Gaurav Kumar','form_reference2' => 'Method Paper NACH','description' => 'Paper NACH Gaurav Kumar')))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | amount* | integer | The amount to be captured (should be equal to the authorized amount, in paise) | | currency* | string | The currency of the payment (defaults to INR) | | customerId* | string | The id of the customer to be fetched | | method* | string | Payment method used to make the registration transaction. Possible value is `nach`. | | receipt | string | Your system order reference id. | | token | array | All parameters listed [here](https://razorpay.com/docs/api/payments/recurring-payments/paper-nach/create-authorization-transaction/#112-create-an-order) are supported | | notes | object | A key-value pair | **Response:** ```json { "id":"order_1Aa00000000001", "entity":"order", "amount":0, "amount_paid":0, "amount_due":0, "currency":"INR", "receipt":"rcptid #10", "offer_id":null, "offers":{ "entity":"collection", "count":0, "items":[ ] }, "status":"created", "attempts":0, "notes":{ "notes_key_1":"Beam me up Scotty", "notes_key_2":"Engage" }, "created_at":1579775420, "token":{ "method":"nach", "notes":{ "notes_key_1":"Tea, Earl Grey, Hot", "notes_key_2":"Tea, Earl Grey… decaf." }, "recurring_status":null, "failure_reason":null, "currency":"INR", "max_amount":10000000, "auth_type":"physical", "expire_at":1580480689, "nach":{ "create_form":true, "form_reference1":"Recurring Payment for Gaurav Kumar", "form_reference2":"Method Paper NACH", "prefilled_form":"https://rzp.io/i/bitw", "upload_form_url":"https://rzp.io/i/gts", "description":"Paper NACH Gaurav Kumar" }, "bank_account":{ "ifsc":"HDFC0000001", "bank_name":"HDFC Bank", "name":"Gaurav Kumar", "account_number":"11214311215411", "account_type":"savings", "beneficiary_email":"gaurav.kumar@example.com", "beneficiary_mobile":"9876543210" }, "first_payment_amount":0 } } ``` ------------------------------------------------------------------------------------------------------- ### Create an Authorization Payment Please refer this [doc](https://razorpay.com/docs/api/recurring-payments/paper-nach/authorization-transaction/#113-create-an-authorization-payment) for authorization payment ------------------------------------------------------------------------------------------------------- ### Create registration link ```php $api->subscription->createSubscriptionRegistration(array('customer' => array('name' => 'Gaurav Kumar','email' => 'gaurav.kumar@example.com','contact' => '9123456780'),'amount' => 0,'currency' => 'INR','type' => 'link','description' => '12 p.m. Meals','subscription_registration' => array('method' => 'nach','auth_type' => 'physical','bank_account' => array('beneficiary_name' => 'Gaurav Kumar','account_number' => '11214311215411','account_type' => 'savings','ifsc_code' => 'HDFC0001233'),'nach' => array('form_reference1' => 'Recurring Payment for Gaurav Kumar','form_reference2' => 'Method Paper NACH'),'expire_at' => 1947483647,'max_amount' => 50000),'receipt' => 'Receipt No. 1','sms_notify' => 1,'email_notify' => 1,'expire_by' => 1647483647,'notes' => array('note_key 1' => 'Beam me up Scotty','note_key 2' => 'Tea. Earl Gray. Hot.'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | customer | array | All parameters listed [here](https://razorpay.com/docs/api/payments/recurring-payments/paper-nach/create-authorization-transaction/#121-create-a-registration-link) | | type* | string | In this case, the value is `link`. | | currency* | string | The 3-letter ISO currency code for the payment. Currently, only `INR` is supported. | | amount* | integer | The payment amount in the smallest currency sub-unit. | | description* | string | A description that appears on the hosted page. For example, `12:30 p.m. Thali meals (Gaurav Kumar`). | | subscription_registration | array | All parameters listed [here](https://razorpay.com/docs/api/payments/recurring-payments/paper-nach/create-authorization-transaction/#121-create-a-registration-link) | | sms_notify | boolean | SMS notifications are to be sent by Razorpay (default : 1) | | email_notify | boolean | Email notifications are to be sent by Razorpay (default : 1) | | expire_by | integer | The timestamp, in Unix format, till when the customer can make the authorization payment. | | receipt | string | Your system order reference id. | | notes | array | A key-value pair | **Response:** ```json { "id": "inv_FHrZiAubEzDdaq", "entity": "invoice", "receipt": "Receipt No. 27", "invoice_number": "Receipt No. 27", "customer_id": "cust_BMB3EwbqnqZ2EI", "customer_details": { "id": "cust_BMB3EwbqnqZ2EI", "name": "Gaurav Kumar", "email": "gaurav.kumar@example.com", "contact": "9123456780", "gstin": null, "billing_address": null, "shipping_address": null, "customer_name": "Gaurav Kumar", "customer_email": "gaurav.kumar@example.com", "customer_contact": "9123456780" }, "order_id": "order_FHrZiBOkWHZPOp", "line_items": [], "payment_id": null, "status": "issued", "expire_by": 1647483647, "issued_at": 1595491154, "paid_at": null, "cancelled_at": null, "expired_at": null, "sms_status": "sent", "email_status": "sent", "date": 1595491154, "terms": null, "partial_payment": false, "gross_amount": 0, "tax_amount": 0, "taxable_amount": 0, "amount": 0, "amount_paid": 0, "amount_due": 0, "currency": "INR", "currency_symbol": "₹", "description": "12 p.m. Meals", "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "comment": null, "short_url": "https://rzp.io/i/bzDYbNg", "view_less": true, "billing_start": null, "billing_end": null, "type": "link", "group_taxes_discounts": false, "created_at": 1595491154, "idempotency_key": null, "token": { "method": "nach", "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "recurring_status": null, "failure_reason": null, "currency": "INR", "max_amount": 50000, "auth_type": "physical", "expire_at": 1947483647, "nach": { "create_form": true, "form_reference1": "Recurring Payment for Gaurav Kumar", "form_reference2": "Method Paper NACH", "prefilled_form": "https://rzp.io/i/exdIzYN", "upload_form_url": "https://rzp.io/i/bzDYbNg", "description": "12 p.m. Meals" }, "bank_account": { "ifsc": "HDFC0001233", "bank_name": "HDFC Bank", "name": "Gaurav Kumar", "account_number": "11214311215411", "account_type": "savings", "beneficiary_email": "gaurav.kumar@example.com", "beneficiary_mobile": "9123456780" }, "first_payment_amount": 0 }, "nach_form_url": "https://rzp.io/i/exdIzYN" } ``` ------------------------------------------------------------------------------------------------------- ### Send/Resend notifications ```php $api->invoice->fetch($invoiceId)->notifyBy($medium); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | invoiceId* | string | The id of the invoice to be notified | | medium* | string | `sms`/`email`, Medium through which notification should be sent. | **Response:** ```json { "success": true } ``` ------------------------------------------------------------------------------------------------------- ### Cancel a registration link ```php $api->invoice->fetch($invoiceId)->cancel(); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | invoiceId* | string | The id of the invoice to be cancelled | **Response:** ```json { "id": "inv_FHrZiAubEzDdaq", "entity": "invoice", "receipt": "Receipt No. 27", "invoice_number": "Receipt No. 27", "customer_id": "cust_BMB3EwbqnqZ2EI", "customer_details": { "id": "cust_BMB3EwbqnqZ2EI", "name": "Gaurav Kumar", "email": "gaurav.kumar@example.com", "contact": "9123456780", "gstin": null, "billing_address": null, "shipping_address": null, "customer_name": "Gaurav Kumar", "customer_email": "gaurav.kumar@example.com", "customer_contact": "9123456780" }, "order_id": "order_FHrZiBOkWHZPOp", "line_items": [], "payment_id": null, "status": "cancelled", "expire_by": 1647483647, "issued_at": 1595491154, "paid_at": null, "cancelled_at": 1595491339, "expired_at": null, "sms_status": "sent", "email_status": "sent", "date": 1595491154, "terms": null, "partial_payment": false, "gross_amount": 0, "tax_amount": 0, "taxable_amount": 0, "amount": 0, "amount_paid": 0, "amount_due": 0, "currency": "INR", "currency_symbol": "₹", "description": "12 p.m. Meals", "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "comment": null, "short_url": "https://rzp.io/i/bzDYbNg", "view_less": true, "billing_start": null, "billing_end": null, "type": "link", "group_taxes_discounts": false, "created_at": 1595491154, "idempotency_key": null, "token": { "method": "nach", "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "recurring_status": null, "failure_reason": null, "currency": "INR", "max_amount": 50000, "auth_type": "physical", "expire_at": 1947483647, "nach": { "create_form": true, "form_reference1": "Recurring Payment for Gaurav Kumar", "form_reference2": "Method Paper NACH", "prefilled_form": "https://rzp.io/i/tSYd5aV", "upload_form_url": "https://rzp.io/i/bzDYbNg", "description": "12 p.m. Meals" }, "bank_account": { "ifsc": "HDFC0001233", "bank_name": "HDFC Bank", "name": "Gaurav Kumar", "account_number": "11214311215411", "account_type": "savings", "beneficiary_email": "gaurav.kumar@example.com", "beneficiary_mobile": "9123456780" }, "first_payment_amount": 0 }, "nach_form_url": "https://rzp.io/i/tSYd5aV" } ``` ------------------------------------------------------------------------------------------------------- ### Fetch Payment ID using Order ID ```php $api->order->fetch($orderId)->payments(); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | orderId* | string | Order id for which payment id need to be fetched | **Response:** ```json { "entity":"collection", "count":1, "items":[ { "id":"pay_1Aa00000000003", "entity":"payment", "amount":0, "currency":"INR", "status":"captured", "order_id":"order_1Aa00000000003", "invoice_id":"inv_1Aa00000000003", "international":false, "method":"nach", "amount_refunded":0, "refund_status":null, "captured":true, "description":"12 p.m. Meals", "card_id":null, "bank":"HDFC", "wallet":null, "vpa":null, "email":"gaurav.kumar@example.com", "contact":"99876543210", "customer_id":"cust_1Aa00000000002", "token_id":"token_1Aa00000000003", "notes":{ "note_key 1":"Beam me up Scotty", "note_key 2":"Tea. Earl Gray. Hot." }, "fee":0, "tax":0, "error_code":null, "error_description":null, "created_at":1580109147 } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch token by payment ID ```php $api->payment->fetch($paymentId); ``` **Parameters:** | Name | Type | Description | |------------|--------|-----------------------------------| | paymentId* | string | Id of the payment to be retrieved | **Response:** ```json { "id": "pay_EnLNTjINiPkMEZ", "entity": "payment", "amount": 0, "currency": "INR", "status": "captured", "order_id": "order_EnLLfglmKksr4K", "invoice_id": "inv_EnLLfgCzRfcMuh", "international": false, "method": "nach", "amount_refunded": 0, "refund_status": null, "captured": true, "description": "Invoice #inv_EnLLfgCzRfcMuh", "card_id": null, "bank": "UTIB", "wallet": null, "vpa": null, "email": "gaurav.kumar@example.com", "contact": "+919876543210", "customer_id": "cust_DtHaBuooGHTuyZ", "token_id": "token_EnLNTnn7uyRg5V", "notes": { "note_key 1": "Beam me up Scotty", "note_key 2": "Tea. Earl Gray. Hot." }, "fee": 0, "tax": 0, "error_code": null, "error_description": null, "error_source": null, "error_step": null, "error_reason": null, "acquirer_data": {}, "created_at": 1588827564 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch tokens by customer ID ```php $api->customer->fetch($customerId)->tokens()->all(); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | customerId* | string | The id of the customer to be fetched | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "token_EhYgIE3pOyMQpD", "entity": "token", "token": "3mQ5Czc6APNppI", "bank": "HDFC", "wallet": null, "method": "nach", "vpa": null, "recurring": true, "recurring_details": { "status": "confirmed", "failure_reason": null }, "auth_type": "physical", "mrn": null, "used_at": 1587564373, "created_at": 1587564373, "dcc_enabled": false } ] } ``` ------------------------------------------------------------------------------------------------------- ### Delete token ```php $api->customer->fetch($customerId)->tokens()->delete($tokenId); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | customerId* | string | The id of the customer to be fetched | | tokenId* | string | The id of the token to be fetched | **Response:** ```json { "deleted": true } ``` ------------------------------------------------------------------------------------------------------- ### Create an order to charge the customer ```php $api->order->create(array('amount' => 1000,'currency' => 'INR','payment_capture' => true,'receipt' => 'Receipt No. 1','notes'=> array('notes_key_1' => 'Tea, Earl Grey, Hot', 'notes_key_2' => 'Tea, Earl Grey… decaf.'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | amount* | integer | Amount of the order to be paid | | currency* | string | Currency of the order. Currently only `INR` is supported. | | payment_capture* | boolean | Indicates whether payment status should be changed to captured automatically or not. Possible values: true - Payments are captured automatically. false - Payments are not captured automatically. | | receipt | string | Your system order reference id. | | notes | array | A key-value pair | **Response:** ```json { "id":"order_1Aa00000000002", "entity":"order", "amount":1000, "amount_paid":0, "amount_due":1000, "currency":"INR", "receipt":"Receipt No. 1", "offer_id":null, "status":"created", "attempts":0, "notes":{ "notes_key_1":"Tea, Earl Grey, Hot", "notes_key_2":"Tea, Earl Grey… decaf." }, "created_at":1579782776 } ``` ------------------------------------------------------------------------------------------------------- ### Create a Recurring Payment ```php $api->payment->createRecurring(array('email'=>'gaurav.kumar@example.com','contact'=>'9123456789','amount'=>100,'currency'=>'INR','order_id'=>'order_1Aa00000000002','customer_id'=>'cust_1Aa00000000001','token'=>'token_1Aa00000000001','recurring'=>'1','description'=>'Creating recurring payment for Gaurav Kumar')); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | email* | string | The customer's email address. | | contact* | string | The customer's phone number. | | amount* | integer | The amount you want to charge your customer. This should be the same as the amount in the order. | | currency* | string | The 3-letter ISO currency code for the payment. Currently, only `INR` is supported. | | order_id* | string | The unique identifier of the order created. | | customer_id* | string | The `customer_id` for the customer you want to charge. | | token* | string | The `token_id` generated when the customer successfully completes the authorization payment. Different payment instruments for the same customer have different `token_id`.| | recurring* | string | Determines if recurring payment is enabled or not. Possible values:<br>* `1` - Recurring is enabled.* `0` - Recurring is not enabled.| | description | string | A user-entered description for the payment.| | notes | array | Key-value pair that can be used to store additional information about the entity. Maximum 15 key-value pairs, 256 characters (maximum) each. | **Response:** ```json { "razorpay_payment_id" : "pay_1Aa00000000001", "razorpay_order_id" : "order_1Aa00000000001", "razorpay_signature" : "9ef4dffbfd84f1318f6739a3ce19f9d85851857ae648f114332d8401e0949a3d" } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/recurring-payments/paper-nach/authorization-transaction/)** razorpay/documents/fund.md 0000644 00000004712 15002216177 0011677 0 ustar 00 ## Funds ### Create a fund account ```php $api->fundAccount->create(array('customer_id'=>$customerId,'account_type'=>'bank_account','bank_account'=>array('name'=>'Gaurav Kumar', 'account_number'=>'11214311215411', 'ifsc'=>'HDFC0000053'))); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | customerId* | string | The id of the customer to be fetched | | account_type* | string | The bank_account to be linked to the customer ID | | bank_account* | array | All keys listed [here](https://razorpay.com/docs/payments/customers/customer-fund-account-api/#create-a-fund-account) are supported | **Response:** ```json { "id": "fa_JcXaLomo4ck5IY", "entity": "fund_account", "customer_id": "cust_JZse2vlC5nK9AQ", "account_type": "bank_account", "bank_account": { "ifsc": "HDFC0000053", "bank_name": "HDFC Bank", "name": "Gaurav Kumar", "notes": [], "account_number": "11214311215411" }, "batch_id": null, "active": true, "created_at": 1654154246 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch all fund accounts ```php $api->fundAccount->all(array('customer_id'=>$customerIds)); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | customerId* | string | The id of the customer to be fetched | **Response:** ```json { "entity": "collection", "count": 2, "items": [ { "id": "fa_JcXYtecLkhW74k", "entity": "fund_account", "customer_id": "cust_JZse2vlC5nK9AQ", "account_type": "bank_account", "bank_account": { "ifsc": "HDFC0000053", "bank_name": "HDFC Bank", "name": "Gaurav Kumar", "notes": [], "account_number": "11214311215411" }, "batch_id": null, "active": true, "created_at": 1654154163 } ] } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/payments/customers/customer-fund-account-api/)** razorpay/documents/invoice.md 0000644 00000044460 15002216177 0012403 0 ustar 00 ## Invoices ### Create Invoice Request #1 In this example, an invoice is created using the customer and item details. Here, the customer and item are created while creating the invoice. ```php $api->invoice->create(array ('type' => 'invoice','description' => 'Invoice for the month of January 2020','partial_payment' => true,'customer' =>array ('name' => 'Gaurav Kumar','contact' => 9999999999,'email' => 'gaurav.kumar@example.com','billing_address' => array ('line1' => 'Ground & 1st Floor, SJR Cyber Laskar','line2' => 'Hosur Road','zipcode' => '560068','city' => 'Bengaluru','state' => 'Karnataka','country' => 'in'),'shipping_address' => array ('line1' => 'Ground & 1st Floor, SJR Cyber Laskar','line2' => 'Hosur Road','zipcode' => '560068','city' => 'Bengaluru','state' => 'Karnataka','country' => 'in')),'line_items' => array (array ('name' => 'Master Cloud Computing in 30 Days','description' => 'Book by Ravena Ravenclaw','amount' => 399,'currency' => 'USD','quantity' => 1)),'sms_notify' => 1,'email_notify' => 1,'currency' => 'USD','expire_by' => 1589765167)); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| |type* | string | entity type (here its invoice) | |description | string | A brief description of the invoice. | |customer_id | string | customer id for which invoice need be raised | |draft | string | Invoice is created in draft state when value is set to `1` | | customer* | array | All parameters listed [here](https://razorpay.com/docs/api/payments/invoices/#create-an-invoice) are supported | | line_items | array | All parameters listed [here](https://razorpay.com/docs/api/payments/invoices/#create-an-invoice) are supported | |expire_by | array | Details of the line item that is billed in the invoice. | |sms_notify | array | Details of the line item that is billed in the invoice. | |email_notify | array | Details of the line item that is billed in the invoice. | |partial_payment | boolean | Indicates whether customers can make partial payments on the invoice . Possible values: true - Customer can make partial payments. false (default) - Customer cannot make partial payments. | | currency* | string | The currency of the payment (defaults to INR) | Request #2 In this example, an invoice is created using existing `customer_id` and `item_id` ```php $api->invoice->create(array ('type' => 'invoice','date' => 1589994898, 'customer_id'=> 'cust_E7q0trFqXgExmT', 'line_items'=>array(array('item_id'=>'item_DRt61i2NnL8oy6')))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| |type* | string | entity type (here its invoice) | |description | string | A brief description of the invoice. | |customer_id | string | customer id for which invoice need be raised | | customer* | array | All parameters listed [here](https://razorpay.com/docs/api/payments/invoices/#create-an-invoice) are supported | | line_items | array | All parameters listed [here](https://razorpay.com/docs/api/payments/invoices/#create-an-invoice) are supported | | sms_notify | boolean | SMS notifications are to be sent by Razorpay (default : 1) | | currency* (conditionally mandatory) | string | The 3-letter ISO currency code for the payment. Currently, only `INR` is supported. | | email_notify | boolean | Email notifications are to be sent by Razorpay (default : 1) | | expire_by | integer | The timestamp, in Unix format, till when the customer can make the authorization payment. | **Response:** For create invoice response please click [here](https://razorpay.com/docs/api/invoices/#create-an-invoice) ------------------------------------------------------------------------------------------------------- ### Fetch all invoices ```php $api->invoice->all(); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| |type | string | entity type (here its invoice) | |payment_id | string | The unique identifier of the payment made by the customer against the invoice. | |customer_id | string | The unique identifier of the customer. | |receipt | string | The unique receipt number that you entered for internal purposes. | **Response:** For fetch all invoice response please click [here](https://razorpay.com/docs/api/invoices/#fetch-multiple-invoices) ------------------------------------------------------------------------------------------------------- ### Fetch invoice ```php $api->invoice->fetch($invoiceId); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | invoiceId* | string | The id of the invoice to be fetched | **Response:** ```json { "amount": 1000, "amount_due": 1000, "amount_paid": 0, "billing_end": null, "billing_start": null, "cancelled_at": null, "comment": null, "created_at": 1653596202, "currency": "INR", "currency_symbol": "₹", "customer_details": { "billing_address": null, "contact": "99991111999", "customer_contact": "99991111999", "customer_email": "gauraa.kumar@example.com", "customer_name": "Gauravss Kumar", "email": "gauraa.kumar@example.com", "gstin": null, "id": "cust_JDdNazagOgg9Ig", "name": "Gauravss Kumar", "shipping_address": null }, "customer_id": "cust_JDdNazagOgg9Ig", "date": 1589994898, "description": null, "email_status": "sent", "entity": "invoice", "expire_by": null, "expired_at": null, "first_payment_min_amount": null, "gross_amount": 1000, "group_taxes_discounts": false, "id": "inv_JZz7g9hSZS9IsG", "idempotency_key": null, "invoice_number": null, "issued_at": 1653596202, "line_items": [ { "amount": 1000, "currency": "INR", "description": null, "gross_amount": 1000, "hsn_code": null, "id": "li_JZz7gAI2W3Arg2", "item_id": "item_J7lZCyxMVeEtYB", "name": "Test item", "net_amount": 1000, "quantity": 1, "ref_id": null, "ref_type": null, "sac_code": null, "tax_amount": 0, "tax_inclusive": false, "tax_rate": null, "taxable_amount": 1000, "taxes": [], "type": "invoice", "unit": null, "unit_amount": 1000 } ], "notes": [], "order_id": "order_JZz7gBTZjtUgBO", "paid_at": null, "partial_payment": false, "payment_id": null, "receipt": null, "reminder_status": null, "short_url": "https://rzp.io/i/DGpanoT", "sms_status": "pending", "status": "issued", "subscription_status": null, "supply_state_code": null, "tax_amount": 0, "taxable_amount": 1000, "terms": null, "type": "invoice", "user_id": null, "view_less": true } ``` ------------------------------------------------------------------------------------------------------- ### Update invoice ```php $api->invoice->fetch($invoiceId)->edit(array('line_items' => array(array('id' => 'li_DAweOizsysoJU6','name' => 'Book / English August - Updated name and quantity','quantity' => 1),array('name' => 'Book / A Wild Sheep Chase','amount' => 200,'currency' => 'INR','quantity' => 1)),'notes' => array('updated-key' => 'An updated note.'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | invoiceId* | string | The id of the invoice to be fetched | | line_items | array | All parameters listed [here](https://razorpay.com/docs/api/payments/invoices/#update-an-invoice) are supported | | notes | array | key value pair | **Response:** ```json { "id": "inv_DAweOiQ7amIUVd", "entity": "invoice", "receipt": "#0961", "invoice_number": "#0961", "customer_id": "cust_DAtUWmvpktokrT", "customer_details": { "id": "cust_DAtUWmvpktokrT", "name": "Gaurav Kumar", "email": "gaurav.kumar@example.com", "contact": "9977886633", "gstin": null, "billing_address": { "id": "addr_DAtUWoxgu91obl", "type": "billing_address", "primary": true, "line1": "318 C-Wing, Suyog Co. Housing Society Ltd.", "line2": "T.P.S Road, Vazira, Borivali", "zipcode": "400092", "city": "Mumbai", "state": "Maharashtra", "country": "in" }, "shipping_address": null, "customer_name": "Gaurav Kumar", "customer_email": "gaurav.kumar@example.com", "customer_contact": "9977886633" }, "order_id": null, "line_items": [ { "id": "li_DAweOizsysoJU6", "item_id": null, "name": "Book / English August - Updated name and quantity", "description": "150 points in Quidditch", "amount": 400, "unit_amount": 400, "gross_amount": 400, "tax_amount": 0, "taxable_amount": 400, "net_amount": 400, "currency": "INR", "type": "invoice", "tax_inclusive": false, "hsn_code": null, "sac_code": null, "tax_rate": null, "unit": null, "quantity": 1, "taxes": [] } ], "payment_id": null, "status": "draft", "expire_by": 1567103399, "issued_at": null, "paid_at": null, "cancelled_at": null, "expired_at": null, "sms_status": null, "email_status": null, "date": 1566891149, "terms": null, "partial_payment": false, "gross_amount": 600, "tax_amount": 0, "taxable_amount": 600, "amount": 600, "amount_paid": null, "amount_due": null, "currency": "INR", "currency_symbol": "₹", "description": "This is a test invoice.", "notes": { "updated-key": "An updated note." }, "comment": null, "short_url": null, "view_less": true, "billing_start": null, "billing_end": null, "type": "invoice", "group_taxes_discounts": false, "created_at": 1566906474, "idempotency_key": null } ``` ------------------------------------------------------------------------------------------------------- ### Issue an invoice Only an invoice in the `draft` state can be issued. ```php $api->invoice->fetch($invoiceId)->issue(); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | invoiceId* | string | The id of the invoice to be issued | **Response:** ```json { "id": "inv_DAweOiQ7amIUVd", "entity": "invoice", "receipt": "#0961", "invoice_number": "#0961", "customer_id": "cust_DAtUWmvpktokrT", "customer_details": { "id": "cust_DAtUWmvpktokrT", "name": "Gaurav Kumar", "email": "gaurav.kumar@example.com", "contact": "9977886633", "gstin": null, "billing_address": { "id": "addr_DAtUWoxgu91obl", "type": "billing_address", "primary": true, "line1": "318 C-Wing, Suyog Co. Housing Society Ltd.", "line2": "T.P.S Road, Vazira, Borivali", "zipcode": "400092", "city": "Mumbai", "state": "Maharashtra", "country": "in" }, "shipping_address": null, "customer_name": "Gaurav Kumar", "customer_email": "gaurav.kumar@example.com", "customer_contact": "9977886633" }, "order_id": "order_DBG3P8ZgDd1dsG", "line_items": [ { "id": "li_DAweOizsysoJU6", "item_id": null, "name": "Book / English August - Updated name and quantity", "description": "150 points in Quidditch", "amount": 400, "unit_amount": 400, "gross_amount": 400, "tax_amount": 0, "taxable_amount": 400, "net_amount": 400, "currency": "INR", "type": "invoice", "tax_inclusive": false, "hsn_code": null, "sac_code": null, "tax_rate": null, "unit": null, "quantity": 1, "taxes": [] }, { "id": "li_DAwjWQUo07lnjF", "item_id": null, "name": "Book / A Wild Sheep Chase", "description": null, "amount": 200, "unit_amount": 200, "gross_amount": 200, "tax_amount": 0, "taxable_amount": 200, "net_amount": 200, "currency": "INR", "type": "invoice", "tax_inclusive": false, "hsn_code": null, "sac_code": null, "tax_rate": null, "unit": null, "quantity": 1, "taxes": [] } ], "payment_id": null, "status": "issued", "expire_by": 1567103399, "issued_at": 1566974805, "paid_at": null, "cancelled_at": null, "expired_at": null, "sms_status": null, "email_status": null, "date": 1566891149, "terms": null, "partial_payment": false, "gross_amount": 600, "tax_amount": 0, "taxable_amount": 600, "amount": 600, "amount_paid": 0, "amount_due": 600, "currency": "INR", "currency_symbol": "₹", "description": "This is a test invoice.", "notes": { "updated-key": "An updated note." }, "comment": null, "short_url": "https://rzp.io/i/K8Zg72C", "view_less": true, "billing_start": null, "billing_end": null, "type": "invoice", "group_taxes_discounts": false, "created_at": 1566906474, "idempotency_key": null } ``` ------------------------------------------------------------------------------------------------------- ### Delete an invoice ```php $api->invoice->fetch($invoiceId)->delete(); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | invoiceId* | string | The id of the invoice to be deleted | **Response:** ``` [] ``` ------------------------------------------------------------------------------------------------------- ### Cancel an invoice ```php $api->invoice->fetch($invoiceId)->cancel(); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | invoiceId* | string | The id of the invoice to be cancelled | **Response:** ```json { "amount": 1000, "amount_due": 1000, "amount_paid": 0, "billing_end": null, "billing_start": null, "cancelled_at": 1654159207, "comment": null, "created_at": 1653596202, "currency": "INR", "currency_symbol": "₹", "customer_details": { "billing_address": null, "contact": "99991111999", "customer_contact": "99991111999", "customer_email": "gauraa.kumar@example.com", "customer_name": "Gauravss Kumar", "email": "gauraa.kumar@example.com", "gstin": null, "id": "cust_JDdNazagOgg9Ig", "name": "Gauravss Kumar", "shipping_address": null }, "customer_id": "cust_JDdNazagOgg9Ig", "date": 1589994898, "description": null, "email_status": "sent", "entity": "invoice", "expire_by": null, "expired_at": null, "first_payment_min_amount": null, "gross_amount": 1000, "group_taxes_discounts": false, "id": "inv_JZz7g9hSZS9IsG", "idempotency_key": null, "invoice_number": null, "issued_at": 1653596202, "line_items": [ { "amount": 1000, "currency": "INR", "description": null, "gross_amount": 1000, "hsn_code": null, "id": "li_JZz7gAI2W3Arg2", "item_id": "item_J7lZCyxMVeEtYB", "name": "Test item", "net_amount": 1000, "quantity": 1, "ref_id": null, "ref_type": null, "sac_code": null, "tax_amount": 0, "tax_inclusive": false, "tax_rate": null, "taxable_amount": 1000, "taxes": [], "type": "invoice", "unit": null, "unit_amount": 1000 } ], "notes": [], "order_id": "order_JZz7gBTZjtUgBO", "paid_at": null, "partial_payment": false, "payment_id": null, "receipt": null, "reminder_status": null, "short_url": "https://rzp.io/i/DGpanoT", "sms_status": "pending", "status": "cancelled", "subscription_status": null, "supply_state_code": null, "tax_amount": 0, "taxable_amount": 1000, "terms": null, "type": "invoice", "user_id": null, "view_less": true } ``` ------------------------------------------------------------------------------------------------------- ### Send notification ```php $api->invoice->fetch($invoiceId)->notifyBy($medium); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | invoiceId* | string | The id of the invoice to be notified | | medium* | string | `sms`/`email`, Medium through which notification should be sent. | **Response:** ```json { "success": true } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/invoices)** razorpay/documents/qrcode.md 0000644 00000033662 15002216177 0012226 0 ustar 00 ## Qr Codes ### Create Qr code ```php $api->qrCode->create(array("type" => "upi_qr","name" => "Store_1", "usage" => "single_use","fixed_amount" => 1,"payment_amount" => 300,"customer_id" => "cust_HKsR5se84c5LTO","description" => "For Store 1","close_by" => 1681615838,"notes" => array("purpose" => "Test UPI QR code notes"))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | type* | string | The type of QR code i.e, `upi_qr`/`bharat_qr` | | name | string | Label entered to identify the QR code. | | usage* | string | Indicates if the QR code should be allowed to accept single payment or multiple payments i.e, `single_use`/`multiple_use` | | fixed_amount | boolean | Indicates if the QR should accept payments of specific amounts or any amount. | | payment_amount(* mandatory if fixed_amount is true) | integer | Indicates if the QR should accept payments of specific amounts or any amount. | | customer_id | string | Unique identifier of the customer the QR code is linked with | | description | string | A brief description about the QR code. | | close_by | integer | UNIX timestamp at which the QR code is scheduled to be automatically closed. The time must be at least 15 minutes after the current time. | | notes | array | Key-value pair that can be used to store additional information about the QR code. Maximum 15 key-value pairs, 256 characters (maximum) each. | **Response:** ```json { "id": "qr_HMsVL8HOpbMcjU", "entity": "qr_code", "created_at": 1623660301, "name": "Store_1", "usage": "single_use", "type": "upi_qr", "image_url": "https://rzp.io/i/BWcUVrLp", "payment_amount": 300, "status": "active", "description": "For Store 1", "fixed_amount": true, "payments_amount_received": 0, "payments_count_received": 0, "notes": { "purpose": "Test UPI QR code notes" }, "customer_id": "cust_HKsR5se84c5LTO", "close_by": 1681615838, "closed_at": 1623660445, "close_reason": "on_demand" } ``` ------------------------------------------------------------------------------------------------------- ### Create Qr code with GST ```php $api->qrCode->create(array("type" => "upi_qr","name" => "Store_1", "usage" => "single_use","fixed_amount" => 1,"payment_amount" => 300,"customer_id" => "cust_HKsR5se84c5LTO","description" => "For Store 1","close_by" => 1681615838,"notes" => array("purpose" => "Test UPI QR code notes"),"tax_invoice" => array("number" => "INV001", "date" => 1589994898,"customer_name" => "Gaurav Kumar", "business_gstin"=> "06AABCU9605R1ZR","gst_amount" => 4000, "cess_amount" => 0, "supply_type" => "interstate"))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | type* | string | The type of QR code i.e, `upi_qr`/`bharat_qr` | | name | string | Label entered to identify the QR code. | | usage* | string | Indicates if the QR code should be allowed to accept single payment or multiple payments i.e, `single_use`/`multiple_use` | | fixed_amount | boolean | Indicates if the QR should accept payments of specific amounts or any amount. | | payment_amount(* mandatory if fixed_amount is true) | integer | Indicates if the QR should accept payments of specific amounts or any amount. | | customer_id | string | Unique identifier of the customer the QR code is linked with | | description | string | A brief description about the QR code. | | close_by | integer | UNIX timestamp at which the QR code is scheduled to be automatically closed. The time must be at least 15 minutes after the current time. | | notes | array | Key-value pair that can be used to store additional information about the QR code. Maximum 15 key-value pairs, 256 characters (maximum) each. | | tax_invoice | array | This block contains information about the invoices. If not provided, the transaction will default to non-GST compliant UPI flow. | **Response:** ```json { "id": "qr_HMsVL8HOpbMcjU", "entity": "qr_code", "created_at": 1623660301, "name": "Store_1", "usage": "single_use", "type": "upi_qr", "image_url": "https://rzp.io/i/BWcUVrLp", "payment_amount": 300, "status": "active", "description": "For Store 1", "fixed_amount": true, "payments_amount_received": 0, "payments_count_received": 0, "notes": { "purpose": "Test UPI QR code notes" }, "customer_id": "cust_HKsR5se84c5LTO", "close_by": 1681615838, "tax_invoice": { "number": "INV001", "date": 1589994898, "customer_name": "Gaurav Kumar", "business_gstin": "06AABCU9605R1ZR", "gst_amount": 4000, "cess_amount": 0, "supply_type": "interstate" } } ``` ------------------------------------------------------------------------------------------------------- ### Fetch all Qr code ```php $api->qrCode->all($options); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | from | timestamp | timestamp after which the payments were created | | to | timestamp | timestamp before which the payments were created | | count | integer | number of payments to fetch (default: 10) | | skip | integer | number of payments to be skipped (default: 0) | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "qr_HO2jGkWReVBMNu", "entity": "qr_code", "created_at": 1623914648, "name": "Store_1", "usage": "single_use", "type": "upi_qr", "image_url": "https://rzp.io/i/w2CEwYmkAu", "payment_amount": 300, "status": "active", "description": "For Store 1", "fixed_amount": true, "payments_amount_received": 0, "payments_count_received": 0, "notes": { "purpose": "Test UPI QR code notes" }, "customer_id": "cust_HKsR5se84c5LTO", "close_by": 1681615838, "closed_at": null, "close_reason": null } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch a Qr code ```php $api->qrCode->fetch($qrCodeId); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | qrCodeId | string | The id of the qr code to be fetched | **Response:** ```json { "id": "qr_HO2r1MDprYtWRT", "entity": "qr_code", "created_at": 1623915088, "name": "Store_1", "usage": "single_use", "type": "upi_qr", "image_url": "https://rzp.io/i/oCswTOcCo", "payment_amount": 300, "status": "active", "description": "For Store 1", "fixed_amount": true, "payments_amount_received": 0, "payments_count_received": 0, "notes": { "purpose": "Test UPI QR code notes" }, "customer_id": "cust_HKsR5se84c5LTO", "close_by": 1681615838, "closed_at": null, "close_reason": null } ``` ------------------------------------------------------------------------------------------------------- ### Fetch a Qr code for customer id ```php $api->qrCode->all(["customer_id" => $customerId]); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | customerId* | string | The id of the customer to which qr code need to be fetched | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "qr_HMsgvioW64f0vh", "entity": "qr_code", "created_at": 1623660959, "name": "Store_1", "usage": "single_use", "type": "upi_qr", "image_url": "https://rzp.io/i/DTa2eQR", "payment_amount": 300, "status": "active", "description": "For Store 1", "fixed_amount": true, "payments_amount_received": 0, "payments_count_received": 0, "notes": { "purpose": "Test UPI QR code notes" }, "customer_id": "cust_HKsR5se84c5LTO", "close_by": 1681615838 } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch a Qr code for payment id ```php $api->qrCode->all(["payment_id" => $paymentId]); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | paymentID* | string | The id of the payment to which qr code need to be fetched | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "qr_HMsqRoeVwKbwAF", "entity": "qr_code", "created_at": 1623661499, "name": "Fresh Groceries", "usage": "multiple_use", "type": "upi_qr", "image_url": "https://rzp.io/i/eI9XD54Q", "payment_amount": null, "status": "active", "description": "Buy fresh groceries", "fixed_amount": false, "payments_amount_received": 1000, "payments_count_received": 1, "notes": [], "customer_id": "cust_HKsR5se84c5LTO", "close_by": 1624472999, "close_reason": null } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch Payments for a QR Code ```php $api->qrCode->fetch($qrCodeId)->fetchAllPayments($options); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | qrCodeID* | string | The id of the qr code to which payment where made | | from | timestamp | timestamp after which the payments were created | | to | timestamp | timestamp before which the payments were created | | count | integer | number of payments to fetch (default: 10) | | skip | integer | number of payments to be skipped (default: 0) | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "pay_HMtDKn3TnF4D8x", "entity": "payment", "amount": 500, "currency": "INR", "status": "captured", "order_id": null, "invoice_id": null, "international": false, "method": "upi", "amount_refunded": 0, "refund_status": null, "captured": true, "description": "QRv2 Payment", "card_id": null, "bank": null, "wallet": null, "vpa": "gauri.kumari@okhdfcbank", "email": "gauri.kumari@example.com", "contact": "+919999999999", "customer_id": "cust_HKsR5se84c5LTO", "notes": [], "fee": 0, "tax": 0, "error_code": null, "error_description": null, "error_source": null, "error_step": null, "error_reason": null, "acquirer_data": { "rrn": "116514257019" }, "created_at": 1623662800 } ] } ``` ------------------------------------------------------------------------------------------------------- ### Close a QR Code ```php $api->qrCode->fetch($qrCodeId)->close() ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | qrCodeID* | string | The id of the qr code to be closed | **Response:** ```json { "id": "qr_HMsVL8HOpbMcjU", "entity": "qr_code", "created_at": 1623660301, "name": "Store_1", "usage": "single_use", "type": "upi_qr", "image_url": "https://rzp.io/i/BWcUVrLp", "payment_amount": 300, "status": "closed", "description": "For Store 1", "fixed_amount": true, "payments_amount_received": 0, "payments_count_received": 0, "notes": { "purpose": "Test UPI QR code notes" }, "customer_id": "cust_HKsR5se84c5LTO", "close_by": 1681615838, "closed_at": 1623660445, "close_reason": "on_demand" } ``` ------------------------------------------------------------------------------------------------------- ### Refund a Payment ```php $api->payment->fetch($paymentId)->refund(array("amount"=> "100","notes"=>array("notes_key_1"=>"Beam me up Scotty.", "notes_key_2"=>"Engage"))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | paymentId* | string | The id of the payment to be refunded | | amount | string | Amount to be refunded | | notes | array | Key-value pair that can be used to store additional information about the QR code. Maximum 15 key-value pairs, 256 characters (maximum) each. | **Response:** ```json { "id": "rfnd_FP8QHiV938haTz", "entity": "refund", "amount": 500100, "receipt": "Receipt No. 31", "currency": "INR", "payment_id": "pay_29QQoUBi66xm2f", "notes": [], "receipt": null, "acquirer_data": { "arn": null }, "created_at": 1597078866, "batch_id": null, "status": "processed", "speed_processed": "normal", "speed_requested": "normal" } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/qr-codes/)** razorpay/documents/plan.md 0000644 00000011025 15002216177 0011670 0 ustar 00 ## Plans ### Create plan ```php $api->plan->create(array('period' => 'weekly', 'interval' => 1, 'item' => array('name' => 'Test Weekly 1 plan', 'description' => 'Description for the weekly 1 plan', 'amount' => 600, 'currency' => 'INR'),'notes'=> array('key1'=> 'value3','key2'=> 'value2'))); ``` **Parameters:** | Name | Type | Description | |-----------------|---------|------------------------------------------------------------------------------| | period* | string | Used together with `interval` to define how often the customer should be charged.Possible values:<br>1.`daily` <br>2.`weekly`<br>3.`monthly` <br>4.`yearly` | | interval* | string | Used together with `period` to define how often the customer should be charged | | items* | array | Details of the plan. For more details please refer [here](https://razorpay.com/docs/api/subscriptions/#create-a-plan) | | notes | array | Notes you can enter for the contact for future reference. | **Response:** ```json { "id":"plan_00000000000001", "entity":"plan", "interval":1, "period":"weekly", "item":{ "id":"item_00000000000001", "active":true, "name":"Test plan - Weekly", "description":"Description for the test plan - Weekly", "amount":69900, "unit_amount":69900, "currency":"INR", "type":"plan", "unit":null, "tax_inclusive":false, "hsn_code":null, "sac_code":null, "tax_rate":null, "tax_id":null, "tax_group_id":null, "created_at":1580219935, "updated_at":1580219935 }, "notes":{ "notes_key_1":"Tea, Earl Grey, Hot", "notes_key_2":"Tea, Earl Grey… decaf." }, "created_at":1580219935 } ``` ------------------------------------------------------------------------------------------------------- ### Fetch all plans ```php $api->plan->all($options); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | from | timestamp | timestamp after which the payments were created | | to | timestamp | timestamp before which the payments were created | | count | integer | number of payments to fetch (default: 10) | | skip | integer | number of payments to be skipped (default: 0) | **Response:** ```json { "entity": "collection", "count": 1, "items": [ { "id": "plan_00000000000001", "entity": "plan", "interval": 1, "period": "weekly", "item": { "id": "item_00000000000001", "active": true, "name": "Test plan - Weekly", "description": "Description for the test plan - Weekly", "amount": 69900, "unit_amount": 69900, "currency": "INR", "type": "plan", "unit": null, "tax_inclusive": false, "hsn_code": null, "sac_code": null, "tax_rate": null, "tax_id": null, "tax_group_id": null, "created_at": 1580220492, "updated_at": 1580220492 }, "notes": { "notes_key_1": "Tea, Earl Grey, Hot", "notes_key_2": "Tea, Earl Grey… decaf." }, "created_at": 1580220492 } ] } ``` ------------------------------------------------------------------------------------------------------- ### Fetch particular plan ```php $api->plan->fetch($planId); ``` **Parameters:** | Name | Type | Description | |-------|-----------|--------------------------------------------------| | planId* | string | The id of the plan to be fetched | **Response:** ```json { "id":"plan_00000000000001", "entity":"plan", "interval":1, "period":"weekly", "item":{ "id":"item_00000000000001", "active":true, "name":"Test plan - Weekly", "description":"Description for the test plan - Weekly", "amount":69900, "unit_amount":69900, "currency":"INR", "type":"plan", "unit":null, "tax_inclusive":false, "hsn_code":null, "sac_code":null, "tax_rate":null, "tax_id":null, "tax_group_id":null, "created_at":1580220492, "updated_at":1580220492 }, "notes":{ "notes_key_1":"Tea, Earl Grey, Hot", "notes_key_2":"Tea, Earl Grey… decaf." }, "created_at":1580220492 } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/api/subscriptions/#plans)** razorpay/documents/linkedAccount.md 0000644 00000014071 15002216177 0013525 0 ustar 00 ## Linked Account ### Create Linked Accounts for Sub-Merchants and Others ```php $api->setHeader('X-Razorpay-Account', 'acc_sub-merchantId'); $api->account->create(array( "email" => "gauriagain.kumar@example.org", "phone" => "9999999999", "type" => "route", "reference_id" => "124124", "legal_business_name" => "Acme Corp", "business_type" => "partnership", "contact_name" => "Gaurav Kumar", "profile" => array( "category" => "healthcare", "subcategory" => "clinic", "addresses" => array( "registered" => array( "street1" => "507, Koramangala 1st block", "street2" => "MG Road", "city" => "Bengaluru", "state" => "Karnataka", "postal_code" => 560034, "country" => "IN" ) ), ), "legal_info" => array( "pan" => "AAACL1234C", "gst" => "18AABCU9603R1ZM" ), )); ``` **Parameters:** | Name | Type | Description | |---------------|-------------|---------------------------------------------| | email* | string | The sub-merchant's business email address. | | phone* | integer | The sub-merchant's business phone number. The minimum length is 8 characters and the maximum length is 15. | | legal_business_name* | string | The name of the sub-merchant's business. For example, Acme Corp. The minimum length is 4 characters and the maximum length is 200. | | customer_facing_business_name | string | The sub-merchant billing label as it appears on the Razorpay Dashboard. The minimum length is 1 character and the maximum length is 255. | | business_type* | string | The type of business operated by the sub-merchant.Possible value is `proprietorship`, `partnership`, `private_limited`, `public_limited`, `llp`, `ngo`, `trust`, `society`, `not_yet_registered`, `huf` | | reference_id | string | Partner's external account reference id. The minimum length is 1 character and the maximum length is 512. | | profile | object | All keys listed [here](https://razorpay.com/docs/partners/route/linked-accounts/#create-linked-accounts-for-sub-merchants-and-others) are supported | | legal_info | object | All keys listed [here](https://razorpay.com/docs/partners/route/linked-accounts/#create-linked-accounts-for-sub-merchants-and-others) are supported | | contact_info | object | All keys listed [here](https://razorpay.com/docs/api/partners/account-onboarding/#create-an-account) are supported | | apps | object | All keys listed [here](https://razorpay.com/docs/api/partners/account-onboarding/#create-an-account) are supported | **Response:** ```json { "id":"acc_GRWKk7qQsLnDjX", "type":"route", "status":"created", "email":"gaurav.kumar@example.com", "profile":{ "category":"healthcare", "subcategory":"clinic", "addresses":{ "registered":{ "street1":"507, Koramangala 1st block", "street2":"MG Road", "city":"Bengaluru", "state":"KARNATAKA", "postal_code":"560034", "country":"IN" } } }, "notes":[ ], "created_at":1611136837, "phone":"9999999999", "contact_name":"Gaurav Kumar", "reference_id":"124124", "business_type":"partnership", "legal_business_name":"Acme Corp", "customer_facing_business_name":"Acme Corp", "legal_info":{ "pan":"AAACL1234C", "gst":"18AABCU9603R1ZM" } } ``` ------------------------------------------------------------------------------------------------------- ### Fetch a Linked Account of a Sub-Merchant by id ```php $api->setHeader('X-Razorpay-Account', 'acc_sub-merchantId'); $accountId = "acc_GP4lfNA0iIMn5B"; $api->account->fetch($accountId); ``` **Parameters:** | Name | Type | Description | |-------------|-------------|---------------------------------------------| | accountId* | string | The unique identifier of a sub-merchant account generated by Razorpay. | **Response:** ```json { "id":"acc_GLGeLkU2JUeyDZ", "type":"route", "reference_id":"123123", "status":"created", "email":"gaurav.kumar@example.com", "profile":{ "category":"healthcare", "subcategory":"clinic", "addresses":{ "registered":{ "street1":"507, Koramangala 1st block", "street2":"MG Road", "city":"Bengaluru", "state":"KARNATAKA", "postal_code":560034, "country":"IN" }, "operation":{ "street1":"507, Koramangala 6th block", "street2":"Kormanagala", "city":"Bengaluru", "state":"KARNATAKA", "country":"IN", "postal_code":560047 } }, "business_model":null }, "notes":[ ], "created_at":1611136837, "phone":"9999999998", "business_type":"partnership", "legal_business_name":"Acme Corp", "customer_facing_business_name":"Acme Corp", "legal_info":{ "pan":"AAACL1234C", "gst":"18AABCU9603R1ZM" }, "apps":{ "websites":[ ], "android":[ { "url":null, "name":null } ], "ios":[ { "url":null, "name":null } ] }, "brand":{ "color":null }, "contact_name":"Gaurav Kumar", "contact_info":{ "chargeback":{ "email":null, "phone":null, "policy_url":null }, "refund":{ "email":null, "phone":null, "policy_url":null }, "support":{ "email":null, "phone":null, "policy_url":null } } } ``` ------------------------------------------------------------------------------------------------------- **PN: * indicates mandatory fields** <br> <br> **For reference click [here](https://razorpay.com/docs/partners/route/linked-accounts)** razorpay/README.md 0000644 00000007403 15002216177 0007677 0 ustar 00 # razorpay-php [](https://travis-ci.org/razorpay/razorpay-php) [](https://packagist.org/packages/razorpay/razorpay#2.8.0) [](https://packagist.org/packages/razorpay/razorpay) Official PHP library for [Razorpay API](https://docs.razorpay.com/docs/payments). Read up here for getting started and understanding the payment flow with Razorpay: <https://docs.razorpay.com/docs/getting-started> ### Prerequisites - A minimum of PHP 7.3 upto 8.1 ## Installation - If your project using composer, run the below command ``` composer require razorpay/razorpay:2.* ``` - If you are not using composer, download the latest release from [the releases section](https://github.com/razorpay/razorpay-php/releases). **You should download the `razorpay-php.zip` file**. After that, include `Razorpay.php` in your application and you can use the API as usual. ##Note: This PHP library follows the following practices: - Namespaced under `Razorpay\Api` - API throws exceptions instead of returning errors - Options are passed as an array instead of multiple arguments wherever possible - All requests and responses are communicated over JSON ## Documentation Documentation of Razorpay's API and their usage is available at <https://docs.razorpay.com> ## Basic Usage Instantiate the razorpay php instance with `key_id` & `key_secret`. You can obtain the keys from the dashboard app ([https://dashboard.razorpay.com/#/app/keys](https://dashboard.razorpay.com/#/app/keys)) ```php use Razorpay\Api\Api; $api = new Api($api_key, $api_secret); ``` The resources can be accessed via the `$api` object. All the methods invocations follows the following pattern ```php // $api->class->function() to access the API //Example $api->payment->fetch($paymentId); ``` ## Supported Resources - [Account](documents/account.md) - [Customer](documents/customer.md) - [Dispute](documents/dispute.md) - [Document](documents/document.md) - [Token](documents/token.md) - [Order](documents/order.md) - [Payments](documents/payment.md) - [Settlements](documents/settlement.md) - [Refunds](documents/refund.md) - [Fund](documents/fund.md) - [Invoice](documents/invoice.md) - [Iin](documents/Iin.md) - [Plan](documents/plan.md) - [Item](documents/item.md) - [Subscriptions](documents/subscription.md) - [Add-on](documents/addon.md) - [Payment Links](documents/paymentLink.md) - [Product Configuration](documents/productConfiguration.md) - [Smart Collect](documents/virtualaccount.md) - [Stakeholder](documents/stakeholder.md) - [Transfer](documents/transfer.md) - [QR Code](documents/qrcode.md) - [Emandate](documents/emandate.md) - [Cards](documents/card.md) - [Paper NACH](documents/papernach.md) - [UPI](documents/upi.md) - [Register Emandate and Charge First Payment Together](documents/registeremandate.md) - [Register NACH and Charge First Payment Together](documents/registernach.md) - [Payment Verification](documents/paymentVerfication.md) - [Webhook](documents/webhook.md) ## Development See the [doc.md](doc.md) file for getting started with development. ## Release Steps to follow for a release: 0. Merge the branch with the new code to master. 1. Bump the Version in `src/Api.php`. 2. Rename Unreleased to the new tag in `CHANGELOG.md` 3. Add a new empty "Unreleased" section at the top of `CHANGELOG.md` 4. Fix links at bottom in `CHANGELOG.md` 5. Commit 6. Tag the release and push to GitHub 7. A release should automatically be created once the travis build passes. Edit the release to add some description. ## License The Razorpay PHP SDK is released under the MIT License. See [LICENSE](LICENSE) file for more details. razorpay/LICENSE 0000644 00000002027 15002216177 0007422 0 ustar 00 Copyright 2019 Razorpay Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. razorpay/libs/Requests-2.0.4/composer.json 0000644 00000004304 15002216177 0014342 0 ustar 00 { "name": "rmccue/requests", "description": "A HTTP library written in PHP, for human beings.", "homepage": "https://requests.ryanmccue.info/", "license": "ISC", "type": "library", "keywords": [ "http", "idna", "iri", "ipv6", "curl", "sockets", "fsockopen" ], "authors": [ { "name": "Ryan McCue", "homepage": "https://rmccue.io/" }, { "name": "Alain Schlesser", "homepage": "https://github.com/schlessera" }, { "name": "Juliette Reinders Folmer", "homepage": "https://github.com/jrfnl" }, { "name": "Contributors", "homepage": "https://github.com/WordPress/Requests/graphs/contributors" } ], "support": { "issues": "https://github.com/WordPress/Requests/issues", "source": "https://github.com/WordPress/Requests", "docs": "https://requests.ryanmccue.info/" }, "require": { "php": ">=5.6", "ext-json": "*" }, "config": { "allow-plugins": { "dealerdirect/phpcodesniffer-composer-installer": true } }, "require-dev": { "requests/test-server": "dev-main", "squizlabs/php_codesniffer": "^3.6", "phpcompatibility/php-compatibility": "^9.0", "wp-coding-standards/wpcs": "^2.0", "dealerdirect/phpcodesniffer-composer-installer": "^0.7", "php-parallel-lint/php-parallel-lint": "^1.3.1", "php-parallel-lint/php-console-highlighter": "^0.5.0", "yoast/phpunit-polyfills": "^1.0.0", "roave/security-advisories": "dev-latest" }, "autoload": { "psr-4": { "WpOrg\\Requests\\": "src/" }, "classmap": ["library/Requests.php"], "files": ["library/Deprecated.php"] }, "autoload-dev": { "psr-4": { "WpOrg\\Requests\\Tests\\": "tests/" } }, "scripts": { "lint": [ "@php ./vendor/php-parallel-lint/php-parallel-lint/parallel-lint . -e php --exclude vendor --exclude .git" ], "checkcs": [ "@php ./vendor/squizlabs/php_codesniffer/bin/phpcs" ], "fixcs": [ "@php ./vendor/squizlabs/php_codesniffer/bin/phpcbf" ], "test": [ "@php ./vendor/phpunit/phpunit/phpunit --no-coverage" ], "coverage": [ "@php ./vendor/phpunit/phpunit/phpunit" ] } } razorpay/libs/Requests-2.0.4/certificates/cacert.pem.sha256 0000644 00000000115 15002216177 0017234 0 ustar 00 6ed95025fba2aef0ce7b647607225745624497f876d74ef6ec22b26e73e9de77 cacert.pem razorpay/libs/Requests-2.0.4/certificates/cacert.pem 0000644 00000662415 15002216177 0016246 0 ustar 00 ## ## Bundle of CA Root Certificates ## ## Certificate data from Mozilla as of: Tue Jul 19 03:12:06 2022 GMT ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates ## file (certdata.txt). This file can be found in the mozilla source tree: ## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt ## ## It contains the certificates in PEM format and therefore ## can be directly used with curl / libcurl / php_curl, or with ## an Apache+mod_ssl webserver for SSL client authentication. ## Just configure this file as the SSLCACertificateFile. ## ## Conversion done with mk-ca-bundle.pl version 1.29. ## SHA256: 9bf3799611fb58197f61d45e71ce3dc19f30e7dd73731915872ce5108a7bb066 ## GlobalSign Root CA ================== -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- Entrust.net Premium 2048 Secure Server CA ========================================= -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= -----END CERTIFICATE----- Baltimore CyberTrust Root ========================= -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- Entrust Root Certification Authority ==================================== -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- Comodo AAA Services root ======================== -----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- QuoVadis Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- QuoVadis Root CA 3 ================== -----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- Security Communication Root CA ============================== -----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi FL39vmwLAw== -----END CERTIFICATE----- XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- Go Daddy Class 2 CA =================== -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b vZ8= -----END CERTIFICATE----- Starfield Class 2 CA ==================== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- DigiCert Assured ID Root CA =========================== -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- DigiCert Global Root CA ======================= -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- DigiCert High Assurance EV Root CA ================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K -----END CERTIFICATE----- SwissSign Gold CA - G2 ====================== -----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- SwissSign Silver CA - G2 ======================== -----BEGIN CERTIFICATE----- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- SecureTrust CA ============== -----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- Secure Global CA ================ -----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- COMODO Certification Authority ============================== -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== -----END CERTIFICATE----- Network Solutions Certificate Authority ======================================= -----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- Certigna ======== -----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- ePKI Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- certSIGN ROOT CA ================ -----BEGIN CERTIFICATE----- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD -----END CERTIFICATE----- NetLock Arany (Class Gold) Főtanúsítvány ======================================== -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- Hongkong Post Root CA 1 ======================= -----BEGIN CERTIFICATE----- MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== -----END CERTIFICATE----- SecureSign RootCA11 =================== -----BEGIN CERTIFICATE----- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= -----END CERTIFICATE----- Microsec e-Szigno Root CA 2009 ============================== -----BEGIN CERTIFICATE----- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi LXpUq3DDfSJlgnCW -----END CERTIFICATE----- GlobalSign Root CA - R3 ======================= -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r kpeDMdmztcpHWD9f -----END CERTIFICATE----- Autoridad de Certificacion Firmaprofesional CIF A62634068 ========================================================= -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V -----END CERTIFICATE----- Izenpe.com ========== -----BEGIN CERTIFICATE----- MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- Go Daddy Root Certificate Authority - G2 ======================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 -----END CERTIFICATE----- Starfield Root Certificate Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- Starfield Services Root Certificate Authority - G2 ================================================== -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 -----END CERTIFICATE----- AffirmTrust Commercial ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- AffirmTrust Networking ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- AffirmTrust Premium =================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== -----END CERTIFICATE----- AffirmTrust Premium ECC ======================= -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM eQ== -----END CERTIFICATE----- Certum Trusted Network CA ========================= -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- TWCA Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE----- Security Communication RootCA2 ============================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- Actalis Authentication Root CA ============================== -----BEGIN CERTIFICATE----- MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- Buypass Class 2 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN rJgWVqA= -----END CERTIFICATE----- Buypass Class 3 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi Cp/HuZc= -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 3 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 2009 ============================== -----BEGIN CERTIFICATE----- MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 EV 2009 ================================= -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv w9y4AyHqnxbxLFS1 -----END CERTIFICATE----- CA Disig Root R2 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa 5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV 7+ZtsH8tZ/3zbBt1RqPlShfppNcL -----END CERTIFICATE----- ACCVRAIZ1 ========= -----BEGIN CERTIFICATE----- MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p EfbRD0tVNEYqi4Y7 -----END CERTIFICATE----- TWCA Global Root CA =================== -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= -----END CERTIFICATE----- TeliaSonera Root CA v1 ====================== -----BEGIN CERTIFICATE----- MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- E-Tugra Certification Authority =============================== -----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G C7TbO6Orb1wdtn7os4I07QZcJA== -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 2 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== -----END CERTIFICATE----- Atos TrustedRoot 2011 ===================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed -----END CERTIFICATE----- QuoVadis Root CA 1 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV 7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX 9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP +V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh 3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV hMJKzRwuJIczYOXD -----END CERTIFICATE----- QuoVadis Root CA 2 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD 6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr O3jtZsSOeWmD3n+M -----END CERTIFICATE----- QuoVadis Root CA 3 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe 6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX 0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 PpxxVJkES/1Y+Zj0 -----END CERTIFICATE----- DigiCert Assured ID Root G2 =========================== -----BEGIN CERTIFICATE----- MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo IhNzbM8m9Yop5w== -----END CERTIFICATE----- DigiCert Assured ID Root G3 =========================== -----BEGIN CERTIFICATE----- MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy 1vUhZscv6pZjamVFkpUBtA== -----END CERTIFICATE----- DigiCert Global Root G2 ======================= -----BEGIN CERTIFICATE----- MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl MrY= -----END CERTIFICATE----- DigiCert Global Root G3 ======================= -----BEGIN CERTIFICATE----- MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 VOKa5Vt8sycX -----END CERTIFICATE----- DigiCert Trusted Root G4 ======================== -----BEGIN CERTIFICATE----- MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy 7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN 5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb /UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa 5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP 82Z+ -----END CERTIFICATE----- COMODO RSA Certification Authority ================================== -----BEGIN CERTIFICATE----- MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ 5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX 2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I LaZRfyHBNVOFBkpdn627G190 -----END CERTIFICATE----- USERTrust RSA Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz 0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O +T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq /nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ 7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM 8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 -----END CERTIFICATE----- USERTrust ECC Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= -----END CERTIFICATE----- GlobalSign ECC Root CA - R5 =========================== -----BEGIN CERTIFICATE----- MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 -----END CERTIFICATE----- Staat der Nederlanden EV Root CA ================================ -----BEGIN CERTIFICATE----- MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r 0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr 08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV 0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd 74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq 5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi 5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== -----END CERTIFICATE----- IdenTrust Commercial Root CA 1 ============================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi 1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl 3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH 6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe 2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R cGzM7vRX+Bi6hG6H -----END CERTIFICATE----- IdenTrust Public Sector Root CA 1 ================================= -----BEGIN CERTIFICATE----- MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL 4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ 3Wl9af0AVqW3rLatt8o+Ae+c -----END CERTIFICATE----- Entrust Root Certification Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO e4pIb4tF9g== -----END CERTIFICATE----- Entrust Root Certification Authority - EC1 ========================================== -----BEGIN CERTIFICATE----- MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G -----END CERTIFICATE----- CFCA EV ROOT ============ -----BEGIN CERTIFICATE----- MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD 7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua 4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- OISTE WISeKey Global Root GB CA =============================== -----BEGIN CERTIFICATE----- MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= -----END CERTIFICATE----- SZAFIR ROOT CA2 =============== -----BEGIN CERTIFICATE----- MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE 2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul 4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 +/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== -----END CERTIFICATE----- Certum Trusted Network CA 2 =========================== -----BEGIN CERTIFICATE----- MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ 9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 zAYspsbiDrW5viSP -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2015 ======================================================= -----BEGIN CERTIFICATE----- MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ 6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn 82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q p/UsQu0yrbYhnr68 -----END CERTIFICATE----- Hellenic Academic and Research Institutions ECC RootCA 2015 =========================================================== -----BEGIN CERTIFICATE----- MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR -----END CERTIFICATE----- ISRG Root X1 ============ -----BEGIN CERTIFICATE----- MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ 4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf 1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY 9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV 0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ m+kXQ99b21/+jh5Xos1AnX5iItreGCc= -----END CERTIFICATE----- AC RAIZ FNMT-RCM ================ -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou 08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ 47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW +YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d 8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm 5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= -----END CERTIFICATE----- Amazon Root CA 1 ================ -----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy 8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa 2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 -----END CERTIFICATE----- Amazon Root CA 2 ================ -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ 3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY +gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= -----END CERTIFICATE----- Amazon Root CA 3 ================ -----BEGIN CERTIFICATE----- MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== -----END CERTIFICATE----- Amazon Root CA 4 ================ -----BEGIN CERTIFICATE----- MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN /sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri 83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== -----END CERTIFICATE----- TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 ============================================= -----BEGIN CERTIFICATE----- MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= -----END CERTIFICATE----- GDCA TrustAUTH R5 ROOT ====================== -----BEGIN CERTIFICATE----- MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ 9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx 9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd +PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ 8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv /EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== -----END CERTIFICATE----- TrustCor RootCert CA-1 ====================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4 pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0 JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw /Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5 mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P 3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk= -----END CERTIFICATE----- TrustCor RootCert CA-2 ====================== -----BEGIN CERTIFICATE----- MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0 eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0 IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1 oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1 /p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh 8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU 2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv 2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3 S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ -----END CERTIFICATE----- TrustCor ECA-1 ============== -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5 MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23 xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+ fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u /ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g== -----END CERTIFICATE----- SSL.com Root Certification Authority RSA ======================================== -----BEGIN CERTIFICATE----- MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8 P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2 UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8 1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= -----END CERTIFICATE----- SSL.com Root Certification Authority ECC ======================================== -----BEGIN CERTIFICATE----- MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ 8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z 5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl -----END CERTIFICATE----- SSL.com EV Root Certification Authority RSA R2 ============================================== -----BEGIN CERTIFICATE----- MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim 9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 +qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 ++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX 9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== -----END CERTIFICATE----- SSL.com EV Root Certification Authority ECC =========================================== -----BEGIN CERTIFICATE----- MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy 3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe 5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== -----END CERTIFICATE----- GlobalSign Root CA - R6 ======================= -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE 3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP 0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr 3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= -----END CERTIFICATE----- OISTE WISeKey Global Root GC CA =============================== -----BEGIN CERTIFICATE----- MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 -----END CERTIFICATE----- UCA Global G2 Root ================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV 8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa 4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo 5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== -----END CERTIFICATE----- UCA Extended Validation Root ============================ -----BEGIN CERTIFICATE----- MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR 59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH 0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS 3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb +7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr dhh2n1ax -----END CERTIFICATE----- Certigna Root CA ================ -----BEGIN CERTIFICATE----- MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq 4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ /TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of 1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq 7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd 8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS 6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= -----END CERTIFICATE----- emSign Root CA - G1 =================== -----BEGIN CERTIFICATE----- MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1 cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ 6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2 vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q +Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx iN66zB+Afko= -----END CERTIFICATE----- emSign ECC Root CA - G3 ======================= -----BEGIN CERTIFICATE----- MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4 MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11 ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc 58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7 jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj -----END CERTIFICATE----- emSign Root CA - C1 =================== -----BEGIN CERTIFICATE----- MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/ Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+ XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp /6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1 NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9 wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI= -----END CERTIFICATE----- emSign ECC Root CA - C3 ======================= -----BEGIN CERTIFICATE----- MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd 6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9 SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== -----END CERTIFICATE----- Hongkong Post Root CA 3 ======================= -----BEGIN CERTIFICATE----- MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2 MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim 5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj 0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/ JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h +bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov +BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw 9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7 nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB 60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq dBb9HxEGmpv0 -----END CERTIFICATE----- Entrust Root Certification Authority - G4 ========================================= -----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1 dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT AlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv cml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D umSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV 3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds 8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ e9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7 ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X xNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV 7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW Hv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n MA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q jbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht 7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK YvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt jqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+ m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW RGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA JOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G +TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT kcpG2om3PVODLAgfi49T3f+sHw== -----END CERTIFICATE----- Microsoft ECC Root Certificate Authority 2017 ============================================= -----BEGIN CERTIFICATE----- MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4 MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6 thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM +Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= -----END CERTIFICATE----- Microsoft RSA Root Certificate Authority 2017 ============================================= -----BEGIN CERTIFICATE----- MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml 7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7 1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+ dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ 0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og 6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80 dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk +ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex /2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE 7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D 5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E -----END CERTIFICATE----- e-Szigno Root CA 2017 ===================== -----BEGIN CERTIFICATE----- MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO svxyqltZ+efcMQ== -----END CERTIFICATE----- certSIGN Root CA G2 =================== -----BEGIN CERTIFICATE----- MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05 N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732 jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf 95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB /AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5 8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5 BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N 0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc= -----END CERTIFICATE----- Trustwave Global Certification Authority ======================================== -----BEGIN CERTIFICATE----- MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJV UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTAeFw0xNzA4MjMxOTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJV UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALldUShLPDeS0YLOvR29 zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0XznswuvCAAJWX/NKSqIk4cXGIDtiLK0thAf LdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4Bq stTnoApTAbqOl5F2brz81Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9o WN0EACyW80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotPJqX+ OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1lRtzuzWniTY+HKE40 Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfwhI0Vcnyh78zyiGG69Gm7DIwLdVcE uE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm +9jaJXLE9gCxInm943xZYkqcBW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqj ifLJS3tBEW1ntwiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1UdDwEB/wQEAwIB BjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W0OhUKDtkLSGm+J1WE2pIPU/H PinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfeuyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0H ZJDmHvUqoai7PF35owgLEQzxPy0QlG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla 4gt5kNdXElE1GYhBaCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5R vbbEsLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPTMaCm/zjd zyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qequ5AvzSxnI9O4fKSTx+O 856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxhVicGaeVyQYHTtgGJoC86cnn+OjC/QezH Yj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu 3R3y4G5OBVixwJAWKqQ9EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP 29FpHOTKyeC2nOnOcXHebD8WpHk= -----END CERTIFICATE----- Trustwave Global ECC P256 Certification Authority ================================================= -----BEGIN CERTIFICATE----- MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1 NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj 43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt 0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 -----END CERTIFICATE----- Trustwave Global ECC P384 Certification Authority ================================================= -----BEGIN CERTIFICATE----- MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4 NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr /TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw== -----END CERTIFICATE----- NAVER Global Root Certification Authority ========================================= -----BEGIN CERTIFICATE----- MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG A1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD DClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4 NDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT UyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb UGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW +j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7 XNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2 aacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4 Yb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z VHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B A0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai cdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy YhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV HQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK 21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB jCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx hYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg E34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH D8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ A76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg kpzNNIaRkPpkUZ3+/uul9XXeifdy -----END CERTIFICATE----- AC RAIZ FNMT-RCM SERVIDORES SEGUROS =================================== -----BEGIN CERTIFICATE----- MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4 MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2 LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c= -----END CERTIFICATE----- GlobalSign Root R46 =================== -----BEGIN CERTIFICATE----- MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/ r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje 2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4 12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9 vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92 CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7 DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3 QEUxeCp6 -----END CERTIFICATE----- GlobalSign Root E46 =================== -----BEGIN CERTIFICATE----- MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+ CAezNIm8BZ/3Hobui3A= -----END CERTIFICATE----- GLOBALTRUST 2020 ================ -----BEGIN CERTIFICATE----- MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw 4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9 iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS 8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2 HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918 oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== -----END CERTIFICATE----- ANF Secure Server Root CA ========================= -----BEGIN CERTIFICATE----- MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNVBAUTCUc2MzI4 NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lv bjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNVBAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3Qg Q0EwHhcNMTkwOTA0MTAwMDM4WhcNMzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEw MQswCQYDVQQGEwJFUzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQw EgYDVQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9vdCBDQTCC AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCjcqQZAZ2cC4Ffc0m6p6zz BE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9qyGFOtibBTI3/TO80sh9l2Ll49a2pcbnv T1gdpd50IJeh7WhM3pIXS7yr/2WanvtH2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcv B2VSAKduyK9o7PQUlrZXH1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXse zx76W0OLzc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyRp1RM VwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQzW7i1o0TJrH93PB0j 7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/SiOL9V8BY9KHcyi1Swr1+KuCLH5z JTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJnLNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe 8TZBAQIvfXOn3kLMTOmJDVb3n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVO Hj1tyRRM4y5Bu8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAOBgNVHQ8BAf8E BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEATh65isagmD9uw2nAalxJ UqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzx j6ptBZNscsdW699QIyjlRRA96Gejrw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDt dD+4E5UGUcjohybKpFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM 5gf0vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjqOknkJjCb 5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ/zo1PqVUSlJZS2Db7v54 EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ92zg/LFis6ELhDtjTO0wugumDLmsx2d1H hk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGy g77FGr8H6lnco4g175x2MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3 r5+qPeoott7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw= -----END CERTIFICATE----- Certum EC-384 CA ================ -----BEGIN CERTIFICATE----- MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2 MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0 QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= -----END CERTIFICATE----- Certum Trusted Root CA ====================== -----BEGIN CERTIFICATE----- MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6MQswCQYDVQQG EwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0g Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0Ew HhcNMTgwMzE2MTIxMDEzWhcNNDMwMzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMY QXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEB AQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZn0EGze2jusDbCSzBfN8p fktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/qp1x4EaTByIVcJdPTsuclzxFUl6s1wB52 HO8AU5853BSlLCIls3Jy/I2z5T4IHhQqNwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2 fJmItdUDmj0VDT06qKhF8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGt g/BKEiJ3HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGamqi4 NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi7VdNIuJGmj8PkTQk fVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSFytKAQd8FqKPVhJBPC/PgP5sZ0jeJ P/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0PqafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSY njYJdmZm/Bo/6khUHL4wvYBQv3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHK HRzQ+8S1h9E6Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1 vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIBAEii1QAL LtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4WxmB82M+w85bj/UvXgF2Ez8s ALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvozMrnadyHncI013nR03e4qllY/p0m+jiGPp2K h2RX5Rc64vmNueMzeMGQ2Ljdt4NR5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8 CYyqOhNf6DR5UMEQGfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA 4kZf5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq0Uc9Nneo WWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7DP78v3DSk+yshzWePS/Tj 6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTMqJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmT OPQD8rv7gmsHINFSH5pkAnuYZttcTVoP0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZck bxJF0WddCajJFdr60qZfE2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb -----END CERTIFICATE----- TunTrust Root CA ================ -----BEGIN CERTIFICATE----- MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQELBQAwYTELMAkG A1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUgQ2VydGlmaWNhdGlvbiBFbGVj dHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJvb3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQw NDI2MDg1NzU2WjBhMQswCQYDVQQGEwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBD ZXJ0aWZpY2F0aW9uIEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZn56eY+hz 2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd2JQDoOw05TDENX37Jk0b bjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgFVwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7 NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZGoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAd gjH8KcwAWJeRTIAAHDOFli/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViW VSHbhlnUr8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2eY8f Tpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIbMlEsPvLfe/ZdeikZ juXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISgjwBUFfyRbVinljvrS5YnzWuioYas DXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwS VXAkPcvCFDVDXSdOvsC9qnyW5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI 04Y+oXNZtPdEITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+zxiD2BkewhpMl 0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYuQEkHDVneixCwSQXi/5E/S7fd Ao74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRY YdZ2vyJ/0Adqp2RT8JeNnYA/u8EH22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJp adbGNjHh/PqAulxPxOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65x xBzndFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5Xc0yGYuP jCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7bnV2UqL1g52KAdoGDDIzM MEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQCvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9z ZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZHu/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3r AZ3r2OvEhJn7wAzMMujjd9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= -----END CERTIFICATE----- HARICA TLS RSA Root CA 2021 =========================== -----BEGIN CERTIFICATE----- MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K 5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR 0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5 vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0 qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6 Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/ PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn kf3/W9b3raYvAwtt41dU63ZTGI0RmLo= -----END CERTIFICATE----- HARICA TLS ECC Root CA 2021 =========================== -----BEGIN CERTIFICATE----- MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW 0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps -----END CERTIFICATE----- Autoridad de Certificacion Firmaprofesional CIF A62634068 ========================================================= -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1Ud DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL 4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH 9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE ZycPvEJdvSRUDewdcAZfpLz6IHxV -----END CERTIFICATE----- vTrus ECC Root CA ================= -----BEGIN CERTIFICATE----- MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL YgmRWAD5Tfs0aNoJrSEGGJTO -----END CERTIFICATE----- vTrus Root CA ============= -----BEGIN CERTIFICATE----- MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70 kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2 AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu /9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu 1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO 9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4 8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4 sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H l3s= -----END CERTIFICATE----- ISRG Root X2 ============ -----BEGIN CERTIFICATE----- MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5 U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn -----END CERTIFICATE----- HiPKI Root CA - G1 ================== -----BEGIN CERTIFICATE----- MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0 o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj 1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4 9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/ Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF 8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi 7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv 5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/ yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== -----END CERTIFICATE----- GlobalSign ECC Root CA - R4 =========================== -----BEGIN CERTIFICATE----- MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm -----END CERTIFICATE----- GTS Root R1 =========== -----BEGIN CERTIFICATE----- MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0 xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk 9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+ 7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3 FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3 gm3c -----END CERTIFICATE----- GTS Root R2 =========== -----BEGIN CERTIFICATE----- MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg UjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl e3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb a96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS +LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M kogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG r61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q S34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV J1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL dWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T AQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD ggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh swWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel /FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn jWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5 9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M 7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8 0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR WGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW HYbL -----END CERTIFICATE----- GTS Root R3 =========== -----BEGIN CERTIFICATE----- MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout 736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV 11RZt+cRLInUue4X -----END CERTIFICATE----- GTS Root R4 =========== -----BEGIN CERTIFICATE----- MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1 PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh 4rsUecrNIdSUtUlD -----END CERTIFICATE----- Telia Root CA v2 ================ -----BEGIN CERTIFICATE----- MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2 MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7 6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q 9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW 5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4 M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ 8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5 tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15 h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70 sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9 xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc= -----END CERTIFICATE----- D-TRUST BR Root CA 1 2020 ========================= -----BEGIN CERTIFICATE----- MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7 dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87 -----END CERTIFICATE----- D-TRUST EV Root CA 1 2020 ========================= -----BEGIN CERTIFICATE----- MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8 ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW -----END CERTIFICATE----- DigiCert TLS ECC P384 Root G5 ============================= -----BEGIN CERTIFICATE----- MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4 NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB /wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA== -----END CERTIFICATE----- DigiCert TLS RSA4096 Root G5 ============================ -----BEGIN CERTIFICATE----- MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0 MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2 IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8 7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/ MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/ u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh 47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP bEtoL8pU9ozaMv7Da4M/OMZ+ -----END CERTIFICATE----- Certainly Root R1 ================= -----BEGIN CERTIFICATE----- MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O 5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl 8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1 VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d 8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+ gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7 fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8= -----END CERTIFICATE----- Certainly Root E1 ================= -----BEGIN CERTIFICATE----- MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0 MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4 fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9 YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8 rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR -----END CERTIFICATE----- E-Tugra Global Root CA RSA v3 ============================= -----BEGIN CERTIFICATE----- MIIF8zCCA9ugAwIBAgIUDU3FzRYilZYIfrgLfxUGNPt5EDQwDQYJKoZIhvcNAQELBQAwgYAxCzAJ BgNVBAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4xHTAb BgNVBAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290 IENBIFJTQSB2MzAeFw0yMDAzMTgwOTA3MTdaFw00NTAzMTIwOTA3MTdaMIGAMQswCQYDVQQGEwJU UjEPMA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRF LVR1Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBSU0Eg djMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCiZvCJt3J77gnJY9LTQ91ew6aEOErx jYG7FL1H6EAX8z3DeEVypi6Q3po61CBxyryfHUuXCscxuj7X/iWpKo429NEvx7epXTPcMHD4QGxL sqYxYdE0PD0xesevxKenhOGXpOhL9hd87jwH7eKKV9y2+/hDJVDqJ4GohryPUkqWOmAalrv9c/SF /YP9f4RtNGx/ardLAQO/rWm31zLZ9Vdq6YaCPqVmMbMWPcLzJmAy01IesGykNz709a/r4d+ABs8q QedmCeFLl+d3vSFtKbZnwy1+7dZ5ZdHPOrbRsV5WYVB6Ws5OUDGAA5hH5+QYfERaxqSzO8bGwzrw bMOLyKSRBfP12baqBqG3q+Sx6iEUXIOk/P+2UNOMEiaZdnDpwA+mdPy70Bt4znKS4iicvObpCdg6 04nmvi533wEKb5b25Y08TVJ2Glbhc34XrD2tbKNSEhhw5oBOM/J+JjKsBY04pOZ2PJ8QaQ5tndLB eSBrW88zjdGUdjXnXVXHt6woq0bM5zshtQoK5EpZ3IE1S0SVEgpnpaH/WwAH0sDM+T/8nzPyAPiM bIedBi3x7+PmBvrFZhNb/FAHnnGGstpvdDDPk1Po3CLW3iAfYY2jLqN4MpBs3KwytQXk9TwzDdbg h3cXTJ2w2AmoDVf3RIXwyAS+XF1a4xeOVGNpf0l0ZAWMowIDAQABo2MwYTAPBgNVHRMBAf8EBTAD AQH/MB8GA1UdIwQYMBaAFLK0ruYt9ybVqnUtdkvAG1Mh0EjvMB0GA1UdDgQWBBSytK7mLfcm1ap1 LXZLwBtTIdBI7zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAImocn+M684uGMQQ gC0QDP/7FM0E4BQ8Tpr7nym/Ip5XuYJzEmMmtcyQ6dIqKe6cLcwsmb5FJ+Sxce3kOJUxQfJ9emN4 38o2Fi+CiJ+8EUdPdk3ILY7r3y18Tjvarvbj2l0Upq7ohUSdBm6O++96SmotKygY/r+QLHUWnw/q ln0F7psTpURs+APQ3SPh/QMSEgj0GDSz4DcLdxEBSL9htLX4GdnLTeqjjO/98Aa1bZL0SmFQhO3s SdPkvmjmLuMxC1QLGpLWgti2omU8ZgT5Vdps+9u1FGZNlIM7zR6mK7L+d0CGq+ffCsn99t2HVhjY sCxVYJb6CH5SkPVLpi6HfMsg2wY+oF0Dd32iPBMbKaITVaA9FCKvb7jQmhty3QUBjYZgv6Rn7rWl DdF/5horYmbDB7rnoEgcOMPpRfunf/ztAmgayncSd6YAVSgU7NbHEqIbZULpkejLPoeJVF3Zr52X nGnnCv8PWniLYypMfUeUP95L6VPQMPHF9p5J3zugkaOj/s1YzOrfr28oO6Bpm4/srK4rVJ2bBLFH IK+WEj5jlB0E5y67hscMmoi/dkfv97ALl2bSRM9gUgfh1SxKOidhd8rXj+eHDjD/DLsE4mHDosiX YY60MGo8bcIHX0pzLz/5FooBZu+6kcpSV3uu1OYP3Qt6f4ueJiDPO++BcYNZ -----END CERTIFICATE----- E-Tugra Global Root CA ECC v3 ============================= -----BEGIN CERTIFICATE----- MIICpTCCAiqgAwIBAgIUJkYZdzHhT28oNt45UYbm1JeIIsEwCgYIKoZIzj0EAwMwgYAxCzAJBgNV BAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4xHTAbBgNV BAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290IENB IEVDQyB2MzAeFw0yMDAzMTgwOTQ2NThaFw00NTAzMTIwOTQ2NThaMIGAMQswCQYDVQQGEwJUUjEP MA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRFLVR1 Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBFQ0MgdjMw djAQBgcqhkjOPQIBBgUrgQQAIgNiAASOmCm/xxAeJ9urA8woLNheSBkQKczLWYHMjLiSF4mDKpL2 w6QdTGLVn9agRtwcvHbB40fQWxPa56WzZkjnIZpKT4YKfWzqTTKACrJ6CZtpS5iB4i7sAnCWH/31 Rs7K3IKjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU/4Ixcj75xGZsrTie0bBRiKWQ zPUwHQYDVR0OBBYEFP+CMXI++cRmbK04ntGwUYilkMz1MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO PQQDAwNpADBmAjEA5gVYaWHlLcoNy/EZCL3W/VGSGn5jVASQkZo1kTmZ+gepZpO6yGjUij/67W4W Aie3AjEA3VoXK3YdZUKWpqxdinlW2Iob35reX8dQj7FbcQwm32pAAOwzkSFxvmjkI6TZraE3 -----END CERTIFICATE----- razorpay/libs/Requests-2.0.4/library/Deprecated.php 0000644 00000001114 15002216177 0016031 0 ustar 00 <?php /** * Backwards compatibility layer for Requests. * * Allows for Composer to autoload the old PSR-0 classes via the custom autoloader. * This prevents issues with _extending final classes_ (which was the previous solution). * * Please see the Changelog for the 2.0.0 release for upgrade notes. * * @package Requests * * @deprecated 2.0.0 Use the PSR-4 class names instead. */ if (class_exists('WpOrg\Requests\Autoload') === false) { require_once dirname(__DIR__) . '/src/Autoload.php'; // nosemgrep : https://semgrep.dev/s/e5El } WpOrg\Requests\Autoload::register(); razorpay/libs/Requests-2.0.4/library/README.md 0000644 00000000411 15002216177 0014536 0 ustar 00 ## The Library directory is deprecated. The files in this directory are only still in place to provide backward compatibility with Requests 1.x. Please see the release notes of Requests 2.0.0 on how to upgrade. This directory will be removed in Requests v 4.0.0. razorpay/libs/Requests-2.0.4/library/Requests.php 0000644 00000004475 15002216177 0015621 0 ustar 00 <?php /** * Requests for PHP * * Inspired by Requests for Python. * * Based on concepts from SimplePie_File, RequestCore and WP_Http. * * @package Requests * * @deprecated 2.0.0 */ /* * Integrators who cannot yet upgrade to the PSR-4 class names can silence deprecations * by defining a `REQUESTS_SILENCE_PSR0_DEPRECATIONS` constant and setting it to `true`. * The constant needs to be defined before this class is required. */ if (!defined('REQUESTS_SILENCE_PSR0_DEPRECATIONS') || REQUESTS_SILENCE_PSR0_DEPRECATIONS !== true) { // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_trigger_error trigger_error( 'The PSR-0 `Requests_...` class names in the Request library are deprecated.' . ' Switch to the PSR-4 `WpOrg\Requests\...` class names at your earliest convenience.', E_USER_DEPRECATED ); // Prevent the deprecation notice from being thrown twice. if (!defined('REQUESTS_SILENCE_PSR0_DEPRECATIONS')) { define('REQUESTS_SILENCE_PSR0_DEPRECATIONS', true); } } require_once dirname(__DIR__) . '/src/Requests.php'; // nosemgrep : https://semgrep.dev/s/e5El /** * Requests for PHP * * Inspired by Requests for Python. * * Based on concepts from SimplePie_File, RequestCore and WP_Http. * * @package Requests * * @deprecated 2.0.0 Use `WpOrg\Requests\Requests` instead for the actual functionality and * use `WpOrg\Requests\Autoload` for the autoloading. */ class Requests extends WpOrg\Requests\Requests { /** * Deprecated autoloader for Requests. * * @deprecated 2.0.0 Use the `WpOrg\Requests\Autoload::load()` method instead. * * @codeCoverageIgnore * * @param string $class Class name to load */ public static function autoloader($class) { if (class_exists('WpOrg\Requests\Autoload') === false) { require_once dirname(__DIR__) . '/src/Autoload.php'; // nosemgrep : https://semgrep.dev/s/e5El } return WpOrg\Requests\Autoload::load($class); } /** * Register the built-in autoloader * * @deprecated 2.0.0 Include the `WpOrg\Requests\Autoload` class and * call `WpOrg\Requests\Autoload::register()` instead. * * @codeCoverageIgnore */ public static function register_autoloader() { require_once dirname(__DIR__) . '/src/Autoload.php'; // nosemgrep : https://semgrep.dev/s/e5El WpOrg\Requests\Autoload::register(); } } razorpay/libs/Requests-2.0.4/README.md 0000644 00000013037 15002216177 0013102 0 ustar 00 Requests for PHP ================ [](https://github.com/WordPress/Requests/actions/workflows/cs.yml) [](https://github.com/WordPress/Requests/actions/workflows/lint.yml) [](https://github.com/WordPress/Requests/actions/workflows/test.yml) [](https://codecov.io/gh/WordPress/Requests?branch=stable) Requests is a HTTP library written in PHP, for human beings. It is roughly based on the API from the excellent [Requests Python library](http://python-requests.org/). Requests is [ISC Licensed](https://github.com/WordPress/Requests/blob/stable/LICENSE) (similar to the new BSD license) and has no dependencies, except for PHP 5.6+. Despite PHP's use as a language for the web, its tools for sending HTTP requests are severely lacking. cURL has an [interesting API](https://www.php.net/curl-setopt), to say the least, and you can't always rely on it being available. Sockets provide only low level access, and require you to build most of the HTTP response parsing yourself. We all have better things to do. That's why Requests was born. ```php $headers = array('Accept' => 'application/json'); $options = array('auth' => array('user', 'pass')); $request = WpOrg\Requests\Requests::get('https://api.github.com/gists', $headers, $options); var_dump($request->status_code); // int(200) var_dump($request->headers['content-type']); // string(31) "application/json; charset=utf-8" var_dump($request->body); // string(26891) "[...]" ``` Requests allows you to send **HEAD**, **GET**, **POST**, **PUT**, **DELETE**, and **PATCH** HTTP requests. You can add headers, form data, multipart files, and parameters with basic arrays, and access the response data in the same way. Requests uses cURL and fsockopen, depending on what your system has available, but abstracts all the nasty stuff out of your way, providing a consistent API. Features -------- - International Domains and URLs - Browser-style SSL Verification - Basic/Digest Authentication - Automatic Decompression - Connection Timeouts Installation ------------ ### Install with Composer If you're using [Composer](https://getcomposer.org/) to manage dependencies, you can add Requests with it. ```sh composer require rmccue/requests ``` or ```json { "require": { "rmccue/requests": "^2.0" } } ``` ### Install source from GitHub To install the source code: ```bash $ git clone git://github.com/WordPress/Requests.git ``` Next, include the autoloader in your scripts: ```php require_once '/path/to/Requests/src/Autoload.php'; ``` You'll probably also want to register the autoloader: ```php WpOrg\Requests\Autoload::register(); ``` ### Install source from zip/tarball Alternatively, you can fetch a [tarball][] or [zipball][]: ```bash $ curl -L https://github.com/WordPress/Requests/tarball/stable | tar xzv (or) $ wget https://github.com/WordPress/Requests/tarball/stable -O - | tar xzv ``` [tarball]: https://github.com/WordPress/Requests/tarball/stable [zipball]: https://github.com/WordPress/Requests/zipball/stable ### Using a Class Loader If you're using a class loader (e.g., [Symfony Class Loader][]) for [PSR-4][]-style class loading: ```php $loader = new Psr4ClassLoader(); $loader->addPrefix('WpOrg\\Requests\\', 'path/to/vendor/Requests/src'); $loader->register(); ``` [Symfony Class Loader]: https://github.com/symfony/ClassLoader [PSR-4]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4.md Documentation ------------- The best place to start is our [prose-based documentation][], which will guide you through using Requests. After that, take a look at [the documentation for `\WpOrg\Requests\Requests::request()`][request_method], where all the parameters are fully documented. Requests is [100% documented with PHPDoc](https://requests.ryanmccue.info/api-2.x/). If you find any problems with it, [create a new issue](https://github.com/WordPress/Requests/issues/new)! [prose-based documentation]: https://github.com/WordPress/Requests/blob/stable/docs/README.md [request_method]: https://requests.ryanmccue.info/api-2.x/classes/WpOrg-Requests-Requests.html#method_request Testing ------- Requests strives to have 100% code-coverage of the library with an extensive set of tests. We're not quite there yet, but [we're getting close][codecov]. [codecov]: https://codecov.io/github/WordPress/Requests/ To run the test suite, first check that you have the [PHP JSON extension ](https://www.php.net/book.json) enabled. Then simply: ```bash $ phpunit ``` If you'd like to run a single set of tests, specify just the name: ```bash $ phpunit Transport/cURL ``` Contribute ---------- 1. Check for open issues or open a new issue for a feature request or a bug. 2. Fork [the repository][] on Github to start making your changes to the `develop` branch (or branch off of it). 3. Write one or more tests which show that the bug was fixed or that the feature works as expected. 4. Send in a pull request. If you have questions while working on your contribution and you use Slack, there is a [#core-http-api] channel available in the [WordPress Slack] in which contributions can be discussed. [the repository]: https://github.com/WordPress/Requests [#core-http-api]: https://wordpress.slack.com/archives/C02BBE29V42 [WordPress Slack]: https://make.wordpress.org/chat/ razorpay/libs/Requests-2.0.4/LICENSE 0000644 00000004467 15002216177 0012637 0 ustar 00 Requests ======== Copyright (c) 2010-2012 Ryan McCue and contributors Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ComplexPie IRI Parser ===================== Copyright (c) 2007-2010, Geoffrey Sneddon and Steve Minutillo. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the SimplePie Team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. razorpay/libs/Requests-2.0.4/src/Ssl.php 0000644 00000012461 15002216177 0013664 0 ustar 00 <?php /** * SSL utilities for Requests * * @package Requests\Utilities */ namespace WpOrg\Requests; use WpOrg\Requests\Exception\InvalidArgument; use WpOrg\Requests\Utility\InputValidator; /** * SSL utilities for Requests * * Collection of utilities for working with and verifying SSL certificates. * * @package Requests\Utilities */ final class Ssl { /** * Verify the certificate against common name and subject alternative names * * Unfortunately, PHP doesn't check the certificate against the alternative * names, leading things like 'https://www.github.com/' to be invalid. * * @link https://tools.ietf.org/html/rfc2818#section-3.1 RFC2818, Section 3.1 * * @param string|Stringable $host Host name to verify against * @param array $cert Certificate data from openssl_x509_parse() * @return bool * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $host argument is not a string or a stringable object. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $cert argument is not an array or array accessible. */ public static function verify_certificate($host, $cert) { if (InputValidator::is_string_or_stringable($host) === false) { throw InvalidArgument::create(1, '$host', 'string|Stringable', gettype($host)); } if (InputValidator::has_array_access($cert) === false) { throw InvalidArgument::create(2, '$cert', 'array|ArrayAccess', gettype($cert)); } $has_dns_alt = false; // Check the subjectAltName if (!empty($cert['extensions']['subjectAltName'])) { $altnames = explode(',', $cert['extensions']['subjectAltName']); foreach ($altnames as $altname) { $altname = trim($altname); if (strpos($altname, 'DNS:') !== 0) { continue; } $has_dns_alt = true; // Strip the 'DNS:' prefix and trim whitespace $altname = trim(substr($altname, 4)); // Check for a match if (self::match_domain($host, $altname) === true) { return true; } } if ($has_dns_alt === true) { return false; } } // Fall back to checking the common name if we didn't get any dNSName // alt names, as per RFC2818 if (!empty($cert['subject']['CN'])) { // Check for a match return (self::match_domain($host, $cert['subject']['CN']) === true); } return false; } /** * Verify that a reference name is valid * * Verifies a dNSName for HTTPS usage, (almost) as per Firefox's rules: * - Wildcards can only occur in a name with more than 3 components * - Wildcards can only occur as the last character in the first * component * - Wildcards may be preceded by additional characters * * We modify these rules to be a bit stricter and only allow the wildcard * character to be the full first component; that is, with the exclusion of * the third rule. * * @param string|Stringable $reference Reference dNSName * @return boolean Is the name valid? * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string or a stringable object. */ public static function verify_reference_name($reference) { if (InputValidator::is_string_or_stringable($reference) === false) { throw InvalidArgument::create(1, '$reference', 'string|Stringable', gettype($reference)); } if ($reference === '') { return false; } if (preg_match('`\s`', $reference) > 0) { // Whitespace detected. This can never be a dNSName. return false; } $parts = explode('.', $reference); if ($parts !== array_filter($parts)) { // DNSName cannot contain two dots next to each other. return false; } // Check the first part of the name $first = array_shift($parts); if (strpos($first, '*') !== false) { // Check that the wildcard is the full part if ($first !== '*') { return false; } // Check that we have at least 3 components (including first) if (count($parts) < 2) { return false; } } // Check the remaining parts foreach ($parts as $part) { if (strpos($part, '*') !== false) { return false; } } // Nothing found, verified! return true; } /** * Match a hostname against a dNSName reference * * @param string|Stringable $host Requested host * @param string|Stringable $reference dNSName to match against * @return boolean Does the domain match? * @throws \WpOrg\Requests\Exception\InvalidArgument When either of the passed arguments is not a string or a stringable object. */ public static function match_domain($host, $reference) { if (InputValidator::is_string_or_stringable($host) === false) { throw InvalidArgument::create(1, '$host', 'string|Stringable', gettype($host)); } // Check if the reference is blocklisted first if (self::verify_reference_name($reference) !== true) { return false; } // Check for a direct match if ((string) $host === (string) $reference) { return true; } // Calculate the valid wildcard match if the host is not an IP address // Also validates that the host has 3 parts or more, as per Firefox's ruleset, // as a wildcard reference is only allowed with 3 parts or more, so the // comparison will never match if host doesn't contain 3 parts or more as well. if (ip2long($host) === false) { $parts = explode('.', $host); $parts[0] = '*'; $wildcard = implode('.', $parts); if ($wildcard === (string) $reference) { return true; } } return false; } } razorpay/libs/Requests-2.0.4/src/Port.php 0000644 00000002741 15002216177 0014047 0 ustar 00 <?php /** * Port utilities for Requests * * @package Requests\Utilities * @since 2.0.0 */ namespace WpOrg\Requests; use WpOrg\Requests\Exception; use WpOrg\Requests\Exception\InvalidArgument; /** * Find the correct port depending on the Request type. * * @package Requests\Utilities * @since 2.0.0 */ final class Port { /** * Port to use with Acap requests. * * @var int */ const ACAP = 674; /** * Port to use with Dictionary requests. * * @var int */ const DICT = 2628; /** * Port to use with HTTP requests. * * @var int */ const HTTP = 80; /** * Port to use with HTTP over SSL requests. * * @var int */ const HTTPS = 443; /** * Retrieve the port number to use. * * @param string $type Request type. * The following requests types are supported: * 'acap', 'dict', 'http' and 'https'. * * @return int * * @throws \WpOrg\Requests\Exception\InvalidArgument When a non-string input has been passed. * @throws \WpOrg\Requests\Exception When a non-supported port is requested ('portnotsupported'). */ public static function get($type) { if (!is_string($type)) { throw InvalidArgument::create(1, '$type', 'string', gettype($type)); } $type = strtoupper($type); if (!defined("self::{$type}")) { $message = sprintf('Invalid port type (%s) passed', $type); throw new Exception($message, 'portnotsupported'); } return constant("self::{$type}"); } } razorpay/libs/Requests-2.0.4/src/Iri.php 0000644 00000070555 15002216177 0013656 0 ustar 00 <?php /** * IRI parser/serialiser/normaliser * * @package Requests\Utilities */ namespace WpOrg\Requests; use WpOrg\Requests\Exception; use WpOrg\Requests\Exception\InvalidArgument; use WpOrg\Requests\Ipv6; use WpOrg\Requests\Port; use WpOrg\Requests\Utility\InputValidator; /** * IRI parser/serialiser/normaliser * * Copyright (c) 2007-2010, Geoffrey Sneddon and Steve Minutillo. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package Requests\Utilities * @author Geoffrey Sneddon * @author Steve Minutillo * @copyright 2007-2009 Geoffrey Sneddon and Steve Minutillo * @license https://opensource.org/licenses/bsd-license.php * @link http://hg.gsnedders.com/iri/ * * @property string $iri IRI we're working with * @property-read string $uri IRI in URI form, {@see \WpOrg\Requests\Iri::to_uri()} * @property string $scheme Scheme part of the IRI * @property string $authority Authority part, formatted for a URI (userinfo + host + port) * @property string $iauthority Authority part of the IRI (userinfo + host + port) * @property string $userinfo Userinfo part, formatted for a URI (after '://' and before '@') * @property string $iuserinfo Userinfo part of the IRI (after '://' and before '@') * @property string $host Host part, formatted for a URI * @property string $ihost Host part of the IRI * @property string $port Port part of the IRI (after ':') * @property string $path Path part, formatted for a URI (after first '/') * @property string $ipath Path part of the IRI (after first '/') * @property string $query Query part, formatted for a URI (after '?') * @property string $iquery Query part of the IRI (after '?') * @property string $fragment Fragment, formatted for a URI (after '#') * @property string $ifragment Fragment part of the IRI (after '#') */ class Iri { /** * Scheme * * @var string|null */ protected $scheme = null; /** * User Information * * @var string|null */ protected $iuserinfo = null; /** * ihost * * @var string|null */ protected $ihost = null; /** * Port * * @var string|null */ protected $port = null; /** * ipath * * @var string */ protected $ipath = ''; /** * iquery * * @var string|null */ protected $iquery = null; /** * ifragment|null * * @var string */ protected $ifragment = null; /** * Normalization database * * Each key is the scheme, each value is an array with each key as the IRI * part and value as the default value for that part. * * @var array */ protected $normalization = array( 'acap' => array( 'port' => Port::ACAP, ), 'dict' => array( 'port' => Port::DICT, ), 'file' => array( 'ihost' => 'localhost', ), 'http' => array( 'port' => Port::HTTP, ), 'https' => array( 'port' => Port::HTTPS, ), ); /** * Return the entire IRI when you try and read the object as a string * * @return string */ public function __toString() { return $this->get_iri(); } /** * Overload __set() to provide access via properties * * @param string $name Property name * @param mixed $value Property value */ public function __set($name, $value) { if (method_exists($this, 'set_' . $name)) { call_user_func(array($this, 'set_' . $name), $value); } elseif ( $name === 'iauthority' || $name === 'iuserinfo' || $name === 'ihost' || $name === 'ipath' || $name === 'iquery' || $name === 'ifragment' ) { call_user_func(array($this, 'set_' . substr($name, 1)), $value); } } /** * Overload __get() to provide access via properties * * @param string $name Property name * @return mixed */ public function __get($name) { // isset() returns false for null, we don't want to do that // Also why we use array_key_exists below instead of isset() $props = get_object_vars($this); if ( $name === 'iri' || $name === 'uri' || $name === 'iauthority' || $name === 'authority' ) { $method = 'get_' . $name; $return = $this->$method(); } elseif (array_key_exists($name, $props)) { $return = $this->$name; } // host -> ihost elseif (($prop = 'i' . $name) && array_key_exists($prop, $props)) { $name = $prop; $return = $this->$prop; } // ischeme -> scheme elseif (($prop = substr($name, 1)) && array_key_exists($prop, $props)) { $name = $prop; $return = $this->$prop; } else { trigger_error('Undefined property: ' . get_class($this) . '::' . $name, E_USER_NOTICE); $return = null; } if ($return === null && isset($this->normalization[$this->scheme][$name])) { return $this->normalization[$this->scheme][$name]; } else { return $return; } } /** * Overload __isset() to provide access via properties * * @param string $name Property name * @return bool */ public function __isset($name) { return (method_exists($this, 'get_' . $name) || isset($this->$name)); } /** * Overload __unset() to provide access via properties * * @param string $name Property name */ public function __unset($name) { if (method_exists($this, 'set_' . $name)) { call_user_func(array($this, 'set_' . $name), ''); } } /** * Create a new IRI object, from a specified string * * @param string|Stringable|null $iri * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $iri argument is not a string, Stringable or null. */ public function __construct($iri = null) { if ($iri !== null && InputValidator::is_string_or_stringable($iri) === false) { throw InvalidArgument::create(1, '$iri', 'string|Stringable|null', gettype($iri)); } $this->set_iri($iri); } /** * Create a new IRI object by resolving a relative IRI * * Returns false if $base is not absolute, otherwise an IRI. * * @param \WpOrg\Requests\Iri|string $base (Absolute) Base IRI * @param \WpOrg\Requests\Iri|string $relative Relative IRI * @return \WpOrg\Requests\Iri|false */ public static function absolutize($base, $relative) { if (!($relative instanceof self)) { $relative = new self($relative); } if (!$relative->is_valid()) { return false; } elseif ($relative->scheme !== null) { return clone $relative; } if (!($base instanceof self)) { $base = new self($base); } if ($base->scheme === null || !$base->is_valid()) { return false; } if ($relative->get_iri() !== '') { if ($relative->iuserinfo !== null || $relative->ihost !== null || $relative->port !== null) { $target = clone $relative; $target->scheme = $base->scheme; } else { $target = new self; $target->scheme = $base->scheme; $target->iuserinfo = $base->iuserinfo; $target->ihost = $base->ihost; $target->port = $base->port; if ($relative->ipath !== '') { if ($relative->ipath[0] === '/') { $target->ipath = $relative->ipath; } elseif (($base->iuserinfo !== null || $base->ihost !== null || $base->port !== null) && $base->ipath === '') { $target->ipath = '/' . $relative->ipath; } elseif (($last_segment = strrpos($base->ipath, '/')) !== false) { $target->ipath = substr($base->ipath, 0, $last_segment + 1) . $relative->ipath; } else { $target->ipath = $relative->ipath; } $target->ipath = $target->remove_dot_segments($target->ipath); $target->iquery = $relative->iquery; } else { $target->ipath = $base->ipath; if ($relative->iquery !== null) { $target->iquery = $relative->iquery; } elseif ($base->iquery !== null) { $target->iquery = $base->iquery; } } $target->ifragment = $relative->ifragment; } } else { $target = clone $base; $target->ifragment = null; } $target->scheme_normalization(); return $target; } /** * Parse an IRI into scheme/authority/path/query/fragment segments * * @param string $iri * @return array */ protected function parse_iri($iri) { $iri = trim($iri, "\x20\x09\x0A\x0C\x0D"); $has_match = preg_match('/^((?P<scheme>[^:\/?#]+):)?(\/\/(?P<authority>[^\/?#]*))?(?P<path>[^?#]*)(\?(?P<query>[^#]*))?(#(?P<fragment>.*))?$/', $iri, $match); if (!$has_match) { throw new Exception('Cannot parse supplied IRI', 'iri.cannot_parse', $iri); } if ($match[1] === '') { $match['scheme'] = null; } if (!isset($match[3]) || $match[3] === '') { $match['authority'] = null; } if (!isset($match[5])) { $match['path'] = ''; } if (!isset($match[6]) || $match[6] === '') { $match['query'] = null; } if (!isset($match[8]) || $match[8] === '') { $match['fragment'] = null; } return $match; } /** * Remove dot segments from a path * * @param string $input * @return string */ protected function remove_dot_segments($input) { $output = ''; while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..') { // A: If the input buffer begins with a prefix of "../" or "./", // then remove that prefix from the input buffer; otherwise, if (strpos($input, '../') === 0) { $input = substr($input, 3); } elseif (strpos($input, './') === 0) { $input = substr($input, 2); } // B: if the input buffer begins with a prefix of "/./" or "/.", // where "." is a complete path segment, then replace that prefix // with "/" in the input buffer; otherwise, elseif (strpos($input, '/./') === 0) { $input = substr($input, 2); } elseif ($input === '/.') { $input = '/'; } // C: if the input buffer begins with a prefix of "/../" or "/..", // where ".." is a complete path segment, then replace that prefix // with "/" in the input buffer and remove the last segment and its // preceding "/" (if any) from the output buffer; otherwise, elseif (strpos($input, '/../') === 0) { $input = substr($input, 3); $output = substr_replace($output, '', strrpos($output, '/')); } elseif ($input === '/..') { $input = '/'; $output = substr_replace($output, '', strrpos($output, '/')); } // D: if the input buffer consists only of "." or "..", then remove // that from the input buffer; otherwise, elseif ($input === '.' || $input === '..') { $input = ''; } // E: move the first path segment in the input buffer to the end of // the output buffer, including the initial "/" character (if any) // and any subsequent characters up to, but not including, the next // "/" character or the end of the input buffer elseif (($pos = strpos($input, '/', 1)) !== false) { $output .= substr($input, 0, $pos); $input = substr_replace($input, '', 0, $pos); } else { $output .= $input; $input = ''; } } return $output . $input; } /** * Replace invalid character with percent encoding * * @param string $text Input string * @param string $extra_chars Valid characters not in iunreserved or * iprivate (this is ASCII-only) * @param bool $iprivate Allow iprivate * @return string */ protected function replace_invalid_with_pct_encoding($text, $extra_chars, $iprivate = false) { // Normalize as many pct-encoded sections as possible $text = preg_replace_callback('/(?:%[A-Fa-f0-9]{2})+/', array($this, 'remove_iunreserved_percent_encoded'), $text); // Replace invalid percent characters $text = preg_replace('/%(?![A-Fa-f0-9]{2})/', '%25', $text); // Add unreserved and % to $extra_chars (the latter is safe because all // pct-encoded sections are now valid). $extra_chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%'; // Now replace any bytes that aren't allowed with their pct-encoded versions $position = 0; $strlen = strlen($text); while (($position += strspn($text, $extra_chars, $position)) < $strlen) { $value = ord($text[$position]); // Start position $start = $position; // By default we are valid $valid = true; // No one byte sequences are valid due to the while. // Two byte sequence: if (($value & 0xE0) === 0xC0) { $character = ($value & 0x1F) << 6; $length = 2; $remaining = 1; } // Three byte sequence: elseif (($value & 0xF0) === 0xE0) { $character = ($value & 0x0F) << 12; $length = 3; $remaining = 2; } // Four byte sequence: elseif (($value & 0xF8) === 0xF0) { $character = ($value & 0x07) << 18; $length = 4; $remaining = 3; } // Invalid byte: else { $valid = false; $length = 1; $remaining = 0; } if ($remaining) { if ($position + $length <= $strlen) { for ($position++; $remaining; $position++) { $value = ord($text[$position]); // Check that the byte is valid, then add it to the character: if (($value & 0xC0) === 0x80) { $character |= ($value & 0x3F) << (--$remaining * 6); } // If it is invalid, count the sequence as invalid and reprocess the current byte: else { $valid = false; $position--; break; } } } else { $position = $strlen - 1; $valid = false; } } // Percent encode anything invalid or not in ucschar if ( // Invalid sequences !$valid // Non-shortest form sequences are invalid || $length > 1 && $character <= 0x7F || $length > 2 && $character <= 0x7FF || $length > 3 && $character <= 0xFFFF // Outside of range of ucschar codepoints // Noncharacters || ($character & 0xFFFE) === 0xFFFE || $character >= 0xFDD0 && $character <= 0xFDEF || ( // Everything else not in ucschar $character > 0xD7FF && $character < 0xF900 || $character < 0xA0 || $character > 0xEFFFD ) && ( // Everything not in iprivate, if it applies !$iprivate || $character < 0xE000 || $character > 0x10FFFD ) ) { // If we were a character, pretend we weren't, but rather an error. if ($valid) { $position--; } for ($j = $start; $j <= $position; $j++) { $text = substr_replace($text, sprintf('%%%02X', ord($text[$j])), $j, 1); $j += 2; $position += 2; $strlen += 2; } } } return $text; } /** * Callback function for preg_replace_callback. * * Removes sequences of percent encoded bytes that represent UTF-8 * encoded characters in iunreserved * * @param array $regex_match PCRE match * @return string Replacement */ protected function remove_iunreserved_percent_encoded($regex_match) { // As we just have valid percent encoded sequences we can just explode // and ignore the first member of the returned array (an empty string). $bytes = explode('%', $regex_match[0]); // Initialize the new string (this is what will be returned) and that // there are no bytes remaining in the current sequence (unsurprising // at the first byte!). $string = ''; $remaining = 0; // Loop over each and every byte, and set $value to its value for ($i = 1, $len = count($bytes); $i < $len; $i++) { $value = hexdec($bytes[$i]); // If we're the first byte of sequence: if (!$remaining) { // Start position $start = $i; // By default we are valid $valid = true; // One byte sequence: if ($value <= 0x7F) { $character = $value; $length = 1; } // Two byte sequence: elseif (($value & 0xE0) === 0xC0) { $character = ($value & 0x1F) << 6; $length = 2; $remaining = 1; } // Three byte sequence: elseif (($value & 0xF0) === 0xE0) { $character = ($value & 0x0F) << 12; $length = 3; $remaining = 2; } // Four byte sequence: elseif (($value & 0xF8) === 0xF0) { $character = ($value & 0x07) << 18; $length = 4; $remaining = 3; } // Invalid byte: else { $valid = false; $remaining = 0; } } // Continuation byte: else { // Check that the byte is valid, then add it to the character: if (($value & 0xC0) === 0x80) { $remaining--; $character |= ($value & 0x3F) << ($remaining * 6); } // If it is invalid, count the sequence as invalid and reprocess the current byte as the start of a sequence: else { $valid = false; $remaining = 0; $i--; } } // If we've reached the end of the current byte sequence, append it to Unicode::$data if (!$remaining) { // Percent encode anything invalid or not in iunreserved if ( // Invalid sequences !$valid // Non-shortest form sequences are invalid || $length > 1 && $character <= 0x7F || $length > 2 && $character <= 0x7FF || $length > 3 && $character <= 0xFFFF // Outside of range of iunreserved codepoints || $character < 0x2D || $character > 0xEFFFD // Noncharacters || ($character & 0xFFFE) === 0xFFFE || $character >= 0xFDD0 && $character <= 0xFDEF // Everything else not in iunreserved (this is all BMP) || $character === 0x2F || $character > 0x39 && $character < 0x41 || $character > 0x5A && $character < 0x61 || $character > 0x7A && $character < 0x7E || $character > 0x7E && $character < 0xA0 || $character > 0xD7FF && $character < 0xF900 ) { for ($j = $start; $j <= $i; $j++) { $string .= '%' . strtoupper($bytes[$j]); } } else { for ($j = $start; $j <= $i; $j++) { $string .= chr(hexdec($bytes[$j])); } } } } // If we have any bytes left over they are invalid (i.e., we are // mid-way through a multi-byte sequence) if ($remaining) { for ($j = $start; $j < $len; $j++) { $string .= '%' . strtoupper($bytes[$j]); } } return $string; } protected function scheme_normalization() { if (isset($this->normalization[$this->scheme]['iuserinfo']) && $this->iuserinfo === $this->normalization[$this->scheme]['iuserinfo']) { $this->iuserinfo = null; } if (isset($this->normalization[$this->scheme]['ihost']) && $this->ihost === $this->normalization[$this->scheme]['ihost']) { $this->ihost = null; } if (isset($this->normalization[$this->scheme]['port']) && $this->port === $this->normalization[$this->scheme]['port']) { $this->port = null; } if (isset($this->normalization[$this->scheme]['ipath']) && $this->ipath === $this->normalization[$this->scheme]['ipath']) { $this->ipath = ''; } if (isset($this->ihost) && empty($this->ipath)) { $this->ipath = '/'; } if (isset($this->normalization[$this->scheme]['iquery']) && $this->iquery === $this->normalization[$this->scheme]['iquery']) { $this->iquery = null; } if (isset($this->normalization[$this->scheme]['ifragment']) && $this->ifragment === $this->normalization[$this->scheme]['ifragment']) { $this->ifragment = null; } } /** * Check if the object represents a valid IRI. This needs to be done on each * call as some things change depending on another part of the IRI. * * @return bool */ public function is_valid() { $isauthority = $this->iuserinfo !== null || $this->ihost !== null || $this->port !== null; if ($this->ipath !== '' && ( $isauthority && $this->ipath[0] !== '/' || ( $this->scheme === null && !$isauthority && strpos($this->ipath, ':') !== false && (strpos($this->ipath, '/') === false ? true : strpos($this->ipath, ':') < strpos($this->ipath, '/')) ) ) ) { return false; } return true; } /** * Set the entire IRI. Returns true on success, false on failure (if there * are any invalid characters). * * @param string $iri * @return bool */ protected function set_iri($iri) { static $cache; if (!$cache) { $cache = array(); } if ($iri === null) { return true; } $iri = (string) $iri; if (isset($cache[$iri])) { list($this->scheme, $this->iuserinfo, $this->ihost, $this->port, $this->ipath, $this->iquery, $this->ifragment, $return) = $cache[$iri]; return $return; } $parsed = $this->parse_iri($iri); $return = $this->set_scheme($parsed['scheme']) && $this->set_authority($parsed['authority']) && $this->set_path($parsed['path']) && $this->set_query($parsed['query']) && $this->set_fragment($parsed['fragment']); $cache[$iri] = array($this->scheme, $this->iuserinfo, $this->ihost, $this->port, $this->ipath, $this->iquery, $this->ifragment, $return); return $return; } /** * Set the scheme. Returns true on success, false on failure (if there are * any invalid characters). * * @param string $scheme * @return bool */ protected function set_scheme($scheme) { if ($scheme === null) { $this->scheme = null; } elseif (!preg_match('/^[A-Za-z][0-9A-Za-z+\-.]*$/', $scheme)) { $this->scheme = null; return false; } else { $this->scheme = strtolower($scheme); } return true; } /** * Set the authority. Returns true on success, false on failure (if there are * any invalid characters). * * @param string $authority * @return bool */ protected function set_authority($authority) { static $cache; if (!$cache) { $cache = array(); } if ($authority === null) { $this->iuserinfo = null; $this->ihost = null; $this->port = null; return true; } if (isset($cache[$authority])) { list($this->iuserinfo, $this->ihost, $this->port, $return) = $cache[$authority]; return $return; } $remaining = $authority; if (($iuserinfo_end = strrpos($remaining, '@')) !== false) { $iuserinfo = substr($remaining, 0, $iuserinfo_end); $remaining = substr($remaining, $iuserinfo_end + 1); } else { $iuserinfo = null; } if (($port_start = strpos($remaining, ':', strpos($remaining, ']'))) !== false) { $port = substr($remaining, $port_start + 1); if ($port === false || $port === '') { $port = null; } $remaining = substr($remaining, 0, $port_start); } else { $port = null; } $return = $this->set_userinfo($iuserinfo) && $this->set_host($remaining) && $this->set_port($port); $cache[$authority] = array($this->iuserinfo, $this->ihost, $this->port, $return); return $return; } /** * Set the iuserinfo. * * @param string $iuserinfo * @return bool */ protected function set_userinfo($iuserinfo) { if ($iuserinfo === null) { $this->iuserinfo = null; } else { $this->iuserinfo = $this->replace_invalid_with_pct_encoding($iuserinfo, '!$&\'()*+,;=:'); $this->scheme_normalization(); } return true; } /** * Set the ihost. Returns true on success, false on failure (if there are * any invalid characters). * * @param string $ihost * @return bool */ protected function set_host($ihost) { if ($ihost === null) { $this->ihost = null; return true; } if (substr($ihost, 0, 1) === '[' && substr($ihost, -1) === ']') { if (Ipv6::check_ipv6(substr($ihost, 1, -1))) { $this->ihost = '[' . Ipv6::compress(substr($ihost, 1, -1)) . ']'; } else { $this->ihost = null; return false; } } else { $ihost = $this->replace_invalid_with_pct_encoding($ihost, '!$&\'()*+,;='); // Lowercase, but ignore pct-encoded sections (as they should // remain uppercase). This must be done after the previous step // as that can add unescaped characters. $position = 0; $strlen = strlen($ihost); while (($position += strcspn($ihost, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ%', $position)) < $strlen) { if ($ihost[$position] === '%') { $position += 3; } else { $ihost[$position] = strtolower($ihost[$position]); $position++; } } $this->ihost = $ihost; } $this->scheme_normalization(); return true; } /** * Set the port. Returns true on success, false on failure (if there are * any invalid characters). * * @param string $port * @return bool */ protected function set_port($port) { if ($port === null) { $this->port = null; return true; } if (strspn($port, '0123456789') === strlen($port)) { $this->port = (int) $port; $this->scheme_normalization(); return true; } $this->port = null; return false; } /** * Set the ipath. * * @param string $ipath * @return bool */ protected function set_path($ipath) { static $cache; if (!$cache) { $cache = array(); } $ipath = (string) $ipath; if (isset($cache[$ipath])) { $this->ipath = $cache[$ipath][(int) ($this->scheme !== null)]; } else { $valid = $this->replace_invalid_with_pct_encoding($ipath, '!$&\'()*+,;=@:/'); $removed = $this->remove_dot_segments($valid); $cache[$ipath] = array($valid, $removed); $this->ipath = ($this->scheme !== null) ? $removed : $valid; } $this->scheme_normalization(); return true; } /** * Set the iquery. * * @param string $iquery * @return bool */ protected function set_query($iquery) { if ($iquery === null) { $this->iquery = null; } else { $this->iquery = $this->replace_invalid_with_pct_encoding($iquery, '!$&\'()*+,;=:@/?', true); $this->scheme_normalization(); } return true; } /** * Set the ifragment. * * @param string $ifragment * @return bool */ protected function set_fragment($ifragment) { if ($ifragment === null) { $this->ifragment = null; } else { $this->ifragment = $this->replace_invalid_with_pct_encoding($ifragment, '!$&\'()*+,;=:@/?'); $this->scheme_normalization(); } return true; } /** * Convert an IRI to a URI (or parts thereof) * * @param string|bool $iri IRI to convert (or false from {@see \WpOrg\Requests\Iri::get_iri()}) * @return string|false URI if IRI is valid, false otherwise. */ protected function to_uri($iri) { if (!is_string($iri)) { return false; } static $non_ascii; if (!$non_ascii) { $non_ascii = implode('', range("\x80", "\xFF")); } $position = 0; $strlen = strlen($iri); while (($position += strcspn($iri, $non_ascii, $position)) < $strlen) { $iri = substr_replace($iri, sprintf('%%%02X', ord($iri[$position])), $position, 1); $position += 3; $strlen += 2; } return $iri; } /** * Get the complete IRI * * @return string|false */ protected function get_iri() { if (!$this->is_valid()) { return false; } $iri = ''; if ($this->scheme !== null) { $iri .= $this->scheme . ':'; } if (($iauthority = $this->get_iauthority()) !== null) { $iri .= '//' . $iauthority; } $iri .= $this->ipath; if ($this->iquery !== null) { $iri .= '?' . $this->iquery; } if ($this->ifragment !== null) { $iri .= '#' . $this->ifragment; } return $iri; } /** * Get the complete URI * * @return string */ protected function get_uri() { return $this->to_uri($this->get_iri()); } /** * Get the complete iauthority * * @return string|null */ protected function get_iauthority() { if ($this->iuserinfo === null && $this->ihost === null && $this->port === null) { return null; } $iauthority = ''; if ($this->iuserinfo !== null) { $iauthority .= $this->iuserinfo . '@'; } if ($this->ihost !== null) { $iauthority .= $this->ihost; } if ($this->port !== null) { $iauthority .= ':' . $this->port; } return $iauthority; } /** * Get the complete authority * * @return string */ protected function get_authority() { $iauthority = $this->get_iauthority(); if (is_string($iauthority)) { return $this->to_uri($iauthority); } else { return $iauthority; } } } razorpay/libs/Requests-2.0.4/src/Exception/InvalidArgument.php 0000644 00000002122 15002216177 0020143 0 ustar 00 <?php namespace WpOrg\Requests\Exception; use InvalidArgumentException; /** * Exception for an invalid argument passed. * * @package Requests\Exceptions * @since 2.0.0 */ final class InvalidArgument extends InvalidArgumentException { /** * Create a new invalid argument exception with a standardized text. * * @param int $position The argument position in the function signature. 1-based. * @param string $name The argument name in the function signature. * @param string $expected The argument type expected as a string. * @param string $received The actual argument type received. * * @return \WpOrg\Requests\Exception\InvalidArgument */ public static function create($position, $name, $expected, $received) { // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_debug_backtrace $stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); return new self( sprintf( '%s::%s(): Argument #%d (%s) must be of type %s, %s given', $stack[1]['class'], $stack[1]['function'], $position, $name, $expected, $received ) ); } } razorpay/libs/Requests-2.0.4/src/Exception/ArgumentCount.php 0000644 00000002664 15002216177 0017660 0 ustar 00 <?php namespace WpOrg\Requests\Exception; use WpOrg\Requests\Exception; /** * Exception for when an incorrect number of arguments are passed to a method. * * Typically, this exception is used when all arguments for a method are optional, * but certain arguments need to be passed together, i.e. a method which can be called * with no arguments or with two arguments, but not with one argument. * * Along the same lines, this exception is also used if a method expects an array * with a certain number of elements and the provided number of elements does not comply. * * @package Requests\Exceptions * @since 2.0.0 */ final class ArgumentCount extends Exception { /** * Create a new argument count exception with a standardized text. * * @param string $expected The argument count expected as a phrase. * For example: `at least 2 arguments` or `exactly 1 argument`. * @param int $received The actual argument count received. * @param string $type Exception type. * * @return \WpOrg\Requests\Exception\ArgumentCount */ public static function create($expected, $received, $type) { // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_debug_backtrace $stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); return new self( sprintf( '%s::%s() expects %s, %d given', $stack[1]['class'], $stack[1]['function'], $expected, $received ), $type ); } } razorpay/libs/Requests-2.0.4/src/Exception/Http.php 0000644 00000003006 15002216177 0015773 0 ustar 00 <?php /** * Exception based on HTTP response * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception; use WpOrg\Requests\Exception; use WpOrg\Requests\Exception\Http\StatusUnknown; /** * Exception based on HTTP response * * @package Requests\Exceptions */ class Http extends Exception { /** * HTTP status code * * @var integer */ protected $code = 0; /** * Reason phrase * * @var string */ protected $reason = 'Unknown'; /** * Create a new exception * * There is no mechanism to pass in the status code, as this is set by the * subclass used. Reason phrases can vary, however. * * @param string|null $reason Reason phrase * @param mixed $data Associated data */ public function __construct($reason = null, $data = null) { if ($reason !== null) { $this->reason = $reason; } $message = sprintf('%d %s', $this->code, $this->reason); parent::__construct($message, 'httpresponse', $data, $this->code); } /** * Get the status message. * * @return string */ public function getReason() { return $this->reason; } /** * Get the correct exception class for a given error code * * @param int|bool $code HTTP status code, or false if unavailable * @return string Exception class name to use */ public static function get_class($code) { if (!$code) { return StatusUnknown::class; } $class = sprintf('\WpOrg\Requests\Exception\Http\Status%d', $code); if (class_exists($class)) { return $class; } return StatusUnknown::class; } } razorpay/libs/Requests-2.0.4/src/Exception/Transport.php 0000644 00000000364 15002216177 0017054 0 ustar 00 <?php /** * Transport Exception * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception; use WpOrg\Requests\Exception; /** * Transport Exception * * @package Requests\Exceptions */ class Transport extends Exception {} razorpay/libs/Requests-2.0.4/src/Exception/Transport/Curl.php 0000644 00000002565 15002216177 0017766 0 ustar 00 <?php /** * CURL Transport Exception. * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Transport; use WpOrg\Requests\Exception\Transport; /** * CURL Transport Exception. * * @package Requests\Exceptions */ final class Curl extends Transport { const EASY = 'cURLEasy'; const MULTI = 'cURLMulti'; const SHARE = 'cURLShare'; /** * cURL error code * * @var integer */ protected $code = -1; /** * Which type of cURL error * * EASY|MULTI|SHARE * * @var string */ protected $type = 'Unknown'; /** * Clear text error message * * @var string */ protected $reason = 'Unknown'; /** * Create a new exception. * * @param string $message Exception message. * @param string $type Exception type. * @param mixed $data Associated data, if applicable. * @param int $code Exception numerical code, if applicable. */ public function __construct($message, $type, $data = null, $code = 0) { if ($type !== null) { $this->type = $type; } if ($code !== null) { $this->code = (int) $code; } if ($message !== null) { $this->reason = $message; } $message = sprintf('%d %s', $this->code, $this->reason); parent::__construct($message, $this->type, $data, $this->code); } /** * Get the error message. * * @return string */ public function getReason() { return $this->reason; } } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status402.php 0000644 00000000730 15002216177 0017505 0 ustar 00 <?php /** * Exception for 402 Payment Required responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 402 Payment Required responses * * @package Requests\Exceptions */ final class Status402 extends Http { /** * HTTP status code * * @var integer */ protected $code = 402; /** * Reason phrase * * @var string */ protected $reason = 'Payment Required'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status401.php 0000644 00000000714 15002216177 0017506 0 ustar 00 <?php /** * Exception for 401 Unauthorized responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 401 Unauthorized responses * * @package Requests\Exceptions */ final class Status401 extends Http { /** * HTTP status code * * @var integer */ protected $code = 401; /** * Reason phrase * * @var string */ protected $reason = 'Unauthorized'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status403.php 0000644 00000000703 15002216177 0017506 0 ustar 00 <?php /** * Exception for 403 Forbidden responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 403 Forbidden responses * * @package Requests\Exceptions */ final class Status403 extends Http { /** * HTTP status code * * @var integer */ protected $code = 403; /** * Reason phrase * * @var string */ protected $reason = 'Forbidden'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status414.php 0000644 00000000747 15002216177 0017520 0 ustar 00 <?php /** * Exception for 414 Request-URI Too Large responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 414 Request-URI Too Large responses * * @package Requests\Exceptions */ final class Status414 extends Http { /** * HTTP status code * * @var integer */ protected $code = 414; /** * Reason phrase * * @var string */ protected $reason = 'Request-URI Too Large'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status503.php 0000644 00000000741 15002216177 0017511 0 ustar 00 <?php /** * Exception for 503 Service Unavailable responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 503 Service Unavailable responses * * @package Requests\Exceptions */ final class Status503 extends Http { /** * HTTP status code * * @var integer */ protected $code = 503; /** * Reason phrase * * @var string */ protected $reason = 'Service Unavailable'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status410.php 0000644 00000000664 15002216177 0017512 0 ustar 00 <?php /** * Exception for 410 Gone responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 410 Gone responses * * @package Requests\Exceptions */ final class Status410 extends Http { /** * HTTP status code * * @var integer */ protected $code = 410; /** * Reason phrase * * @var string */ protected $reason = 'Gone'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status305.php 0000644 00000000703 15002216177 0017507 0 ustar 00 <?php /** * Exception for 305 Use Proxy responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 305 Use Proxy responses * * @package Requests\Exceptions */ final class Status305 extends Http { /** * HTTP status code * * @var integer */ protected $code = 305; /** * Reason phrase * * @var string */ protected $reason = 'Use Proxy'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status404.php 0000644 00000000703 15002216177 0017507 0 ustar 00 <?php /** * Exception for 404 Not Found responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 404 Not Found responses * * @package Requests\Exceptions */ final class Status404 extends Http { /** * HTTP status code * * @var integer */ protected $code = 404; /** * Reason phrase * * @var string */ protected $reason = 'Not Found'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status413.php 0000644 00000000760 15002216177 0017512 0 ustar 00 <?php /** * Exception for 413 Request Entity Too Large responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 413 Request Entity Too Large responses * * @package Requests\Exceptions */ final class Status413 extends Http { /** * HTTP status code * * @var integer */ protected $code = 413; /** * Reason phrase * * @var string */ protected $reason = 'Request Entity Too Large'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status418.php 0000644 00000001054 15002216177 0017514 0 ustar 00 <?php /** * Exception for 418 I'm A Teapot responses * * @link https://tools.ietf.org/html/rfc2324 * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 418 I'm A Teapot responses * * @link https://tools.ietf.org/html/rfc2324 * * @package Requests\Exceptions */ final class Status418 extends Http { /** * HTTP status code * * @var integer */ protected $code = 418; /** * Reason phrase * * @var string */ protected $reason = "I'm A Teapot"; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status502.php 0000644 00000000711 15002216177 0017505 0 ustar 00 <?php /** * Exception for 502 Bad Gateway responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 502 Bad Gateway responses * * @package Requests\Exceptions */ final class Status502 extends Http { /** * HTTP status code * * @var integer */ protected $code = 502; /** * Reason phrase * * @var string */ protected $reason = 'Bad Gateway'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status501.php 0000644 00000000725 15002216177 0017511 0 ustar 00 <?php /** * Exception for 501 Not Implemented responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 501 Not Implemented responses * * @package Requests\Exceptions */ final class Status501 extends Http { /** * HTTP status code * * @var integer */ protected $code = 501; /** * Reason phrase * * @var string */ protected $reason = 'Not Implemented'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status505.php 0000644 00000000766 15002216177 0017522 0 ustar 00 <?php /** * Exception for 505 HTTP Version Not Supported responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 505 HTTP Version Not Supported responses * * @package Requests\Exceptions */ final class Status505 extends Http { /** * HTTP status code * * @var integer */ protected $code = 505; /** * Reason phrase * * @var string */ protected $reason = 'HTTP Version Not Supported'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status416.php 0000644 00000001005 15002216177 0017506 0 ustar 00 <?php /** * Exception for 416 Requested Range Not Satisfiable responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 416 Requested Range Not Satisfiable responses * * @package Requests\Exceptions */ final class Status416 extends Http { /** * HTTP status code * * @var integer */ protected $code = 416; /** * Reason phrase * * @var string */ protected $reason = 'Requested Range Not Satisfiable'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status407.php 0000644 00000000777 15002216177 0017525 0 ustar 00 <?php /** * Exception for 407 Proxy Authentication Required responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 407 Proxy Authentication Required responses * * @package Requests\Exceptions */ final class Status407 extends Http { /** * HTTP status code * * @var integer */ protected $code = 407; /** * Reason phrase * * @var string */ protected $reason = 'Proxy Authentication Required'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status431.php 0000644 00000001145 15002216177 0017510 0 ustar 00 <?php /** * Exception for 431 Request Header Fields Too Large responses * * @link https://tools.ietf.org/html/rfc6585 * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 431 Request Header Fields Too Large responses * * @link https://tools.ietf.org/html/rfc6585 * * @package Requests\Exceptions */ final class Status431 extends Http { /** * HTTP status code * * @var integer */ protected $code = 431; /** * Reason phrase * * @var string */ protected $reason = 'Request Header Fields Too Large'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status408.php 0000644 00000000725 15002216177 0017517 0 ustar 00 <?php /** * Exception for 408 Request Timeout responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 408 Request Timeout responses * * @package Requests\Exceptions */ final class Status408 extends Http { /** * HTTP status code * * @var integer */ protected $code = 408; /** * Reason phrase * * @var string */ protected $reason = 'Request Timeout'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status411.php 0000644 00000000725 15002216177 0017511 0 ustar 00 <?php /** * Exception for 411 Length Required responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 411 Length Required responses * * @package Requests\Exceptions */ final class Status411 extends Http { /** * HTTP status code * * @var integer */ protected $code = 411; /** * Reason phrase * * @var string */ protected $reason = 'Length Required'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status504.php 0000644 00000000725 15002216177 0017514 0 ustar 00 <?php /** * Exception for 504 Gateway Timeout responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 504 Gateway Timeout responses * * @package Requests\Exceptions */ final class Status504 extends Http { /** * HTTP status code * * @var integer */ protected $code = 504; /** * Reason phrase * * @var string */ protected $reason = 'Gateway Timeout'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status415.php 0000644 00000000752 15002216177 0017515 0 ustar 00 <?php /** * Exception for 415 Unsupported Media Type responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 415 Unsupported Media Type responses * * @package Requests\Exceptions */ final class Status415 extends Http { /** * HTTP status code * * @var integer */ protected $code = 415; /** * Reason phrase * * @var string */ protected $reason = 'Unsupported Media Type'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status406.php 0000644 00000000722 15002216177 0017512 0 ustar 00 <?php /** * Exception for 406 Not Acceptable responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 406 Not Acceptable responses * * @package Requests\Exceptions */ final class Status406 extends Http { /** * HTTP status code * * @var integer */ protected $code = 406; /** * Reason phrase * * @var string */ protected $reason = 'Not Acceptable'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status400.php 0000644 00000000711 15002216177 0017502 0 ustar 00 <?php /** * Exception for 400 Bad Request responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 400 Bad Request responses * * @package Requests\Exceptions */ final class Status400 extends Http { /** * HTTP status code * * @var integer */ protected $code = 400; /** * Reason phrase * * @var string */ protected $reason = 'Bad Request'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/StatusUnknown.php 0000644 00000001712 15002216177 0020640 0 ustar 00 <?php /** * Exception for unknown status responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; use WpOrg\Requests\Response; /** * Exception for unknown status responses * * @package Requests\Exceptions */ final class StatusUnknown extends Http { /** * HTTP status code * * @var integer|bool Code if available, false if an error occurred */ protected $code = 0; /** * Reason phrase * * @var string */ protected $reason = 'Unknown'; /** * Create a new exception * * If `$data` is an instance of {@see \WpOrg\Requests\Response}, uses the status * code from it. Otherwise, sets as 0 * * @param string|null $reason Reason phrase * @param mixed $data Associated data */ public function __construct($reason = null, $data = null) { if ($data instanceof Response) { $this->code = (int) $data->status_code; } parent::__construct($reason, $data); } } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status306.php 0000644 00000000714 15002216177 0017512 0 ustar 00 <?php /** * Exception for 306 Switch Proxy responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 306 Switch Proxy responses * * @package Requests\Exceptions */ final class Status306 extends Http { /** * HTTP status code * * @var integer */ protected $code = 306; /** * Reason phrase * * @var string */ protected $reason = 'Switch Proxy'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status409.php 0000644 00000000700 15002216177 0017511 0 ustar 00 <?php /** * Exception for 409 Conflict responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 409 Conflict responses * * @package Requests\Exceptions */ final class Status409 extends Http { /** * HTTP status code * * @var integer */ protected $code = 409; /** * Reason phrase * * @var string */ protected $reason = 'Conflict'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status405.php 0000644 00000000736 15002216177 0017516 0 ustar 00 <?php /** * Exception for 405 Method Not Allowed responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 405 Method Not Allowed responses * * @package Requests\Exceptions */ final class Status405 extends Http { /** * HTTP status code * * @var integer */ protected $code = 405; /** * Reason phrase * * @var string */ protected $reason = 'Method Not Allowed'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status429.php 0000644 00000001163 15002216177 0017517 0 ustar 00 <?php /** * Exception for 429 Too Many Requests responses * * @link https://tools.ietf.org/html/draft-nottingham-http-new-status-04 * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 429 Too Many Requests responses * * @link https://tools.ietf.org/html/draft-nottingham-http-new-status-04 * * @package Requests\Exceptions */ final class Status429 extends Http { /** * HTTP status code * * @var integer */ protected $code = 429; /** * Reason phrase * * @var string */ protected $reason = 'Too Many Requests'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status412.php 0000644 00000000741 15002216177 0017510 0 ustar 00 <?php /** * Exception for 412 Precondition Failed responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 412 Precondition Failed responses * * @package Requests\Exceptions */ final class Status412 extends Http { /** * HTTP status code * * @var integer */ protected $code = 412; /** * Reason phrase * * @var string */ protected $reason = 'Precondition Failed'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status304.php 0000644 00000000714 15002216177 0017510 0 ustar 00 <?php /** * Exception for 304 Not Modified responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 304 Not Modified responses * * @package Requests\Exceptions */ final class Status304 extends Http { /** * HTTP status code * * @var integer */ protected $code = 304; /** * Reason phrase * * @var string */ protected $reason = 'Not Modified'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status500.php 0000644 00000000747 15002216177 0017514 0 ustar 00 <?php /** * Exception for 500 Internal Server Error responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 500 Internal Server Error responses * * @package Requests\Exceptions */ final class Status500 extends Http { /** * HTTP status code * * @var integer */ protected $code = 500; /** * Reason phrase * * @var string */ protected $reason = 'Internal Server Error'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status511.php 0000644 00000001145 15002216177 0017507 0 ustar 00 <?php /** * Exception for 511 Network Authentication Required responses * * @link https://tools.ietf.org/html/rfc6585 * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 511 Network Authentication Required responses * * @link https://tools.ietf.org/html/rfc6585 * * @package Requests\Exceptions */ final class Status511 extends Http { /** * HTTP status code * * @var integer */ protected $code = 511; /** * Reason phrase * * @var string */ protected $reason = 'Network Authentication Required'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status428.php 0000644 00000001107 15002216177 0017514 0 ustar 00 <?php /** * Exception for 428 Precondition Required responses * * @link https://tools.ietf.org/html/rfc6585 * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 428 Precondition Required responses * * @link https://tools.ietf.org/html/rfc6585 * * @package Requests\Exceptions */ final class Status428 extends Http { /** * HTTP status code * * @var integer */ protected $code = 428; /** * Reason phrase * * @var string */ protected $reason = 'Precondition Required'; } razorpay/libs/Requests-2.0.4/src/Exception/Http/Status417.php 0000644 00000000736 15002216177 0017521 0 ustar 00 <?php /** * Exception for 417 Expectation Failed responses * * @package Requests\Exceptions */ namespace WpOrg\Requests\Exception\Http; use WpOrg\Requests\Exception\Http; /** * Exception for 417 Expectation Failed responses * * @package Requests\Exceptions */ final class Status417 extends Http { /** * HTTP status code * * @var integer */ protected $code = 417; /** * Reason phrase * * @var string */ protected $reason = 'Expectation Failed'; } razorpay/libs/Requests-2.0.4/src/IdnaEncoder.php 0000644 00000030114 15002216177 0015271 0 ustar 00 <?php namespace WpOrg\Requests; use WpOrg\Requests\Exception; use WpOrg\Requests\Exception\InvalidArgument; use WpOrg\Requests\Utility\InputValidator; /** * IDNA URL encoder * * Note: Not fully compliant, as nameprep does nothing yet. * * @package Requests\Utilities * * @link https://tools.ietf.org/html/rfc3490 IDNA specification * @link https://tools.ietf.org/html/rfc3492 Punycode/Bootstrap specification */ class IdnaEncoder { /** * ACE prefix used for IDNA * * @link https://tools.ietf.org/html/rfc3490#section-5 * @var string */ const ACE_PREFIX = 'xn--'; /** * Maximum length of a IDNA URL in ASCII. * * @see \WpOrg\Requests\IdnaEncoder::to_ascii() * * @since 2.0.0 * * @var int */ const MAX_LENGTH = 64; /**#@+ * Bootstrap constant for Punycode * * @link https://tools.ietf.org/html/rfc3492#section-5 * @var int */ const BOOTSTRAP_BASE = 36; const BOOTSTRAP_TMIN = 1; const BOOTSTRAP_TMAX = 26; const BOOTSTRAP_SKEW = 38; const BOOTSTRAP_DAMP = 700; const BOOTSTRAP_INITIAL_BIAS = 72; const BOOTSTRAP_INITIAL_N = 128; /**#@-*/ /** * Encode a hostname using Punycode * * @param string|Stringable $hostname Hostname * @return string Punycode-encoded hostname * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string or a stringable object. */ public static function encode($hostname) { if (InputValidator::is_string_or_stringable($hostname) === false) { throw InvalidArgument::create(1, '$hostname', 'string|Stringable', gettype($hostname)); } $parts = explode('.', $hostname); foreach ($parts as &$part) { $part = self::to_ascii($part); } return implode('.', $parts); } /** * Convert a UTF-8 text string to an ASCII string using Punycode * * @param string $text ASCII or UTF-8 string (max length 64 characters) * @return string ASCII string * * @throws \WpOrg\Requests\Exception Provided string longer than 64 ASCII characters (`idna.provided_too_long`) * @throws \WpOrg\Requests\Exception Prepared string longer than 64 ASCII characters (`idna.prepared_too_long`) * @throws \WpOrg\Requests\Exception Provided string already begins with xn-- (`idna.provided_is_prefixed`) * @throws \WpOrg\Requests\Exception Encoded string longer than 64 ASCII characters (`idna.encoded_too_long`) */ public static function to_ascii($text) { // Step 1: Check if the text is already ASCII if (self::is_ascii($text)) { // Skip to step 7 if (strlen($text) < self::MAX_LENGTH) { return $text; } throw new Exception('Provided string is too long', 'idna.provided_too_long', $text); } // Step 2: nameprep $text = self::nameprep($text); // Step 3: UseSTD3ASCIIRules is false, continue // Step 4: Check if it's ASCII now if (self::is_ascii($text)) { // Skip to step 7 /* * As the `nameprep()` method returns the original string, this code will never be reached until * that method is properly implemented. */ // @codeCoverageIgnoreStart if (strlen($text) < self::MAX_LENGTH) { return $text; } throw new Exception('Prepared string is too long', 'idna.prepared_too_long', $text); // @codeCoverageIgnoreEnd } // Step 5: Check ACE prefix if (strpos($text, self::ACE_PREFIX) === 0) { throw new Exception('Provided string begins with ACE prefix', 'idna.provided_is_prefixed', $text); } // Step 6: Encode with Punycode $text = self::punycode_encode($text); // Step 7: Prepend ACE prefix $text = self::ACE_PREFIX . $text; // Step 8: Check size if (strlen($text) < self::MAX_LENGTH) { return $text; } throw new Exception('Encoded string is too long', 'idna.encoded_too_long', $text); } /** * Check whether a given text string contains only ASCII characters * * @internal (Testing found regex was the fastest implementation) * * @param string $text * @return bool Is the text string ASCII-only? */ protected static function is_ascii($text) { return (preg_match('/(?:[^\x00-\x7F])/', $text) !== 1); } /** * Prepare a text string for use as an IDNA name * * @todo Implement this based on RFC 3491 and the newer 5891 * @param string $text * @return string Prepared string */ protected static function nameprep($text) { return $text; } /** * Convert a UTF-8 string to a UCS-4 codepoint array * * Based on \WpOrg\Requests\Iri::replace_invalid_with_pct_encoding() * * @param string $input * @return array Unicode code points * * @throws \WpOrg\Requests\Exception Invalid UTF-8 codepoint (`idna.invalidcodepoint`) */ protected static function utf8_to_codepoints($input) { $codepoints = []; // Get number of bytes $strlen = strlen($input); // phpcs:ignore Generic.CodeAnalysis.JumbledIncrementer -- This is a deliberate choice. for ($position = 0; $position < $strlen; $position++) { $value = ord($input[$position]); if ((~$value & 0x80) === 0x80) { // One byte sequence: $character = $value; $length = 1; $remaining = 0; } elseif (($value & 0xE0) === 0xC0) { // Two byte sequence: $character = ($value & 0x1F) << 6; $length = 2; $remaining = 1; } elseif (($value & 0xF0) === 0xE0) { // Three byte sequence: $character = ($value & 0x0F) << 12; $length = 3; $remaining = 2; } elseif (($value & 0xF8) === 0xF0) { // Four byte sequence: $character = ($value & 0x07) << 18; $length = 4; $remaining = 3; } else { // Invalid byte: throw new Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $value); } if ($remaining > 0) { if ($position + $length > $strlen) { throw new Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character); } for ($position++; $remaining > 0; $position++) { $value = ord($input[$position]); // If it is invalid, count the sequence as invalid and reprocess the current byte: if (($value & 0xC0) !== 0x80) { throw new Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character); } --$remaining; $character |= ($value & 0x3F) << ($remaining * 6); } $position--; } if (// Non-shortest form sequences are invalid $length > 1 && $character <= 0x7F || $length > 2 && $character <= 0x7FF || $length > 3 && $character <= 0xFFFF // Outside of range of ucschar codepoints // Noncharacters || ($character & 0xFFFE) === 0xFFFE || $character >= 0xFDD0 && $character <= 0xFDEF || ( // Everything else not in ucschar $character > 0xD7FF && $character < 0xF900 || $character < 0x20 || $character > 0x7E && $character < 0xA0 || $character > 0xEFFFD ) ) { throw new Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character); } $codepoints[] = $character; } return $codepoints; } /** * RFC3492-compliant encoder * * @internal Pseudo-code from Section 6.3 is commented with "#" next to relevant code * * @param string $input UTF-8 encoded string to encode * @return string Punycode-encoded string * * @throws \WpOrg\Requests\Exception On character outside of the domain (never happens with Punycode) (`idna.character_outside_domain`) */ public static function punycode_encode($input) { $output = ''; // let n = initial_n $n = self::BOOTSTRAP_INITIAL_N; // let delta = 0 $delta = 0; // let bias = initial_bias $bias = self::BOOTSTRAP_INITIAL_BIAS; // let h = b = the number of basic code points in the input $h = 0; $b = 0; // see loop // copy them to the output in order $codepoints = self::utf8_to_codepoints($input); $extended = []; foreach ($codepoints as $char) { if ($char < 128) { // Character is valid ASCII // TODO: this should also check if it's valid for a URL $output .= chr($char); $h++; // Check if the character is non-ASCII, but below initial n // This never occurs for Punycode, so ignore in coverage // @codeCoverageIgnoreStart } elseif ($char < $n) { throw new Exception('Invalid character', 'idna.character_outside_domain', $char); // @codeCoverageIgnoreEnd } else { $extended[$char] = true; } } $extended = array_keys($extended); sort($extended); $b = $h; // [copy them] followed by a delimiter if b > 0 if (strlen($output) > 0) { $output .= '-'; } // {if the input contains a non-basic code point < n then fail} // while h < length(input) do begin $codepointcount = count($codepoints); while ($h < $codepointcount) { // let m = the minimum code point >= n in the input $m = array_shift($extended); //printf('next code point to insert is %s' . PHP_EOL, dechex($m)); // let delta = delta + (m - n) * (h + 1), fail on overflow $delta += ($m - $n) * ($h + 1); // let n = m $n = $m; // for each code point c in the input (in order) do begin for ($num = 0; $num < $codepointcount; $num++) { $c = $codepoints[$num]; // if c < n then increment delta, fail on overflow if ($c < $n) { $delta++; } elseif ($c === $n) { // if c == n then begin // let q = delta $q = $delta; // for k = base to infinity in steps of base do begin for ($k = self::BOOTSTRAP_BASE; ; $k += self::BOOTSTRAP_BASE) { // let t = tmin if k <= bias {+ tmin}, or // tmax if k >= bias + tmax, or k - bias otherwise if ($k <= ($bias + self::BOOTSTRAP_TMIN)) { $t = self::BOOTSTRAP_TMIN; } elseif ($k >= ($bias + self::BOOTSTRAP_TMAX)) { $t = self::BOOTSTRAP_TMAX; } else { $t = $k - $bias; } // if q < t then break if ($q < $t) { break; } // output the code point for digit t + ((q - t) mod (base - t)) $digit = $t + (($q - $t) % (self::BOOTSTRAP_BASE - $t)); $output .= self::digit_to_char($digit); // let q = (q - t) div (base - t) $q = floor(($q - $t) / (self::BOOTSTRAP_BASE - $t)); } // end // output the code point for digit q $output .= self::digit_to_char($q); // let bias = adapt(delta, h + 1, test h equals b?) $bias = self::adapt($delta, $h + 1, $h === $b); // let delta = 0 $delta = 0; // increment h $h++; } // end } // end // increment delta and n $delta++; $n++; } // end return $output; } /** * Convert a digit to its respective character * * @link https://tools.ietf.org/html/rfc3492#section-5 * * @param int $digit Digit in the range 0-35 * @return string Single character corresponding to digit * * @throws \WpOrg\Requests\Exception On invalid digit (`idna.invalid_digit`) */ protected static function digit_to_char($digit) { // @codeCoverageIgnoreStart // As far as I know, this never happens, but still good to be sure. if ($digit < 0 || $digit > 35) { throw new Exception(sprintf('Invalid digit %d', $digit), 'idna.invalid_digit', $digit); } // @codeCoverageIgnoreEnd $digits = 'abcdefghijklmnopqrstuvwxyz0123456789'; return substr($digits, $digit, 1); } /** * Adapt the bias * * @link https://tools.ietf.org/html/rfc3492#section-6.1 * @param int $delta * @param int $numpoints * @param bool $firsttime * @return int New bias * * function adapt(delta,numpoints,firsttime): */ protected static function adapt($delta, $numpoints, $firsttime) { // if firsttime then let delta = delta div damp if ($firsttime) { $delta = floor($delta / self::BOOTSTRAP_DAMP); } else { // else let delta = delta div 2 $delta = floor($delta / 2); } // let delta = delta + (delta div numpoints) $delta += floor($delta / $numpoints); // let k = 0 $k = 0; // while delta > ((base - tmin) * tmax) div 2 do begin $max = floor(((self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN) * self::BOOTSTRAP_TMAX) / 2); while ($delta > $max) { // let delta = delta div (base - tmin) $delta = floor($delta / (self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN)); // let k = k + base $k += self::BOOTSTRAP_BASE; } // end // return k + (((base - tmin + 1) * delta) div (delta + skew)) return $k + floor(((self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN + 1) * $delta) / ($delta + self::BOOTSTRAP_SKEW)); } } razorpay/libs/Requests-2.0.4/src/Response/Headers.php 0000644 00000005673 15002216177 0016303 0 ustar 00 <?php /** * Case-insensitive dictionary, suitable for HTTP headers * * @package Requests */ namespace WpOrg\Requests\Response; use WpOrg\Requests\Exception; use WpOrg\Requests\Exception\InvalidArgument; use WpOrg\Requests\Utility\CaseInsensitiveDictionary; use WpOrg\Requests\Utility\FilteredIterator; /** * Case-insensitive dictionary, suitable for HTTP headers * * @package Requests */ class Headers extends CaseInsensitiveDictionary { /** * Get the given header * * Unlike {@see \WpOrg\Requests\Response\Headers::getValues()}, this returns a string. If there are * multiple values, it concatenates them with a comma as per RFC2616. * * Avoid using this where commas may be used unquoted in values, such as * Set-Cookie headers. * * @param string $offset * @return string|null Header value */ public function offsetGet($offset) { if (is_string($offset)) { $offset = strtolower($offset); } if (!isset($this->data[$offset])) { return null; } return $this->flatten($this->data[$offset]); } /** * Set the given item * * @param string $offset Item name * @param string $value Item value * * @throws \WpOrg\Requests\Exception On attempting to use dictionary as list (`invalidset`) */ public function offsetSet($offset, $value) { if ($offset === null) { throw new Exception('Object is a dictionary, not a list', 'invalidset'); } if (is_string($offset)) { $offset = strtolower($offset); } if (!isset($this->data[$offset])) { $this->data[$offset] = []; } $this->data[$offset][] = $value; } /** * Get all values for a given header * * @param string $offset * @return array|null Header values * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not valid as an array key. */ public function getValues($offset) { if (!is_string($offset) && !is_int($offset)) { throw InvalidArgument::create(1, '$offset', 'string|int', gettype($offset)); } $offset = strtolower($offset); if (!isset($this->data[$offset])) { return null; } return $this->data[$offset]; } /** * Flattens a value into a string * * Converts an array into a string by imploding values with a comma, as per * RFC2616's rules for folding headers. * * @param string|array $value Value to flatten * @return string Flattened value * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string or an array. */ public function flatten($value) { if (is_string($value)) { return $value; } if (is_array($value)) { return implode(',', $value); } throw InvalidArgument::create(1, '$value', 'string|array', gettype($value)); } /** * Get an iterator for the data * * Converts the internally stored values to a comma-separated string if there is more * than one value for a key. * * @return \ArrayIterator */ public function getIterator() { return new FilteredIterator($this->data, [$this, 'flatten']); } } razorpay/libs/Requests-2.0.4/src/Response.php 0000644 00000010221 15002216177 0014711 0 ustar 00 <?php /** * HTTP response class * * Contains a response from \WpOrg\Requests\Requests::request() * * @package Requests */ namespace WpOrg\Requests; use WpOrg\Requests\Cookie\Jar; use WpOrg\Requests\Exception; use WpOrg\Requests\Exception\Http; use WpOrg\Requests\Response\Headers; /** * HTTP response class * * Contains a response from \WpOrg\Requests\Requests::request() * * @package Requests */ class Response { /** * Response body * * @var string */ public $body = ''; /** * Raw HTTP data from the transport * * @var string */ public $raw = ''; /** * Headers, as an associative array * * @var \WpOrg\Requests\Response\Headers Array-like object representing headers */ public $headers = []; /** * Status code, false if non-blocking * * @var integer|boolean */ public $status_code = false; /** * Protocol version, false if non-blocking * * @var float|boolean */ public $protocol_version = false; /** * Whether the request succeeded or not * * @var boolean */ public $success = false; /** * Number of redirects the request used * * @var integer */ public $redirects = 0; /** * URL requested * * @var string */ public $url = ''; /** * Previous requests (from redirects) * * @var array Array of \WpOrg\Requests\Response objects */ public $history = []; /** * Cookies from the request * * @var \WpOrg\Requests\Cookie\Jar Array-like object representing a cookie jar */ public $cookies = []; /** * Constructor */ public function __construct() { $this->headers = new Headers(); $this->cookies = new Jar(); } /** * Is the response a redirect? * * @return boolean True if redirect (3xx status), false if not. */ public function is_redirect() { $code = $this->status_code; return in_array($code, [300, 301, 302, 303, 307], true) || $code > 307 && $code < 400; } /** * Throws an exception if the request was not successful * * @param boolean $allow_redirects Set to false to throw on a 3xx as well * * @throws \WpOrg\Requests\Exception If `$allow_redirects` is false, and code is 3xx (`response.no_redirects`) * @throws \WpOrg\Requests\Exception\Http On non-successful status code. Exception class corresponds to "Status" + code (e.g. {@see \WpOrg\Requests\Exception\Http\Status404}) */ public function throw_for_status($allow_redirects = true) { if ($this->is_redirect()) { if ($allow_redirects !== true) { throw new Exception('Redirection not allowed', 'response.no_redirects', $this); } } elseif (!$this->success) { $exception = Http::get_class($this->status_code); throw new $exception(null, $this); } } /** * JSON decode the response body. * * The method parameters are the same as those for the PHP native `json_decode()` function. * * @link https://php.net/json-decode * * @param ?bool $associative Optional. When `true`, JSON objects will be returned as associative arrays; * When `false`, JSON objects will be returned as objects. * When `null`, JSON objects will be returned as associative arrays * or objects depending on whether `JSON_OBJECT_AS_ARRAY` is set in the flags. * Defaults to `true` (in contrast to the PHP native default of `null`). * @param int $depth Optional. Maximum nesting depth of the structure being decoded. * Defaults to `512`. * @param int $options Optional. Bitmask of JSON_BIGINT_AS_STRING, JSON_INVALID_UTF8_IGNORE, * JSON_INVALID_UTF8_SUBSTITUTE, JSON_OBJECT_AS_ARRAY, JSON_THROW_ON_ERROR. * Defaults to `0` (no options set). * * @return array * * @throws \WpOrg\Requests\Exception If `$this->body` is not valid json. */ public function decode_body($associative = true, $depth = 512, $options = 0) { $data = json_decode($this->body, $associative, $depth, $options); if (json_last_error() !== JSON_ERROR_NONE) { $last_error = json_last_error_msg(); throw new Exception('Unable to parse JSON data: ' . $last_error, 'response.invalid', $this); } return $data; } } razorpay/libs/Requests-2.0.4/src/Cookie.php 0000644 00000034205 15002216177 0014334 0 ustar 00 <?php /** * Cookie storage object * * @package Requests\Cookies */ namespace WpOrg\Requests; use WpOrg\Requests\Exception\InvalidArgument; use WpOrg\Requests\Iri; use WpOrg\Requests\Response\Headers; use WpOrg\Requests\Utility\CaseInsensitiveDictionary; use WpOrg\Requests\Utility\InputValidator; /** * Cookie storage object * * @package Requests\Cookies */ class Cookie { /** * Cookie name. * * @var string */ public $name; /** * Cookie value. * * @var string */ public $value; /** * Cookie attributes * * Valid keys are (currently) path, domain, expires, max-age, secure and * httponly. * * @var \WpOrg\Requests\Utility\CaseInsensitiveDictionary|array Array-like object */ public $attributes = []; /** * Cookie flags * * Valid keys are (currently) creation, last-access, persistent and * host-only. * * @var array */ public $flags = []; /** * Reference time for relative calculations * * This is used in place of `time()` when calculating Max-Age expiration and * checking time validity. * * @var int */ public $reference_time = 0; /** * Create a new cookie object * * @param string $name * @param string $value * @param array|\WpOrg\Requests\Utility\CaseInsensitiveDictionary $attributes Associative array of attribute data * @param array $flags * @param int|null $reference_time * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $name argument is not a string. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $value argument is not a string. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $attributes argument is not an array or iterable object with array access. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $flags argument is not an array. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $reference_time argument is not an integer or null. */ public function __construct($name, $value, $attributes = [], $flags = [], $reference_time = null) { if (is_string($name) === false) { throw InvalidArgument::create(1, '$name', 'string', gettype($name)); } if (is_string($value) === false) { throw InvalidArgument::create(2, '$value', 'string', gettype($value)); } if (InputValidator::has_array_access($attributes) === false || InputValidator::is_iterable($attributes) === false) { throw InvalidArgument::create(3, '$attributes', 'array|ArrayAccess&Traversable', gettype($attributes)); } if (is_array($flags) === false) { throw InvalidArgument::create(4, '$flags', 'array', gettype($flags)); } if ($reference_time !== null && is_int($reference_time) === false) { throw InvalidArgument::create(5, '$reference_time', 'integer|null', gettype($reference_time)); } $this->name = $name; $this->value = $value; $this->attributes = $attributes; $default_flags = [ 'creation' => time(), 'last-access' => time(), 'persistent' => false, 'host-only' => true, ]; $this->flags = array_merge($default_flags, $flags); $this->reference_time = time(); if ($reference_time !== null) { $this->reference_time = $reference_time; } $this->normalize(); } /** * Get the cookie value * * Attributes and other data can be accessed via methods. */ public function __toString() { return $this->value; } /** * Check if a cookie is expired. * * Checks the age against $this->reference_time to determine if the cookie * is expired. * * @return boolean True if expired, false if time is valid. */ public function is_expired() { // RFC6265, s. 4.1.2.2: // If a cookie has both the Max-Age and the Expires attribute, the Max- // Age attribute has precedence and controls the expiration date of the // cookie. if (isset($this->attributes['max-age'])) { $max_age = $this->attributes['max-age']; return $max_age < $this->reference_time; } if (isset($this->attributes['expires'])) { $expires = $this->attributes['expires']; return $expires < $this->reference_time; } return false; } /** * Check if a cookie is valid for a given URI * * @param \WpOrg\Requests\Iri $uri URI to check * @return boolean Whether the cookie is valid for the given URI */ public function uri_matches(Iri $uri) { if (!$this->domain_matches($uri->host)) { return false; } if (!$this->path_matches($uri->path)) { return false; } return empty($this->attributes['secure']) || $uri->scheme === 'https'; } /** * Check if a cookie is valid for a given domain * * @param string $domain Domain to check * @return boolean Whether the cookie is valid for the given domain */ public function domain_matches($domain) { if (is_string($domain) === false) { return false; } if (!isset($this->attributes['domain'])) { // Cookies created manually; cookies created by Requests will set // the domain to the requested domain return true; } $cookie_domain = $this->attributes['domain']; if ($cookie_domain === $domain) { // The cookie domain and the passed domain are identical. return true; } // If the cookie is marked as host-only and we don't have an exact // match, reject the cookie if ($this->flags['host-only'] === true) { return false; } if (strlen($domain) <= strlen($cookie_domain)) { // For obvious reasons, the cookie domain cannot be a suffix if the passed domain // is shorter than the cookie domain return false; } if (substr($domain, -1 * strlen($cookie_domain)) !== $cookie_domain) { // The cookie domain should be a suffix of the passed domain. return false; } $prefix = substr($domain, 0, strlen($domain) - strlen($cookie_domain)); if (substr($prefix, -1) !== '.') { // The last character of the passed domain that is not included in the // domain string should be a %x2E (".") character. return false; } // The passed domain should be a host name (i.e., not an IP address). return !preg_match('#^(.+\.)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$#', $domain); } /** * Check if a cookie is valid for a given path * * From the path-match check in RFC 6265 section 5.1.4 * * @param string $request_path Path to check * @return boolean Whether the cookie is valid for the given path */ public function path_matches($request_path) { if (empty($request_path)) { // Normalize empty path to root $request_path = '/'; } if (!isset($this->attributes['path'])) { // Cookies created manually; cookies created by Requests will set // the path to the requested path return true; } if (is_scalar($request_path) === false) { return false; } $cookie_path = $this->attributes['path']; if ($cookie_path === $request_path) { // The cookie-path and the request-path are identical. return true; } if (strlen($request_path) > strlen($cookie_path) && substr($request_path, 0, strlen($cookie_path)) === $cookie_path) { if (substr($cookie_path, -1) === '/') { // The cookie-path is a prefix of the request-path, and the last // character of the cookie-path is %x2F ("/"). return true; } if (substr($request_path, strlen($cookie_path), 1) === '/') { // The cookie-path is a prefix of the request-path, and the // first character of the request-path that is not included in // the cookie-path is a %x2F ("/") character. return true; } } return false; } /** * Normalize cookie and attributes * * @return boolean Whether the cookie was successfully normalized */ public function normalize() { foreach ($this->attributes as $key => $value) { $orig_value = $value; $value = $this->normalize_attribute($key, $value); if ($value === null) { unset($this->attributes[$key]); continue; } if ($value !== $orig_value) { $this->attributes[$key] = $value; } } return true; } /** * Parse an individual cookie attribute * * Handles parsing individual attributes from the cookie values. * * @param string $name Attribute name * @param string|boolean $value Attribute value (string value, or true if empty/flag) * @return mixed Value if available, or null if the attribute value is invalid (and should be skipped) */ protected function normalize_attribute($name, $value) { switch (strtolower($name)) { case 'expires': // Expiration parsing, as per RFC 6265 section 5.2.1 if (is_int($value)) { return $value; } $expiry_time = strtotime($value); if ($expiry_time === false) { return null; } return $expiry_time; case 'max-age': // Expiration parsing, as per RFC 6265 section 5.2.2 if (is_int($value)) { return $value; } // Check that we have a valid age if (!preg_match('/^-?\d+$/', $value)) { return null; } $delta_seconds = (int) $value; if ($delta_seconds <= 0) { $expiry_time = 0; } else { $expiry_time = $this->reference_time + $delta_seconds; } return $expiry_time; case 'domain': // Domains are not required as per RFC 6265 section 5.2.3 if (empty($value)) { return null; } // Domain normalization, as per RFC 6265 section 5.2.3 if ($value[0] === '.') { $value = substr($value, 1); } return $value; default: return $value; } } /** * Format a cookie for a Cookie header * * This is used when sending cookies to a server. * * @return string Cookie formatted for Cookie header */ public function format_for_header() { return sprintf('%s=%s', $this->name, $this->value); } /** * Format a cookie for a Set-Cookie header * * This is used when sending cookies to clients. This isn't really * applicable to client-side usage, but might be handy for debugging. * * @return string Cookie formatted for Set-Cookie header */ public function format_for_set_cookie() { $header_value = $this->format_for_header(); if (!empty($this->attributes)) { $parts = []; foreach ($this->attributes as $key => $value) { // Ignore non-associative attributes if (is_numeric($key)) { $parts[] = $value; } else { $parts[] = sprintf('%s=%s', $key, $value); } } $header_value .= '; ' . implode('; ', $parts); } return $header_value; } /** * Parse a cookie string into a cookie object * * Based on Mozilla's parsing code in Firefox and related projects, which * is an intentional deviation from RFC 2109 and RFC 2616. RFC 6265 * specifies some of this handling, but not in a thorough manner. * * @param string $cookie_header Cookie header value (from a Set-Cookie header) * @param string $name * @param int|null $reference_time * @return \WpOrg\Requests\Cookie Parsed cookie object * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $cookie_header argument is not a string. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $name argument is not a string. */ public static function parse($cookie_header, $name = '', $reference_time = null) { if (is_string($cookie_header) === false) { throw InvalidArgument::create(1, '$cookie_header', 'string', gettype($cookie_header)); } if (is_string($name) === false) { throw InvalidArgument::create(2, '$name', 'string', gettype($name)); } $parts = explode(';', $cookie_header); $kvparts = array_shift($parts); if (!empty($name)) { $value = $cookie_header; } elseif (strpos($kvparts, '=') === false) { // Some sites might only have a value without the equals separator. // Deviate from RFC 6265 and pretend it was actually a blank name // (`=foo`) // // https://bugzilla.mozilla.org/show_bug.cgi?id=169091 $name = ''; $value = $kvparts; } else { list($name, $value) = explode('=', $kvparts, 2); } $name = trim($name); $value = trim($value); // Attribute keys are handled case-insensitively $attributes = new CaseInsensitiveDictionary(); if (!empty($parts)) { foreach ($parts as $part) { if (strpos($part, '=') === false) { $part_key = $part; $part_value = true; } else { list($part_key, $part_value) = explode('=', $part, 2); $part_value = trim($part_value); } $part_key = trim($part_key); $attributes[$part_key] = $part_value; } } return new static($name, $value, $attributes, [], $reference_time); } /** * Parse all Set-Cookie headers from request headers * * @param \WpOrg\Requests\Response\Headers $headers Headers to parse from * @param \WpOrg\Requests\Iri|null $origin URI for comparing cookie origins * @param int|null $time Reference time for expiration calculation * @return array */ public static function parse_from_headers(Headers $headers, Iri $origin = null, $time = null) { $cookie_headers = $headers->getValues('Set-Cookie'); if (empty($cookie_headers)) { return []; } $cookies = []; foreach ($cookie_headers as $header) { $parsed = self::parse($header, '', $time); // Default domain/path attributes if (empty($parsed->attributes['domain']) && !empty($origin)) { $parsed->attributes['domain'] = $origin->host; $parsed->flags['host-only'] = true; } else { $parsed->flags['host-only'] = false; } $path_is_valid = (!empty($parsed->attributes['path']) && $parsed->attributes['path'][0] === '/'); if (!$path_is_valid && !empty($origin)) { $path = $origin->path; // Default path normalization as per RFC 6265 section 5.1.4 if (substr($path, 0, 1) !== '/') { // If the uri-path is empty or if the first character of // the uri-path is not a %x2F ("/") character, output // %x2F ("/") and skip the remaining steps. $path = '/'; } elseif (substr_count($path, '/') === 1) { // If the uri-path contains no more than one %x2F ("/") // character, output %x2F ("/") and skip the remaining // step. $path = '/'; } else { // Output the characters of the uri-path from the first // character up to, but not including, the right-most // %x2F ("/"). $path = substr($path, 0, strrpos($path, '/')); } $parsed->attributes['path'] = $path; } // Reject invalid cookie domains if (!empty($origin) && !$parsed->domain_matches($origin->host)) { continue; } $cookies[$parsed->name] = $parsed; } return $cookies; } } razorpay/libs/Requests-2.0.4/src/Transport.php 0000644 00000003010 15002216177 0015105 0 ustar 00 <?php /** * Base HTTP transport * * @package Requests\Transport */ namespace WpOrg\Requests; /** * Base HTTP transport * * @package Requests\Transport */ interface Transport { /** * Perform a request * * @param string $url URL to request * @param array $headers Associative array of request headers * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD * @param array $options Request options, see {@see \WpOrg\Requests\Requests::response()} for documentation * @return string Raw HTTP result */ public function request($url, $headers = [], $data = [], $options = []); /** * Send multiple requests simultaneously * * @param array $requests Request data (array of 'url', 'headers', 'data', 'options') as per {@see \WpOrg\Requests\Transport::request()} * @param array $options Global options, see {@see \WpOrg\Requests\Requests::response()} for documentation * @return array Array of \WpOrg\Requests\Response objects (may contain \WpOrg\Requests\Exception or string responses as well) */ public function request_multiple($requests, $options); /** * Self-test whether the transport can be used. * * The available capabilities to test for can be found in {@see \WpOrg\Requests\Capability}. * * @param array<string, bool> $capabilities Optional. Associative array of capabilities to test against, i.e. `['<capability>' => true]`. * @return bool Whether the transport can be used. */ public static function test($capabilities = []); } razorpay/libs/Requests-2.0.4/src/Ipv6.php 0000644 00000013007 15002216177 0013744 0 ustar 00 <?php /** * Class to validate and to work with IPv6 addresses * * @package Requests\Utilities */ namespace WpOrg\Requests; use WpOrg\Requests\Exception\InvalidArgument; use WpOrg\Requests\Utility\InputValidator; /** * Class to validate and to work with IPv6 addresses * * This was originally based on the PEAR class of the same name, but has been * entirely rewritten. * * @package Requests\Utilities */ final class Ipv6 { /** * Uncompresses an IPv6 address * * RFC 4291 allows you to compress consecutive zero pieces in an address to * '::'. This method expects a valid IPv6 address and expands the '::' to * the required number of zero pieces. * * Example: FF01::101 -> FF01:0:0:0:0:0:0:101 * ::1 -> 0:0:0:0:0:0:0:1 * * @author Alexander Merz <alexander.merz@web.de> * @author elfrink at introweb dot nl * @author Josh Peck <jmp at joshpeck dot org> * @copyright 2003-2005 The PHP Group * @license https://opensource.org/licenses/bsd-license.php * * @param string|Stringable $ip An IPv6 address * @return string The uncompressed IPv6 address * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string or a stringable object. */ public static function uncompress($ip) { if (InputValidator::is_string_or_stringable($ip) === false) { throw InvalidArgument::create(1, '$ip', 'string|Stringable', gettype($ip)); } $ip = (string) $ip; if (substr_count($ip, '::') !== 1) { return $ip; } list($ip1, $ip2) = explode('::', $ip); $c1 = ($ip1 === '') ? -1 : substr_count($ip1, ':'); $c2 = ($ip2 === '') ? -1 : substr_count($ip2, ':'); if (strpos($ip2, '.') !== false) { $c2++; } if ($c1 === -1 && $c2 === -1) { // :: $ip = '0:0:0:0:0:0:0:0'; } elseif ($c1 === -1) { // ::xxx $fill = str_repeat('0:', 7 - $c2); $ip = str_replace('::', $fill, $ip); } elseif ($c2 === -1) { // xxx:: $fill = str_repeat(':0', 7 - $c1); $ip = str_replace('::', $fill, $ip); } else { // xxx::xxx $fill = ':' . str_repeat('0:', 6 - $c2 - $c1); $ip = str_replace('::', $fill, $ip); } return $ip; } /** * Compresses an IPv6 address * * RFC 4291 allows you to compress consecutive zero pieces in an address to * '::'. This method expects a valid IPv6 address and compresses consecutive * zero pieces to '::'. * * Example: FF01:0:0:0:0:0:0:101 -> FF01::101 * 0:0:0:0:0:0:0:1 -> ::1 * * @see \WpOrg\Requests\Ipv6::uncompress() * * @param string $ip An IPv6 address * @return string The compressed IPv6 address */ public static function compress($ip) { // Prepare the IP to be compressed. // Note: Input validation is handled in the `uncompress()` method, which is the first call made in this method. $ip = self::uncompress($ip); $ip_parts = self::split_v6_v4($ip); // Replace all leading zeros $ip_parts[0] = preg_replace('/(^|:)0+([0-9])/', '\1\2', $ip_parts[0]); // Find bunches of zeros if (preg_match_all('/(?:^|:)(?:0(?::|$))+/', $ip_parts[0], $matches, PREG_OFFSET_CAPTURE)) { $max = 0; $pos = null; foreach ($matches[0] as $match) { if (strlen($match[0]) > $max) { $max = strlen($match[0]); $pos = $match[1]; } } $ip_parts[0] = substr_replace($ip_parts[0], '::', $pos, $max); } if ($ip_parts[1] !== '') { return implode(':', $ip_parts); } else { return $ip_parts[0]; } } /** * Splits an IPv6 address into the IPv6 and IPv4 representation parts * * RFC 4291 allows you to represent the last two parts of an IPv6 address * using the standard IPv4 representation * * Example: 0:0:0:0:0:0:13.1.68.3 * 0:0:0:0:0:FFFF:129.144.52.38 * * @param string $ip An IPv6 address * @return string[] [0] contains the IPv6 represented part, and [1] the IPv4 represented part */ private static function split_v6_v4($ip) { if (strpos($ip, '.') !== false) { $pos = strrpos($ip, ':'); $ipv6_part = substr($ip, 0, $pos); $ipv4_part = substr($ip, $pos + 1); return [$ipv6_part, $ipv4_part]; } else { return [$ip, '']; } } /** * Checks an IPv6 address * * Checks if the given IP is a valid IPv6 address * * @param string $ip An IPv6 address * @return bool true if $ip is a valid IPv6 address */ public static function check_ipv6($ip) { // Note: Input validation is handled in the `uncompress()` method, which is the first call made in this method. $ip = self::uncompress($ip); list($ipv6, $ipv4) = self::split_v6_v4($ip); $ipv6 = explode(':', $ipv6); $ipv4 = explode('.', $ipv4); if (count($ipv6) === 8 && count($ipv4) === 1 || count($ipv6) === 6 && count($ipv4) === 4) { foreach ($ipv6 as $ipv6_part) { // The section can't be empty if ($ipv6_part === '') { return false; } // Nor can it be over four characters if (strlen($ipv6_part) > 4) { return false; } // Remove leading zeros (this is safe because of the above) $ipv6_part = ltrim($ipv6_part, '0'); if ($ipv6_part === '') { $ipv6_part = '0'; } // Check the value is valid $value = hexdec($ipv6_part); if (dechex($value) !== strtolower($ipv6_part) || $value < 0 || $value > 0xFFFF) { return false; } } if (count($ipv4) === 4) { foreach ($ipv4 as $ipv4_part) { $value = (int) $ipv4_part; if ((string) $value !== $ipv4_part || $value < 0 || $value > 0xFF) { return false; } } } return true; } else { return false; } } } razorpay/libs/Requests-2.0.4/src/Capability.php 0000644 00000001221 15002216177 0015174 0 ustar 00 <?php /** * Capability interface declaring the known capabilities. * * @package Requests\Utilities */ namespace WpOrg\Requests; /** * Capability interface declaring the known capabilities. * * This is used as the authoritative source for which capabilities can be queried. * * @package Requests\Utilities */ interface Capability { /** * Support for SSL. * * @var string */ const SSL = 'ssl'; /** * Collection of all capabilities supported in Requests. * * Note: this does not automatically mean that the capability will be supported for your chosen transport! * * @var array<string> */ const ALL = [ self::SSL, ]; } razorpay/libs/Requests-2.0.4/src/Proxy/Http.php 0000644 00000010171 15002216177 0015157 0 ustar 00 <?php /** * HTTP Proxy connection interface * * @package Requests\Proxy * @since 1.6 */ namespace WpOrg\Requests\Proxy; use WpOrg\Requests\Exception\ArgumentCount; use WpOrg\Requests\Exception\InvalidArgument; use WpOrg\Requests\Hooks; use WpOrg\Requests\Proxy; /** * HTTP Proxy connection interface * * Provides a handler for connection via an HTTP proxy * * @package Requests\Proxy * @since 1.6 */ final class Http implements Proxy { /** * Proxy host and port * * Notation: "host:port" (eg 127.0.0.1:8080 or someproxy.com:3128) * * @var string */ public $proxy; /** * Username * * @var string */ public $user; /** * Password * * @var string */ public $pass; /** * Do we need to authenticate? (ie username & password have been provided) * * @var boolean */ public $use_authentication; /** * Constructor * * @since 1.6 * * @param array|string|null $args Proxy as a string or an array of proxy, user and password. * When passed as an array, must have exactly one (proxy) * or three elements (proxy, user, password). * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not an array, a string or null. * @throws \WpOrg\Requests\Exception\ArgumentCount On incorrect number of arguments (`proxyhttpbadargs`) */ public function __construct($args = null) { if (is_string($args)) { $this->proxy = $args; } elseif (is_array($args)) { if (count($args) === 1) { list($this->proxy) = $args; } elseif (count($args) === 3) { list($this->proxy, $this->user, $this->pass) = $args; $this->use_authentication = true; } else { throw ArgumentCount::create( 'an array with exactly one element or exactly three elements', count($args), 'proxyhttpbadargs' ); } } elseif ($args !== null) { throw InvalidArgument::create(1, '$args', 'array|string|null', gettype($args)); } } /** * Register the necessary callbacks * * @since 1.6 * @see \WpOrg\Requests\Proxy\Http::curl_before_send() * @see \WpOrg\Requests\Proxy\Http::fsockopen_remote_socket() * @see \WpOrg\Requests\Proxy\Http::fsockopen_remote_host_path() * @see \WpOrg\Requests\Proxy\Http::fsockopen_header() * @param \WpOrg\Requests\Hooks $hooks Hook system */ public function register(Hooks $hooks) { $hooks->register('curl.before_send', [$this, 'curl_before_send']); $hooks->register('fsockopen.remote_socket', [$this, 'fsockopen_remote_socket']); $hooks->register('fsockopen.remote_host_path', [$this, 'fsockopen_remote_host_path']); if ($this->use_authentication) { $hooks->register('fsockopen.after_headers', [$this, 'fsockopen_header']); } } /** * Set cURL parameters before the data is sent * * @since 1.6 * @param resource|\CurlHandle $handle cURL handle */ public function curl_before_send(&$handle) { curl_setopt($handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); curl_setopt($handle, CURLOPT_PROXY, $this->proxy); if ($this->use_authentication) { curl_setopt($handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY); curl_setopt($handle, CURLOPT_PROXYUSERPWD, $this->get_auth_string()); } } /** * Alter remote socket information before opening socket connection * * @since 1.6 * @param string $remote_socket Socket connection string */ public function fsockopen_remote_socket(&$remote_socket) { $remote_socket = $this->proxy; } /** * Alter remote path before getting stream data * * @since 1.6 * @param string $path Path to send in HTTP request string ("GET ...") * @param string $url Full URL we're requesting */ public function fsockopen_remote_host_path(&$path, $url) { $path = $url; } /** * Add extra headers to the request before sending * * @since 1.6 * @param string $out HTTP header string */ public function fsockopen_header(&$out) { $out .= sprintf("Proxy-Authorization: Basic %s\r\n", base64_encode($this->get_auth_string())); } /** * Get the authentication string (user:pass) * * @since 1.6 * @return string */ public function get_auth_string() { return $this->user . ':' . $this->pass; } } razorpay/libs/Requests-2.0.4/src/Transport/Fsockopen.php 0000644 00000035750 15002216177 0017054 0 ustar 00 <?php /** * fsockopen HTTP transport * * @package Requests\Transport */ namespace WpOrg\Requests\Transport; use WpOrg\Requests\Capability; use WpOrg\Requests\Exception; use WpOrg\Requests\Exception\InvalidArgument; use WpOrg\Requests\Port; use WpOrg\Requests\Requests; use WpOrg\Requests\Ssl; use WpOrg\Requests\Transport; use WpOrg\Requests\Utility\CaseInsensitiveDictionary; use WpOrg\Requests\Utility\InputValidator; /** * fsockopen HTTP transport * * @package Requests\Transport */ final class Fsockopen implements Transport { /** * Second to microsecond conversion * * @var integer */ const SECOND_IN_MICROSECONDS = 1000000; /** * Raw HTTP data * * @var string */ public $headers = ''; /** * Stream metadata * * @var array Associative array of properties, see {@link https://www.php.net/stream_get_meta_data} */ public $info; /** * What's the maximum number of bytes we should keep? * * @var int|bool Byte count, or false if no limit. */ private $max_bytes = false; private $connect_error = ''; /** * Perform a request * * @param string|Stringable $url URL to request * @param array $headers Associative array of request headers * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD * @param array $options Request options, see {@see \WpOrg\Requests\Requests::response()} for documentation * @return string Raw HTTP result * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $url argument is not a string or Stringable. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $headers argument is not an array. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $data parameter is not an array or string. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array. * @throws \WpOrg\Requests\Exception On failure to connect to socket (`fsockopenerror`) * @throws \WpOrg\Requests\Exception On socket timeout (`timeout`) */ public function request($url, $headers = [], $data = [], $options = []) { if (InputValidator::is_string_or_stringable($url) === false) { throw InvalidArgument::create(1, '$url', 'string|Stringable', gettype($url)); } if (is_array($headers) === false) { throw InvalidArgument::create(2, '$headers', 'array', gettype($headers)); } if (!is_array($data) && !is_string($data)) { if ($data === null) { $data = ''; } else { throw InvalidArgument::create(3, '$data', 'array|string', gettype($data)); } } if (is_array($options) === false) { throw InvalidArgument::create(4, '$options', 'array', gettype($options)); } $options['hooks']->dispatch('fsockopen.before_request'); $url_parts = parse_url($url); if (empty($url_parts)) { throw new Exception('Invalid URL.', 'invalidurl', $url); } $host = $url_parts['host']; $context = stream_context_create(); $verifyname = false; $case_insensitive_headers = new CaseInsensitiveDictionary($headers); // HTTPS support if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https') { $remote_socket = 'ssl://' . $host; if (!isset($url_parts['port'])) { $url_parts['port'] = Port::HTTPS; } $context_options = [ 'verify_peer' => true, 'capture_peer_cert' => true, ]; $verifyname = true; // SNI, if enabled (OpenSSL >=0.9.8j) // phpcs:ignore PHPCompatibility.Constants.NewConstants.openssl_tlsext_server_nameFound if (defined('OPENSSL_TLSEXT_SERVER_NAME') && OPENSSL_TLSEXT_SERVER_NAME) { $context_options['SNI_enabled'] = true; if (isset($options['verifyname']) && $options['verifyname'] === false) { $context_options['SNI_enabled'] = false; } } if (isset($options['verify'])) { if ($options['verify'] === false) { $context_options['verify_peer'] = false; $context_options['verify_peer_name'] = false; $verifyname = false; } elseif (is_string($options['verify'])) { $context_options['cafile'] = $options['verify']; } } if (isset($options['verifyname']) && $options['verifyname'] === false) { $context_options['verify_peer_name'] = false; $verifyname = false; } stream_context_set_option($context, ['ssl' => $context_options]); } else { $remote_socket = 'tcp://' . $host; } $this->max_bytes = $options['max_bytes']; if (!isset($url_parts['port'])) { $url_parts['port'] = Port::HTTP; } $remote_socket .= ':' . $url_parts['port']; // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_set_error_handler set_error_handler([$this, 'connect_error_handler'], E_WARNING | E_NOTICE); $options['hooks']->dispatch('fsockopen.remote_socket', [&$remote_socket]); $socket = stream_socket_client($remote_socket, $errno, $errstr, ceil($options['connect_timeout']), STREAM_CLIENT_CONNECT, $context); restore_error_handler(); if ($verifyname && !$this->verify_certificate_from_context($host, $context)) { throw new Exception('SSL certificate did not match the requested domain name', 'ssl.no_match'); } if (!$socket) { if ($errno === 0) { // Connection issue throw new Exception(rtrim($this->connect_error), 'fsockopen.connect_error'); } throw new Exception($errstr, 'fsockopenerror', null, $errno); } $data_format = $options['data_format']; if ($data_format === 'query') { $path = self::format_get($url_parts, $data); $data = ''; } else { $path = self::format_get($url_parts, []); } $options['hooks']->dispatch('fsockopen.remote_host_path', [&$path, $url]); $request_body = ''; $out = sprintf("%s %s HTTP/%.1F\r\n", $options['type'], $path, $options['protocol_version']); if ($options['type'] !== Requests::TRACE) { if (is_array($data)) { $request_body = http_build_query($data, '', '&'); } else { $request_body = $data; } // Always include Content-length on POST requests to prevent // 411 errors from some servers when the body is empty. if (!empty($data) || $options['type'] === Requests::POST) { if (!isset($case_insensitive_headers['Content-Length'])) { $headers['Content-Length'] = strlen($request_body); } if (!isset($case_insensitive_headers['Content-Type'])) { $headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; } } } if (!isset($case_insensitive_headers['Host'])) { $out .= sprintf('Host: %s', $url_parts['host']); $scheme_lower = strtolower($url_parts['scheme']); if (($scheme_lower === 'http' && $url_parts['port'] !== Port::HTTP) || ($scheme_lower === 'https' && $url_parts['port'] !== Port::HTTPS)) { $out .= ':' . $url_parts['port']; } $out .= "\r\n"; } if (!isset($case_insensitive_headers['User-Agent'])) { $out .= sprintf("User-Agent: %s\r\n", $options['useragent']); } $accept_encoding = $this->accept_encoding(); if (!isset($case_insensitive_headers['Accept-Encoding']) && !empty($accept_encoding)) { $out .= sprintf("Accept-Encoding: %s\r\n", $accept_encoding); } $headers = Requests::flatten($headers); if (!empty($headers)) { $out .= implode("\r\n", $headers) . "\r\n"; } $options['hooks']->dispatch('fsockopen.after_headers', [&$out]); if (substr($out, -2) !== "\r\n") { $out .= "\r\n"; } if (!isset($case_insensitive_headers['Connection'])) { $out .= "Connection: Close\r\n"; } $out .= "\r\n" . $request_body; $options['hooks']->dispatch('fsockopen.before_send', [&$out]); fwrite($socket, $out); $options['hooks']->dispatch('fsockopen.after_send', [$out]); if (!$options['blocking']) { fclose($socket); $fake_headers = ''; $options['hooks']->dispatch('fsockopen.after_request', [&$fake_headers]); return ''; } $timeout_sec = (int) floor($options['timeout']); if ($timeout_sec === $options['timeout']) { $timeout_msec = 0; } else { $timeout_msec = self::SECOND_IN_MICROSECONDS * $options['timeout'] % self::SECOND_IN_MICROSECONDS; } stream_set_timeout($socket, $timeout_sec, $timeout_msec); $response = ''; $body = ''; $headers = ''; $this->info = stream_get_meta_data($socket); $size = 0; $doingbody = false; $download = false; if ($options['filename']) { // phpcs:ignore WordPress.PHP.NoSilencedErrors -- Silenced the PHP native warning in favour of throwing an exception. $download = @fopen($options['filename'], 'wb'); if ($download === false) { $error = error_get_last(); throw new Exception($error['message'], 'fopen'); } } while (!feof($socket)) { $this->info = stream_get_meta_data($socket); if ($this->info['timed_out']) { throw new Exception('fsocket timed out', 'timeout'); } $block = fread($socket, Requests::BUFFER_SIZE); if (!$doingbody) { $response .= $block; if (strpos($response, "\r\n\r\n")) { list($headers, $block) = explode("\r\n\r\n", $response, 2); $doingbody = true; } } // Are we in body mode now? if ($doingbody) { $options['hooks']->dispatch('request.progress', [$block, $size, $this->max_bytes]); $data_length = strlen($block); if ($this->max_bytes) { // Have we already hit a limit? if ($size === $this->max_bytes) { continue; } if (($size + $data_length) > $this->max_bytes) { // Limit the length $limited_length = ($this->max_bytes - $size); $block = substr($block, 0, $limited_length); } } $size += strlen($block); if ($download) { fwrite($download, $block); } else { $body .= $block; } } } $this->headers = $headers; if ($download) { fclose($download); } else { $this->headers .= "\r\n\r\n" . $body; } fclose($socket); $options['hooks']->dispatch('fsockopen.after_request', [&$this->headers, &$this->info]); return $this->headers; } /** * Send multiple requests simultaneously * * @param array $requests Request data (array of 'url', 'headers', 'data', 'options') as per {@see \WpOrg\Requests\Transport::request()} * @param array $options Global options, see {@see \WpOrg\Requests\Requests::response()} for documentation * @return array Array of \WpOrg\Requests\Response objects (may contain \WpOrg\Requests\Exception or string responses as well) * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $requests argument is not an array or iterable object with array access. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array. */ public function request_multiple($requests, $options) { // If you're not requesting, we can't get any responses ¯\_(ツ)_/¯ if (empty($requests)) { return []; } if (InputValidator::has_array_access($requests) === false || InputValidator::is_iterable($requests) === false) { throw InvalidArgument::create(1, '$requests', 'array|ArrayAccess&Traversable', gettype($requests)); } if (is_array($options) === false) { throw InvalidArgument::create(2, '$options', 'array', gettype($options)); } $responses = []; $class = get_class($this); foreach ($requests as $id => $request) { try { $handler = new $class(); $responses[$id] = $handler->request($request['url'], $request['headers'], $request['data'], $request['options']); $request['options']['hooks']->dispatch('transport.internal.parse_response', [&$responses[$id], $request]); } catch (Exception $e) { $responses[$id] = $e; } if (!is_string($responses[$id])) { $request['options']['hooks']->dispatch('multiple.request.complete', [&$responses[$id], $id]); } } return $responses; } /** * Retrieve the encodings we can accept * * @return string Accept-Encoding header value */ private static function accept_encoding() { $type = []; if (function_exists('gzinflate')) { $type[] = 'deflate;q=1.0'; } if (function_exists('gzuncompress')) { $type[] = 'compress;q=0.5'; } $type[] = 'gzip;q=0.5'; return implode(', ', $type); } /** * Format a URL given GET data * * @param array $url_parts * @param array|object $data Data to build query using, see {@link https://www.php.net/http_build_query} * @return string URL with data */ private static function format_get($url_parts, $data) { if (!empty($data)) { if (empty($url_parts['query'])) { $url_parts['query'] = ''; } $url_parts['query'] .= '&' . http_build_query($data, '', '&'); $url_parts['query'] = trim($url_parts['query'], '&'); } if (isset($url_parts['path'])) { if (isset($url_parts['query'])) { $get = $url_parts['path'] . '?' . $url_parts['query']; } else { $get = $url_parts['path']; } } else { $get = '/'; } return $get; } /** * Error handler for stream_socket_client() * * @param int $errno Error number (e.g. E_WARNING) * @param string $errstr Error message */ public function connect_error_handler($errno, $errstr) { // Double-check we can handle it if (($errno & E_WARNING) === 0 && ($errno & E_NOTICE) === 0) { // Return false to indicate the default error handler should engage return false; } $this->connect_error .= $errstr . "\n"; return true; } /** * Verify the certificate against common name and subject alternative names * * Unfortunately, PHP doesn't check the certificate against the alternative * names, leading things like 'https://www.github.com/' to be invalid. * Instead * * @link https://tools.ietf.org/html/rfc2818#section-3.1 RFC2818, Section 3.1 * * @param string $host Host name to verify against * @param resource $context Stream context * @return bool * * @throws \WpOrg\Requests\Exception On failure to connect via TLS (`fsockopen.ssl.connect_error`) * @throws \WpOrg\Requests\Exception On not obtaining a match for the host (`fsockopen.ssl.no_match`) */ public function verify_certificate_from_context($host, $context) { $meta = stream_context_get_options($context); // If we don't have SSL options, then we couldn't make the connection at // all if (empty($meta) || empty($meta['ssl']) || empty($meta['ssl']['peer_certificate'])) { throw new Exception(rtrim($this->connect_error), 'ssl.connect_error'); } $cert = openssl_x509_parse($meta['ssl']['peer_certificate']); return Ssl::verify_certificate($host, $cert); } /** * Self-test whether the transport can be used. * * The available capabilities to test for can be found in {@see \WpOrg\Requests\Capability}. * * @codeCoverageIgnore * @param array<string, bool> $capabilities Optional. Associative array of capabilities to test against, i.e. `['<capability>' => true]`. * @return bool Whether the transport can be used. */ public static function test($capabilities = []) { if (!function_exists('fsockopen')) { return false; } // If needed, check that streams support SSL if (isset($capabilities[Capability::SSL]) && $capabilities[Capability::SSL]) { if (!extension_loaded('openssl') || !function_exists('openssl_x509_parse')) { return false; } } return true; } } razorpay/libs/Requests-2.0.4/src/Transport/Curl.php 0000644 00000046167 15002216177 0016036 0 ustar 00 <?php /** * cURL HTTP transport * * @package Requests\Transport */ namespace WpOrg\Requests\Transport; use RecursiveArrayIterator; use RecursiveIteratorIterator; use WpOrg\Requests\Capability; use WpOrg\Requests\Exception; use WpOrg\Requests\Exception\InvalidArgument; use WpOrg\Requests\Exception\Transport\Curl as CurlException; use WpOrg\Requests\Requests; use WpOrg\Requests\Transport; use WpOrg\Requests\Utility\InputValidator; /** * cURL HTTP transport * * @package Requests\Transport */ final class Curl implements Transport { const CURL_7_10_5 = 0x070A05; const CURL_7_16_2 = 0x071002; /** * Raw HTTP data * * @var string */ public $headers = ''; /** * Raw body data * * @var string */ public $response_data = ''; /** * Information on the current request * * @var array cURL information array, see {@link https://www.php.net/curl_getinfo} */ public $info; /** * cURL version number * * @var int */ public $version; /** * cURL handle * * @var resource|\CurlHandle Resource in PHP < 8.0, Instance of CurlHandle in PHP >= 8.0. */ private $handle; /** * Hook dispatcher instance * * @var \WpOrg\Requests\Hooks */ private $hooks; /** * Have we finished the headers yet? * * @var boolean */ private $done_headers = false; /** * If streaming to a file, keep the file pointer * * @var resource */ private $stream_handle; /** * How many bytes are in the response body? * * @var int */ private $response_bytes; /** * What's the maximum number of bytes we should keep? * * @var int|bool Byte count, or false if no limit. */ private $response_byte_limit; /** * Constructor */ public function __construct() { $curl = curl_version(); $this->version = $curl['version_number']; $this->handle = curl_init(); curl_setopt($this->handle, CURLOPT_HEADER, false); curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, 1); if ($this->version >= self::CURL_7_10_5) { curl_setopt($this->handle, CURLOPT_ENCODING, ''); } if (defined('CURLOPT_PROTOCOLS')) { // phpcs:ignore PHPCompatibility.Constants.NewConstants.curlopt_protocolsFound curl_setopt($this->handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); } if (defined('CURLOPT_REDIR_PROTOCOLS')) { // phpcs:ignore PHPCompatibility.Constants.NewConstants.curlopt_redir_protocolsFound curl_setopt($this->handle, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); } } /** * Destructor */ public function __destruct() { if (is_resource($this->handle)) { curl_close($this->handle); } } /** * Perform a request * * @param string|Stringable $url URL to request * @param array $headers Associative array of request headers * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD * @param array $options Request options, see {@see \WpOrg\Requests\Requests::response()} for documentation * @return string Raw HTTP result * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $url argument is not a string or Stringable. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $headers argument is not an array. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $data parameter is not an array or string. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array. * @throws \WpOrg\Requests\Exception On a cURL error (`curlerror`) */ public function request($url, $headers = [], $data = [], $options = []) { if (InputValidator::is_string_or_stringable($url) === false) { throw InvalidArgument::create(1, '$url', 'string|Stringable', gettype($url)); } if (is_array($headers) === false) { throw InvalidArgument::create(2, '$headers', 'array', gettype($headers)); } if (!is_array($data) && !is_string($data)) { if ($data === null) { $data = ''; } else { throw InvalidArgument::create(3, '$data', 'array|string', gettype($data)); } } if (is_array($options) === false) { throw InvalidArgument::create(4, '$options', 'array', gettype($options)); } $this->hooks = $options['hooks']; $this->setup_handle($url, $headers, $data, $options); $options['hooks']->dispatch('curl.before_send', [&$this->handle]); if ($options['filename'] !== false) { // phpcs:ignore WordPress.PHP.NoSilencedErrors -- Silenced the PHP native warning in favour of throwing an exception. $this->stream_handle = @fopen($options['filename'], 'wb'); if ($this->stream_handle === false) { $error = error_get_last(); throw new Exception($error['message'], 'fopen'); } } $this->response_data = ''; $this->response_bytes = 0; $this->response_byte_limit = false; if ($options['max_bytes'] !== false) { $this->response_byte_limit = $options['max_bytes']; } if (isset($options['verify'])) { if ($options['verify'] === false) { curl_setopt($this->handle, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($this->handle, CURLOPT_SSL_VERIFYPEER, 0); // nosemgrep : https://semgrep.dev/s/ZKq7 } elseif (is_string($options['verify'])) { curl_setopt($this->handle, CURLOPT_CAINFO, $options['verify']); } } if (isset($options['verifyname']) && $options['verifyname'] === false) { curl_setopt($this->handle, CURLOPT_SSL_VERIFYHOST, 0); } curl_exec($this->handle); $response = $this->response_data; $options['hooks']->dispatch('curl.after_send', []); if (curl_errno($this->handle) === CURLE_WRITE_ERROR || curl_errno($this->handle) === CURLE_BAD_CONTENT_ENCODING) { // Reset encoding and try again curl_setopt($this->handle, CURLOPT_ENCODING, 'none'); $this->response_data = ''; $this->response_bytes = 0; curl_exec($this->handle); $response = $this->response_data; } $this->process_response($response, $options); // Need to remove the $this reference from the curl handle. // Otherwise \WpOrg\Requests\Transport\Curl won't be garbage collected and the curl_close() will never be called. curl_setopt($this->handle, CURLOPT_HEADERFUNCTION, null); curl_setopt($this->handle, CURLOPT_WRITEFUNCTION, null); return $this->headers; } /** * Send multiple requests simultaneously * * @param array $requests Request data * @param array $options Global options * @return array Array of \WpOrg\Requests\Response objects (may contain \WpOrg\Requests\Exception or string responses as well) * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $requests argument is not an array or iterable object with array access. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array. */ public function request_multiple($requests, $options) { // If you're not requesting, we can't get any responses ¯\_(ツ)_/¯ if (empty($requests)) { return []; } if (InputValidator::has_array_access($requests) === false || InputValidator::is_iterable($requests) === false) { throw InvalidArgument::create(1, '$requests', 'array|ArrayAccess&Traversable', gettype($requests)); } if (is_array($options) === false) { throw InvalidArgument::create(2, '$options', 'array', gettype($options)); } $multihandle = curl_multi_init(); $subrequests = []; $subhandles = []; $class = get_class($this); foreach ($requests as $id => $request) { $subrequests[$id] = new $class(); $subhandles[$id] = $subrequests[$id]->get_subrequest_handle($request['url'], $request['headers'], $request['data'], $request['options']); $request['options']['hooks']->dispatch('curl.before_multi_add', [&$subhandles[$id]]); curl_multi_add_handle($multihandle, $subhandles[$id]); } $completed = 0; $responses = []; $subrequestcount = count($subrequests); $request['options']['hooks']->dispatch('curl.before_multi_exec', [&$multihandle]); do { $active = 0; do { $status = curl_multi_exec($multihandle, $active); } while ($status === CURLM_CALL_MULTI_PERFORM); $to_process = []; // Read the information as needed while ($done = curl_multi_info_read($multihandle)) { $key = array_search($done['handle'], $subhandles, true); if (!isset($to_process[$key])) { $to_process[$key] = $done; } } // Parse the finished requests before we start getting the new ones foreach ($to_process as $key => $done) { $options = $requests[$key]['options']; if ($done['result'] !== CURLE_OK) { //get error string for handle. $reason = curl_error($done['handle']); $exception = new CurlException( $reason, CurlException::EASY, $done['handle'], $done['result'] ); $responses[$key] = $exception; $options['hooks']->dispatch('transport.internal.parse_error', [&$responses[$key], $requests[$key]]); } else { $responses[$key] = $subrequests[$key]->process_response($subrequests[$key]->response_data, $options); $options['hooks']->dispatch('transport.internal.parse_response', [&$responses[$key], $requests[$key]]); } curl_multi_remove_handle($multihandle, $done['handle']); curl_close($done['handle']); if (!is_string($responses[$key])) { $options['hooks']->dispatch('multiple.request.complete', [&$responses[$key], $key]); } $completed++; } } while ($active || $completed < $subrequestcount); $request['options']['hooks']->dispatch('curl.after_multi_exec', [&$multihandle]); curl_multi_close($multihandle); return $responses; } /** * Get the cURL handle for use in a multi-request * * @param string $url URL to request * @param array $headers Associative array of request headers * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD * @param array $options Request options, see {@see \WpOrg\Requests\Requests::response()} for documentation * @return resource|\CurlHandle Subrequest's cURL handle */ public function &get_subrequest_handle($url, $headers, $data, $options) { $this->setup_handle($url, $headers, $data, $options); if ($options['filename'] !== false) { $this->stream_handle = fopen($options['filename'], 'wb'); } $this->response_data = ''; $this->response_bytes = 0; $this->response_byte_limit = false; if ($options['max_bytes'] !== false) { $this->response_byte_limit = $options['max_bytes']; } $this->hooks = $options['hooks']; return $this->handle; } /** * Setup the cURL handle for the given data * * @param string $url URL to request * @param array $headers Associative array of request headers * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD * @param array $options Request options, see {@see \WpOrg\Requests\Requests::response()} for documentation */ private function setup_handle($url, $headers, $data, $options) { $options['hooks']->dispatch('curl.before_request', [&$this->handle]); // Force closing the connection for old versions of cURL (<7.22). if (!isset($headers['Connection'])) { $headers['Connection'] = 'close'; } /** * Add "Expect" header. * * By default, cURL adds a "Expect: 100-Continue" to most requests. This header can * add as much as a second to the time it takes for cURL to perform a request. To * prevent this, we need to set an empty "Expect" header. To match the behaviour of * Guzzle, we'll add the empty header to requests that are smaller than 1 MB and use * HTTP/1.1. * * https://curl.se/mail/lib-2017-07/0013.html */ if (!isset($headers['Expect']) && $options['protocol_version'] === 1.1) { $headers['Expect'] = $this->get_expect_header($data); } $headers = Requests::flatten($headers); if (!empty($data)) { $data_format = $options['data_format']; if ($data_format === 'query') { $url = self::format_get($url, $data); $data = ''; } elseif (!is_string($data) && !isset($data["file"])){ $data = http_build_query($data, '', '&'); } } switch ($options['type']) { case Requests::POST: curl_setopt($this->handle, CURLOPT_POST, true); curl_setopt($this->handle, CURLOPT_POSTFIELDS, $data); break; case Requests::HEAD: curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']); curl_setopt($this->handle, CURLOPT_NOBODY, true); break; case Requests::TRACE: curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']); break; case Requests::PATCH: case Requests::PUT: case Requests::DELETE: case Requests::OPTIONS: default: curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']); if (!empty($data)) { curl_setopt($this->handle, CURLOPT_POSTFIELDS, $data); } } // cURL requires a minimum timeout of 1 second when using the system // DNS resolver, as it uses `alarm()`, which is second resolution only. // There's no way to detect which DNS resolver is being used from our // end, so we need to round up regardless of the supplied timeout. // // https://github.com/curl/curl/blob/4f45240bc84a9aa648c8f7243be7b79e9f9323a5/lib/hostip.c#L606-L609 $timeout = max($options['timeout'], 1); if (is_int($timeout) || $this->version < self::CURL_7_16_2) { curl_setopt($this->handle, CURLOPT_TIMEOUT, ceil($timeout)); } else { // phpcs:ignore PHPCompatibility.Constants.NewConstants.curlopt_timeout_msFound curl_setopt($this->handle, CURLOPT_TIMEOUT_MS, round($timeout * 1000)); } if (is_int($options['connect_timeout']) || $this->version < self::CURL_7_16_2) { curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT, ceil($options['connect_timeout'])); } else { // phpcs:ignore PHPCompatibility.Constants.NewConstants.curlopt_connecttimeout_msFound curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT_MS, round($options['connect_timeout'] * 1000)); } curl_setopt($this->handle, CURLOPT_URL, $url); curl_setopt($this->handle, CURLOPT_USERAGENT, $options['useragent']); if (!empty($headers)) { curl_setopt($this->handle, CURLOPT_HTTPHEADER, $headers); } if ($options['protocol_version'] === 1.1) { curl_setopt($this->handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); } else { curl_setopt($this->handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); } if ($options['blocking'] === true) { curl_setopt($this->handle, CURLOPT_HEADERFUNCTION, [$this, 'stream_headers']); curl_setopt($this->handle, CURLOPT_WRITEFUNCTION, [$this, 'stream_body']); curl_setopt($this->handle, CURLOPT_BUFFERSIZE, Requests::BUFFER_SIZE); } } /** * Process a response * * @param string $response Response data from the body * @param array $options Request options * @return string|false HTTP response data including headers. False if non-blocking. * @throws \WpOrg\Requests\Exception */ public function process_response($response, $options) { if ($options['blocking'] === false) { $fake_headers = ''; $options['hooks']->dispatch('curl.after_request', [&$fake_headers]); return false; } if ($options['filename'] !== false && $this->stream_handle) { fclose($this->stream_handle); $this->headers = trim($this->headers); } else { $this->headers .= $response; } if (curl_errno($this->handle)) { $error = sprintf( 'cURL error %s: %s', curl_errno($this->handle), curl_error($this->handle) ); throw new Exception($error, 'curlerror', $this->handle); } $this->info = curl_getinfo($this->handle); $options['hooks']->dispatch('curl.after_request', [&$this->headers, &$this->info]); return $this->headers; } /** * Collect the headers as they are received * * @param resource|\CurlHandle $handle cURL handle * @param string $headers Header string * @return integer Length of provided header */ public function stream_headers($handle, $headers) { // Why do we do this? cURL will send both the final response and any // interim responses, such as a 100 Continue. We don't need that. // (We may want to keep this somewhere just in case) if ($this->done_headers) { $this->headers = ''; $this->done_headers = false; } $this->headers .= $headers; if ($headers === "\r\n") { $this->done_headers = true; } return strlen($headers); } /** * Collect data as it's received * * @since 1.6.1 * * @param resource|\CurlHandle $handle cURL handle * @param string $data Body data * @return integer Length of provided data */ public function stream_body($handle, $data) { $this->hooks->dispatch('request.progress', [$data, $this->response_bytes, $this->response_byte_limit]); $data_length = strlen($data); // Are we limiting the response size? if ($this->response_byte_limit) { if ($this->response_bytes === $this->response_byte_limit) { // Already at maximum, move on return $data_length; } if (($this->response_bytes + $data_length) > $this->response_byte_limit) { // Limit the length $limited_length = ($this->response_byte_limit - $this->response_bytes); $data = substr($data, 0, $limited_length); } } if ($this->stream_handle) { fwrite($this->stream_handle, $data); } else { $this->response_data .= $data; } $this->response_bytes += strlen($data); return $data_length; } /** * Format a URL given GET data * * @param string $url * @param array|object $data Data to build query using, see {@link https://www.php.net/http_build_query} * @return string URL with data */ private static function format_get($url, $data) { if (!empty($data)) { $query = ''; $url_parts = parse_url($url); if (empty($url_parts['query'])) { $url_parts['query'] = ''; } else { $query = $url_parts['query']; } $query .= '&' . http_build_query($data, '', '&'); $query = trim($query, '&'); if (empty($url_parts['query'])) { $url .= '?' . $query; } else { $url = str_replace($url_parts['query'], $query, $url); } } return $url; } /** * Self-test whether the transport can be used. * * The available capabilities to test for can be found in {@see \WpOrg\Requests\Capability}. * * @codeCoverageIgnore * @param array<string, bool> $capabilities Optional. Associative array of capabilities to test against, i.e. `['<capability>' => true]`. * @return bool Whether the transport can be used. */ public static function test($capabilities = []) { if (!function_exists('curl_init') || !function_exists('curl_exec')) { return false; } // If needed, check that our installed curl version supports SSL if (isset($capabilities[Capability::SSL]) && $capabilities[Capability::SSL]) { $curl_version = curl_version(); if (!(CURL_VERSION_SSL & $curl_version['features'])) { return false; } } return true; } /** * Get the correct "Expect" header for the given request data. * * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD. * @return string The "Expect" header. */ private function get_expect_header($data) { if (!is_array($data)) { return strlen((string) $data) >= 1048576 ? '100-Continue' : ''; } $bytesize = 0; $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($data)); foreach ($iterator as $datum) { $bytesize += strlen((string) $datum); if ($bytesize >= 1048576) { return '100-Continue'; } } return ''; } } razorpay/libs/Requests-2.0.4/src/Auth/Basic.php 0000644 00000004755 15002216177 0015054 0 ustar 00 <?php /** * Basic Authentication provider * * @package Requests\Authentication */ namespace WpOrg\Requests\Auth; use WpOrg\Requests\Auth; use WpOrg\Requests\Exception\ArgumentCount; use WpOrg\Requests\Exception\InvalidArgument; use WpOrg\Requests\Hooks; /** * Basic Authentication provider * * Provides a handler for Basic HTTP authentication via the Authorization * header. * * @package Requests\Authentication */ class Basic implements Auth { /** * Username * * @var string */ public $user; /** * Password * * @var string */ public $pass; /** * Constructor * * @since 2.0 Throws an `InvalidArgument` exception. * @since 2.0 Throws an `ArgumentCount` exception instead of the Requests base `Exception. * * @param array|null $args Array of user and password. Must have exactly two elements * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not an array or null. * @throws \WpOrg\Requests\Exception\ArgumentCount On incorrect number of array elements (`authbasicbadargs`). */ public function __construct($args = null) { if (is_array($args)) { if (count($args) !== 2) { throw ArgumentCount::create('an array with exactly two elements', count($args), 'authbasicbadargs'); } list($this->user, $this->pass) = $args; return; } if ($args !== null) { throw InvalidArgument::create(1, '$args', 'array|null', gettype($args)); } } /** * Register the necessary callbacks * * @see \WpOrg\Requests\Auth\Basic::curl_before_send() * @see \WpOrg\Requests\Auth\Basic::fsockopen_header() * @param \WpOrg\Requests\Hooks $hooks Hook system */ public function register(Hooks $hooks) { $hooks->register('curl.before_send', [$this, 'curl_before_send']); $hooks->register('fsockopen.after_headers', [$this, 'fsockopen_header']); } /** * Set cURL parameters before the data is sent * * @param resource|\CurlHandle $handle cURL handle */ public function curl_before_send(&$handle) { curl_setopt($handle, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($handle, CURLOPT_USERPWD, $this->getAuthString()); } /** * Add extra headers to the request before sending * * @param string $out HTTP header string */ public function fsockopen_header(&$out) { $out .= sprintf("Authorization: Basic %s\r\n", base64_encode($this->getAuthString())); } /** * Get the authentication string (user:pass) * * @return string */ public function getAuthString() { return $this->user . ':' . $this->pass; } } razorpay/libs/Requests-2.0.4/src/Utility/InputValidator.php 0000644 00000004720 15002216177 0017532 0 ustar 00 <?php /** * Input validation utilities. * * @package Requests\Utilities */ namespace WpOrg\Requests\Utility; use ArrayAccess; use CurlHandle; use Traversable; /** * Input validation utilities. * * @package Requests\Utilities */ final class InputValidator { /** * Verify that a received input parameter is of type string or is "stringable". * * @param mixed $input Input parameter to verify. * * @return bool */ public static function is_string_or_stringable($input) { return is_string($input) || self::is_stringable_object($input); } /** * Verify whether a received input parameter is usable as an integer array key. * * @param mixed $input Input parameter to verify. * * @return bool */ public static function is_numeric_array_key($input) { if (is_int($input)) { return true; } if (!is_string($input)) { return false; } return (bool) preg_match('`^-?[0-9]+$`', $input); } /** * Verify whether a received input parameter is "stringable". * * @param mixed $input Input parameter to verify. * * @return bool */ public static function is_stringable_object($input) { return is_object($input) && method_exists($input, '__toString'); } /** * Verify whether a received input parameter is _accessible as if it were an array_. * * @param mixed $input Input parameter to verify. * * @return bool */ public static function has_array_access($input) { return is_array($input) || $input instanceof ArrayAccess; } /** * Verify whether a received input parameter is "iterable". * * @internal The PHP native `is_iterable()` function was only introduced in PHP 7.1 * and this library still supports PHP 5.6. * * @param mixed $input Input parameter to verify. * * @return bool */ public static function is_iterable($input) { return is_array($input) || $input instanceof Traversable; } /** * Verify whether a received input parameter is a Curl handle. * * The PHP Curl extension worked with resources prior to PHP 8.0 and with * an instance of the `CurlHandle` class since PHP 8.0. * {@link https://www.php.net/manual/en/migration80.incompatible.php#migration80.incompatible.resource2object} * * @param mixed $input Input parameter to verify. * * @return bool */ public static function is_curl_handle($input) { if (is_resource($input)) { return get_resource_type($input) === 'curl'; } if (is_object($input)) { return $input instanceof CurlHandle; } return false; } } razorpay/libs/Requests-2.0.4/src/Utility/FilteredIterator.php 0000644 00000003177 15002216177 0020042 0 ustar 00 <?php /** * Iterator for arrays requiring filtered values * * @package Requests\Utilities */ namespace WpOrg\Requests\Utility; use ArrayIterator; use ReturnTypeWillChange; use WpOrg\Requests\Exception\InvalidArgument; use WpOrg\Requests\Utility\InputValidator; /** * Iterator for arrays requiring filtered values * * @package Requests\Utilities */ final class FilteredIterator extends ArrayIterator { /** * Callback to run as a filter * * @var callable */ private $callback; /** * Create a new iterator * * @param array $data * @param callable $callback Callback to be called on each value * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $data argument is not iterable. */ public function __construct($data, $callback) { if (InputValidator::is_iterable($data) === false) { throw InvalidArgument::create(1, '$data', 'iterable', gettype($data)); } parent::__construct($data); if (is_callable($callback)) { $this->callback = $callback; } } /** * @inheritdoc * * @phpcs:disable PHPCompatibility.FunctionNameRestrictions.NewMagicMethods.__unserializeFound */ #[ReturnTypeWillChange] public function __unserialize($data) {} // phpcs:enable public function __wakeup() { unset($this->callback); } /** * Get the current item's value after filtering * * @return string */ #[ReturnTypeWillChange] public function current() { $value = parent::current(); if (is_callable($this->callback)) { $value = call_user_func($this->callback, $value); } return $value; } /** * @inheritdoc */ #[ReturnTypeWillChange] public function unserialize($data) {} } razorpay/libs/Requests-2.0.4/src/Utility/CaseInsensitiveDictionary.php 0000644 00000004654 15002216177 0021715 0 ustar 00 <?php /** * Case-insensitive dictionary, suitable for HTTP headers * * @package Requests\Utilities */ namespace WpOrg\Requests\Utility; use ArrayAccess; use ArrayIterator; use IteratorAggregate; use ReturnTypeWillChange; use WpOrg\Requests\Exception; /** * Case-insensitive dictionary, suitable for HTTP headers * * @package Requests\Utilities */ class CaseInsensitiveDictionary implements ArrayAccess, IteratorAggregate { /** * Actual item data * * @var array */ protected $data = []; /** * Creates a case insensitive dictionary. * * @param array $data Dictionary/map to convert to case-insensitive */ public function __construct(array $data = []) { foreach ($data as $offset => $value) { $this->offsetSet($offset, $value); } } /** * Check if the given item exists * * @param string $offset Item key * @return boolean Does the item exist? */ #[ReturnTypeWillChange] public function offsetExists($offset) { if (is_string($offset)) { $offset = strtolower($offset); } return isset($this->data[$offset]); } /** * Get the value for the item * * @param string $offset Item key * @return string|null Item value (null if the item key doesn't exist) */ #[ReturnTypeWillChange] public function offsetGet($offset) { if (is_string($offset)) { $offset = strtolower($offset); } if (!isset($this->data[$offset])) { return null; } return $this->data[$offset]; } /** * Set the given item * * @param string $offset Item name * @param string $value Item value * * @throws \WpOrg\Requests\Exception On attempting to use dictionary as list (`invalidset`) */ #[ReturnTypeWillChange] public function offsetSet($offset, $value) { if ($offset === null) { throw new Exception('Object is a dictionary, not a list', 'invalidset'); } if (is_string($offset)) { $offset = strtolower($offset); } $this->data[$offset] = $value; } /** * Unset the given header * * @param string $offset */ #[ReturnTypeWillChange] public function offsetUnset($offset) { if (is_string($offset)) { $offset = strtolower($offset); } unset($this->data[$offset]); } /** * Get an iterator for the data * * @return \ArrayIterator */ #[ReturnTypeWillChange] public function getIterator() { return new ArrayIterator($this->data); } /** * Get the headers as an array * * @return array Header data */ public function getAll() { return $this->data; } } razorpay/libs/Requests-2.0.4/src/Proxy.php 0000644 00000001543 15002216177 0014243 0 ustar 00 <?php /** * Proxy connection interface * * @package Requests\Proxy * @since 1.6 */ namespace WpOrg\Requests; use WpOrg\Requests\Hooks; /** * Proxy connection interface * * Implement this interface to handle proxy settings and authentication * * Parameters should be passed via the constructor where possible, as this * makes it much easier for users to use your provider. * * @see \WpOrg\Requests\Hooks * * @package Requests\Proxy * @since 1.6 */ interface Proxy { /** * Register hooks as needed * * This method is called in {@see \WpOrg\Requests\Requests::request()} when the user * has set an instance as the 'auth' option. Use this callback to register all the * hooks you'll need. * * @see \WpOrg\Requests\Hooks::register() * @param \WpOrg\Requests\Hooks $hooks Hook system */ public function register(Hooks $hooks); } razorpay/libs/Requests-2.0.4/src/Requests.php 0000644 00000102261 15002216177 0014734 0 ustar 00 <?php /** * Requests for PHP * * Inspired by Requests for Python. * * Based on concepts from SimplePie_File, RequestCore and WP_Http. * * @package Requests */ namespace WpOrg\Requests; use WpOrg\Requests\Auth\Basic; use WpOrg\Requests\Capability; use WpOrg\Requests\Cookie\Jar; use WpOrg\Requests\Exception; use WpOrg\Requests\Exception\InvalidArgument; use WpOrg\Requests\Hooks; use WpOrg\Requests\IdnaEncoder; use WpOrg\Requests\Iri; use WpOrg\Requests\Proxy\Http; use WpOrg\Requests\Response; use WpOrg\Requests\Transport\Curl; use WpOrg\Requests\Transport\Fsockopen; use WpOrg\Requests\Utility\InputValidator; /** * Requests for PHP * * Inspired by Requests for Python. * * Based on concepts from SimplePie_File, RequestCore and WP_Http. * * @package Requests */ class Requests { /** * POST method * * @var string */ const POST = 'POST'; /** * PUT method * * @var string */ const PUT = 'PUT'; /** * GET method * * @var string */ const GET = 'GET'; /** * HEAD method * * @var string */ const HEAD = 'HEAD'; /** * DELETE method * * @var string */ const DELETE = 'DELETE'; /** * OPTIONS method * * @var string */ const OPTIONS = 'OPTIONS'; /** * TRACE method * * @var string */ const TRACE = 'TRACE'; /** * PATCH method * * @link https://tools.ietf.org/html/rfc5789 * @var string */ const PATCH = 'PATCH'; /** * Default size of buffer size to read streams * * @var integer */ const BUFFER_SIZE = 1160; /** * Option defaults. * * @see \WpOrg\Requests\Requests::get_default_options() * @see \WpOrg\Requests\Requests::request() for values returned by this method * * @since 2.0.0 * * @var array */ const OPTION_DEFAULTS = [ 'timeout' => 10, 'connect_timeout' => 10, 'useragent' => 'php-requests/' . self::VERSION, 'protocol_version' => 1.1, 'redirected' => 0, 'redirects' => 10, 'follow_redirects' => true, 'blocking' => true, 'type' => self::GET, 'filename' => false, 'auth' => false, 'proxy' => false, 'cookies' => false, 'max_bytes' => false, 'idn' => true, 'hooks' => null, 'transport' => null, 'verify' => null, 'verifyname' => true, ]; /** * Default supported Transport classes. * * @since 2.0.0 * * @var array */ const DEFAULT_TRANSPORTS = [ Curl::class => Curl::class, Fsockopen::class => Fsockopen::class, ]; /** * Current version of Requests * * @var string */ const VERSION = '2.0.4'; /** * Selected transport name * * Use {@see \WpOrg\Requests\Requests::get_transport()} instead * * @var array */ public static $transport = []; /** * Registered transport classes * * @var array */ protected static $transports = []; /** * Default certificate path. * * @see \WpOrg\Requests\Requests::get_certificate_path() * @see \WpOrg\Requests\Requests::set_certificate_path() * * @var string */ protected static $certificate_path = __DIR__ . '/../certificates/cacert.pem'; /** * All (known) valid deflate, gzip header magic markers. * * These markers relate to different compression levels. * * @link https://stackoverflow.com/a/43170354/482864 Marker source. * * @since 2.0.0 * * @var array */ private static $magic_compression_headers = [ "\x1f\x8b" => true, // Gzip marker. "\x78\x01" => true, // Zlib marker - level 1. "\x78\x5e" => true, // Zlib marker - level 2 to 5. "\x78\x9c" => true, // Zlib marker - level 6. "\x78\xda" => true, // Zlib marker - level 7 to 9. ]; /** * This is a static class, do not instantiate it * * @codeCoverageIgnore */ private function __construct() {} /** * Register a transport * * @param string $transport Transport class to add, must support the \WpOrg\Requests\Transport interface */ public static function add_transport($transport) { if (empty(self::$transports)) { self::$transports = self::DEFAULT_TRANSPORTS; } self::$transports[$transport] = $transport; } /** * Get the fully qualified class name (FQCN) for a working transport. * * @param array<string, bool> $capabilities Optional. Associative array of capabilities to test against, i.e. `['<capability>' => true]`. * @return string FQCN of the transport to use, or an empty string if no transport was * found which provided the requested capabilities. */ protected static function get_transport_class(array $capabilities = []) { // Caching code, don't bother testing coverage. // @codeCoverageIgnoreStart // Array of capabilities as a string to be used as an array key. ksort($capabilities); $cap_string = serialize($capabilities); // Don't search for a transport if it's already been done for these $capabilities. if (isset(self::$transport[$cap_string])) { return self::$transport[$cap_string]; } // Ensure we will not run this same check again later on. self::$transport[$cap_string] = ''; // @codeCoverageIgnoreEnd if (empty(self::$transports)) { self::$transports = self::DEFAULT_TRANSPORTS; } // Find us a working transport. foreach (self::$transports as $class) { if (!class_exists($class)) { continue; } $result = $class::test($capabilities); if ($result === true) { self::$transport[$cap_string] = $class; break; } } return self::$transport[$cap_string]; } /** * Get a working transport. * * @param array<string, bool> $capabilities Optional. Associative array of capabilities to test against, i.e. `['<capability>' => true]`. * @return \WpOrg\Requests\Transport * @throws \WpOrg\Requests\Exception If no valid transport is found (`notransport`). */ protected static function get_transport(array $capabilities = []) { $class = self::get_transport_class($capabilities); if ($class === '') { throw new Exception('No working transports found', 'notransport', self::$transports); } return new $class(); } /** * Checks to see if we have a transport for the capabilities requested. * * Supported capabilities can be found in the {@see \WpOrg\Requests\Capability} * interface as constants. * * Example usage: * `Requests::has_capabilities([Capability::SSL => true])`. * * @param array<string, bool> $capabilities Optional. Associative array of capabilities to test against, i.e. `['<capability>' => true]`. * @return bool Whether the transport has the requested capabilities. */ public static function has_capabilities(array $capabilities = []) { return self::get_transport_class($capabilities) !== ''; } /**#@+ * @see \WpOrg\Requests\Requests::request() * @param string $url * @param array $headers * @param array $options * @return \WpOrg\Requests\Response */ /** * Send a GET request */ public static function get($url, $headers = [], $options = []) { return self::request($url, $headers, null, self::GET, $options); } /** * Send a HEAD request */ public static function head($url, $headers = [], $options = []) { return self::request($url, $headers, null, self::HEAD, $options); } /** * Send a DELETE request */ public static function delete($url, $headers = [], $options = []) { return self::request($url, $headers, null, self::DELETE, $options); } /** * Send a TRACE request */ public static function trace($url, $headers = [], $options = []) { return self::request($url, $headers, null, self::TRACE, $options); } /**#@-*/ /**#@+ * @see \WpOrg\Requests\Requests::request() * @param string $url * @param array $headers * @param array $data * @param array $options * @return \WpOrg\Requests\Response */ /** * Send a POST request */ public static function post($url, $headers = [], $data = [], $options = []) { return self::request($url, $headers, $data, self::POST, $options); } /** * Send a PUT request */ public static function put($url, $headers = [], $data = [], $options = []) { return self::request($url, $headers, $data, self::PUT, $options); } /** * Send an OPTIONS request */ public static function options($url, $headers = [], $data = [], $options = []) { return self::request($url, $headers, $data, self::OPTIONS, $options); } /** * Send a PATCH request * * Note: Unlike {@see \WpOrg\Requests\Requests::post()} and {@see \WpOrg\Requests\Requests::put()}, * `$headers` is required, as the specification recommends that should send an ETag * * @link https://tools.ietf.org/html/rfc5789 */ public static function patch($url, $headers, $data = [], $options = []) { return self::request($url, $headers, $data, self::PATCH, $options); } /**#@-*/ /** * Main interface for HTTP requests * * This method initiates a request and sends it via a transport before * parsing. * * The `$options` parameter takes an associative array with the following * options: * * - `timeout`: How long should we wait for a response? * Note: for cURL, a minimum of 1 second applies, as DNS resolution * operates at second-resolution only. * (float, seconds with a millisecond precision, default: 10, example: 0.01) * - `connect_timeout`: How long should we wait while trying to connect? * (float, seconds with a millisecond precision, default: 10, example: 0.01) * - `useragent`: Useragent to send to the server * (string, default: php-requests/$version) * - `follow_redirects`: Should we follow 3xx redirects? * (boolean, default: true) * - `redirects`: How many times should we redirect before erroring? * (integer, default: 10) * - `blocking`: Should we block processing on this request? * (boolean, default: true) * - `filename`: File to stream the body to instead. * (string|boolean, default: false) * - `auth`: Authentication handler or array of user/password details to use * for Basic authentication * (\WpOrg\Requests\Auth|array|boolean, default: false) * - `proxy`: Proxy details to use for proxy by-passing and authentication * (\WpOrg\Requests\Proxy|array|string|boolean, default: false) * - `max_bytes`: Limit for the response body size. * (integer|boolean, default: false) * - `idn`: Enable IDN parsing * (boolean, default: true) * - `transport`: Custom transport. Either a class name, or a * transport object. Defaults to the first working transport from * {@see \WpOrg\Requests\Requests::getTransport()} * (string|\WpOrg\Requests\Transport, default: {@see \WpOrg\Requests\Requests::getTransport()}) * - `hooks`: Hooks handler. * (\WpOrg\Requests\HookManager, default: new WpOrg\Requests\Hooks()) * - `verify`: Should we verify SSL certificates? Allows passing in a custom * certificate file as a string. (Using true uses the system-wide root * certificate store instead, but this may have different behaviour * across transports.) * (string|boolean, default: certificates/cacert.pem) * - `verifyname`: Should we verify the common name in the SSL certificate? * (boolean, default: true) * - `data_format`: How should we send the `$data` parameter? * (string, one of 'query' or 'body', default: 'query' for * HEAD/GET/DELETE, 'body' for POST/PUT/OPTIONS/PATCH) * * @param string|Stringable $url URL to request * @param array $headers Extra headers to send with the request * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests * @param string $type HTTP request type (use Requests constants) * @param array $options Options for the request (see description for more information) * @return \WpOrg\Requests\Response * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $url argument is not a string or Stringable. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $type argument is not a string. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array. * @throws \WpOrg\Requests\Exception On invalid URLs (`nonhttp`) */ public static function request($url, $headers = [], $data = [], $type = self::GET, $options = []) { if (InputValidator::is_string_or_stringable($url) === false) { throw InvalidArgument::create(1, '$url', 'string|Stringable', gettype($url)); } if (is_string($type) === false) { throw InvalidArgument::create(4, '$type', 'string', gettype($type)); } if (is_array($options) === false) { throw InvalidArgument::create(5, '$options', 'array', gettype($options)); } if (empty($options['type'])) { $options['type'] = $type; } $options = array_merge(self::get_default_options(), $options); self::set_defaults($url, $headers, $data, $type, $options); $options['hooks']->dispatch('requests.before_request', [&$url, &$headers, &$data, &$type, &$options]); if (!empty($options['transport'])) { $transport = $options['transport']; if (is_string($options['transport'])) { $transport = new $transport(); } } else { $need_ssl = (stripos($url, 'https://') === 0); $capabilities = [Capability::SSL => $need_ssl]; $transport = self::get_transport($capabilities); } $response = $transport->request($url, $headers, $data, $options); $options['hooks']->dispatch('requests.before_parse', [&$response, $url, $headers, $data, $type, $options]); return self::parse_response($response, $url, $headers, $data, $options); } /** * Send multiple HTTP requests simultaneously * * The `$requests` parameter takes an associative or indexed array of * request fields. The key of each request can be used to match up the * request with the returned data, or with the request passed into your * `multiple.request.complete` callback. * * The request fields value is an associative array with the following keys: * * - `url`: Request URL Same as the `$url` parameter to * {@see \WpOrg\Requests\Requests::request()} * (string, required) * - `headers`: Associative array of header fields. Same as the `$headers` * parameter to {@see \WpOrg\Requests\Requests::request()} * (array, default: `array()`) * - `data`: Associative array of data fields or a string. Same as the * `$data` parameter to {@see \WpOrg\Requests\Requests::request()} * (array|string, default: `array()`) * - `type`: HTTP request type (use \WpOrg\Requests\Requests constants). Same as the `$type` * parameter to {@see \WpOrg\Requests\Requests::request()} * (string, default: `\WpOrg\Requests\Requests::GET`) * - `cookies`: Associative array of cookie name to value, or cookie jar. * (array|\WpOrg\Requests\Cookie\Jar) * * If the `$options` parameter is specified, individual requests will * inherit options from it. This can be used to use a single hooking system, * or set all the types to `\WpOrg\Requests\Requests::POST`, for example. * * In addition, the `$options` parameter takes the following global options: * * - `complete`: A callback for when a request is complete. Takes two * parameters, a \WpOrg\Requests\Response/\WpOrg\Requests\Exception reference, and the * ID from the request array (Note: this can also be overridden on a * per-request basis, although that's a little silly) * (callback) * * @param array $requests Requests data (see description for more information) * @param array $options Global and default options (see {@see \WpOrg\Requests\Requests::request()}) * @return array Responses (either \WpOrg\Requests\Response or a \WpOrg\Requests\Exception object) * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $requests argument is not an array or iterable object with array access. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array. */ public static function request_multiple($requests, $options = []) { if (InputValidator::has_array_access($requests) === false || InputValidator::is_iterable($requests) === false) { throw InvalidArgument::create(1, '$requests', 'array|ArrayAccess&Traversable', gettype($requests)); } if (is_array($options) === false) { throw InvalidArgument::create(2, '$options', 'array', gettype($options)); } $options = array_merge(self::get_default_options(true), $options); if (!empty($options['hooks'])) { $options['hooks']->register('transport.internal.parse_response', [static::class, 'parse_multiple']); if (!empty($options['complete'])) { $options['hooks']->register('multiple.request.complete', $options['complete']); } } foreach ($requests as $id => &$request) { if (!isset($request['headers'])) { $request['headers'] = []; } if (!isset($request['data'])) { $request['data'] = []; } if (!isset($request['type'])) { $request['type'] = self::GET; } if (!isset($request['options'])) { $request['options'] = $options; $request['options']['type'] = $request['type']; } else { if (empty($request['options']['type'])) { $request['options']['type'] = $request['type']; } $request['options'] = array_merge($options, $request['options']); } self::set_defaults($request['url'], $request['headers'], $request['data'], $request['type'], $request['options']); // Ensure we only hook in once if ($request['options']['hooks'] !== $options['hooks']) { $request['options']['hooks']->register('transport.internal.parse_response', [static::class, 'parse_multiple']); if (!empty($request['options']['complete'])) { $request['options']['hooks']->register('multiple.request.complete', $request['options']['complete']); } } } unset($request); if (!empty($options['transport'])) { $transport = $options['transport']; if (is_string($options['transport'])) { $transport = new $transport(); } } else { $transport = self::get_transport(); } $responses = $transport->request_multiple($requests, $options); foreach ($responses as $id => &$response) { // If our hook got messed with somehow, ensure we end up with the // correct response if (is_string($response)) { $request = $requests[$id]; self::parse_multiple($response, $request); $request['options']['hooks']->dispatch('multiple.request.complete', [&$response, $id]); } } return $responses; } /** * Get the default options * * @see \WpOrg\Requests\Requests::request() for values returned by this method * @param boolean $multirequest Is this a multirequest? * @return array Default option values */ protected static function get_default_options($multirequest = false) { $defaults = static::OPTION_DEFAULTS; $defaults['verify'] = self::$certificate_path; if ($multirequest !== false) { $defaults['complete'] = null; } return $defaults; } /** * Get default certificate path. * * @return string Default certificate path. */ public static function get_certificate_path() { return self::$certificate_path; } /** * Set default certificate path. * * @param string|Stringable|bool $path Certificate path, pointing to a PEM file. * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $url argument is not a string, Stringable or boolean. */ public static function set_certificate_path($path) { if (InputValidator::is_string_or_stringable($path) === false && is_bool($path) === false) { throw InvalidArgument::create(1, '$path', 'string|Stringable|bool', gettype($path)); } self::$certificate_path = $path; } /** * Set the default values * * @param string $url URL to request * @param array $headers Extra headers to send with the request * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests * @param string $type HTTP request type * @param array $options Options for the request * @return void $options is updated with the results * * @throws \WpOrg\Requests\Exception When the $url is not an http(s) URL. */ protected static function set_defaults(&$url, &$headers, &$data, &$type, &$options) { if (!preg_match('/^http(s)?:\/\//i', $url, $matches)) { throw new Exception('Only HTTP(S) requests are handled.', 'nonhttp', $url); } if (empty($options['hooks'])) { $options['hooks'] = new Hooks(); } if (is_array($options['auth'])) { $options['auth'] = new Basic($options['auth']); } if ($options['auth'] !== false) { $options['auth']->register($options['hooks']); } if (is_string($options['proxy']) || is_array($options['proxy'])) { $options['proxy'] = new Http($options['proxy']); } if ($options['proxy'] !== false) { $options['proxy']->register($options['hooks']); } if (is_array($options['cookies'])) { $options['cookies'] = new Jar($options['cookies']); } elseif (empty($options['cookies'])) { $options['cookies'] = new Jar(); } if ($options['cookies'] !== false) { $options['cookies']->register($options['hooks']); } if ($options['idn'] !== false) { $iri = new Iri($url); $iri->host = IdnaEncoder::encode($iri->ihost); $url = $iri->uri; } // Massage the type to ensure we support it. $type = strtoupper($type); if (!isset($options['data_format'])) { if (in_array($type, [self::HEAD, self::GET, self::DELETE], true)) { $options['data_format'] = 'query'; } else { $options['data_format'] = 'body'; } } } /** * HTTP response parser * * @param string $headers Full response text including headers and body * @param string $url Original request URL * @param array $req_headers Original $headers array passed to {@link request()}, in case we need to follow redirects * @param array $req_data Original $data array passed to {@link request()}, in case we need to follow redirects * @param array $options Original $options array passed to {@link request()}, in case we need to follow redirects * @return \WpOrg\Requests\Response * * @throws \WpOrg\Requests\Exception On missing head/body separator (`requests.no_crlf_separator`) * @throws \WpOrg\Requests\Exception On missing head/body separator (`noversion`) * @throws \WpOrg\Requests\Exception On missing head/body separator (`toomanyredirects`) */ protected static function parse_response($headers, $url, $req_headers, $req_data, $options) { $return = new Response(); if (!$options['blocking']) { return $return; } $return->raw = $headers; $return->url = (string) $url; $return->body = ''; if (!$options['filename']) { $pos = strpos($headers, "\r\n\r\n"); if ($pos === false) { // Crap! throw new Exception('Missing header/body separator', 'requests.no_crlf_separator'); } $headers = substr($return->raw, 0, $pos); // Headers will always be separated from the body by two new lines - `\n\r\n\r`. $body = substr($return->raw, $pos + 4); if (!empty($body)) { $return->body = $body; } } // Pretend CRLF = LF for compatibility (RFC 2616, section 19.3) $headers = str_replace("\r\n", "\n", $headers); // Unfold headers (replace [CRLF] 1*( SP | HT ) with SP) as per RFC 2616 (section 2.2) $headers = preg_replace('/\n[ \t]/', ' ', $headers); $headers = explode("\n", $headers); preg_match('#^HTTP/(1\.\d)[ \t]+(\d+)#i', array_shift($headers), $matches); if (empty($matches)) { throw new Exception('Response could not be parsed', 'noversion', $headers); } $return->protocol_version = (float) $matches[1]; $return->status_code = (int) $matches[2]; if ($return->status_code >= 200 && $return->status_code < 300) { $return->success = true; } foreach ($headers as $header) { list($key, $value) = explode(':', $header, 2); $value = trim($value); preg_replace('#(\s+)#i', ' ', $value); $return->headers[$key] = $value; } if (isset($return->headers['transfer-encoding'])) { $return->body = self::decode_chunked($return->body); unset($return->headers['transfer-encoding']); } if (isset($return->headers['content-encoding'])) { $return->body = self::decompress($return->body); } //fsockopen and cURL compatibility if (isset($return->headers['connection'])) { unset($return->headers['connection']); } $options['hooks']->dispatch('requests.before_redirect_check', [&$return, $req_headers, $req_data, $options]); if ($return->is_redirect() && $options['follow_redirects'] === true) { if (isset($return->headers['location']) && $options['redirected'] < $options['redirects']) { if ($return->status_code === 303) { $options['type'] = self::GET; } $options['redirected']++; $location = $return->headers['location']; if (strpos($location, 'http://') !== 0 && strpos($location, 'https://') !== 0) { // relative redirect, for compatibility make it absolute $location = Iri::absolutize($url, $location); $location = $location->uri; } $hook_args = [ &$location, &$req_headers, &$req_data, &$options, $return, ]; $options['hooks']->dispatch('requests.before_redirect', $hook_args); $redirected = self::request($location, $req_headers, $req_data, $options['type'], $options); $redirected->history[] = $return; return $redirected; } elseif ($options['redirected'] >= $options['redirects']) { throw new Exception('Too many redirects', 'toomanyredirects', $return); } } $return->redirects = $options['redirected']; $options['hooks']->dispatch('requests.after_request', [&$return, $req_headers, $req_data, $options]); return $return; } /** * Callback for `transport.internal.parse_response` * * Internal use only. Converts a raw HTTP response to a \WpOrg\Requests\Response * while still executing a multiple request. * * @param string $response Full response text including headers and body (will be overwritten with Response instance) * @param array $request Request data as passed into {@see \WpOrg\Requests\Requests::request_multiple()} * @return void `$response` is either set to a \WpOrg\Requests\Response instance, or a \WpOrg\Requests\Exception object */ public static function parse_multiple(&$response, $request) { try { $url = $request['url']; $headers = $request['headers']; $data = $request['data']; $options = $request['options']; $response = self::parse_response($response, $url, $headers, $data, $options); } catch (Exception $e) { $response = $e; } } /** * Decoded a chunked body as per RFC 2616 * * @link https://tools.ietf.org/html/rfc2616#section-3.6.1 * @param string $data Chunked body * @return string Decoded body */ protected static function decode_chunked($data) { if (!preg_match('/^([0-9a-f]+)(?:;(?:[\w-]*)(?:=(?:(?:[\w-]*)*|"(?:[^\r\n])*"))?)*\r\n/i', trim($data))) { return $data; } $decoded = ''; $encoded = $data; while (true) { $is_chunked = (bool) preg_match('/^([0-9a-f]+)(?:;(?:[\w-]*)(?:=(?:(?:[\w-]*)*|"(?:[^\r\n])*"))?)*\r\n/i', $encoded, $matches); if (!$is_chunked) { // Looks like it's not chunked after all return $data; } $length = hexdec(trim($matches[1])); if ($length === 0) { // Ignore trailer headers return $decoded; } $chunk_length = strlen($matches[0]); $decoded .= substr($encoded, $chunk_length, $length); $encoded = substr($encoded, $chunk_length + $length + 2); if (trim($encoded) === '0' || empty($encoded)) { return $decoded; } } // We'll never actually get down here // @codeCoverageIgnoreStart } // @codeCoverageIgnoreEnd /** * Convert a key => value array to a 'key: value' array for headers * * @param iterable $dictionary Dictionary of header values * @return array List of headers * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not iterable. */ public static function flatten($dictionary) { if (InputValidator::is_iterable($dictionary) === false) { throw InvalidArgument::create(1, '$dictionary', 'iterable', gettype($dictionary)); } $return = []; foreach ($dictionary as $key => $value) { $return[] = sprintf('%s: %s', $key, $value); } return $return; } /** * Decompress an encoded body * * Implements gzip, compress and deflate. Guesses which it is by attempting * to decode. * * @param string $data Compressed data in one of the above formats * @return string Decompressed string * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string. */ public static function decompress($data) { if (is_string($data) === false) { throw InvalidArgument::create(1, '$data', 'string', gettype($data)); } if (trim($data) === '') { // Empty body does not need further processing. return $data; } $marker = substr($data, 0, 2); if (!isset(self::$magic_compression_headers[$marker])) { // Not actually compressed. Probably cURL ruining this for us. return $data; } if (function_exists('gzdecode')) { $decoded = @gzdecode($data); if ($decoded !== false) { return $decoded; } } if (function_exists('gzinflate')) { $decoded = @gzinflate($data); if ($decoded !== false) { return $decoded; } } $decoded = self::compatible_gzinflate($data); if ($decoded !== false) { return $decoded; } if (function_exists('gzuncompress')) { $decoded = @gzuncompress($data); if ($decoded !== false) { return $decoded; } } return $data; } /** * Decompression of deflated string while staying compatible with the majority of servers. * * Certain Servers will return deflated data with headers which PHP's gzinflate() * function cannot handle out of the box. The following function has been created from * various snippets on the gzinflate() PHP documentation. * * Warning: Magic numbers within. Due to the potential different formats that the compressed * data may be returned in, some "magic offsets" are needed to ensure proper decompression * takes place. For a simple progmatic way to determine the magic offset in use, see: * https://core.trac.wordpress.org/ticket/18273 * * @since 1.6.0 * @link https://core.trac.wordpress.org/ticket/18273 * @link https://www.php.net/gzinflate#70875 * @link https://www.php.net/gzinflate#77336 * * @param string $gz_data String to decompress. * @return string|bool False on failure. * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string. */ public static function compatible_gzinflate($gz_data) { if (is_string($gz_data) === false) { throw InvalidArgument::create(1, '$gz_data', 'string', gettype($gz_data)); } if (trim($gz_data) === '') { return false; } // Compressed data might contain a full zlib header, if so strip it for // gzinflate() if (substr($gz_data, 0, 3) === "\x1f\x8b\x08") { $i = 10; $flg = ord(substr($gz_data, 3, 1)); if ($flg > 0) { if ($flg & 4) { list($xlen) = unpack('v', substr($gz_data, $i, 2)); $i += 2 + $xlen; } if ($flg & 8) { $i = strpos($gz_data, "\0", $i) + 1; } if ($flg & 16) { $i = strpos($gz_data, "\0", $i) + 1; } if ($flg & 2) { $i += 2; } } $decompressed = self::compatible_gzinflate(substr($gz_data, $i)); if ($decompressed !== false) { return $decompressed; } } // If the data is Huffman Encoded, we must first strip the leading 2 // byte Huffman marker for gzinflate() // The response is Huffman coded by many compressors such as // java.util.zip.Deflater, Ruby's Zlib::Deflate, and .NET's // System.IO.Compression.DeflateStream. // // See https://decompres.blogspot.com/ for a quick explanation of this // data type $huffman_encoded = false; // low nibble of first byte should be 0x08 list(, $first_nibble) = unpack('h', $gz_data); // First 2 bytes should be divisible by 0x1F list(, $first_two_bytes) = unpack('n', $gz_data); if ($first_nibble === 0x08 && ($first_two_bytes % 0x1F) === 0) { $huffman_encoded = true; } if ($huffman_encoded) { $decompressed = @gzinflate(substr($gz_data, 2)); if ($decompressed !== false) { return $decompressed; } } if (substr($gz_data, 0, 4) === "\x50\x4b\x03\x04") { // ZIP file format header // Offset 6: 2 bytes, General-purpose field // Offset 26: 2 bytes, filename length // Offset 28: 2 bytes, optional field length // Offset 30: Filename field, followed by optional field, followed // immediately by data list(, $general_purpose_flag) = unpack('v', substr($gz_data, 6, 2)); // If the file has been compressed on the fly, 0x08 bit is set of // the general purpose field. We can use this to differentiate // between a compressed document, and a ZIP file $zip_compressed_on_the_fly = ((0x08 & $general_purpose_flag) === 0x08); if (!$zip_compressed_on_the_fly) { // Don't attempt to decode a compressed zip file return $gz_data; } // Determine the first byte of data, based on the above ZIP header // offsets: $first_file_start = array_sum(unpack('v2', substr($gz_data, 26, 4))); $decompressed = @gzinflate(substr($gz_data, 30 + $first_file_start)); if ($decompressed !== false) { return $decompressed; } return false; } // Finally fall back to straight gzinflate $decompressed = @gzinflate($gz_data); if ($decompressed !== false) { return $decompressed; } // Fallback for all above failing, not expected, but included for // debugging and preventing regressions and to track stats $decompressed = @gzinflate(substr($gz_data, 2)); if ($decompressed !== false) { return $decompressed; } return false; } } razorpay/libs/Requests-2.0.4/src/HookManager.php 0000644 00000001305 15002216177 0015311 0 ustar 00 <?php /** * Event dispatcher * * @package Requests\EventDispatcher */ namespace WpOrg\Requests; /** * Event dispatcher * * @package Requests\EventDispatcher */ interface HookManager { /** * Register a callback for a hook * * @param string $hook Hook name * @param callable $callback Function/method to call on event * @param int $priority Priority number. <0 is executed earlier, >0 is executed later */ public function register($hook, $callback, $priority = 0); /** * Dispatch a message * * @param string $hook Hook name * @param array $parameters Parameters to pass to callbacks * @return boolean Successfulness */ public function dispatch($hook, $parameters = []); } razorpay/libs/Requests-2.0.4/src/Auth.php 0000644 00000001534 15002216177 0014023 0 ustar 00 <?php /** * Authentication provider interface * * @package Requests\Authentication */ namespace WpOrg\Requests; use WpOrg\Requests\Hooks; /** * Authentication provider interface * * Implement this interface to act as an authentication provider. * * Parameters should be passed via the constructor where possible, as this * makes it much easier for users to use your provider. * * @see \WpOrg\Requests\Hooks * * @package Requests\Authentication */ interface Auth { /** * Register hooks as needed * * This method is called in {@see \WpOrg\Requests\Requests::request()} when the user * has set an instance as the 'auth' option. Use this callback to register all the * hooks you'll need. * * @see \WpOrg\Requests\Hooks::register() * @param \WpOrg\Requests\Hooks $hooks Hook system */ public function register(Hooks $hooks); } razorpay/libs/Requests-2.0.4/src/Exception.php 0000644 00000002132 15002216177 0015053 0 ustar 00 <?php /** * Exception for HTTP requests * * @package Requests\Exceptions */ namespace WpOrg\Requests; use Exception as PHPException; /** * Exception for HTTP requests * * @package Requests\Exceptions */ class Exception extends PHPException { /** * Type of exception * * @var string */ protected $type; /** * Data associated with the exception * * @var mixed */ protected $data; /** * Create a new exception * * @param string $message Exception message * @param string $type Exception type * @param mixed $data Associated data * @param integer $code Exception numerical code, if applicable */ public function __construct($message, $type, $data = null, $code = 0) { parent::__construct($message, $code); $this->type = $type; $this->data = $data; } /** * Like {@see \Exception::getCode()}, but a string code. * * @codeCoverageIgnore * @return string */ public function getType() { return $this->type; } /** * Gives any relevant data * * @codeCoverageIgnore * @return mixed */ public function getData() { return $this->data; } } razorpay/libs/Requests-2.0.4/src/Cookie/Jar.php 0000644 00000010116 15002216177 0015043 0 ustar 00 <?php /** * Cookie holder object * * @package Requests\Cookies */ namespace WpOrg\Requests\Cookie; use ArrayAccess; use ArrayIterator; use IteratorAggregate; use ReturnTypeWillChange; use WpOrg\Requests\Cookie; use WpOrg\Requests\Exception; use WpOrg\Requests\Exception\InvalidArgument; use WpOrg\Requests\HookManager; use WpOrg\Requests\Iri; use WpOrg\Requests\Response; /** * Cookie holder object * * @package Requests\Cookies */ class Jar implements ArrayAccess, IteratorAggregate { /** * Actual item data * * @var array */ protected $cookies = []; /** * Create a new jar * * @param array $cookies Existing cookie values * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not an array. */ public function __construct($cookies = []) { if (is_array($cookies) === false) { throw InvalidArgument::create(1, '$cookies', 'array', gettype($cookies)); } $this->cookies = $cookies; } /** * Normalise cookie data into a \WpOrg\Requests\Cookie * * @param string|\WpOrg\Requests\Cookie $cookie * @return \WpOrg\Requests\Cookie */ public function normalize_cookie($cookie, $key = '') { if ($cookie instanceof Cookie) { return $cookie; } return Cookie::parse($cookie, $key); } /** * Check if the given item exists * * @param string $offset Item key * @return boolean Does the item exist? */ #[ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->cookies[$offset]); } /** * Get the value for the item * * @param string $offset Item key * @return string|null Item value (null if offsetExists is false) */ #[ReturnTypeWillChange] public function offsetGet($offset) { if (!isset($this->cookies[$offset])) { return null; } return $this->cookies[$offset]; } /** * Set the given item * * @param string $offset Item name * @param string $value Item value * * @throws \WpOrg\Requests\Exception On attempting to use dictionary as list (`invalidset`) */ #[ReturnTypeWillChange] public function offsetSet($offset, $value) { if ($offset === null) { throw new Exception('Object is a dictionary, not a list', 'invalidset'); } $this->cookies[$offset] = $value; } /** * Unset the given header * * @param string $offset */ #[ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->cookies[$offset]); } /** * Get an iterator for the data * * @return \ArrayIterator */ #[ReturnTypeWillChange] public function getIterator() { return new ArrayIterator($this->cookies); } /** * Register the cookie handler with the request's hooking system * * @param \WpOrg\Requests\HookManager $hooks Hooking system */ public function register(HookManager $hooks) { $hooks->register('requests.before_request', [$this, 'before_request']); $hooks->register('requests.before_redirect_check', [$this, 'before_redirect_check']); } /** * Add Cookie header to a request if we have any * * As per RFC 6265, cookies are separated by '; ' * * @param string $url * @param array $headers * @param array $data * @param string $type * @param array $options */ public function before_request($url, &$headers, &$data, &$type, &$options) { if (!$url instanceof Iri) { $url = new Iri($url); } if (!empty($this->cookies)) { $cookies = []; foreach ($this->cookies as $key => $cookie) { $cookie = $this->normalize_cookie($cookie, $key); // Skip expired cookies if ($cookie->is_expired()) { continue; } if ($cookie->domain_matches($url->host)) { $cookies[] = $cookie->format_for_header(); } } $headers['Cookie'] = implode('; ', $cookies); } } /** * Parse all cookies from a response and attach them to the response * * @param \WpOrg\Requests\Response $response */ public function before_redirect_check(Response $response) { $url = $response->url; if (!$url instanceof Iri) { $url = new Iri($url); } $cookies = Cookie::parse_from_headers($response->headers, $url); $this->cookies = array_merge($this->cookies, $cookies); $response->cookies = $this; } } razorpay/libs/Requests-2.0.4/src/Autoload.php 0000644 00000022240 15002216177 0014667 0 ustar 00 <?php /** * Autoloader for Requests for PHP. * * Include this file if you'd like to avoid having to create your own autoloader. * * @package Requests * @since 2.0.0 * * @codeCoverageIgnore */ namespace WpOrg\Requests; /* * Ensure the autoloader is only declared once. * This safeguard is in place as this is the typical entry point for this library * and this file being required unconditionally could easily cause * fatal "Class already declared" errors. */ if (class_exists('WpOrg\Requests\Autoload') === false) { /** * Autoloader for Requests for PHP. * * This autoloader supports the PSR-4 based Requests 2.0.0 classes in a case-sensitive manner * as the most common server OS-es are case-sensitive and the file names are in mixed case. * * For the PSR-0 Requests 1.x BC-layer, requested classes will be treated case-insensitively. * * @package Requests */ final class Autoload { /** * List of the old PSR-0 class names in lowercase as keys with their PSR-4 case-sensitive name as a value. * * @var array */ private static $deprecated_classes = [ // Interfaces. 'requests_auth' => '\WpOrg\Requests\Auth', 'requests_hooker' => '\WpOrg\Requests\HookManager', 'requests_proxy' => '\WpOrg\Requests\Proxy', 'requests_transport' => '\WpOrg\Requests\Transport', // Classes. 'requests_cookie' => '\WpOrg\Requests\Cookie', 'requests_exception' => '\WpOrg\Requests\Exception', 'requests_hooks' => '\WpOrg\Requests\Hooks', 'requests_idnaencoder' => '\WpOrg\Requests\IdnaEncoder', 'requests_ipv6' => '\WpOrg\Requests\Ipv6', 'requests_iri' => '\WpOrg\Requests\Iri', 'requests_response' => '\WpOrg\Requests\Response', 'requests_session' => '\WpOrg\Requests\Session', 'requests_ssl' => '\WpOrg\Requests\Ssl', 'requests_auth_basic' => '\WpOrg\Requests\Auth\Basic', 'requests_cookie_jar' => '\WpOrg\Requests\Cookie\Jar', 'requests_proxy_http' => '\WpOrg\Requests\Proxy\Http', 'requests_response_headers' => '\WpOrg\Requests\Response\Headers', 'requests_transport_curl' => '\WpOrg\Requests\Transport\Curl', 'requests_transport_fsockopen' => '\WpOrg\Requests\Transport\Fsockopen', 'requests_utility_caseinsensitivedictionary' => '\WpOrg\Requests\Utility\CaseInsensitiveDictionary', 'requests_utility_filterediterator' => '\WpOrg\Requests\Utility\FilteredIterator', 'requests_exception_http' => '\WpOrg\Requests\Exception\Http', 'requests_exception_transport' => '\WpOrg\Requests\Exception\Transport', 'requests_exception_transport_curl' => '\WpOrg\Requests\Exception\Transport\Curl', 'requests_exception_http_304' => '\WpOrg\Requests\Exception\Http\Status304', 'requests_exception_http_305' => '\WpOrg\Requests\Exception\Http\Status305', 'requests_exception_http_306' => '\WpOrg\Requests\Exception\Http\Status306', 'requests_exception_http_400' => '\WpOrg\Requests\Exception\Http\Status400', 'requests_exception_http_401' => '\WpOrg\Requests\Exception\Http\Status401', 'requests_exception_http_402' => '\WpOrg\Requests\Exception\Http\Status402', 'requests_exception_http_403' => '\WpOrg\Requests\Exception\Http\Status403', 'requests_exception_http_404' => '\WpOrg\Requests\Exception\Http\Status404', 'requests_exception_http_405' => '\WpOrg\Requests\Exception\Http\Status405', 'requests_exception_http_406' => '\WpOrg\Requests\Exception\Http\Status406', 'requests_exception_http_407' => '\WpOrg\Requests\Exception\Http\Status407', 'requests_exception_http_408' => '\WpOrg\Requests\Exception\Http\Status408', 'requests_exception_http_409' => '\WpOrg\Requests\Exception\Http\Status409', 'requests_exception_http_410' => '\WpOrg\Requests\Exception\Http\Status410', 'requests_exception_http_411' => '\WpOrg\Requests\Exception\Http\Status411', 'requests_exception_http_412' => '\WpOrg\Requests\Exception\Http\Status412', 'requests_exception_http_413' => '\WpOrg\Requests\Exception\Http\Status413', 'requests_exception_http_414' => '\WpOrg\Requests\Exception\Http\Status414', 'requests_exception_http_415' => '\WpOrg\Requests\Exception\Http\Status415', 'requests_exception_http_416' => '\WpOrg\Requests\Exception\Http\Status416', 'requests_exception_http_417' => '\WpOrg\Requests\Exception\Http\Status417', 'requests_exception_http_418' => '\WpOrg\Requests\Exception\Http\Status418', 'requests_exception_http_428' => '\WpOrg\Requests\Exception\Http\Status428', 'requests_exception_http_429' => '\WpOrg\Requests\Exception\Http\Status429', 'requests_exception_http_431' => '\WpOrg\Requests\Exception\Http\Status431', 'requests_exception_http_500' => '\WpOrg\Requests\Exception\Http\Status500', 'requests_exception_http_501' => '\WpOrg\Requests\Exception\Http\Status501', 'requests_exception_http_502' => '\WpOrg\Requests\Exception\Http\Status502', 'requests_exception_http_503' => '\WpOrg\Requests\Exception\Http\Status503', 'requests_exception_http_504' => '\WpOrg\Requests\Exception\Http\Status504', 'requests_exception_http_505' => '\WpOrg\Requests\Exception\Http\Status505', 'requests_exception_http_511' => '\WpOrg\Requests\Exception\Http\Status511', 'requests_exception_http_unknown' => '\WpOrg\Requests\Exception\Http\StatusUnknown', ]; /** * Register the autoloader. * * Note: the autoloader is *prepended* in the autoload queue. * This is done to ensure that the Requests 2.0 autoloader takes precedence * over a potentially (dependency-registered) Requests 1.x autoloader. * * @internal This method contains a safeguard against the autoloader being * registered multiple times. This safeguard uses a global constant to * (hopefully/in most cases) still function correctly, even if the * class would be renamed. * * @return void */ public static function register() { if (defined('REQUESTS_AUTOLOAD_REGISTERED') === false) { spl_autoload_register([self::class, 'load'], true); define('REQUESTS_AUTOLOAD_REGISTERED', true); } } /** * Autoloader. * * @param string $class_name Name of the class name to load. * * @return bool Whether a class was loaded or not. */ public static function load($class_name) { // Check that the class starts with "Requests" (PSR-0) or "WpOrg\Requests" (PSR-4). $psr_4_prefix_pos = strpos($class_name, 'WpOrg\\Requests\\'); if (stripos($class_name, 'Requests') !== 0 && $psr_4_prefix_pos !== 0) { return false; } $class_lower = strtolower($class_name); if ($class_lower === 'requests') { // Reference to the original PSR-0 Requests class. $file = dirname(__DIR__) . '/library/Requests.php'; } elseif ($psr_4_prefix_pos === 0) { // PSR-4 classname. $file = __DIR__ . '/' . strtr(substr($class_name, 15), '\\', '/') . '.php'; } if (isset($file) && file_exists($file)) { include $file; // nosemgrep : https://semgrep.dev/s/e5El return true; } /* * Okay, so the class starts with "Requests", but we couldn't find the file. * If this is one of the deprecated/renamed PSR-0 classes being requested, * let's alias it to the new name and throw a deprecation notice. */ if (isset(self::$deprecated_classes[$class_lower])) { /* * Integrators who cannot yet upgrade to the PSR-4 class names can silence deprecations * by defining a `REQUESTS_SILENCE_PSR0_DEPRECATIONS` constant and setting it to `true`. * The constant needs to be defined before the first deprecated class is requested * via this autoloader. */ if (!defined('REQUESTS_SILENCE_PSR0_DEPRECATIONS') || REQUESTS_SILENCE_PSR0_DEPRECATIONS !== true) { // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_trigger_error trigger_error( 'The PSR-0 `Requests_...` class names in the Request library are deprecated.' . ' Switch to the PSR-4 `WpOrg\Requests\...` class names at your earliest convenience.', E_USER_DEPRECATED ); // Prevent the deprecation notice from being thrown twice. if (!defined('REQUESTS_SILENCE_PSR0_DEPRECATIONS')) { define('REQUESTS_SILENCE_PSR0_DEPRECATIONS', true); } } // Create an alias and let the autoloader recursively kick in to load the PSR-4 class. return class_alias(self::$deprecated_classes[$class_lower], $class_name, true); } return false; } } } razorpay/libs/Requests-2.0.4/src/Session.php 0000644 00000021445 15002216177 0014550 0 ustar 00 <?php /** * Session handler for persistent requests and default parameters * * @package Requests\SessionHandler */ namespace WpOrg\Requests; use WpOrg\Requests\Cookie\Jar; use WpOrg\Requests\Exception\InvalidArgument; use WpOrg\Requests\Iri; use WpOrg\Requests\Requests; use WpOrg\Requests\Utility\InputValidator; /** * Session handler for persistent requests and default parameters * * Allows various options to be set as default values, and merges both the * options and URL properties together. A base URL can be set for all requests, * with all subrequests resolved from this. Base options can be set (including * a shared cookie jar), then overridden for individual requests. * * @package Requests\SessionHandler */ class Session { /** * Base URL for requests * * URLs will be made absolute using this as the base * * @var string|null */ public $url = null; /** * Base headers for requests * * @var array */ public $headers = []; /** * Base data for requests * * If both the base data and the per-request data are arrays, the data will * be merged before sending the request. * * @var array */ public $data = []; /** * Base options for requests * * The base options are merged with the per-request data for each request. * The only default option is a shared cookie jar between requests. * * Values here can also be set directly via properties on the Session * object, e.g. `$session->useragent = 'X';` * * @var array */ public $options = []; /** * Create a new session * * @param string|Stringable|null $url Base URL for requests * @param array $headers Default headers for requests * @param array $data Default data for requests * @param array $options Default options for requests * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $url argument is not a string, Stringable or null. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $headers argument is not an array. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $data argument is not an array. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array. */ public function __construct($url = null, $headers = [], $data = [], $options = []) { if ($url !== null && InputValidator::is_string_or_stringable($url) === false) { throw InvalidArgument::create(1, '$url', 'string|Stringable|null', gettype($url)); } if (is_array($headers) === false) { throw InvalidArgument::create(2, '$headers', 'array', gettype($headers)); } if (is_array($data) === false) { throw InvalidArgument::create(3, '$data', 'array', gettype($data)); } if (is_array($options) === false) { throw InvalidArgument::create(4, '$options', 'array', gettype($options)); } $this->url = $url; $this->headers = $headers; $this->data = $data; $this->options = $options; if (empty($this->options['cookies'])) { $this->options['cookies'] = new Jar(); } } /** * Get a property's value * * @param string $name Property name. * @return mixed|null Property value, null if none found */ public function __get($name) { if (isset($this->options[$name])) { return $this->options[$name]; } return null; } /** * Set a property's value * * @param string $name Property name. * @param mixed $value Property value */ public function __set($name, $value) { $this->options[$name] = $value; } /** * Remove a property's value * * @param string $name Property name. */ public function __isset($name) { return isset($this->options[$name]); } /** * Remove a property's value * * @param string $name Property name. */ public function __unset($name) { unset($this->options[$name]); } /**#@+ * @see \WpOrg\Requests\Session::request() * @param string $url * @param array $headers * @param array $options * @return \WpOrg\Requests\Response */ /** * Send a GET request */ public function get($url, $headers = [], $options = []) { return $this->request($url, $headers, null, Requests::GET, $options); } /** * Send a HEAD request */ public function head($url, $headers = [], $options = []) { return $this->request($url, $headers, null, Requests::HEAD, $options); } /** * Send a DELETE request */ public function delete($url, $headers = [], $options = []) { return $this->request($url, $headers, null, Requests::DELETE, $options); } /**#@-*/ /**#@+ * @see \WpOrg\Requests\Session::request() * @param string $url * @param array $headers * @param array $data * @param array $options * @return \WpOrg\Requests\Response */ /** * Send a POST request */ public function post($url, $headers = [], $data = [], $options = []) { return $this->request($url, $headers, $data, Requests::POST, $options); } /** * Send a PUT request */ public function put($url, $headers = [], $data = [], $options = []) { return $this->request($url, $headers, $data, Requests::PUT, $options); } /** * Send a PATCH request * * Note: Unlike {@see \WpOrg\Requests\Session::post()} and {@see \WpOrg\Requests\Session::put()}, * `$headers` is required, as the specification recommends that should send an ETag * * @link https://tools.ietf.org/html/rfc5789 */ public function patch($url, $headers, $data = [], $options = []) { return $this->request($url, $headers, $data, Requests::PATCH, $options); } /**#@-*/ /** * Main interface for HTTP requests * * This method initiates a request and sends it via a transport before * parsing. * * @see \WpOrg\Requests\Requests::request() * * @param string $url URL to request * @param array $headers Extra headers to send with the request * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests * @param string $type HTTP request type (use \WpOrg\Requests\Requests constants) * @param array $options Options for the request (see {@see \WpOrg\Requests\Requests::request()}) * @return \WpOrg\Requests\Response * * @throws \WpOrg\Requests\Exception On invalid URLs (`nonhttp`) */ public function request($url, $headers = [], $data = [], $type = Requests::GET, $options = []) { $request = $this->merge_request(compact('url', 'headers', 'data', 'options')); return Requests::request($request['url'], $request['headers'], $request['data'], $type, $request['options']); } /** * Send multiple HTTP requests simultaneously * * @see \WpOrg\Requests\Requests::request_multiple() * * @param array $requests Requests data (see {@see \WpOrg\Requests\Requests::request_multiple()}) * @param array $options Global and default options (see {@see \WpOrg\Requests\Requests::request()}) * @return array Responses (either \WpOrg\Requests\Response or a \WpOrg\Requests\Exception object) * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $requests argument is not an array or iterable object with array access. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array. */ public function request_multiple($requests, $options = []) { if (InputValidator::has_array_access($requests) === false || InputValidator::is_iterable($requests) === false) { throw InvalidArgument::create(1, '$requests', 'array|ArrayAccess&Traversable', gettype($requests)); } if (is_array($options) === false) { throw InvalidArgument::create(2, '$options', 'array', gettype($options)); } foreach ($requests as $key => $request) { $requests[$key] = $this->merge_request($request, false); } $options = array_merge($this->options, $options); // Disallow forcing the type, as that's a per request setting unset($options['type']); return Requests::request_multiple($requests, $options); } /** * Merge a request's data with the default data * * @param array $request Request data (same form as {@see \WpOrg\Requests\Session::request_multiple()}) * @param boolean $merge_options Should we merge options as well? * @return array Request data */ protected function merge_request($request, $merge_options = true) { if ($this->url !== null) { $request['url'] = Iri::absolutize($this->url, $request['url']); $request['url'] = $request['url']->uri; } if (empty($request['headers'])) { $request['headers'] = []; } $request['headers'] = array_merge($this->headers, $request['headers']); if (empty($request['data'])) { if (is_array($this->data)) { $request['data'] = $this->data; } } elseif (is_array($request['data']) && is_array($this->data)) { $request['data'] = array_merge($this->data, $request['data']); } if ($merge_options === true) { $request['options'] = array_merge($this->options, $request['options']); // Disallow forcing the type, as that's a per request setting unset($request['options']['type']); } return $request; } } razorpay/libs/Requests-2.0.4/src/Hooks.php 0000644 00000005552 15002216177 0014211 0 ustar 00 <?php /** * Handles adding and dispatching events * * @package Requests\EventDispatcher */ namespace WpOrg\Requests; use WpOrg\Requests\Exception\InvalidArgument; use WpOrg\Requests\HookManager; use WpOrg\Requests\Utility\InputValidator; /** * Handles adding and dispatching events * * @package Requests\EventDispatcher */ class Hooks implements HookManager { /** * Registered callbacks for each hook * * @var array */ protected $hooks = []; /** * Register a callback for a hook * * @param string $hook Hook name * @param callable $callback Function/method to call on event * @param int $priority Priority number. <0 is executed earlier, >0 is executed later * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $hook argument is not a string. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $callback argument is not callable. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $priority argument is not an integer. */ public function register($hook, $callback, $priority = 0) { if (is_string($hook) === false) { throw InvalidArgument::create(1, '$hook', 'string', gettype($hook)); } if (is_callable($callback) === false) { throw InvalidArgument::create(2, '$callback', 'callable', gettype($callback)); } if (InputValidator::is_numeric_array_key($priority) === false) { throw InvalidArgument::create(3, '$priority', 'integer', gettype($priority)); } if (!isset($this->hooks[$hook])) { $this->hooks[$hook] = [ $priority => [], ]; } elseif (!isset($this->hooks[$hook][$priority])) { $this->hooks[$hook][$priority] = []; } $this->hooks[$hook][$priority][] = $callback; } /** * Dispatch a message * * @param string $hook Hook name * @param array $parameters Parameters to pass to callbacks * @return boolean Successfulness * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $hook argument is not a string. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $parameters argument is not an array. */ public function dispatch($hook, $parameters = []) { if (is_string($hook) === false) { throw InvalidArgument::create(1, '$hook', 'string', gettype($hook)); } // Check strictly against array, as Array* objects don't work in combination with `call_user_func_array()`. if (is_array($parameters) === false) { throw InvalidArgument::create(2, '$parameters', 'array', gettype($parameters)); } if (empty($this->hooks[$hook])) { return false; } if (!empty($parameters)) { // Strip potential keys from the array to prevent them being interpreted as parameter names in PHP 8.0. $parameters = array_values($parameters); } ksort($this->hooks[$hook]); foreach ($this->hooks[$hook] as $priority => $hooked) { foreach ($hooked as $callback) { $callback(...$parameters); } } return true; } } razorpay/libs/Requests-2.0.4/CHANGELOG.md 0000644 00000143052 15002216177 0013435 0 ustar 00 Changelog ========= 2.0.4 ----- ### Overview of changes - Update bundled certificates as of 2022-07-19. [#763] [#763]: https://github.com/WordPress/Requests/pull/763 2.0.3 ----- ### Overview of changes - Update bundled certificates as of 2022-04-26. [#731] [#731]: https://github.com/WordPress/Requests/pull/731 2.0.2 ----- ### Overview of changes - Update bundled certificates as of 2022-03-18. [#697] [#697]: https://github.com/WordPress/Requests/pull/697 2.0.1 ----- ### Overview of changes - Update bundled certificates as of 2022-02-01. [#670] - Bug fix: Hook priority should be respected. [#452], [#647] - Docs: the Hook documentation has been updated to reflect the current available hooks. [#646] - General housekeeping. [#635], [#649], [#650], [#653], [#655], [#658], [#660], [#661], [#662], [#669], [#671], [#672], [#674] Props [@alpipego][gh-alpipego], [@costdev][gh-costdev], [@jegrandet][gh-jegrandet] [@jrfnl][gh-jrfnl], [@schlessera][gh-schlessera] [#674]: https://github.com/WordPress/Requests/pull/674 [#672]: https://github.com/WordPress/Requests/pull/672 [#671]: https://github.com/WordPress/Requests/pull/671 [#670]: https://github.com/WordPress/Requests/pull/670 [#669]: https://github.com/WordPress/Requests/pull/669 [#662]: https://github.com/WordPress/Requests/pull/662 [#661]: https://github.com/WordPress/Requests/pull/661 [#660]: https://github.com/WordPress/Requests/pull/660 [#658]: https://github.com/WordPress/Requests/pull/658 [#655]: https://github.com/WordPress/Requests/pull/655 [#653]: https://github.com/WordPress/Requests/pull/653 [#650]: https://github.com/WordPress/Requests/pull/650 [#649]: https://github.com/WordPress/Requests/pull/649 [#647]: https://github.com/WordPress/Requests/pull/647 [#646]: https://github.com/WordPress/Requests/pull/646 [#635]: https://github.com/WordPress/Requests/issues/635 [#452]: https://github.com/WordPress/Requests/issues/452 2.0.0 ----- ### BREAKING CHANGES As Requests 2.0.0 is a major release, this version contains breaking changes. There is an [upgrade guide](https://requests.ryanmccue.info/docs/upgrading.html) available to guide you through making the necessary changes in your own code. ### Overview of changes - **New minimum PHP version** Support for PHP 5.2 - 5.5 has been dropped. The new minimum supported PHP version is now 5.6. Support for HHVM has also been dropped formally now. (props [@datagutten][gh-datagutten], [@jrfnl][gh-jrfnl], [@schlessera][gh-schlessera], [#378][gh-378], [#470][gh-470], [#509][gh-509]) - **New release branch name** The stable version of Requests can be found in the `stable` branch (was `master`). Development of Requests happens in the `develop` branch. (props [@jrfnl][gh-jrfnl], [@schlessera][gh-schlessera], [#463][gh-463], [#490][gh-490]) - **All code is now namespaced (PSR-4)** The code within the Requests library has all been namespaced and now lives in the `WpOrg\Requests` namespace. The namespaced classes can be found in the `src` directory. The old `library` directory and the files within are deprecated. For a number of classes, some subtle changes have also been made to their base class name, like renaming the `Hooker` interface to `HookManager`. A full backward-compatibility layer is available and using the non-namespaced class names will still work during the 2.x and 3.x release cycles, though a deprecation notice will be thrown the first time a class using one of the old PSR-0 based class names is requested. For the lifetime of Requests 2.x, the deprecation notices can be disabled by defining a global `REQUESTS_SILENCE_PSR0_DEPRECATIONS` constant and setting the value of this constant to `true`. A complete "translation table" between the Requests 1.x and 2.x class names is available in the [upgrade guide](https://requests.ryanmccue.info/docs/upgrading.html). Users of the Requests native custom autoloader will need to adjust their code to initialize the autoloader: ```php // OLD: Using the custom autoloader in Requests 1.x. require_once 'path/to/Requests/library/Requests.php'; Requests::register_autoloader(); // NEW: Using the custom autoloader in Requests 2.x. require_once 'path/to/Requests/src/Autoload.php'; WpOrg\Requests\Autoload::register(); ``` (props [@jrfnl][gh-jrfnl], [@schlessera][gh-schlessera], [#503][gh-503], [#519][gh-519], [#586][gh-586], [#587][gh-587], [#594][gh-594]) - **A large number of classes have been marked as `final`** Marking a class as `final` prohibits extending it. These changes were made after researching which classes were being extended in userland code and due diligence has been applied before making these changes. If this change is causing a problem we didn't anticipate, please [open an issue to report it](https://github.com/WordPress/Requests/issues/new/choose). (props [@jrfnl][gh-jrfnl], [@schlessera][gh-schlessera], [#514][gh-514], [#534][gh-534]) - **Input validation** All typical entry point methods in Requests will now, directly or indirectly, validate the received input parameters for being of the correct type. When an incorrect parameter type is received, a catchable `WpOrg\Requests\Exception\InvalidArgument` exception will be thrown. The input validation has been set up to be reasonably liberal, so if Requests was being used as per the documentation, this change should not affect you. If you still find the input validation to be too strict and you have a good use-case of why it should be loosened for a particular entry point, please [open an issue to discuss this](https://github.com/WordPress/Requests/issues/new/choose). The code within Requests itself has also received various improvements to be more type safe. (props [@jrfnl][gh-jrfnl], [@schlessera][gh-schlessera], [#499][gh-499], [#542][gh-542], [#547][gh-547], [#558][gh-558], [#572][gh-572], [#573][gh-573], [#574][gh-574], [#591][gh-591], [#592][gh-592], [#593][gh-593], [#601][gh-601], [#602][gh-602], [#603][gh-603], [#604][gh-604], [#605][gh-605], [#609][gh-609], [#610][gh-610], [#611][gh-611], [#613][gh-613], [#614][gh-614], [#615][gh-615], [#620][gh-620], [#621][gh-621], [#629][gh-629]) - **Update bundled certificates** The bundled certificates were updated with the latest version available (published 2021-10-26). Previously the bundled certificates in Requests would include a small subset of expired certificates for legacy reasons. This is no longer the case as of Requests 2.0.0. > :warning: **Note**: the included certificates bundle is only intended as a fallback. > > This fallback should only be used for servers that are not properly configured for SSL verification. A continuously managed server should provide a more up-to-date certificate authority list than a software library which only gets updates once in a while. > > Setting the `$options['verify']` key to `true` when initiating a request enables certificate verification using the certificate authority list provided by the server environment, which is recommended. The [documentation regarding Secure Requests with SSL](https://requests.ryanmccue.info/docs/usage-advanced.html#secure-requests-with-ssl) has also been updated to reflect this and it is recommended to have a read through. The included certificates _file_ has now also been moved to a dedicated `/certificates` directory off the project root. (props [@jrfnl][gh-jrfnl], [@schlessera][gh-schlessera], [@wojsmol][gh-wojsmol], [@ZsgsDesign][gh-ZsgsDesign], [#535][gh-535], [#571][gh-571], [#577][gh-577], [#622][gh-622], [#632][gh-632]) - **New functionality** The following new functionality has been added: - A `public static` `WpOrg\Requests\Requests::has_capabilities($capabilities = array())` method is now available to check whether there is a transport available which supports the requested capabilities. - A `public` `WpOrg\Requests\Response::decode_body($associative = true, $depth = 512, $options = 0)` method is now available to handle JSON-decoding a response body. The method parameters correspond to the parameters of the PHP native [`json_decode()`](https://php.net/json-decode) function. The method will throw an `WpOrg\Requests\Exception` when the response body is not valid JSON. - A `WpOrg\Requests\Capability` interface. This interface provides constants for the known capabilities. Transports can be tested whether or not they support these capabilities. Currently, the only capability supported is `Capability::SSL`. - A `WpOrg\Requests\Port` class. This class encapsulates typical port numbers as constants and offers a `static` `Port::get($type)` method to retrieve a port number based on a request type. Using this class when referring to port numbers is recommended. - An `WpOrg\Requests\Exceptions\InvalidArgument` class. This class is intended for internal use only. - An `WpOrg\Requests\Utility\InputValidator` class with helper methods for input validation. This class is intended for internal use only. (props [@ccrims0n][gh-ccrims0n], [@dd32][gh-dd32], [@jrfnl][gh-jrfnl], [@schlessera][gh-schlessera], [#167][gh-167], [#214][gh-214], [#250][gh-250], [#251][gh-251], [#492][gh-492], [#499][gh-499], [#538][gh-538], [#542][gh-542], [#547][gh-547], [#559][gh-559]) - **Changed functionality** - The `WpOrg\Requests\Requests::decompress()` method has been fixed to recognize more compression levels and handle these correctly. - The method signature of the `WpOrg\Requests\Transport::test()` interface method has been adjusted to enforce support for an optional `$capabilities` parameter. The Request native `WpOrg\Requests\Transport\Curl::test()` and `WpOrg\Requests\Transport\Fsockopen::test()` methods both already supported this parameter. - The `WpOrg\Requests\Transport\Curl::request()` and the `WpOrg\Requests\Transport\Fsockopen::request()` methods will now throw an `WpOrg\Requests\Exception` when the `$options['filename']` contains an invalid path. - The `WpOrg\Requests\Transport\Curl::request()` method will no longer set the `CURLOPT_REFERER` option. - The default value of the `$key` parameter in the `WpOrg\Requests\Cookie\Jar::normalize_cookie()` method has been changed from `null` to an empty string. (props [@datagutten][gh-datagutten], [@dustinrue][gh-dustinrue], [@jrfnl][gh-jrfnl], [@schlessera][gh-schlessera], [@soulseekah][gh-soulseekah], [@twdnhfr][gh-twdnhfr], [#301][gh-301], [#309][gh-309], [#379][gh-379], [#444][gh-444], [#492][gh-492], [#610][gh-610]) - **Removed functionality** The following methods, which were deprecated during the 1.x cycle, have now been removed: - `Requests::flattern()`, use `WpOrg\Requests\Requests::flatten()` instead. - `Requests_Cookie::formatForHeader()`, use `WpOrg\Requests\Cookie::format_for_header()` instead. - `Requests_Cookie::formatForSetCookie()`, use `WpOrg\Requests\Cookie::format_for_set_cookie()` instead. - `Requests_Cookie::parseFromHeaders()`, use `WpOrg\Requests\Cookie::parse_from_headers()` instead. - `Requests_Cookie_Jar::normalizeCookie()`, use `WpOrg\Requests\Cookie\Jar::normalize_cookie()` instead A duplicate method has been removed: - `Requests::match_domain()`, use `WpOrg\Requests\Ssl::match_domain()` instead. A redundant method has been removed: - `Hooks::__construct()`. (props [@jrfnl][gh-jrfnl], [@schlessera][gh-schlessera], [#510][gh-510], [#525][gh-525], [#617][gh-617]) - **Compatibility with PHP 8.0 named parameters** All parameter names have been reviewed to prevent issues for users using PHP 8.0 named parameters and where relevant, a number of parameter names have been changed. After this release, a parameter name rename will be treated as a breaking change (reserved for major releases) and will be marked as such in the changelog. (props [@jrfnl][gh-jrfnl], [@schlessera][gh-schlessera], [#533][gh-533], [#560][gh-560], [#561][gh-561], [#599][gh-599], [#612][gh-612]) - **PHP 8.1 compatibility** All known PHP 8.1 compatibility issues have been fixed and tests are now running (and passing) against PHP 8.1. In case you still run into a PHP 8.1 deprecation notice or other PHP 8.1 related issue, please [open an issue to report it](https://github.com/WordPress/Requests/issues/new/choose). (props [@jrfnl][gh-jrfnl], [@schlessera][gh-schlessera], [#498][gh-498], [#499][gh-499], [#500][gh-500], [#501][gh-501], [#505][gh-505], [#634][gh-634]) - **Updated documentation** The [documentation website](https://requests.ryanmccue.info/) has been updated to reflect all the changes in Requests 2.0.0. The [API documentation for Requests 2.x](https://requests.ryanmccue.info/api-2.x/) is now generated using [phpDocumentor](https://www.phpdoc.org/) :heart: and available on the website. For the time being, the [Requests 1.x API documentation](https://requests.ryanmccue.info/api/) will still be available on the website as well. (props [@costdev][gh-costdev], [@jrfnl][gh-jrfnl], [@schlessera][gh-schlessera], [@szepeviktor][gh-szepeviktor], [#476][gh-476], [#480][gh-480], [#489][gh-489], [#495][gh-495], [#526][gh-526], [#528][gh-528], [#532][gh-532], [#543][gh-543], [#562][gh-562], [#578][gh-578], [#590][gh-590], [#606][gh-606], [#607][gh-607], [#608][gh-608], [#618][gh-618], [#622][gh-622], [#625][gh-625], [#626][gh-626], [#630][gh-630], [#642][gh-642]) - **General housekeeping** - In a number of places, code modernizations, possible now the minimum PHP version has gone up to PHP 5.6, have been applied. ([#504][gh-504], [#506][gh-506], [#512][gh-512], [#539][gh-539], [#541][gh-541], [#599][gh-599], [#623][gh-623]) - Lots of improvements were made to render the tests more reliable and increase the coverage. ([#446][gh-446], [#459][gh-459], [#472][gh-472], [#503][gh-503], [#508][gh-508], [#511][gh-511], [#520][gh-520], [#521][gh-521], [#548][gh-548], [#549][gh-549], [#550][gh-550], [#551][gh-551], [#552][gh-552], [#553][gh-553], [#554][gh-554], [#555][gh-555], [#556][gh-556], [#557][gh-557], [#558][gh-558], [#566][gh-566], [#581][gh-581], [#591][gh-591], [#595][gh-595], [#640][gh-640]) - The move for all CI to GitHub Actions has been finalized. Travis is dead, long live Travis and thanks for all the fish. ([#447][gh-447], [#575][gh-575], [#579][gh-579]) - A GitHub Actions workflow has been put in place to allow for automatically updating the website on releases. This should allow for more rapid releases from now on. ([#466][gh-466], [#544][gh-544], [#545][gh-545], [#563][gh-563], [#569][gh-569], [#583][gh-583], [#626][gh-626]) - Development-only dependencies have been updated. ([#516][gh-516], [#517][gh-517]) - Various other general housekeeping and improvements for contributors. ([#488][gh-488], [#491][gh-491], [#523][gh-523], [#513][gh-513], [#515][gh-515], [#522][gh-522], [#524][gh-524], [#531][gh-531], [#535][gh-535], [#536][gh-536], [#537][gh-537], [#540][gh-540], [#588][gh-588], [#616][gh-616]) (props [@jrfnl][gh-jrfnl], [@schlessera][gh-schlessera]) [gh-642]: https://github.com/WordPress/Requests/pull/642 [gh-640]: https://github.com/WordPress/Requests/pull/640 [gh-634]: https://github.com/WordPress/Requests/pull/634 [gh-632]: https://github.com/WordPress/Requests/pull/632 [gh-630]: https://github.com/WordPress/Requests/pull/630 [gh-629]: https://github.com/WordPress/Requests/pull/629 [gh-626]: https://github.com/WordPress/Requests/pull/626 [gh-625]: https://github.com/WordPress/Requests/pull/625 [gh-623]: https://github.com/WordPress/Requests/pull/623 [gh-622]: https://github.com/WordPress/Requests/pull/622 [gh-621]: https://github.com/WordPress/Requests/pull/621 [gh-620]: https://github.com/WordPress/Requests/pull/620 [gh-618]: https://github.com/WordPress/Requests/pull/618 [gh-617]: https://github.com/WordPress/Requests/pull/617 [gh-616]: https://github.com/WordPress/Requests/pull/616 [gh-615]: https://github.com/WordPress/Requests/pull/615 [gh-614]: https://github.com/WordPress/Requests/pull/614 [gh-613]: https://github.com/WordPress/Requests/pull/613 [gh-612]: https://github.com/WordPress/Requests/pull/612 [gh-611]: https://github.com/WordPress/Requests/pull/611 [gh-610]: https://github.com/WordPress/Requests/pull/610 [gh-609]: https://github.com/WordPress/Requests/pull/609 [gh-608]: https://github.com/WordPress/Requests/pull/608 [gh-607]: https://github.com/WordPress/Requests/pull/607 [gh-606]: https://github.com/WordPress/Requests/pull/606 [gh-605]: https://github.com/WordPress/Requests/pull/605 [gh-604]: https://github.com/WordPress/Requests/pull/604 [gh-603]: https://github.com/WordPress/Requests/pull/603 [gh-602]: https://github.com/WordPress/Requests/pull/602 [gh-601]: https://github.com/WordPress/Requests/pull/601 [gh-599]: https://github.com/WordPress/Requests/pull/599 [gh-595]: https://github.com/WordPress/Requests/pull/595 [gh-594]: https://github.com/WordPress/Requests/pull/594 [gh-593]: https://github.com/WordPress/Requests/issues/593 [gh-592]: https://github.com/WordPress/Requests/pull/592 [gh-591]: https://github.com/WordPress/Requests/pull/591 [gh-590]: https://github.com/WordPress/Requests/issues/590 [gh-588]: https://github.com/WordPress/Requests/pull/588 [gh-587]: https://github.com/WordPress/Requests/pull/587 [gh-586]: https://github.com/WordPress/Requests/pull/586 [gh-583]: https://github.com/WordPress/Requests/pull/583 [gh-581]: https://github.com/WordPress/Requests/pull/581 [gh-579]: https://github.com/WordPress/Requests/pull/579 [gh-578]: https://github.com/WordPress/Requests/pull/578 [gh-577]: https://github.com/WordPress/Requests/pull/577 [gh-575]: https://github.com/WordPress/Requests/pull/575 [gh-574]: https://github.com/WordPress/Requests/pull/574 [gh-573]: https://github.com/WordPress/Requests/pull/573 [gh-572]: https://github.com/WordPress/Requests/pull/572 [gh-571]: https://github.com/WordPress/Requests/pull/571 [gh-569]: https://github.com/WordPress/Requests/pull/569 [gh-566]: https://github.com/WordPress/Requests/pull/566 [gh-563]: https://github.com/WordPress/Requests/pull/563 [gh-562]: https://github.com/WordPress/Requests/pull/562 [gh-561]: https://github.com/WordPress/Requests/pull/561 [gh-560]: https://github.com/WordPress/Requests/pull/560 [gh-559]: https://github.com/WordPress/Requests/pull/559 [gh-558]: https://github.com/WordPress/Requests/pull/558 [gh-557]: https://github.com/WordPress/Requests/pull/557 [gh-556]: https://github.com/WordPress/Requests/pull/556 [gh-555]: https://github.com/WordPress/Requests/pull/555 [gh-554]: https://github.com/WordPress/Requests/pull/554 [gh-553]: https://github.com/WordPress/Requests/pull/553 [gh-552]: https://github.com/WordPress/Requests/pull/552 [gh-551]: https://github.com/WordPress/Requests/pull/551 [gh-550]: https://github.com/WordPress/Requests/pull/550 [gh-549]: https://github.com/WordPress/Requests/pull/549 [gh-548]: https://github.com/WordPress/Requests/pull/548 [gh-547]: https://github.com/WordPress/Requests/pull/547 [gh-545]: https://github.com/WordPress/Requests/pull/545 [gh-544]: https://github.com/WordPress/Requests/pull/544 [gh-543]: https://github.com/WordPress/Requests/pull/543 [gh-542]: https://github.com/WordPress/Requests/pull/542 [gh-541]: https://github.com/WordPress/Requests/pull/541 [gh-540]: https://github.com/WordPress/Requests/pull/540 [gh-539]: https://github.com/WordPress/Requests/pull/539 [gh-538]: https://github.com/WordPress/Requests/pull/538 [gh-537]: https://github.com/WordPress/Requests/pull/537 [gh-536]: https://github.com/WordPress/Requests/pull/536 [gh-535]: https://github.com/WordPress/Requests/pull/535 [gh-534]: https://github.com/WordPress/Requests/pull/534 [gh-533]: https://github.com/WordPress/Requests/issues/533 [gh-532]: https://github.com/WordPress/Requests/pull/532 [gh-531]: https://github.com/WordPress/Requests/pull/531 [gh-528]: https://github.com/WordPress/Requests/pull/528 [gh-526]: https://github.com/WordPress/Requests/pull/526 [gh-525]: https://github.com/WordPress/Requests/pull/525 [gh-524]: https://github.com/WordPress/Requests/pull/524 [gh-523]: https://github.com/WordPress/Requests/pull/523 [gh-522]: https://github.com/WordPress/Requests/pull/522 [gh-521]: https://github.com/WordPress/Requests/pull/521 [gh-520]: https://github.com/WordPress/Requests/pull/520 [gh-519]: https://github.com/WordPress/Requests/pull/519 [gh-517]: https://github.com/WordPress/Requests/pull/517 [gh-516]: https://github.com/WordPress/Requests/pull/516 [gh-515]: https://github.com/WordPress/Requests/issues/515 [gh-514]: https://github.com/WordPress/Requests/issues/514 [gh-513]: https://github.com/WordPress/Requests/issues/513 [gh-512]: https://github.com/WordPress/Requests/issues/512 [gh-511]: https://github.com/WordPress/Requests/pull/511 [gh-510]: https://github.com/WordPress/Requests/pull/510 [gh-509]: https://github.com/WordPress/Requests/pull/509 [gh-508]: https://github.com/WordPress/Requests/pull/508 [gh-506]: https://github.com/WordPress/Requests/pull/506 [gh-505]: https://github.com/WordPress/Requests/pull/505 [gh-504]: https://github.com/WordPress/Requests/pull/504 [gh-503]: https://github.com/WordPress/Requests/pull/503 [gh-501]: https://github.com/WordPress/Requests/pull/501 [gh-500]: https://github.com/WordPress/Requests/pull/500 [gh-499]: https://github.com/WordPress/Requests/pull/499 [gh-498]: https://github.com/WordPress/Requests/issues/498 [gh-498]: https://github.com/WordPress/Requests/issues/495 [gh-492]: https://github.com/WordPress/Requests/pull/492 [gh-491]: https://github.com/WordPress/Requests/pull/491 [gh-490]: https://github.com/WordPress/Requests/pull/490 [gh-489]: https://github.com/WordPress/Requests/pull/489 [gh-488]: https://github.com/WordPress/Requests/pull/488 [gh-480]: https://github.com/WordPress/Requests/issues/480 [gh-476]: https://github.com/WordPress/Requests/issues/476 [gh-472]: https://github.com/WordPress/Requests/issues/472 [gh-470]: https://github.com/WordPress/Requests/pull/470 [gh-466]: https://github.com/WordPress/Requests/issues/466 [gh-463]: https://github.com/WordPress/Requests/issues/463 [gh-460]: https://github.com/WordPress/Requests/issues/460 [gh-459]: https://github.com/WordPress/Requests/issues/459 [gh-447]: https://github.com/WordPress/Requests/pull/447 [gh-446]: https://github.com/WordPress/Requests/pull/446 [gh-444]: https://github.com/WordPress/Requests/pull/444 [gh-379]: https://github.com/WordPress/Requests/pull/379 [gh-378]: https://github.com/WordPress/Requests/issues/378 [gh-309]: https://github.com/WordPress/Requests/pull/309 [gh-301]: https://github.com/WordPress/Requests/issues/301 [gh-251]: https://github.com/WordPress/Requests/pull/251 [gh-250]: https://github.com/WordPress/Requests/issues/250 [gh-214]: https://github.com/WordPress/Requests/pull/214 [gh-167]: https://github.com/WordPress/Requests/issues/167 1.8.1 ----- ### Overview of changes - The `Requests::VERSION` constant has been updated to reflect the actual version for the release. [@jrfnl][gh-jrfnl], [#485][gh-485] - Update the `.gitattributes` file to include fewer files in the distribution. [@mbabker][gh-mbabker], [#484][gh-484] - Added a release checklist. [@jrfnl][gh-jrfnl], [#483][gh-483] - Various minor updates to the documentation and the website. [@jrfnl][gh-jrfnl], [@schlessera][gh-schlessera], [#477][gh-477], [#478][gh-478], [#479][gh-479], [#481][gh-481], [#482][gh-482] [gh-477]: https://github.com/WordPress/Requests/issues/477 [gh-478]: https://github.com/WordPress/Requests/issues/478 [gh-479]: https://github.com/WordPress/Requests/issues/479 [gh-481]: https://github.com/WordPress/Requests/issues/481 [gh-482]: https://github.com/WordPress/Requests/issues/482 [gh-483]: https://github.com/WordPress/Requests/issues/483 [gh-484]: https://github.com/WordPress/Requests/issues/484 [gh-485]: https://github.com/WordPress/Requests/issues/485 1.8.0 ----- ### IMPORTANT NOTES #### Last release supporting PHP 5.2 - 5.5 Release 1.8.0 will be the last release with compatibility for PHP 5.2 - 5.5. With the next release (v2.0.0), the minimum PHP version will be bumped to 5.6. #### Last release supporting PEAR distribution Release 1.8.0 will be the last release to be distributed via PEAR. From release 2.0.0 onwards, consumers of this library will have to switch to Composer to receive updates. ### Overview of changes - **[SECURITY FIX] Disable deserialization in `FilteredIterator`** A `Deserialization of Untrusted Data` weakness was found in the `FilteredIterator` class. This security vulnerability was first reported to the WordPress project. The security fix applied to WordPress has been ported back into the library. GitHub security advisory: [Insecure Deserialization of untrusted data](https://github.com/WordPress/Requests/security/advisories/GHSA-52qp-jpq7-6c54) CVE: [CVE-2021-29476 - Deserialization of Untrusted Data](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2021-29476) Related WordPress CVE: [https://cve.mitre.org/cgi-bin/cvename.cgi?name=2020-28032](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2020-28032) (props [@dd32][gh-dd32], [@desrosj][gh-desrosj], [@jrfnl][gh-jrfnl], [@peterwilsoncc][gh-peterwilsoncc], [@SergeyBiryukov][gh-SergeyBiryukov], [@whyisjake][gh-whyisjake], [@xknown][gh-xknown], [#421][gh-421], [#422][gh-422]) - **Repository moved to `WordPress\Requests`** The `Requests` library has been moved to the WordPress GitHub organization and can now be found under `https://github.com/WordPress/Requests`. All links in code and documentation were updated accordingly. Note: the Composer package name remains unchanged ([`rmccue/requests`](https://packagist.org/packages/rmccue/requests)), as well as the documentation site ([requests.ryanmccue.info](https://requests.ryanmccue.info/)). (props [@dd32][gh-dd32], [@JustinyAhin][gh-JustinyAhin], [@jrfnl][gh-jrfnl], [@rmccue][gh-rmccue], [#440][gh-440], [#441][gh-441], [#448][gh-448]) - **Manage `"Expect"` header with `cURL` transport** By default, `cURL` adds a `Expect: 100-Continue` header to certain requests. This can add as much as a second delay to requests done using `cURL`. This is [discussed on the cURL mailing list](https://curl.se/mail/lib-2017-07/0013.html). To prevent this, `Requests` now adds an empty `"Expect"` header to requests that are smaller than 1 MB and use HTTP/1.1. (props [@carlalexander][gh-carlalexander], [@schlessera][gh-schlessera], [@TimothyBJacobs][gh-TimothyBJacobs], [#453][gh-453], [#454][gh-454], [#469][gh-469]) - **Update bundled certificates as of 2021-02-12** The bundled certificates were updated. A small subset of expired certificates are still included for legacy reasons (and support). (props [@ozh][gh-ozh], [@patmead][gh-patmead], [@schlessera][gh-schlessera], [@todeveni][gh-todeveni], [#385][gh-385], [#398][gh-398], [#451][gh-451]) - **Add required `Content-*` headers for empty `POST` requests** Sends the `Content-Length` and `Content-Type` headers even for empty `POST` requests, as the length is expected as per [RFC2616 Section 14.13](https://tools.ietf.org/html/rfc2616#section-14.13): ``` Content-Length header "SHOULD" be included. In practice, it is not used for GET nor HEAD requests, but is expected for POST requests. ``` (props [@dd32][gh-dd32], [@gstrauss][gh-gstrauss], [@jrfnl][gh-jrfnl], [@soulseekah][gh-soulseekah], [#248][gh-248], [#249][gh-249], [#318][gh-318], [#368][gh-368]) - **Ignore locale when creating the HTTP version string from a float** The previous behavior allowed for the locale to mess up the float to string conversion resulting in a `GET / HTTP/1,1` instead of `GET / HTTP/1.1` request. (props [@tonebender][gh-tonebender], [@Zegnat][gh-Zegnat], [#335][gh-335], [#339][gh-339]) - **Make `verify => false` work with `fsockopen`** This allows the `fsockopen` transport now to ignore SSL failures when requested. (props [@soulseekah][gh-soulseekah], [#310][gh-310], [#311][gh-311]) - **Only include port number in the `Host` header if it differs from the default** The code was not violating the RFC per se, but also not following standard practice of leaving the port off when it is the default port for the scheme, which could lead to connectivity issues. (props [@amandato][gh-amandato], [@dd32][gh-dd32], [#238][gh-238]) - **Fix PHP cross-version compatibility** Important fixes have been made to improve cross-version compatibility of the code across all supported PHP versions. - Use documented order for `implode()` arguments. - Harden type handling when no domain was passed. - Explicitly cast `$url` property to `string` in `Requests::parse_response()`. - Initialize `$body` property to an empty string in `Requests::parse_response()`. - Ensure the stream handle is valid before trying to close it. - Ensure the `$callback` in the `FilteredIterator` is callable before calling it. (props [@aaronjorbin][gh-aaronjorbin], [@jrfnl][gh-jrfnl], [#346][gh-346], [#370][gh-370], [#425][gh-425], [#426][gh-426], [#456][gh-456], [#457][gh-457]) - **Improve testing** Lots of improvements were made to render the tests more reliable and increase the coverage. And to top it all off, all tests are now run against all supported PHP versions, including PHP 8.0. (props [@datagutten][gh-datagutten], [@jrfnl][gh-jrfnl], [@schlessera][gh-schlessera], [#345][gh-345], [#351][gh-351], [#355][gh-355], [#366][gh-366], [#412][gh-412], [#414][gh-414], [#445][gh-445], [#458][gh-458], [#464][gh-464]) - **Improve code quality and style** A whole swoop of changes has been made to harden the code and make it more consistent. The code style has been made consistent across both code and tests and is now enforced via a custom PHPCS rule set. The WordPress Coding Standards were chosen as the basis for the code style checks as most contributors to this library originate from the WordPress community and will be familiar with this code style. Main differences from the WordPress Coding Standards based on discussions and an analysis of the code styles already in use: - No whitespace on the inside of parentheses. - No Yoda conditions. A more detailed overview of the decisions that went into the final code style rules can be found at [#434][gh-434]. (props [@jrfnl][gh-jrfnl], [@KasperFranz][gh-KasperFranz], [@ozh][gh-ozh], [@schlessera][gh-schlessera], [@TysonAndre][gh-TysonAndre], [#263][gh-263], [#296][gh-296], [#328][gh-328], [#358][gh-358], [#359][gh-359], [#360][gh-360], [#361][gh-361], [#362][gh-362], [#363][gh-363], [#364][gh-364], [#386][gh-386], [#396][gh-396], [#399][gh-399], [#400][gh-400], [#401][gh-401], [#402][gh-402], [#403][gh-403], [#404][gh-404], [#405][gh-405], [#406][gh-406], [#408][gh-408], [#409][gh-409], [#410][gh-410], [#411][gh-411], [#413][gh-413], [#415][gh-415], [#416][gh-416], [#417][gh-417], [#423][gh-423], [#424][gh-424], [#434][gh-434]) - **Replace Travis CI with GitHub Actions (partial)** The entire CI setup is gradually being moved from Travis CI to GitHub Actions. At this point, GitHub Actions takes over the CI from PHP 5.5 onwards, leaving Travis CI as a fallback for lower PHP versions. This move will be completed after the planned minimum version bump to PHP 5.6+ with the next release, at which point we will get rid of all the remaining Travis CI integrations. (props [@dd32][gh-dd32], [@desrosj][gh-desrosj], [@jrfnl][gh-jrfnl], [@ntwb][gh-ntwb], [@ozh][gh-ozh], [@schlessera][gh-schlessera], [@TimothyBJacobs][gh-TimothyBJacobs], [@TysonAndre][gh-TysonAndre], [#280][gh-280], [#298][gh-298], [#302][gh-302], [#303][gh-303], [#352][gh-352], [#353][gh-353], [#354][gh-354], [#356][gh-356], [#388][gh-388], [#397][gh-397], [#428][gh-428], [#436][gh-436], [#439][gh-439], [#461][gh-461], [#467][gh-467]) - **Update and improve documentation** - Use clearer and more inclusive language. - Update the GitHub Pages site. - Update content and various tweaks to the markdown. - Fix code blocks in `README.md` file. - Add pagination to documentation pages. (props [@desrosj][gh-desrosj], [@jrfnl][gh-jrfnl], [@JustinyAhin][gh-JustinyAhin], [@tnorthcutt][gh-tnorthcutt], [#334][gh-334], [#367][gh-367], [#387][gh-387], [#443][gh-443], [#462][gh-462], [#465][gh-465], [#468][gh-468], [#471][gh-471] ) [gh-194]: https://github.com/WordPress/Requests/issues/194 [gh-238]: https://github.com/WordPress/Requests/issues/238 [gh-248]: https://github.com/WordPress/Requests/issues/248 [gh-249]: https://github.com/WordPress/Requests/issues/249 [gh-263]: https://github.com/WordPress/Requests/issues/263 [gh-280]: https://github.com/WordPress/Requests/issues/280 [gh-296]: https://github.com/WordPress/Requests/issues/296 [gh-298]: https://github.com/WordPress/Requests/issues/298 [gh-302]: https://github.com/WordPress/Requests/issues/302 [gh-303]: https://github.com/WordPress/Requests/issues/303 [gh-310]: https://github.com/WordPress/Requests/issues/310 [gh-311]: https://github.com/WordPress/Requests/issues/311 [gh-318]: https://github.com/WordPress/Requests/issues/318 [gh-328]: https://github.com/WordPress/Requests/issues/328 [gh-334]: https://github.com/WordPress/Requests/issues/334 [gh-335]: https://github.com/WordPress/Requests/issues/335 [gh-339]: https://github.com/WordPress/Requests/issues/339 [gh-345]: https://github.com/WordPress/Requests/issues/345 [gh-346]: https://github.com/WordPress/Requests/issues/346 [gh-351]: https://github.com/WordPress/Requests/issues/351 [gh-352]: https://github.com/WordPress/Requests/issues/352 [gh-353]: https://github.com/WordPress/Requests/issues/353 [gh-354]: https://github.com/WordPress/Requests/issues/354 [gh-355]: https://github.com/WordPress/Requests/issues/355 [gh-356]: https://github.com/WordPress/Requests/issues/356 [gh-358]: https://github.com/WordPress/Requests/issues/358 [gh-359]: https://github.com/WordPress/Requests/issues/359 [gh-360]: https://github.com/WordPress/Requests/issues/360 [gh-361]: https://github.com/WordPress/Requests/issues/361 [gh-362]: https://github.com/WordPress/Requests/issues/362 [gh-363]: https://github.com/WordPress/Requests/issues/363 [gh-364]: https://github.com/WordPress/Requests/issues/364 [gh-366]: https://github.com/WordPress/Requests/issues/366 [gh-367]: https://github.com/WordPress/Requests/issues/367 [gh-367]: https://github.com/WordPress/Requests/issues/367 [gh-368]: https://github.com/WordPress/Requests/issues/368 [gh-370]: https://github.com/WordPress/Requests/issues/370 [gh-385]: https://github.com/WordPress/Requests/issues/385 [gh-386]: https://github.com/WordPress/Requests/issues/386 [gh-387]: https://github.com/WordPress/Requests/issues/387 [gh-388]: https://github.com/WordPress/Requests/issues/388 [gh-396]: https://github.com/WordPress/Requests/issues/396 [gh-397]: https://github.com/WordPress/Requests/issues/397 [gh-398]: https://github.com/WordPress/Requests/issues/398 [gh-399]: https://github.com/WordPress/Requests/issues/399 [gh-400]: https://github.com/WordPress/Requests/issues/400 [gh-401]: https://github.com/WordPress/Requests/issues/401 [gh-402]: https://github.com/WordPress/Requests/issues/402 [gh-403]: https://github.com/WordPress/Requests/issues/403 [gh-404]: https://github.com/WordPress/Requests/issues/404 [gh-405]: https://github.com/WordPress/Requests/issues/405 [gh-406]: https://github.com/WordPress/Requests/issues/406 [gh-408]: https://github.com/WordPress/Requests/issues/408 [gh-409]: https://github.com/WordPress/Requests/issues/409 [gh-410]: https://github.com/WordPress/Requests/issues/410 [gh-411]: https://github.com/WordPress/Requests/issues/411 [gh-412]: https://github.com/WordPress/Requests/issues/412 [gh-413]: https://github.com/WordPress/Requests/issues/413 [gh-414]: https://github.com/WordPress/Requests/issues/414 [gh-415]: https://github.com/WordPress/Requests/issues/415 [gh-416]: https://github.com/WordPress/Requests/issues/416 [gh-417]: https://github.com/WordPress/Requests/issues/417 [gh-421]: https://github.com/WordPress/Requests/issues/421 [gh-422]: https://github.com/WordPress/Requests/issues/422 [gh-423]: https://github.com/WordPress/Requests/issues/423 [gh-424]: https://github.com/WordPress/Requests/issues/424 [gh-425]: https://github.com/WordPress/Requests/issues/425 [gh-426]: https://github.com/WordPress/Requests/issues/426 [gh-428]: https://github.com/WordPress/Requests/issues/428 [gh-434]: https://github.com/WordPress/Requests/issues/434 [gh-436]: https://github.com/WordPress/Requests/issues/436 [gh-439]: https://github.com/WordPress/Requests/issues/439 [gh-440]: https://github.com/WordPress/Requests/issues/440 [gh-441]: https://github.com/WordPress/Requests/issues/441 [gh-443]: https://github.com/WordPress/Requests/issues/443 [gh-445]: https://github.com/WordPress/Requests/issues/445 [gh-448]: https://github.com/WordPress/Requests/issues/448 [gh-451]: https://github.com/WordPress/Requests/issues/451 [gh-453]: https://github.com/WordPress/Requests/issues/453 [gh-454]: https://github.com/WordPress/Requests/issues/454 [gh-456]: https://github.com/WordPress/Requests/issues/456 [gh-457]: https://github.com/WordPress/Requests/issues/457 [gh-458]: https://github.com/WordPress/Requests/issues/458 [gh-461]: https://github.com/WordPress/Requests/issues/461 [gh-462]: https://github.com/WordPress/Requests/issues/462 [gh-464]: https://github.com/WordPress/Requests/issues/464 [gh-465]: https://github.com/WordPress/Requests/issues/465 [gh-467]: https://github.com/WordPress/Requests/issues/467 [gh-468]: https://github.com/WordPress/Requests/issues/468 [gh-469]: https://github.com/WordPress/Requests/issues/469 [gh-471]: https://github.com/WordPress/Requests/issues/471 1.7.0 ----- - Add support for HHVM and PHP 7 Requests is now tested against both HHVM and PHP 7, and they are supported as first-party platforms. (props [@rmccue][gh-rmccue], [#106][gh-106], [#176][gh-176]) - Transfer & connect timeouts, in seconds & milliseconds cURL is unable to handle timeouts under a second in DNS lookups, so we round those up to ensure 1-999ms isn't counted as an instant failure. (props [@ozh][gh-ozh], [@rmccue][gh-rmccue], [#97][gh-97], [#216][gh-216]) - Rework cookie handling to be more thorough. Cookies are now restricted to the same-origin by default, expiration is checked. (props [@catharsisjelly][gh-catharsisjelly], [@rmccue][gh-rmccue], [#120][gh-120], [#124][gh-124], [#130][gh-130], [#132][gh-132], [#156][gh-156]) - Improve testing Tests are now run locally to speed them up, as well as further general improvements to the quality of the testing suite. There are now also comprehensive proxy tests to ensure coverage there. (props [@rmccue][gh-rmccue], [#75][gh-75], [#107][gh-107], [#170][gh-170], [#177][gh-177], [#181][gh-181], [#183][gh-183], [#185][gh-185], [#196][gh-196], [#202][gh-202], [#203][gh-203]) - Support custom HTTP methods Previously, custom HTTP methods were only supported on sockets; they are now supported across all transports. (props [@ocean90][gh-ocean90], [#227][gh-227]) - Add byte limit option (props [@rmccue][gh-rmccue], [#172][gh-172]) - Support a Requests_Proxy_HTTP() instance for the proxy setting. (props [@ocean90][gh-ocean90], [#223][gh-223]) - Add progress hook (props [@rmccue][gh-rmccue], [#180][gh-180]) - Add a before_redirect hook to alter redirects (props [@rmccue][gh-rmccue], [#205][gh-205]) - Pass cURL info to after_request (props [@rmccue][gh-rmccue], [#206][gh-206]) - Remove explicit autoload in Composer installation instructions (props [@SlikNL][gh-SlikNL], [#86][gh-86]) - Restrict CURLOPT_PROTOCOLS on `defined()` instead of `version_compare()` (props [@ozh][gh-ozh], [#92][gh-92]) - Fix doc - typo in "Authentication" (props [@remik][gh-remik], [#99][gh-99]) - Contextually check for a valid transport (props [@ozh][gh-ozh], [#101][gh-101]) - Follow relative redirects correctly (props [@ozh][gh-ozh], [#103][gh-103]) - Use cURL's version_number (props [@mishan][gh-mishan], [#104][gh-104]) - Removed duplicated option docs (props [@staabm][gh-staabm], [#112][gh-112]) - code styling fixed (props [@imsaintx][gh-imsaintx], [#113][gh-113]) - Fix IRI "normalization" (props [@ozh][gh-ozh], [#128][gh-128]) - Mention two PHP extension dependencies in the README. (props [@orlitzky][gh-orlitzky], [#136][gh-136]) - Ignore coverage report files (props [@ozh][gh-ozh], [#148][gh-148]) - drop obsolete "return" after throw (props [@staabm][gh-staabm], [#150][gh-150]) - Updated exception message to specify both http + https (props [@beutnagel][gh-beutnagel], [#162][gh-162]) - Sets `stream_headers` method to public to allow calling it from other places. (props [@adri][gh-adri], [#158][gh-158]) - Remove duplicated stream_get_meta_data call (props [@rmccue][gh-rmccue], [#179][gh-179]) - Transmits $errno from stream_socket_client in exception (props [@laurentmartelli][gh-laurentmartelli], [#174][gh-174]) - Correct methods to use snake_case (props [@rmccue][gh-rmccue], [#184][gh-184]) - Improve code quality (props [@rmccue][gh-rmccue], [#186][gh-186]) - Update Build Status image (props [@rmccue][gh-rmccue], [#187][gh-187]) - Fix/Rationalize transports (v2) (props [@rmccue][gh-rmccue], [#188][gh-188]) - Surface cURL errors (props [@ifwe][gh-ifwe], [#194][gh-194]) - Fix for memleak and curl_close() never being called (props [@kwuerl][gh-kwuerl], [#200][gh-200]) - addex how to install with composer (props [@royopa][gh-royopa], [#164][gh-164]) - Uppercase the method to ensure compatibility (props [@rmccue][gh-rmccue], [#207][gh-207]) - Store default certificate path (props [@rmccue][gh-rmccue], [#210][gh-210]) - Force closing keep-alive connections on old cURL (props [@rmccue][gh-rmccue], [#211][gh-211]) - Docs: Updated HTTP links with HTTPS links where applicable (props [@ntwb][gh-ntwb], [#215][gh-215]) - Remove the executable bit (props [@ocean90][gh-ocean90], [#224][gh-224]) - Change more links to HTTPS (props [@rmccue][gh-rmccue], [#217][gh-217]) - Bail from cURL when either `curl_init()` OR `curl_exec()` are unavailable (props [@dd32][gh-dd32], [#230][gh-230]) - Disable OpenSSL's internal peer_name checking when `verifyname` is disabled. (props [@dd32][gh-dd32], [#239][gh-239]) - Only include the port number in the `Host` header when it differs from default (props [@dd32][gh-dd32], [#238][gh-238]) - Respect port if specified for HTTPS connections (props [@dd32][gh-dd32], [#237][gh-237]) - Allow paths starting with a double-slash (props [@rmccue][gh-rmccue], [#240][gh-240]) - Fixes bug in rfc2616 #3.6.1 implementation. (props [@stephenharris][gh-stephenharris], [#236][gh-236], [#3][gh-3]) - CURLOPT_HTTPHEADER在php7接受空数组导致php-fpm奔溃 (props [@qibinghua][gh-qibinghua], [#219][gh-219]) [gh-3]: https://github.com/WordPress/Requests/issues/3 [gh-75]: https://github.com/WordPress/Requests/issues/75 [gh-86]: https://github.com/WordPress/Requests/issues/86 [gh-92]: https://github.com/WordPress/Requests/issues/92 [gh-97]: https://github.com/WordPress/Requests/issues/97 [gh-99]: https://github.com/WordPress/Requests/issues/99 [gh-101]: https://github.com/WordPress/Requests/issues/101 [gh-103]: https://github.com/WordPress/Requests/issues/103 [gh-104]: https://github.com/WordPress/Requests/issues/104 [gh-106]: https://github.com/WordPress/Requests/issues/106 [gh-107]: https://github.com/WordPress/Requests/issues/107 [gh-112]: https://github.com/WordPress/Requests/issues/112 [gh-113]: https://github.com/WordPress/Requests/issues/113 [gh-120]: https://github.com/WordPress/Requests/issues/120 [gh-124]: https://github.com/WordPress/Requests/issues/124 [gh-128]: https://github.com/WordPress/Requests/issues/128 [gh-130]: https://github.com/WordPress/Requests/issues/130 [gh-132]: https://github.com/WordPress/Requests/issues/132 [gh-136]: https://github.com/WordPress/Requests/issues/136 [gh-148]: https://github.com/WordPress/Requests/issues/148 [gh-150]: https://github.com/WordPress/Requests/issues/150 [gh-156]: https://github.com/WordPress/Requests/issues/156 [gh-158]: https://github.com/WordPress/Requests/issues/158 [gh-162]: https://github.com/WordPress/Requests/issues/162 [gh-164]: https://github.com/WordPress/Requests/issues/164 [gh-170]: https://github.com/WordPress/Requests/issues/170 [gh-172]: https://github.com/WordPress/Requests/issues/172 [gh-174]: https://github.com/WordPress/Requests/issues/174 [gh-176]: https://github.com/WordPress/Requests/issues/176 [gh-177]: https://github.com/WordPress/Requests/issues/177 [gh-179]: https://github.com/WordPress/Requests/issues/179 [gh-180]: https://github.com/WordPress/Requests/issues/180 [gh-181]: https://github.com/WordPress/Requests/issues/181 [gh-183]: https://github.com/WordPress/Requests/issues/183 [gh-184]: https://github.com/WordPress/Requests/issues/184 [gh-185]: https://github.com/WordPress/Requests/issues/185 [gh-186]: https://github.com/WordPress/Requests/issues/186 [gh-187]: https://github.com/WordPress/Requests/issues/187 [gh-188]: https://github.com/WordPress/Requests/issues/188 [gh-194]: https://github.com/WordPress/Requests/issues/194 [gh-196]: https://github.com/WordPress/Requests/issues/196 [gh-200]: https://github.com/WordPress/Requests/issues/200 [gh-202]: https://github.com/WordPress/Requests/issues/202 [gh-203]: https://github.com/WordPress/Requests/issues/203 [gh-205]: https://github.com/WordPress/Requests/issues/205 [gh-206]: https://github.com/WordPress/Requests/issues/206 [gh-207]: https://github.com/WordPress/Requests/issues/207 [gh-210]: https://github.com/WordPress/Requests/issues/210 [gh-211]: https://github.com/WordPress/Requests/issues/211 [gh-215]: https://github.com/WordPress/Requests/issues/215 [gh-216]: https://github.com/WordPress/Requests/issues/216 [gh-217]: https://github.com/WordPress/Requests/issues/217 [gh-219]: https://github.com/WordPress/Requests/issues/219 [gh-223]: https://github.com/WordPress/Requests/issues/223 [gh-224]: https://github.com/WordPress/Requests/issues/224 [gh-227]: https://github.com/WordPress/Requests/issues/227 [gh-230]: https://github.com/WordPress/Requests/issues/230 [gh-236]: https://github.com/WordPress/Requests/issues/236 [gh-237]: https://github.com/WordPress/Requests/issues/237 [gh-238]: https://github.com/WordPress/Requests/issues/238 [gh-239]: https://github.com/WordPress/Requests/issues/239 [gh-240]: https://github.com/WordPress/Requests/issues/240 1.6.0 ----- - [Add multiple request support][#23] - Send multiple HTTP requests with both fsockopen and cURL, transparently falling back to synchronous when not supported. - [Add proxy support][#70] - HTTP proxies are now natively supported via a [high-level API][docs/proxy]. Major props to Ozh for his fantastic work on this. - [Verify host name for SSL requests][#63] - Requests is now the first and only standalone HTTP library to fully verify SSL hostnames even with socket connections. Thanks to Michael Adams, Dion Hulse, Jon Cave, and Pádraic Brady for reviewing the crucial code behind this. - [Add cookie support][#64] - Adds built-in support for cookies (built entirely as a high-level API) - [Add sessions][#62] - To compliment cookies, [sessions][docs/usage-advanced] can be created with a base URL and default options, plus a shared cookie jar. - Add [PUT][#1], [DELETE][#3], and [PATCH][#2] request support - [Add Composer support][#6] - You can now install Requests via the `rmccue/requests` package on Composer [docs/proxy]: https://requests.ryanmccue.info/docs/proxy.html [docs/usage-advanced]: https://requests.ryanmccue.info/docs/usage-advanced.html [#1]: https://github.com/WordPress/Requests/issues/1 [#2]: https://github.com/WordPress/Requests/issues/2 [#3]: https://github.com/WordPress/Requests/issues/3 [#6]: https://github.com/WordPress/Requests/issues/6 [#9]: https://github.com/WordPress/Requests/issues/9 [#23]: https://github.com/WordPress/Requests/issues/23 [#62]: https://github.com/WordPress/Requests/issues/62 [#63]: https://github.com/WordPress/Requests/issues/63 [#64]: https://github.com/WordPress/Requests/issues/64 [#70]: https://github.com/WordPress/Requests/issues/70 [View all changes][https://github.com/WordPress/Requests/compare/v1.5.0...v1.6.0] 1.5.0 ----- Initial release! [gh-aaronjorbin]: https://github.com/aaronjorbin [gh-adri]: https://github.com/adri [gh-alpipego]: https://github.com/alpipego/ [gh-amandato]: https://github.com/amandato [gh-beutnagel]: https://github.com/beutnagel [gh-carlalexander]: https://github.com/carlalexander [gh-catharsisjelly]: https://github.com/catharsisjelly [gh-ccrims0n]: https://github.com/ccrims0n [gh-costdev]: https://github.com/costdev [gh-datagutten]: https://github.com/datagutten [gh-dustinrue]: https://github.com/dustinrue [gh-dd32]: https://github.com/dd32 [gh-desrosj]: https://github.com/desrosj [gh-gstrauss]: https://github.com/gstrauss [gh-ifwe]: https://github.com/ifwe [gh-imsaintx]: https://github.com/imsaintx [gh-jegrandet]: https://github.com/jegrandet [gh-JustinyAhin]: https://github.com/JustinyAhin [gh-jrfnl]: https://github.com/jrfnl [gh-KasperFranz]: https://github.com/KasperFranz [gh-kwuerl]: https://github.com/kwuerl [gh-laurentmartelli]: https://github.com/laurentmartelli [gh-mbabker]: https://github.com/mbabker [gh-mishan]: https://github.com/mishan [gh-ntwb]: https://github.com/ntwb [gh-ocean90]: https://github.com/ocean90 [gh-orlitzky]: https://github.com/orlitzky [gh-ozh]: https://github.com/ozh [gh-patmead]: https://github.com/patmead [gh-peterwilsoncc]: https://github.com/peterwilsoncc [gh-qibinghua]: https://github.com/qibinghua [gh-remik]: https://github.com/remik [gh-rmccue]: https://github.com/rmccue [gh-royopa]: https://github.com/royopa [gh-schlessera]: https://github.com/schlessera [gh-SergeyBiryukov]: https://github.com/SergeyBiryukov [gh-SlikNL]: https://github.com/SlikNL [gh-soulseekah]: https://github.com/soulseekah [gh-staabm]: https://github.com/staabm [gh-stephenharris]: https://github.com/stephenharris [gh-szepeviktor]: https://github.com/szepeviktor [gh-TimothyBJacobs]: https://github.com/TimothyBJacobs [gh-tnorthcutt]: https://github.com/tnorthcutt [gh-todeveni]: https://github.com/todeveni [gh-tonebender]: https://github.com/tonebender [gh-twdnhfr]: https://github.com/twdnhfr [gh-TysonAndre]: https://github.com/TysonAndre [gh-whyisjake]: https://github.com/whyisjake [gh-wojsmol]: https://github.com/wojsmol [gh-xknown]: https://github.com/xknown [gh-Zegnat]: https://github.com/Zegnat [gh-ZsgsDesign]: https://github.com/ZsgsDesign razorpay/libs/Requests-2.0.4/.editorconfig 0000644 00000000341 15002216177 0014272 0 ustar 00 root = true [*] charset = utf-8 end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true indent_style = tab [{*.json,*.yml}] indent_style = space indent_size = 2 [*.md] trim_trailing_whitespace = false razorpay/.github/ISSUE_TEMPLATE/feature.yml 0000644 00000002047 15002216177 0014320 0 ustar 00 name: feature.md description: Submit a proposal for a new feature title: '[Feature]: ' labels: [':rocket: Feature Request'] body: - type: markdown attributes: value: | ### Thank you for taking the time to suggest a new feature! We kindly ask that you search to see if an issue [already exists](https://github.com/razorpay/razorpay-php/issues?q=is%3Aissue+sort%3Acreated-desc+) for your feature. We are also happy to accept contributions from our users. - type: textarea id: description attributes: label: '🚀 Feature Proposal' description: validations: required: true - type: textarea id: solution attributes: label: Suggested Solution description: validations: required: true - type: textarea id: alternatives attributes: label: Alternatives description: validations: required: false - type: textarea id: extra attributes: label: Additional Information description: validations: required: true razorpay/.github/ISSUE_TEMPLATE/issue_report.yml 0000644 00000003122 15002216177 0015403 0 ustar 00 name: issue.md description: Create a report to help us improve labels: ["issue"] body: - type: markdown attributes: value: | Thanks for taking the time to fill out this issue report! - type: textarea id: repro-steps attributes: label: Steps to reproduce the behavior description: placeholder: | 1. Fetch a '...' 2. Update the '....' 3. See error validations: required: true - type: textarea id: expected-behavior attributes: label: Expected behavior description: A clear and concise description of what you expected to happen. validations: required: true - type: textarea id: actual-behavior attributes: label: Actual behavior description: A clear and concise description of what actually happen. validations: required: true - type: textarea id: code-snippets attributes: label: Code snippets description: If applicable, add code snippets to help explain your problem. render: Php validations: required: false - type: input id: language-version attributes: label: Php version placeholder: Php v7.4 validations: required: true - type: input id: lib-version attributes: label: Library version placeholder: razorpay-php v2.8.4 validations: required: true - type: textarea id: additional-context attributes: label: Additional Information description: Add any other information about the problem here. validations: required: false razorpay/.github/dependabot.yml 0000644 00000000221 15002216177 0012577 0 ustar 00 version: 2 updates: - package-ecosystem: composer directory: "/" schedule: interval: daily time: "04:00" timezone: Asia/Calcutta razorpay/.github/pull_request_template.md 0000644 00000000757 15002216177 0014726 0 ustar 00 ## Note :- Please follow the below points while attaching test cases document link below: ### - If label `Tested` is added then test cases document URL is mandatory. ### - Link added should be a valid URL and accessible throughout the org. ### - If the branch name contains hotfix / revert by default the BVT workflow check will pass. | Test Case Document URL | |-----------------------------------------------| | Please paste test case document link here.... | razorpay/.github/workflows/ci.yml 0000644 00000002560 15002216177 0013132 0 ustar 00 name: CI on: push: branches: - master tags: - v[0-9]+.[0-9]+.[0-9]+* pull_request: branches: - master jobs: run: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Set up php 8.0 uses: shivammathur/setup-php@v2 with: php-version: '8.0' - name: 'Create env file' run: | touch ${{ github.workspace }}/tests/.env echo RAZORPAY_API_KEY=${{ secrets.RAZORPAY_API_KEY }} >> ${{ github.workspace }}/tests/.env echo RAZORPAY_API_SECRET=${{ secrets.RAZORPAY_API_SECRET }} >> ${{ github.workspace }}/tests/.env cat ${{ github.workspace }}/tests/.env - name: Install dependencies run: composer self-update && composer install && composer require vlucas/phpdotenv && composer dump-autoload - name: Run tests and collect coverage run: vendor/bin/phpunit ./tests/CoverageTest.php --coverage-clover coverage.xml . env: RAZORPAY_API_KEY: ${{ secrets.RAZORPAY_API_KEY }} RAZORPAY_API_SECRET: ${{ secrets.RAZORPAY_API_SECRET }} RAZORPAY_PARTNER_API_KEY: ${{ secrets.RAZORPAY_PARTNER_API_KEY }} RAZORPAY_PARTNER_API_SECRET: ${{ secrets.RAZORPAY_PARTNER_API_SECRET }} - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 razorpay/.github/workflows/security.yml 0000644 00000004236 15002216177 0014410 0 ustar 00 name: SecurityChecks on: pull_request: {} push: branches: ["master"] schedule: - cron: '30 20 * * *' jobs: semgrep: name: Semgrep runs-on: [ubuntu-latest] container: image: returntocorp/semgrep steps: - uses: actions/checkout@v4.0.0 - name: Run semgrep run: semgrep ci env: SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }} workflow_status: runs-on: [ ubuntu-latest ] # nosemgrep : semgrep.dev/s/swati31196:github_provided_runner name: Update Status Check needs: [ semgrep ] if: always() env: githubCommit: ${{ github.event.pull_request.head.sha }} steps: - name: Set github commit id run: | if [ "${{ github.event_name }}" = "push" ] || [ "${{ github.event_name }}" = "schedule" ]; then echo "githubCommit=${{ github.sha }}" >> $GITHUB_ENV fi exit 0 - name: Failed id: failed if: (contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')) && github.ref != 'refs/heads/master' run: | echo 'Failing the workflow for github security status check.' curl -X POST -H "Content-Type: application/json" -H "Authorization: token ${{ github.token }}" \ -d '{ "state" : "failure" , "context" : "github/security-status-check" , "description" : "github/security-status-check", "target_url" : "https://github.com/${{ github.repository }}" }' \ https://api.github.com/repos/${{ github.repository }}/statuses/${{ env.githubCommit }} exit 1 - name: Success if: steps.failed.conclusion == 'skipped' || github.ref != 'refs/heads/master' run: | echo 'Status check has passed!' curl -X POST -H "Content-Type: application/json" -H "Authorization: token ${{ github.token }}" \ -d '{ "state" : "success" , "context" : "github/security-status-check" , "description" : "github/security-status-check", "target_url" : "https://github.com/${{ github.repository }}" }' \ https://api.github.com/repos/${{ github.repository }}/statuses/${{ env.githubCommit }} exit 0 razorpay/tests/SignatureVerificationTest.php 0000644 00000003770 15002216177 0015442 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class SignatureVerificationTest extends TestCase { private static $subscriptionId; public function setUp(): void { parent::setUp(); } /** * Verify Payment verification */ public function testPaymentVerification() { $orderId = 'order_IEIaMR65cu6nz3'; $paymentId = 'pay_IH4NVgf4Dreq1l'; $signature = '97f18ee6577a33ca7c37b949912de807b379afb3f39ccb571ffd76017463f8e5'; $this->assertNull($this->api->utility->verifyPaymentSignature(array( 'razorpay_order_id' => $orderId, 'razorpay_payment_id' => $paymentId, 'razorpay_signature' => $signature ))); } /** * Verify PaymentLink verification */ public function testPaymentLinkVerification() { $paymentLinkId = 'plink_IH3cNucfVEgV68'; $paymentId = 'pay_IH3d0ara9bSsjQ'; $paymentLinkReferenceId = 'TSsd1989'; $paymentLinkStatus = 'paid'; $signature = '57bab821bfe7ebcf41b32e362d16aa23d408b76c36317f960ae99a9301e4d364'; $this->assertNull($this->api->utility->verifyPaymentSignature(array( 'razorpay_payment_link_id' => $paymentLinkId, 'razorpay_payment_link_reference_id' => $paymentLinkReferenceId, 'razorpay_payment_link_status' => $paymentLinkStatus, 'razorpay_payment_id' => $paymentId, 'razorpay_signature' => $signature ))); } /** * Verify Subscription verification */ public function testSubscriptionVerification() { $subscriptionId = 'sub_ID6MOhgkcoHj9I'; $paymentId = 'pay_IDZNwZZFtnjyym'; $signature = 'cbbaabf163d61fc9346b794b5f906bc2f6b0d944be71bc0e6b5c35fa21eade44'; $this->assertNull($this->api->utility->verifyPaymentSignature(array( 'razorpay_subscription_id' => $subscriptionId, 'razorpay_payment_id' => $paymentId, 'razorpay_signature' => $signature ))); } } razorpay/tests/PaymentLinkTest.php 0000644 00000022670 15002216177 0013371 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class PaymentLinkTest extends TestCase { /** * Specify unique paymentlink id * for example plink_IEjOvfQs5AyjMN */ private $paymentLinkId = "plink_IEjOvfQs5AyjMN"; public function setUp(): void { parent::setUp(); } /** * Create Payment Link */ public function testCreatePaymentLink() { $data = $this->api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'), 'notify'=>array('sms'=>true, 'email'=>true) , 'reminder_enable'=>true ,'notes'=>array('policy_name'=> 'Jeevan Bima'),'callback_url' => 'https://example-callback-url.com/', 'callback_method'=>'get')); $this->cancelLinkId = $data->id; $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('accept_partial',$data->toArray())); } /** * Fetch multiple refunds for a payment */ public function testFetchAllMutlipleRefund() { $data = $this->api->paymentLink->all(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(is_array($data['payment_links'])); } /** * Fetch a specific refund for a payment */ public function testFetchRefund() { $data = $this->api->paymentLink->fetch($this->paymentLinkId); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('amount',$data->toArray())); } /** * Update Payment Link */ public function testUpdatePaymentLink() { $payment = $this->api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'), 'notify'=>array('sms'=>true, 'email'=>true) , 'reminder_enable'=>true ,'notes'=>array('policy_name'=> 'Jeevan Bima'),'callback_url' => 'https://example-callback-url.com/', 'callback_method'=>'get')); $data = $this->api->paymentLink->fetch($payment->id)->edit(array("reference_id"=>"TS".time(), "reminder_enable"=>0, "notes"=>["policy_name"=>"Jeevan Saral 2"])); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('accept_partial',$data->toArray())); } /** * Send notification */ public function testSendNotification() { $data = $this->api->paymentLink->fetch($this->paymentLinkId)->notifyBy('email'); $this->assertTrue(is_array($data)); $this->assertTrue(in_array('success',$data)); } /** * Cancel Payment Link */ public function testCancelPaymentLink() { $paymentLink = $this->api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'), 'notify'=>array('sms'=>true, 'email'=>true) , 'reminder_enable'=>true ,'notes'=>array('policy_name'=> 'Jeevan Bima'),'callback_url' => 'https://example-callback-url.com/', 'callback_method'=>'get')); $data = $this->api->paymentLink->fetch($paymentLink->id)->cancel(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('accept_partial',$data->toArray())); } /** * Transfer payments received using payment links */ public function testCreateTransferPayments() { $data = $this->api->paymentLink->create(array('amount'=>20000, 'currency'=>'INR', 'accept_partial'=>false, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'), 'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('order'=>array('transfers'=>array('account'=>'acc_CPRsN1LkFccllA', 'amount'=>500, 'currency'=>'INR', 'notes'=>array('branch'=>'Acme Corp Bangalore North', 'name'=>'Bhairav Kumar' ,'linked_account_notes'=>array('branch'))), array('account'=>'acc_CNo3jSI8OkFJJJ', 'amount'=>500, 'currency'=>'INR', 'notes'=>array('branch'=>'Acme Corp Bangalore North', 'name'=>'Saurav Kumar' ,'linked_account_notes'=>array('branch'))))))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('accept_partial',$data->toArray())); } /** * Offers on payment links */ public function testOfferPaymentLinks() { $data = $this->api->paymentLink->create(array('amount'=>20000, 'currency'=>'INR', 'accept_partial'=>false, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'), 'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('order'=>array('transfers'=>array('account'=>'acc_CPRsN1LkFccllA', 'amount'=>500, 'currency'=>'INR', 'notes'=>array('branch'=>'Acme Corp Bangalore North', 'name'=>'Bhairav Kumar' ,'linked_account_notes'=>array('branch'))), array('account'=>'acc_CNo3jSI8OkFJJJ', 'amount'=>500, 'currency'=>'INR', 'notes'=>array('branch'=>'Acme Corp Bangalore North', 'name'=>'Saurav Kumar' ,'linked_account_notes'=>array('branch'))))))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('accept_partial',$data->toArray())); } /** * Managing reminders for payment links */ public function testManagingRemainder() { $data = $this->api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'), 'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>false)); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('amount',$data->toArray())); } /** * Rename labels in checkout section */ public function testRenameLabelsCheckout() { $data = $this->api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'), 'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('checkout'=>array('partial_payment'=>array('min_amount_label'=>'Minimum Money to be paid', 'partial_amount_label'=>'Pay in parts', 'partial_amount_description'=>'Pay at least ₹100', 'full_amount_label'=>'Pay the entire amount'))))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('amount',$data->toArray())); } /** * Change Business name */ public function testBusinessName() { $data = $this->api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'), 'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('checkout'=>array('name'=>'Lacme Corp')))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('accept_partial',$data->toArray())); } /** * Change checkouts fields */ public function testCheckoutFields() { $data = $this->api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'), 'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('checkout'=>array('method'=>array('netbanking'=>'1', 'card'=>'1', 'upi'=>'0', 'wallet'=>'0'))))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('accept_partial',$data->toArray())); } /** * Rename labels in checkout section */ public function testRenameLabelsPayments() { $data = $this->api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'), 'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('hosted_page'=>array('label'=>array('receipt'=>'Ref No.'.time(), 'description'=>'Course Name', 'amount_payable'=>'Course Fee Payable', 'amount_paid'=>'Course Fee Paid', 'partial_amount_due'=>'Fee Installment Due', 'partial_amount_paid'=>'Fee Installment Paid', 'expire_by'=>'Pay Before', 'expired_on'=>'1632223497','amount_due'=>'Course Fee Due'), 'show_preferences'=>array('issued_to'=>false))))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('accept_partial',$data->toArray())); } } razorpay/tests/CustomerTest.php 0000644 00000005620 15002216177 0012733 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class CustomerTest extends TestCase { /** * Specify unique customer id * for example cust_IEfAt3ruD4OEzo */ private $customerId = "cust_IEfAt3ruD4OEzo"; static private $baId; public function setUp(): void { parent::setUp(); } /** * Create customer */ public function testCreateCustomer() { $data = $this->api->customer->create(array('name' => 'Razorpay User 38', 'email' => 'customer38@razorpay.com' ,'fail_existing'=>'0')); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('customer',$data->toArray())); } /** * Edit customer */ public function testEditCustomer() { $data = $this->api->customer->fetch($this->customerId)->edit(array('name' => 'Razorpay User 21' ,'contact'=>'9123456780')); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array($this->customerId, $data->toArray())); } /** * Fetch customer All */ public function testFetchAll() { $data = $this->api->customer->all(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(is_numeric($data->count())); $this->assertTrue(is_array($data['items'])); } /** * Fetch a customer */ public function testFetchCustomer() { $data = $this->api->customer->fetch($this->customerId); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array($this->customerId, $data->toArray())); } /** * Add Bank account */ public function testBankAccount() { $data = $this->api->customer->fetch($this->customerId)->addBankAccount([ "ifsc_code" => "UTIB0000194", "account_number" => "919999999999", "beneficiary_name" => "Pratheek", "beneficiary_address1" => "address 1", "beneficiary_address2" => "address 2", "beneficiary_address3" => "address 3", "beneficiary_address4" => "address 4", "beneficiary_email" => "random@email.com", "beneficiary_mobile" => "8762489310", "beneficiary_city" => "Bangalore", "beneficiary_state" => "KA", "beneficiary_country" => "IN", ]); CustomerTest::$baId = $data->id; $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array("bank_account", $data->toArray())); } public function testDeleteBankAccount(){ if(CustomerTest::$baId) { $data = $this->api->customer->fetch($this->customerId)->deleteBankAccount(CustomerTest::$baId); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array("bank_account", $data->toArray())); } } } razorpay/tests/FundTest.php 0000644 00000002054 15002216177 0012024 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class FundTest extends TestCase { /** * Specify unique customer id * for example cust_IEfAt3ruD4OEzo */ private $customerId = "cust_IEfAt3ruD4OEzo"; public function setUp(): void { parent::setUp(); } /** * Create a fund account */ public function testCreateFundAccount() { $data = $this->api->fundAccount->create(array('customer_id'=>$this->customerId,'account_type'=>'bank_account','bank_account'=>array('name'=>'Gaurav Kumar', 'account_number'=>'11214311215411', 'ifsc'=>'HDFC0000053'))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('customer_id',$data->toArray())); } /** * Fetch all fund accounts */ public function testCreateOrder() { $data = $this->api->fundAccount->all(array('customer_id'=>$this->customerId)); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(is_array($data['items'])); } } razorpay/tests/RegisterEmandateTest.php 0000644 00000011434 15002216177 0014355 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class RegisterEmandateTest extends TestCase { /** * Specify unique customer id, invoice id, order id & token id * for example cust_BMB3EwbqnqZ2EI, inv_IF37M4q6SdOpjT, * order_IF1TQZozl6Leaw & token_IF1ThOcFC9J7pU */ private $customerId = "cust_BMB3EwbqnqZ2EI"; private $invoiceId = "inv_IF37M4q6SdOpjT"; private $orderId = "order_IF1TQZozl6Leaw"; private $tokenId = "token_IF1ThOcFC9J7pU"; public function setUp(): void { parent::setUp(); } /** * Create customer */ public function testCreateCustomer() { $data = $this->api->customer->create(array('name' => 'Razorpay User 21', 'email' => 'customer21@razorpay.com','fail_existing'=>'0')); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('customer',$data->toArray())); } /** * Create Order */ public function testCreateOrder() { $data = $this->api->order->create(array('receipt' => '123', 'amount' => 100, 'currency' => 'INR', 'notes'=> array('key1'=> 'value3','key2'=> 'value2'))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('id',$data->toArray())); } /** * Send/Resend notifications */ public function testSendNotification() { $data = $this->api->invoice->fetch($this->invoiceId)->notifyBy('email'); $this->assertTrue(in_array('success',$data)); } /** * Create registration link */ public function testCreateSubscriptionRegistration() { $data = $this->api->subscription->createSubscriptionRegistration(array('customer' => array('name' => 'Gaurav Kumar','email' => 'gaurav.kumar@example.com','contact' => '9123456780'),'amount' => 0,'currency' => 'INR','type' => 'link','description' => '12 p.m. Meals','subscription_registration' => array('method' => 'nach','auth_type' => 'physical','bank_account' => array('beneficiary_name' => 'Gaurav Kumar','account_number' => '11214311215411','account_type' => 'savings','ifsc_code' => 'HDFC0001233'),'nach' => array('form_reference1' => 'Recurring Payment for Gaurav Kumar','form_reference2' => 'Method Paper NACH'),'expire_at' => 1636772800,'max_amount' => 50000),'receipt' => 'Receipt No. '.time(),'sms_notify' => 1,'email_notify' => 1,'expire_by' => 1636772800,'notes' => array('note_key 1' => 'Beam me up Scotty','note_key 2' => 'Tea. Earl Gray. Hot.'))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('id',$data->toArray())); } /** * Fetch Payment ID using Order ID */ public function testFetchPaymentByorderId() { $data = $this->api->order->fetch($this->orderId)->payments(); $this->assertTrue(is_array($data->toArray())); } /** * Fetch tokens by customer id */ public function testFetchTokenByCustomerId() { $data = $this->api->customer->fetch($this->customerId)->tokens()->all(); $this->assertTrue(is_array($data->toArray())); } /** * Fetch token by payment ID */ public function testFetchTokenByPaymentId() { $payment = $this->api->payment->all(); if(!empty($payment)){ $data = $this->api->payment->fetch($payment['items'][0]['id']); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('id',$data->toArray()); } } /** * Create an order to charge the customer */ public function testCreateOrderCharge() { $data = $this->api->order->create(array('receipt' => '122', 'amount' => 100, 'currency' => 'INR', 'notes'=> array('key1'=> 'value3','key2'=> 'value2'))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('id',$data->toArray())); } /** * Create a Recurring Payment */ public function testCreateRecurring() { $order = $this->api->order->create(array("amount" => 100, "currency" => "INR","method" => "emandate", "payment_capture" => "1","customer_id" => $this->customerId ,"token" => array("auth_type" => "netbanking","max_amount" => 9999900,"expire_at" => 2147483647,"bank_account" => array("beneficiary_name" => "Gaurav Kumar","account_number" => "1121431121541121","account_type" => "savings","ifsc_code" => "HDFC0000001") ),"receipt" => "Receipt No. 1")); $data = $this->api->payment->createRecurring(array('email'=>'gaurav.kumar@example.com','contact'=>'9123456789','amount'=>100,'currency'=>'INR','order_id'=>$order->id,'customer_id'=>$this->customerId,'token'=>$this->tokenId,'recurring'=>'1','description'=>'Creating recurring payment for Gaurav Kumar')); $this->assertTrue(is_array($data->toArray())); } } razorpay/tests/ExceptionTest.php 0000644 00000004066 15002216177 0013073 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; use Razorpay\Api\Errors; class ExceptionTest extends TestCase { public function setUp(): void { parent::setUp(); } /** * Create an order from set header application/json */ public function testCreateOrderSetHeaderException() { $attribute = $this->payload(); try { $this->api->setHeader('content-type', 'application/json'); $data = $this->api->order->create($attribute); $this->assertTrue(is_array($data->toArray())); } catch(Error $e){ throw new InvalidArgumentException($e); } } /** * Create an order */ public function testCreateOrderSuccess() { $attribute = $this->payload(); try { $data = $this->api->order->create($attribute); $this->assertTrue(is_array($data->toArray())); } catch(Error $e){ throw new InvalidArgumentException($e); } } private function payload(){ $date = new \DateTime(); $receiptId = $date->getTimestamp(); return [ "receipt"=> (string) $receiptId, "amount"=>54900, "currency"=>"INR", "payment_capture"=>1, "app_offer"=>0, "notes" => [ "woocommerce_order_number" => 240186 ], "line_items_total" => 54900, "line_items" => [ [ "type" => "e-commerce", "sku"=> "", "variant_id" => "211444", "price" => "54900", "offer_price" => "54900", "quantity" => 1, "name" => "Personalised Kids T-shirts", "description" => "description" ] ] ]; } } razorpay/tests/PlanTest.php 0000644 00000002577 15002216177 0012034 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class PlanTest extends TestCase { /** * Specify unique plan id * for example plan_IEeswu4zFBRGwi */ private $planId = "plan_IEeswu4zFBRGwi"; public function setUp(): void { parent::setUp(); } /** * Create Plan */ public function testCreatePlan() { $data = $this->api->plan->create(array('period' => 'weekly', 'interval' => 1, 'item' => array('name' => 'Test Weekly 1 plan', 'description' => 'Description for the weekly 1 plan', 'amount' => 600, 'currency' => 'INR'),'notes'=> array('key1'=> 'value3','key2'=> 'value2'))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('plan',$data->toArray())); } /** * Fetch all plans * @covers \Razorpay\Api\Collection::count */ public function testFetchAllPlans() { $data = $this->api->plan->all(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue($data->count() >= 0); $this->assertTrue(is_array($data['items'])); } /** * Fetch particular plan */ public function testFetchPlan() { $data = $this->api->plan->fetch($this->planId); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('plan',$data->toArray())); } } razorpay/tests/SettlementTest.php 0000644 00000005020 15002216177 0013250 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class SettlementTest extends TestCase { /** * Specify unique settlement id * for example : setl_IAj6iuvvTATqOM */ private $settlementId = "setl_IAj6iuvvTATqOM"; public function setUp(): void { parent::setUp(); } /** * Create on-demand settlement */ public function testCreateOndemandSettlement() { $data = $this->api->settlement->createOndemandSettlement(array("amount"=> 1221, "settle_full_balance"=> false, "description"=>"Testing","notes" => array("notes_key_1"=> "Tea, Earl Grey, Hot","notes_key_2"=> "Tea, Earl Grey… decaf."))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('settlement.ondemand',$data->toArray())); } /** * Fetch all settlements */ public function testAllSettlements() { $data = $this->api->settlement->all(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('collection',$data->toArray())); } /** * Fetch a settlement */ public function testFetchSettlement() { $data = $this->api->settlement->fetch($this->settlementId); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('settlement',$data->toArray())); } /** * Settlement report for a month */ public function testReports() { $data = $this->api->settlement->reports(array("year"=>2021,"month"=>9)); $this->assertTrue(is_array($data->toArray())); } /** * Settlement recon */ public function testSettlementRecon() { $data = $this->api->settlement->settlementRecon(array('year' => 2021, 'month' => 9)); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('items',$data); } /** * Fetch all on-demand settlements */ public function testFetchAllOndemandSettlement() { $data = $this->api->settlement->fetchAllOndemandSettlement(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(is_array($data['items'])); } /** * Fetch on-demand settlement by ID */ public function testFetchAllOndemandSettlementById() { $data = $this->api->settlement->fetch($this->settlementId)->TestFetchAllOndemandSettlementById(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(is_array($data['items'])); } } razorpay/tests/InvoiceTest.php 0000644 00000006560 15002216177 0012532 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class InvoiceTest extends TestCase { /** * Specify unique invoice id & customer id * for example inv_IF37M4q6SdOpjT & cust_IEfAt3ruD4OEzo */ private $invoiceId = "inv_IH69XFNA9IMQ7k"; private $invoiceIdNotify = "inv_JM5rC3ddYKVWgy"; private $customerId = "cust_IEfAt3ruD4OEzo"; public function setUp(): void { parent::setUp(); } /** * Create Invoice */ public function testCreateInvoice() { $data = $this->api->invoice->create(array ('type' => 'invoice', 'date' => time(), 'customer_id'=> $this->customerId, 'line_items'=>array(array("name"=> "Master Cloud Computing in 30 Days", "amount"=>10000, "currency" => "INR", "quantity"=> 1)))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('invoice_number',$data->toArray())); } /** * Fetch all invoices */ public function testFetchAllInvoice() { $data = $this->api->invoice->fetch($this->invoiceId); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('invoice_number',$data->toArray())); } /** * Update invoice */ public function testUpdateInvoice() { $data = $this->api->invoice->fetch($this->invoiceId)->edit(array('notes' => array('updated-key' => 'An updated note.'))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('invoice_number',$data->toArray())); } /** * Send notification */ public function testSendNotification() { $data = $this->api->invoice->fetch($this->invoiceId)->notifyBy('sms'); $this->assertTrue(is_array($data)); } /** * Issue an invoice */ public function testInvoiceIssue() { $invoice = $this->api->invoice->create(array ('type' => 'invoice', 'draft'=> true , 'date' => time(), 'customer_id'=> $this->customerId, 'line_items'=>array(array("name"=> "Master Cloud Computing in 30 Days", "amount"=>10000, "currency" => "INR", "quantity"=> 1)))); $data = $this->api->invoice->fetch($invoice->id)->issue(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('invoice_number',$data->toArray())); } /** * Delete an invoice */ public function testDeleteInvoice() { $invoice = $this->api->invoice->create(array ('type' => 'invoice', 'draft'=> true , 'date' => time(), 'customer_id'=> $this->customerId, 'line_items'=>array(array("name"=> "Master Cloud Computing in 30 Days", "amount"=>10000, "currency" => "INR", "quantity"=> 1)))); $data = $this->api->invoice->fetch($invoice->id)->delete(); $this->assertTrue(is_array($data)); } /** * Cancel an invoice */ public function testCancelInvoice() { $invoice = $this->api->invoice->create(array ('type' => 'invoice', 'draft'=> true , 'date' => time(), 'customer_id'=> $this->customerId, 'line_items'=>array(array("name"=> "Master Cloud Computing in 30 Days", "amount"=>10000, "currency" => "INR", "quantity"=> 1)))); $data = $this->api->invoice->fetch($invoice->id)->cancel(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('invoice_number',$data->toArray())); } } razorpay/tests/TransferTest.php 0000644 00000013017 15002216177 0012715 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class TransferTest extends TestCase { /** * Specify unique transfer id, account id & payment id * for example trf_IEn4KYFgfD7q3F, acc_HjVXbtpSCIxENR & * pay_I7watngocuEY4P */ private $transferId = "trf_JtBI1uAaDdKkpJ"; private $accountId = "acc_HjVXbtpSCIxENR"; private $paymentId = "pay_LdarHRbodWJeXO"; public function setUp(): void { parent::setUp(); } /** * Direct transfers */ public function testDirectTransfer() { $data = $this->api->transfer->create(array('account' => $this->accountId, 'amount' => 500, 'currency' => 'INR')); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('collection',$data->toArray())); } /** * Create transfers from payment */ public function testCreateTransferPayment() { $data = $this->api->payment->fetch($this->paymentId)->transfer(array('transfers' => array(array('account'=> $this->accountId, 'amount'=> '100', 'currency'=>'INR', 'notes'=> array('name'=>'Gaurav Kumar', 'roll_no'=>'IEC2011025'), 'linked_account_notes'=>array('branch'), 'on_hold'=>'1', 'on_hold_until'=>'1671222870')))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('collection',$data->toArray())); } /** * Create transfers from order */ public function testCreateTransferOrder() { $data = $this->api->order->create(array('amount' => 100,'currency' => 'INR','transfers' => array(array('account' =>$this->accountId,'amount' => 100,'currency' => 'INR','notes' => array('branch' => 'Acme Corp Bangalore North','name' => 'Gaurav Kumar'),'linked_account_notes' => array('branch'),'on_hold' => 1,'on_hold_until' => 1671222870)))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('transfer',$data->toArray())); } /** * Fetch transfer for a payment */ public function testFetchTransferPayment() { $data = $this->api->payment->fetch($this->paymentId)->transfers(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('collection',$data->toArray())); } /** * Fetch transfer for an order */ public function testFetchTransferOrder() { $order = $this->api->order->all(); if($order['count'] !== 0){ $data = $this->api->order->fetch($order['items'][0]['id'])->transfers(array('expand[]'=>'transfers')); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('order',$data->toArray())); } } /** * Fetch transfer */ public function testFetchTransfer() { $data = $this->api->transfer->fetch($this->transferId); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('order',$data->toArray())); } /** * Fetch transfers for a settlement */ public function testFetchSettlement() { $settlement = $this->api->transfer->all(array('expand[]'=> 'recipient_settlement')); if($settlement['count'] !== 0){ $data = $this->api->transfer->all(array('recipient_settlement_id'=> $settlement['items'][0]['recipient_settlement_id'])); $this->assertTrue(is_array($data->toArray())); } } /** * Fetch settlement details */ public function testFetchSettlementDetails() { $data = $this->api->transfer->all(array('expand[]'=> 'recipient_settlement')); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('collection',$data->toArray())); } /** * Refund payments and reverse transfer from a linked account */ public function testRefundPayment() { $data = $this->api->payment->fetch($this->paymentId)->refund(array('amount'=> '100')); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('refund',$data->toArray())); } /** * Fetch payments of a linked account */ public function testFetchPaymentsLinkedAccounts() { $data = $this->api->payment->fetch($this->paymentId)->refund(array('amount'=> '100')); $this->assertTrue(is_array($data->toArray())); } /** * Reverse transfers from all linked accounts */ public function testReverseLinkedAccount() { $transfer = $this->api->transfer->create(array('account' => $this->accountId, 'amount' => 100, 'currency' => 'INR')); $data = $this->api->transfer->fetch($transfer->id)->reverse(array('amount'=>100)); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('refund',$data->toArray())); } /** * Hold settlements for transfers */ public function testHoldSettlements() { $data = $this->api->payment->fetch($this->paymentId)->transfer(array('transfers' => array(array('account' => $this->accountId, 'amount' => '100', 'currency' => 'INR', 'on_hold'=>'1')))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('collection',$data->toArray())); } /** * Modify settlement hold for transfers */ public function testModifySettlements() { $data = $this->api->transfer->fetch($this->transferId)->edit(array('on_hold'=>1)); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('transfer',$data->toArray())); } } razorpay/tests/AddonTest.php 0000644 00000003217 15002216177 0012157 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class AddonTest extends TestCase { /** * Specify unique addon id & plan id * for example ao_IEf05Yeu52LlKL & plan_IEeswu4zFBRGwi */ private $addonId = "ao_IEf05Yeu52LlKL"; private $planId = "plan_IEeswu4zFBRGwi"; public function setUp(): void { parent::setUp(); } /** * Create an Add-on */ public function testCreateAddon() { $subscription = $this->api->subscription->create(array('plan_id' => $this->planId, 'customer_notify' => 1,'quantity'=>1, 'total_count' => 6, 'addons' => array(array('item' => array('name' => 'Delivery charges', 'amount' => 3000, 'currency' => 'INR'))),'notes'=> array('key1'=> 'value3','key2'=> 'value2'))); $data = $this->api->subscription->fetch($subscription->id)->createAddon(array('item' => array('name' => 'Extra Chair', 'amount' => 3000, 'currency' => 'INR'), 'quantity' => 1)); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(is_object($data['item'])); } /** * Fetch Subscription Link by ID */ public function testFetchSubscriptionLink() { $data = $this->api->addon->fetch($this->addonId); $this->assertTrue(is_array($data->toArray())); $this->assertTrue($data['entity']=='addon'); } /** * Fetch all addons */ public function testFetchAllAddon() { $data = $this->api->addon->fetchAll(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(is_array($data['items'])); } } razorpay/tests/PartnerTest.php 0000644 00000024440 15002216177 0012546 0 ustar 00 <?php namespace Razorpay\Tests; require_once realpath(__DIR__ . "/../vendor/autoload.php"); use Razorpay\Api\Api; use Dotenv\Dotenv; if (class_exists('Dotenv')) { $dotenv = Dotenv::createImmutable(__DIR__); $dotenv->load(); } class PartnerTest extends TestCase { protected $instance; protected static $account_id; protected static $stakeholder_id; protected static $product_id; protected static $webhook_id; protected $accId = "acc_M83Uw27KXuC7c8"; protected $stkId = "sth_M83WuwmrCFa55g"; protected $docId = "doc_NBpjajKtxrMDg7"; public function setUp(): void { $apiKey = getenv("RAZORPAY_API_KEY") ? getenv("RAZORPAY_PARTNER_API_KEY") : ""; $apiSecret = getenv("RAZORPAY_API_SECRET") ? getenv("RAZORPAY_PARTNER_API_SECRET") : ""; $this->instance = new Api( $apiKey, $apiSecret); } public function testCreateAccount() { $account = $this->instance->account->create($this->accountAttributes()); self::$account_id = $account['id']; $this->assertTrue(is_array($account->toArray())); $this->assertTrue(is_array((array) $account['legal_info'])); } public function testCreateStakerholder() { $stakeholder = $this->instance->account->fetch(self::$account_id)->stakeholders()->create($this->stakeholderAttributes()); $this->assertTrue(is_array($stakeholder->toArray())); self::$stakeholder_id = $stakeholder['id']; $this->assertTrue(is_array((array) $stakeholder['phone'])); } public function testFetchStakerholder() { $stakeholder = $this->instance->account->fetch(self::$account_id)->stakeholders()->fetch(self::$stakeholder_id); $this->assertTrue(is_array($stakeholder->toArray())); $this->assertTrue(is_array((array) $stakeholder['phone'])); } public function testFetchAllStakerholder() { $stakeholder = $this->instance->account->fetch(self::$account_id)->stakeholders()->all(); $this->assertTrue(is_array($stakeholder->toArray())); $this->assertTrue(is_array((array) $stakeholder['items'])); } public function testEditStakerholder() { $stakeholder = $this->instance->account->fetch(self::$account_id)->stakeholders()->edit(self::$stakeholder_id, $this->stakeholderAttributes()); $this->assertTrue(is_array($stakeholder->toArray())); $this->assertTrue(is_array((array) $stakeholder['phone'])); } public function testProductConfiguration(){ $product = $this->instance->account->fetch(self::$account_id)->products()->requestProductConfiguration([ "product_name" => "payment_gateway", "tnc_accepted" => true, "ip" => "233.233.233.234" ]); self::$product_id = $product['id']; $this->assertTrue(is_array($product->toArray())); $this->assertTrue(is_array((array) $product['requirements'])); } public function testProductFetch(){ $product = $this->instance->account->fetch(self::$account_id)->products()->fetch(self::$product_id); $this->assertTrue(is_array($product->toArray())); $this->assertTrue(is_array((array) $product['requirements'])); } public function testProductEdit(){ $product = $this->instance->account->fetch(self::$account_id)->products()->edit(self::$product_id,[ "tnc_accepted" => true, "ip" => "233.233.233.224" ]); $this->assertTrue(is_array($product->toArray())); } public function testFetchTnc() { $webhook = $this->instance->product->fetchTnc("payments"); $this->assertTrue(is_array($webhook->toArray())); } public function testWebhookCreate() { $webhook = $this->instance->account->fetch(self::$account_id)->webhooks()->create($this->webhookAttributes()); self::$webhook_id = $webhook['id']; $this->assertTrue(is_array($webhook->toArray())); $this->assertTrue(is_array((array) $webhook['id'])); } public function testWebhookFetch() { $webhook = $this->instance->account->fetch(self::$account_id)->webhooks()->fetch(self::$webhook_id); $this->assertTrue(is_array($webhook->toArray())); $this->assertTrue(is_array((array) $webhook['id'])); } public function testFetchAllWebhook() { $webhook = $this->instance->account->fetch(self::$account_id)->webhooks()->all(); $this->assertTrue(is_array($webhook->toArray())); $this->assertTrue(is_array((array) $webhook['items'])); } public function testEditWebhook() { $webhook = $this->instance->account->fetch(self::$account_id)->webhooks()->edit([ "url" => "https://www.linkedin.com", "events" => ["refund.created"], ],self::$webhook_id); $this->assertTrue(is_array($webhook->toArray())); $this->assertTrue(is_array((array) $webhook['events'])); } public function testDeleteWebhook() { $webhook = $this->instance->account->fetch(self::$account_id)->webhooks()->delete(self::$webhook_id); $this->assertTrue(is_array($webhook->toArray())); } public function testDeleteAccount() { $account = $this->instance->account->fetch(self::$account_id)->delete(); $this->assertTrue(is_array($account->toArray())); $this->assertTrue(is_array((array) $account['legal_info'])); } public function testFetchAccount() { $account = $this->instance->account->fetch(self::$account_id); $this->assertTrue(is_array($account->toArray())); $this->assertTrue(is_array((array) $account['legal_info'])); } public function testEditAccount() { $request = ["customer_facing_business_name" => "Ltd"]; $account = $this->instance->account->fetch(self::$account_id)->edit($request); $this->assertTrue(is_array($account->toArray())); $this->assertTrue(is_array((array) $account['legal_info'])); } public function accountAttributes(){ return $arrayVar = [ "email" => "gauriagain".time()."@example.org", "phone" => "9000090000", "legal_business_name" => "Acme Corp", "business_type" => "partnership", "customer_facing_business_name" => "Example", "profile" => [ "category" => "healthcare", "subcategory" => "clinic", "description" => "Healthcare E-commerce platform", "addresses" => [ "operation" => [ "street1" => "507, Koramangala 6th block", "street2" => "Kormanagala", "city" => "Bengaluru", "state" => "Karnataka", "postal_code" => 560047, "country" => "IN", ], "registered" => [ "street1" => "507, Koramangala 1st block", "street2" => "MG Road", "city" => "Bengaluru", "state" => "Karnataka", "postal_code" => 560034, "country" => "IN", ], ], "business_model" => "Online Clothing ( men, women, ethnic, modern ) fashion and lifestyle, accessories, t-shirt, shirt, track pant, shoes.", ], "legal_info" => ["pan" => "AAACL1234C", "gst" => "18AABCU9603R1ZM"], "brand" => ["color" => "FFFFFF"], "notes" => ["internal_ref_id" => "123123"], "contact_name" => "Gaurav Kumar", "contact_info" => [ "chargeback" => ["email" => "cb@example.org"], "refund" => ["email" => "cb@example.org"], "support" => [ "email" => "support@example.org", "phone" => "9999999998", "policy_url" => "https://www.google.com", ], ], "apps" => [ "websites" => ["https://www.example.org"], "android" => [["url" => "playstore.example.org", "name" => "Example"]], "ios" => [["url" => "appstore.example.org", "name" => "Example"]], ], ]; } public function stakeholderAttributes(){ return $arrayVar = [ "percentage_ownership" => 10, "name" => "Gaurav Kumar", "email" => "gaurav". time() .".kumar@example.com", "relationship" => ["director" => true, "executive" => false], "phone" => ["primary" => "7474747474", "secondary" => "7474747474"], "addresses" => [ "residential" => [ "street" => "506, Koramangala 1st block", "city" => "Bengaluru", "state" => "Karnataka", "postal_code" => "560034", "country" => "IN", ], ], "kyc" => ["pan" => "AVOPB1111K"], "notes" => ["random_key_by_partner" => "random_value"], ]; } public function webhookAttributes(){ return $arrayVar = [ "url" => "https://google.com", "alert_email" => "gaurav.kumar@example.com", "secret" => "12345", "events" => [ "payment.authorized", "payment.failed", "payment.captured", "payment.dispute.created", "refund.failed", "refund.created", ], ]; } public function testAccountFetchDocument() { $data = $this->instance->account->fetch($this->accId)->fetchAccountDoc(); $this->assertTrue(is_array($data->toArray())); } public function testStakeholderFetchDocument() { $data = $this->instance->account->fetch($this->accId)->stakeholders()->fetchStakeholderDoc($this->stkId); $this->assertTrue(is_array($data->toArray())); } public function testFetchDocument() { $data = $this->instance->document->fetch($this->docId); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey("entity", $data->toArray()); } } razorpay/tests/ItemTest.php 0000644 00000004611 15002216177 0012027 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class ItemTest extends TestCase { public function setUp(): void { parent::setUp(); } /** * Create item */ public function testcreate() { $data = $this->api->Item->create(array( "name" => "Book / English August", "description" => "An indian story, Booker prize winner.", "amount" => 20000, "currency" => "INR" )); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('id',$data->toArray())); } /** * Fetch all orders */ public function testAllItems() { $data = $this->api->Item->all(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(is_array($data['items'])); } /** * Fetch particular item */ public function testfetchItem() { $item = $this->api->Item->create(array( "name" => "Book / English August", "description" => "An indian story, Booker prize winner.", "amount" => 20000, "currency" => "INR" )); $data = $this->api->Item->fetch($item->id); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array($item->id, $data->toArray())); } /** * Update item */ public function testUpdate() { $item = $this->api->Item->create(array( "name" => "Book / English August", "description" => "An indian story, Booker prize winner.", "amount" => 20000, "currency" => "INR" )); $data = $this->api->Item->fetch($item->id)->edit(array( "name" => "Book / English August", "description" => "An indian story, Booker prize winner.", "amount" => 20000, "currency" => "INR" )); $this->assertTrue(is_array($data->toArray())); } /** * Delete item */ public function testDelete() { $item = $this->api->Item->create(array( "name" => "Book / English August", "description" => "An indian story, Booker prize winner.", "amount" => 20000, "currency" => "INR" )); $data = $this->api->Item->fetch($item->id)->delete(); $this->assertTrue(is_array($data->toArray())); } } razorpay/tests/SubscriptionTest.php 0000644 00000007264 15002216177 0013624 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class SubscriptionTest extends TestCase { /** * Specify unique subscription id & plan id * for example : sub_IEKtBfPIqTHLWd & plan_IEeswu4zFBRGwi */ private $subscriptionId = "sub_IEllLOZcf0PODu"; private $plan = "plan_IEeswu4zFBRGwi"; public function setUp(): void { parent::setUp(); } /** * Create a Subscription Link */ public function testCreateSubscription() { $data = $this->api->subscription->create(array('plan_id' => $this->plan, 'customer_notify' => 1,'quantity'=>1, 'total_count' => 6, 'addons' => array(array('item' => array('name' => 'Delivery charges', 'amount' => 3000, 'currency' => 'INR'))),'notes'=> array('key1'=> 'value3','key2'=> 'value2'))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('id',$data->toArray())); } /** * Fetch Subscription Link by ID */ public function testSubscriptionFetchId() { $data = $this->api->subscription->fetch($this->subscriptionId); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('plan_id',$data->toArray())); } /** * Pause a Subscription */ public function testPauseSubscription() { $data = $this->api->subscription->fetch($this->subscriptionId)->pause(['pause_at'=>'now']); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('id',$data->toArray())); $this->assertTrue($data['status'] == 'paused'); } /** * Resume a Subscription */ public function testResumeSubscription() { $data = $this->api->subscription->fetch($this->subscriptionId)->resume(['resume_at'=>'now']); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('id',$data->toArray())); } /** * Update a Subscription */ public function testUpdateSubscription() { $data = $this->api->subscription->fetch($this->subscriptionId)->update(array('schedule_change_at'=>'cycle_end','quantity'=>2)); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('customer_id',$data->toArray())); } /** * Fetch Details of a Pending Update */ public function testPendingUpdate() { $data = $this->api->subscription->fetch($this->subscriptionId)->pendingUpdate(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('id',$data->toArray())); } /** * Cancel an Update */ public function testCancelUpdate() { $data = $this->api->subscription->fetch($this->subscriptionId)->cancelScheduledChanges(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('id',$data->toArray())); } /** * Fetch All Invoices for a Subscription */ public function testSubscriptionInvoices() { $data = $this->api->invoice->all(['subscription_id'=>$this->subscriptionId]); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(is_array($data['items'])); } /** * Fetch all Add-ons */ public function testFetchAddons() { $data = $this->api->addon->fetchAll(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(is_array($data['items'])); } /** * Fetch all subscriptions */ public function testFetchAllSubscriptions() { $data = $this->api->subscription->all(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(is_array($data['items'])); } } razorpay/tests/EmandateTest.php 0000644 00000006565 15002216177 0012661 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class EmandateTest extends TestCase { /** * Specify unique customer id, invoice id & token id * for example cust_IEfAt3ruD4OEzo, inv_IF37M4q6SdOpjT & token_IF1ThOcFC9J7pU */ private $customerId = "cust_IEfAt3ruD4OEzo"; private $invoiceId = "inv_JM5rC3ddYKVWgy"; private $tokenId = "token_IF1ThOcFC9J7pU"; public function setUp(): void { parent::setUp(); } /** * Create customer */ public function testCreateCustomerEmandate() { $data = $this->api->customer->create(array('name' => 'Razorpay User 71', 'email' => 'customer71@razorpay.com', 'contact'=> 9999999999, 'fail_existing'=>'0')); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('customer',$data->toArray())); } /** * Create Order */ public function testCreateOrderEmandate() { $data = $this->api->order->create(array('amount' => 100,'currency' => 'INR','method' => 'emandate','customer_id' => $this->customerId,'receipt' => 'Receipt No. '.time(), 'notes' => array('notes_key_1' => 'Beam me up Scotty','notes_key_2' => 'Engage'),'token' => array('auth_type' => 'netbanking','max_amount' => 9999900,'expire_at' => 4102444799,'notes' => array('notes_key_1' => 'Tea, Earl Grey, Hot','notes_key_2' => 'Tea, Earl Grey… decaf.'),'bank_account' => array('beneficiary_name' => 'Gaurav Kumar','account_number' => '1121431121541121','account_type' => 'savings','ifsc_code' => 'HDFC0000001')))); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('id',$data->toArray()); } /** * Create registration link */ public function testCreateSubscriptionRegistrationEmandate() { $data = $this->api->subscription->createSubscriptionRegistration(array('customer'=>array('name'=>'Gaurav Kumar','email'=>'gaurav.kumar@example.com','contact'=>'9999999999'),'type'=>'link','amount'=>100,'currency'=>'INR','description'=>'Registration Link for Gaurav Kumar','subscription_registration'=>array('method'=>'card','max_amount'=>'500','expire_at'=> strtotime("+1 month") ),'receipt'=>'Receipt No. '.time(),'email_notify'=>1,'sms_notify'=>1,'expire_by'=>strtotime("+1 month"),'notes' => array('note_key 1' => 'Beam me up Scotty','note_key 2' => 'Tea. Earl Gray. Hot.'))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('customer',$data->toArray())); } /** * Send/Resend notifications */ public function testSendNotification() { $data = $this->api->invoice->fetch($this->invoiceId)->notifyBy('sms'); $this->assertTrue(is_array($data)); $this->assertArrayHasKey('success',$data); } /** * Fetch token by payment ID */ public function testFetchTokenByPaymentId() { $payment = $this->api->payment->all(); $data = $this->api->payment->fetch($payment['items'][0]['id']); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('id',$data->toArray()); } /** * Fetch tokens by customer id */ public function testFetchTokenByCustomerId() { $data = $this->api->customer->fetch($this->customerId)->tokens()->all(); $this->assertTrue(is_array($data->toArray())); } } razorpay/tests/IinTest.php 0000644 00000000365 15002216177 0011652 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class IinTest extends TestCase { public function testFetchIinAll() { $data = $this->api->iin->all(); $this->assertTrue(is_array($data->toArray())); } } razorpay/tests/OrdersTest.php 0000644 00000003370 15002216177 0012370 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class OrdersTest extends TestCase { /** * Specify unique order id * for example order_IEfF1OrQbqxYJq */ private $orderId = "order_IEfF1OrQbqxYJq"; public function setUp(): void { parent::setUp(); } /** * Create order */ public function testCreateOrder() { $data = $this->api->order->create(array('receipt' => '123', 'amount' => 100, 'currency' => 'INR', 'notes'=> array('key1'=> 'value3','key2'=> 'value2'))); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('id',$data->toArray()); } /** * Fetch all orders */ public function testAllOrders() { $data = $this->api->order->all(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(is_array($data['items'])); } /** * Fetch particular order */ public function testFetchOrder() { $data = $this->api->order->fetch($this->orderId); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('order',$data->toArray())); } /** * Fetch payments for an order */ public function testOrderFetchById() { $data = $this->api->order->fetch($this->orderId)->payments(); $this->assertTrue(is_array($data->toArray())); } /** * Update Order */ public function testUpdateOrder() { $data = $this->api->order->fetch($this->orderId)->edit(array('notes'=> array('notes_key_1'=>'Beam me up Scotty. 1', 'notes_key_2'=>'Engage'))); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('id',$data->toArray()); } } razorpay/tests/PaperNachTest.php 0000644 00000011020 15002216177 0012762 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class PaperNachTest extends TestCase { /** * Specify unique customer id, invoice id , order id & token id * for example cust_IEfAt3ruD4OEzo, inv_IF37M4q6SdOpjT, * order_IF1TQZozl6Leaw & token_IF1ThOcFC9J7pU */ private $customerId = "cust_IEfAt3ruD4OEzo"; private $invoiceId = "inv_IF37M4q6SdOpjT"; private $orderId = "order_IF1TQZozl6Leaw"; private $tokenId = "token_IF1ThOcFC9J7pU"; public function setUp(): void { parent::setUp(); } /** * Create customer */ public function testCreateCustomerPaperNach() { $data = $this->api->customer->create(array('name' => 'Razorpay User 72', 'email' => 'customer72@razorpay.com', 'fail_existing'=>'0')); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('customer',$data->toArray())); } /** * Create Order */ public function testCreateOrderPaperNach() { $data = $this->api->order->create(array('receipt' => '123', 'amount' => 100, 'currency' => 'INR', 'notes'=> array('key1'=> 'value3','key2'=> 'value2'))); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('id',$data->toArray()); } /** * Send notification */ public function testSendNotification() { $data = $this->api->invoice->fetch($this->invoiceId)->notifyBy('email'); $this->assertTrue(in_array('success',$data)); } /** * Create registration link */ public function testRegistrationLink() { $data = $this->api->subscription->createSubscriptionRegistration(array('customer' => array('name' => 'Gaurav Kumar','email' => 'gaurav.kumar@example.com','contact' => '9123456780'),'amount' => 0,'currency' => 'INR','type' => 'link','description' => '12 p.m. Meals','subscription_registration' => array('method' => 'nach','auth_type' => 'physical','bank_account' => array('beneficiary_name' => 'Gaurav Kumar','account_number' => '11214311215411','account_type' => 'savings','ifsc_code' => 'HDFC0001233'),'nach' => array('form_reference1' => 'Recurring Payment for Gaurav Kumar','form_reference2' => 'Method Paper NACH'),'expire_at' => 1636772800,'max_amount' => 50000),'receipt' => 'Receipt No. '.time(),'sms_notify' => 1,'email_notify' => 1,'expire_by' => 1636772800,'notes' => array('note_key 1' => 'Beam me up Scotty','note_key 2' => 'Tea. Earl Gray. Hot.'))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('id',$data->toArray())); } /** * Fetch Payment ID using Order ID */ public function testFetchPaymentByorderId() { $data = $this->api->order->fetch($this->orderId)->payments(); $this->assertTrue(is_array($data->toArray())); } /** * Fetch token by payment ID */ public function testFetchTokenByPaymentId() { $payment = $this->api->payment->all(); if(!empty($payment)){ $data = $this->api->payment->fetch($payment['items'][0]['id']); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('id',$data->toArray()); } } /** * Create an order to charge the customer */ public function testCreateOrderCharge() { $data = $this->api->order->create(array('receipt' => '122', 'amount' => 100, 'currency' => 'INR', 'notes'=> array('key1'=> 'value3','key2'=> 'value2'))); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('id',$data->toArray()); } /** * Create a Recurring Payment */ public function testCreateRecurring() { $order = $this->api->order->create(array("amount" => 100, "currency" => "INR","method" => "emandate", "payment_capture" => "1","customer_id" => $this->customerId ,"token" => array("auth_type" => "netbanking","max_amount" => 9999900,"expire_at" => 2147483647,"bank_account" => array("beneficiary_name" => "Gaurav Kumar","account_number" => "1121431121541121","account_type" => "savings","ifsc_code" => "HDFC0000001") ),"receipt" => "Receipt No. 1")); $data = $this->api->payment->createRecurring(array('email'=>'gaurav.kumar@example.com','contact'=>'9123456789','amount'=>100,'currency'=>'INR','order_id'=>$order->id,'customer_id'=>$this->customerId,'token'=>$this->tokenId,'recurring'=>'1','description'=>'Creating recurring payment for Gaurav Kumar')); $this->assertTrue(is_array($data->toArray())); } } razorpay/tests/QrCodeTest.php 0000644 00000005002 15002216177 0012301 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class QrCodeTest extends TestCase { /** * Specify unique qrcode id & customer id * for example qr_IEjmDxjAY3iCnw & cust_IEfAt3ruD4OEzo */ private $qrCodeId = "qr_IEjmDxjAY3iCnw"; private $customerId = "cust_IEfAt3ruD4OEzo"; public function setUp(): void { parent::setUp(); } /** * Create Qr code */ public function testCreateQrCode() { $data = $this->api->qrCode->create(array("type" => "upi_qr","name" => "Store_1", "usage" => "single_use","fixed_amount" => 1,"payment_amount" => 300,"customer_id" => $this->customerId, "description" => "For Store 1","close_by" => strtotime('+3 minutes', time()),"notes" => array("purpose" => "Test UPI QR code notes"))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('qr_code',$data->toArray())); } /** * Fetch all Qr code */ public function testFetchAllQrCode() { $data = $this->api->plan->all(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(is_array($data['items'])); } /** * Fetch a Qr code */ public function testFetchQrCode() { $data = $this->api->qrCode->fetch($this->qrCodeId); $this->assertTrue(is_array($data->toArray())); } /** * Fetch a Qr code for customer id */ public function testFetchQrCodeByCustomerId() { $data = $this->api->qrCode->all(["customer_id" => $this->customerId ]); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(is_array($data['items'])); } /** * Fetch a Qr code for payment id */ public function testFetchQrCodePaymentById() { $data = $this->api->qrCode->all(); $this->assertTrue(is_array($data->toArray())); } /** * Close a QR Code */ public function testCloseQrCode() { $qrCodeId = $this->api->qrCode->create(array("type" => "upi_qr","name" => "Store_1", "usage" => "single_use","fixed_amount" => 1,"payment_amount" => 300,"customer_id" => $this->customerId, "description" => "For Store 1","close_by" => strtotime('+3 minutes', time()), "notes" => array("purpose" => "Test UPI QR code notes"))); $data = $this->api->qrCode->fetch($qrCodeId->id)->close(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('qr_code',$data->toArray())); } } razorpay/tests/TokenTest.php 0000644 00000007452 15002216177 0012217 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class TokenTest extends TestCase { /** * Specify unique payment id, token id & customer id * for example pay_IEczPDny6uzSnx, cust_IEcn7UdBOFmaNi & * token_IEcux6sQtS8eLx */ private $paymentId = "pay_IEczPDny6uzSnx"; private $customerId = "cust_IEcn7UdBOFmaNi"; private $tokenId = "token_IEcux6sQtS8eLx"; protected static $partnerTokenId ; public function setUp(): void { parent::setUp(); } /** * Create registration link */ public function testCreateRegistrationLink() { $data = $this->api->subscription->createSubscriptionRegistration(array('customer' => array('name' => 'Gaurav Kumar','email' => 'gaurav.kumar@example.com','contact' => '9123456780'),'amount' => 0,'currency' => 'INR','type' => 'link','description' => '12 p.m. Meals','subscription_registration' => array('method' => 'nach','auth_type' => 'physical','bank_account' => array('beneficiary_name' => 'Gaurav Kumar','account_number' => '11214311215411','account_type' => 'savings','ifsc_code' => 'HDFC0001233'),'nach' => array('form_reference1' => 'Recurring Payment for Gaurav Kumar','form_reference2' => 'Method Paper NACH'),'expire_at' => strtotime('+1 day'),'max_amount' => 50000),'receipt' => 'Receipt No. '.time(),'sms_notify' => 1,'email_notify' => 1,'expire_by' => strtotime('+1 day'),'notes' => array('note_key 1' => 'Beam me up Scotty','note_key 2' => 'Tea. Earl Gray. Hot.'))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('id',$data->toArray())); } /** * Fetch token by payment id */ public function testFetchTokenByPaymentId() { $data = $this->api->payment->fetch($this->paymentId); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('payment',$data->toArray())); } /** * Fetch particular token */ public function testFetchTokenByCustomerId() { $data = $this->api->customer->fetch($this->customerId)->tokens()->fetch($this->tokenId); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('payment',$data->toArray())); } public function testCreateToken() { $data = $this->api->token->create($this->requestAttribute($this->customerId)); self::$partnerTokenId = $data['id']; $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('card',$data->toArray())); } public function testFetchToken() { $data = $this->api->token->fetchCardPropertiesByToken(['id'=>self::$partnerTokenId]); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('card',$data->toArray())); } public function testProcessPaymentOnAlternatePAorPG() { $data = $this->api->token->processPaymentOnAlternatePAorPG(['id'=>self::$partnerTokenId]); $this->assertTrue(is_array($data->toArray())); } public function testDeleteToken() { $data = $this->api->token->deleteToken(['id'=>self::$partnerTokenId]); $this->assertTrue(is_array($data->toArray())); } public function requestAttribute($customerId){ return [ "customer_id" => $customerId, "method" => "card", "card" => [ "number" => "4854980604708430", "cvv" => "123", "expiry_month" => "12", "expiry_year" => "24", "name" => "Gaurav Kumar", ], "authentication" => [ "provider" => "razorpay", "provider_reference_id" => "pay_123wkejnsakd" ], "notes" => [], ]; } } razorpay/tests/UpiTest.php 0000644 00000011653 15002216177 0011672 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class UpiTest extends TestCase { /** * Specify unique customer id, invoice id & order id * for example cust_IEfAt3ruD4OEzo, inv_IEfS5mBV49bIQY & * order_IEgBdwYACpMLxd */ private $customerId = "cust_IEfAt3ruD4OEzo"; private $invoiceId = "inv_IEfS5mBV49bIQY"; private $orderId = "order_IEgBdwYACpMLxd"; public function setUp(): void { parent::setUp(); } /** * Create customer */ public function testCreateCustomer() { $data = $this->api->customer->create(array('name' => 'Razorpay User 21', 'email' => 'customer21@razorpay.com','fail_existing'=>'0')); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('customer',$data->toArray())); } /** * Create Order */ public function testCreateOrder() { $data = $this->api->order->create(array('receipt' => '123', 'amount' => 100, 'currency' => 'INR', 'notes'=> array('key1'=> 'value3','key2'=> 'value2'))); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('id',$data->toArray()); } /** * Send/Resend notifications */ public function testSendNotification() { $data = $this->api->invoice->fetch($this->invoiceId)->notifyBy('email'); $this->assertTrue(in_array('success',$data)); } /** * Create registration link */ public function testCreateSubscriptionRegistration() { $data = $this->api->subscription->createSubscriptionRegistration(array('customer' => array('name' => 'Gaurav Kumar','email' => 'gaurav.kumar@example.com','contact' => '9123456780'),'amount' => 0,'currency' => 'INR','type' => 'link','description' => '12 p.m. Meals','subscription_registration' => array('method' => 'nach','auth_type' => 'physical','bank_account' => array('beneficiary_name' => 'Gaurav Kumar','account_number' => '11214311215411','account_type' => 'savings','ifsc_code' => 'HDFC0001233'),'nach' => array('form_reference1' => 'Recurring Payment for Gaurav Kumar','form_reference2' => 'Method Paper NACH'),'expire_at' => 1636772800,'max_amount' => 50000),'receipt' => 'Receipt No. '.time(),'sms_notify' => 1,'email_notify' => 1,'expire_by' => 1636772800,'notes' => array('note_key 1' => 'Beam me up Scotty','note_key 2' => 'Tea. Earl Gray. Hot.'))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('id',$data->toArray())); } /** * Cancel a registration link */ public function testCancelRegistrationLink() { $data = $this->api->subscription->createSubscriptionRegistration(array('customer' => array('name' => 'Gaurav Kumar','email' => 'gaurav.kumar@example.com','contact' => '9123456780'),'amount' => 0,'currency' => 'INR','type' => 'link','description' => '12 p.m. Meals','subscription_registration' => array('method' => 'nach','auth_type' => 'physical','bank_account' => array('beneficiary_name' => 'Gaurav Kumar','account_number' => '11214311215411','account_type' => 'savings','ifsc_code' => 'HDFC0001233'),'nach' => array('form_reference1' => 'Recurring Payment for Gaurav Kumar','form_reference2' => 'Method Paper NACH'),'expire_at' => 1636772800,'max_amount' => 50000),'receipt' => 'Receipt No. '.time(),'sms_notify' => 1,'email_notify' => 1,'expire_by' => 1636772800,'notes' => array('note_key 1' => 'Beam me up Scotty','note_key 2' => 'Tea. Earl Gray. Hot.'))); $data = $this->api->invoice->fetch($data->id)->cancel(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('invoice_number',$data->toArray())); } /** * Fetch Payment ID using Order ID */ public function testFetchPaymentByorderId() { $data = $this->api->order->fetch($this->orderId)->payments(); $this->assertTrue(is_array($data->toArray())); } /** * Fetch tokens by customer id */ public function testFetchTokenByCustomerId() { $data = $this->api->customer->fetch($this->customerId)->tokens()->all(); $this->assertTrue(is_array($data->toArray())); } /** * Fetch token by payment ID */ public function testFetchTokenByPaymentId() { $payment = $this->api->payment->all(); if(!empty($payment)){ $data = $this->api->payment->fetch($payment['items'][0]['id']); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('id',$data->toArray()); } } /** * Create an order to charge the customer */ public function testCreateOrderCharge() { $data = $this->api->order->create(array('receipt' => '122', 'amount' => 100, 'currency' => 'INR', 'notes'=> array('key1'=> 'value3','key2'=> 'value2'))); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('id',$data->toArray()); } } razorpay/tests/TestCase.php 0000644 00000001161 15002216177 0012001 0 ustar 00 <?php namespace Razorpay\Tests; require_once realpath(__DIR__ . "/../vendor/autoload.php"); use Razorpay\Api\Api; use Razorpay\Api\Request; use PHPUnit\Framework\TestCase as PhpUnitTest; use Dotenv\Dotenv; if (class_exists('Dotenv')) { $dotenv = Dotenv::createImmutable(__DIR__); $dotenv->load(); } class TestCase extends PhpUnitTest { public function setUp(): void { $apiKey = getenv("RAZORPAY_API_KEY") ? getenv("RAZORPAY_API_KEY") : ""; $apiSecret = getenv("RAZORPAY_API_SECRET") ? getenv("RAZORPAY_API_SECRET") : ""; $this->api = new Api( $apiKey, $apiSecret); } } razorpay/tests/PaymentTest.php 0000644 00000007210 15002216177 0012544 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; use Razorpay\Api\Api; class PaymentTest extends TestCase { /** * Specify unique order id & payment id d * for example order_IEcrUMyevZFuCS & pay_IEczPDny6uzSnx */ private $orderId = "order_IEcrUMyevZFuCS"; private $paymentId = "pay_IEczPDny6uzSnx"; private $OtpPaymentId = ""; public function setUp(): void { parent::setUp(); } /** * Fetch all payment */ public function testFetchAllPayment() { $data = $this->api->payment->all(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(is_array($data['items'])); } /** * Fetch a payment */ public function testFetchPayment() { $payment = $this->api->payment->all(); if($payment['count'] !== 0){ $data = $this->api->payment->fetch($payment['items'][0]['id']); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('payment',$data->toArray())); } } /** * Fetch a payment */ public function testFetchOrderPayment() { $data = $this->api->order->fetch($this->orderId)->payments(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(is_array($data['items'])); } /** * Update a payment */ public function testUpdatePayment() { $data = $this->api->payment->fetch($this->paymentId)->edit(array('notes'=> array('key_1'=> 'value1','key_2'=> 'value2'))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('payment',$data->toArray())); } /** * Fetch card details with paymentId */ public function testFetchCardWithPaymentId() { $data = $this->api->payment->fetch($this->paymentId)->fetchCardDetails(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('card',$data->toArray())); } /** * Fetch Payment Downtime Details */ public function testfetchPaymentDowntime() { $data = $this->api->payment->fetchPaymentDowntime(); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('count',$data->toArray()); } /** * Fetch Payment Downtime Details */ public function testfetchPaymentDowntimeById() { $downtime = $this->api->payment->fetchPaymentDowntime(); if(count($downtime['items'])>0){ $data = $this->api->payment->fetchPaymentDowntimeById($downtime['items'][0]['id']); $this->assertTrue(is_array($data->toArray())); }else{ $this->assertArrayHasKey('count',$downtime->toArray()); } } /** * Otp Generate */ public function testOtpGenerate() { $api = new Api("key", ""); $data = $api->payment->otpGenerate($OtpPaymentId); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('razorpay_payment_id',$data->toArray()); } /** * Otp Submit */ public function testOtpSubmit() { $data = $this->api->payment->fetch($paymentId)->otpSubmit(array('otp'=> '12345')); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('razorpay_payment_id',$data->toArray()); } /** * Otp Resend */ public function testOtpResend() { $data = $this->api->payment->fetch($paymentId)->otpResend(); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('razorpay_payment_id',$data->toArray()); } } razorpay/tests/bootstrap.php 0000644 00000000106 15002216177 0012301 0 ustar 00 <?php $autoloader = require dirname(__DIR__) . '/vendor/autoload.php'; razorpay/tests/ApiTest.php 0000644 00000002727 15002216177 0011650 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class ApiTest extends TestCase { private $title = "codecov_test"; private $url = 'https://api.razorpay.com'; public function setUp(): void { parent::setUp(); } /** * Get app details */ public function testGetAppDetails() { $this->api->setAppDetails($this->title); $data = $this->api->getAppsDetails(); $this->assertTrue(is_array($data)); $this->assertTrue($this->title==$data[0]['title']); } /** * Get app details */ public function testSetBaseUrl() { $this->api->setBaseUrl($this->url); $data = $this->api->getBaseUrl(); $this->assertTrue($this->url==$data); } public function testGetkey() { $data = $this->api->getKey(); $this->assertTrue(strlen($data) > 0); } public function testGetSecret() { $data = $this->api->getSecret(); $this->assertTrue(strlen($data) > 0); } public function testFullUrl() { $pattern = '/^(https?:\/\/)?([a-z0-9-]+\.)+[a-z]{2,}(\/.*)?$/i'; $url = $this->api->getFullUrl($this->api->getBaseUrl()."orders","v1"); $this->assertTrue(preg_match($pattern, $url, $matches)==true); } /** * @covers \Request */ public function testgetheader() { $data = Request::getHeaders(); $this->assertTrue(is_array($data)); } } razorpay/tests/RefundTest.php 0000644 00000004356 15002216177 0012362 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class RefundTest extends TestCase { /** * Specify unique payment id & refund id * for example pay_LatkcPaGiDxgRG & rfnd_IEjzeVghAS4vd1 */ private $paymentId = "pay_LatkcPaGiDxgRG"; private $refundId = "rfnd_Lcsb6JNwQVAtpi"; public function setUp(): void { parent::setUp(); } /** * Create an instant refund */ public function testCreateRefund() { $data = $this->api->payment->fetch($this->paymentId)->refund(array("amount"=> "100", "speed"=>"optimum", "receipt"=>"Receipt No. ".time())); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('refund',$data->toArray())); } /** * Fetch multiple refunds for a payment */ public function testFetchMultipalRefund() { $data = $this->api->payment->fetch($this->paymentId)->fetchMultipleRefund(array("count"=>1)); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(is_array($data['items'])); } /** * Fetch a specific refund for a payment */ public function testFetchRefund() { $data = $this->api->payment->fetch($this->paymentId)->fetchRefund($this->refundId); $this->assertTrue(is_array($data->toArray())); } /** * Fetch all refunds */ public function testFetchAllRefund() { $data = $this->api->refund->all(array("count"=>1)); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(is_array($data['items'])); } /** * Fetch particular refund */ public function testParticularRefund() { $data = $this->api->refund->fetch($this->refundId); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('refund',$data->toArray())); } /** * Update the refund */ public function testUpdateRefund() { $data = $this->api->refund->fetch($this->refundId)->edit(array('notes'=> array('notes_key_1'=>'Beam me up Scotty.', 'notes_key_2'=>'Engage'))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('refund',$data->toArray())); } } razorpay/tests/RegisterNachTest.php 0000644 00000011461 15002216177 0013510 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class RegisterNachTest extends TestCase { /** * Specify unique customer id, invoice id, order id & token id * for example : cust_BMB3EwbqnqZ2EI, inv_IF37M4q6SdOpjT, * order_IF1TQZozl6Leaw & token_IF1ThOcFC9J7pU */ private $customerId = "cust_BMB3EwbqnqZ2EI"; private $invoiceId = "inv_IF37M4q6SdOpjT"; private $orderId = "order_IF1TQZozl6Leaw"; private $tokenId = "token_IF1ThOcFC9J7pU"; public function setUp(): void { parent::setUp(); } /** * Create customer */ public function testCreateCustomerForNachTest() { $data = $this->api->customer->create(array('name' => 'Razorpay User 21', 'email' => 'customer21@razorpay.com','fail_existing'=>'0')); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('customer',$data->toArray())); } /** * Create Order */ public function testCreateOrderForNachTest() { $data = $this->api->order->create(array('receipt' => '123', 'amount' => 100, 'currency' => 'INR', 'notes'=> array('key1'=> 'value3','key2'=> 'value2'))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('id',$data->toArray())); } /** * Send/Resend notifications */ public function testSendNotification() { $data = $this->api->invoice->fetch($this->invoiceId)->notifyBy('email'); $this->assertTrue(in_array('success',$data)); } /** * Create registration link */ public function testCreateSubscriptionRegistration() { $data = $this->api->subscription->createSubscriptionRegistration(array('customer' => array('name' => 'Gaurav Kumar','email' => 'gaurav.kumar@example.com','contact' => '9123456780'),'amount' => 0,'currency' => 'INR','type' => 'link','description' => '12 p.m. Meals','subscription_registration' => array('method' => 'nach','auth_type' => 'physical','bank_account' => array('beneficiary_name' => 'Gaurav Kumar','account_number' => '11214311215411','account_type' => 'savings','ifsc_code' => 'HDFC0001233'),'nach' => array('form_reference1' => 'Recurring Payment for Gaurav Kumar','form_reference2' => 'Method Paper NACH'),'expire_at' => 1636772800,'max_amount' => 50000),'receipt' => 'Receipt No. '.time(),'sms_notify' => 1,'email_notify' => 1,'expire_by' => 1636772800,'notes' => array('note_key 1' => 'Beam me up Scotty','note_key 2' => 'Tea. Earl Gray. Hot.'))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('id',$data->toArray())); } /** * Fetch Payment ID using Order ID */ public function testFetchPaymentByorderId() { $data = $this->api->order->fetch($this->orderId)->payments(); $this->assertTrue(is_array($data->toArray())); } /** * Fetch tokens by customer id */ public function testFetchTokenByCustomerId() { $data = $this->api->customer->fetch($this->customerId)->tokens()->all(); $this->assertTrue(is_array($data->toArray())); } /** * Fetch token by payment ID */ public function testFetchTokenByPaymentId() { $payment = $this->api->payment->all(); if(!empty($payment)){ $data = $this->api->payment->fetch($payment['items'][0]['id']); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('id',$data->toArray());; } } /** * Create an order to charge the customer */ public function testCreateOrderCharge() { $data = $this->api->order->create(array('receipt' => '122', 'amount' => 100, 'currency' => 'INR', 'notes'=> array('key1'=> 'value3','key2'=> 'value2'))); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('id',$data->toArray())); } /** * Create a Recurring Payment */ public function testCreateRecurring() { $order = $this->api->order->create(array("amount" => 100, "currency" => "INR","method" => "emandate", "payment_capture" => "1","customer_id" => $this->customerId ,"token" => array("auth_type" => "netbanking","max_amount" => 9999900,"expire_at" => 2147483647,"bank_account" => array("beneficiary_name" => "Gaurav Kumar","account_number" => "1121431121541121","account_type" => "savings","ifsc_code" => "HDFC0000001") ),"receipt" => "Receipt No. 1")); $data = $this->api->payment->createRecurring(array('email'=>'gaurav.kumar@example.com','contact'=>'9123456789','amount'=>100,'currency'=>'INR','order_id'=>$order->id,'customer_id'=>$this->customerId,'token'=>$this->tokenId,'recurring'=>'1','description'=>'Creating recurring payment for Gaurav Kumar')); $this->assertTrue(is_array($data->toArray())); } } razorpay/tests/VirtualAccountTest.php 0000644 00000005754 15002216177 0014105 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class VirtualAccountTest extends TestCase { /** * Specify unique customer id, payment id & virtual-account id * for example cust_IEm1ERQLCdRGPV, pay_IEljgrElHGxXAC & * va_IEmC8SOoyGxsNn */ private $customerId = "cust_IEm1ERQLCdRGPV"; private $paymentId = "pay_IEljgrElHGxXAC"; private $virtualAccountId = "va_IEmC8SOoyGxsNn"; public function setUp(): void { parent::setUp(); } /** * Create a virtual account */ public function testCreateVirtualAccount() { $data = $this->api->virtualAccount->create(array('receivers' => array('types' => array('bank_account')),'description' => 'Virtual Account created for Raftar Soft','customer_id' => $this->customerId ,'close_by' => strtotime('+16 minutes', time()), 'notes' => array('project_name' => 'Banking Software'))); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('customer_id',$data->toArray()); } /** * Create a virtual account with TPV */ public function testCreateVirtualAccountTpv() { $data = $this->api->virtualAccount->create(array('receivers' => array('types'=> array('bank_account')),'allowed_payers' => array(array('type'=>'bank_account','bank_account'=>array('ifsc'=>'RATN0VAAPIS','account_number'=>'2223330027558515'))),'description' => 'Virtual Account created for Raftar Soft','customer_id' => $this->customerId, 'notes' => array('project_name' => 'Banking Software'))); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('customer_id',$data->toArray()); } /** * Fetch all virtual account */ public function testFetchAllVirtualAccounts() { $data = $this->api->virtualAccount->all(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('collection',$data->toArray())); } /** * Fetch payments for a virtual account */ public function testFetchPayment() { $data = $this->api->virtualAccount->fetch($this->virtualAccountId)->payments(); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('items',$data->toArray()); } /** * Refund payments made to a virtual account */ public function testFetchRefund() { $payment = $this->api->payment->all(); $data = $this->api->payment->fetch($this->paymentId)->refunds(); $this->assertTrue(is_array($data->toArray())); } /** * Close virtual account */ public function testCloseVirtualAccount() { $payment = $this->api->virtualAccount->all(); if($payment['count'] !== 0){ $data = $this->api->virtualAccount->fetch($payment['items'][0]['id'])->close(); $this->assertTrue(is_array($data->toArray())); $this->assertArrayHasKey('id',$data->toArray()); } } } razorpay/tests/CardTest.php 0000644 00000000757 15002216177 0012011 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class CardTest extends TestCase { /** * Specify unique card id */ private $cardId = "card_LcQgzpfvWP0UKF"; public function setUp(): void { parent::setUp(); } /** * Fetch Card details */ public function testFetchCard() { $data = $this->api->card->fetch($this->cardId); $this->assertTrue(in_array($this->cardId, $data->toArray())); } } razorpay/tests/RequestTest.php 0000644 00000002735 15002216177 0012566 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class RequestTest extends TestCase { public function setUp(): void { parent::setUp(); } /** * Create customer */ public function testaddHeader() { $data = $this->api->customer->create(array('name' => 'Razorpay User 38', 'email' => 'customer38@razorpay.com' ,'fail_existing'=>'0')); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array('customer',$data->toArray())); } /** * Edit customer */ public function testEditCustomer() { $data = $this->api->customer->fetch($this->customerId)->edit(array('name' => 'Razorpay User 21' ,'contact'=>'9123456780')); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array($this->customerId, $data->toArray())); } /** * Fetch customer All */ public function testFetchAll() { $data = $this->api->customer->all(); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(is_numeric($data->count())); $this->assertTrue(is_array($data['items'])); } /** * Fetch a customer */ public function testFetchCustomer() { $data = $this->api->customer->fetch($this->customerId); $this->assertTrue(is_array($data->toArray())); $this->assertTrue(in_array($this->customerId, $data->toArray())); } } razorpay/tests/CoverageTest.php 0000644 00000031423 15002216177 0012665 0 ustar 00 <?php namespace Razorpay\Tests; use Razorpay\Api\Request; class CoverageTest extends TestCase { /** * @covers \Razorpay\Api\Token::all * @covers \Razorpay\Api\Token::fetch * @covers \Razorpay\Api\Token::create * @covers \Razorpay\Api\Token::fetchCardPropertiesByToken * @covers \Razorpay\Api\Token::deleteToken */ public function testTokenCoverage(){ $transfer = new TokenTest(); $transfer->setup(); $transfer->testFetchTokenByCustomerId(); $transfer->testCreateToken(); $transfer->testFetchTokenByPaymentId(); $transfer->testProcessPaymentOnAlternatePAorPG(); $transfer->testDeleteToken(); } /** * @covers \Razorpay\Api\Account::create * @covers \Razorpay\Api\Account::fetch * @covers \Razorpay\Api\Account::edit * @covers \Razorpay\Api\Account::delete */ public function testAccountCoverage(){ $account = new PartnerTest(); $account->setup(); $account->testCreateAccount(); $account->testFetchAccount(); //$account->testEditAccount(); $account->testDeleteAccount(); } /** * @covers \Razorpay\Api\Stakeholder::create * @covers \Razorpay\Api\Stakeholder::fetch * @covers \Razorpay\Api\Stakeholder::all */ public function testStakeholderCoverage(){ $stakeholder = new PartnerTest(); $stakeholder->setup(); $stakeholder->testCreateStakerholder(); $stakeholder->testFetchStakerholder(); $stakeholder->testFetchAllStakerholder(); } /** * @covers \Razorpay\Api\Product::requestProductConfiguration * @covers \Razorpay\Api\Product::fetch * @covers \Razorpay\Api\Product::edit * @covers \Razorpay\Api\Product::fetchTnc * @covers \Razorpay\Api\Stakeholder::edit */ public function testProductCoverage(){ $product = new PartnerTest(); $product->setup(); $product->testProductConfiguration(); $product->testProductFetch(); $product->testProductEdit(); $product->testFetchTnc(); //$product->testEditStakerholder(); } /** * @covers \Razorpay\Api\Webhook::create * @covers \Razorpay\Api\Webhook::fetch * @covers \Razorpay\Api\Webhook::all * @covers \Razorpay\Api\Webhook::edit * @covers \Razorpay\Api\Webhook::delete */ public function testWebhookCoverage(){ $webhook = new PartnerTest(); $webhook->setup(); $webhook->testWebhookCreate(); $webhook->testWebhookFetch(); $webhook->testFetchAllWebhook(); $webhook->testEditWebhook(); $webhook->testDeleteWebhook(); } /** * @covers \Razorpay\Api\Api::getAppsDetails * @uses \Razorpay\Api\Api::setAppDetails * @covers \Razorpay\Api\Api::getBaseUrl * @uses \Razorpay\Api\Api::setBaseUrl * @cover \Razorpay\Api\Api::getKey * @cover \Razorpay\Api\Api::getSecret * @cover \Razorpay\Api\Api::getFullUrl * @cover \Razorpay\Api\Api::testgetheader * @cover \Razorpay\Api\Request::addHeader * @cover \Razorpay\Api\Request::getHeader */ public function testApiInstance(){ $instance = new ApiTest(); $instance->setup(); $instance->testGetAppDetails(); $instance->testSetBaseUrl(); $instance->testGetkey(); $instance->testGetSecret(); $instance->testFullUrl(); $instance->testgetheader(); } /** * @covers \Razorpay\Api\Plan::create * @covers \Razorpay\Api\Plan::fetch * @covers \Razorpay\Api\Plan::all */ public function testPlanCoverage(){ $subscription = new PlanTest(); $subscription->setup(); $subscription->testCreatePlan(); $subscription->testFetchAllPlans(); $subscription->testFetchPlan(); } /** * @covers \Razorpay\Api\QrCode::create * @covers \Razorpay\Api\QrCode::fetch * @covers \Razorpay\Api\QrCode::close * @uses \Razorpay\Api\ArrayableInterface * @covers \Razorpay\Api\QrCode::all * @covers \Razorpay\Api\QrCode::fetchAllPayments */ public function testQrCodeCoverage(){ $qrCode = new QrCodeTest(); $qrCode->setup(); $qrCode->testCreateQrCode(); $qrCode->testFetchQrCode(); $qrCode->testCloseQrCode(); $qrCode->testFetchAllQrCode(); $qrCode->testFetchQrCodePaymentById(); } /** * @covers \Razorpay\Api\Refund::fetch * @covers \Razorpay\Api\Refund::edit * @covers \Razorpay\Api\Refund::all * @covers \Razorpay\Api\Payment::fetchMultipleRefund * @covers \Razorpay\Api\Payment::fetchRefund */ public function testRefundCoverage(){ $refund = new RefundTest(); $refund->setup(); $refund->testFetchRefund(); $refund->testFetchAllRefund(); $refund->testFetchMultipalRefund(); } /** * @covers \Razorpay\Api\Subscription::create * @covers \Razorpay\Api\Subscription::fetch * @covers \Razorpay\Api\Addon::fetchAll * @covers \Razorpay\Api\Subscription::all */ public function testSubscriptionCoverage(){ $subscription = new SubscriptionTest(); $subscription->setup(); $subscription->testCreateSubscription(); $subscription->testSubscriptionFetchId(); $subscription->testFetchAddons(); $subscription->testFetchAllSubscriptions(); } /** * @covers \Razorpay\Api\VirtualAccount::create * @covers \Razorpay\Api\VirtualAccount::all * @covers \Razorpay\Api\VirtualAccount::payments * @uses \Razorpay\Api\VirtualAccount::fetch * @covers \Razorpay\Api\VirtualAccount::close */ public function testVirtualAccountCoverage(){ $virtualAccount = new VirtualAccountTest(); $virtualAccount->setup(); $virtualAccount->testCreateVirtualAccount(); $virtualAccount->testFetchAllVirtualAccounts(); $virtualAccount->testFetchPayment(); $virtualAccount->testCloseVirtualAccount(); } /** * @covers \Razorpay\Api\Addon::fetch * @covers \Razorpay\Api\Addon::fetchAll */ public function testAddonCoverage(){ $addon = new AddonTest(); $addon->setUp(); $addon->testFetchSubscriptionLink(); $addon->testFetchAllAddon(); } /** * @covers \Razorpay\Api\Customer::create * @covers \Razorpay\Api\Entity::create * @covers \Razorpay\Api\Customer::edit * @covers \Razorpay\Api\Entity::getEntityUrl * @covers \Razorpay\Api\Customer::all * @covers \Razorpay\Api\Entity::all * @covers \Razorpay\Api\Customer::fetch * @covers \Razorpay\Api\Entity::fetch * @covers \Razorpay\Api\Entity::validateIdPresence * @covers \Razorpay\Api\Entity::snakeCase * @covers \Razorpay\Api\Entity::request * @covers \Razorpay\Api\Entity::buildEntity * @covers \Razorpay\Api\Entity::getDefinedEntitiesArray * @covers \Razorpay\Api\Entity::getEntityClass * @covers \Razorpay\Api\Entity::getEntity * @covers \Razorpay\Api\Entity::fill * @covers \Razorpay\Api\Entity::isAssocArray * @covers \Razorpay\Api\Entity::toArray * @covers \Razorpay\Api\Entity::convertToArray * @covers \Razorpay\Api\Collection::count */ public function testCustomerCoverage(){ $customer = new CustomerTest(); $customer->setUp(); $customer->testCreateCustomer(); $customer->testEditCustomer(); $customer->testFetchAll(); $customer->testFetchCustomer(); usleep(500000); } /** * @covers \Razorpay\Api\Card::fetch * @covers \Razorpay\Api\Request::request * @covers \Razorpay\Api\Request::checkErrors * @covers \Razorpay\Api\Request::getRequestHeaders * @covers \Razorpay\Api\Request::constructUa * @covers \Razorpay\Api\Request::getAppDetailsUa */ public function testCardCoverage(){ $card = new CardTest(); $card->setup(); $card->testFetchCard(); } /** * @covers \Razorpay\Api\FundAccount::create * @covers \Razorpay\Api\FundAccount::all */ public function testFundCoverage(){ $fund = new FundTest(); $fund->setup(); $fund->testCreateFundAccount(); $fund->testCreateOrder(); } /** * @covers \Razorpay\Api\Invoice::create * @covers \Razorpay\Api\Invoice::all * @covers \Razorpay\Api\Invoice::edit * @covers \Razorpay\Api\Invoice::notifyBy * @covers \Razorpay\Api\Invoice::delete * @covers \Razorpay\Api\Invoice::cancel * @uses \Razorpay\Api\Invoice::fetch */ public function testInvoiceCoverage(){ $invoice = new InvoiceTest(); $invoice->setup(); $invoice->testCreateInvoice(); $invoice->testFetchAllInvoice(); $invoice->testUpdateInvoice(); $invoice->testInvoiceIssue(); $invoice->testDeleteInvoice(); $invoice->testCancelInvoice(); } /** * @covers \Razorpay\Api\Item::create * @covers \Razorpay\Api\Item::fetch * @covers \Razorpay\Api\Item::edit * @covers \Razorpay\Api\Item::all * @covers \Razorpay\Api\Item::delete */ public function testItemCoverage(){ $item = new ItemTest(); $item->setup(); $item->testcreate(); $item->testAllItems(); $item->testfetchItem(); $item->testUpdate(); $item->testDelete(); } /** * @covers \Razorpay\Api\Order::create * @covers \Razorpay\Api\Order::all * @covers \Razorpay\Api\Order::fetch * @covers \Razorpay\Api\Order::edit */ public function testOrderCoverage(){ $order = new OrdersTest(); $order->setup(); $order->testCreateOrder(); $order->testAllOrders(); $order->testFetchOrder(); $order->testUpdateOrder(); } /** * @covers \Razorpay\Api\Payment::fetch * @covers \Razorpay\Api\Payment::all * @covers \Razorpay\Api\Payment::edit * @covers \Razorpay\Api\Order::payments * @covers \Razorpay\Api\Payment::fetchCardDetails * @covers \Razorpay\Api\Payment::fetchPaymentDowntime * @covers \Razorpay\Api\Payment::fetchPaymentDowntimeById */ public function testPaymentCoverage(){ $order = new PaymentTest(); $order->setup(); $order->testFetchPayment(); $order->testFetchAllPayment(); $order->testUpdatePayment(); $order->testFetchOrderPayment(); $order->testFetchCardWithPaymentId(); $order->testfetchPaymentDowntime(); $order->testfetchPaymentDowntimeById(); } /** * @covers \Razorpay\Api\PaymentLink::create * @covers \Razorpay\Api\PaymentLink::fetch * @covers \Razorpay\Api\PaymentLink::all * @covers \Razorpay\Api\PaymentLink::cancel * @covers \Razorpay\Api\PaymentLink::edit * @covers \Razorpay\Api\PaymentLink::notifyBy */ public function testPaymentlinkCoverage(){ $paymentlink = new PaymentLinkTest(); $paymentlink->setup(); $paymentlink->testCreatePaymentLink(); $paymentlink->testFetchRefund(); $paymentlink->testFetchAllMutlipleRefund(); $paymentlink->testCancelPaymentLink(); $paymentlink->testUpdatePaymentLink(); $paymentlink->testSendNotification(); } /** * @covers \Razorpay\Api\Settlement::all * @covers \Razorpay\Api\Settlement::settlementRecon */ public function testSettlementCoverage(){ $paymentlink = new SettlementTest(); $paymentlink->setup(); $paymentlink->testAllSettlements(); $paymentlink->testSettlementRecon(); } /** * @covers \Razorpay\Api\Order::transfers * @covers \Razorpay\Api\Transfer::all * @covers \Razorpay\Api\Payment::transfers * @covers \Razorpay\Api\Transfer::fetch * @covers \Razorpay\Api\Transfer::all */ public function testTransferCoverage(){ $transfer = new TransferTest(); $transfer->setup(); $transfer->testFetchTransferOrder(); $transfer->testFetchSettlement(); $transfer->testFetchTransferPayment(); $transfer->testFetchTransfer(); $transfer->testFetchSettlement(); } /** * @covers \Razorpay\Api\Utility::verifyPaymentSignature * @covers \Razorpay\Api\Utility::verifySignature * @covers \Razorpay\Api\Utility::hashEquals * @covers \Razorpay\Api\Errors\SignatureVerificationError */ public function testUtilityCoverage(){ $utility = new SignatureVerificationTest(); $utility->setup(); $utility->testPaymentVerification(); $utility->testPaymentLinkVerification(); $utility->testSubscriptionVerification(); } /** * @covers \Razorpay\Api\Order::create */ public function testSetHeaderJson() { $order = new ExceptionTest(); $order->setup(); $order->testCreateOrderSetHeaderException(); } /** * @covers \Razorpay\Api\Order::create */ public function testSendArrayPayload() { $order = new ExceptionTest(); $order->setup(); $order->testCreateOrderSuccess(); } } razorpay/src/Invoice.php 0000644 00000004503 15002216177 0011312 0 ustar 00 <?php namespace Razorpay\Api; use Requests; /** * Invoice entity gets used for both Payment Links and Invoices system. * Few of the methods are only meaningful for Invoices system and calling those * for against/for a Payment Link would throw Bad request error. */ class Invoice extends Entity { /** * Creates invoice of any type(invoice|link|ecod). * * @param array $attributes * * @return Invoice */ public function create($attributes = array()) { return parent::create($attributes); } /** * Fetches invoice entity with given id * * @param string $id * * @return Invoice */ public function fetch($id) { return parent::fetch($id); } /** * Fetches multiple invoices with given query options * * @param array $options * * @return Collection */ public function all($options = array()) { return parent::all($options); } /** * Cancels issued invoice * * @return Invoice */ public function cancel() { $url = $this->getEntityUrl() . $this->id . '/cancel'; return $this->request(Requests::POST, $url); } /** * Send/re-send notification for invoice by given medium * * @param $medium - sms|email * * @return array */ public function notifyBy($medium) { $url = $this->getEntityUrl() . $this->id . '/notify_by/' . $medium; $r = new Request(); return $r->request(Requests::POST, $url); } /** * Patches given invoice with new attributes * * @param array $attributes * * @return Invoice */ public function edit($attributes = array()) { $url = $this->getEntityUrl() . $this->id; return $this->request(Requests::PATCH, $url, $attributes); } /** * Issues drafted invoice * * @return Invoice */ public function issue() { $url = $this->getEntityUrl() . $this->id . '/issue'; return $this->request(Requests::POST, $url); } /** * Deletes drafted invoice * * @return Invoice */ public function delete() { $url = $this->getEntityUrl() . $this->id; $r = new Request(); return $r->request(Requests::DELETE, $url); } } razorpay/src/Settlement.php 0000644 00000004050 15002216177 0012037 0 ustar 00 <?php namespace Razorpay\Api; /** * Settlement related actions can be done from here */ class Settlement extends Entity { /** * create Ondemand Settlemententity * @param array $attributes * @return Settlement */ public function createOndemandSettlement($attributes = array()) { $relativeUrl = $this->getEntityUrl() ."ondemand" ; return $this->request('POST', $relativeUrl, $attributes); } /** * Fetch single settlement entity * @param string $id * @return Settlement */ public function fetch($id) { return parent::fetch($id); } /** * Get all settlements according to options * @param array $options * @return Collection */ public function all($options = array()) { return parent::all($options); } /** * Get combined report of settlements * @param array $options * @return array */ public function reports($options = array()) { $relativeUrl = $this->getEntityUrl() . 'report/combined'; return $this->request('GET', $relativeUrl, $options); } /** * Get Settlement Recon * @param array $options * @return array */ public function settlementRecon($options = array()) { $relativeUrl = $this->getEntityUrl() . 'recon/combined'; return $this->request('GET', $relativeUrl, $options); } /** * fetch Ondemand Settlement by Id * @param string $id * @param array $options * @return array */ public function fetchOndemandSettlementById($id, $options = array()) { $relativeUrl = $this->getEntityUrl(). "ondemand/" . $id; return $this->request('GET', $relativeUrl, $options); } /** * fetch all Ondemand Settlement * @return array */ public function fetchAllOndemandSettlement($options = array()) { $relativeUrl = $this->getEntityUrl(). "ondemand/"; return $this->request('GET', $relativeUrl, $options); } } razorpay/src/Order.php 0000644 00000002630 15002216177 0010770 0 ustar 00 <?php namespace Razorpay\Api; use Requests; class Order extends Entity { /** * @param $id Order id description */ public function create($attributes = array()) { $attributes = json_encode($attributes); Request::addHeader('Content-Type', 'application/json'); return parent::create($attributes); } public function fetch($id) { return parent::fetch($id); } public function all($options = array()) { return parent::all($options); } public function edit($attributes = array()) { $url = $this->getEntityUrl() . $this->id; return $this->request('PATCH', $url, $attributes); } public function payments() { $relativeUrl = $this->getEntityUrl().$this->id.'/payments'; return $this->request('GET', $relativeUrl); } public function transfers($options = array()) { $relativeUrl = $this->getEntityUrl().$this->id; return $this->request('GET', $relativeUrl, $options); } public function viewRtoReview() { $relativeUrl = $this->getEntityUrl(). $this->id .'/rto_review'; return $this->request('POST', $relativeUrl); } public function editFulfillment($attributes = array()) { $relativeUrl = $this->getEntityUrl(). $this->id .'/fulfillment'; return $this->request('POST', $relativeUrl, $attributes); } } razorpay/src/VirtualAccount.php 0000644 00000002523 15002216177 0012661 0 ustar 00 <?php namespace Razorpay\Api; class VirtualAccount extends Entity { public function create($attributes = array()) { return parent::create($attributes); } public function fetch($id) { return parent::fetch($id); } public function all($options = array()) { return parent::all($options); } public function close() { $relativeUrl = $this->getEntityUrl() . $this->id . '/close'; return $this->request('POST', $relativeUrl); } public function payments($options = array()) { $relativeUrl = $this->getEntityUrl() . $this->id . '/payments'; return $this->request('GET', $relativeUrl, $options); } public function addReceiver($attributes = array()) { $relativeUrl = $this->getEntityUrl() . $this->id . '/receivers'; return $this->request('POST', $relativeUrl, $attributes); } public function addAllowedPayer($attributes = array()) { $relativeUrl = $this->getEntityUrl() . $this->id . '/allowed_payers'; return $this->request('POST', $relativeUrl, $attributes); } public function deleteAllowedPayer($allowedPlayerId) { $relativeUrl = $this->getEntityUrl() . $this->id . '/allowed_payers/'.$allowedPlayerId; return $this->request('DELETE', $relativeUrl); } } razorpay/src/Resource.php 0000644 00000002206 15002216177 0011503 0 ustar 00 <?php namespace Razorpay\Api; use ArrayAccess; use ArrayIterator; use IteratorAggregate; class Resource implements ArrayAccess, IteratorAggregate { protected $attributes = array(); #[\ReturnTypeWillChange] public function getIterator() { return new ArrayIterator($this->attributes); } public function offsetExists($offset): bool { return (isset($this->attributes[$offset])); } public function offsetSet($offset, $value): void { $this->attributes[$offset] = $value; } #[\ReturnTypeWillChange] public function offsetGet($offset) { return $this->attributes[$offset]; } public function offsetUnset($offset): void { unset($this->attributes[$offset]); } public function __get($key) { return $this->attributes[$key]; } public function __set($key, $value) { return $this->attributes[$key] = $value; } public function __isset($key) { return (isset($this->attributes[$key])); } public function __unset($key) { unset($this->attributes[$key]); } } razorpay/src/Token.php 0000644 00000002745 15002216177 0011004 0 ustar 00 <?php namespace Razorpay\Api; class Token extends Entity { public function create($attributes = array()) { $url = $this->getEntityUrl(); return $this->request('POST', $url, $attributes); } /** * @param $id Token id */ public function fetch($id) { $relativeUrl = 'customers/'.$this->customer_id.'/'.$this->getEntityUrl().$id; return $this->request('GET', $relativeUrl); } public function fetchCardPropertiesByToken($attributes = array()) { $relativeUrl = $this->getEntityUrl(). '/fetch'; return $this->request('POST', $relativeUrl, $attributes); } public function all($options = array()) { $relativeUrl = 'customers/'.$this->customer_id.'/'.$this->getEntityUrl(); return $this->request('GET', $relativeUrl, $options); } public function delete($id) { $relativeUrl = 'customers/'.$this->customer_id.'/'.$this->getEntityUrl().$id; return $this->request('DELETE', $relativeUrl); } public function deleteToken($attributes = array()) { $relativeUrl = $this->getEntityUrl(). '/delete'; return $this->request('POST', $relativeUrl, $attributes); } public function processPaymentOnAlternatePAorPG($attributes = array()) { $relativeUrl = $this->getEntityUrl().'service_provider_tokens/token_transactional_data'; return $this->request('POST', $relativeUrl, $attributes); } } razorpay/src/Errors/ServerError.php 0000644 00000000112 15002216177 0013442 0 ustar 00 <?php namespace Razorpay\Api\Errors; class ServerError extends Error { } razorpay/src/Errors/ErrorCode.php 0000644 00000000610 15002216177 0013051 0 ustar 00 <?php namespace Razorpay\Api\Errors; class ErrorCode { const BAD_REQUEST_ERROR = 'BAD_REQUEST_ERROR'; const SERVER_ERROR = 'SERVER_ERROR'; const GATEWAY_ERROR = 'GATEWAY_ERROR'; public static function exists($code) { $code = strtoupper($code); return defined(get_class() . '::' . $code); } } razorpay/src/Errors/BadRequestError.php 0000644 00000000561 15002216177 0014243 0 ustar 00 <?php namespace Razorpay\Api\Errors; class BadRequestError extends Error { protected $field = null; public function __construct($message, $code, $httpStatusCode, $field = null) { parent::__construct($message, $code, $httpStatusCode); $this->field = $field; } public function getField() { return $this->field; } } razorpay/src/Errors/SignatureVerificationError.php 0000644 00000000155 15002216177 0016507 0 ustar 00 <?php namespace Razorpay\Api\Errors; use Exception; class SignatureVerificationError extends Exception { } razorpay/src/Errors/GatewayError.php 0000644 00000000113 15002216177 0013576 0 ustar 00 <?php namespace Razorpay\Api\Errors; class GatewayError extends Error { } razorpay/src/Errors/Error.php 0000644 00000000624 15002216177 0012263 0 ustar 00 <?php namespace Razorpay\Api\Errors; use Exception; class Error extends Exception { protected $httpStatusCode; public function __construct($message, $code, $httpStatusCode) { $this->code = $code; $this->message = $message; $this->httpStatusCode = $httpStatusCode; } public function getHttpStatusCode() { return $this->httpStatusCode; } } razorpay/src/Document.php 0000644 00000000461 15002216177 0011473 0 ustar 00 <?php namespace Razorpay\Api; class Document extends Entity { public function create($attributes = array()) { $attributes = $this->setFile($attributes); return parent::create($attributes); } public function fetch($id) { return parent::fetch($id); } } razorpay/src/Addon.php 0000644 00000001054 15002216177 0010741 0 ustar 00 <?php namespace Razorpay\Api; class Addon extends Entity { // To create an Addon, // use the createAddon method of the Subscription class public function fetch($id) { return parent::fetch($id); } public function delete() { $entityUrl = $this->getEntityUrl(); return $this->request('DELETE', $entityUrl . $this->id); } public function fetchAll($attributes = array()) { $entityUrl = $this->getEntityUrl(); return $this->request('GET', $entityUrl , $attributes); } } razorpay/src/Request.php 0000644 00000014023 15002216177 0011344 0 ustar 00 <?php namespace Razorpay\Api; use Requests; use Exception; use Requests_Hooks; use Razorpay\Api\Errors; use Razorpay\Api\Errors\ErrorCode; // Available since PHP 5.5.19 and 5.6.3 // https://git.io/fAMVS | https://secure.php.net/manual/en/curl.constants.php if (defined('CURL_SSLVERSION_TLSv1_1') === false) { define('CURL_SSLVERSION_TLSv1_1', 5); } /** * Request class to communicate to the request libarary */ class Request { /** * Headers to be sent with every http request to the API * @var array */ protected static $headers = array( 'Razorpay-API' => 1 ); /** * Fires a request to the API * @param string $method HTTP Verb * @param string $url Relative URL for the request * @param array $data Data to be passed along the request * @param array $additionHeader headers to be passed along the request * @param string $apiVersion version to be passed along the request * @return array Response data in array format. Not meant * to be used directly */ public function request($method, $url, $data = array(), $apiVersion = "v1") { $url = Api::getFullUrl($url, $apiVersion); $hooks = new Requests_Hooks(); $hooks->register('curl.before_send', array($this, 'setCurlSslOpts')); $options = array( 'auth' => array(Api::getKey(), Api::getSecret()), 'hook' => $hooks, 'timeout' => 60 ); $headers = $this->getRequestHeaders(); $response = Requests::request($url, $headers, $data, $method, $options); $this->checkErrors($response); return json_decode($response->body, true); } public function setCurlSslOpts($curl) { curl_setopt($curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_1); } /** * Adds an additional header to all API requests * @param string $key Header key * @param string $value Header value * @return null */ public static function addHeader($key, $value) { self::$headers[$key] = $value; } /** * Returns all headers attached so far * @return array headers */ public static function getHeaders() { return self::$headers; } /** * Process the statusCode of the response and throw exception if necessary * @param Object $response The response object returned by Requests */ protected function checkErrors($response) { $body = $response->body; $httpStatusCode = $response->status_code; try { $body = json_decode($response->body, true); } catch (Exception $e) { $this->throwServerError($body, $httpStatusCode); } if (($httpStatusCode < 200) or ($httpStatusCode >= 300)) { $this->processError($body, $httpStatusCode, $response); } } protected function processError($body, $httpStatusCode, $response) { $this->verifyErrorFormat($body, $httpStatusCode); $code = $body['error']['code']; // We are basically converting the error code to the Error class name // Replace underscores with space // Lowercase the words, capitalize first letter of each word // Remove spaces $error = str_replace('_', ' ', $code); $error = ucwords(strtolower($error)); $error = str_replace(' ', '', $error); // Add namespace // This is the fully qualified error class name $error = __NAMESPACE__.'\Errors\\' . $error; $description = $body['error']['description']; $field = null; if (isset($body['error']['field'])) { $field = $body['error']['field']; // Create an instance of the error and then throw it throw new $error($description, $code, $httpStatusCode, $field); } throw new $error($description, $code, $httpStatusCode); } protected function throwServerError($body, $httpStatusCode) { $description = "The server did not send back a well-formed response. " . PHP_EOL . "Server Response: $body"; throw new Errors\ServerError( $description, ErrorCode::SERVER_ERROR, $httpStatusCode); } protected function getRequestHeaders() { $uaHeader = array( 'User-Agent' => $this->constructUa() ); $headers = array_merge(self::$headers, $uaHeader); return $headers; } protected function constructUa() { $ua = 'Razorpay/v1 PHPSDK/' . Api::VERSION . ' PHP/' . phpversion(); $ua .= ' ' . $this->getAppDetailsUa(); return $ua; } protected function getAppDetailsUa() { $appsDetails = Api::$appsDetails; $appsDetailsUa = ''; foreach ($appsDetails as $app) { if ((isset($app['title'])) and (is_string($app['title']))) { $appUa = $app['title']; if ((isset($app['version'])) and (is_scalar($app['version']))) { $appUa .= '/' . $app['version']; } $appsDetailsUa .= $appUa . ' '; } } return $appsDetailsUa; } /** * Verifies error is in proper format. If not then * throws ServerErrorException * * @param array $body * @param int $httpStatusCode * @return void */ protected function verifyErrorFormat($body, $httpStatusCode) { if (is_array($body) === false) { $this->throwServerError($body, $httpStatusCode); } if ((isset($body['error']) === false) or (isset($body['error']['code']) === false)) { $this->throwServerError($body, $httpStatusCode); } $code = $body['error']['code']; if (Errors\ErrorCode::exists($code) === false) { $this->throwServerError($body, $httpStatusCode); } } } razorpay/src/Product.php 0000644 00000001617 15002216177 0011341 0 ustar 00 <?php namespace Razorpay\Api; class Product extends Entity { public function requestProductConfiguration($attributes = array()) { $url = 'accounts/'.$this->account_id .'/'.$this->getEntityUrl(); return $this->request('POST', $url, $attributes, 'v2'); } public function fetch($id) { $entityUrl = 'accounts/'.$this->account_id .'/'.$this->getEntityUrl().'/'.$id; return $this->request('GET', $entityUrl, null, 'v2'); } public function edit($id, $attributes = array()) { $entityUrl = 'accounts/'.$this->account_id .'/'.$this->getEntityUrl().'/'.$id; return $this->request('PATCH', $entityUrl, $attributes, 'v2'); } public function fetchTnc($product_name) { $entityUrl = $this->getEntityUrl().'/'.$product_name.'/tnc'; return $this->request('GET', $entityUrl,null , 'v2'); } } razorpay/src/Card.php 0000644 00000000602 15002216177 0010563 0 ustar 00 <?php namespace Razorpay\Api; class Card extends Entity { /** * @param $id Card id */ public function fetch($id) { return parent::fetch($id); } public function requestCardReference($attributes = array()) { $entityUrl = $this->getEntityUrl() . '/fingerprints'; return $this->request('POST', $entityUrl, $attributes); } } razorpay/src/Entity.php 0000644 00000013660 15002216177 0011176 0 ustar 00 <?php namespace Razorpay\Api; use Razorpay\Api\Errors; class Entity extends Resource implements ArrayableInterface { protected $attributes = array(); /** * Create method * * @param array $attributes * */ protected function create($attributes = null) { $entityUrl = $this->getEntityUrl(); return $this->request('POST', $entityUrl, $attributes); } protected function fetch($id) { $entityUrl = $this->getEntityUrl(); $this->validateIdPresence($id); $relativeUrl = $entityUrl . $id; return $this->request('GET', $relativeUrl); } protected function validateIdPresence($id) { if ($id !== null) { return; } $path = explode('\\', get_class($this)); $class = strtolower(array_pop($path)); $message = 'The ' . $class . ' id provided is null'; $code = Errors\ErrorCode::BAD_REQUEST_ERROR; throw new Errors\BadRequestError($message, $code, 500); } protected function all($options = array()) { $entityUrl = $this->getEntityUrl(); return $this->request('GET', $entityUrl, $options); } protected function getEntityUrl() { $fullClassName = get_class($this); $pos = strrpos($fullClassName, '\\'); $className = substr($fullClassName, $pos + 1); $className = $this->snakeCase($className); return $className.'s/'; } protected function snakeCase($input) { $delimiter = '_'; $output = preg_replace('/\s+/u', '', ucwords($input)); $output = preg_replace('/(.)(?=[A-Z])/u', '$1'.$delimiter, $output); $output = strtolower($output); return $output; } /** * Makes a HTTP request using Request class and assuming the API returns * formatted entity or collection result, wraps the returned JSON as entity * and returns. * * @param string $method * @param string $relativeUrl * @param array $data * @param array $additionHeader * @param string $apiVersion * * @return Entity */ protected function request($method, $relativeUrl, $data = null, $apiVersion = "v1") { $request = new Request(); $response = $request->request($method, $relativeUrl, $data, $apiVersion); if ((isset($response['entity'])) and ($response['entity'] == $this->getEntity())) { $this->fill($response); return $this; } else { return static::buildEntity($response); } } /** * Given the JSON response of an API call, wraps it to corresponding entity * class or a collection and returns the same. * * @param array $data * * @return Entity */ protected static function buildEntity($data) { $entities = static::getDefinedEntitiesArray(); if (isset($data['entity'])) { if (in_array($data['entity'], $entities)) { $class = static::getEntityClass($data['entity']); $entity = new $class; } else { $entity = new static; } } else { $entity = new static; } $entity->fill($data); return $entity; } protected static function getDefinedEntitiesArray() { return array( 'collection', 'payment', 'refund', 'order', 'customer', 'token', 'settlement'); } protected static function getEntityClass($name) { return __NAMESPACE__.'\\'.ucfirst($name); } protected function getEntity() { $class = get_class($this); $pos = strrpos($class, '\\'); $entity = strtolower(substr($class, $pos)); return $entity; } public function fill($data) { $attributes = array(); if(is_array($data)) { foreach ($data as $key => $value) { if (is_array($value)) { if (static::isAssocArray($value) === false) { $collection = array(); foreach ($value as $v) { if (is_array($v)) { $entity = static::buildEntity($v); array_push($collection, $entity); } else { array_push($collection, $v); } } $value = $collection; } else { $value = static::buildEntity($value); } } $attributes[$key] = $value; } } $this->attributes = $attributes; } public static function isAssocArray($arr) { return array_keys($arr) !== range(0, count($arr) - 1); } public function toArray() { return $this->convertToArray($this->attributes); } protected function convertToArray($attributes) { $array = $attributes; foreach ($attributes as $key => $value) { if (is_object($value)) { $array[$key] = $value->toArray(); } else if (is_array($value) and self::isAssocArray($value) == false) { $array[$key] = $this->convertToArray($value); } } return $array; } public function setFile($attributes) { if(isset($attributes['file'])){ $attributes['file'] = new \CURLFILE( $attributes['file'], mime_content_type($attributes['file']) ); } return $attributes; } } razorpay/src/PaymentPage.php 0000644 00000001106 15002216177 0012124 0 ustar 00 <?php namespace Razorpay\Api; class PaymentPage extends Entity { public function fetch($id) { return parent::fetch($id); } public function all($options = array()) { return parent::all($options); } public function activate($id) { $relativeUrl = $this->getEntityUrl() . $id . '/activate'; return $this->request('PATCH', $relativeUrl); } public function deactivate($id) { $relativeUrl = $this->getEntityUrl() . $id . '/deactivate'; return $this->request('PATCH', $relativeUrl); } } razorpay/src/Subscription.php 0000644 00000004306 15002216177 0012403 0 ustar 00 <?php namespace Razorpay\Api; class Subscription extends Entity { public function create($attributes = array()) { return parent::create($attributes); } public function fetch($id) { return parent::fetch($id); } public function all($options = array()) { return parent::all($options); } public function cancel($attributes = array()) { $relativeUrl = $this->getEntityUrl() . $this->id . '/cancel'; return $this->request('POST', $relativeUrl, $attributes); } public function createAddon($attributes = array()) { $relativeUrl = $this->getEntityUrl() . $this->id . '/addons'; return $this->request('POST', $relativeUrl, $attributes); } /** * Create a Registration Link * @param array $attributes * @return array */ public function createSubscriptionRegistration($attributes = array()) { $relativeUrl = 'subscription_registration/auth_links'; return $this->request('POST', $relativeUrl, $attributes); } public function update($attributes = array()) { $relativeUrl = $this->getEntityUrl() . $this->id; return $this->request('PATCH', $relativeUrl, $attributes); } public function pendingUpdate() { $relativeUrl = $this->getEntityUrl() . $this->id . '/retrieve_scheduled_changes'; return $this->request('GET', $relativeUrl, null); } public function cancelScheduledChanges() { $relativeUrl = $this->getEntityUrl() . $this->id . '/cancel_scheduled_changes'; return $this->request('POST', $relativeUrl, null); } public function pause($attributes = array()) { $relativeUrl = $this->getEntityUrl() . $this->id.'/pause'; return $this->request('POST', $relativeUrl, $attributes); } public function resume($attributes = array()) { $relativeUrl = $this->getEntityUrl() . $this->id.'/resume'; return $this->request('POST', $relativeUrl, $attributes); } public function deleteOffer($offerId) { $relativeUrl = $this->getEntityUrl() . $this->id.'/'.$offerId; return $this->request('DELETE', $relativeUrl); } } razorpay/src/Collection.php 0000644 00000000464 15002216177 0012013 0 ustar 00 <?php namespace Razorpay\Api; use Countable; class Collection extends Entity implements Countable { public function count():int { $count = 0; if (isset($this->attributes['count'])) { return $this->attributes['count']; } return $count; } } razorpay/src/Plan.php 0000644 00000000525 15002216177 0010610 0 ustar 00 <?php namespace Razorpay\Api; class Plan extends Entity { public function create($attributes = array()) { return parent::create($attributes); } public function fetch($id) { return parent::fetch($id); } public function all($options = array()) { return parent::all($options); } } razorpay/src/Webhook.php 0000644 00000003371 15002216177 0011316 0 ustar 00 <?php namespace Razorpay\Api; use Requests; class Webhook extends Entity { /** * @param $id webhook id description */ public function create($attributes = array()) { if(isset($this->account_id)) { $url = 'accounts/'. $this->account_id . '/' .$this->getEntityUrl(); return $this->request('POST', $url, $attributes, 'v2'); } return parent::create($attributes); } public function fetch($id) { if(isset($this->account_id)) { $url = 'accounts/'. $this->account_id . '/' .$this->getEntityUrl() . $id; return $this->request('GET', $url, null, 'v2'); } return parent::fetch($id); } public function all($options = array()) { if(isset($this->account_id)) { $url = 'accounts/'. $this->account_id . '/' .$this->getEntityUrl(); return $this->request('GET', $url, $options, 'v2'); } return parent::all($options); } /** * Patches given webhook with new attributes * * @param array $attributes * @param string $id * @return Webhook */ public function edit($attributes, $id) { $url = $this->getEntityUrl() . $id; if(isset($this->account_id)) { $url = 'accounts/'.$this->account_id .'/'. $url; return $this->request('PATCH', $url, $attributes, 'v2'); } return $this->request(Requests::PUT, $url, $attributes); } public function delete($id) { $url = 'accounts/'. $this->account_id . '/' .$this->getEntityUrl(). $id; return $this->request('DELETE', $url, null, 'v2'); } } razorpay/src/Dispute.php 0000644 00000001275 15002216177 0011336 0 ustar 00 <?php namespace Razorpay\Api; class Dispute extends Entity { public function create($attributes = array()) { return parent::create($attributes); } public function fetch($id) { return parent::fetch($id); } public function all($options = array()) { return parent::all($options); } public function accept() { $entityUrl = $this->getEntityUrl(). $this->id. '/accept'; return $this->request('POST', $entityUrl); } public function contest($attributes = array()) { $entityUrl = $this->getEntityUrl(). $this->id. '/contest'; return $this->request('PATCH', $entityUrl, $attributes); } } razorpay/src/Refund.php 0000644 00000001360 15002216177 0011137 0 ustar 00 <?php namespace Razorpay\Api; class Refund extends Entity { /** * @param $id Refund id */ public function fetch($id) { return parent::fetch($id); } public function create($attributes = array()) { return parent::create($attributes); } public function all($options = array()) { return parent::all($options); } public function edit($attributes = array()) { $url = $this->getEntityUrl() . $this->id; return $this->request('PATCH', $url, $attributes); } public function refund($options = array()) { $relativeUrl = $this->getEntityUrl() . $this->id . '/refund'; return $this->request('POST', $relativeUrl, $options); } } razorpay/src/Stakeholder.php 0000644 00000002631 15002216177 0012163 0 ustar 00 <?php namespace Razorpay\Api; class Stakeholder extends Entity { public function create($attributes = array()) { $url = 'accounts/'.$this->account_id .'/'.$this->getEntityUrl(); return $this->request('POST', $url, $attributes, 'v2'); } public function fetch($id) { $entityUrl = 'accounts/'.$this->account_id .'/'.$this->getEntityUrl().'/'.$id; return $this->request('GET', $entityUrl, null, 'v2'); } public function all($options = array()) { $relativeUrl = 'accounts/'.$this->account_id.'/'.$this->getEntityUrl(); return $this->request('GET', $relativeUrl, $options, 'v2'); } public function edit($id, $attributes = array()) { $entityUrl = 'accounts/'.$this->account_id .'/'.$this->getEntityUrl().'/'.$id; return $this->request('PATCH', $entityUrl, $attributes, 'v2'); } public function uploadStakeholderDoc($id, $attributes = array()) { $attributes = $this->setFile($attributes); $entityUrl = 'accounts/'.$this->account_id .'/'.$this->getEntityUrl().'/'.$id.'/documents'; return $this->request('POST', $entityUrl, $attributes, 'v2'); } public function fetchStakeholderDoc($id) { $entityUrl = 'accounts/'.$this->account_id .'/'.$this->getEntityUrl().'/'.$id.'/documents'; return $this->request('GET', $entityUrl, null, 'v2'); } } razorpay/src/Payment.php 0000644 00000012237 15002216177 0011336 0 ustar 00 <?php namespace Razorpay\Api; use Requests; class Payment extends Entity { /** * @param $id Payment id */ public function fetch($id) { return parent::fetch($id); } public function all($options = array()) { if(isset($options['X-Razorpay-Account'])){ Request::addHeader('X-Razorpay-Account', $options['X-Razorpay-Account']); unset($options['X-Razorpay-Account']); } return parent::all($options); } /** * Patches given payment with new attributes * * @param array $attributes * * @return Payment */ public function edit($attributes = array()) { $url = $this->getEntityUrl() . $this->id; return $this->request(Requests::PATCH, $url, $attributes); } /** * @param $id Payment id */ public function refund($attributes = array()) { $refund = new Refund; $attributes = array_merge($attributes, array('payment_id' => $this->id)); return $refund->create($attributes); } /** * @param $id Payment id */ public function capture($attributes = array()) { $relativeUrl = $this->getEntityUrl() . $this->id . '/capture'; return $this->request('POST', $relativeUrl, $attributes); } public function transfer($attributes = array()) { $relativeUrl = $this->getEntityUrl() . $this->id . '/transfers'; return $this->request('POST', $relativeUrl, $attributes); } public function refunds() { $refund = new Refund; $options = array('payment_id' => $this->id); return $refund->all($options); } public function transfers() { $transfer = new Transfer(); $transfer->payment_id = $this->id; return $transfer->all(); } public function bankTransfer() { $relativeUrl = $this->getEntityUrl() . $this->id . '/bank_transfer'; return $this->request('GET', $relativeUrl); } public function fetchMultipleRefund($options = array()) { $relativeUrl = $this->getEntityUrl() . $this->id . '/refunds'; return $this->request('GET', $relativeUrl, $options); } public function fetchRefund($refundId) { $relativeUrl = $this->getEntityUrl() . $this->id . '/refunds/'.$refundId; return $this->request('GET', $relativeUrl); } public function createRecurring($attributes = array()) { $relativeUrl = $this->getEntityUrl() . 'create/recurring'; return $this->request('POST', $relativeUrl, $attributes); } /** * fetch Card Details * * @param id $id * * @return card */ public function fetchCardDetails() { $relativeUrl = $this->getEntityUrl() . $this->id . '/card'; return $this->request('GET', $relativeUrl); } /** * fetchPaymentDowntime * */ public function fetchPaymentDowntime() { $relativeUrl = $this->getEntityUrl() . 'downtimes'; return $this->request('GET', $relativeUrl); } /** * fetch Payment Downtime Id * * @param id $id * * @return card */ public function fetchPaymentDowntimeById($id) { $relativeUrl = $this->getEntityUrl() . 'downtimes' . $id; return $this->request('GET', $relativeUrl); } /** * create Payment Json * * @param array $attributes */ public function createPaymentJson($attributes = array()) { $relativeUrl = $this->getEntityUrl() . 'create/json'; return $this->request('POST', $relativeUrl, $attributes); } /** * Submit otp * * @param id $id * * @param array $attributes */ public function otpSubmit($attributes = array()) { $relativeUrl = $this->getEntityUrl(). $this->id . '/otp/submit'; return $this->request('POST', $relativeUrl, $attributes); } /** * Generate otp * * @param id $id * * @param array $attributes */ public function otpGenerate($id) { $relativeUrl = $this->getEntityUrl(). $id . '/otp_generate'; return $this->request('POST', $relativeUrl); } /** * Resend otp * * @param id $id * * @param array $attributes */ public function otpResend() { $relativeUrl = $this->getEntityUrl(). $this->id . '/otp/resend'; return $this->request('POST', $relativeUrl); } public function createUpi($attributes = array()) { $relativeUrl = $this->getEntityUrl() . 'create/upi'; return $this->request('POST', $relativeUrl, $attributes); } public function validateVpa($attributes = array()) { $relativeUrl = $this->getEntityUrl() . 'validate/vpa'; return $this->request('POST', $relativeUrl, $attributes); } public function fetchPaymentMethods() { $relativeUrl = 'methods'; return $this->request('GET', $relativeUrl); } public function expandedDetails($options = array()) { $relativeUrl = $this->getEntityUrl(). $this->id; return $this->request('GET', $relativeUrl, $options); } } razorpay/src/Item.php 0000644 00000001216 15002216177 0010612 0 ustar 00 <?php namespace Razorpay\Api; class Item extends Entity { public function create($attributes = array()) { return parent::create($attributes); } public function fetch($id) { return parent::fetch($id); } public function edit($attributes = array()) { $url = $this->getEntityUrl() . $this->id; return $this->request('PATCH', $url, $attributes); } public function all($options = array()) { return parent::all($options); } public function delete() { $url = $this->getEntityUrl() . $this->id; return $this->request('DELETE', $url); } } razorpay/src/Account.php 0000644 00000003174 15002216177 0011315 0 ustar 00 <?php namespace Razorpay\Api; class Account extends Entity { public function create($attributes = array()) { $entityUrl = $this->getEntityUrl(); return $this->request('POST', $entityUrl, $attributes, 'v2'); } public function fetch($id) { $entityUrl = $this->getEntityUrl(); return $this->request('GET', $entityUrl . $id, null, 'v2'); } public function delete() { $entityUrl = $this->getEntityUrl(); return $this->request('DELETE', $entityUrl . $this->id, null, 'v2'); } public function edit($attributes = array()) { $url = $this->getEntityUrl() . $this->id; return $this->request('PATCH', $url, $attributes, 'v2'); } public function stakeholders() { $stakeholder = new Stakeholder(); $stakeholder['account_id'] = $this->id; return $stakeholder; } public function products() { $product = new Product(); $product['account_id'] = $this->id; return $product; } public function webhooks() { $webhook = new Webhook(); $webhook['account_id'] = $this->id; return $webhook; } public function uploadAccountDoc($attributes = array()) { $attributes = $this->setFile($attributes); $entityUrl = $this->getEntityUrl() .$this->id .'/documents'; return $this->request('POST', $entityUrl, $attributes, 'v2'); } public function fetchAccountDoc() { $entityUrl = $this->getEntityUrl() .$this->id .'/documents'; return $this->request('GET', $entityUrl, null, 'v2'); } } razorpay/src/QrCode.php 0000644 00000002735 15002216177 0011100 0 ustar 00 <?php namespace Razorpay\Api; class QrCode extends Entity { /** * Create QR code * @param array $attributes * @return Entity|QrCode */ public function create($attributes = array()) { $relativeUrl = "payments/". $this->getEntityUrl() ; return $this->request('POST', $relativeUrl, $attributes); } /** * Fetch QR code details based QR id * @param $id * @return Entity|QrCode */ public function fetch($id) { $relativeUrl = "payments/". $this->getEntityUrl(). $id ; return $this->request('GET', $relativeUrl); } /** * Close the QR code based on id * @return Entity|QrCode */ public function close() { $relativeUrl = "payments/{$this->getEntityUrl()}{$this->id}/close" ; return $this->request('POST', $relativeUrl); } /** * Fetch all QR code details * @param array $options * @return Entity|QrCode */ public function all($options = array()) { $relativeUrl = "payments/". $this->getEntityUrl(); return $this->request('GET', $relativeUrl, $options); } /** * Fetch payments made to a QR Code based on QR id * @param array $options * @return Entity|QrCode */ public function fetchAllPayments($options = array()) { $relativeUrl = "payments/{$this->getEntityUrl()}{$this->id}/payments" ; return $this->request('GET', $relativeUrl, $options); } } razorpay/src/FundAccount.php 0000644 00000001012 15002216177 0012117 0 ustar 00 <?php namespace Razorpay\Api; use Requests; class FundAccount extends Entity { /** * Create a Fund Account . * * @param array $attributes * * @return FundAccount */ public function create($attributes = array()) { return parent::create($attributes); } /** * Fetch all Fund Accounts * * @param array $options * * @return Collection */ public function all($options = array()) { return parent::all($options); } } razorpay/src/Transfer.php 0000644 00000002642 15002216177 0011504 0 ustar 00 <?php namespace Razorpay\Api; class Transfer extends Entity { /** * @param $id Transfer ID */ public function fetch($id) { return parent::fetch($id); } public function all($options = array()) { if (isset($this->payment_id) === true) { $relativeUrl = 'payments/' . $this->payment_id. '/transfers'; return $this->request('GET', $relativeUrl, $options); } return parent::all($options); } /** * Create a direct transfer from merchant's account to * any of the linked accounts, without linking it to a * payment */ public function create($attributes = array()) { return parent::create($attributes); } public function edit($attributes = null) { $entityUrl = $this->getEntityUrl() . $this->id; return $this->request('PATCH', $entityUrl, $attributes); } /** * Create a reversal for a transfer */ public function reverse($attributes = array()) { $relativeUrl = $this->getEntityUrl() . $this->id . '/reversals'; return $this->request('POST', $relativeUrl, $attributes); } /** * Fetches all reversals */ public function reversals($attributes = array()) { $relativeUrl = $this->getEntityUrl() . $this->id . '/reversals'; return $this->request('GET', $relativeUrl, $attributes); } } razorpay/src/Api.php 0000644 00000003230 15002216177 0010423 0 ustar 00 <?php namespace Razorpay\Api; class Api { protected static $baseUrl = 'https://api.razorpay.com'; protected static $key = null; protected static $secret = null; /* * App info is to store the Plugin/integration * information */ public static $appsDetails = array(); const VERSION = '2.9.0'; /** * @param string $key * @param string $secret */ public function __construct($key, $secret) { self::$key = $key; self::$secret = $secret; } /* * Set Headers */ public function setHeader($header, $value) { Request::addHeader($header, $value); } public function setAppDetails($title, $version = null) { $app = array( 'title' => $title, 'version' => $version ); array_push(self::$appsDetails, $app); } public function getAppsDetails() { return self::$appsDetails; } public function setBaseUrl($baseUrl) { self::$baseUrl = $baseUrl; } /** * @param string $name * @return mixed */ public function __get($name) { $className = __NAMESPACE__.'\\'.ucwords($name); $entity = new $className(); return $entity; } public static function getBaseUrl() { return self::$baseUrl; } public static function getKey() { return self::$key; } public static function getSecret() { return self::$secret; } public static function getFullUrl($relativeUrl, $apiVersion = "v1") { return self::getBaseUrl() . "/". $apiVersion . "/". $relativeUrl; } } razorpay/src/ArrayableInterface.php 0000644 00000000261 15002216177 0013436 0 ustar 00 <?php namespace Razorpay\Api; interface ArrayableInterface { /** * Get the instance as an array. * * @return array */ public function toArray(); } razorpay/src/PaymentLink.php 0000644 00000003367 15002216177 0012160 0 ustar 00 <?php namespace Razorpay\Api; use Requests; class PaymentLink extends Entity { /** * Creates Payment link . * * @param array $attributes * * @return PaymentLink */ public function create($attributes = array()) { $attributes = json_encode($attributes); Request::addHeader('Content-Type', 'application/json'); return parent::create($attributes); } /** * Fetches Payment link entity with given id * * @param string $id * * @return PaymentLink */ public function fetch($id) { return parent::fetch($id); } /** * Fetches multiple Payment link with given query options * * @param array $options * * @return Collection */ public function all($options = array()) { return parent::all($options); } /** * Cancels Payment link * * @return PaymentLink */ public function cancel() { $url = $this->getEntityUrl() . $this->id . '/cancel'; return $this->request(Requests::POST, $url); } public function edit($attributes = array()) { $relativeUrl = $this->getEntityUrl() . $this->id; $attributes = json_encode($attributes); Request::addHeader('Content-Type', 'application/json'); return $this->request('PATCH', $relativeUrl, $attributes); } /** * Send/re-send notification with short url by given medium * * @param $medium - sms|email * * @return array */ public function notifyBy($medium) { $url = $this->getEntityUrl() . $this->id . '/notify_by/' . $medium; $r = new Request(); return $r->request(Requests::POST, $url); } } razorpay/src/Iin.php 0000644 00000000474 15002216177 0010440 0 ustar 00 <?php namespace Razorpay\Api; class Iin extends Entity { public function fetch($id) { return parent::fetch($id); } public function all($options = array()) { $relativeUrl = $this->getEntityUrl(). 'list'; return $this->request('GET', $relativeUrl, $options); } } razorpay/src/Utility.php 0000644 00000005206 15002216177 0011362 0 ustar 00 <?php namespace Razorpay\Api; class Utility { const SHA256 = 'sha256'; public function verifyPaymentSignature($attributes) { $actualSignature = $attributes['razorpay_signature']; $paymentId = $attributes['razorpay_payment_id']; if (isset($attributes['razorpay_order_id']) === true) { $orderId = $attributes['razorpay_order_id']; $payload = $orderId . '|' . $paymentId; } else if (isset($attributes['razorpay_subscription_id']) === true) { $subscriptionId = $attributes['razorpay_subscription_id']; $payload = $paymentId . '|' . $subscriptionId; } else if (isset($attributes['razorpay_payment_link_id']) === true) { $paymentLinkId = $attributes['razorpay_payment_link_id']; $paymentLinkRefId = $attributes['razorpay_payment_link_reference_id']; $paymentLinkStatus = $attributes['razorpay_payment_link_status']; $payload = $paymentLinkId . '|'. $paymentLinkRefId . '|' . $paymentLinkStatus . '|' . $paymentId; } else { throw new Errors\SignatureVerificationError( 'Either razorpay_order_id or razorpay_subscription_id or razorpay_payment_link_id must be present.'); } $secret = Api::getSecret(); self::verifySignature($payload, $actualSignature, $secret); } public function verifyWebhookSignature($payload, $actualSignature, $secret) { self::verifySignature($payload, $actualSignature, $secret); } public function verifySignature($payload, $actualSignature, $secret) { $expectedSignature = hash_hmac(self::SHA256, $payload, $secret); // Use lang's built-in hash_equals if exists to mitigate timing attacks if (function_exists('hash_equals')) { $verified = hash_equals($expectedSignature, $actualSignature); } else { $verified = $this->hashEquals($expectedSignature, $actualSignature); } if ($verified === false) { throw new Errors\SignatureVerificationError( 'Invalid signature passed'); } } private function hashEquals($expectedSignature, $actualSignature) { if (strlen($expectedSignature) === strlen($actualSignature)) { $res = $expectedSignature ^ $actualSignature; $return = 0; for ($i = strlen($res) - 1; $i >= 0; $i--) { $return |= ord($res[$i]); } return ($return === 0); } return false; } } razorpay/src/Customer.php 0000644 00000002740 15002216177 0011520 0 ustar 00 <?php namespace Razorpay\Api; class Customer extends Entity { /** * @param $id Customer id description */ public function fetch($id) { return parent::fetch($id); } public function all($options = array()) { return parent::all($options); } public function create($attributes = array()) { return parent::create($attributes); } public function edit($attributes = null) { $entityUrl = $this->getEntityUrl().$this->id; return $this->request('PUT', $entityUrl, $attributes); } public function tokens() { $token = new Token(); $token['customer_id'] = $this->id; return $token; } public function addBankAccount($attributes = array()) { $entityUrl = $this->getEntityUrl().$this->id. '/bank_account'; return $this->request('POST', $entityUrl, $attributes); } public function deleteBankAccount($bank_id) { $entityUrl = $this->getEntityUrl() . $this->id. '/bank_account/'. $bank_id; return $this->request('DELETE', $entityUrl); } public function requestEligibilityCheck($attributes = array()) { $entityUrl = $this->getEntityUrl(). '/eligibility'; return $this->request('POST', $entityUrl, $attributes); } public function fetchEligibility($id) { $entityUrl = $this->getEntityUrl(). '/eligibility/'. $id; return $this->request('GET', $entityUrl); } } razorpay/doc.md 0000644 00000001211 15002216177 0007476 0 ustar 00 This document talks about the implementation of the code for the Api. Everything comes under namespace Razorpay\Api\. Namespaces put a requirement of PHP 5.3 minimum ```php namespace Razorpay\ class Api { // Contains a __get function that returns the appropriate // class object when one tries to access them. } namespace Razorpay\ class Client { // Handles request and response // Uses Composer:Requests internally } class Payment { public function get($id) { } public function fetch($options) { } public function capture($id) { } public function refund($id) { } } ``` razorpay/CHANGELOG.md 0000644 00000022176 15002216177 0010235 0 ustar 00 # Change Log Changelog for Razorpay-PHP SDK. Follows [keepachangelog.com](https://keepachangelog.com/en/1.0.0/) for formatting. ## Unreleased ## [2.9.0] - 2023-12-18 feat: Added new API endpoints * Added support for `addBankAccount`, `deleteBankAccount`, `requestEligibilityCheck` & `fetchEligibility` on customer * Added support for `uploadAccountDoc` & `fetchAccountDoc` on account * Added support for [Dispute](https://razorpay.com/docs/api/disputes/) * Added support for [Document](https://razorpay.com/docs/api/documents/) * Added support for fetch all IINs Supporting native otps & fetch all IINs with business sub-type using `all` * Added support for `viewRtoReview` & `editFulfillment` on order * Added support for fetch a payment (emi/ offer/ card/ upi) using `expandedDetails` on payments * Added support for `uploadStakeholderDoc` & `fetchStakeholderDoc` on stakeholder ## [2.8.7] - 2023-09-11 [#357](https://github.com/razorpay/razorpay-php/pull/357) [`b29754f`](https://github.com/razorpay/razorpay-php/commit/b29754f8892e0c2035055cf73fd7ab132de18e52) Chore: Changed Content-Type `application/json` for `order create` API from default `application/x-www-form-urlencoded` ## [2.8.6] - 2023-06-16 [#348](https://github.com/razorpay/razorpay-php/pull/348) [`68b2028`](https://github.com/razorpay/razorpay-php/commit/68b2028bafda49af970a098d6d11aa8e5a575d40) feat: Added new API endpoints * Added account onboarding API (create, fetch, edit, delete) * Added stakeholders API (create, fetch, fetchAll, edit) * Added product configuration API (requestProductConfiguration, fetch, edit, fetchTnc) * Added webhooks API (create, fetch, fetchAll, edit, delete) * Added token sharing API (create, fetch, delete, processPaymentOnAlternatePAorPG) ## [2.8.5] - 2022-10-19 ### Added - Update [Request](https://github.com/WordPress/Requests/tree/v2.0.4) library to v2.0.4 ## [2.8.4] - 2022-06-28 - New APIs for Third party validation (createUpi, validateVpa, fetchPaymentMethods) - Update documentation ## [2.8.3] - 2022-04-29 - PHP v8.1 is officially supported - Update [Request](https://github.com/WordPress/Requests/tree/v2.0.0) library to v2.0 - Improve documentation - Add PHPUnit v9 ## [2.8.2] - 2022-03-08 - Change name convention to standard in Unit test - Removed test api key due to security concern from test cases ## [2.8.1] - 2021-11-08 ### Added - Added Item Api - Added Unit Tests ## [2.8.0][2.8.0] - 2021-10-07 ### Added - QR code end point API [[#235](https://github.com/razorpay/razorpay-php/pull/235)] - Update, cancel, create subscription link,fetch details of a Pending Update,cancel, pause and resume subscription API[[#236](https://github.com/razorpay/razorpay-php/pull/236)] - Smart Collect(Virtual Account) TPV API's [[#238](https://github.com/razorpay/razorpay-php/pull/238)] - Add/Delete TPV Bank Account [[#239](https://github.com/razorpay/razorpay-php/pull/239)] - Card end point api [[#240](https://github.com/razorpay/razorpay-php/pull/240)] - Route end point api [[#241](https://github.com/razorpay/razorpay-php/pull/241)] - Register emandate and charge first payment together [[#245](https://github.com/razorpay/razorpay-php/pull/245)] - PaperNACH/Register NACH and charge first payment together [[#246](https://github.com/razorpay/razorpay-php/pull/246)] - Added payment and Settlements methods [[#247](https://github.com/razorpay/razorpay-php/pull/247)] - Added edit and notify API's for payment links [[#248](https://github.com/razorpay/razorpay-php/pull/248)] - Added fetch, fetch multiple refund,edit and notify API's for refunds [[#250](https://github.com/razorpay/razorpay-php/pull/250)] - Added edit order API [[#251](https://github.com/razorpay/razorpay-php/pull/251)] - Fund API's end point [[#252](https://github.com/razorpay/razorpay-php/pull/252)] - UPI [[#253](https://github.com/razorpay/razorpay-php/pull/253)] - Added payment link paymentverification [[#255](https://github.com/razorpay/razorpay-php/pull/255)] - Update readme file [[#254](https://github.com/razorpay/razorpay-php/pull/254)] ## [2.7.1][2.7.1] - 2021-09-16 ### Added - Added Payment Link end point API [[#233](https://github.com/razorpay/razorpay-php/pull/233)] ## [2.7.0][2.7.0] - 2021-05-07 ### Added - Adds support for payment page enity API [[#224](https://github.com/razorpay/razorpay-php/pull/224)] ## [2.6.1][2.6.1] - 2021-04-30 ### Changed - Upgrades [requests](https://github.com/rmccue/Requests/) to v1.8. [[#221](https://github.com/razorpay/razorpay-php/pull/221)] ## [2.6.0][2.6.0] - 2021-04-05 ### Added - Adds support for webhook enity API [[#212](https://github.com/razorpay/razorpay-php/pull/212)] ## [2.4.0-beta][2.4.0-beta] - 2018-11-28 ### Changed - Upgrades [requests](https://github.com/rmccue/Requests/) to v1.7. [[#89](https://github.com/razorpay/razorpay-php/pull/89)] - Enforces TLS1.1+ for all requests. Workaround for a bug in RHEL 6. [[#76](https://github.com/razorpay/razorpay-php/pull/76)] ## [2.3.0][2.3.0] - 2018-09-15 ### Added - Add parameters to Subscription Cancel API - Support for fetching Settlements ## [2.2.1][2.2.1] - 2018-05-28 ### Added - Support for fetching all customer entities ## [2.2.0][2.2.0] - 2017-10-23 ### Added - Support for VirtualAccount entity - Support for Subscriptions ## [2.1.0][2.1.0] - 2017-10-10 ### Added - Support for new actions(cancel, notifyBy, edit, issue, delete) on invoices - Removes PHP 5.3 from list of versions to test build against ## [2.0.2][2.0.2] - 2017-08-03 ### Added - Support for creating and fetching Transfers - Support for creating Reversals on transfers ## [2.0.1][2.0.1] - 2017-07-31 ### Fixed - Webhook signature verification - Conditional require of Request class ## [2.0.0][2.0.0] - 2017-03-07 ### Added - Support for custom Application header - Support for card entity - Support for Webhook and Order Signature verification - Support for direct refund creation via Razorpay\Api\Refund::create() - Support for Utility functions via Razorpay\Api\Utility::verifyPaymentSignature and Razorpay\Api\Utility::verifyWebhookSignature - Support for case insensitive error codes - Support for 2xx HTTP status codes ### Changed - Razorpay\Api\Payment::refunds() now returns a Razorpay\Api\Collection object instead of Razorpay\Api\Refund object - Razorpay\Api\Api::$baseUrl, Razorpay\Api\Api::$key and Razorpay\Api\Api::$secret are now `protected` instead of `public` ## [1.2.9][1.2.9] - 2017-01-03 ### Added - Support for creating and fetching Invoices ## [1.2.8][1.2.8] - 2016-10-12 ### Added - Support for Customer and Token entities ## [1.2.7][1.2.7] - 2016-09-21 ### Added - Increases the request timeout to 30 seconds for all requests. ## [1.2.6][1.2.6] - 2016-03-28 ### Added - Adds better tracing when client is not able to recognize server response. ## [1.2.5][1.2.5] - 2016-03-28 ### Added - Add support for overriding request headers via setHeader ## [1.2.3][1.2.3] - 2016-02-24 ### Added - Add support for Orders ## [1.2.2][1.2.2] - 2016-02-17 ### Changed - Razorpay\Api\Request::checkErrors is now `protected` instead of `private` - The final build is now leaner and includes just requests, instead of entire vendor directory ## [1.2.1][1.2.1] - 2016-01-21 ### Added - Add version.txt in release with current git tag - This changelog file - `Api\Request::getHeaders()` method ## [1.2.0][1.2.0] - 2015-10-23 ### Added - Add version string to User Agent ### Changed - New release process that pushes pre-packaged zip files to GitHub ## 1.0.0 - 2015-01-18 ### Added - Initial Release [unreleased]: https://github.com/razorpay/razorpay-php/compare/2.5.0...HEAD [1.2.1]: https://github.com/razorpay/razorpay-php/compare/1.2.0...1.2.1 [1.2.0]: https://github.com/razorpay/razorpay-php/compare/1.1.0...1.2.0 [1.2.2]: https://github.com/razorpay/razorpay-php/compare/1.2.1...1.2.2 [1.2.3]: https://github.com/razorpay/razorpay-php/compare/1.2.2...1.2.3 [1.2.4]: https://github.com/razorpay/razorpay-php/compare/1.2.3...1.2.4 [1.2.5]: https://github.com/razorpay/razorpay-php/compare/1.2.4...1.2.5 [1.2.6]: https://github.com/razorpay/razorpay-php/compare/1.2.5...1.2.6 [1.2.7]: https://github.com/razorpay/razorpay-php/compare/1.2.6...1.2.7 [1.2.8]: https://github.com/razorpay/razorpay-php/compare/1.2.7...1.2.8 [1.2.9]: https://github.com/razorpay/razorpay-php/compare/1.2.8...1.2.9 [2.0.0]: https://github.com/razorpay/razorpay-php/compare/1.2.9...2.0.0 [2.0.1]: https://github.com/razorpay/razorpay-php/compare/2.0.0...2.0.1 [2.0.2]: https://github.com/razorpay/razorpay-php/compare/2.0.1...2.0.2 [2.1.0]: https://github.com/razorpay/razorpay-php/compare/2.0.2...2.1.0 [2.2.0]: https://github.com/razorpay/razorpay-php/compare/2.1.0...2.2.0 [2.2.1]: https://github.com/razorpay/razorpay-php/compare/2.2.0...2.2.1 [2.3.0]: https://github.com/razorpay/razorpay-php/compare/2.2.1...2.3.0 [2.4.0-beta]: https://github.com/razorpay/razorpay-php/compare/2.3.0...2.4.0-beta [2.5.0]: https://github.com/razorpay/razorpay-php/compare/2.4.0-beta...2.5.0 [2.8.0]: https://github.com/razorpay/razorpay-php/compare/2.7.1...2.8.0 [2.8.1]: https://github.com/razorpay/razorpay-php/compare/2.8.0...2.8.1 [2.8.2]: https://github.com/razorpay/razorpay-php/compare/2.8.0...2.8.2 razorpay/.editorconfig 0000644 00000000375 15002216177 0011076 0 ustar 00 # This file is for unifying the coding style for different editors and IDEs # editorconfig.org root = true [*] end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true [**.php] indent_style = space indent_size = 4 razorpay/Razorpay.php 0000644 00000002630 15002216177 0010735 0 ustar 00 <?php // Include Requests only if not already defined if (!defined('REQUESTS_SILENCE_PSR0_DEPRECATIONS')) { define('REQUESTS_SILENCE_PSR0_DEPRECATIONS', true); } if (class_exists('WpOrg\Requests\Autoload') === false) { require_once __DIR__.'/libs/Requests-2.0.4/src/Autoload.php'; } try { WpOrg\Requests\Autoload::register(); if (version_compare(Requests::VERSION, '1.6.0') === -1) { throw new Exception('Requests class found but did not match'); } } catch (\Exception $e) { throw new Exception('Requests class found but did not match'); } spl_autoload_register(function ($class) { // project-specific namespace prefix $prefix = 'Razorpay\Api'; // base directory for the namespace prefix $base_dir = __DIR__ . '/src/'; // does the class use the namespace prefix? $len = strlen($prefix); if (strncmp($prefix, $class, $len) !== 0) { // no, move to the next registered autoloader return; } // get the relative class name $relative_class = substr($class, $len); // // replace the namespace prefix with the base directory, // replace namespace separators with directory separators // in the relative class name, append with .php // $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php'; // if the file exists, require it if (file_exists($file)) { require $file; } });
| ver. 1.4 |
Github
|
.
| PHP 8.2.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings