diff --git a/.gitignore b/.gitignore index e601ce9..820a581 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ vendor .php_cs.cache composer.lock build +coverage.xml +*coverage* diff --git a/README.md b/README.md index 9bcf53d..1d9bb0e 100644 --- a/README.md +++ b/README.md @@ -203,7 +203,7 @@ Pastikan anda mendapatkan nilai ```TOKEN``` dan ```TOKEN``` tersebut masih berla echo json_encode($response); ``` -### FUND TRANSFER +### FUND TRANSFER (UPDATED) Pastikan anda mendapatkan nilai ```TOKEN``` dan ```TOKEN``` tersebut masih berlaku (Tidak Expired). @@ -229,6 +229,9 @@ Pastikan anda mendapatkan nilai ```TOKEN``` dan ```TOKEN``` tersebut masih berla $remark2 = 'Online Transfer Using Odenktools BCA'; + // value hanya support idr dan usd + $mataUang = 'idr'; + $response = $bca->fundTransfers($token, $amount, $nomorakun, @@ -236,7 +239,8 @@ Pastikan anda mendapatkan nilai ```TOKEN``` dan ```TOKEN``` tersebut masih berla $nomorPO, $remark1, $remark2, - $nomorTransaksiID); + $nomorTransaksiID, + $mataUang); // Cek hasil response berhasil atau tidak echo json_encode($response); diff --git a/composer.json b/composer.json index 7320186..cb4a668 100644 --- a/composer.json +++ b/composer.json @@ -3,13 +3,13 @@ "type": "library", "description": "Library REST API Untuk Develop BCA Payment", "keywords": [ - "http", - "rest", - "php", - "BCA", - "BCA PHP", - "banking", - "HTTP client" + "http", + "rest", + "php", + "BCA", + "BCA PHP", + "banking", + "HTTP client" ], "homepage": "https://github.com/odenktools/php-bca", "license": "MIT", @@ -23,7 +23,7 @@ "php": ">=5.4", "ext-curl": "*", "mashape/unirest-php": "3.0.4", - "nesbot/carbon": "~1.18" + "nesbot/carbon": "~1.18 || ^2.41" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0" diff --git a/lib/Bca/BcaHttp.php b/lib/Bca/BcaHttp.php index 8cebbf1..cb4d170 100644 --- a/lib/Bca/BcaHttp.php +++ b/lib/Bca/BcaHttp.php @@ -11,11 +11,11 @@ * * @author Pribumi Technology * @license MIT - * @copyright (c) 2017, Pribumi Technology + * @copyright (c) 2017-2021, Pribumi Technology */ class BcaHttp { - public static $VERSION = '2.3.1'; + public static $VERSION = '2.3.3'; /** * Default Timezone. @@ -151,8 +151,8 @@ public function __construct($corp_id, $client_id, $client_secret, $api_key, $sec $this->settings['timezone'] = $options['timezone']; $this->settings['options']['timezone'] = $options['timezone']; } else { - $this->settings['timezone'] = self::getHostName(); - $this->settings['options']['timezone'] = self::getHostName(); + $this->settings['timezone'] = self::getTimeZone(); + $this->settings['options']['timezone'] = self::getTimeZone(); } // Setup optional timeout, if timeout is empty @@ -273,26 +273,22 @@ public function getBalanceInfo($oauth_token, $sourceAccountId = []) * @param array $sourceAccount nomor akun yang akan dicek * @param string $startDate tanggal awal * @param string $endDate tanggal akhir - * @param string $corp_id nilai CorporateID yang telah diberikan oleh pihak BCA * * @return \Unirest\Response */ public function getAccountStatement($oauth_token, $sourceAccount, $startDate, $endDate) { $corp_id = $this->settings['corp_id']; - $uriSign = "GET:/banking/v3/corporates/$corp_id/accounts/$sourceAccount/statements?EndDate=$endDate&StartDate=$startDate"; $isoTime = self::generateIsoTime(); $authSignature = self::generateSign($uriSign, $oauth_token, $this->settings['secret_key'], $isoTime, null); - $headers = array(); $headers['Accept'] = 'application/json'; $headers['Content-Type'] = 'application/json'; $headers['Authorization'] = "Bearer $oauth_token"; - $headers['X-BCA-Key'] = $this->settings['secret_key']; + $headers['X-BCA-Key'] = $this->settings['api_key']; $headers['X-BCA-Timestamp'] = $isoTime; $headers['X-BCA-Signature'] = $authSignature; - $request_path = "banking/v3/corporates/$corp_id/accounts/$sourceAccount/statements?EndDate=$endDate&StartDate=$startDate"; $domain = $this->ddnDomain(); $full_url = $domain . $request_path; @@ -300,7 +296,6 @@ public function getAccountStatement($oauth_token, $sourceAccount, $startDate, $e $data = array('grant_type' => 'client_credentials'); $body = Body::form($data); $response = Request::get($full_url, $headers, $body); - return $response; } @@ -357,6 +352,96 @@ public function getAtmLocation( return $response; } + /** + * Transfer dana kepada akun yang berbeda bank dengan jumlah nominal tertentu. + * + * @param string $oauth_token nilai token yang telah didapatkan setelah login. + * @param string $channelId Unknown description. + * @param int $amount nilai dana dalam RUPIAH yang akan ditransfer, Format: 13.2 + * @param string $sourceAccountNumber Source of Fund Account Number + * @param string $beneficiaryAccountNumber BCA Account number to be credited (Destination) + * @param string $beneficiaryBankCode Kode Bank to be credited (Destination) + * @param string $beneficiaryCustResidence 1 = Resident 2 = Non Resident *mandatory, if transfer_type = LLG/RTG + * @param string $beneficiaryCustType 1 = Personal 2 = Corporate 3 = Government *mandatory, if transfer_type = LLG/RTG + * @param string $beneficiaryName Nama penerima. + * @param string $beneficiaryEmail Email penerima. + * @param string $transactionID Transcation ID unique per day (using UTC+07 Time Zone). Format: Number + * @param string $transactionType ONL (Switching) ; LLG; RTG (RTGS) + * @param string $remark1 Transfer remark for receiver + * @param string $remark2 ransfer remark for receiver + * @param string $currencyCode nilai MATA Uang [Optional] + * + * @return \Unirest\Response + */ + public function fundTransfersDomestic( + $oauth_token, + $channelId, + $amount, + $sourceAccountNumber, + $beneficiaryAccountNumber, + $beneficiaryBankCode, + $beneficiaryCustResidence, + $beneficiaryCustType, + $beneficiaryName, + $beneficiaryEmail, + $transactionID, + $transactionType, + $remark1, + $remark2, + $currencyCode = 'IDR' + ) + { + $uriSign = "POST:/banking/corporates/transfers/v2/domestic"; + $isoTime = self::generateIsoTime(); + $headers = array(); + $headers['Accept'] = 'application/json'; + $headers['Content-Type'] = 'application/json'; + $headers['Authorization'] = "Bearer $oauth_token"; + $headers['X-BCA-Key'] = $this->settings['api_key']; + $headers['X-BCA-Timestamp'] = $isoTime; + $headers['channel-id'] = $channelId; + $headers['credential-id'] = $this->settings['corp_id']; + + $request_path = "banking/corporates/transfers/v2/domestic"; + $domain = $this->ddnDomain(); + $full_url = $domain . $request_path; + + $bodyData = array(); + $bodyData['amount'] = $amount; + $bodyData['beneficiary_account_number'] = strtolower(str_replace(' ', '', $beneficiaryAccountNumber)); + $bodyData['beneficiary_bank_code'] = strtolower(str_replace(' ', '', $beneficiaryBankCode)); + $bodyData['beneficiary_cust_residence'] = $beneficiaryCustResidence; + $bodyData['beneficiary_cust_type'] = $beneficiaryCustType; + $bodyData['beneficiary_name'] = strtolower(str_replace(' ', '', $beneficiaryName)); + if (empty($beneficiaryEmail) || $beneficiaryEmail === '') { + $bodyData['beneficiary_email'] = ''; + } else { + $bodyData['beneficiary_email'] = strtolower(str_replace(' ', '', $beneficiaryEmail)); + } + $bodyData['currency_code'] = $currencyCode; + $bodyData['remark1'] = !empty($remark1) ? strtolower(str_replace(' ', '', $remark1)) : ""; + $bodyData['remark1'] = !empty($remark2) ? strtolower(str_replace(' ', '', $remark2)) : ""; + $bodyData['source_account_number'] = strtolower(str_replace(' ', '', $sourceAccountNumber)); + $bodyData['transaction_date'] = self::generateDateTransaction(); + $bodyData['transaction_id'] = strtolower(str_replace(' ', '', $transactionID)); + $bodyData['transfer_type'] = strtoupper(str_replace(' ', '', $transactionType)); + + // Harus disort agar mudah kalkulasi HMAC + ksort($bodyData); + + $authSignature = self::generateSign($uriSign, $oauth_token, $this->settings['secret_key'], $isoTime, $bodyData); + + $headers['X-BCA-Signature'] = $authSignature; + + // Supaya jgn strip "ReferenceID" "/" jadi "/\" karena HMAC akan menjadi tidak cocok + $encoderData = json_encode($bodyData, JSON_UNESCAPED_SLASHES); + + $body = Body::form($encoderData); + $response = Request::post($full_url, $headers, $body); + + return $response; + } + /** * Ambil KURS mata uang. * @@ -414,7 +499,7 @@ public function getForexRate( * @param string $remark2 ransfer remark for receiver * @param string $sourceAccountNumber Source of Fund Account Number * @param string $transactionID Transcation ID unique per day (using UTC+07 Time Zone). Format: Number - * @param string $corp_id nilai CorporateID yang telah diberikan oleh pihak BCA [Optional] + * @param string $currencyCode nilai MATA Uang [Optional] * * @return \Unirest\Response */ @@ -426,7 +511,8 @@ public function fundTransfers( $referenceID, $remark1, $remark2, - $transactionID + $transactionID, + $currencyCode = 'idr' ) { $uriSign = "POST:/banking/corporates/transfers"; @@ -448,7 +534,7 @@ public function fundTransfers( $bodyData['Amount'] = $amount; $bodyData['BeneficiaryAccountNumber'] = strtolower(str_replace(' ', '', $beneficiaryAccountNumber)); $bodyData['CorporateID'] = strtolower(str_replace(' ', '', $this->settings['corp_id'])); - $bodyData['CurrencyCode'] = 'idr'; + $bodyData['CurrencyCode'] = $currencyCode; $bodyData['ReferenceID'] = strtolower(str_replace(' ', '', $referenceID)); $bodyData['Remark1'] = strtolower(str_replace(' ', '', $remark1)); $bodyData['Remark2'] = strtolower(str_replace(' ', '', $remark2)); @@ -540,6 +626,7 @@ public static function generateSign($url, $auth_token, $secret_key, $isoTime, $b public static function setTimeZone($timeZone) { self::$timezone = $timeZone; + return self::$timezone; } /** @@ -562,6 +649,8 @@ public static function getTimeZone() public static function setHostName($hostName) { self::$hostName = $hostName; + + return self::$hostName; } /** @@ -604,6 +693,9 @@ public static function setCurlOptions(array $curlOpts = []) { $data = self::mergeCurlOptions(self::$curlOptions, $curlOpts); self::$curlOptions = $data; + + // return. + return self::$curlOptions; } /** @@ -616,6 +708,8 @@ public static function setCurlOptions(array $curlOpts = []) public static function setTimeOut($timeOut) { self::$timeOut = $timeOut; + + // return. return self::$timeOut; } @@ -629,6 +723,9 @@ public static function setTimeOut($timeOut) public static function setPort($port) { self::$port = $port; + + // return. + return self::$port; } /** @@ -651,6 +748,9 @@ public static function getPort() public static function setScheme($scheme) { self::$scheme = $scheme; + + // return. + return self::$scheme; } /** @@ -666,8 +766,6 @@ public static function getScheme() /** * Generate ISO8601 Time. * - * @param string $timeZone Time yang akan dipergunakan - * * @return string */ public static function generateIsoTime() @@ -680,6 +778,20 @@ public static function generateIsoTime() return $ISO8601; } + /** + * Generate ISO8601 Time. + * + * @return string + */ + public static function generateDateTransaction() + { + $date = Carbon::now(self::getTimeZone()); + date_default_timezone_set(self::getTimeZone()); + $fmt = $date->format('Y-m-d'); + + return $fmt; + } + /** * Merge from existing array. *