yii框架restful接口需手动配置才能适配小程序:需显式注册valid路由、严格验签、处理cors与openid鉴权,并确保actionvalid响应纯净无额外输出。

Yii 框架的 RESTful 接口完全适合小程序,但默认配置下必须手动补全关键环节,否则会卡在签名验证或 CORS 问题上。
为什么小程序调用 yii\rest\UrlRule 会返回 404 或空响应
小程序发起的是标准 HTTP GET/POST 请求,而 Yii2 的 yii\rest\UrlRule 默认只暴露 index、view 等动作,不自动包含 valid 这类自定义入口。微信服务器验证阶段要求 URL 必须能直接响应 echostr,且不带任何额外输出(包括空白符、BOM、调试信息)。
- 确保
actionValid()方法中没有var_dump、error_log或未关闭的调试模式(如YII_DEBUG = true) -
urlManager中的extraPatterns必须显式声明'GET valid' => 'valid',不能只靠路由别名 - 检查 Web 服务器是否拦截了
.php后缀以外的请求(Nginx 常见:需确认location ~ \.php$能覆盖/wechats/valid) - 避免在控制器构造函数或
init()中抛出异常或提前 exit —— 微信验证阶段不允许任何非纯文本响应
checkSignature() 验证失败的三个高频原因
微信服务器每次 GET 请求都会携带 signature、timestamp、nonce 和 echostr,本地验签逻辑必须严格对齐官方规则,差一个字符或排序方式就失败。
-
sort($tmpArr, SORT_STRING)不可省略或替换成asort—— 微信要求字典序升序,不是键名排序 -
$token必须从Yii::$app->params['wechat']['token']读取,且该值在params.php中不能含空格或换行(建议用单引号包裹纯字符串) - PHP 版本若 ≥ 8.1,
$_GET中的参数可能被自动 urldecode,但微信原始参数是未 decode 的,应直接使用$_SERVER['QUERY_STRING']解析更稳妥(尤其当 token 含特殊符号时)
小程序前端调用 Yii 后端 API 时的跨域与鉴权处理
小程序本身不发 Origin 头,但开发工具和部分真机环境仍可能触发预检(OPTIONS),同时登录态需与微信 openid 绑定,不能只靠 session。
- 在
behaviors()中添加Cors行为时,'Access-Control-Allow-Origin' => '*'可临时通过,但上线必须限制为小程序合法域名(如https://servicewechat.com) - 不要依赖
Yii::$app->user->isGuest判断登录态 —— 小程序用户无 Cookie,应改用 header 传X-Wechat-Openid+ 后端查库校验 - 敏感接口(如获取用户信息)必须校验
signature+timestamp防重放,不能只验 openid - Yii2 默认 JSON 响应 Content-Type 是
application/json; charset=UTF-8,小程序wx.request能正常解析,无需额外设置
最易被忽略的是微信服务器验证阶段对响应体的洁癖:任何 echo 之外的输出(哪怕一个空格)、任何未关闭的输出缓冲、任何未捕获的 Notice 级错误,都会导致验签失败。建议在 actionValid() 开头加 ob_end_clean(); 并关闭所有错误报告。











