Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@ vendor
.php_cs.cache
composer.lock
build
coverage.xml
*coverage*
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).

Expand All @@ -229,14 +229,18 @@ 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,
$nomordestinasi,
$nomorPO,
$remark1,
$remark2,
$nomorTransaksiID);
$nomorTransaksiID,
$mataUang);

// Cek hasil response berhasil atau tidak
echo json_encode($response);
Expand Down
16 changes: 8 additions & 8 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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"
Expand Down
142 changes: 127 additions & 15 deletions lib/Bca/BcaHttp.php
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -273,34 +273,29 @@ 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;

$data = array('grant_type' => 'client_credentials');
$body = Body::form($data);
$response = Request::get($full_url, $headers, $body);

return $response;
}

Expand Down Expand Up @@ -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.
*
Expand Down Expand Up @@ -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
*/
Expand All @@ -426,7 +511,8 @@ public function fundTransfers(
$referenceID,
$remark1,
$remark2,
$transactionID
$transactionID,
$currencyCode = 'idr'
)
{
$uriSign = "POST:/banking/corporates/transfers";
Expand All @@ -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));
Expand Down Expand Up @@ -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;
}

/**
Expand All @@ -562,6 +649,8 @@ public static function getTimeZone()
public static function setHostName($hostName)
{
self::$hostName = $hostName;

return self::$hostName;
}

/**
Expand Down Expand Up @@ -604,6 +693,9 @@ public static function setCurlOptions(array $curlOpts = [])
{
$data = self::mergeCurlOptions(self::$curlOptions, $curlOpts);
self::$curlOptions = $data;

// return.
return self::$curlOptions;
}

/**
Expand All @@ -616,6 +708,8 @@ public static function setCurlOptions(array $curlOpts = [])
public static function setTimeOut($timeOut)
{
self::$timeOut = $timeOut;

// return.
return self::$timeOut;
}

Expand All @@ -629,6 +723,9 @@ public static function setTimeOut($timeOut)
public static function setPort($port)
{
self::$port = $port;

// return.
return self::$port;
}

/**
Expand All @@ -651,6 +748,9 @@ public static function getPort()
public static function setScheme($scheme)
{
self::$scheme = $scheme;

// return.
return self::$scheme;
}

/**
Expand All @@ -666,8 +766,6 @@ public static function getScheme()
/**
* Generate ISO8601 Time.
*
* @param string $timeZone Time yang akan dipergunakan
*
* @return string
*/
public static function generateIsoTime()
Expand All @@ -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.
*
Expand Down