272 lines
8.9 KiB
PHP
272 lines
8.9 KiB
PHP
<?php
|
|
|
|
|
|
namespace App\Http\Controllers\Api\V2;
|
|
|
|
use App\Models\CombinedOrder;
|
|
use App\Models\User;
|
|
use App\Models\Wallet;
|
|
use Illuminate\Http\Request;
|
|
use phpDocumentor\Reflection\Types\This;
|
|
|
|
class BkashController extends Controller
|
|
{
|
|
private $base_url;
|
|
public function __construct()
|
|
{
|
|
if (get_setting('bkash_sandbox', 1)) {
|
|
$this->base_url = "https://tokenized.sandbox.bka.sh/v1.2.0-beta/tokenized/";
|
|
} else {
|
|
$this->base_url = "https://tokenized.pay.bka.sh/v1.2.0-beta/tokenized/";
|
|
}
|
|
}
|
|
|
|
public function begin(Request $request)
|
|
{
|
|
|
|
$payment_type = $request->payment_type;
|
|
$combined_order_id = $request->combined_order_id;
|
|
$amount = $request->amount;
|
|
$user_id = $request->user_id;
|
|
|
|
try {
|
|
$token = $this->getToken();
|
|
|
|
if ($payment_type == 'cart_payment') {
|
|
$combined_order = CombinedOrder::find($combined_order_id);
|
|
$amount = $combined_order->grand_total;
|
|
}
|
|
if (
|
|
$payment_type == 'wallet_payment' ||
|
|
$payment_type == 'seller_package_payment' ||
|
|
$payment_type == 'customer_package_payment'
|
|
) {
|
|
$amount = $request->amount;
|
|
}
|
|
|
|
return response()->json([
|
|
'token' => $token,
|
|
'result' => true,
|
|
'url' => route('api.bkash.webpage', ["token" => $token, "amount" => $amount]),
|
|
'message' => translate('Payment page is found')
|
|
]);
|
|
} catch (\Exception $exception) {
|
|
return response()->json([
|
|
'token' => '',
|
|
'result' => false,
|
|
'url' => '',
|
|
'message' => $exception->getMessage()
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function webpage($token, $amount)
|
|
{
|
|
return view('frontend.payment.bkash_app', compact('token', 'amount'));
|
|
}
|
|
|
|
public function checkout($token, $amount)
|
|
{
|
|
$auth = $token;
|
|
|
|
$callbackURL = route('home');
|
|
$requestbody = array(
|
|
'mode' => '0011',
|
|
'payerReference' => ' ',
|
|
'callbackURL' => route('api.bkash.callback'),
|
|
'amount' => $amount,
|
|
'currency' => 'BDT',
|
|
'intent' => 'sale',
|
|
'merchantInvoiceNumber' => "Inv" . Date('YmdH') . rand(1000, 10000)
|
|
);
|
|
$requestbodyJson = json_encode($requestbody);
|
|
|
|
$header = array(
|
|
'Content-Type:application/json',
|
|
'Authorization:' . $auth,
|
|
'X-APP-Key:' . env('BKASH_CHECKOUT_APP_KEY')
|
|
);
|
|
|
|
$url = curl_init($this->base_url . 'checkout/create');
|
|
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);
|
|
|
|
return redirect(json_decode($resultdata)->bkashURL);
|
|
}
|
|
|
|
public function callback(Request $request)
|
|
{
|
|
$allRequest = $request->all();
|
|
if (isset($allRequest['status']) && $allRequest['status'] == 'failure') {
|
|
return $this->failed("Payment Failed");
|
|
} else if (isset($allRequest['status']) && $allRequest['status'] == 'cancel') {
|
|
return $this->failed("Payment Cancelled");
|
|
} else {
|
|
return response()->json([
|
|
"result" => true,
|
|
"paymentID" => $allRequest['paymentID']
|
|
]);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public function payment_success(Request $request)
|
|
{
|
|
|
|
$resultdata = $this->execute($request->token, $request->payment_id);
|
|
|
|
$result_data_array = json_decode($resultdata, true);
|
|
|
|
if (array_key_exists("statusCode", $result_data_array) && $result_data_array['statusCode'] != '0000') {
|
|
return $this->failed($result_data_array['statusMessage']);
|
|
} else if (array_key_exists("statusMessage", $result_data_array)) {
|
|
|
|
// if execute api failed to response
|
|
sleep(1);
|
|
$resultdata = $this->query($request->token, $request->payment_id);
|
|
$resultdata = json_decode($resultdata);
|
|
if($resultdata->transactionStatus == 'Initiated'){
|
|
return $this->failed("Something is wrong try agin");
|
|
}
|
|
}
|
|
return $this->process($request);
|
|
}
|
|
|
|
|
|
|
|
public function getToken()
|
|
{
|
|
$request_data = array('app_key' => env('BKASH_CHECKOUT_APP_KEY'), 'app_secret' => env('BKASH_CHECKOUT_APP_SECRET'));
|
|
$request_data_json = json_encode($request_data);
|
|
|
|
$header = array(
|
|
'Content-Type:application/json',
|
|
'username:' . env('BKASH_CHECKOUT_USER_NAME'),
|
|
'password:' . env('BKASH_CHECKOUT_PASSWORD')
|
|
);
|
|
|
|
$url = curl_init($this->base_url . 'checkout/token/grant');
|
|
curl_setopt($url, CURLOPT_HTTPHEADER, $header);
|
|
curl_setopt($url, CURLOPT_CUSTOMREQUEST, "POST");
|
|
curl_setopt($url, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($url, CURLOPT_POSTFIELDS, $request_data_json);
|
|
curl_setopt($url, CURLOPT_FOLLOWLOCATION, 1);
|
|
curl_setopt($url, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
|
|
|
|
$resultdata = curl_exec($url);
|
|
curl_close($url);
|
|
|
|
$token = json_decode($resultdata)->id_token;
|
|
return $token;
|
|
}
|
|
|
|
public function execute($token, $paymentID)
|
|
{
|
|
|
|
$auth = $token;
|
|
|
|
$requestbody = array(
|
|
'paymentID' => $paymentID
|
|
);
|
|
$requestbodyJson = json_encode($requestbody);
|
|
|
|
$header = array(
|
|
'Content-Type:application/json',
|
|
'Authorization:' . $auth,
|
|
'X-APP-Key:' . env('BKASH_CHECKOUT_APP_KEY')
|
|
);
|
|
|
|
$url = curl_init($this->base_url . 'checkout/execute');
|
|
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);
|
|
|
|
return $resultdata;
|
|
}
|
|
|
|
public function query($token, $paymentID){
|
|
|
|
$auth = $token;
|
|
|
|
$requestbody = array(
|
|
'paymentID' => $paymentID
|
|
);
|
|
$requestbodyJson = json_encode($requestbody);
|
|
|
|
$header = array(
|
|
'Content-Type:application/json',
|
|
'Authorization:' . $auth,
|
|
'X-APP-Key:'.env('BKASH_CHECKOUT_APP_KEY')
|
|
);
|
|
|
|
$url = curl_init($this->base_url.'checkout/payment/status');
|
|
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);
|
|
|
|
return $resultdata;
|
|
}
|
|
|
|
public function process(Request $request)
|
|
{
|
|
try {
|
|
|
|
$payment_type = $request->payment_type;
|
|
|
|
if ($payment_type == 'cart_payment') {
|
|
checkout_done($request->combined_order_id, $request->payment_id);
|
|
}
|
|
|
|
if ($payment_type == 'wallet_payment') {
|
|
wallet_payment_done($request->user_id, $request->amount, 'Bkash', $request->payment_id);
|
|
}
|
|
|
|
if ($payment_type == 'seller_package_payment') {
|
|
seller_purchase_payment_done($request->user_id, $request->package_id, $request->amount, 'Bkash', $request->payment_id);
|
|
}
|
|
if ($payment_type == 'customer_package_payment') {
|
|
customer_purchase_payment_done($request->user_id, $request->package_id);
|
|
}
|
|
|
|
return response()->json(['result' => true, 'message' => translate("Payment is successful")]);
|
|
} catch (\Exception $e) {
|
|
return response()->json(['result' => false, 'message' => $e->getMessage()]);
|
|
}
|
|
}
|
|
|
|
// public function payment_success(Request $request)
|
|
// {
|
|
// return response()->json([
|
|
// 'result' => true,
|
|
// 'message' => translate('Payment Success'),
|
|
// 'payment_details' => $request->payment_details
|
|
// ]);
|
|
// }
|
|
|
|
public function fail(Request $request)
|
|
{
|
|
return response()->json([
|
|
'result' => false,
|
|
'message' => translate('Payment Failed'),
|
|
'payment_details' => $request->payment_details
|
|
]);
|
|
}
|
|
}
|