File: /home/mobilech/nepalapplesupport.com/shop/app/Http/Controllers/BkashPaymentController.php
<?php
namespace App\Http\Controllers;
use App\CPU\CartManager;
use App\CPU\Convert;
use App\CPU\Helpers;
use App\CPU\OrderManager;
use Brian2694\Toastr\Facades\Toastr;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
class BkashPaymentController extends Controller
{
private $base_url;
private $app_key;
private $app_secret;
private $username;
private $password;
public function __construct()
{
$config=\App\CPU\Helpers::get_business_settings('bkash');
// You can import it from your Database
$bkash_app_key = $config['api_key']; // bKash Merchant API APP KEY
$bkash_app_secret = $config['api_secret']; // bKash Merchant API APP SECRET
$bkash_username = $config['username']; // bKash Merchant API USERNAME
$bkash_password = $config['password']; // bKash Merchant API PASSWORD
$bkash_base_url = ($config['environment'] == 'live') ? 'https://tokenized.pay.bka.sh/v1.2.0-beta' : 'https://tokenized.sandbox.bka.sh/v1.2.0-beta';
$this->app_key = $bkash_app_key;
$this->app_secret = $bkash_app_secret;
$this->username = $bkash_username;
$this->password = $bkash_password;
$this->base_url = $bkash_base_url;
}
public function getToken()
{
session()->forget('bkash_token');
$post_token = array(
'app_key' => $this->app_key,
'app_secret' => $this->app_secret
);
$url = curl_init("$this->base_url/tokenized/checkout/token/grant");
$post_token = json_encode($post_token);
$header = array(
'Content-Type:application/json',
"password:$this->password",
"username:$this->username"
);
curl_setopt($url, CURLOPT_HTTPHEADER, $header);
curl_setopt($url, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($url, CURLOPT_RETURNTRANSFER, true);
curl_setopt($url, CURLOPT_POSTFIELDS, $post_token);
curl_setopt($url, CURLOPT_FOLLOWLOCATION, 1);
$resultdata = curl_exec($url);
curl_close($url);
$response = json_decode($resultdata, true);
if (array_key_exists('msg', $response)) {
return $response;
}
session()->put('bkash_token', $response['id_token']);
return $response;
}
public function make_tokenize_payment(Request $request)
{
$discount = session()->has('coupon_discount') ? session('coupon_discount') : 0;
$order_amount = CartManager::cart_grand_total() - $discount;
$user = Helpers::get_customer();
$response = self::getToken();
$auth = $response['id_token'];
session()->put('token', $auth);
$callbackURL = route('bkash-callback', ['token' => $auth]);
$requestbody = array(
'mode' => '0011',
'amount' => (string)$order_amount,
'currency' => 'BDT',
'intent' => 'sale',
'payerReference' => $user['phone'],
'merchantInvoiceNumber' => 'invoice_' . Str::random('15'),
'callbackURL' => $callbackURL
);
$url = curl_init($this->base_url . '/tokenized/checkout/create');
$requestbodyJson = json_encode($requestbody);
$header = array(
'Content-Type:application/json',
'Authorization:' . $auth,
'X-APP-Key:' . $this->app_key
);
curl_setopt($url, CURLOPT_HTTPHEADER, $header);
curl_setopt($url, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($url, CURLOPT_RETURNTRANSFER, true);
curl_setopt($url, CURLOPT_POSTFIELDS, $requestbodyJson);
curl_setopt($url, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($url, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
$resultdata = curl_exec($url);
curl_close($url);
$obj = json_decode($resultdata);
return redirect()->away($obj->{'bkashURL'});
}
public function callback(Request $request){
$paymentID = $request['paymentID'];
$auth = $request['token'];
$request_body = array(
'paymentID' => $paymentID
);
$url = curl_init($this->base_url . '/tokenized/checkout/execute');
$request_body_json = json_encode($request_body);
$header = array(
'Content-Type:application/json',
'Authorization:' . $auth,
'X-APP-Key:' . $this->app_key
);
curl_setopt($url, CURLOPT_HTTPHEADER, $header);
curl_setopt($url, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($url, CURLOPT_RETURNTRANSFER, true);
curl_setopt($url, CURLOPT_POSTFIELDS, $request_body_json);
curl_setopt($url, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($url, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
$resultdata = curl_exec($url);
info($resultdata);
curl_close($url);
$obj = json_decode($resultdata);
if ($obj->statusCode == '0000') {
$order_ids = [];
$unique_id = OrderManager::gen_unique_id();
foreach (CartManager::get_cart_group_ids() as $group_id) {
$data = [
'payment_method' => 'bkash',
'order_status' => 'confirmed',
'payment_status' => 'paid',
'transaction_ref' => $obj->trxID ?? null,
'order_group_id' => $unique_id,
'cart_group_id' => $group_id
];
$order_id = OrderManager::generate_order($data);
array_push($order_ids, $order_id);
}
CartManager::cart_clean();
if (auth('customer')->check()) {
Toastr::success('Payment success.');
return view(VIEW_FILE_NAMES['order_complete']);
}
return response()->json(['message' => 'Payment succeeded'], 200);
} else {
if (auth('customer')->check()) {
Toastr::error('Payment failed.');
return redirect('/');
}
return response()->json(['message' => 'Payment failed'], 403);
}
}
}