Upload files to "system/plugin"
Signed-off-by: nestict <icttechnest@gmail.com>
This commit is contained in:
parent
015b57ddfd
commit
b71d6aa44d
137
system/plugin/initiatePaybillStk.php
Normal file
137
system/plugin/initiatePaybillStk.php
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function initiatePaybillPayment()
|
||||||
|
{
|
||||||
|
// Ensure POST variables are set and sanitize input
|
||||||
|
$username = isset($_POST['username']) ? filter_var($_POST['username'], FILTER_SANITIZE_STRING) : null;
|
||||||
|
$phone = isset($_POST['phone']) ? filter_var($_POST['phone'], FILTER_SANITIZE_STRING) : null;
|
||||||
|
|
||||||
|
if (!$username || !$phone) {
|
||||||
|
echo "<script>toastr.error('Invalid input data');</script>";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Normalize phone number
|
||||||
|
$phone = preg_replace(['/^\+/', '/^0/', '/^7/', '/^1/'], ['', '254', '2547', '2541'], $phone);
|
||||||
|
|
||||||
|
// Retrieve bank details from the database
|
||||||
|
$bankaccount = ORM::for_table('tbl_appconfig')->where('setting', 'PaybillAcc')->find_one();
|
||||||
|
$bankname = ORM::for_table('tbl_appconfig')->where('setting', 'PaybillName')->find_one();
|
||||||
|
$bankaccount = $bankaccount ? $bankaccount->value : null;
|
||||||
|
$bankname = $bankname ? $bankname->value : null;
|
||||||
|
|
||||||
|
if (!$bankaccount || !$bankname) {
|
||||||
|
echo "<script>toastr.error('Could not complete the payment req, please contact admin');</script>";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for existing user details
|
||||||
|
$CheckId = ORM::for_table('tbl_customers')->where('username', $username)->order_by_desc('id')->find_one();
|
||||||
|
$CheckUser = ORM::for_table('tbl_customers')->where('phonenumber', $phone)->find_many();
|
||||||
|
$UserId = $CheckId ? $CheckId->id : null;
|
||||||
|
|
||||||
|
if ($CheckUser) {
|
||||||
|
ORM::for_table('tbl_customers')->where('phonenumber', $phone)->where_not_equal('id', $UserId)->delete_many();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve payment gateway record
|
||||||
|
$PaymentGatewayRecord = ORM::for_table('tbl_payment_gateway')
|
||||||
|
->where('username', $username)
|
||||||
|
->where('status', 1)
|
||||||
|
->order_by_desc('id')
|
||||||
|
->find_one();
|
||||||
|
|
||||||
|
if (!$PaymentGatewayRecord) {
|
||||||
|
echo "<script>toastr.error('Could not complete the payment req, please contact administrator');</script>";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update user phone number
|
||||||
|
$ThisUser = ORM::for_table('tbl_customers')->where('username', $username)->order_by_desc('id')->find_one();
|
||||||
|
if ($ThisUser) {
|
||||||
|
$ThisUser->phonenumber = $phone;
|
||||||
|
$ThisUser->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
$amount = $PaymentGatewayRecord->price;
|
||||||
|
|
||||||
|
// Safaricom API credentials
|
||||||
|
$consumerKey = 'YOUR_CONSUMER_KEY';
|
||||||
|
$consumerSecret = 'YOUR_CONSUMER_SECRET';
|
||||||
|
|
||||||
|
// Get access token
|
||||||
|
$access_token_url = 'https://api.safaricom.co.ke/oauth/v1/generate?grant_type=client_credentials';
|
||||||
|
$curl = curl_init($access_token_url);
|
||||||
|
curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type:application/json; charset=utf8']);
|
||||||
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
|
||||||
|
curl_setopt($curl, CURLOPT_USERPWD, "$consumerKey:$consumerSecret");
|
||||||
|
$result = curl_exec($curl);
|
||||||
|
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
|
||||||
|
curl_close($curl);
|
||||||
|
|
||||||
|
if ($status !== 200) {
|
||||||
|
echo "<script>toastr.error('Failed to get access token');</script>";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = json_decode($result);
|
||||||
|
$access_token = $result->access_token;
|
||||||
|
|
||||||
|
// Initiate Paybill payment
|
||||||
|
$paybill_url = 'https://api.safaricom.co.ke/mpesa/stkpush/v1/processrequest';
|
||||||
|
$Timestamp = date("YmdHis");
|
||||||
|
$BusinessShortCode = 'YOUR_BUSINESS_SHORTCODE';
|
||||||
|
$Passkey = 'YOUR_PASSKEY';
|
||||||
|
$Password = base64_encode($BusinessShortCode . $Passkey . $Timestamp);
|
||||||
|
$CallBackURL = U . 'callback/PaybillCallback';
|
||||||
|
|
||||||
|
$curl_post_data = [
|
||||||
|
'BusinessShortCode' => $BusinessShortCode,
|
||||||
|
'Password' => $Password,
|
||||||
|
'Timestamp' => $Timestamp,
|
||||||
|
'TransactionType' => 'CustomerPayBillOnline',
|
||||||
|
'Amount' => $amount,
|
||||||
|
'PartyA' => $phone,
|
||||||
|
'PartyB' => $BusinessShortCode,
|
||||||
|
'PhoneNumber' => $phone,
|
||||||
|
'CallBackURL' => $CallBackURL,
|
||||||
|
'AccountReference' => $bankaccount,
|
||||||
|
'TransactionDesc' => 'PayBill Payment'
|
||||||
|
];
|
||||||
|
|
||||||
|
$curl = curl_init($paybill_url);
|
||||||
|
curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type:application/json', 'Authorization:Bearer ' . $access_token]);
|
||||||
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
||||||
|
curl_setopt($curl, CURLOPT_POST, true);
|
||||||
|
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($curl_post_data));
|
||||||
|
$curl_response = curl_exec($curl);
|
||||||
|
curl_close($curl);
|
||||||
|
|
||||||
|
$mpesaResponse = json_decode($curl_response);
|
||||||
|
$responseCode = $mpesaResponse->ResponseCode;
|
||||||
|
$resultDesc = $mpesaResponse->resultDesc;
|
||||||
|
$MerchantRequestID = $mpesaResponse->MerchantRequestID;
|
||||||
|
$CheckoutRequestID = $mpesaResponse->CheckoutRequestID;
|
||||||
|
|
||||||
|
if ($responseCode == "0") {
|
||||||
|
date_default_timezone_set('Africa/Nairobi');
|
||||||
|
$now = date("Y-m-d H:i:s");
|
||||||
|
|
||||||
|
$PaymentGatewayRecord->pg_paid_response = $resultDesc;
|
||||||
|
$PaymentGatewayRecord->username = $username;
|
||||||
|
$PaymentGatewayRecord->checkout = $CheckoutRequestID;
|
||||||
|
$PaymentGatewayRecord->payment_method = 'Mpesa PayBill';
|
||||||
|
$PaymentGatewayRecord->payment_channel = 'Mpesa PayBill';
|
||||||
|
$PaymentGatewayRecord->save();
|
||||||
|
|
||||||
|
if (!empty($_POST['channel'])) {
|
||||||
|
echo json_encode(["status" => "success", "message" => "Enter Pin to complete"]);
|
||||||
|
} else {
|
||||||
|
echo "<script>toastr.success('Enter Mpesa Pin to complete');</script>";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "<script>toastr.error('We could not complete the payment for you, please contact administrator');</script>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
304
system/plugin/initiatebankstk.php
Normal file
304
system/plugin/initiatebankstk.php
Normal file
@ -0,0 +1,304 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function initiatebankstk()
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$username=$_POST['username'];
|
||||||
|
$phone=$_POST['phone'];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$phone = (substr($phone, 0,1) == '+') ? str_replace('+', '', $phone) : $phone;
|
||||||
|
$phone = (substr($phone, 0,1) == '0') ? preg_replace('/^0/', '254', $phone) : $phone;
|
||||||
|
$phone = (substr($phone, 0,1) == '7') ? preg_replace('/^7/', '2547', $phone) : $phone; //cater for phone number prefix 2547XXXX
|
||||||
|
$phone = (substr($phone, 0,1) == '1') ? preg_replace('/^1/', '2541', $phone) : $phone; //cater for phone number prefix 2541XXXX
|
||||||
|
$phone = (substr($phone, 0,1) == '0') ? preg_replace('/^01/', '2541', $phone) : $phone;
|
||||||
|
$phone = (substr($phone, 0,1) == '0') ? preg_replace('/^07/', '2547', $phone) : $phone;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$bankaccount = ORM::for_table('tbl_appconfig')
|
||||||
|
->where('setting', 'Stkbankacc')
|
||||||
|
->find_one();
|
||||||
|
|
||||||
|
$bankname = ORM::for_table('tbl_appconfig')
|
||||||
|
->where('setting', 'Stkbankname')
|
||||||
|
->find_one();
|
||||||
|
|
||||||
|
$bankaccount = ($bankaccount) ? $bankaccount->value : null;
|
||||||
|
$bankname = ($bankname) ? $bankname->value : null;
|
||||||
|
|
||||||
|
// echo $bankname;
|
||||||
|
|
||||||
|
|
||||||
|
$CheckId = ORM::for_table('tbl_customers')
|
||||||
|
->where('username', $username)
|
||||||
|
->order_by_desc('id')
|
||||||
|
->find_one();
|
||||||
|
|
||||||
|
$CheckUser = ORM::for_table('tbl_customers')
|
||||||
|
->where('phonenumber', $phone)
|
||||||
|
->find_many();
|
||||||
|
|
||||||
|
$UserId=$CheckId->id;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (empty($bankaccount) || empty($bankname)) {
|
||||||
|
|
||||||
|
|
||||||
|
echo $error="<script>toastr.error('Could not complete the payment req, please contact admin');</script>";
|
||||||
|
|
||||||
|
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$getpaybill = ORM::for_table('tbl_banks')
|
||||||
|
->where('name', $bankname)
|
||||||
|
->find_one();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$paybill=$getpaybill->paybill;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// echo $paybill;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$cburl = U . 'callback/BankStkPush' ;
|
||||||
|
|
||||||
|
|
||||||
|
$PaymentGatewayRecord = ORM::for_table('tbl_payment_gateway')
|
||||||
|
->where('username', $username)
|
||||||
|
->where('status', 1) // Add this line to filter by status
|
||||||
|
->order_by_desc('id')
|
||||||
|
->find_one();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$ThisUser= ORM::for_table('tbl_customers')
|
||||||
|
->where('username', $username)
|
||||||
|
->order_by_desc('id')
|
||||||
|
->find_one();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$ThisUser->phonenumber=$phone;
|
||||||
|
// $ThisUser->username=$phone;
|
||||||
|
$ThisUser->save();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$amount=$PaymentGatewayRecord->price;
|
||||||
|
|
||||||
|
if(!$PaymentGatewayRecord){
|
||||||
|
|
||||||
|
echo $error="<script>toastr.error('Could not complete the payment req, please contact administrator');</script>";
|
||||||
|
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$consumerKey = '3AmVP1WFDQn7GrDH8GcSSKxcAvnJdZGC'; //Fill with your app Consumer Key
|
||||||
|
$consumerSecret = '71Lybl6jUtxM0F35'; // Fill with your app Secret
|
||||||
|
|
||||||
|
$headers = ['Content-Type:application/json; charset=utf8'];
|
||||||
|
|
||||||
|
$access_token_url = 'https://api.safaricom.co.ke/oauth/v1/generate?grant_type=client_credentials';
|
||||||
|
|
||||||
|
$curl = curl_init($access_token_url);
|
||||||
|
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
|
||||||
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
|
||||||
|
curl_setopt($curl, CURLOPT_HEADER, FALSE);('');
|
||||||
|
|
||||||
|
curl_setopt($curl, CURLOPT_USERPWD, $consumerKey.':'.$consumerSecret);
|
||||||
|
$result = curl_exec($curl);
|
||||||
|
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
|
||||||
|
$result = json_decode($result);
|
||||||
|
|
||||||
|
$access_token = $result->access_token;
|
||||||
|
|
||||||
|
// echo $access_token;
|
||||||
|
|
||||||
|
curl_close($curl);
|
||||||
|
|
||||||
|
|
||||||
|
// Initiate Stk push
|
||||||
|
|
||||||
|
$stk_url = 'https://api.safaricom.co.ke/mpesa/stkpush/v1/processrequest';
|
||||||
|
$PartyA = $phone; // This is your phone number,
|
||||||
|
$AccountReference = $bankaccount;
|
||||||
|
$TransactionDesc = 'TestMapayment';
|
||||||
|
$Amount = $amount;
|
||||||
|
$BusinessShortCode='4122323';
|
||||||
|
$Passkey='aaebecea73082fa56af852606106b1316d5b4dfa2f12d0088800b0b88e4bb6e3';
|
||||||
|
$Timestamp = date("YmdHis",time());
|
||||||
|
$Password = base64_encode($BusinessShortCode.$Passkey.$Timestamp);
|
||||||
|
$CallBackURL = $cburl;
|
||||||
|
|
||||||
|
|
||||||
|
$curl = curl_init();
|
||||||
|
curl_setopt($curl, CURLOPT_URL, $stk_url);
|
||||||
|
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json','Authorization:Bearer '.$access_token)); //setting custom header
|
||||||
|
|
||||||
|
|
||||||
|
$curl_post_data = array(
|
||||||
|
//Fill in the request parameters with valid values
|
||||||
|
'BusinessShortCode' => $BusinessShortCode,
|
||||||
|
'Password' => $Password,
|
||||||
|
'Timestamp' => $Timestamp,
|
||||||
|
'TransactionType' => 'CustomerPayBillOnline',
|
||||||
|
'Amount' => $Amount,
|
||||||
|
'PartyA' => $PartyA,
|
||||||
|
'PartyB' => $paybill,
|
||||||
|
'PhoneNumber' => $PartyA,
|
||||||
|
'CallBackURL' => $CallBackURL,
|
||||||
|
'AccountReference' => $AccountReference,
|
||||||
|
'TransactionDesc' => $TransactionDesc
|
||||||
|
);
|
||||||
|
|
||||||
|
$data_string = json_encode($curl_post_data);
|
||||||
|
|
||||||
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
||||||
|
curl_setopt($curl, CURLOPT_POST, true);
|
||||||
|
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string);
|
||||||
|
|
||||||
|
$curl_response = curl_exec($curl);
|
||||||
|
//print_r($curl_response);
|
||||||
|
|
||||||
|
// echo $curl_response;
|
||||||
|
// die;
|
||||||
|
|
||||||
|
$mpesaResponse = json_decode($curl_response);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$responseCode = $mpesaResponse->ResponseCode;
|
||||||
|
$resultDesc = $mpesaResponse->resultDesc;
|
||||||
|
$MerchantRequestID = $mpesaResponse->MerchantRequestID;
|
||||||
|
$CheckoutRequestID = $mpesaResponse->CheckoutRequestID;
|
||||||
|
|
||||||
|
|
||||||
|
if($responseCode=="0"){
|
||||||
|
date_default_timezone_set('Africa/Nairobi');
|
||||||
|
$now=date("Y-m-d H:i:s");
|
||||||
|
|
||||||
|
// $username=$phone;
|
||||||
|
|
||||||
|
$PaymentGatewayRecord->pg_paid_response = $resultDesc;
|
||||||
|
$PaymentGatewayRecord->username = $username;
|
||||||
|
$PaymentGatewayRecord->checkout = $CheckoutRequestID;
|
||||||
|
$PaymentGatewayRecord->payment_method = 'Mpesa Stk Push';
|
||||||
|
$PaymentGatewayRecord->payment_channel = 'Mpesa Stk Push';
|
||||||
|
$PaymentGatewayRecord->save();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(!empty($_POST['channel'])){
|
||||||
|
|
||||||
|
echo json_encode(["status" => "success", "message" => "Enter Pin to complete"]);
|
||||||
|
|
||||||
|
}else{
|
||||||
|
echo $error="<script>toastr.success('Enter Mpesa Pin to complete');</script>";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
|
||||||
|
echo $error="<script>toastr.error('We could not complete the payment for you, please contact administrator');</script>";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
148
system/plugin/initiatempesa.php
Normal file
148
system/plugin/initiatempesa.php
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function initiatempesa()
|
||||||
|
{
|
||||||
|
$username = $_POST['username'];
|
||||||
|
$phone = $_POST['phone'];
|
||||||
|
$phone = (substr($phone, 0, 1) == '+') ? str_replace('+', '', $phone) : $phone;
|
||||||
|
$phone = (substr($phone, 0, 1) == '0') ? preg_replace('/^0/', '254', $phone) : $phone;
|
||||||
|
$phone = (substr($phone, 0, 1) == '7') ? preg_replace('/^7/', '2547', $phone) : $phone; //cater for phone number prefix 2547XXXX
|
||||||
|
$phone = (substr($phone, 0, 1) == '1') ? preg_replace('/^1/', '2541', $phone) : $phone; //cater for phone number prefix 2541XXXX
|
||||||
|
$phone = (substr($phone, 0, 1) == '0') ? preg_replace('/^01/', '2541', $phone) : $phone;
|
||||||
|
$phone = (substr($phone, 0, 1) == '0') ? preg_replace('/^07/', '2547', $phone) : $phone;
|
||||||
|
$CheckId = ORM::for_table('tbl_customers')
|
||||||
|
->where('username', $username)
|
||||||
|
->order_by_desc('id')
|
||||||
|
->find_one();
|
||||||
|
$CheckUser = ORM::for_table('tbl_customers')
|
||||||
|
->where('phonenumber', $phone)
|
||||||
|
->find_many();
|
||||||
|
$UserId = $CheckId->id;
|
||||||
|
|
||||||
|
$CallBackURL = U . 'callback/mpesa';
|
||||||
|
$PaymentGatewayRecord = ORM::for_table('tbl_payment_gateway')
|
||||||
|
->where('username', $username)
|
||||||
|
->where('status', 1) // Add this line to filter by status
|
||||||
|
->order_by_desc('id')
|
||||||
|
->find_one();
|
||||||
|
$ThisUser = ORM::for_table('tbl_customers')
|
||||||
|
->where('username', $username)
|
||||||
|
->order_by_desc('id')
|
||||||
|
->find_one();
|
||||||
|
$ThisUser->phonenumber = $phone;
|
||||||
|
$ThisUser->save();
|
||||||
|
$amount = $PaymentGatewayRecord->price;
|
||||||
|
if (!$PaymentGatewayRecord) {
|
||||||
|
echo json_encode(["status" => "error", "message" => "Could not complete the payment req, please contact administrator"]);
|
||||||
|
}
|
||||||
|
// Get the M-Pesa mpesa_env
|
||||||
|
$mpesa_env = ORM::for_table('tbl_appconfig')
|
||||||
|
->where('setting', 'mpesa_env')
|
||||||
|
->find_one();
|
||||||
|
$mpesa_env = ($mpesa_env) ? $mpesa_env->value : null;
|
||||||
|
// Get the M-Pesa consumer key
|
||||||
|
$mpesa_consumer_key = ORM::for_table('tbl_appconfig')
|
||||||
|
->where('setting', 'mpesa_consumer_key')
|
||||||
|
->find_one();
|
||||||
|
$mpesa_consumer_key = ($mpesa_consumer_key) ? $mpesa_consumer_key->value : null;
|
||||||
|
// Get the M-Pesa consumer secret
|
||||||
|
$mpesa_consumer_secret = ORM::for_table('tbl_appconfig')
|
||||||
|
->where('setting', 'mpesa_consumer_secret')
|
||||||
|
->find_one();
|
||||||
|
$mpesa_consumer_secret = ($mpesa_consumer_secret) ? $mpesa_consumer_secret->value : null;
|
||||||
|
$mpesa_business_code = ORM::for_table('tbl_appconfig')
|
||||||
|
->where('setting', 'mpesa_business_code')
|
||||||
|
->find_one();
|
||||||
|
$mpesa_business_code = ($mpesa_business_code) ? $mpesa_business_code->value : null;
|
||||||
|
$mpesa_shortcode_type = ORM::for_table('tbl_appconfig')
|
||||||
|
->where('setting', 'mpesa_shortcode_type')
|
||||||
|
->find_one();
|
||||||
|
if ($mpesa_shortcode_type == 'BuyGoods') {
|
||||||
|
$mpesa_buygoods_till_number = ORM::for_table('tbl_appconfig')
|
||||||
|
->where('setting', 'mpesa_buygoods_till_number')
|
||||||
|
->find_one();
|
||||||
|
$mpesa_buygoods_till_number = ($mpesa_buygoods_till_number) ? $mpesa_buygoods_till_number->value : null;
|
||||||
|
$PartyB = $mpesa_buygoods_till_number;
|
||||||
|
$Type_of_Transaction = 'CustomerBuyGoodsOnline';
|
||||||
|
} else {
|
||||||
|
$PartyB = $mpesa_business_code;
|
||||||
|
$Type_of_Transaction = 'CustomerPayBillOnline';
|
||||||
|
}
|
||||||
|
$Passkey = ORM::for_table('tbl_appconfig')
|
||||||
|
->where('setting', 'mpesa_pass_key')
|
||||||
|
->find_one();
|
||||||
|
$Passkey = ($Passkey) ? $Passkey->value : null;
|
||||||
|
$Time_Stamp = date("Ymdhis");
|
||||||
|
$password = base64_encode($mpesa_business_code . $Passkey . $Time_Stamp);
|
||||||
|
if ($mpesa_env == "live") {
|
||||||
|
$OnlinePayment = 'https://api.safaricom.co.ke/mpesa/stkpush/v1/processrequest';
|
||||||
|
$Token_URL = 'https://api.safaricom.co.ke/oauth/v1/generate?grant_type=client_credentials';
|
||||||
|
} elseif ($mpesa_env == "sandbox") {
|
||||||
|
$OnlinePayment = 'https://sandbox.safaricom.co.ke/mpesa/stkpush/v1/processrequest';
|
||||||
|
$Token_URL = 'https://sandbox.safaricom.co.ke/oauth/v1/generate?grant_type=client_credentials';
|
||||||
|
} else {
|
||||||
|
return json_encode(["Message" => "invalid application status"]);
|
||||||
|
};
|
||||||
|
$headers = ['Content-Type:application/json; charset=utf8'];
|
||||||
|
$curl = curl_init($Token_URL);
|
||||||
|
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
|
||||||
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
|
||||||
|
curl_setopt($curl, CURLOPT_HEADER, FALSE);
|
||||||
|
curl_setopt($curl, CURLOPT_USERPWD, $mpesa_consumer_key . ':' . $mpesa_consumer_secret);
|
||||||
|
$result = curl_exec($curl);
|
||||||
|
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
|
||||||
|
$result = json_decode($result);
|
||||||
|
$access_token = $result->access_token;
|
||||||
|
curl_close($curl);
|
||||||
|
$password = base64_encode($mpesa_business_code . $Passkey . $Time_Stamp);
|
||||||
|
$stkpushheader = ['Content-Type:application/json', 'Authorization:Bearer ' . $access_token];
|
||||||
|
//INITIATE CURL
|
||||||
|
$curl = curl_init();
|
||||||
|
curl_setopt($curl, CURLOPT_URL, $OnlinePayment);
|
||||||
|
curl_setopt($curl, CURLOPT_HTTPHEADER, $stkpushheader); //setting custom header
|
||||||
|
$curl_post_data = array(
|
||||||
|
//Fill in the request parameters with valid values
|
||||||
|
'BusinessShortCode' => $mpesa_business_code,
|
||||||
|
'Password' => $password,
|
||||||
|
'Timestamp' => $Time_Stamp,
|
||||||
|
'TransactionType' => $Type_of_Transaction,
|
||||||
|
'Amount' => $amount,
|
||||||
|
'PartyA' => $phone,
|
||||||
|
'PartyB' => $PartyB,
|
||||||
|
'PhoneNumber' => $phone,
|
||||||
|
'CallBackURL' => $CallBackURL,
|
||||||
|
'AccountReference' => $username,
|
||||||
|
'TransactionDesc' => 'Payment for ' . $username
|
||||||
|
);
|
||||||
|
$data_string = json_encode($curl_post_data);
|
||||||
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
||||||
|
curl_setopt($curl, CURLOPT_POST, true);
|
||||||
|
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string);
|
||||||
|
$curl_response = curl_exec($curl);
|
||||||
|
$curl_Tranfer2_response = json_decode($curl_response);
|
||||||
|
if (isset($curl_Tranfer2_response->ResponseCode) && $curl_Tranfer2_response->ResponseCode == "0") {
|
||||||
|
$resultDesc = $curl_Tranfer2_response->resultDesc;
|
||||||
|
$CheckoutRequestID = $curl_Tranfer2_response->CheckoutRequestID;
|
||||||
|
date_default_timezone_set('Africa/Nairobi');
|
||||||
|
$now = date("Y-m-d H:i:s");
|
||||||
|
// $username=$phone;
|
||||||
|
$PaymentGatewayRecord->pg_paid_response = $resultDesc;
|
||||||
|
$PaymentGatewayRecord->username = $username;
|
||||||
|
$PaymentGatewayRecord->checkout = $CheckoutRequestID;
|
||||||
|
$PaymentGatewayRecord->payment_method = 'Mpesa Stk Push';
|
||||||
|
$PaymentGatewayRecord->payment_channel = 'Mpesa Stk Push';
|
||||||
|
$saveGateway = $PaymentGatewayRecord->save();
|
||||||
|
if ($saveGateway) {
|
||||||
|
if (!empty($_POST['channel'])) {
|
||||||
|
echo json_encode(["status" => "success", "message" => "Enter Mpesa Pin to complete $mpesa_business_code $Type_of_Transaction , Party B: $PartyB, Amount: $amount, Phone: $phone, CheckoutRequestID: $CheckoutRequestID"]);
|
||||||
|
} else {
|
||||||
|
echo "<script>toastr.success('Enter Mpesa Pin to complete');</script>";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo json_encode(["status" => "error", "message" => "Failed to save the payment gateway record"]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$errorMessage = $curl_Tranfer2_response->errorMessage;
|
||||||
|
echo json_encode(["status" => "error", "message" => $errorMessage]);
|
||||||
|
}
|
||||||
|
}
|
232
system/plugin/initiatetillstk.php
Normal file
232
system/plugin/initiatetillstk.php
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
<?php
|
||||||
|
function initiatetillstk()
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$username=$_POST['username'];
|
||||||
|
$phone=$_POST['phone'];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$phone = (substr($phone, 0,1) == '+') ? str_replace('+', '', $phone) : $phone;
|
||||||
|
$phone = (substr($phone, 0,1) == '0') ? preg_replace('/^0/', '254', $phone) : $phone;
|
||||||
|
$phone = (substr($phone, 0,1) == '7') ? preg_replace('/^7/', '2547', $phone) : $phone; //cater for phone number prefix 2547XXXX
|
||||||
|
$phone = (substr($phone, 0,1) == '1') ? preg_replace('/^1/', '2541', $phone) : $phone; //cater for phone number prefix 2541XXXX
|
||||||
|
$phone = (substr($phone, 0,1) == '0') ? preg_replace('/^01/', '2541', $phone) : $phone;
|
||||||
|
$phone = (substr($phone, 0,1) == '0') ? preg_replace('/^07/', '2547', $phone) : $phone;
|
||||||
|
|
||||||
|
|
||||||
|
$consumer_key = ORM::for_table('tbl_appconfig')
|
||||||
|
->where('setting', 'mpesa_till_consumer_key')
|
||||||
|
->find_one();
|
||||||
|
|
||||||
|
$consumer_secret = ORM::for_table('tbl_appconfig')
|
||||||
|
->where('setting', 'mpesa_till_consumer_secret')
|
||||||
|
->find_one();
|
||||||
|
|
||||||
|
$consumer_secret = ORM::for_table('tbl_appconfig')
|
||||||
|
->where('setting', 'mpesa_till_consumer_secret')
|
||||||
|
->find_one();
|
||||||
|
|
||||||
|
$BusinessShortCode= ORM::for_table('tbl_appconfig')
|
||||||
|
->where('setting', 'mpesa_till_shortcode_code')
|
||||||
|
->find_one();
|
||||||
|
|
||||||
|
$PartyB= ORM::for_table('tbl_appconfig')
|
||||||
|
->where('setting', 'mpesa_till_partyb')
|
||||||
|
->find_one();
|
||||||
|
|
||||||
|
|
||||||
|
$LipaNaMpesaPasskey= ORM::for_table('tbl_appconfig')
|
||||||
|
->where('setting', 'mpesa_till_pass_key')
|
||||||
|
->find_one();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$consumer_key = ($consumer_key) ? $consumer_key->value : null;
|
||||||
|
$consumer_secret = ($consumer_secret) ? $consumer_secret->value : null;
|
||||||
|
$BusinessShortCode = ($BusinessShortCode) ? $BusinessShortCode->value : null;
|
||||||
|
$PartyB = ($PartyB) ? $PartyB->value : null;
|
||||||
|
$LipaNaMpesaPasskey = ($LipaNaMpesaPasskey) ? $LipaNaMpesaPasskey->value : null;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$cburl = U . 'callback/MpesatillStk' ;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
$CheckId = ORM::for_table('tbl_customers')
|
||||||
|
->where('username', $username)
|
||||||
|
->order_by_desc('id')
|
||||||
|
->find_one();
|
||||||
|
|
||||||
|
$CheckUser = ORM::for_table('tbl_customers')
|
||||||
|
->where('phonenumber', $phone)
|
||||||
|
->find_many();
|
||||||
|
|
||||||
|
$UserId=$CheckId->id;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$PaymentGatewayRecord = ORM::for_table('tbl_payment_gateway')
|
||||||
|
->where('username', $username)
|
||||||
|
->where('status', 1) // Add this line to filter by status
|
||||||
|
->order_by_desc('id')
|
||||||
|
->find_one();
|
||||||
|
|
||||||
|
$ThisUser= ORM::for_table('tbl_customers')
|
||||||
|
->where('username', $username)
|
||||||
|
->order_by_desc('id')
|
||||||
|
->find_one();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$ThisUser->phonenumber=$phone;
|
||||||
|
// $ThisUser->username=$phone;
|
||||||
|
$ThisUser->save();
|
||||||
|
|
||||||
|
|
||||||
|
$amount=$PaymentGatewayRecord->price;
|
||||||
|
|
||||||
|
if(!$PaymentGatewayRecord){
|
||||||
|
|
||||||
|
echo $error="<script>toastr.success('Unable to proess payment, please reload the page');</script>";
|
||||||
|
die();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$TransactionType = 'CustomerBuyGoodsOnline';
|
||||||
|
$tokenUrl = 'https://api.safaricom.co.ke/oauth/v1/generate?grant_type=client_credentials';
|
||||||
|
$phone= $phone;
|
||||||
|
$lipaOnlineUrl = 'https://api.safaricom.co.ke/mpesa/stkpush/v1/processrequest';
|
||||||
|
// $amount= '1';
|
||||||
|
$CallBackURL = $cburl;
|
||||||
|
date_default_timezone_set('Africa/Nairobi');
|
||||||
|
$timestamp = date("YmdHis");
|
||||||
|
$password = base64_encode($BusinessShortCode . $LipaNaMpesaPasskey . $timestamp);
|
||||||
|
|
||||||
|
$curl = curl_init();
|
||||||
|
curl_setopt($curl, CURLOPT_URL, $tokenUrl);
|
||||||
|
$credentials = base64_encode($consumer_key . ':' . $consumer_secret);
|
||||||
|
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Authorization: Basic ' . $credentials));
|
||||||
|
curl_setopt($curl, CURLOPT_HEADER, false);
|
||||||
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
|
||||||
|
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
|
||||||
|
$curl_response = curl_exec($curl);
|
||||||
|
|
||||||
|
$token = json_decode($curl_response)->access_token;
|
||||||
|
$curl2 = curl_init();
|
||||||
|
curl_setopt($curl2, CURLOPT_URL, $lipaOnlineUrl);
|
||||||
|
curl_setopt($curl2, CURLOPT_HTTPHEADER, array('Content-Type:application/json', 'Authorization:Bearer ' . $token));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$curl2_post_data = [
|
||||||
|
'BusinessShortCode' => $BusinessShortCode,
|
||||||
|
'Password' => $password,
|
||||||
|
'Timestamp' => $timestamp,
|
||||||
|
'TransactionType' => $TransactionType,
|
||||||
|
'Amount' => $amount,
|
||||||
|
'PartyA' => $phone,
|
||||||
|
'PartyB' => $PartyB,
|
||||||
|
'PhoneNumber' => $phone,
|
||||||
|
'CallBackURL' => $CallBackURL,
|
||||||
|
'AccountReference' => 'Payment For Goods',
|
||||||
|
'TransactionDesc' => 'Payment for goods',
|
||||||
|
];
|
||||||
|
|
||||||
|
$data2_string = json_encode($curl2_post_data);
|
||||||
|
|
||||||
|
curl_setopt($curl2, CURLOPT_RETURNTRANSFER, true);
|
||||||
|
curl_setopt($curl2, CURLOPT_POST, true);
|
||||||
|
curl_setopt($curl2, CURLOPT_POSTFIELDS, $data2_string);
|
||||||
|
curl_setopt($curl2, CURLOPT_HEADER, false);
|
||||||
|
curl_setopt($curl2, CURLOPT_SSL_VERIFYPEER, 0);
|
||||||
|
curl_setopt($curl2, CURLOPT_SSL_VERIFYHOST, 0);
|
||||||
|
$curl_response = curl_exec($curl2);
|
||||||
|
|
||||||
|
$curl_response1 = curl_exec($curl);
|
||||||
|
//($curl_response);
|
||||||
|
|
||||||
|
//echo $curl_response;
|
||||||
|
|
||||||
|
$mpesaResponse = json_decode($curl_response);
|
||||||
|
|
||||||
|
|
||||||
|
//echo $phone;
|
||||||
|
|
||||||
|
$responseCode = $mpesaResponse->ResponseCode;
|
||||||
|
$MerchantRequestID = $mpesaResponse->MerchantRequestID;
|
||||||
|
$CheckoutRequestID = $mpesaResponse->CheckoutRequestID;
|
||||||
|
$resultDesc = $mpesaResponse->CustomerMessage;
|
||||||
|
// file_put_contents('stk.log',$curl_response,FILE_APPEND);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// echo $cburl;
|
||||||
|
|
||||||
|
$responseCode = $responseCode;
|
||||||
|
if($responseCode=="0"){
|
||||||
|
date_default_timezone_set('Africa/Nairobi');
|
||||||
|
$now=date("Y-m-d H:i:s");
|
||||||
|
|
||||||
|
|
||||||
|
// $username=$phone;
|
||||||
|
|
||||||
|
|
||||||
|
$PaymentGatewayRecord->pg_paid_response = $resultDesc;
|
||||||
|
$PaymentGatewayRecord->checkout = $CheckoutRequestID;
|
||||||
|
$PaymentGatewayRecord->username = $username;
|
||||||
|
$PaymentGatewayRecord->payment_method = 'Mpesa Stk Push';
|
||||||
|
$PaymentGatewayRecord->payment_channel = 'Mpesa Stk Push';
|
||||||
|
$PaymentGatewayRecord->save();
|
||||||
|
|
||||||
|
if(!empty($_POST['channel'])){
|
||||||
|
|
||||||
|
echo json_encode(["status" => "success", "message" => "Enter Pin to complete","phone"=> $phone]);
|
||||||
|
|
||||||
|
}else{
|
||||||
|
echo $error="<script>toastr.success('Enter Mpesa Pin to complete');</script>";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}else{
|
||||||
|
|
||||||
|
echo "There is an issue with the transaction, please wait for 0 seconds then try again";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
46
system/plugin/log.php
Normal file
46
system/plugin/log.php
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use PEAR2\Net\RouterOS;
|
||||||
|
use PEAR2\Net\RouterOS\Client;
|
||||||
|
use PEAR2\Net\RouterOS\Request;
|
||||||
|
|
||||||
|
// Fungsi untuk menampilkan log monitor
|
||||||
|
register_menu("Router Logs", true, "log_ui", 'NETWORK');
|
||||||
|
|
||||||
|
function log_ui() {
|
||||||
|
global $ui, $routes;
|
||||||
|
_admin();
|
||||||
|
$ui->assign('_title', 'Log Mikrotik');
|
||||||
|
$ui->assign('_system_menu', 'Log Mikrotik');
|
||||||
|
$admin = Admin::_info();
|
||||||
|
$ui->assign('_admin', $admin);
|
||||||
|
$routers = ORM::for_table('tbl_routers')->where('enabled', '1')->find_many();
|
||||||
|
$routerId = $routes['2'] ?? ($routers ? $routers[0]['id'] : null); // Memastikan ada router yang aktif
|
||||||
|
$logs = fetchLogs($routerId); // Mengambil log dari router yang dipilih
|
||||||
|
$ui->assign('logs', $logs);
|
||||||
|
|
||||||
|
$ui->display('log.tpl');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fungsi untuk mengambil logs dari MikroTik
|
||||||
|
function fetchLogs($routerId) {
|
||||||
|
if (!$routerId) {
|
||||||
|
return []; // Mengembalikan array kosong jika router tidak tersedia
|
||||||
|
}
|
||||||
|
|
||||||
|
$mikrotik = ORM::for_table('tbl_routers')->where('enabled', '1')->find_one($routerId);
|
||||||
|
if (!$mikrotik) {
|
||||||
|
return []; // Mengembalikan array kosong jika router tidak ditemukan
|
||||||
|
}
|
||||||
|
|
||||||
|
$client = Mikrotik::getClient($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password']);
|
||||||
|
$request = new Request('/log/print');
|
||||||
|
$response = $client->sendSync($request);
|
||||||
|
|
||||||
|
$logs = [];
|
||||||
|
foreach ($response as $entry) {
|
||||||
|
$logs[] = $entry->getIterator()->getArrayCopy(); // Mengumpulkan data dari setiap entry
|
||||||
|
}
|
||||||
|
|
||||||
|
return $logs;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user