需求描述
1、企业使用企业微信花名册,需要把相关数据对接回来公司的系统;
2、创建应用,实现消息发送(如验证码)、扫码登录等;
3、采购审批中关联外部选项,只能选择已经入库的供应商;(看我另一篇文章)
效果演示
1、根据员工企微 ID可以查询到花名册信息
不足:但是选项式的数据返回值是数字,需要进一步解构,我这里就暂时没做。
2、应用发送消息
企微后台相关设置
1、授权可以访问人事助手的应用
2、设置可信IP、域名、回调 URL
额外的知识点,这个应用是自创建的相关配置,已经配置的可以跳过
我这里一共配置 4 个地方(如下图):
接收消息服务器配置
需要设置 URL、token 和 aeskey,后面两个参数我是随机生成的,注意保存,后端要用到。
设置可信域名
设置可信IP
授权回调域(花名册用不到)
后端代码部分(PHP)
1、接收消息服务器配置代码
我是这么实现的:
2、Post请求接收业务数据
代码看上面POST 请求部分,主要几个步骤点:
- 接收url 参数;
- 获取原生的请求数据;
- 调用 sdk 的解密方法,拿到解密后的信息;
- 接收的格式是 xml,转一下数组(个人习惯,可以跳过);
- 写到日志里面!(调试用)
- 对接收到的数据做逻辑处理;
- 给个回调
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>
不太擅长写文章,未完待补充,欢迎留言交流!!!