thinkphp实现小程序前后端分离的核心是将其作为纯api服务:关闭模板引擎、统一json响应、通过code换取openid并生成token存redis、用中间件校验token权限、所有敏感接口强制校验token与openid一致性。

ThinkPHP 实现前后端分离的小程序接口,核心是把 ThinkPHP 当作纯后端 API 服务来用:不渲染页面、统一返回 JSON、做好鉴权和跨域(小程序本身不走浏览器,但开发调试或配合 H5 时可能涉及),同时适配小程序的登录态(如 code 换取 session_key + openid)。
1. 配置基础 API 环境
确保项目以 API 模式运行:
- 关闭模板引擎:在 config/app.php 中设
'view_replace_str' => [],并确认不调用view()或fetch() - 统一 JSON 输出:在公共基类控制器(如
app/controller/ApiBase.php)中封装成功/失败响应方法,例如:
protected function success($data = [], $msg = 'ok', $code = 200) {
return json(['code' => $code, 'msg' => $msg, 'data' => $data]);
}
protected function fail($msg = 'error', $code = 400) {
return json(['code' => $code, 'msg' => $msg, 'data' => []]);
}
所有 API 控制器继承该基类,统一输出格式,便于小程序端解析。
2. 小程序登录与用户态管理
小程序不依赖 Cookie,需用自定义登录态(推荐 JWT 或服务端 Session ID + Redis 缓存):
- 前端调用
wx.login()获取code,POST 到接口(如/api/login) - 后端用 code 向微信接口
https://api.weixin.qq.com/sns/jscode2session换取openid和session_key - 生成唯一 token(如 JWT 或 md5(uniqid().openid)),存入 Redis(key:
token:xxx,value:['openid'=>'xxx', 'login_time'=>time()],过期时间建议 7 天) - 返回 token 给小程序,后续请求在 header(如
X-Auth-Token)或 POST body 中携带
3. 接口权限控制(中间件)
为需要登录的接口加权限校验:
- 新建中间件
app/middleware/CheckToken.php - 从 header 或参数中提取 token,查 Redis 是否存在且未过期
- 验证通过后,可将
openid注入 Request 对象($request->withAttr('openid', $openid)),供控制器直接使用 - 在路由或控制器顶部绑定该中间件,例如:
Route::rule('user/info', 'User/info')->middleware('checkToken');
4. 小程序常见接口示例(以用户信息为例)
控制器路径:app/controller/api/User.php
namespace app\controller\api;
use app\Controller;
use think\Request;
class User extends Controller
{
public function info(Request $request)
{
$openid = $request->attr('openid'); // 来自中间件注入
$user = \think\Db::name('user')->where('openid', $openid)->find();
if (!$user) {
return $this->fail('用户不存在', 404);
}
return $this->success([
'nickName' => $user['nickname'],
'avatarUrl' => $user['avatar'],
'gender' => $user['gender']
]);
}
}
对应路由定义在 route/api.php:
use think\facade\Route;
Route::group('api', function () {
Route::post('login', 'api.Login/login');
Route::get('user/info', 'api.User/info')->middleware('checkToken');
});
不复杂但容易忽略:小程序 wx.request 默认不带 Cookie,所以别依赖 PHPSESSID;所有敏感操作(如提交订单、获取手机号)必须校验 token + openid 一致性;微信手机号解密、支付回调等需严格验签。接口写完,用 Postman 或小程序开发者工具真机调试验证字段和状态码即可。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











