企业微信API对接实战

需求描述

1、企业使用企业微信花名册,需要把相关数据对接回来公司的系统;

2、创建应用,实现消息发送(如验证码)、扫码登录等;

3、采购审批中关联外部选项,只能选择已经入库的供应商;(看我另一篇文章)

效果演示

1、根据员工企微 ID可以查询到花名册信息

不足:但是选项式的数据返回值是数字,需要进一步解构,我这里就暂时没做。

2、应用发送消息

企微后台相关设置

1、授权可以访问人事助手的应用

2、设置可信IP、域名、回调 URL

额外的知识点,这个应用是自创建的相关配置,已经配置的可以跳过

 我这里一共配置 4 个地方(如下图):

接收消息服务器配置

需要设置 URL、token 和 aeskey,后面两个参数我是随机生成的,注意保存,后端要用到。

设置可信域名

设置可信IP

授权回调域(花名册用不到)

后端代码部分(PHP)

1、接收消息服务器配置代码

先看文档:回调配置 - 接口文档 - 企业微信开发者中心

我是这么实现的:

2、Post请求接收业务数据

代码看上面POST 请求部分,主要几个步骤点:

  1. 接收url 参数;
  2. 获取原生的请求数据;
  3. 调用 sdk 的解密方法,拿到解密后的信息;
  4. 接收的格式是 xml,转一下数组(个人习惯,可以跳过);
  5. 写到日志里面!(调试用)
  6. 对接收到的数据做逻辑处理;
  7. 给个回调

3、花名册数据获取

下面是整个控制器的方法,比较啰嗦,看红字就好了

封装的方法看下面

    /**
     * 获取花名册字段对应信息
     * 参数:自创建的应用 id 和secret
     * 返回 array
     * 2024-6-2 By展鹏
     */
    public function huamingce_field($agentid,$secret){
        // 可能会多次调用,避免多次请求,存到缓存里面,有效时间 2 小时
        $arr = Cache::get('huamingce_field');
        // print_r($arr);exit;
        if(!$arr){
            $token = $this->getAppAccessToken($agentid,$secret);
            $url = "https://qyapi.weixin.qq.com/cgi-bin/hr/get_fields?access_token=".$token;
            $result = Http::sendRequest($url, [], 'GET');
            // print_r($result);exit;
            if ($result['ret']) {
                $msg = (array)json_decode($result['msg'], true);
                if (isset($msg['group_list'])) {
                    // return $msg['group_list'];
                    $arr = [];
                    foreach ($msg['group_list'] as $val){
                        if(is_array($val['field_list'])){
                            foreach ($val['field_list'] as $v){
                                $arr[$v['fieldid']] = $v['field_name'];
                            }
                        }else{
                            continue;
                        }
                    }
                    // return $arr;
                    if($arr == []) return false;
                    $arr = json_encode($arr);
                    Cache::set('huamingce_field',$arr,7200);
                }
            }
        }
        return (array)json_decode($arr);
    }
    
    /**
     * 获取员工花名册信息
     * 参数:用户企微 id、是否获取全部、自创建的应用 id 和secret
     * 返回 array
     * 2024-6-2 By展鹏
     */
    public function huamingce_get($userid,$all = 1,$agentid,$secret){
        $token = $this->getAppAccessToken($agentid,$secret);
        // $token = $this->getAccessToken();
        $params = [
            'userid' => $userid,
            'get_all' => $all,
        ];
        $url = "https://qyapi.weixin.qq.com/cgi-bin/hr/get_staff_info?access_token=".$token;
        $result = Http::sendRequest($url, json_encode($params), 'POST');
        if ($result['ret']) {
            $msg = (array)json_decode($result['msg'], true);
        // print_r($msg);exit;
            if ($msg['errmsg'] == 'ok') {
                return $msg['field_info'];
            }else{
                $errmsg = explode(",",$msg['errmsg']);
                switch ($errmsg[0]) {
                    case 'user not in app perm':
                        // code...
                        return "user not in app perm<br>请到企微后台设置权限";
                        break;
                    
                    default:
                        // code...
                        return $msg['errmsg'];
                        break;
                }
            }
        }
    }

前端代码部分(html)

1、花名册前端页面(tp5 模板引擎)

<table class="table table-striped">
    {if !empty($row)}
    <div class="alert alert-success">
           该信息来自企业微信花名册<br>
           同步时间:{$row.updatetime|htmlentities}
    </div>
    {/if}
    
    <!-- 企微信息-->
    <thead>
            <tr>
                <th>{:__('Title')}</th>
                <th>{:__('Content')}</th>
            </tr>
        </thead>
        <tbody>
            {volist name="result" id="vo"  }
            <tr>
                <td>{$key}</td>
                <td style="word-break: break-all;">{$vo|htmlentities}</td>
            </tr>
            {/volist}
            {if $Think.get.dialog}
            <tr>
                <td></td>
                <td>
                    <div class="input-group">
                        <!--<input name="callback" class="form-control" value="test" />-->
                        <span class="input-group-btn"><a href="javascript:;" class="btn btn-success update" >更新数据</a></span>
                    </div>
                </td>
            </tr>
            {/if}
        </tbody>
</table>
<div class="hide layer-footer">
    <label class="control-label col-xs-12 col-sm-2"></label>
    <div class="col-xs-12 col-sm-8">
        <button type="reset" class="btn btn-primary btn-embossed btn-close" onclick="Layer.closeAll();">{:__('Close')}</button>
    </div>
</div>

<script src="__CDN__/assets/libs/jquery/dist/jquery.min.js"></script>
<script>
    // 按钮:更新数据
    $('.update').click(()=>{
        layer.load(0)
        // if(isValidPhoneNumber(mobile)){
            $.ajax({
                url: 'wecom/staff/huamingce',
                type: 'PUT',
                data: {staffid:"<?php echo $row->staffid; ?>"},
                // headers,
                success: res=>{
                    if(res){
                        layer.closeAll('loading')
                    }
                    if(res.code == 1){
                        // resolve(res.data)
                        layer.msg(res.msg)
                        return true
                    }else if(res.code == 0){
                        layer.msg(res.msg, {icon: 7})
                        reject(res.data)
                    }
                },
                error: err=>{
                    layer.msg(err, {icon: 7})       //其他错误情况
                    reject(err)
                }
            })
        // }else{
        //     layer.msg('检查手机号');
        // }
    })
    
    // 手机号码校验
    function isValidPhoneNumber(phoneNumber) {
        return /^1\d{10}$/.test(phoneNumber);
    }
</script>

 不太擅长写文章,未完待补充,欢迎留言交流!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值