This post is a part of the following video playlist. So, First of all, you should watch the following video otherwise you will not understand properly about this post.
VIDEO
Requirements:
Installation Command:
composer require karim007/laravel-bkash-tokenize
Vendor publish (config) Command:
php artisan vendor:publish --provider="Karim007\LaravelBkashTokenize\BkashTokenizeServiceProvider" --tag="config"
After publish config file setup your credential. you can see the following code in your config directory bkash.php file
"sandbox" => env("BKASH_SANDBOX", true),
"bkash_app_key" => env("BKASH_APP_KEY", ""),
"bkash_app_secret" => env("BKASH_APP_SECRET", ""),
"bkash_username" => env("BKASH_USERNAME", ""),
"bkash_password" => env("BKASH_PASSWORD", ""),
"callbackURL" => env("BKASH_CALLBACK_URL", "http://127.0.0.1:8000/bkash/callback"),
'timezone' => 'Asia/Dhaka',
Now Set .env configuration
BKASH_SANDBOX=true #for production use false
BKASH_APP_KEY=""
BKASH_APP_SECRET=""
BKASH_USERNAME=""
BKASH_PASSWORD=""
BKASH_CALLBACK_URL=""
Publish a Controller Command:
php artisan vendor:publish --provider="Karim007\LaravelBkashTokenize\BkashTokenizeServiceProvider" --tag="controllers"
You can override the routes (routes must be in authenticate because bKash prefer it)
Route::group(['middleware' => ['web']], function () {
// Payment Routes for bKash
Route::get('/bkash/payment', [App\Http\Controllers\BkashTokenizePaymentController::class,'index']);
Route::get('/bkash/create-payment', [App\Http\Controllers\BkashTokenizePaymentController::class,'createPayment'])->name('bkash-create-payment');
Route::get('/bkash/callback', [App\Http\Controllers\BkashTokenizePaymentController::class,'callBack'])->name('bkash-callBack');
//search payment
Route::get('/bkash/search/{trxID}', [App\Http\Controllers\BkashTokenizePaymentController::class,'searchTnx'])->name('bkash-serach');
//refund payment routes
Route::get('/bkash/refund', [App\Http\Controllers\BkashTokenizePaymentController::class,'refund'])->name('bkash-refund');
Route::get('/bkash/refund/status', [App\Http\Controllers\BkashTokenizePaymentController::class,'refundStatus'])->name('bkash-refund-status');
});
Payment Page (you will find it App\Http\Controllers\BkashTokenizePaymentController)
public function index()
{
return view('bkashT::bkash-payment');
}
Create Payment
public function createPayment(Request $request)
{
$inv = uniqid();
$request['intent'] = 'sale';
$request['mode'] = '0011';
$request['payerReference'] = $inv;
$request['currency'] = 'BDT';
$request['amount'] = 100;
$request['merchantInvoiceNumber'] = $inv;
$request['callbackURL'] = config("bkash.callbackURL");;
$request_data_json = json_encode($request->all());
$response = BkashPaymentTokenize::cPayment($request_data_json);
if (isset($response['bkashURL'])) return redirect()->away($response['bkashURL']);
else return redirect()->back()->with('error-alert2', $response['statusMessage']);
}
Now create payment response looks like below:
array[
"statusCode" => "0000"
"statusMessage" => "Successful"
"paymentID" => "TR0011WQ1674418613025"
"bkashURL" => "https://sandbox.payment.bkash.com/redirect/tokenized/?paymentID=TR0011WQ1674418613025&hash=t1-54Dtkmi*wr1KeWV55Z8fl5_DqsaW2q.zQWAQrPtpMsg*5zhuy3w17ZbXEvQ)qU7IT_ ▶"
"callbackURL" => "base_url/bkash/callback"
"successCallbackURL" => "base_url/bkash/callback?paymentID=TR0011WQ1674418613025&status=success"
"failureCallbackURL" => "base_url/bkash/callback?paymentID=TR0011WQ1674418613025&status=failure"
"cancelledCallbackURL" => "base_url/bkash/callback?paymentID=TR0011WQ1674418613025&status=cancel"
"amount" => "100"
"intent" => "sale"
"currency" => "BDT"
"paymentCreateTime" => "2023-01-23T02:16:57:784 GMT+0600"
"transactionStatus" => "Initiated"
"merchantInvoiceNumber" => "63cd99abe6bae"
]
Callback Function:
public function callBack(Request $request)
{
//paymentID=TR00117B1674409647770&status=success&apiVersion=1.2.0-beta
if ($request->status == 'success'){
$response = BkashPaymentTokenize::executePayment($request->paymentID);
if (!$response){
$response = BkashPaymentTokenize::queryPayment($request->paymentID);
}
if (isset($response['statusCode']) && $response['statusCode'] == "0000") return $this->success('Thank you for your payment',$response['trxID']);
return BkashPaymentTokenize::failure($response['statusMessage']);
}else if ($request->status == 'cancel'){
return BkashPaymentTokenize::cancel('Your payment is canceled');
}else{
return BkashPaymentTokenize::failure('Your transaction is failed');
}
}
Execute payment response looks like below:
{
"statusCode":"0000",
"statusMessage":"Successful",
"paymentID":"TR0011FN1674417661851",
"payerReference":"485605798",
"customerMsisdn":"01877722345",
"trxID":"AAN20A8HOI",
"amount":"100",
"transactionStatus":"Completed",
"paymentExecuteTime":"2023-01-23T02:04:05:736 GMT+0600",
"currency":"BDT",
"intent":"sale"
}
Query payment response looks like below:
{
"paymentID":"TR0011FN1674417661851",
"mode":"0011",
"paymentCreateTime":"2023-01-23T02:01:06:713 GMT+0600",
"paymentExecuteTime":"2023-01-23T02:04:05:736 GMT+0600",
"amount":"100",
"currency":"BDT",
"intent":"sale",
"merchantInvoice":"485605798",
"trxID":"AAN20A8HOI",
"transactionStatus":"Completed",
"verificationStatus":"Complete",
"statusCode":"0000",
"statusMessage":"Successful",
"payerReference":"485605798"
}
Search Transaction
public function searchTnx($trxID)
{
//response
/*{
"trxID":"AAN60A8IOQ",
"initiationTime":"2023-01-23T12:06:05:000 GMT+0600",
"completedTime":"2023-01-23T12:06:05:000 GMT+0600",
"transactionType":"bKash Tokenized Checkout via API",
"customerMsisdn":"01877722345",
"transactionStatus":"Completed",
"amount":"20",
"currency":"BDT",
"organizationShortCode":"50022",
"statusCode":"0000",
"statusMessage":"Successful"
}*/
return BkashPaymentTokenize::searchTransaction($trxID);
}
Refund Transaction
public function refund(Request $request)
{
$paymentID='paymentID';
$trxID='trxID';
$amount=5;
$reason='this is test reason';
$sku='abc';
//response
/*{
"statusCode":"0000",
"statusMessage":"Successful",
"originalTrxID":"AAN30A8M4T",
"refundTrxID":"AAN30A8M5N",
"transactionStatus":"Completed",
"amount":"5",
"currency":"BDT",
"charge":"0.00",
"completedTime":"2023-01-23T15:53:29:120 GMT+0600"
}*/
return BkashRefundTokenize::refund($paymentID,$trxID,$amount,$reason,$sku);
}
Refund Status Check
public function refundStatus(Request $request)
{
$paymentID='paymentID';
$trxID='trxID';
/*{
"statusCode":"0000",
"statusMessage":"Successful",
"originalTrxID":"AAN30A8M4T",
"refundTrxID":"AAN30A8M5N",
"transactionStatus":"Completed",
"amount":"5",
"currency":"BDT",
"charge":"0.00",
"completedTime":"2023-01-23T15:53:29:120 GMT+0600"
}*/
return BkashRefundTokenize::refundStatus($paymentID,$trxID);
}
Now, You Can Check by Using the Following Checkout Demo :
Go to: https://merchantdemo.sandbox.bka.sh/frontend/checkout/version/1.2.0-b eta
Wallet : 01770618575
OTP : 123456
PIN : 12121
1 Comment