在微信小程序开发中,经常需要php后端同时支撑小程序、h5甚至app等多个端。不同端的登录方式、数据字段、业务限制往往有差别,如果都在接口里写if判断,代码会又乱又难改。下面介绍用php做多端适配的几种实用技巧。

一、如何识别不同客户端
最常用的方法是从请求头或参数中拿到端类型。小程序端可以在请求时带一个自定义头,比如 X-Client-Type,php用 $_SERVER 读取。
<?php
// 获取客户端类型,默认未知
$client = $_SERVER['HTTP_X_CLIENT_TYPE'] ?? 'unknown';
// 也支持从get参数拿
if (empty($client)) {
$client = $_GET['client'] ?? 'unknown';
}
echo $client; // wechat,h5,app等
?>
二、用工厂模式隔离差异逻辑
把不同端的业务处理类分开,php根据端类型返回对应实例,避免一个方法里堆满分支。
<?php
interface OrderService {
public function getList($uid);
}
class WechatOrderService implements OrderService {
public function getList($uid) {
// 小程序端只返回必需字段
return ['order_sn' => 'wx_123', 'amount' => 10];
}
}
class AppOrderService implements OrderService {
public function getList($uid) {
// app端多返回一些营销字段
return ['order_sn' => 'app_123', 'amount' => 10, 'coupon' => 5];
}
}
function makeOrderService($client) {
if ($client === 'wechat') {
return new WechatOrderService();
}
return new AppOrderService();
}
?>
三、公共逻辑抽成基类
多个端共用的校验、查库等逻辑,可以写到抽象类里,差异部分留子类实现。
<?php
abstract class BaseUser {
// 公共:查用户是否存在
protected function checkUser($uid) {
return $uid > 0;
}
// 差异:由各端实现
abstract public function login($uid);
}
class WechatUser extends BaseUser {
public function login($uid) {
if (!$this->checkUser($uid)) return false;
return ['token' => 'wx_token'];
}
}
?>
四、接口返回做统一包装
建议php出口统一用同一个响应结构,前端按自己的端去取字段,后端不用为每个端改返回格式。
| 端类型 | 说明 |
|---|---|
| 小程序,字段精简 | |
| h5 | 网页,可带分享信息 |
| app | 客户端,字段最全 |
用上面的方式,php微信小程序多端适配就能清晰不少。核心就是识别端、分职责、抽公共,后期加新端也不会动老逻辑。