Phalapi 是一个基于 PHP 轻量级开发框架。它以良好的设计比例和优雅的代码为特点,让使用者能够更加便捷地开发出高性能的 API 应用。在这里,我们将介绍如何利用Phalapi来开发小程序。
## 什么是小程序?
小程序是一种不需要下载安装、即用即走的应用,它通过微信、QQ 等社交平台才能使用。小程序一般比较小巧,主要解决单一问题或单一流程。
## Phalapi怎么开发小程序?
开发小程序我们需要依赖微信开放平台,因此,首先你需要前往微信公众平台申请小程序相关权限才能进行以下的操作。
接下来,我们就可以创建一个 Phalapi 项目开始我们的开发之旅。
### 1. Phalapi 安装
Phalapi 的安装非常简单,只需在终端中运行以下命令即可:
```
composer create-project phalapi/phalapi
```
安装完之后,我们就可以开始项目的配置了。
### 2. 小程序配置
我们需要在微信公众平台申请小程序相关的权限,然后在项目中添加以下文件:
config/app.php:
```
return [
'home' => [
'default' => [
'service' => 'Default.Index',
'action' => 'index'
],
],
//小程序配置
'api' => [
"mini_program" => [
"appid" => "YOUR_APPID",
"secret" => "YOUR_SECRET",
"grant_type" => "authorization_code",
"log" => [
"path" => LOG_PATH . '/mini_program',
"level" => 4,
]
]
],
];
```
其中YOUR_APPID为你的小程序appid,YOUR_SECRET为你的小程序secret。在此之后,我们需要引入相应的类库。
classes/Install.php:
```
namespace App;
use PhalApi\Core\Boot\IMvcBoot;
class Install implements IMvcBoot {
public function boot() {
\DI()->loader->addDirs(APP_ROOT . '/MiniProgram');
}
}
```
此文件主要是在 PhalApi 项目启动时引入 MiniProgram 类库。
### 3. 创建小程序登录服务
在 MiniProgram 文件夹下创建 Login 文件夹,在里面创建 IndexService.php 文件:
MiniProgram/Services/Login/IndexService.php:
```
namespace App\MiniProgram\Services\Login;
use PhalApi\MustLoginService;
use App\MiniProgram\Model\MiniProgramModel;
class IndexService extends MustLoginService {
public function doGet() {
$code = $this->request->getQuery('code');
$model = new MiniProgramModel();
$session = $model->getSessionInfo($code);
return $session;
}
}
```
该类主要是在用户调用小程序登录接口时获取用户 session_key。此接口需要用户登录,因此使用了 PhalApi 提供的 MustLoginService 类。
MiniProgram 文件夹下的 Model 文件夹中需要创建 MiniProgramModel.php 文件:
MiniProgram/Model/MiniProgramModel.php
```
namespace App\MiniProgram\Model;
use PhalApi\Model\NotORMModel;
use App\Common\UserDao\LiteUser;
class MiniProgramModel extends NotORMModel {
private $appid;
private $secret;
public function __construct() {
parent::__construct();
$this->appid = \PhalApi\DI()->config->get('app.api')['mini_program']['appid'];
$this->secret = \PhalApi\DI()->config->get('app.api')['mini_program']['secret'];
}
public function getSessionInfo($code) {
$url = "https://api.weixin.qq.com/sns/jscode2session?appid=" . $this->appid . "&secret=" . $this->secret . "&js_code=" . $code . "&grant_type=authorization_code";
$http = new \PhalApi\Http();
$response = $http->get($url);
return $response;
}
}
```
在该文件中,我们需要利用微信提供的接口获取用户 session_key。
### 4. 创建小程序加解密服务
MiniProgram 文件夹下创建 Decrypt 文件夹,里面创建 IndexService.php 文件。
MiniProgram/Services/Decrypt/IndexService.php:
```
namespace App\MiniProgram\Services\Decrypt;
use PhalApi\MustLoginService;
use App\Common\UserDao\LiteUser;
use App\MiniProgram\Model\MiniProgramModel;
class IndexService extends MustLoginService {
public function doGet() {
$encryptedData = $this->request->getQuery('data');
$iv = $this->request->getQuery('iv');
$session_key = LiteUser::getSessionKey(); //获取用户 session_key
$pc = new WXBizDataCrypt($this->appid, $session_key);
$errCode = $pc->decryptData($encryptedData, $iv, $data);
return [
'errCode' => $errCode,
'data' => $data,
];
}
}
```
在该类中,我们主要是利用了微信提供的加密算法将加密数据解密。
MiniProgram 文件夹下创建 Thirdparty 文件夹并将 wx_lib.php 放入其中。
MiniProgram/Thirdparty/wx_lib.php:
```
class WXBizDataCrypt
{
private $appid;
private $sessionKey;
public function __construct($appid, $sessionKey)
{
$this->appid = $appid;
$this->sessionKey = $sessionKey;
}
public function decryptData($encryptedData, $iv, &$data)
{
if (strlen($this->sessionKey) != 24) {
return -41001;
}
$aesKey=base64_decode($this->sessionKey);
if (strlen($iv) != 24) {
return -41002;
}
$aesIV=base64_decode($iv);
$aesCipher=base64_decode($encryptedData);
$result=openssl_decrypt($aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
$dataObj=json_decode($result);
if($dataObj == NULL)
{
return -41003;
}
if($dataObj->watermark->appid != $this->appid)
{
return -41004;
}
$data = $result;
return 0;
}
}
```
该文件中主要是加密算法的实现。
到这里,我们就可以在小程序中实现用户登录注册及加解密等功能。