Yii对接微信小程序的关键是提供符合CORS、HTTPS、JSON、无session依赖的REST API;需配置SSL证书、精确设置Access-Control-Allow-Origin、禁用session改用Bearer Token鉴权、对齐URL路由规则、统一JSON响应格式并捕获异常返回标准结构。
Yii 框架本身不区分客户端类型,
微信
小程序对接的关键不是“Yii 怎么适配小程序”,而是「Yii 怎么提供稳定、安全、可被小程序合法调用的 REST API」。只要接口符合 CORS、HTTPS、JSON 返回、无 session 依赖等基本约束,小程序就能正常通信。
小程序请求被拦截:CORS 和 HTTPS 强制要求
微信小程序
强制要求所有
的目标域名必须在「小程序后台 → 开发管理 → 服务器域名」中白名单备案,且协议必须是
。Yii 服务端若跑在
或未配 SSL 的 Nginx 上,请求直接失败,控制台看不到任何网络日志——这是最常卡住的第一步。
确保 Web 服务器已配置有效 SSL 证书(Let’s Encrypt 可免费获取)
Yii 不需要额外开启 CORS,但需在响应头中明确允许小程序域名:
(不能写
,小程序不认)
若用 Nginx,可在 location 块加:
小程序 POST 请求默认带
,Yii 必须启用 JSON 解析器,否则
为空
登录态如何传递:不用 Cookie,改用 token
小程序没有 Cookie 上下文,
默认依赖 session cookie,直接复用会导致每次请求都视为未登录。必须切换为无状态鉴权。
禁用 session:在
中移除或注释掉
组件配置
改用 Bearer Token:用户登录后返回
,小程序后续请求在 header 中带上
在控制器基类或行为中验证 token,例如用
,并配合自定义
实现
避免把 token 存 localStorage,应存在
,读取时统一注入 request header
Yii 路由返回 404:URL 规则没对齐小程序路径
小程序调用
,但 Yii 的
没配
模块路由,就会 404。这不是跨域问题,是纯路由匹配失败。
微信公众平台开发入门教程 中文WORD版
由于微信的大热,为了更好的方便使用微信的用户查询一些信息,这篇文章是入门级的微信公众平台开发教程,需要的朋友可以参考下 这篇入门教程将引导你完成如下任务: 创建百度云平台应用启用微信公众平台开发模式获取订阅、文字、图片、语音、视频消息回复文本、图文及音乐消息程序开发
下载
确认模块路径与 URL 路径一致:比如访问
,就要有
的
必须显式包含模块前缀,不能只写
:
如果用
(推荐),
对应单数控制器,别误写成
导致找不到路由
调试时打开
并查看 Yii 日志里的
记录,确认是否匹配到规则
数据格式和错误处理:小程序只认标准 JSON 结构
小程序
的
回调只触发于 HTTP 状态码 200–299,且期望响应体是合法 JSON。Yii 默认 4xx/5xx 响应会输出 HTML 错误页,小程序收到的是 HTML 字符串,
直接报错。
全局统一响应格式:重写
或在
中拦截,确保所有响应都是
结构
捕获异常并转 JSON:在
的
中设置
,并在
中输出 JSON
验证失败时不要抛
,改用
,它会返回 400 + JSON
避免在控制器里直接
,破坏 Yii 的响应生命周期;始终走
真正难的不是写接口,而是让每个环节都“不假设客户端是浏览器”——从 HTTPS 到 token、从路由前缀到 JSON 错误体,每一步偏离都会导致小程序静默失败。留心日志里
是否存在、
是否为
、
是否及时落盘,这些才是定位卡点的实际依据。
wx.requesthttpshttp://localhostAccess-Control-Allow-Origin: https://your-miniprogram-domain.com*add_header 'Access-Control-Allow-Origin' 'https://your-miniprogram-domain.com';Content-Type: application/jsonYii::$app->request->post()yii\web\Userconfig/web.php'session'{ "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..." }Authorization: Bearer xxxyii\filters\auth\HttpBearerAuthidentityClassfindIdentityByAccessToken()wx.setStorageSync('token', ...)wx.request({ url: 'https://api.example.com/v1/user/info' })urlManagerv1/v1/usermodules => ['v1' => ['class' => 'api\modules\v1\Module']]urlManagerrules['controller' => 'user']['class' => 'yii\rest\UrlRule', 'controller' => ['v1/user', 'v1/post']]pluralize => falsev1/userv1/usersenableStrictParsing => trueUrlManager::parseRequestwx.requestsuccessJSON.parseyii\base\ActionFilterbeforeAction{ "code": 0, "message": "ok", "data": {...} }config/web.phpcomponents['errorHandler']'errorAction' => 'site/error'SiteController::actionError()yii\base\InvalidParamExceptionthrow new yii\web\BadRequestHttpException($model->getFirstError())echo json_encode(...)return $this->asJson(...)$_SERVER['HTTP_AUTHORIZATION']Yii::$app->request->getContentType()application/jsonYii::getLogger()->flush()