ThinkPHP如何对接企业微信_API接口认证与消息推送【教程】

老芳姑娘_7238

老芳姑娘_7238

2026-05-16

827人浏览

原创

thinkphp对接企业微信客服消息的核心难点是鉴权分离与消息发送的强约束条件:必须区分使用access_token(管理类接口)和kf_access_token(客服接口),且/kf/send_msg需满足用户48小时窗口、5条/48h配额、external_userid、open_kfid匹配及后台权限配置等多重条件。

thinkphp如何对接企业微信_api接口认证与消息推送【教程】

ThinkPHP 对接企业微信 API 的核心难点不在框架本身,而在于鉴权链路的时序控制和消息接口权限的精确匹配。直接套用 gettoken 示例代码大概率失败——因为企业微信要求:自建应用调用客户消息接口(如 /kf/send_msg)必须走「微信客服」专用鉴权体系,而非通用 /gettoken。


access_token 和 kf_access_token 必须区分使用

企业微信里有两个关键 token:

  • access_token:用于管理后台类接口(如获取用户列表、部门信息),由 corpid + corpsecret 申请
  • kf_access_token:仅用于微信客服相关接口(如 /kf/send_msg),必须用 corpid + kf_secret 获取,且需提前在管理后台「微信客服 → 接口调用配置」中启用对应应用

常见错误现象:

  • 调用 /kf/send_msg 返回 {"errcode":40014,"errmsg":"invalid access_token"}
  • 明明 gettoken 成功了,但发消息报错 48002(接口未授权)

正确做法:

  • 在 ThinkPHP 的配置文件中独立维护两套凭证:
    'weixin' => [
      'corpid' => 'wwxxxxxx',
      'corpsecret' => 'xxxxxxxx', // 通用 secret
      'kf_secret' => 'yyyyyyyy',  // 微信客服专用 secret
    ]
  • 封装两个独立的 token 获取方法:getAccessToken() 和 getKfAccessToken(),各自缓存并校验有效期(7200 秒)
  • 绝对禁止混用:向 /kf/send_msg 传 access_token

/kf/send_msg 接口必须满足用户状态与配额限制

这个接口不是“想发就发”,它受微信侧强策略管控:

  • 用户必须处于以下任一状态:
    • 刚刚给客服发过消息(48 小时窗口期内)
    • 当前会话由智能助手接待中(需先调用 /kf/switch_session)
  • 单个用户 48 小时内最多接收 5 条消息(含图文、小程序等所有类型)
  • touser 字段必须填微信客户的 external_userid,不是企业微信的 userid

实操建议:

微信公众号自动发布增强版
微信公众号自动发布增强版

一键发布 Markdown/HTML 文章至微信公众号草稿箱,支持自动配图、排版美化、UTF‑8编码

下载
  • 发送前务必查用户最近一次主动消息时间(可通过回调事件或 /kf/list_msg 拉取)
  • 在数据库记录每条消息的 msgid 和发送时间,避免超限重试
  • 若需突破 5 条限制,只能引导用户再次发起对话(例如回复关键词“人工”)

示例请求体(ThinkPHP 中构造):

$data = [
  'touser' => $external_userid,
  'open_kfid' => 'wk_xxxxxx', // 客服账号 ID,非应用 ID
  'msgtype' => 'text',
  'text' => ['content' => '订单已发货,请注意查收'],
];
注意:open_kfid 必须和申请 kf_access_token 的客服账号一致,否则返回 48003。

ThinkPHP 缓存 token 时必须隔离存储与原子更新

access_token 和 kf_access_token 都有 2 小时有效期,但刷新时机不同、失败影响面也不同:

  • 通用 access_token 失效会导致整个组织架构同步中断
  • kf_access_token 失效只影响客服消息,但高频刷新可能触发限流(企业微信对 /gettoken 类接口有 2000 次/天限制)

推荐做法:

  • 使用 ThinkPHP 的 Cache::store('redis') 分别存两个 key: weixin:access_token 和 weixin:kf_access_token
  • 获取 token 时加锁(Cache::lock('weixin:token_lock', 10)),防止并发重复刷新
  • 刷新失败时保留旧 token 并记录日志,而不是抛异常中断业务

容易踩的坑:

  • 直接用 Config::set() 存 token 到内存,多进程下失效
  • 没做锁导致多个请求同时刷新,超出调用限额被限流
  • 把 kf_access_token 错误地存进通用缓存池,后续被其他接口误取

微信客服消息链路的真正复杂点,从来不在代码怎么写,而在于谁在什么时间、以什么身份、对谁、发第几条消息。Token 只是钥匙,门后规则才是重点。漏掉任意一个条件(比如没配 open_kfid、没在管理后台勾选接口权限、用户不在 48 小时窗口),都会静默失败。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关文章

企业微信
企业微信

企业微信是腾讯微信团队为企业打造的专业办公管理工具。与微信一致的沟通体验,丰富免费的OA应用,并与微信消息、小程序、微信支付等互通,助力企业高效办公和管理。有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

9544

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

5741

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2055

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3588

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4274

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3351

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

4757

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

3722

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

11722

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习