├── MANIFEST.in ├── composer.json ├── .gitignore ├── test.php ├── LICENSE ├── CryptAPI ├── Exceptions │ └── ApiException.php └── CryptAPI.php └── README.md /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include README.md 2 | recursive-include cryptapi *.html 3 | 4 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cryptapi/php-cryptapi", 3 | "type": "library", 4 | "description": "CryptAPI's PHP library", 5 | "keywords": ["cryptapi", "crypto", "bitcoin", "litecoin", "ethereum", "bitcoin cash", "polygon", "base", "avalanche-c", "payments", "cryptocurrencies"], 6 | "homepage": "https://github.com/cryptapi/php-cryptapi", 7 | "license": "MIT", 8 | "authors": [ 9 | { 10 | "name": "CryptAPI", 11 | "email": "info@cryptapi.io", 12 | "homepage": "https://cryptapi.io", 13 | "role": "Developer" 14 | } 15 | ], 16 | "support": { 17 | "email": "info@cryptapi.io", 18 | "chat": "https://cryptapi.io", 19 | "docs": "https://docs.cryptapi.io/" 20 | }, 21 | "require": { 22 | "php": ">=7.2.0", 23 | "ext-curl": "*", 24 | "ext-json": "*" 25 | }, 26 | "minimum-stability": "stable", 27 | "autoload": { 28 | "psr-4": { 29 | "CryptAPI\\": "CryptAPI/" 30 | } 31 | }, 32 | "version": "1.7.1" 33 | } 34 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | 5 | # C extensions 6 | *.so 7 | 8 | # Distribution / packaging 9 | .Python 10 | env/ 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | lib/ 17 | lib64/ 18 | parts/ 19 | sdist/ 20 | var/ 21 | *.egg-info/ 22 | .installed.cfg 23 | *.egg 24 | 25 | # PyInstaller 26 | # Usually these files are written by a python script from a template 27 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 28 | *.manifest 29 | *.spec 30 | 31 | # Installer logs 32 | pip-log.txt 33 | pip-delete-this-directory.txt 34 | 35 | # Unit test / coverage reports 36 | htmlcov/ 37 | .tox/ 38 | .coverage 39 | .cache 40 | nosetests.xml 41 | coverage.xml 42 | 43 | # Translations 44 | *.mo 45 | *.pot 46 | 47 | # Django stuff: 48 | *.log 49 | 50 | # Sphinx documentation 51 | docs/_build/ 52 | 53 | # PyBuilder 54 | target/ 55 | README.rst 56 | venv 57 | 58 | 59 | # IDE stuff 60 | 61 | .idea 62 | 63 | # Test DB 64 | 65 | *.sqlite3 66 | 67 | # MacOS 68 | .DS_STORE 69 | 70 | composer.lock 71 | 72 | vendor 73 | -------------------------------------------------------------------------------- /test.php: -------------------------------------------------------------------------------- 1 | 12345, 12 | ]; 13 | 14 | $cryptapi_params = [ 15 | 'pending' => 1, 16 | ]; 17 | 18 | try { 19 | $ca = new CryptAPI\CryptAPI($coin, '0xA6B78B56ee062185E405a1DDDD18cE8fcBC4395d', $callback_url, $parameters, $cryptapi_params); 20 | 21 | # var_dump($ca->get_address()) . PHP_EOL; 22 | 23 | # var_dump($ca->check_logs()) . PHP_EOL; 24 | 25 | # var_dump($ca->get_qrcode()) . PHP_EOL; 26 | 27 | # var_dump($ca->get_qrcode(2, 500)) . PHP_EOL; 28 | 29 | # var_dump(\CryptAPI\CryptAPI::get_info('btc', true)) . PHP_EOL; 30 | 31 | # var_dump(\CryptAPI\CryptAPI::get_info($coin, false)) . PHP_EOL; 32 | 33 | # var_dump(\CryptAPI\CryptAPI::get_supported_coins()) . PHP_EOL; 34 | 35 | # var_dump(\CryptAPI\CryptAPI::get_estimate($coin, 1, '')) . PHP_EOL; 36 | 37 | # var_dump(\CryptAPI\CryptAPI::get_convert($coin, 3, 'usd')) . PHP_EOL; 38 | } catch (Exception $e) { 39 | var_dump($e); 40 | } 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 CryptAPI 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /CryptAPI/Exceptions/ApiException.php: -------------------------------------------------------------------------------- 1 | statusCode = $statusCode; 13 | } 14 | 15 | public static function withStatus($statusCode, $apiError = null, Exception $previous = null): ApiException 16 | { 17 | $message = $apiError ?? self::getDefaultMessageForStatusCode($statusCode); 18 | 19 | return new self($message, $statusCode, $previous); 20 | } 21 | 22 | // Method to get a default message based on the status code 23 | private static function getDefaultMessageForStatusCode($statusCode): string 24 | { 25 | switch ($statusCode) { 26 | case 400: return "Bad Request"; 27 | case 401: return "Unauthorized"; 28 | case 403: return "Forbidden"; 29 | case 404: return "Not Found"; 30 | case 500: return "Internal Server Error"; 31 | default: return "An unexpected error occurred"; 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /CryptAPI/CryptAPI.php: -------------------------------------------------------------------------------- 1 | valid_coins = CryptAPI::get_supported_coins(); 39 | 40 | $coin = str_replace('/', '_', (string) $coin); 41 | 42 | if (!in_array($coin, $this->valid_coins)) { 43 | $vc = print_r($this->valid_coins, true); 44 | throw new Exception("Unsupported Coin: {$coin}, Valid options are: {$vc}"); 45 | } 46 | 47 | $this->own_address = $own_address; 48 | $this->callback_url = $callback_url; 49 | $this->coin = $coin; 50 | $this->ca_params = $ca_params; 51 | $this->parameters = $parameters; 52 | $this->api_key = $api_key; 53 | } 54 | 55 | /** 56 | * @throws ApiException 57 | */ 58 | public static function get_supported_coins() 59 | { 60 | $info = CryptAPI::get_info(null, true); 61 | 62 | if (empty($info)) { 63 | return null; 64 | } 65 | 66 | unset($info['fee_tiers']); 67 | 68 | $coins = []; 69 | 70 | foreach ($info as $chain => $data) { 71 | $is_base_coin = in_array('ticker', array_keys($data)); 72 | if ($is_base_coin) { 73 | $coins[] = $chain; 74 | continue; 75 | } 76 | 77 | $base_ticker = "{$chain}_"; 78 | foreach ($data as $token => $subdata) { 79 | $coins[] = $base_ticker . $token; 80 | } 81 | } 82 | 83 | return $coins; 84 | } 85 | 86 | /** 87 | * @throws ApiException 88 | */ 89 | public function get_address() 90 | { 91 | $api_key = $this->api_key; 92 | 93 | $callback_url = $this->callback_url; 94 | if (!empty($this->parameters)) { 95 | $req_parameters = http_build_query($this->parameters); 96 | $callback_url = "{$this->callback_url}?{$req_parameters}"; 97 | } 98 | 99 | if (empty($api_key)) { 100 | $ca_params = array_merge([ 101 | 'callback' => $callback_url, 102 | 'address' => $this->own_address, 103 | ], $this->ca_params); 104 | } else { 105 | $ca_params = array_merge([ 106 | 'apikey' => $api_key, 107 | 'callback' => $callback_url, 108 | 'address' => $this->own_address, 109 | ], $this->ca_params); 110 | } 111 | 112 | $response = CryptAPI::_request($this->coin, 'create', $ca_params); 113 | 114 | $this->payment_address = $response->address_in; 115 | 116 | return $response->address_in; 117 | } 118 | 119 | /** 120 | * @throws ApiException 121 | */ 122 | public function check_logs() 123 | { 124 | $callback_url = $this->callback_url; 125 | if (!empty($this->parameters)) { 126 | $req_parameters = http_build_query($this->parameters); 127 | $callback_url = "{$this->callback_url}?{$req_parameters}"; 128 | } 129 | 130 | $params = [ 131 | 'callback' => $callback_url, 132 | ]; 133 | 134 | return CryptAPI::_request($this->coin, 'logs', $params); 135 | } 136 | 137 | /** 138 | * @throws ApiException 139 | */ 140 | public function get_qrcode($value = false, $size = false) 141 | { 142 | $address = $this->payment_address; 143 | 144 | if (empty($address)) { 145 | $address = $this->get_address(); 146 | } 147 | 148 | $params = [ 149 | 'address' => $address, 150 | ]; 151 | 152 | if ($value) { 153 | $params['value'] = $value; 154 | } 155 | if ($size) { 156 | $params['size'] = $size; 157 | } 158 | 159 | return CryptAPI::_request($this->coin, 'qrcode', $params); 160 | } 161 | 162 | /** 163 | * @throws ApiException 164 | */ 165 | public static function get_info($coin = null, $assoc = false) 166 | { 167 | $params = []; 168 | 169 | if (empty($coin)) { 170 | $params['prices'] = '0'; 171 | } 172 | 173 | return CryptAPI::_request($coin, 'info', $params, $assoc); 174 | } 175 | 176 | /** 177 | * @throws ApiException 178 | */ 179 | public static function get_estimate($coin, $addresses = 1, $priority = 'default') 180 | { 181 | return CryptAPI::_request($coin, 'estimate', [ 182 | 'addresses' => $addresses, 183 | 'priority' => $priority 184 | ]); 185 | } 186 | 187 | /** 188 | * @throws ApiException 189 | */ 190 | public static function get_convert($coin, $value, $from) 191 | { 192 | return CryptAPI::_request($coin, 'convert', [ 193 | 'value' => $value, 194 | 'from' => $from 195 | ]); 196 | } 197 | 198 | public static function process_callback($_get) 199 | { 200 | $params = [ 201 | 'address_in' => $_get['address_in'], 202 | 'address_out' => $_get['address_out'], 203 | 'txid_in' => $_get['txid_in'], 204 | 'txid_out' => isset($_get['txid_out']) ? $_get['txid_out'] : null, 205 | 'confirmations' => $_get['confirmations'], 206 | 'value' => $_get['value'], 207 | 'value_coin' => $_get['value_coin'], 208 | 'value_forwarded' => isset($_get['value_forwarded']) ? $_get['value_forwarded'] : null, 209 | 'value_forwarded_coin' => isset($_get['value_forwarded_coin']) ? $_get['value_forwarded_coin'] : null, 210 | 'coin' => $_get['coin'], 211 | 'pending' => isset($_get['pending']) ? $_get['pending'] : false, 212 | ]; 213 | 214 | foreach ($_get as $k => $v) { 215 | if (isset($params[$k])) { 216 | continue; 217 | } 218 | $params[$k] = $_get[$k]; 219 | } 220 | 221 | return $params; 222 | } 223 | 224 | /** 225 | * @throws ApiException 226 | */ 227 | private static function _request($coin, $endpoint, $params = [], $assoc = false) 228 | { 229 | $base_url = Cryptapi::$base_url; 230 | $coin = str_replace('_', '/', (string) $coin); 231 | 232 | if (!empty($params['apikey']) && $endpoint !== 'info') { 233 | $base_url = CryptAPI::$pro_url; 234 | } 235 | 236 | if (!empty($params)) { 237 | $data = http_build_query($params); 238 | } 239 | 240 | if (!empty($coin)) { 241 | $url = "{$base_url}/{$coin}/{$endpoint}/"; 242 | } else { 243 | $url = "{$base_url}/{$endpoint}/"; 244 | } 245 | 246 | if (!empty($data)) { 247 | $url .= "?{$data}"; 248 | } 249 | 250 | $ch = curl_init(); 251 | curl_setopt($ch, CURLOPT_URL, $url); 252 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 253 | $response = curl_exec($ch); 254 | curl_close($ch); 255 | 256 | $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 257 | $response_object = json_decode($response, $assoc); 258 | 259 | if ((is_object($response_object) && isset($response_object->status) && $response_object->status === 'error') || (is_array($response_object) && isset($response_object['status']) && $response_object['status'] === 'error')) { 260 | $statusCode = $http_code; 261 | $apiError = $response_object->error ?? null; 262 | 263 | throw ApiException::withStatus($statusCode, $apiError); 264 | } 265 | 266 | return $response_object; 267 | } 268 | } 269 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![CryptAPI](https://i.imgur.com/IfMAa7E.png) 2 | 3 | # CryptAPI's PHP Library 4 | Official PHP library of CryptAPI 5 | 6 | ## Table of Contents 7 | 1. [Requirements](#requirements) 8 | 2. [Installation](#installation) 9 | 3. [API and utils](#api-and-utils) 10 | 4. [Help](#help) 11 | 12 | ## Requirements: 13 | 14 | ``` 15 | PHP >= 7.2 16 | ext-curl 17 | ``` 18 | 19 | ## Installation 20 | 21 | ``` 22 | composer require cryptapi/php-cryptapi 23 | ``` 24 | 25 | [on GitHub](https://github.com/cryptapi/php-cryptapi)   26 | [on Composer](https://packagist.org/packages/cryptapi/php-cryptapi) 27 | 28 | ## API and utils 29 | 30 | ### Generating a new address 31 | 32 | ```php 33 | get_address(); 39 | ``` 40 | 41 | #### Where: 42 | 43 | ``$coin`` is the coin you wish to use, from CryptAPI's supported currencies (e.g `'btc', 'eth', 'erc20_usdt', ...`) 44 | ``$my_address`` is your own crypto address, where your funds will be sent to 45 | ``$callback_url`` is the URL that will be called upon payment 46 | ``$parameters`` is any parameter you wish to send to identify the payment, such as `['order_id' => 1234]` 47 | ``$cryptapi_params`` parameters that will be passed to CryptAPI _(check which extra parameters are available here: https://docs.cryptapi.io/#operation/create)_ 48 | ``$payment_address`` is the newly generated address, that you will show your users 49 | ``$api_key`` is the API Key provided by [BlockBee](https://blockbee.io/), since this library is also compatible with BlockBee API. 50 | 51 | With `get_address()` you will be creating the **request** in our API using this endpoint: https://docs.cryptapi.io/#operation/create. 52 | 53 | #### Response sample: 54 | ``` 55 | 0x0E945b1554c8029A6B9bE1F7A24ae75d2F44d8DB 56 | ``` 57 | 58 | ### Getting notified when the user pays 59 | 60 | The URL you provided earlier will be called when a user pays, for easier processing of the request we've added the ``process_callback`` helper 61 | 62 | ```php 63 | check_logs(); 110 | ``` 111 | 112 | All the `data` returned in the response can be checked here: https://docs.cryptapi.io/#operation/logs 113 | 114 | #### Response sample: 115 | 116 | ```php 117 | object(stdClass) { 118 | ["status"]=>string(7) "success" 119 | ["callback_url"]=>string(37) "https://example.com?payment_id=123112" 120 | ["address_in"]=>string(42) "0x0E945b1554c8029A6B9bE1F7A24ae75d2F44d8DB" 121 | ["address_out"]=>string(42) "0xA6B78B56ee062185E405a1DDDD18cE8fcBC4395d" 122 | ["notify_pending"]=>bool(true) 123 | ["notify_confirmations"]=>int(1) 124 | ["priority"]=>string(7) "default" 125 | ["callbacks"]=>array(0) { 126 | } 127 | } 128 | ``` 129 | 130 | ### Generating a QR code 131 | 132 | ```php 133 | get_address(); 138 | 139 | $qrcode = $ca->get_qrcode($value, $size); 140 | ``` 141 | 142 | For object creation, same parameters as before. You must first call `get_address` as this method requires the payment address to have been created. 143 | 144 | #### Where: 145 | 146 | ``$value`` Value to request the user, in the main coin (BTC, ETH, etc). Optional, pass `false` to not add a value to the QR. 147 | 148 | ``$size`` Size of the QR Code image in pixels. Optional, pass `false` to use the default size of 512. 149 | 150 | Response is an object with `qr_code` (base64 encoded image data) and `payment_uri` (the value encoded in the QR), see https://docs.cryptapi.io/#operation/qrcode for more information. 151 | 152 | #### Response sample: 153 | 154 | ```php 155 | object(stdClass) { 156 | ["status"]=>string(7) "success" 157 | ["qr_code"]=>string(18700) "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" 158 | ["payment_uri"]=>string(42) "0x0E945b1554c8029A6B9bE1F7A24ae75d2F44d8DB" 159 | } 160 | ``` 161 | 162 | #### Usage 163 | ```html 164 | 165 | ``` 166 | 167 | ### Estimating transaction fees 168 | 169 | ```php 170 | string(7) "success" 191 | ["estimated_cost"]=>string(11) "0.000496344" 192 | ["estimated_cost_currency"]=> 193 | object(stdClass) { 194 | ["AED"]=>string(4) "1.12" 195 | ["AUD"]=>string(4) "0.46" 196 | ["BGN"]=>string(4) "0.55" 197 | # ... remaining FIAT currencies 198 | } 199 | } 200 | ``` 201 | 202 | ### Converting between cryptocurrencies and FIAT 203 | 204 | ```php 205 | string(7) "success" 226 | ["value_coin"]=>string(1) "3" 227 | ["exchange_rate"]=>string(8) "0.999467" 228 | } 229 | ``` 230 | 231 | ### Getting supported coins 232 | 233 | ```php 234 | string(3) "btc" 248 | [1]=>string(3) "bch" 249 | [2]=>string(3) "ltc" 250 | [3]=>string(4) "doge" 251 | [4]=>string(11) "bep20_1inch" 252 | [5]=>string(9) "bep20_ada" 253 | # ...remaining supported cryptocurrencies or tokens 254 | } 255 | ``` 256 | 257 | 258 | ## Help 259 | 260 | Need help? 261 | Contact us @ https://cryptapi.io/contacts/ 262 | --------------------------------------------------------------------------------