先别急着买插件、调接口,我敢打赌,十个人做微信登录,八个会在同一个坑里摔得鼻青脸肿,不是我吓唬你,干这行快九年,苹果CMS从1.5玩到现在的版本,微信登录这个功能,我至少重装了四次,换了三套方案,最后才勉强稳住,今天不扯虚的,把那些年遇到的坑、试出来的路子、还有省预算的土办法,一五一十摊开说。
第一个大坑:压根没搞清楚微信登录的“身份证”
很多人一上来就搜“苹果CMS微信登录插件”,装好以后发现扫码弹不出来,或者弹出来提示“redirect_uri参数错误”,这不是插件的问题,是你根本没分清楚:你的站点用的是微信开放平台,还是微信公众平台?苹果CMS默认集成的微信登录,走的是开放平台(Open Platform)的扫码登录,需要你注册一个开放平台账号,然后创建网站应用,拿到AppID和AppSecret,而绝大多数人手里只有公众号的AppID,以为公众号的也能用,结果回调域名配了半天,死活不行。

苹果CMS微信登录血泪史,从踩坑到稳定运营,这些配置你避开了吗?
解决方案:老老实实去open.weixin.qq.com注册开放平台,如果觉得一年300块的认证费贵,那还有第二条路——放弃开放平台,改用公众号里面的“网页授权”来实现静默登录,苹果CMS有个第三方插件叫“WeixinLogin for CMS”,支持公众号授权模式,只需要一个服务号(不需要认证,但认证后权限更多),成本几乎为零,但注意,公众号授权只能用于同一微信开放账号下的应用,如果用户是在浏览器里访问你的站点,那么用公众号授权是走不通的,必须用开放平台扫码,我个人的建议是:预算足,上开放平台;预算紧,且用户主要来自微信内打开,就用公众号授权,别两头都想占,最后两头都配不好。
第二个坑:回调域名写了,但HTTP和HTTPS打架
配过微信开放平台的人都知道,回调域名必须填写完整的域名,比如www.abc.com,而且不能带端口,但我第一次就是栽在这里——我站用的是HTTPS,但微信后台只填了http://www.abc.com,结果用户扫码后,微信把code发到http的链接上,而我服务器强制跳转HTTPS,导致code丢失,直接报“授权失败”,还有就是,苹果CMS的微信登录插件在生成跳转URL时,默认取的是$_SERVER['HTTP_HOST'],如果服务器配置了多个域名或反向代理,取到的域名和微信后台填的不一致,依然报错。
解决方案:在微信开放平台后台,回调域名那一栏,把http://和https://都加上,或者更稳妥的是只写域名不写协议,苹果CMS插件里找到/extend/Wechat/目录下的文件,把生成跳转URL的逻辑强行改成https://开头,具体修改:在wechat.class.php里找到类似$redirect_uri = 'http://'.$_SERVER['HTTP_HOST'].'/index.php/user/login/type/wechat.html',改成$redirect_uri = 'https://'.$_SERVER['HTTP_HOST'].'/index.php/user/login/type/wechat.html',如果你用了CDN或Nginx反代,记得在配置里加上proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme;,不然服务器拿到的永远是内网IP。
第三个坑:用户信息拉取失败,头像、昵称全空
好不容易能扫码跳转了,结果登录成功后,用户头像显示默认灰色,昵称变成了“微信用户”,这不是插件bug,是微信开放平台在2020年后改了规则:新注册的应用,如果未申请“用户信息”权限,只能拿到OpenID,拿不到昵称和头像,很多站长不知道这回事,以为填了AppID和AppSecret就万事大吉。
解决方案:登录微信开放平台,进入你的应用管理,在“接口权限”里找到“获取用户基本信息”,需要提交审核,审核挺快,一般1-3个工作日,如果你急着用,可以先用静默授权(scope=snsapi_base)拿到OpenID,然后自己加一个用户修改资料的页面,让用户手动填昵称和上传头像,虽然体验差一点,但能解燃眉之急,长期来看,一定要把权限申请下来。
第四个坑:服务器时间不准,签名验证一直失败
这个坑最隐蔽,有一次我改完所有配置,用测试号扫了十几次,每次都是“签名错误”,折腾了两天,后来用命令行date一查,发现服务器系统时间慢了5分钟,微信的签名机制依赖timestamp,只要时间偏差超过几百秒,就会判定无效,苹果CMS的微信登录插件默认用PHP的time()函数,如果服务器没做NTP同步,很容易出问题。
解决方案:立刻给你的服务器装上NTP服务,CentOS用yum install ntp && ntpdate pool.ntp.org,Ubuntu用apt install ntpdate && ntpdate ntp.aliyun.com,然后设置定时同步,苹果CMS缓存机制也要注意,有些插件会缓存access_token,如果token过期时间计算错误,也会导致签名失败,建议在插件后台把“access_token缓存时间”改短一点,比如7200秒改成3500秒,留一点余量。
推荐配置与插件:少走弯路
说了一堆坑,最后给个能直接抄作业的组合,服务器环境:Nginx 1.20+、PHP 7.4、MySQL 5.7、Redis(用于缓存session和access_token),PHP版本别低于7.0,否则curl扩展和openssl扩展可能不全,苹果CMS版本建议用最新稳定版,目前是v14版本,微信登录插件,官方自带的基本够用,但如果你需要更多功能(比如海外手机号绑定、多平台统一登录),推荐用“苹果CMS微信登录专业版”(一个付费插件,约99元,支持扫码、公众号、小程序三种模式),作者更新很勤,而且有技术支持,免费插件的话,搜索“微信登录 for 苹果CMS v10”,注意看评论,选最近半年有更新的。
强烈建议开启微信登录日志,插件里一般有个“调试模式”,打开后,所有请求和返回信息会写入runtime/log/目录下的日志文件,遇到问题先看日志,微信返回的errmsg往往比百度搜到的任何教程都准。
长期维护建议:省钱省心
- 定期更新插件和CMS,微信接口也会变,比如2022年旧版API就下线了一批,每季度检查一次官方更新。
- 备份数据库和密钥,AppSecret和Token一旦丢失,得重新申请,麻烦得很,我习惯把密钥存在一个本地加密文本,同时用笔记软件备份。
- 监控运营异常,如果突然发现大量用户登录失败,先去微信开放平台看看是不是接口被限流了(每天调用次数有上限,虽然一般够用),可以用第三方API监控工具,比如UptimeRobot,每5分钟检查一次登录接口是否正常返回200。
- 别乱改核心文件,很多人为了好看,去改插件底层代码结果搞崩了,需要自定义样式或逻辑,最好用钩子或覆写方式,苹果CMS支持模板覆盖和自定义函数。
最后说一句:微信登录这东西,七分靠配置,三分靠运气,如果实在搞不定,也别死磕,99块钱买个靠谱插件,比熬夜调试划算得多,省下的时间,多搞几部好片子才是正道。
发表评论