PHP对接企业微信

前言

最近在做项目中,要求在后台管理中有企业微信管理的相关功能。相关准备工作,需要准备好企业微信账号,添加自建应用,获得相应功能的权限,以及agentid、secre等。

参考文档:

企业微信开发文档

功能实现

因功能接口比较多,这里以"客户敏感词"为例,以下为"敏感词"管理功能实现。

1 想法思路

企业微信接口有请求次数限制,后台操作频繁,避免多次请求企业微信接口,也为了相应速度考虑,我这里考虑将输入进行入库处理。每次新建敏感词,企业微信"新增敏感词"接口请求成功后,将数据添加到数据库,编辑和删除同理。这样敏感词列表、查看敏感词就可以减少对企业微信接口的请求。

2 注意事项

(1)敏感词这里需要依赖通讯录中的成员和部门,因此需要先开发这两个模块之后,再进行敏感词功能开发(成员和部门也做了入库处理,所以在下面代码中,我也是直接查询数据库的内容);

(2)access_token 有三种:通讯录access_token、联系人access_token以及自建应用 access_token,要根据接口需要,看需要哪一种access_token,否则就会报错。敏感词这里使用的是自建应用 access_token。

(3)要记得添加IP白名单。

3 代码实现

InterceptController.php

php 复制代码
<?php
// +-----------------------xiaozhe-----------------------------------------------

namespace app\wework\controller;

use cmf\controller\AdminBaseController;
use app\wework\service\InterceptService;
use app\wework\service\WechatInterceptApi;
use app\wework\model\InterceptModel;
use app\wework\model\WeUserModel;
use app\admin\model\AdminMenuModel;

class InterceptController extends AdminBaseController
{
    
    // 敏感词列表
    public function index()
    {   
        // 接口请求敏感词列表
        // $wxinterceptApi = new WechatInterceptApi();
        // $list = $wxinterceptApi->getInterceptRuleList();
        // echo "<pre>";
        // print_r($list);
        // exit;
        $param = $this->request->param();
        $interceptService = new InterceptService();
        $data = $interceptService->getList($param);
        $data->appends($param);
        $this->assign('keyword', isset($param['keyword']) ? $param['keyword'] : '');
        $this->assign('lists', $data->items());
        $this->assign('page', $data->render());
        return $this->fetch();
    }


    // 新增敏感词
    public function add()
    {
        if ($this->request->isPost()) {
            $data = $this->request->param();
            $interceptModel = new InterceptModel();
            $data['create_time'] = time();
            $data['user_id'] = cmf_get_current_admin_id();
            $data['group_id'] = 0;
            if ($data['applicable_type'] == 2) {
                // 选择员工的话,是员工名
                $userModel = new WeUserModel();
                $userList = $userModel->whereIn('userid',$data['applicable_range'])->column("userid","department_id");
                $group_arr = array_unique(array_keys($userList));
                $applicable_range['user_list'] = implode(",",$userList);
                $applicable_range['department_list'] = implode(",",$group_arr);
                $data['applicable_range'] = json_encode($applicable_range,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
            } else {
                $userModel = new WeUserModel();
                $userList = $userModel->whereIn('department_id',$data['applicable_range'])->column("userid");
                $applicable_range['user_list'] = implode(",",$userList);
                $applicable_range['department_list'] = $data['applicable_range'];
                $data['applicable_range'] = json_encode($applicable_range,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
            }
            if (!empty($data['semantics_list'])) {
                $data['semantics_list'] = implode(",",$data['semantics_list']);
            }

            // 敏感词接口新增
            $user_list = !empty($applicable_range['user_list']) ? explode(",",$applicable_range['user_list']) : [];
            $department_list = explode(",",$applicable_range['department_list']);
            $wx_intercept = array(
                'rule_name' => $data['rule_name'],
                'word_list' => explode(",",$data['word_list']),
                'semantics_list' => explode(",",$data['semantics_list']),
                'intercept_type' => $data['intercept_type'],
                'applicable_range' => array(
                    'user_list' =>  $user_list,
                    'department_list' => $department_list
                )
            );
            
            $wxinterceptApi = new WechatInterceptApi();
            $res = $wxinterceptApi->addInterceptRule($wx_intercept);
            if ($res['errcode'] != 0) {
                $this->error($res['errmsg'], url("Intercept/index"));
            }

            $data['rule_id'] = $res['rule_id'];
            $result = $interceptModel->save($data);
            if ($result) {
                $this->success('添加成功!', url("Intercept/index"));
            } else {
                $this->error('添加失败!', url("Intercept/index"));
            }
        }
        return $this->fetch();
    }

    // 编辑敏感词
    public function edit()
    {
        if ($this->request->isPost()) {
            $data = $this->request->param();
            $id = $data['id'] ?? 0;
            unset($data['id']);
            if ($data['applicable_type'] == 2) {
                // 选择员工的话,是员工名
                $userModel = new WeUserModel();
                $userList = $userModel->whereIn('userid',$data['applicable_range'])->column("userid","department_id");
                $group_arr = array_unique(array_keys($userList));
                $applicable_range['user_list'] = implode(",",$userList);
                $applicable_range['department_list'] = implode(",",$group_arr);
                $data['applicable_range'] = json_encode($applicable_range,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
            } else {
                $userModel = new WeUserModel();
                $userList = $userModel->whereIn('department_id',$data['applicable_range'])->column("userid");
                $applicable_range['user_list'] = implode(",",$userList);
                $applicable_range['department_list'] = $data['applicable_range'];
                $data['applicable_range'] = json_encode($applicable_range,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
            }
            
            $update_info = $data;
            $interceptModel = new InterceptModel();
            // 敏感词接口编辑
            // 查询原来的数据
            $rule_info = $interceptModel->field("rule_id,applicable_range")->where("id",$id)->find();

            $old_add_applicable_range = json_decode($rule_info['applicable_range'],true);
            $old_user_list = !empty($old_add_applicable_range['user_list']) ? explode(",",$old_add_applicable_range['user_list']) : [];
            $old_department_list = !empty($old_add_applicable_range['department_list']) ? explode(",",$old_add_applicable_range['department_list']) : [];
           
            $user_list = !empty($applicable_range['user_list']) ? explode(",",$applicable_range['user_list']) : [];
            $department_list = explode(",",$applicable_range['department_list']);
           
            $wx_intercept = array(
                'rule_id' => $rule_info['rule_id'],
                'rule_name' => $update_info['rule_name'],
                'word_list' => explode(",",$update_info['word_list']),
                'extra_rule' => array(
                    'semantics_list' => $data['semantics_list'],
                ),
                'intercept_type' => $data['intercept_type'],
                'add_applicable_range' => array(
                    'user_list' =>  $user_list,
                    'department_list' => $department_list
                ),
                'remove_applicable_range' => array(
                    'user_list' => $old_user_list,
                    'department_list' => $old_department_list
                )
            );
            
            $wxinterceptApi = new WechatInterceptApi();
            $res = $wxinterceptApi->updateInterceptRule($wx_intercept);
           
            if ($res['errcode'] != 0) {
                $this->error($res['errmsg'], url("Intercept/index"));
            }

            if (!empty($update_info['semantics_list'])) {
                $update_info['semantics_list'] = implode(",",$update_info['semantics_list']);
            }

            $result = $interceptModel->where("id",$id)->update($update_info);

            if ($result) {
                $this->success('编辑成功!', url("Intercept/index"));
            } else {
                $this->error('编辑失败!', url("Intercept/index"));
            }
        }
        $id = $this->request->param('id', 0, 'intval');
        if (empty($id)) {
            $this->error('请求参数有误!');
        }
        // 查询敏感词信息
        $interceptService = new InterceptService();
        $info = $interceptService->getInfo($id);
        // 接口请求敏感词详情
        // $wxinterceptApi = new WechatInterceptApi();
        // $list = $wxinterceptApi->getInterceptRuleInfo(['rule_id'=>$info['rule_id']]);
        // echo "<pre>";
        // print_r($list);
        // exit;
        $this->assign('info',$info);
        return $this->fetch();
    }

    // 删除敏感词
    public function delete()
    {
        $param = $this->request->param();
        $interceptModel = new InterceptModel();
        if (isset($param['id'])) {
            $id = $this->request->param('id', 0, 'intval');
            $rule_info = $interceptModel->field("rule_id")->where("id",$id)->find();
            $wxinterceptApi = new WechatInterceptApi();
            $wx_res = $wxinterceptApi->deleteInterceptRule(['rule_id'=>$rule_info['rule_id']]);
            if ($wx_res['errcode'] == 0) {
                $result = $interceptModel->where('id', $id)->delete();
                $this->success("删除成功!");
            } else {
                $this->error("删除失败!");
            }
        }
    }

    public function checkWorker()
    {
        $param = $this->request->param();
        $applicable_type = $param['type'] ?? 1;
        $applicable_range = $param['value'] ?? "";
        $interceptService = new InterceptService();
        $result = $interceptService->getWorkerList($param);
        $this->assign('menus', $result);
        $this->assign('applicable_range', explode(",",$applicable_range));
        $this->assign('applicable_type',$applicable_type);
        return $this->fetch();
    }

}

InterceptService.php

php 复制代码
<?php
// +----------------------------------------------------------------------
// xiaozhe
// +----------------------------------------------------------------------
namespace app\wework\service;

use app\wework\model\InterceptModel;
use app\wework\model\DepartModel;
use app\wework\model\WeUserModel;
use think\db\Query;

class InterceptService
{
    public function getList($filter)
    {
        $field = 'a.id,a.rule_name,a.word_list,a.intercept_type,a.applicable_type,a.user_id,a.create_time,a.update_time,u.user_nickname';
        $interceptModel = new InterceptModel();
        $result = $interceptModel
            ->alias("a")
            ->leftJoin("user u","a.user_id = u.id")
            ->field($field)
            ->where(function (Query $query) use ($filter) {
                $keyword = empty($filter['keyword']) ? '' : $filter['keyword'];
                if (!empty($keyword)) {
                    $query->where('a.title', 'like', "%$keyword%");
                }
            })
            ->paginate(15);
        return $result;
    }

    public function getInfo($id)
    {
        $interceptModel = new InterceptModel();
        $info = $interceptModel->where("id",$id)->find();
        if (!empty($info['semantics_list'])) {
            $info['semantics_list'] = explode(",",$info['semantics_list']);
        }
        if (!empty($info['applicable_range'])) {
            $info['applicable_range'] = json_decode($info['applicable_range'],true);
            $info['user_count'] = count(explode(",",$info['applicable_range']['user_list']));
            $info['depart_count'] = count(explode(",",$info['applicable_range']['department_list']));
            if ($info['applicable_type'] == 1) {
                // 部门
                $info['applicable_range_value'] = $info['applicable_range']['department_list'];
            } else {
                // 员工
                $userModel = new WeUserModel();
                $userIds = $userModel->whereIn("userid",$info['applicable_range']['user_list'])->whereIn("department_id",$info['applicable_range']['department_list'])->column("userid");
                $info['applicable_range_value'] = implode(",",$userIds);
            }
        }
        return $info;
    }

    public function getWorkerList($filter)
    {
        $type = $filter['type'];
        switch ($type) {
            case 1:
                // 部门
                $departmentModel = new DepartModel();
                $newList = $departmentModel->field("department_id as id,name,parentid as parent_id")->select()->toArray();
                break;
            case 2:
                // 员工
                $userModel = new WeUserModel();
                $newList = $userModel->field("userid as id,name")->select()->toArray();
                break;
            default:
                // code...
                break;
        }
        return $newList;
    }
    

}

WechatInterceptApi.php

php 复制代码
<?php 
// +----------------------------------------------------------------------
// | xiaozhe
// +----------------------------------------------------------------------
namespace app\wework\service;
use app\wework\model\ConfigModel;
use think\Db;
/**
* 企业微信接口
**/
class WechatInterceptApi 
{
    /**
    * 获取通讯录access_token
    **/
    public  function getStaffAccessToken(){
            $cache_key = 'staff_access_token';
            $res = cache($cache_key);
            if(empty($res)){
                // 读取配置
                $WeworkConfigModel = new ConfigModel();
                $info = $WeworkConfigModel->where("id",1)->find();
                $response = cmf_curl_get("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$info['corpid']}&corpsecret={$info['user_secret']}");
                $arr = json_decode($response, true); 

                if($arr['errcode'] !== 0){
                    return '';
                }
                cache($cache_key, $arr['access_token'], 6900);
            }
            return $res;
    }
    /**
    * 获取客户联系人access_token
    **/
    static  public  function getCustomerAccessToken(){
            $cache_key = 'customer_access_token';
            $res = cache($cache_key);
            if(empty($res)){
                $WeworkConfigModel = new ConfigModel();
                $info = $WeworkConfigModel->where("id",1)->find();
                $response = cmf_curl_get("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$info['corpid']}&corpsecret={$info['customer_secret']}");
                $arr = json_decode($response, true); 

                if($arr['errcode'] !== 0){
                    return '';
                }
                cache($cache_key, $arr['access_token'], 6900);
            }
            return $res;
    }
    /**
    * 获取自建应用 access_token
    **/
    public  function getSelfappAccessToken(){
                $cache_key = 'selfapp_access_token';
                $res = cache($cache_key);
                if(empty($res)){
                    $WeworkConfigModel = new ConfigModel();
                    $info = $WeworkConfigModel->where("id",1)->find();
                    
                    $response = cmf_curl_get("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$info['corpid']}&corpsecret={$info['corpsecret']}");
                    $arr = json_decode($response, true); 
                   
                    if($arr['errcode'] !== 0){
                        return '';
                    }
                    cache($cache_key, $arr['access_token'], 6900);
                }
        return $res;
    }

    // 获取敏感词列表
    public function getInterceptRuleList()
    {
        $token = self::getSelfappAccessToken();
        $res = cmf_curl_get("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_intercept_rule_list?access_token=".$token,array());
        $resp_arr = json_decode($res, 1);
        return $resp_arr;
    }

    // 新增敏感词
    public function addInterceptRule($filter)
    {
        $token = self::getSelfappAccessToken();
        $res = self::curl_post("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_intercept_rule?access_token=".$token,
            json_encode($filter)
        );
        $resp_arr = json_decode($res, 1);
        return $resp_arr;
    }

    // 获取敏感词详情
    public function getInterceptRuleInfo($filter)
    {
        $token = self::getSelfappAccessToken();
        $res = self::curl_post("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_intercept_rule?access_token=".$token,
            json_encode($filter)
        );
        $resp_arr = json_decode($res, 1);
        return $resp_arr;
    }

    // 修改敏感词规则
    public function updateInterceptRule($filter)
    {
        $token = self::getSelfappAccessToken();
        $res = self::curl_post("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/update_intercept_rule?access_token=".$token,
            json_encode($filter)
        );
        $resp_arr = json_decode($res, 1);
        return $resp_arr;
    }

    // 删除敏感词
    public function deleteInterceptRule($filter)
    {
        $token = self::getSelfappAccessToken();
        $res = self::curl_post("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/del_intercept_rule?access_token=".$token,
            json_encode($filter)
        );
        $resp_arr = json_decode($res, 1);
        return $resp_arr;
    }

   public function curl_post($url,$data){
        $curl = curl_init(); // 启动一个CURL会话
        curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); // 从证书中检查SSL加密算法是否存在
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
        curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
        curl_setopt($curl, CURLOPT_POSTFIELDS,$data); // Post提交的数据包
        curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
        curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
        $result = curl_exec($curl); // 执行操作
        return $result;
    }
}

(前端代码我就不放了哈,自行写一哈)

实现效果

敏感词列表

新增敏感词

编辑敏感词

相关推荐
马剑威(威哥爱编程)6 天前
Java如何实现企业微信审批流程
java·开发语言·企业微信
假装我不帅6 天前
spreadjs实现类似于企业微信的协同提示
前端·javascript·企业微信·协同·spreadjs
LinDon_10 天前
【企业微信新版sdk】
企业微信
说私域12 天前
基于企业微信与开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序的客户运营模型优化研究
人工智能·开源·企业微信
奇怪的点13 天前
ubuntu 安装 企业微信
linux·ubuntu·企业微信
晚睡要秃头15 天前
通过微信小程序实现对接企业微信客服
javascript·微信小程序·vue·企业微信·uniapp
浮尘笔记21 天前
Go语言Gin框架调用企业微信接口根据手机号获取userid
golang·企业微信·gin
appearappear1 个月前
企业微信审批-回调,开发测试环境共用一个回调
企业微信
一如既往の2 个月前
【企业微信】群机器人自动消息配置
数据库·机器人·企业微信
bjshinegood2 个月前
企业微信AI社群助手:赋能企业私域运营的新引擎
人工智能·企业微信