如何在PHP中整合Lipa na Mpesa
Daraja API是一个应用编程接口,它为网络和移动应用的支付整合建立了一座桥梁。在你的网络应用中,你可以创建一个按钮,当用户点击时,他们可以启动支付。
例如,一个网络应用程序提供了一个按钮,用户点击后可以向Safaricom Daraja发送请求;收到请求后,Daraja会发送一个STK推送,其中包含要从Mpesa钱包扣除的金额。
然后,用户会被提示输入他们的密码。一旦用户输入了PIN码,交易就会立即被处理。
前提条件
要学习本教程,你应该。
- 具备HTML、CSS和PHP的基本知识。
- 有一个本地开发环境的设置。
目标
- 了解如何在Safaricom Daraja API门户网站上创建一个账户,并获得认证的凭证。
- 如何用PHP整合Daraja API。
第1步 - 创建一个Safaricom Daraja账户
要在Safaricom Daraja创建一个账户,请打开Safaricom开发者门户网站。
第2步 - 在Safaricom Daraja创建一个新的应用程序
创建账户后,登录并创建一个新的应用程序,给它一个你选择的名字。
注意通过模拟创建的应用程序获得的CONSUMER KEY,CONSUMER SECRET, 和Lipa na Mpesa pass key ,因为我们以后会用到它们。
第3步 - 我们模拟我们的新应用程序,以获得Lipa na mpesa通行证密钥
要模拟应用程序,请点击APIS,它在菜单栏上,选择模拟客户的业务订单。
然后我们需要选择我们创建的应用程序,并开始模拟以获得密码和业务短码。
第4步 - 创建我们的项目
打开你的代码编辑器,创建一个新的文件夹(给它一个你选择的名字),并定义一个新的PHP文件,名为index.php 。
第5步 - 设计用户界面
在这一步,我们要设计一个界面,提示用户输入他们的电话号码;他们将用这个号码进行支付。
输入的电话号码应该是一个Safaricom的号码,其中有用户想要支付的金额。
注意:如果用户输入的号码在mpesa中没有足够的余额,它将不会显示STK推送。此外,电话号码应该以国家代码开始,如
254727392XXXX。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Form </title>
</head>
<style >
body{
background-color: skyblue;
}
</style>
<body>
<center>
<form style="padding-top: 150px;" action="MpesaTest.php" method="POST">
<fieldset style="width: 400px; height: 300px; background-color: white;">
<label style="padding-top: 200px;color:red;">Lipa Online</label>
<br>
<input class="input2" type="number" name="amount" placeholder="Enter Amount" style="margin-top: 60px;">
<br><br>
<input type="number" type="number" name="phone_number" placeholder="enter Phone number">
<br><br>
<button class="button" style="color: white; background-color: blue;">
Make Payment Now
</button>
</fieldset>
</form>
</center>
</div>
</body>
</html>
你的输出应该与此类似。

第6步 - 编写我们的M-Pesa逻辑
定义一个新的文件,并将其命名为MpesaTest.php 。这就是我们定义逻辑的地方,以实现用户手机上的STK推送。
这段代码将使用我们在创建Safaricom Daraja应用程序时获得的凭证。
变量声明
在我们之前创建的文件中,使用从你在Safaricom Daraja创建的应用程序中获得的凭证,声明并初始化以下变量。
<?php
// Initialize the variables
$consumer_key = 'Lms5EIf2gK16o1sptYPaA3HsfbGUd7fv';
$consumer_secret = 'dgfk1IefQx1SnG1A';
$Business_Code = '174379';
$Passkey = 'bfb279f9aa9bdbcf158e97dd71a467cd2e0c893059b10f78e6b72ada1ed2c919';
$Type_of_Transaction = 'CustomerPayBillOnline';
$Token_URL = 'https://sandbox.safaricom.co.ke/oauth/v1/generate?grant_type=client_credentials';
$phone_number = $_POST['phone_number'];
$OnlinePayment = 'https://sandbox.safaricom.co.ke/mpesa/stkpush/v1/processrequest';
$total_amount = $_POST['amount'];
$CallBackURL = 'https://2f50f430.ngrok.io/callback.php?key=your password';
$Time_Stamp = date("Ymdhis");
$password = base64_encode($Business_Code . $Passkey . $Time_Stamp);
?>
在上面的脚本中。
consumer_key- 这个变量协助开发者访问Safaricom API。consumer_secret- 这个变量也协助开发者访问Safaricom的API。Business_Code- 是一个业务代码,当客户输入Mpesa密码时,可以接收付款。Passkey- 创建Daraja应用程序后,你会得到一个密码。Type_of_Transaction- 要进行的交易类型。Token_URL- 验证并返回用于在Safaricom Daraja访问Lipa Na Mpesa服务的API令牌phone_number- 你将使用的Safaricom号码来进行支付。OnlinePayment- 对于测试环境,传递Safaricom STK处理请求。total_amount- 输入Mpesa密码后,将从您的账户中扣除的总金额。CallBackURL- 用于接收Mpesa API通知的URL。Time_Stamp- 交易的时间。它的格式通常为(YYYY-MM-DD)。password- 独特的密码,用于对请求进行加密。
生成认证令牌
接下来,获得一个认证令牌,这将使我们能够访问并与Safaricom Mpesa提供的服务互动。
//generate authentication token.
<?php
$curl_Tranfer = curl_init();
curl_setopt($curl_Tranfer, CURLOPT_URL, $Token_URL);
$credentials = base64_encode($consumer_key . ':' . $consumer_secret);
curl_setopt($curl_Tranfer, CURLOPT_HTTPHEADER, array('Authorization: Basic ' . $credentials));
curl_setopt($curl_Tranfer, CURLOPT_HEADER, false);
curl_setopt($curl_Tranfer, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_Tranfer, CURLOPT_SSL_VERIFYPEER, false);
$curl_Tranfer_response = curl_exec($curl_Tranfer);
$token = json_decode($curl_Tranfer_response)->access_token;
在上面的脚本中。
curl_init()- 该方法创建了一个新的会话,并返回一个cURL句柄;它将被存储在名为 的变量中。$curl_transfercurl_setopt- 创建一个cURL传输选项。CURLOPT_RETURNTRANSFER- 我们将其设置为true(1),而不是立即显示转移,将其作为curl exec()返回值的一个字符串返回。CURLOPT_HEADER- 将其设置为false,以防止在输出中包含头信息。curl_exec- 获取URL并将其发送给浏览器。CURLOPT_SSL_VERIFYPEER- 我们将该选项设置为false,这样同行证书验证就会成功。json_decode是一个将JSON字符串转换为JSON对象的函数。
在用户的手机上启动STK推送
接下来,我们将实现一段代码,在用户的手机上启动STK推送。
我们定义一个变量data2_string ,在我们的请求参数上使用json_encode。然后我们定义一个名为curl2_response 的变量来执行我们的curl请求。
$curl_Tranfer2 = curl_init();
curl_setopt($curl_Tranfer2, CURLOPT_URL, $OnlinePayment);
curl_setopt($curl_Tranfer2, CURLOPT_HTTPHEADER, array('Content-Type:application/json', 'Authorization:Bearer ' . $token));
$curl_Tranfer2_post_data = [
'BusinessShortCode' => $Business_Code,
'Password' => $password,
'Timestamp' =>$Time_Stamp,
'TransactionType' =>$Type_of_Transaction,
'Amount' => $total_amount,
'PartyA' => $phone_number,
'PartyB' => $Business_Code,
'PhoneNumber' => $phone_number,
'CallBackURL' => $CallBackURL,
'AccountReference' => 'Hillary',
'TransactionDesc' => 'Test',
];
$data2_string = json_encode($curl_Tranfer2_post_data);
curl_setopt($curl_Tranfer2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_Tranfer2, CURLOPT_POST, true);
curl_setopt($curl_Tranfer2, CURLOPT_POSTFIELDS, $data2_string);
curl_setopt($curl_Tranfer2, CURLOPT_HEADER, false);
curl_setopt($curl_Tranfer2, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl_Tranfer2, CURLOPT_SSL_VERIFYHOST, 0);
$curl_Tranfer2_response = json_decode(curl_exec($curl_Tranfer2));
echo json_encode($curl_Tranfer2_response, JSON_PRETTY_PRINT);
?>
在上面的脚本中。
CURLOPT_SSL_VERIFYPEER- 这个选项决定了curl是否验证对等人的证书的真实性。CURLOPT_SSL_VERIFYHOST- 设置为零,无论证书中的名称如何,连接都会成功。为了确保SSL对等体证书 或 字段与给定的主机名相匹配。Common NameSubject Alternate NameCURLOPT_POSTFIELDS- 向服务器POST的数据。如果你传递一个字符串、int、float或bool作为输入值,JSON encode()将生成一个基本值的JSON(不是一个对象或一个数组)。json_decode- 一个将JSON字符串转换为JSON对象的函数。json_encode- 指定值的JSON表示将作为一个字符串返回。

创建一个表单,该表单将包含一个确认付款的按钮
<form class="contact2-form validate-form" action="#" method="post">
<input type="hidden" name="Check_request_ID" value="<?php echo $curl_Tranfer2_response->Check_request_ID ?>">
</br></br>
<button class="contact2-form-btn" style="margin-bottom: 30px;">Confirm Payment is Complete</button>
</form>
输出。

结论
在本教程中,我们已经学会了如何在Safaricom Daraja API中创建一个账户。我们还学习了如何创建一个应用程序,并在新创建的应用程序中获得凭证。
我们还学习了如何整合Safaricom Mpesa STK推送,在这里,用户会被提示输入他们的电话号码和他们想要支付的金额。这将在他们的电话号码中发送一个STK推送,这样他们就可以输入他们的Mpesa Pin来进行支付。