要在yii2.0.50中实现微信模板消息推送,必须完成公众号权限开通、服务器配置、access_token获取与缓存,并严格按规范构造json请求体发送;漏掉任一环节将导致40003或40001错误。

要在Yii2.0.50项目中实现微信公众号模板消息推送,必须先确保公众号已开通模板消息接口权限、完成服务器配置、获取有效access_token,并在后端构造符合微信规范的JSON请求体发送至API端点。这一步漏掉任意一环都会导致40003(invalid openid)或40001(invalid credential)错误。
配置公众号基础参数与环境准备
在config/web.php或独立的params.php中声明AppId、AppSecret和模板ID:
【AppSecret必须严格保密,不可硬编码在前端或日志中】
添加如下配置项(示例值需替换为你的公众号实际参数):
'wechat' => [ 'appid' => 'wx1234567890abcdef', 'appsecret' => 'a1b2c3d4e5f678901234567890abcdef', 'template_id' => 'TEMPLATE_1234567890abcdef1234567890abcdef' ]
将该配置注入到自定义WeChatService类的构造函数中,避免全局静态调用导致测试困难。
封装AccessToken获取逻辑
微信access_token有效期2小时,且调用频次受限(每日2000次),必须本地缓存并自动刷新:
方法一:使用Yii2内置缓存组件(推荐)
在common/components/WeChatService.php中定义getAccessToken()方法,先尝试从Yii::$app->cache读取;若失效或不存在,则拼接URL:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}发起GET请求;解析返回JSON,提取access_token字段并写入缓存(过期时间设为7000秒,预留300秒容错)。
方法二:跳过缓存直连(仅调试用)
直接调用file_get_contents()拉取token,但每次都会触发HTTP请求,上线后必然触发频率限制,【正式环境严禁使用】。
构建并发送模板消息
第一步:确认用户已授权并持久化其openid(不能靠前端传参,必须通过OAuth2.0静默授权或用户点击事件回调获取)
第二步:组装消息数据结构,按微信文档要求严格命名字段——first、keyword1~keywordN、remark,每个子对象必须含value和color属性,颜色值如#173177不可省略,否则报错47001(invalid template data)
第三步:用yii\helpers\Json::encode()序列化整个消息体,注意不要用json_encode()裸调,避免中文乱码或斜杠转义异常
第四步:向https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=xxx发起POST请求,设置Content-Type: application/json,body为上一步生成的JSON字符串
第五步:检查响应结果中的errcode字段——0表示成功,40003表示openid无效(用户未关注或已取关),41001表示access_token缺失,40037表示template_id不匹配当前公众号











