PHP实现微信公众号客服消息发送功能及代码示例
好多个开发者,于对接微信公众号客服消息之际,总得觉着要去处理繁杂的加密状况,以及认证事宜,还有XML解析这一项,实际上官方早就已然提供了更为简便的HTTP接口。只要获取到access_token,借助PHP开启一个POST请求即可把相关消息给发送出去,整个流程当中核心代码不超过十行。
获取access_token是第一步
access_token相当于公众号的全局身份证,所有高级接口都依赖它。调用接口的URL是https://api.weixin.qq.com/cgi-bin/token,需要带上appid和secret两个参数。这两个值在公众号后台的“开发-基本配置”里可以找到。正常情况下,接口会返回一个JSON,里面包含access_token字符串和有效期7200秒。考虑到接口调用频率限制,建议把获取到的token存到缓存或数据库里,临近过期再重新获取,而不是每次发消息都去拉取。
发送文本消息的代码结构
文本消息是最基础的客服消息类型。调用接口的地址是https://api.weixin.qq.com/cgi-bin/message/custom/send,后面拼接上access_token。发送的内容是一个JSON结构,包含touser和msgtype两个主要字段。touser填用户的openid,这个在用户关注公众号或与公众号互动时就能拿到。msgtype固定为text,然后在text节点里放content字段。以PHP的curl扩展去发起请求之际,要记着把CURLOPT_POST设置成true,且携带JSON字符串当作post body。
处理接口返回结果
接口被调用之后,微信的服务器会给出一个归属JSON格式的响应。正常的状况里的返回内容涵盖errcode以及errmsg,errcode要是为0那就意味着发送是成功的。要是errcode并非0,像返回40001表明access_token是无效的或者已经过期,返回45015表明用户已经有48小时没有进行互动并且没有关注公众号,没办法接收消息。在实际的开发过程中一定要对这个返回码加以判断,并针对不同的错误码做出相应的处理。倘若token过期,那么便重新获取,之后再进行发送,要是用户不可达,那就记录日志,以此避免重复发送。
频率限制需要重点关注
$openid,
'msgtype' => 'text',
'text' => array('content' => $content)
);
$options = array(
'http' => array(
'header' => "Content-type: application/x-www-form-urlencoded
",
'method' => 'POST',
'content' => http_build_query($data),
),
);
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
$result = json_decode($response, true);
if ($result['errcode'] == 0) {
echo '消息发送成功';
} else {
echo '消息发送失败';
}
?>
用于客服的消息接口存在着明确的频率方面的限制,对于每个具体的用户来讲,在每48个小时的时间段之内,最多能够接收到20条消息,倘若用户在48小时之内与公众号之间产生过互动行为,那么这个限制将会放宽到200条,然而此处却存在着如坑一般的情况,群发消息、模板消息以及客服消息是进行分开计数的,除此之外,单个公众号每一天调用客服消息接口的总的次数上限为10万次,在进行开发的过程中建议在代码里面做频控逻辑,记录下针对每个用户的最后的发送时间,或者运用Redis计数器来限制在单位时间内的发送次数,以此来防止触发微信的封禁机制。
其他消息类型的实现差异
除了文本消息,客服接口还支持图片、语音、视频、音乐、图文等格式。图片消息需要先上传素材拿到media_id,再通过客服接口发送。图片上传接口是https://api.weixin.qq.com/cgi-bin/media/upload,需要POST文件数据。图文消息稍微复杂些,用的是news类型,articles数组里每篇文章包含title、description、url、picurl等字段。值得注意的是,图文消息里的url必须是已发布文章的外链或公众号文章链接,否则点击会提示无法访问。
实际项目中常见问题
存在着这样一个典型问题,众多开发者都有遇到,那便是access_token管理处于混乱状态。当好几台服务器一同去刷新token之际,就能够致使其中的一个失效,所以建议将token存储到诸如Redis或者数据库这类共享存储里边,并且还要设置妥当锁机制。还出现了另一个常见问题,那就是openid究竟从哪里去获取。当用户发送消息之时,微信会朝着开发者所配置的服务器地址推送事件,从XML当中解析出FromUserName字段,这个字段就是openid。用户进行点击菜单这一行为,会推送事件,用户进行关注公众号这一行为,同样会推送事件,在这样的场景之下,是能够记录下openid的,将其作为后续主动客服消息的发送对象。
你曾对接过微信公众号余类之其他接口乎,譬如模板消息或者网页授权,有无遇见过使你卡顿良久的问题呀?欢迎于评论区递交你的踩坑经历呢!
同类文章排行
- 三聚磷酸钠与减水剂、解胶王等产品的区别?
- 「亚马逊人脸识别噩梦」贝索斯将AI武器化遭大规模抗议
- 腾讯游戏营收比重连续两个季度下降,支付、云计算等业务营收涨3
- 星巴克的中年劫
- 三聚磷酸钠在陶瓷行业中的作用是什么?
- 工业三聚磷酸钠实验室鉴别假冒伪劣产品的方法?
- 传滴滴即将接入ofo,共享单车大战格局或生变
- 工业三聚磷酸钠在洗涤行业中的作用是什么?
- 获 3800 万元 A+ 轮投资,乐摇摇科技利用抓娃娃机做线
- 点击在线求助,应答的却都是机器人,这样真的好吗?




