123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- <?php namespace App\Http\Controllers\Api;
- use App\Facades\Servers\WechatMini\Mini;
- use App\Http\Controllers\Api\Api;
- use App\Models\Work\State as WorkState;
- use App\Models\Work\External as WorkExternal;
- use App\Facades\Servers\WechatWork\CorpTag as CorpTag;
- use App\Facades\Servers\WechatWork\ExternalContact as ExternalContact;
- use App\Models\Work\Tag as WorkTag;
- use App\Models\Work\User as WorkUser;
- use EasyWeChat\Factory;
- use Vinkla\Hashids\Facades\Hashids;
- /**
- * 企业微信微信接口
- *
- * @author 刘相欣
- *
- * */
- class WechatWork extends Api{
-
- /**
- * 消息推送 /api/workwechat/notify
- *
- * @param string $code 授权码
- *
- * */
- public function notify(){
- // 获取配置
- $app = Factory::work(config('wechat.work'));
- // 接收消息通知
- $app->server->push(function($message) {
- // $message = json_decode('{"ToUserName":"wwcdbc686326b51a89","FromUserName":"sys","CreateTime":"1727420114","MsgType":"event","Event":"change_external_contact","ChangeType":"add_external_contact","UserID":"LiangYan","ExternalUserID":"wmnltlDwAAcHuNEggrIxLtb-Buzk0KkQ","State":"state_id=9","WelcomeCode":"G2OYXUVxNyu3YOb3-oELMOCX1XSLWoeeGjl_HOw7k1E"}',true);
- try {
- // 处理结果
- $result = [];
- // 外部联系人变动
- if( $message['Event'] == 'change_external_contact' ) {
- // 添加企业客户事件,// 注册用户
- if( $message['ChangeType'] == 'add_external_contact' ) $result = $this->addExternal($message);
- // 编辑企业客户事件
- if( $message['ChangeType'] == 'edit_external_contact' ) $result = $this->editExternal($message);
- // 删除企业客户事件
- if( $message['ChangeType'] == 'del_external_contact' ) $result = $this->delExternal($message);
- // 删除跟进成员事件
- if( $message['ChangeType'] == 'del_follow_user' ) $result = $this->delFollow($message);
- }
- // 错误
- if( isset($result['error']) ) return json_send(['code'=>'work_notify','msg'=>$result['error'],'data'=>$message]);
- // 成功
- return json_send(['code'=>'success','msg'=>'notify','data'=>$message]);
- } catch (\Throwable $th) {
- // 成功
- return json_send(['code'=>'error','msg'=>'notify','data'=>['message'=>$message,'msg'=>$th->getMessage()]]);
- }
- });
- $response = $app->server->serve();
- $response->send();
- }
- /**
- * 添加企业客户事件
- *
- */
- public function addExternal($message){
- // 实例
- $WorkExternal = New WorkExternal;
- $WorkState = new WorkState;
- $WorkUser = New WorkUser;
- $WorkTag = New Worktag;
- // 通过state获取附加参数以判断用户类型
- parse_str($message['State'],$state);
- // 获取附加参数
- $state = empty($state['state_id']) ? [] : $WorkState->getOne($state['state_id']);
- // 存在客户标签,给客户增加标签
- if( !empty($state['tags']) ) CorpTag::markTags($message['UserID'], $message['ExternalUserID'],explode(',',$state['tags']));
- // 获取客户详情
- $extUser = ExternalContact::getOne($message['ExternalUserID']);
- // 如果没有获取到数据的话
- if( !$extUser ) return ['error'=>'企微ID不存在'];
- // 如果存在用户类型,且有外部联系人信息
- if( !empty($state['user_type']) && !empty($extUser['external_contact']) ) $extUser['external_contact']['user_type'] = $state['user_type'];
- // 判断企微用户是否存在
- $external = $WorkExternal->getOneByExtUserId($message['ExternalUserID']);
- // 更新或者新增客户
- $id = $external ? $external['id'] : $WorkExternal->workAdd($extUser['external_contact']);
- // 如果添加失败
- if( !$id ) return ['error'=>'新用户添加失败'];
- // 跳转链接
- $link = Mini::getUrlLink('pages/bind/user',http_build_query(['kailin_uid'=>Hashids::encodeHex($id),'work_userid'=>$message['UserID']]));
- // 欢迎语
- $welcome = $link ? ['link'=>['title'=>'请点此填写表单','desc'=>'填写表单信息为了给您提供更优服务','url'=>$link]] : ['text'=>['content'=>'请联系您的对接人员为您录入信息']];
- // 发送欢迎语
- ExternalContact::sendWelcome($message['WelcomeCode'],$welcome);
- // 循环跟进人员
- foreach ($extUser['follow_user'] as $workUser) {
- // 如果是当前的跟进人员
- if( $workUser['userid'] == $message['UserID'] ) {
- // 处理跟进关系
- $WorkUser = $WorkUser->upsertOne($extUser['external_contact'],$workUser);
- // 处理标签
- if( $workUser['tags'] ) $WorkTag->upsertTags($message['UserID'],$message['ExternalUserID'],$workUser['tags']);
- }
- }
- // 结果
- return ['success'=>'处理完成'];
- }
- /**
- * 编辑企业客户事件
- *
- */
- public function editExternal($message){
- // 实例
- $WorkExternal = New WorkExternal;
- $WorkUser = New WorkUser;
- $WorkTag = New WorkTag;
- // 获取客户详情
- $extUser = ExternalContact::getOne($message['ExternalUserID']);
- // 如果没有获取到数据的话
- if( !$extUser ) return ['error'=>'企微ID不存在'];
- // 判断用户是否已经存在
- $external = $WorkExternal->getOneByExtUserId($message['ExternalUserID']);
- // 如果更新或者新增客户
- $id = $external ? $external['id'] : $WorkExternal->workAdd($extUser['external_contact']);
- // 如果添加失败
- if( !$id ) return ['error'=>'客户信息更新失败'];
- // 循环跟进人员
- foreach ($extUser['follow_user'] as $workUser) {
- // 如果是当前的跟进人员
- if( $workUser['userid'] == $message['UserID'] ){
- // 处理跟进关系
- $WorkUser = $WorkUser->upsertOne($extUser['external_contact'],$workUser);
- // 处理标签
- $WorkTag->upsertTags($message['UserID'],$message['ExternalUserID'],$workUser['tags']);
- }
- }
- // 返回结果
- return ['success'=>'处理完成'];
- }
- /**
- * 删除企业客户事件
- *
- */
- public function delExternal($message){
- // 实例
- $WorkUser = New WorkUser;
- $WorkTag = New WorkTag;
- // 获取客户详情
- $extUser = ExternalContact::getOne($message['ExternalUserID']);
- // 如果没有获取到数据的话
- if( !$extUser ) return ['error'=>'企微ID不存在'];
- // 删除跟进人员信息
- $WorkUser->delByExtUser($message['ExternalUserID'],$message['UserID']);
- // 删除跟进人员标签
- $WorkTag->delByExtUser($message['ExternalUserID'],$message['UserID']);
- // 返回结果
- return ['success'=>'处理完成'];
- }
- /**
- * 客户删除跟进人员事件
- *
- */
- public function delFollow($message){
- // 实例
- $WorkExternal = New WorkExternal;
- $WorkUser = New WorkUser;
- // 获取客户详情
- $extUser = ExternalContact::getOne($message['ExternalUserID']);
- // 如果没有获取到数据的话
- if( !$extUser ) return ['error'=>'企微ID不存在'];
- // 判断用户是否已经存在
- $external = $WorkExternal->getOneByExtUserId($message['ExternalUserID']);
- // 如果有用户的话
- if( !$external ) return ['success'=>'用户不存在无需处理'];
- // 如果更新或者新增客户
- $id = $external ? $external['id'] : $WorkExternal->workAdd($extUser['external_contact']);
- // 如果添加失败
- if( !$id ) return ['error'=>'客户信息更新失败'];
- // 返回结果
- $result = $WorkUser->updateByExtUser($message['ExternalUserID'],$message['UserID'],['status'=>2]);
- // 如果添加失败
- if( !$result ) return ['error'=>'状态变更失败'];
- // 返回结果
- return ['success'=>'处理完成'];
- }
- }
|