v1.0.0
1.0.0.0BKM Express Payment Library
MIT
The Requires
- php >=5.4.0
- illuminate/support 5.0.*
by Erkin Cakar
payment e-commerce bkm express
BKM Express Payment Library
BKM Express is easy and fast payment system in Turkey which makes possible online payments without giving whole credit card information so this library provides you a simple API for it., (*2)
You can simply install this library via Composer., (*3)
Firstly, add this line into your composer.json
, (*4)
{ "require": { "travijuu/bkm-express": "1.0.3" } }
and then run composer update
command., (*5)
There are four steps to make payment transaction., (*6)
Let's start with first step., (*7)
use Travijuu\BkmExpress\BkmExpress; use Travijuu\BkmExpress\Common\Bank; use Travijuu\BkmExpress\Common\Bin; use Travijuu\BkmExpress\Common\Installment; $mid = '7b928290-b6d2-469e-ac10-29eb36b8c1f6'; // BKM Merchant ID $successUrl = 'https://example.com/bkm/success'; $cancelUrl = 'https://example.com/bkm/error'; $privateKeyPath = '/path/to/mykey.pem'; $publicKeyPath = '/path/to/mykey.pub'; $bkmPublicKeyPath = '/path/to/bkm.pub'; // Infrastructure of the bank you choose as a default payment gateway. // ['Posnet', 'NestPay', 'Gvp'] one of them should be chosen. $defaultBank = 'NestPay'; $bkm = new BkmExpress($mid, $successUrl, $cancelUrl, $privateKeyPath, $publicKeyPath, $bkmPublicKeyPath, $defaultBank); $wsdl = '/path/to/BkmExpressPaymentService.wsdl'; $sAmount = 100.50; // Sale Amount $cAmount = 4.50; // Cargo Amount $banks = []; $bank = new Bank('0062', 'Garanti Bank', 'Garanti Bank via BKM Express'); $bin = new Bin('554960'); $installment = new Installment($cAmount, $sAmount, 1, 'Garanti Bank without installment', true); $bin->addInstallment($installment); $installment = new Installment($cAmount, $sAmount, 3, 'Garanti Bank with 3 installments', true); $bin->addInstallment($installment); $bank->addBin($bin); $banks[] = $bank; $response = $bkm->initPayment($wsdl, $sAmount, $cAmount, $banks);
Then, make POST request to $response->getUrl()
with 3 parameters by redirecting page to BKM Express, (*8)
[ 't' => $response->getToken(), 's' => $response->getSignature(), 'ts' => $response->getTimestamp() ]
Another way of POST request. (But not preferred), (*9)
After this step, you should be redirected to BKM Express website., (*10)
Once customer logged into the system, available credit cards will be listed. So, customer can see all installment options which are sent in initialize payment request., (*11)
After credit card selection, a SMS password will be requested from customer., (*12)
In next step, BKM Express will make a SOAP request to your application to get bank API information which is related to customer's selected card (Request Merch Info
), (*13)
IMPORTANT: You should declare a webservice url to BKM Express customer service., (*14)
Thus, BKM Express will make a SOAP request to this url to get bank API information from your server., (*15)
use Travijuu\BkmExpress\Common\VirtualPos; use Travijuu\BkmExpress\Payment\RequestMerchInfo\RequestMerchInfoWSRequest; $wsdlServer = '/path/to/RequestMerchInfoService_latest.wsdl'; $virtualPosList = []; $virtualPos = new VirtualPos(); $virtualPos->setPosUrl('https://sanalposprovtest.garanti.com.tr/VPServlet') ->setPosUid('600218'); ->setPosPwd('123qweASD'); ->setMpiUrl('https://sanalposprovtest.garanti.com.tr/servlet/gt3dengine') ->setMpiUid('600218') ->setMpiPwd('123qweASD') ->setMd('') ->setXid('') ->setCIp('192.168.0.1') ->setExtra('{"terminalprovuserid":"PROVAUT", "terminalmerchantid":"7000679", "storekey":"12345678", "terminalid":"30690168"}') ->setIs3ds(false) ->setIs3dsFDec(false); // Garanti Bank Id: 0062 $virtualPosList['0062'] = $virtualPos; /* This callback can help you to be informed what kind of * payment method is selected in BKM Express website. * You may insert this into database for info purposes. * Note: This is optional. */ $callback = function(RequestMerchInfoWSRequest $request) { $token = $response->getToken(); $bankId = $response->getBankId(); $installment = $response->getInstallment(); ... } $bkm->requestMerchInfo($wsdlServer, $virtualPosList, $callback);
The result of this request will be returned to BKM Express and it will make a bank transaction with your bank API information. After that, BKM Express will make a POST request according to the result of the bank transaction (success / cancel url
), (*16)
BKM Express will make a POST request to success url (https://example.com/bkm/success) or cancel url (https://example.com/bkm/error) You need to get the POST data and pass it into confirm function, (*17)
Note: https://example.com/bkm/success/{orderCode} You can use your success url like this so that can help you to understand which order you are trying to pay., (*18)
// This part can be used in both success and cancel url. $confirmation->success() will return the result. $data = $_POST; $confirmation = $bkm->confirm($data); if ($confirmation->isSuccess())Ā { // remember the callback which I decribed above. If you save $token, $bankId, $installment into your database, now you can use them to identify the posResponse. $token = $confirmation->getToken(); $bankId = '0062'; // get the bank Id from database according to token $posResponse = $bkm->getPosResponse($bankId, $confirmation->getPosRef()); // This means that bank transcation is successfully completed so you got the money // now you can save the success result to your database. if ($posResponse->isSuccess()) { $authCode = $posResponse->getAuthCode(); $rawResponse = $posResponse->getRawResponse(); ... } else { // Transaction failed so get the error message and code $errorCode = $posResponse->getResponseCode(); $errorMessage = $posResponse->getResponseMessage(); ... } }
Apart from success url
, BKM Express will do this POST request to your confirmation URL for precaution. They assumed that the request sent to success url
may not be reached., (*19)
IMPORTANT: You should declare confirmation url to BKM Express customer service., (*20)
$data = $_POST; $confirmation = $bkm->confirm($data); /* You can use the same methodology as above. * Save $token, $bankId, $installment into your database, * now you can use them to identify the posResponse. (Garanti, YKB, Akbank, etc..) */ $token = $confirmation->getToken(); $bankId = '0062'; // get the bank Id from database according to token $posResponse = $bkm->getPosResponse($bankId, $confirmation->getPosRef());
If you have any suggestions, feel free to create an issue here on Github and/or fork this repo, make changes and submit a pull request!, (*21)
BKM Express Payment Library
MIT
payment e-commerce bkm express