PHP实现企业微信会话内容存档功能
一、前言
企业微信会话内容存档介绍:为保障客户服务质量、提高内部协作效率和监管合规等原因,企业微信提供会话内容存档功能。企业可以统一设置存档的员工范围,并通过API获取开启存档员工的工作沟通内容,满足企业的外部监管合规和内部管理需求。(官方内容,复制粘贴过来的)
官方没有PHP SDK,一直都没有,估计是不可能去开发了。目前PHP开发者都是通过PHP扩展方面去实现功能,这里主要介绍一下 柴神 csdn作者,内容对本次开发起到了关键性指导。
二、准备内容
1、企业微信的企业id,例如:wwd08c8eaaaa5ab44d,可以在企业微信管理端--我的企业--企业信息查看
2、Secret,例如:pmJKLSD238SKJL3JKLS12XzQmnau-KwLVLEg2342jslkWWJxv9f_k,聊天内容存档的Secret,可以在企业微信管理端--管理工具--聊天内容存档查看
以上两项参数仅供演示,均为虚假数据。
3、服务器IP地址,需要在企业微信管理后台设置白名单。例如:39.6.12.3
4、公钥、私钥。可通过在线工具直接获取,后续会详细介绍
5、SDK下载,下载地址:https://developer.work.weixin.qq.com/document/path/91774,下载最新版本的
扩展包下载,下载地址:https://github.com/pangdahua/php7-wxwork-finance-sdk,将文件克隆或者zip下载到电脑中
6、宝塔面板必须是 编译安装的PHP
三、公钥、私钥获取
在线工具地址:http://web.chacuo.net/netrsakeypair,选择2048位,官方要求的
encrypt_random_key是使用企业在管理端填写的公钥(使用模值为2048bit的秘钥),采用RSA加密算法进行加密处理后base64 encode的内容,加密内容为企业微信产生。RSA使用PKCS1。
如下图,直接将生成的内容保存到记事本中!!!!
四、部署扩展
1、将刚刚下载的两个压缩包解压,选择企业微信提供的SDK,进入C_sdk目录,将GIthub下载的文件包解压,将全部文件拷贝到C_sdk目录中。如下图:
将C_sdk文件夹压缩,并上传到服务器,宝塔面板示例位置/www/wwwroot/C_sdk,能找到路径就可以。
2、编译安装
进入服务器,命令行模式,查找phpize位置。可以使用命令:
find / -name phpize
phpize示例位置:/www/server/php/70/bin/phpize,执行如下命令:
./configure --with-php-config=/www/server/php/70/bin/phpize/php-config --with-wxwork-finance-sdk=./
注意替换PHPize的路径
进行代码编译,命令:
make make test make install
此处可能涉及到禁用函数问题,如果遇到请解除禁用,PHP8版本arginfo不再是可选。
在对应版本的PHP中,找到php.ini文件,编辑在尾部 增加 extension=wxwork_finance_sdk.so,保存。
重启php-fpm、Nginx,不然扩展不生效。
检验扩展,使用php -m命令查看,出现wxwork_finance_sdk,表示安装成功。
五、代码
<?php try { $obj = new WxworkFinanceSdk("wwee78***********", "pmd8************"); // 私钥地址 $privateKey = '-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDD6oBGld+kI5a4 lc4gF5T+ApjinEHkQAPy1x6tRBXA6FQ5gC9HDeKXlKkhI9Y8SfxNTPEtjnkLRWRQ tcXB6iiwej0aczNnpbUbfoTvv3etMEktQACG9nFeikX9p6qhloueXrcn2LEx7jM0 yatInnTqhocbaLt559rzz09HIaGy6W2ZjqwWPjwOuj/QqHsAwLSOWq6ePl18AaNC qN9+6eXYjpCkqZ424QpbLtOZJdhsTz8QTS43JhO5OPZMp5C+ZY1h9i1NEMKHnJWo jthm7/sRalwKS4OZbdgU9yq8ogaBeWHnR0GJyVKXjkoHXJhgyPCXzc+yHJ/slFpt 9ru3Sxg1AgMBA*************************************************** ********************* 演示数据 ******* ************************************ -----END PRIVATE KEY-----'; $chats = json_decode($obj->getChatData(0, 20), true); foreach ($chats['chatdata'] as $val) { $message = msg($val['encrypt_random_key'], $privateKey, $obj, $val['encrypt_chat_msg']); var_dump($message); } } catch (\WxworkFinanceSdkException $e) { var_dump("请求异常"); var_dump($e->getCode()); var_dump($e->getMessage()); } /** * * @param $encrypt_random_key * @param $privateKey * @param $obj * @param $encrypt_chat_msg * @return void * @author shenlin * @time 2022/7/21 0021 9:04 * @phone 13614048679 */ function msg($encrypt_random_key, $privateKey, $obj, $encrypt_chat_msg) { $decryptRandKey = null; openssl_private_decrypt(base64_decode($encrypt_random_key), $decryptRandKey, $privateKey, OPENSSL_PKCS1_PADDING); $t = $obj->decryptData($decryptRandKey, $encrypt_chat_msg); return json_decode($t, true); }
参考示例
六、注意事项
1、企业微信后台会话存档设置公钥的时候有版本号,请注意对应的消息私钥版本需要使用对应的公钥版本去解密,版本对不上无法解密。msg方法中可能出现报错情况,建议使用try catch规避,或者在消息解密是判断版本号。
2、必须使用编辑安装的PHP安装扩展。如果不是可以新编辑安装一个版本哈
3、消息拉取,请仔细查看官方文档内容。解密后的内容涉及到消息类型。请注意。