PHP开发企业微信客服功能:消息收发及准备工作全解析
企业微信客服进行开发时,最怕遭遇踩坑情况,诸如接口调用失败,消息发送无法成功,员工接收不到客户消息,而这些问题借助正确运用PHP接口均能够得以避免。本文针对开发过程之中的核心步骤,以及代码细节做直接拆解。
准备工作与账号配置
开发之前,得先登录企业微信管理后台,于“应用管理”那儿创建自建应用。创建完毕之后,系统会分派CorpID和Secret这两个关键参数,CorpID可是企业单独的标识,Secret乃是应用的密钥。这两个参数在后续的所有接口调用当中都会被用到,建议存放在配置文件内,别硬编码于代码里。
配置阶段,要设置应用的可信域名,还要设置IP白名单。企业微信规定,接口回调的域名得通过ICP备案,还得把服务器公网IP添加进白名单。这一步常常被人忽略,结果导致后续接口调用时,返回“ip not in whitelist”错误。与此同时,需要在“客户联系”模块里,开启“启用客户联系”功能。
获取Access Token的方法
Access Token是企业微信接口调用的通行证,有效期为7200秒。通过PHP的cURL库发送GET请求到以下地址即可获取:https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET。返回的JSON数据中,“access_token”字段就是需要保存的值。
建议把Token缓存至Redis或者文件里,以此来提升效率,设定其过期时间是7000秒,防止在有效期之内重复进行请求。倘若频繁调用获取Token接口,企业微信会返回“45009”这个错误码,这表明接口调用次数已经超限。在PHP代码里要处理这种异常状况,当Token失效的时候重新去获取并且更新缓存。
发送文本消息的完整流程
发送文本消息需要调用消息推送接口,地址格式为https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN。请求方式为POST,数据格式为JSON。必须包含的参数有“touser”(接收人账号)、“msgtype”(消息类型)和“agentid”(应用ID)。
构造消息体之际,“touser”能够指定单个员工账号,或者运用“@all”朝着全员予以发送。“content”字段用以存放消息正文,其长度限制处于2048字节以内。要是发送给客户,还得在消息体里增添“touser_type”参数,并指定为“customer”。发送成功之后接口返回“errcode”为0,不然依据错误码去排查问题,例如“60011”意味着没有权限发送消息给该用户。
发送图片与文件消息
$corpid = "企业ID"; $corpsecret = "应用 Secret"; $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$corpid&corpsecret=$corpsecret"; $response = file_get_contents($url); $data = json_decode($response, true); $access_token = $data['access_token'];
图片消息需要先上传临时素材。调用素材上传接口https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=TOKEN&type=image,使用POST表单方式提交图片文件。接口返回的“media_id”就是图片标识,有效期为3天。发送图片消息时,将“msgtype”设置为“image”,“media_id”填入该标识。
文件消息的处理方式相近,先是上传文件以获取media_id,接着发送消息,这一点要留意。文件大小被限制为20MB是需要注意的,支持的格式涵盖doc、pdf、xls等常见办公文档。发送文件消息之际,员工能够在企业微信客户端直接进行预览或者下载。对于大文件而言,建议在上传之前校验文件大小,防止因超出限度致使接口返回“media size too large”错误。
接收客户消息的接口设置
企业微信借助回调机制,把客户消息推送至开发者服务器,要在应用详情页设定“接收消息”的URL,此地址得是公网可访问的PHP脚本,企业微信会给该地址发送GET请求,用以验证URL有效性,验证时需对echostr参数进行解密并返回。
接收消息之际,企业微信借由POST方式来发送XML格式的数据包。PHP脚本凭仗file_get_contents('php://input')去获取原始数据,而后运用企业微信所提供的加解密库予以解密。解密之后获取到消息结构体,它内含消息类型、发送者、内容等字段。常见的消息类型存在文本、图片、语音、事件等,依据业务需求各自进行处理。处理完毕之后要返回success字符串,不然企业微信会重复性推送。
$url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$access_token";
$data = array(
"touser" => "接收消息的用户",
"msgtype" => "text",
"agentid" => "应用 AgentId",
"text" => array("content" => "这是一条测试消息")
);
$data = json_encode($data);
$options = array(
'http' => array(
'header' => "Content-type: application/json",
'method' => 'POST',
'content' => $data
)
);
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
代码封装与异常处理
于实际项目里头,提议把接口调用封装成单独的类。类含有获取Token、发送消息、上传素材等公共的方法,统一去处理cURL请求、错误日志记录以及重试机制。比如说发送消息失败之际,记录错误码跟错误信息到日志文件,方便排查问题。
想要进行异常处理,那就得格外留意接口限频以及网络超时这方面的情况。企业微信针对每个应用的接口调用,它是存在着频率限制的,一旦突发了高并发的状况,那么就得以增加延时这种方式,或者采用队列异步处理的办法来应对。网络超时时间呢,建议将其设置成为5至10秒,在超时之后要主动进行重试,具体重试2到3次。哪怕所碰到的是持续失败的请求,也能够发送告警通知,从而让管理员介入其中展开处理。
$url = "https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=$access_token&type=image";
$data = array(
"media" => new CURLFile(realpath("图片路径"))
);
$options = array(
'http' => array(
'header' => "Content-type: multipart/form-data",
'method' => 'POST',
'content' => $data
)
);
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
$data = json_decode($response, true);
$media_id = $data['media_id'];
$url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$access_token";
$data = array(
"touser" => "接收消息的用户",
"msgtype" => "image",
"agentid" => "应用 AgentId",
"image" => array("media_id" => $media_id)
);
$data = json_encode($data);
$options = array(
'http' => array(
'header' => "Content-type: application/json",
'method' => 'POST',
'content' => $data
)
);
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
当进行企业微信客服功能开发之际,你所遭遇的最为棘手的接口报错究竟是什么呢,欢迎于评论区去分享你的踩坑经历以及解决方案。
同类文章排行
- 三聚磷酸钠与减水剂、解胶王等产品的区别?
- 「亚马逊人脸识别噩梦」贝索斯将AI武器化遭大规模抗议
- 腾讯游戏营收比重连续两个季度下降,支付、云计算等业务营收涨3
- 星巴克的中年劫
- 三聚磷酸钠在陶瓷行业中的作用是什么?
- 工业三聚磷酸钠实验室鉴别假冒伪劣产品的方法?
- 传滴滴即将接入ofo,共享单车大战格局或生变
- 工业三聚磷酸钠在洗涤行业中的作用是什么?
- 获 3800 万元 A+ 轮投资,乐摇摇科技利用抓娃娃机做线
- 点击在线求助,应答的却都是机器人,这样真的好吗?




