| Total Complexity | 49 | 
| Total Lines | 845 | 
| Duplicated Lines | 0 % | 
| Changes | 14 | ||
| Bugs | 0 | Features | 0 | 
Complex classes like BcaHttp often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use BcaHttp, and based on these observations, apply Extract Interface, too.
| 1 | <?php  | 
            ||
| 16 | class BcaHttp  | 
            ||
| 17 | { | 
            ||
| 18 | public static $VERSION = '2.3.3';  | 
            ||
| 19 | |||
| 20 | /**  | 
            ||
| 21 | * Default Timezone.  | 
            ||
| 22 | *  | 
            ||
| 23 | * @var string  | 
            ||
| 24 | */  | 
            ||
| 25 | private static $timezone = 'Asia/Jakarta';  | 
            ||
| 26 | |||
| 27 | /**  | 
            ||
| 28 | * Default BCA Port.  | 
            ||
| 29 | *  | 
            ||
| 30 | * @var int  | 
            ||
| 31 | */  | 
            ||
| 32 | private static $port = 443;  | 
            ||
| 33 | |||
| 34 | /**  | 
            ||
| 35 | * Default BCA Host.  | 
            ||
| 36 | *  | 
            ||
| 37 | * @var string  | 
            ||
| 38 | */  | 
            ||
| 39 | private static $hostName = 'sandbox.bca.co.id';  | 
            ||
| 40 | |||
| 41 | /**  | 
            ||
| 42 | * Default BCA Host.  | 
            ||
| 43 | *  | 
            ||
| 44 | * @var string  | 
            ||
| 45 | */  | 
            ||
| 46 | private static $scheme = 'https';  | 
            ||
| 47 | |||
| 48 | /**  | 
            ||
| 49 | * Timeout curl.  | 
            ||
| 50 | *  | 
            ||
| 51 | * @var int  | 
            ||
| 52 | */  | 
            ||
| 53 | private static $timeOut = 60;  | 
            ||
| 54 | |||
| 55 | /**  | 
            ||
| 56 | * Default Curl Options.  | 
            ||
| 57 | *  | 
            ||
| 58 | * @var int  | 
            ||
| 59 | */  | 
            ||
| 60 | private static $curlOptions = array(  | 
            ||
| 61 | CURLOPT_SSL_VERIFYHOST => 0,  | 
            ||
| 62 | CURLOPT_SSLVERSION => 6,  | 
            ||
| 63 | CURLOPT_SSL_VERIFYPEER => false,  | 
            ||
| 64 | CURLOPT_TIMEOUT => 60  | 
            ||
| 65 | );  | 
            ||
| 66 | |||
| 67 | /**  | 
            ||
| 68 | * Default BCA Settings.  | 
            ||
| 69 | *  | 
            ||
| 70 | * @var array  | 
            ||
| 71 | */  | 
            ||
| 72 | protected $settings = array(  | 
            ||
| 73 | 'corp_id' => '',  | 
            ||
| 74 | 'client_id' => '',  | 
            ||
| 75 | 'client_secret' => '',  | 
            ||
| 76 | 'api_key' => '',  | 
            ||
| 77 | 'secret_key' => '',  | 
            ||
| 78 | 'curl_options' => array(),  | 
            ||
| 79 | // Backward compatible  | 
            ||
| 80 | 'host' => 'sandbox.bca.co.id',  | 
            ||
| 81 | 'scheme' => 'https',  | 
            ||
| 82 | 'timeout' => 60,  | 
            ||
| 83 | 'port' => 443,  | 
            ||
| 84 | 'timezone' => 'Asia/Jakarta',  | 
            ||
| 85 | // New Options  | 
            ||
| 86 | 'options' => array(  | 
            ||
| 87 | 'host' => 'sandbox.bca.co.id',  | 
            ||
| 88 | 'scheme' => 'https',  | 
            ||
| 89 | 'timeout' => 60,  | 
            ||
| 90 | 'port' => 443,  | 
            ||
| 91 | 'timezone' => 'Asia/Jakarta'  | 
            ||
| 92 | )  | 
            ||
| 93 | );  | 
            ||
| 94 | |||
| 95 | /**  | 
            ||
| 96 | * Default Constructor.  | 
            ||
| 97 | *  | 
            ||
| 98 | * @param string $corp_id nilai corp id  | 
            ||
| 99 | * @param string $client_id nilai client key  | 
            ||
| 100 | * @param string $client_secret nilai client secret  | 
            ||
| 101 | * @param string $api_key niali oauth key  | 
            ||
| 102 | * @param string $secret_key nilai oauth secret  | 
            ||
| 103 | * @param array $options opsi ke server bca  | 
            ||
| 104 | */  | 
            ||
| 105 | public function __construct($corp_id, $client_id, $client_secret, $api_key, $secret_key, array $options = [])  | 
            ||
| 106 |     { | 
            ||
| 107 | // Required parameters.  | 
            ||
| 108 | $this->settings['corp_id'] = $corp_id;  | 
            ||
| 109 | $this->settings['client_id'] = $client_id;  | 
            ||
| 110 | $this->settings['client_secret'] = $client_secret;  | 
            ||
| 111 | $this->settings['api_key'] = $api_key;  | 
            ||
| 112 | $this->settings['secret_key'] = $secret_key;  | 
            ||
| 113 | $this->settings['host'] =  | 
            ||
| 114 |             preg_replace('/http[s]?\:\/\//', '', $this->settings['host'], 1); | 
            ||
| 115 | |||
| 116 |         foreach ($options as $key => $value) { | 
            ||
| 117 |             if (isset($this->settings[$key])) { | 
            ||
| 118 | $this->settings[$key] = $value;  | 
            ||
| 119 | }  | 
            ||
| 120 | }  | 
            ||
| 121 | |||
| 122 | // Setup optional scheme, if scheme is empty  | 
            ||
| 123 |         if (isset($options['scheme'])) { | 
            ||
| 124 | $this->settings['scheme'] = $options['scheme'];  | 
            ||
| 125 | $this->settings['options']['scheme'] = $options['scheme'];  | 
            ||
| 126 |         } else { | 
            ||
| 127 | $this->settings['scheme'] = self::getScheme();  | 
            ||
| 128 | $this->settings['options']['scheme'] = self::getScheme();  | 
            ||
| 129 | }  | 
            ||
| 130 | |||
| 131 | // Setup optional host, if host is empty  | 
            ||
| 132 |         if (isset($options['host'])) { | 
            ||
| 133 | $this->settings['host'] = $options['host'];  | 
            ||
| 134 | $this->settings['options']['host'] = $options['host'];  | 
            ||
| 135 |         } else { | 
            ||
| 136 | $this->settings['host'] = self::getHostName();  | 
            ||
| 137 | $this->settings['options']['host'] = self::getHostName();  | 
            ||
| 138 | }  | 
            ||
| 139 | |||
| 140 | // Setup optional port, if port is empty  | 
            ||
| 141 |         if (isset($options['port'])) { | 
            ||
| 142 | $this->settings['port'] = $options['port'];  | 
            ||
| 143 | $this->settings['options']['port'] = $options['port'];  | 
            ||
| 144 |         } else { | 
            ||
| 145 | $this->settings['port'] = self::getPort();  | 
            ||
| 146 | $this->settings['options']['port'] = self::getPort();  | 
            ||
| 147 | }  | 
            ||
| 148 | |||
| 149 | // Setup optional timezone, if timezone is empty  | 
            ||
| 150 |         if (isset($options['timezone'])) { | 
            ||
| 151 | $this->settings['timezone'] = $options['timezone'];  | 
            ||
| 152 | $this->settings['options']['timezone'] = $options['timezone'];  | 
            ||
| 153 |         } else { | 
            ||
| 154 | $this->settings['timezone'] = self::getTimeZone();  | 
            ||
| 155 | $this->settings['options']['timezone'] = self::getTimeZone();  | 
            ||
| 156 | }  | 
            ||
| 157 | |||
| 158 | // Setup optional timeout, if timeout is empty  | 
            ||
| 159 |         if (isset($options['timeout'])) { | 
            ||
| 160 | $this->settings['timeout'] = $options['timeout'];  | 
            ||
| 161 | $this->settings['options']['timeout'] = $options['timeout'];  | 
            ||
| 162 |         } else { | 
            ||
| 163 | $this->settings['timeout'] = self::getTimeOut();  | 
            ||
| 164 | $this->settings['options']['timeout'] = self::getTimeOut();  | 
            ||
| 165 | }  | 
            ||
| 166 | |||
| 167 | // Set Default Curl Options.  | 
            ||
| 168 | Request::curlOpts(self::$curlOptions);  | 
            ||
| 
                                                                                                    
                        
                         | 
                |||
| 169 | |||
| 170 | // Set custom curl options  | 
            ||
| 171 |         if (!empty($this->settings['curl_options'])) { | 
            ||
| 172 | $data = self::mergeCurlOptions(self::$curlOptions, $this->settings['curl_options']);  | 
            ||
| 173 | Request::curlOpts($data);  | 
            ||
| 174 | }  | 
            ||
| 175 | }  | 
            ||
| 176 | |||
| 177 | /**  | 
            ||
| 178 | * Ambil Nilai settings.  | 
            ||
| 179 | *  | 
            ||
| 180 | * @return array  | 
            ||
| 181 | */  | 
            ||
| 182 | public function getSettings()  | 
            ||
| 185 | }  | 
            ||
| 186 | |||
| 187 | /**  | 
            ||
| 188 | * Build the ddn domain.  | 
            ||
| 189 | * output = 'https://sandbox.bca.co.id:443'  | 
            ||
| 190 | * scheme = http(s)  | 
            ||
| 191 | * host = sandbox.bca.co.id  | 
            ||
| 192 | * port = 80 ? 443  | 
            ||
| 193 | *  | 
            ||
| 194 | * @return string  | 
            ||
| 195 | */  | 
            ||
| 196 | private function ddnDomain()  | 
            ||
| 199 | }  | 
            ||
| 200 | |||
| 201 | /**  | 
            ||
| 202 | * Generate authentifikasi ke server berupa OAUTH.  | 
            ||
| 203 | *  | 
            ||
| 204 | * @return \Unirest\Response  | 
            ||
| 205 | */  | 
            ||
| 206 | public function httpAuth()  | 
            ||
| 207 |     { | 
            ||
| 208 | $client_id = $this->settings['client_id'];  | 
            ||
| 209 | $client_secret = $this->settings['client_secret'];  | 
            ||
| 210 | |||
| 211 |         $headerToken = base64_encode("$client_id:$client_secret"); | 
            ||
| 212 | |||
| 213 |         $headers = array('Accept' => 'application/json', 'Authorization' => "Basic $headerToken"); | 
            ||
| 214 | |||
| 215 | $request_path = "api/oauth/token";  | 
            ||
| 216 | $domain = $this->ddnDomain();  | 
            ||
| 217 | $full_url = $domain . $request_path;  | 
            ||
| 218 | |||
| 219 |         $data = array('grant_type' => 'client_credentials'); | 
            ||
| 220 | $body = Body::form($data);  | 
            ||
| 221 | $response = Request::post($full_url, $headers, $body);  | 
            ||
| 222 | |||
| 223 | return $response;  | 
            ||
| 224 | }  | 
            ||
| 225 | |||
| 226 | /**  | 
            ||
| 227 | * Ambil informasi saldo berdasarkan nomor akun BCA.  | 
            ||
| 228 | *  | 
            ||
| 229 | * @param string $oauth_token nilai token yang telah didapatkan setelah login  | 
            ||
| 230 | * @param array $sourceAccountId nomor akun yang akan dicek  | 
            ||
| 231 | *  | 
            ||
| 232 | * @throws BcaHttpException error  | 
            ||
| 233 | * @return \Unirest\Response  | 
            ||
| 234 | */  | 
            ||
| 235 | public function getBalanceInfo($oauth_token, $sourceAccountId = [])  | 
            ||
| 267 | }  | 
            ||
| 268 | |||
| 269 | /**  | 
            ||
| 270 | * Ambil Daftar transaksi pertanggal.  | 
            ||
| 271 | *  | 
            ||
| 272 | * @param string $oauth_token nilai token yang telah didapatkan setelah login  | 
            ||
| 273 | * @param string $sourceAccount nomor akun yang akan dicek  | 
            ||
| 274 | * @param string $startDate tanggal awal  | 
            ||
| 275 | * @param string $endDate tanggal akhir  | 
            ||
| 276 | *  | 
            ||
| 277 | * @return \Unirest\Response  | 
            ||
| 278 | */  | 
            ||
| 279 | public function getAccountStatement($oauth_token, $sourceAccount, $startDate, $endDate)  | 
            ||
| 280 |     { | 
            ||
| 281 | $corp_id = $this->settings['corp_id'];  | 
            ||
| 282 | $uriSign = "GET:/banking/v3/corporates/$corp_id/accounts/$sourceAccount/statements?EndDate=$endDate&StartDate=$startDate";  | 
            ||
| 283 | $isoTime = self::generateIsoTime();  | 
            ||
| 284 | $authSignature = self::generateSign($uriSign, $oauth_token, $this->settings['secret_key'], $isoTime, null);  | 
            ||
| 285 | $headers = array();  | 
            ||
| 286 | $headers['Accept'] = 'application/json';  | 
            ||
| 287 | $headers['Content-Type'] = 'application/json';  | 
            ||
| 288 | $headers['Authorization'] = "Bearer $oauth_token";  | 
            ||
| 289 | $headers['X-BCA-Key'] = $this->settings['api_key'];  | 
            ||
| 290 | $headers['X-BCA-Timestamp'] = $isoTime;  | 
            ||
| 291 | $headers['X-BCA-Signature'] = $authSignature;  | 
            ||
| 292 | $request_path = "banking/v3/corporates/$corp_id/accounts/$sourceAccount/statements?EndDate=$endDate&StartDate=$startDate";  | 
            ||
| 293 | $domain = $this->ddnDomain();  | 
            ||
| 294 | $full_url = $domain . $request_path;  | 
            ||
| 295 | |||
| 296 |         $data = array('grant_type' => 'client_credentials'); | 
            ||
| 297 | $body = Body::form($data);  | 
            ||
| 298 | $response = Request::get($full_url, $headers, $body);  | 
            ||
| 299 | return $response;  | 
            ||
| 300 | }  | 
            ||
| 301 | |||
| 302 | /**  | 
            ||
| 303 | * Ambil informasi ATM berdasarkan lokasi GEO.  | 
            ||
| 304 | *  | 
            ||
| 305 | * @param string $oauth_token nilai token yang telah didapatkan setelah login  | 
            ||
| 306 | * @param string $latitude Langitude GPS  | 
            ||
| 307 | * @param string $longitude Longitude GPS  | 
            ||
| 308 | * @param string $count Jumlah ATM BCA yang akan ditampilkan  | 
            ||
| 309 | * @param string $radius Nilai radius dari lokasi GEO  | 
            ||
| 310 | *  | 
            ||
| 311 | * @throws BcaHttpException error  | 
            ||
| 312 | * @return \Unirest\Response  | 
            ||
| 313 | */  | 
            ||
| 314 | public function getAtmLocation(  | 
            ||
| 315 | $oauth_token,  | 
            ||
| 316 | $latitude,  | 
            ||
| 317 | $longitude,  | 
            ||
| 318 | $count = '10',  | 
            ||
| 319 | $radius = '20'  | 
            ||
| 320 | )  | 
            ||
| 321 |     { | 
            ||
| 322 | $params = array();  | 
            ||
| 323 | $params['SearchBy'] = 'Distance';  | 
            ||
| 324 | $params['Latitude'] = $latitude;  | 
            ||
| 325 | $params['Longitude'] = $longitude;  | 
            ||
| 326 | $params['Count'] = $count;  | 
            ||
| 327 | $params['Radius'] = $radius;  | 
            ||
| 328 | ksort($params);  | 
            ||
| 329 | |||
| 330 |         $auth_query_string = self::arrayImplode('=', '&', $params); | 
            ||
| 331 | |||
| 332 | $uriSign = "GET:/general/info-bca/atm?$auth_query_string";  | 
            ||
| 333 | $isoTime = self::generateIsoTime();  | 
            ||
| 334 | $authSignature = self::generateSign($uriSign, $oauth_token, $this->settings['secret_key'], $isoTime, null);  | 
            ||
| 335 | |||
| 336 | $headers = array();  | 
            ||
| 337 | $headers['Accept'] = 'application/json';  | 
            ||
| 338 | $headers['Content-Type'] = 'application/json';  | 
            ||
| 339 | $headers['Authorization'] = "Bearer $oauth_token";  | 
            ||
| 340 | $headers['X-BCA-Key'] = $this->settings['api_key'];  | 
            ||
| 341 | $headers['X-BCA-Timestamp'] = $isoTime;  | 
            ||
| 342 | $headers['X-BCA-Signature'] = $authSignature;  | 
            ||
| 343 | |||
| 344 | $request_path = "general/info-bca/atm?SearchBy=Distance&Latitude=$latitude&Longitude=$longitude&Count=$count&Radius=$radius";  | 
            ||
| 345 | $domain = $this->ddnDomain();  | 
            ||
| 346 | $full_url = $domain . $request_path;  | 
            ||
| 347 | |||
| 348 |         $data = array('grant_type' => 'client_credentials'); | 
            ||
| 349 | $body = Body::form($data);  | 
            ||
| 350 | $response = Request::get($full_url, $headers, $body);  | 
            ||
| 351 | |||
| 352 | return $response;  | 
            ||
| 353 | }  | 
            ||
| 354 | |||
| 355 | /**  | 
            ||
| 356 | * Transfer dana kepada akun yang berbeda bank dengan jumlah nominal tertentu.  | 
            ||
| 357 | *  | 
            ||
| 358 | * @param string $oauth_token nilai token yang telah didapatkan setelah login.  | 
            ||
| 359 | * @param string $channelId Unknown description.  | 
            ||
| 360 | * @param int $amount nilai dana dalam RUPIAH yang akan ditransfer, Format: 13.2  | 
            ||
| 361 | * @param string $sourceAccountNumber Source of Fund Account Number  | 
            ||
| 362 | * @param string $beneficiaryAccountNumber BCA Account number to be credited (Destination)  | 
            ||
| 363 | * @param string $beneficiaryBankCode Kode Bank to be credited (Destination)  | 
            ||
| 364 | * @param string $beneficiaryCustResidence 1 = Resident 2 = Non Resident *mandatory, if transfer_type = LLG/RTG  | 
            ||
| 365 | * @param string $beneficiaryCustType 1 = Personal 2 = Corporate 3 = Government *mandatory, if transfer_type = LLG/RTG  | 
            ||
| 366 | * @param string $beneficiaryName Nama penerima.  | 
            ||
| 367 | * @param string $beneficiaryEmail Email penerima.  | 
            ||
| 368 | * @param string $transactionID Transcation ID unique per day (using UTC+07 Time Zone). Format: Number  | 
            ||
| 369 | * @param string $transactionType ONL (Switching) ; LLG; RTG (RTGS)  | 
            ||
| 370 | * @param string $remark1 Transfer remark for receiver  | 
            ||
| 371 | * @param string $remark2 ransfer remark for receiver  | 
            ||
| 372 | * @param string $currencyCode nilai MATA Uang [Optional]  | 
            ||
| 373 | *  | 
            ||
| 374 | * @return \Unirest\Response  | 
            ||
| 375 | */  | 
            ||
| 376 | public function fundTransfersDomestic(  | 
            ||
| 377 | $oauth_token,  | 
            ||
| 378 | $channelId,  | 
            ||
| 379 | $amount,  | 
            ||
| 380 | $sourceAccountNumber,  | 
            ||
| 381 | $beneficiaryAccountNumber,  | 
            ||
| 382 | $beneficiaryBankCode,  | 
            ||
| 383 | $beneficiaryCustResidence,  | 
            ||
| 384 | $beneficiaryCustType,  | 
            ||
| 385 | $beneficiaryName,  | 
            ||
| 386 | $beneficiaryEmail,  | 
            ||
| 387 | $transactionID,  | 
            ||
| 388 | $transactionType,  | 
            ||
| 389 | $remark1,  | 
            ||
| 390 | $remark2,  | 
            ||
| 391 | $currencyCode = 'IDR'  | 
            ||
| 392 | )  | 
            ||
| 393 |     { | 
            ||
| 394 | $uriSign = "POST:/banking/corporates/transfers/v2/domestic";  | 
            ||
| 395 | $isoTime = self::generateIsoTime();  | 
            ||
| 396 | $headers = array();  | 
            ||
| 397 | $headers['Accept'] = 'application/json';  | 
            ||
| 398 | $headers['Content-Type'] = 'application/json';  | 
            ||
| 399 | $headers['Authorization'] = "Bearer $oauth_token";  | 
            ||
| 400 | $headers['X-BCA-Key'] = $this->settings['api_key'];  | 
            ||
| 401 | $headers['X-BCA-Timestamp'] = $isoTime;  | 
            ||
| 402 | $headers['channel-id'] = $channelId;  | 
            ||
| 403 | $headers['credential-id'] = $this->settings['corp_id'];  | 
            ||
| 404 | |||
| 405 | $request_path = "banking/corporates/transfers/v2/domestic";  | 
            ||
| 406 | $domain = $this->ddnDomain();  | 
            ||
| 407 | $full_url = $domain . $request_path;  | 
            ||
| 408 | |||
| 409 | $bodyData = array();  | 
            ||
| 410 | $bodyData['amount'] = $amount;  | 
            ||
| 411 |         $bodyData['beneficiary_account_number'] = strtolower(str_replace(' ', '', $beneficiaryAccountNumber)); | 
            ||
| 412 |         $bodyData['beneficiary_bank_code'] = strtolower(str_replace(' ', '', $beneficiaryBankCode)); | 
            ||
| 413 | $bodyData['beneficiary_cust_residence'] = $beneficiaryCustResidence;  | 
            ||
| 414 | $bodyData['beneficiary_cust_type'] = $beneficiaryCustType;  | 
            ||
| 415 |         $bodyData['beneficiary_name'] = strtolower(str_replace(' ', '', $beneficiaryName)); | 
            ||
| 416 |         if (empty($beneficiaryEmail) || $beneficiaryEmail === '') { | 
            ||
| 417 | $bodyData['beneficiary_email'] = '';  | 
            ||
| 418 |         } else { | 
            ||
| 419 |             $bodyData['beneficiary_email'] = strtolower(str_replace(' ', '', $beneficiaryEmail)); | 
            ||
| 420 | }  | 
            ||
| 421 | $bodyData['currency_code'] = $currencyCode;  | 
            ||
| 422 |         $bodyData['remark1'] = !empty($remark1) ? strtolower(str_replace(' ', '', $remark1)) : ""; | 
            ||
| 423 |         $bodyData['remark1'] = !empty($remark2) ? strtolower(str_replace(' ', '', $remark2)) : ""; | 
            ||
| 424 |         $bodyData['source_account_number'] = strtolower(str_replace(' ', '', $sourceAccountNumber)); | 
            ||
| 425 | $bodyData['transaction_date'] = self::generateDateTransaction();  | 
            ||
| 426 |         $bodyData['transaction_id'] = strtolower(str_replace(' ', '', $transactionID)); | 
            ||
| 427 |         $bodyData['transfer_type'] = strtoupper(str_replace(' ', '', $transactionType)); | 
            ||
| 428 | |||
| 429 | // Harus disort agar mudah kalkulasi HMAC  | 
            ||
| 430 | ksort($bodyData);  | 
            ||
| 431 | |||
| 432 | $authSignature = self::generateSign($uriSign, $oauth_token, $this->settings['secret_key'], $isoTime, $bodyData);  | 
            ||
| 433 | |||
| 434 | $headers['X-BCA-Signature'] = $authSignature;  | 
            ||
| 435 | |||
| 436 | // Supaya jgn strip "ReferenceID" "/" jadi "/\" karena HMAC akan menjadi tidak cocok  | 
            ||
| 437 | $encoderData = json_encode($bodyData, JSON_UNESCAPED_SLASHES);  | 
            ||
| 438 | |||
| 439 | $body = Body::form($encoderData);  | 
            ||
| 440 | $response = Request::post($full_url, $headers, $body);  | 
            ||
| 441 | |||
| 442 | return $response;  | 
            ||
| 443 | }  | 
            ||
| 444 | |||
| 445 | /**  | 
            ||
| 446 | * Ambil KURS mata uang.  | 
            ||
| 447 | *  | 
            ||
| 448 | * @param string $oauth_token nilai token yang telah didapatkan setelah login  | 
            ||
| 449 | * @param string $rateType type rate  | 
            ||
| 450 | * @param string $currency Mata uang  | 
            ||
| 451 | *  | 
            ||
| 452 | * @throws BcaHttpException error  | 
            ||
| 453 | * @return \Unirest\Response  | 
            ||
| 454 | */  | 
            ||
| 455 | public function getForexRate(  | 
            ||
| 456 | $oauth_token,  | 
            ||
| 457 | $rateType = 'eRate',  | 
            ||
| 458 | $currency = 'USD'  | 
            ||
| 459 | )  | 
            ||
| 460 |     { | 
            ||
| 461 | $params = array();  | 
            ||
| 462 | $params['RateType'] = strtolower($rateType);  | 
            ||
| 463 | $params['CurrencyCode'] = strtoupper($currency);  | 
            ||
| 464 | ksort($params);  | 
            ||
| 465 | |||
| 466 |         $auth_query_string = self::arrayImplode('=', '&', $params); | 
            ||
| 467 | |||
| 468 | $uriSign = "GET:/general/rate/forex?$auth_query_string";  | 
            ||
| 469 | $isoTime = self::generateIsoTime();  | 
            ||
| 470 | $authSignature = self::generateSign($uriSign, $oauth_token, $this->settings['secret_key'], $isoTime, null);  | 
            ||
| 471 | |||
| 472 | $headers = array();  | 
            ||
| 473 | $headers['Accept'] = 'application/json';  | 
            ||
| 474 | $headers['Content-Type'] = 'application/json';  | 
            ||
| 475 | $headers['Authorization'] = "Bearer $oauth_token";  | 
            ||
| 476 | $headers['X-BCA-Key'] = $this->settings['api_key'];  | 
            ||
| 477 | $headers['X-BCA-Timestamp'] = $isoTime;  | 
            ||
| 478 | $headers['X-BCA-Signature'] = $authSignature;  | 
            ||
| 479 | |||
| 480 | $request_path = "general/rate/forex?$auth_query_string";  | 
            ||
| 481 | $domain = $this->ddnDomain();  | 
            ||
| 482 | $full_url = $domain . $request_path;  | 
            ||
| 483 | |||
| 484 |         $data = array('grant_type' => 'client_credentials'); | 
            ||
| 485 | $body = Body::form($data);  | 
            ||
| 486 | $response = Request::get($full_url, $headers, $body);  | 
            ||
| 487 | |||
| 488 | return $response;  | 
            ||
| 489 | }  | 
            ||
| 490 | |||
| 491 | /**  | 
            ||
| 492 | * Transfer dana kepada akun lain dengan jumlah nominal tertentu.  | 
            ||
| 493 | *  | 
            ||
| 494 | * @param string $oauth_token nilai token yang telah didapatkan setelah login  | 
            ||
| 495 | * @param int $amount nilai dana dalam RUPIAH yang akan ditransfer, Format: 13.2  | 
            ||
| 496 | * @param string $beneficiaryAccountNumber BCA Account number to be credited (Destination)  | 
            ||
| 497 | * @param string $referenceID Sender's transaction reference ID  | 
            ||
| 498 | * @param string $remark1 Transfer remark for receiver  | 
            ||
| 499 | * @param string $remark2 ransfer remark for receiver  | 
            ||
| 500 | * @param string $sourceAccountNumber Source of Fund Account Number  | 
            ||
| 501 | * @param string $transactionID Transcation ID unique per day (using UTC+07 Time Zone). Format: Number  | 
            ||
| 502 | * @param string $currencyCode nilai MATA Uang [Optional]  | 
            ||
| 503 | *  | 
            ||
| 504 | * @return \Unirest\Response  | 
            ||
| 505 | */  | 
            ||
| 506 | public function fundTransfers(  | 
            ||
| 507 | $oauth_token,  | 
            ||
| 508 | $amount,  | 
            ||
| 509 | $sourceAccountNumber,  | 
            ||
| 510 | $beneficiaryAccountNumber,  | 
            ||
| 511 | $referenceID,  | 
            ||
| 512 | $remark1,  | 
            ||
| 513 | $remark2,  | 
            ||
| 514 | $transactionID,  | 
            ||
| 515 | $currencyCode = 'idr'  | 
            ||
| 516 | )  | 
            ||
| 517 |     { | 
            ||
| 518 | $uriSign = "POST:/banking/corporates/transfers";  | 
            ||
| 519 | |||
| 520 | $isoTime = self::generateIsoTime();  | 
            ||
| 521 | |||
| 522 | $headers = array();  | 
            ||
| 523 | $headers['Accept'] = 'application/json';  | 
            ||
| 524 | $headers['Content-Type'] = 'application/json';  | 
            ||
| 525 | $headers['Authorization'] = "Bearer $oauth_token";  | 
            ||
| 526 | $headers['X-BCA-Key'] = $this->settings['api_key'];  | 
            ||
| 527 | $headers['X-BCA-Timestamp'] = $isoTime;  | 
            ||
| 528 | |||
| 529 | $request_path = "banking/corporates/transfers";  | 
            ||
| 530 | $domain = $this->ddnDomain();  | 
            ||
| 531 | $full_url = $domain . $request_path;  | 
            ||
| 532 | |||
| 533 | $bodyData = array();  | 
            ||
| 534 | $bodyData['Amount'] = $amount;  | 
            ||
| 535 |         $bodyData['BeneficiaryAccountNumber'] = strtolower(str_replace(' ', '', $beneficiaryAccountNumber)); | 
            ||
| 536 |         $bodyData['CorporateID'] = strtolower(str_replace(' ', '', $this->settings['corp_id'])); | 
            ||
| 537 | $bodyData['CurrencyCode'] = $currencyCode;  | 
            ||
| 538 |         $bodyData['ReferenceID'] = strtolower(str_replace(' ', '', $referenceID)); | 
            ||
| 539 |         $bodyData['Remark1'] = strtolower(str_replace(' ', '', $remark1)); | 
            ||
| 540 |         $bodyData['Remark2'] = strtolower(str_replace(' ', '', $remark2)); | 
            ||
| 541 |         $bodyData['SourceAccountNumber'] = strtolower(str_replace(' ', '', $sourceAccountNumber)); | 
            ||
| 542 | $bodyData['TransactionDate'] = $isoTime;  | 
            ||
| 543 |         $bodyData['TransactionID'] = strtolower(str_replace(' ', '', $transactionID)); | 
            ||
| 544 | |||
| 545 | // Harus disort agar mudah kalkulasi HMAC  | 
            ||
| 546 | ksort($bodyData);  | 
            ||
| 547 | |||
| 548 | $authSignature = self::generateSign($uriSign, $oauth_token, $this->settings['secret_key'], $isoTime, $bodyData);  | 
            ||
| 549 | |||
| 550 | $headers['X-BCA-Signature'] = $authSignature;  | 
            ||
| 551 | |||
| 552 | // Supaya jgn strip "ReferenceID" "/" jadi "/\" karena HMAC akan menjadi tidak cocok  | 
            ||
| 553 | $encoderData = json_encode($bodyData, JSON_UNESCAPED_SLASHES);  | 
            ||
| 554 | |||
| 555 | $body = Body::form($encoderData);  | 
            ||
| 556 | $response = Request::post($full_url, $headers, $body);  | 
            ||
| 557 | |||
| 558 | return $response;  | 
            ||
| 559 | }  | 
            ||
| 560 | |||
| 561 | /**  | 
            ||
| 562 | * Realtime deposit untuk produk BCA.  | 
            ||
| 563 | *  | 
            ||
| 564 | * @param string $oauth_token nilai token yang telah didapatkan setelah login  | 
            ||
| 565 | *  | 
            ||
| 566 | * @return \Unirest\Response  | 
            ||
| 567 | */  | 
            ||
| 568 | public function getDepositRate($oauth_token)  | 
            ||
| 569 |     { | 
            ||
| 570 | $uriSign = "GET:/general/rate/deposit";  | 
            ||
| 571 | $isoTime = self::generateIsoTime();  | 
            ||
| 572 | $authSignature = self::generateSign($uriSign, $oauth_token, $this->settings['secret_key'], $isoTime, null);  | 
            ||
| 573 | |||
| 574 | $headers = array();  | 
            ||
| 575 | $headers['Accept'] = 'application/json';  | 
            ||
| 576 | $headers['Content-Type'] = 'application/json';  | 
            ||
| 577 | $headers['Authorization'] = "Bearer $oauth_token";  | 
            ||
| 578 | $headers['X-BCA-Key'] = $this->settings['api_key'];  | 
            ||
| 579 | $headers['X-BCA-Timestamp'] = $isoTime;  | 
            ||
| 580 | $headers['X-BCA-Signature'] = $authSignature;  | 
            ||
| 581 | |||
| 582 | $request_path = "general/rate/deposit";  | 
            ||
| 583 | $domain = $this->ddnDomain();  | 
            ||
| 584 | $full_url = $domain . $request_path;  | 
            ||
| 585 | |||
| 586 |         $data = array('grant_type' => 'client_credentials'); | 
            ||
| 587 | |||
| 588 | $body = Body::form($data);  | 
            ||
| 589 | $response = Request::get($full_url, $headers, $body);  | 
            ||
| 590 | |||
| 591 | return $response;  | 
            ||
| 592 | }  | 
            ||
| 593 | |||
| 594 | /**  | 
            ||
| 595 | * Generate Signature.  | 
            ||
| 596 | *  | 
            ||
| 597 | * @param string $url Url yang akan disign.  | 
            ||
| 598 | * @param string $auth_token string nilai token dari login.  | 
            ||
| 599 | * @param string $secret_key string secretkey yang telah diberikan oleh BCA.  | 
            ||
| 600 | * @param string $isoTime string Waktu ISO8601.  | 
            ||
| 601 | * @param array|mixed $bodyToHash array Body yang akan dikirimkan ke Server BCA.  | 
            ||
| 602 | *  | 
            ||
| 603 | * @return string  | 
            ||
| 604 | */  | 
            ||
| 605 | public static function generateSign($url, $auth_token, $secret_key, $isoTime, $bodyToHash = [])  | 
            ||
| 606 |     { | 
            ||
| 607 |         $hash = hash("sha256", ""); | 
            ||
| 608 |         if (is_array($bodyToHash)) { | 
            ||
| 609 | ksort($bodyToHash);  | 
            ||
| 610 | $encoderData = json_encode($bodyToHash, JSON_UNESCAPED_SLASHES);  | 
            ||
| 611 |             $hash = hash("sha256", $encoderData); | 
            ||
| 612 | }  | 
            ||
| 613 | $stringToSign = $url . ":" . $auth_token . ":" . $hash . ":" . $isoTime;  | 
            ||
| 614 |         $auth_signature = hash_hmac('sha256', $stringToSign, $secret_key, false); | 
            ||
| 615 | |||
| 616 | return $auth_signature;  | 
            ||
| 617 | }  | 
            ||
| 618 | |||
| 619 | /**  | 
            ||
| 620 | * Set TimeZone.  | 
            ||
| 621 | *  | 
            ||
| 622 | * @param string $timeZone Time yang akan dipergunakan.  | 
            ||
| 623 | *  | 
            ||
| 624 | * @return string  | 
            ||
| 625 | */  | 
            ||
| 626 | public static function setTimeZone($timeZone)  | 
            ||
| 627 |     { | 
            ||
| 628 | self::$timezone = $timeZone;  | 
            ||
| 629 | return self::$timezone;  | 
            ||
| 630 | }  | 
            ||
| 631 | |||
| 632 | /**  | 
            ||
| 633 | * Get TimeZone.  | 
            ||
| 634 | *  | 
            ||
| 635 | * @return string  | 
            ||
| 636 | */  | 
            ||
| 637 | public static function getTimeZone()  | 
            ||
| 638 |     { | 
            ||
| 639 | return self::$timezone;  | 
            ||
| 640 | }  | 
            ||
| 641 | |||
| 642 | /**  | 
            ||
| 643 | * Set nama domain BCA yang akan dipergunakan.  | 
            ||
| 644 | *  | 
            ||
| 645 | * @param string $hostName nama domain BCA yang akan dipergunakan.  | 
            ||
| 646 | *  | 
            ||
| 647 | * @return string  | 
            ||
| 648 | */  | 
            ||
| 649 | public static function setHostName($hostName)  | 
            ||
| 650 |     { | 
            ||
| 651 | self::$hostName = $hostName;  | 
            ||
| 652 | |||
| 653 | return self::$hostName;  | 
            ||
| 654 | }  | 
            ||
| 655 | |||
| 656 | /**  | 
            ||
| 657 | * Ambil nama domain BCA yang akan dipergunakan.  | 
            ||
| 658 | *  | 
            ||
| 659 | * @return string  | 
            ||
| 660 | */  | 
            ||
| 661 | public static function getHostName()  | 
            ||
| 662 |     { | 
            ||
| 663 | return self::$hostName;  | 
            ||
| 664 | }  | 
            ||
| 665 | |||
| 666 | /**  | 
            ||
| 667 | * Ambil maximum execution time.  | 
            ||
| 668 | *  | 
            ||
| 669 | * @return string  | 
            ||
| 670 | */  | 
            ||
| 671 | public static function getTimeOut()  | 
            ||
| 672 |     { | 
            ||
| 673 | return self::$timeOut;  | 
            ||
| 674 | }  | 
            ||
| 675 | |||
| 676 | /**  | 
            ||
| 677 | * Ambil nama domain BCA yang akan dipergunakan.  | 
            ||
| 678 | *  | 
            ||
| 679 | * @return string  | 
            ||
| 680 | */  | 
            ||
| 681 | public static function getCurlOptions()  | 
            ||
| 682 |     { | 
            ||
| 683 | return self::$curlOptions;  | 
            ||
| 684 | }  | 
            ||
| 685 | |||
| 686 | /**  | 
            ||
| 687 | * Setup curl options.  | 
            ||
| 688 | *  | 
            ||
| 689 | * @param array $curlOpts  | 
            ||
| 690 | * @return array  | 
            ||
| 691 | */  | 
            ||
| 692 | public static function setCurlOptions(array $curlOpts = [])  | 
            ||
| 699 | }  | 
            ||
| 700 | |||
| 701 | /**  | 
            ||
| 702 | * Set Ambil maximum execution time.  | 
            ||
| 703 | *  | 
            ||
| 704 | * @param int $timeOut timeout in milisecond.  | 
            ||
| 705 | *  | 
            ||
| 706 | * @return string  | 
            ||
| 707 | */  | 
            ||
| 708 | public static function setTimeOut($timeOut)  | 
            ||
| 709 |     { | 
            ||
| 710 | self::$timeOut = $timeOut;  | 
            ||
| 711 | |||
| 712 | // return.  | 
            ||
| 713 | return self::$timeOut;  | 
            ||
| 714 | }  | 
            ||
| 715 | |||
| 716 | /**  | 
            ||
| 717 | * Set BCA port  | 
            ||
| 718 | *  | 
            ||
| 719 | * @param int $port Port yang akan dipergunakan  | 
            ||
| 720 | *  | 
            ||
| 721 | * @return int  | 
            ||
| 722 | */  | 
            ||
| 723 | public static function setPort($port)  | 
            ||
| 729 | }  | 
            ||
| 730 | |||
| 731 | /**  | 
            ||
| 732 | * Get BCA port  | 
            ||
| 733 | *  | 
            ||
| 734 | * @return int  | 
            ||
| 735 | */  | 
            ||
| 736 | public static function getPort()  | 
            ||
| 737 |     { | 
            ||
| 738 | return self::$port;  | 
            ||
| 739 | }  | 
            ||
| 740 | |||
| 741 | /**  | 
            ||
| 742 | * Set BCA Schema  | 
            ||
| 743 | *  | 
            ||
| 744 | * @param int $scheme Scheme yang akan dipergunakan  | 
            ||
| 745 | *  | 
            ||
| 746 | * @return string  | 
            ||
| 747 | */  | 
            ||
| 748 | public static function setScheme($scheme)  | 
            ||
| 749 |     { | 
            ||
| 750 | self::$scheme = $scheme;  | 
            ||
| 751 | |||
| 752 | // return.  | 
            ||
| 753 | return self::$scheme;  | 
            ||
| 754 | }  | 
            ||
| 755 | |||
| 756 | /**  | 
            ||
| 757 | * Get BCA Schema  | 
            ||
| 758 | *  | 
            ||
| 759 | * @return string  | 
            ||
| 760 | */  | 
            ||
| 761 | public static function getScheme()  | 
            ||
| 762 |     { | 
            ||
| 763 | return self::$scheme;  | 
            ||
| 764 | }  | 
            ||
| 765 | |||
| 766 | /**  | 
            ||
| 767 | * Generate ISO8601 Time.  | 
            ||
| 768 | *  | 
            ||
| 769 | * @return string  | 
            ||
| 770 | */  | 
            ||
| 771 | public static function generateIsoTime()  | 
            ||
| 772 |     { | 
            ||
| 773 | $date = Carbon::now(self::getTimeZone());  | 
            ||
| 774 | date_default_timezone_set(self::getTimeZone());  | 
            ||
| 775 |         $fmt = $date->format('Y-m-d\TH:i:s'); | 
            ||
| 776 |         $ISO8601 = sprintf("$fmt.%s%s", substr(microtime(), 2, 3), date('P')); | 
            ||
| 777 | |||
| 778 | return $ISO8601;  | 
            ||
| 779 | }  | 
            ||
| 780 | |||
| 781 | /**  | 
            ||
| 782 | * Generate ISO8601 Time.  | 
            ||
| 783 | *  | 
            ||
| 784 | * @return string  | 
            ||
| 785 | */  | 
            ||
| 786 | public static function generateDateTransaction()  | 
            ||
| 787 |     { | 
            ||
| 788 | $date = Carbon::now(self::getTimeZone());  | 
            ||
| 789 | date_default_timezone_set(self::getTimeZone());  | 
            ||
| 790 |         $fmt = $date->format('Y-m-d'); | 
            ||
| 791 | |||
| 792 | return $fmt;  | 
            ||
| 793 | }  | 
            ||
| 794 | |||
| 795 | /**  | 
            ||
| 796 | * Merge from existing array.  | 
            ||
| 797 | *  | 
            ||
| 798 | * @param array $existing_options  | 
            ||
| 799 | * @param array $new_options  | 
            ||
| 800 | * @return array  | 
            ||
| 801 | */  | 
            ||
| 802 | private static function mergeCurlOptions(&$existing_options, $new_options)  | 
            ||
| 806 | }  | 
            ||
| 807 | |||
| 808 | /**  | 
            ||
| 809 | * Validasi jika clientsecret telah di-definsikan.  | 
            ||
| 810 | *  | 
            ||
| 811 | * @param array $sourceAccountId  | 
            ||
| 812 | *  | 
            ||
| 813 | * @throws BcaHttpException Error jika array tidak memenuhi syarat  | 
            ||
| 814 | * @return bool  | 
            ||
| 815 | */  | 
            ||
| 816 | private function validateArray($sourceAccountId = [])  | 
            ||
| 831 | }  | 
            ||
| 832 | |||
| 833 | /**  | 
            ||
| 834 | * Implode an array with the key and value pair giving  | 
            ||
| 835 | * a glue, a separator between pairs and the array  | 
            ||
| 836 | * to implode.  | 
            ||
| 837 | *  | 
            ||
| 838 | * @param string $glue The glue between key and value  | 
            ||
| 839 | * @param string $separator Separator between pairs  | 
            ||
| 840 | * @param array $array The array to implode  | 
            ||
| 841 | *  | 
            ||
| 842 | * @throws BcaHttpException error  | 
            ||
| 843 | * @return string The imploded array  | 
            ||
| 844 | */  | 
            ||
| 845 | public static function arrayImplode($glue, $separator, $array = [])  | 
            ||
| 861 | }  | 
            ||
| 862 | }  | 
            ||
| 863 |