find(); $single_config['corp_id'] = $config['corp_id']; $single_config['agent_id'] = $config['agent_id']; $single_config['secret'] = $config['agent_secret']; /*$single_config['token'] = $config['receive_token']; $single_config['aes_key'] = $config['receive_aes_key'];*/ $app = Factory::work($single_config); $redirectUrl = request()->domain() . '/weworksingle.html#/signLogin'; //$redirectUrl = input('redirectUrl', '', 'trim'); $app->oauth->redirect($redirectUrl); $link = $app->oauth->getAuthUrl(); return json(['code' => self::success, 'data' => $link, 'msg' => '获取成功']); } /** * 根据授权code换取用户信息,查询到信息则返回token,没有则返回对应的状态节点信息。 * 返回码 -1、未绑定企业 0、正常 2、跳转到手机号登录页 3、跳转到选择企业页面,选择完之后再去登录 4、选择企业页面,选择完直接进入系统(弃用,不安全,默认进入最近进入的账号) * @return \think\response\Json * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function getUserByCode(){ $code = input('code', '', 'trim'); $ticket = input('ticket', '', 'trim'); $config = WeworksingleCompanySetting::where('ticket', '=', $ticket)->find(); $single_config['corp_id'] = $config['corp_id']; $single_config['agent_id'] = $config['agent_id']; $single_config['secret'] = $config['agent_secret']; $single_config['token'] = $config['receive_token']; $single_config['aes_key'] = $config['receive_aes_key']; $app = Factory::work($single_config); $user = $app->oauth->detailed()->userFromCode($code); //return json(['code'=> self::error_msg, 'msg'=> '获取授权信息失败', 'data'=> '']); // 获取用户信息 $userid = $user->getId(); // 对应企业微信英文名(userid) $info = $user->getRaw(); // 获取企业微信接口返回的原始信息 $where[] = ['userid', '=', $userid]; $company_ids = WeworksingleCompanySetting::where('ticket', '=', $ticket)->column('company_id'); if (empty($company_ids)){ return json(['code'=> -1, 'msg'=> '未绑定企业', 'data'=> []]); } $where[] = ['company_id', 'in', $company_ids]; $users = WeworksingleUser::where($where)->select()->toArray(); $wx_uid = 0; $company_id = 0; //能直接登录的企业 if (empty($users)) { // 查询有已创建的用户信息,但是未绑定所在店面的企业微信用户数据 $wx_result = WeworksingleUser::where([['userid', '=', $userid], ['company_id', '=', 0]])->findOrEmpty(); if ($wx_result->isEmpty()) { $info['company_id'] = 0; $info['name'] = !empty($info['name']) ? $info['name'] : ''; $info['mobile'] = !empty($info['mobile']) ? $info['mobile'] : ''; $info['department'] = !empty($info['department']) ? implode(',', $info['department']) : ''; $info['order_department'] = !empty($info['order']) ? implode(',', $info['order']) : ''; $info['position'] = !empty($info['position']) ? $info['position'] : ''; $info['gender'] = !empty($info['gender']) ? $info['gender'] : ''; $info['email'] = !empty($info['email']) ? $info['email'] : ''; $info['biz_mail'] = !empty($info['biz_mail']) ? $info['biz_mail'] : ''; $info['is_leader_in_dept'] = !empty($info['is_leader_in_dept']) ? implode(',', $info['is_leader_in_dept']) : ''; $info['direct_leader'] = !empty($info['direct_leader']) ? implode(',', $info['direct_leader']) : ''; $info['avatar'] = !empty($info['avatar']) ? $info['avatar'] : ''; $info['thumb_avatar'] = !empty($info['thumb_avatar']) ? $info['thumb_avatar'] : ''; $info['telephone'] = !empty($info['telephone']) ? $info['telephone'] : ''; $info['alias'] = !empty($info['alias']) ? $info['alias'] : ''; $info['extattr'] = !empty($info['extattr']) ? json_encode($info['extattr']) : ''; $info['status'] = !empty($info['status']) ? $info['status'] : ''; $info['qr_code'] = !empty($info['qr_code']) ? $info['qr_code'] : ''; $info['external_profile'] = !empty($info['external_profile']) ? json_encode($info['external_profile']) : ''; $info['external_position'] = !empty($info['external_position']) ? $info['external_position'] : ''; $info['address'] = !empty($info['address']) ? $info['address'] : ''; $info['open_userid'] = !empty($info['open_userid']) ? $info['open_userid'] : ''; $info['main_department'] = !empty($info['main_department']) ? $info['main_department'] : ''; $info['chat_record'] = 0; $wx_result = WeworksingleUser::create($info); $wx_uid = $wx_result->id; } else { $wx_uid = $wx_result->id; } if (count($company_ids) > 1) { return json(['code'=> 3, 'msg'=> '请选择要进入的企业', 'data'=> ['wx_uid'=> $wx_uid]]); } else { $wx_result->company_id = $company_ids[0]; $wx_result->save(); return json(['code'=> 2, 'msg'=> '请先登录', 'data'=> ['wx_uid'=> $wx_uid, 'company_id'=> $company_ids[0]]]); } } else { $bind_count = 0; //判断这多个用户信息绑定了几家店面 $weworksingle_uid = array_column($users, 'id'); $bind_employee = Employee::where([['weworksingle_uid', 'in', $weworksingle_uid], ['state', '=', '在职']])->order('updatetime desc')->select(); $bind_count = $bind_employee->count(); if ($bind_count > 0){ //多店面账号 和 单一账号都默认最近登录的账号进入 // 找最近登录的账号默认进入 $wx_uid = $bind_employee[0]['weworksingle_uid']; foreach ($users as $u) { if ($u['id'] == $wx_uid){ $company_id = $u['company_id']; } } } else { //没有有效用户,去登陆 离职、审核中、企业微信没绑定 这些用户 $wx_uid = implode(',', array_column($users, 'id')); if (count($company_ids) > 1) { return json(['code'=> 3, 'msg'=> '请选择要进入的企业', 'data'=> ['wx_uid'=> $wx_uid]]); } else {// 企业微信没绑定 return json(['code'=> 2, 'msg'=> '请先登录', 'data'=> ['wx_uid'=> $wx_uid, 'company_id'=> $company_ids[0]]]); } } } // 先判断公司账号情况 $company = Company::where(['id'=> $company_id])->find(); if ($company['status'] == 1) { return json(['code' => 2, 'msg' => '集团账号被禁用,请联系管理员', 'data'=> ['wx_uid'=> $wx_uid, 'company_id'=> $company_id]]); } elseif ($company['end_date'] . ' 23:59:59' < date('Y-m-d H:i:s', time())) { return json(['code' => 2, 'msg' => '集团账号已过期,请联系管理员', 'data'=> ['wx_uid'=> $wx_uid, 'company_id'=> $company_id]]); } // 查询是否有绑定员工 $employee = Employee::where('weworksingle_uid', '=', $wx_uid)->find(); $employee->save(['updatetime' => date('Y-m-d H:i:s')]); // 查询到员工,返回token $token = [ 'root_org' => $employee['root_id'], 'isEmployee' => true, 'uid' => $employee['uid'], 'employee_id'=> $employee['id'], 'org_id' => $employee['org_id'], 'isManager' => $employee['is_manager'] ]; $logic = new UserLogic(); $user = $logic->getInfo([['id', '=', $employee['uid']]], ['id', 'nickname', 'headimgurl', 'sex', 'subscribe', 'phone']); $company = Company::where('root_id', $employee['root_id'])->find(); $company['client_type'] = Miniprogram::where('root_id', '=', $employee['root_id'])->value('notify'); $token['client_type'] = $company['client_type']; // 查询是设计部门还是销售部门 $orgType = Org::where('id', $employee->org_id)->value('org_type'); $token['org_type'] = $orgType; // 信息加密 $data = http_build_query($token); $aes = new Aes(config('app.jwt_key')); $key = $aes->encrypt($data); // token数据设置 $payload = array( "iss" => "https://" . request()->domain(), "aud" => 'mini', "iat" => time(), "nbf" => time(), "data" => $key ); // 自定义登陆状态 $token = JWT::encode($payload, config('app.jwt_key')); $returnData = ['code' => self::success, 'token' => $token, 'user' => $user, 'company' =>$company->company_name, 'company_data'=>$company]; return json($returnData); } /** * 根据ticket获取绑定的企业列表 */ public function getCompanyByTicket(){ $ticket = input('ticket', '', 'trim'); $company_ids = WeworksingleCompanySetting::where('ticket', '=', $ticket)->column('company_id'); $companyList = Company::where([['id', 'in', $company_ids]])->field('id,company_name,logo,status,end_date')->select()->toArray(); foreach ($companyList as $k => $v) { if ($v['status'] == 1 || $v['end_date'] < date('Y-m-d')) { unset($companyList[$k]); } } return json(['code' => 0, 'data' => array_values($companyList)]); } /** * 获取手机验证码 */ public function sms($phone) { $content = '验证码:%code%(请勿转告他人),有效时间15分钟,请尽快完成验证'; $smsLogic = new SmsLogic(); $rs = $smsLogic->sendSms($phone, 'employee_login_phone', $content); if (!$rs) return json(['code' => 1, 'msg' => '短信发送失败']); return json(['code' => 0, 'msg' => '短信发送成功']); } /** * 手机号验证码登陆 */ public function phone_login($phone) { $aec = new Aec(config('app.aec_key'), config('app.aec_iv')); $phone = $aec->encrypt($phone); $wx_uid = input('wx_uid', '', 'trim'); $company_id = input('company_id', '', 'intval'); $wx_user = WeworksingleUser::where([['id', 'in', $wx_uid], ['company_id', '=', $company_id]])->findOrEmpty(); if ($wx_user->isEmpty()) { // 首次绑定 $wx_user = WeworksingleUser::where([['id', 'in', $wx_uid], ['company_id', '=', 0]])->findOrEmpty(); if ($wx_user->isEmpty()){ return json(['code' => self::error_msg, 'msg' => '账号异常']); } else { $wx_user->company_id = $company_id; $wx_user->save(); } } $company = Company::where(['id'=> $company_id])->find(); if ($company['status'] == 1) { return json(['code' => self::error_msg, 'msg' => '账号被禁用,请联系管理员']); } elseif ($company['end_date'] . ' 23:59:59' < date('Y-m-d H:i:s', time())) { return json(['code' => self::error_msg, 'msg' => '账号已过期,请联系管理员']); } $employee = Employee::where([['phone', '=', $phone], ['root_id', '=', $company['root_id']], ['state', '=', '在职'], ['uid', '>', 0]])->find(); if (empty($employee)) return json(['code' => self::error_msg, 'msg' => '未查询到此账号']); $employee->weworksingle_uid = $wx_user->id; // 关联企业微信用户信息到系统用户 $employee->updatetime = date('Y-m-d H:i:s'); $employee->save(); // 查询到员工,返回token $token = [ 'root_org' => $employee['root_id'], 'isEmployee' => true, 'uid' => $employee['uid'], 'employee_id'=> $employee['id'], 'org_id' => $employee['org_id'], 'isManager' => $employee['is_manager'] ]; $logic = new UserLogic(); $user = $logic->getInfo([['id', '=', $employee['uid']]], ['id', 'nickname', 'headimgurl', 'sex', 'subscribe', 'phone']); $company = Company::where('root_id', $employee['root_id'])->find(); $company['client_type'] = Miniprogram::where('root_id', '=', $employee['root_id'])->value('notify'); $token['client_type'] = $company['client_type']; // 查询是设计部门还是销售部门 $orgType = Org::where('id', $employee->org_id)->value('org_type'); $token['org_type'] = $orgType; // 信息加密 $data = http_build_query($token); $aes = new Aes(config('app.jwt_key')); $key = $aes->encrypt($data); // token数据设置 $payload = array( "iss" => "https://" . request()->domain(), "aud" => 'mini', "iat" => time(), "nbf" => time(), "data" => $key ); // 自定义登陆状态 $token = JWT::encode($payload, config('app.jwt_key')); $returnData = ['code' => self::success, 'token' => $token, 'user' => $user, 'company' =>$company->company_name, 'company_data'=>$company]; return json($returnData); } public function company() { $ticket = input('ticket', '', 'trim'); if (empty($ticket)) { return json(['code' => 0, 'data' => []]); } $token = $this->request->token; // 用token中的openid获取用户的uid列表 $uidList = User::where(['mini_openid' => $token['openid']])->column('id'); $employees = Employee::where([['uid', 'in', $uidList], ['state', '=', '在职']])->column('root_id, is_manager, org_id', 'root_id'); $orgs = Org::where([['id', 'in', array_column($employees, 'org_id')]])->column('id,name', 'id'); $notifyList = Miniprogram::where([['root_id', 'in', array_column($employees, 'root_id')]])->column('root_id,notify', 'root_id'); $company_ids = WeworksingleCompanySetting::where('ticket', '=', $ticket)->column('company_id'); $companyList = Company::with(['brand'])->where([['root_id', 'in', array_column($employees, 'root_id')], ['id', 'in', $company_ids]])->select()->visible(['company_name', 'root_id','status','end_date'])->toArray(); foreach ($companyList as &$item) { $item['client_type'] = isset($notifyList[$item['root_id']]) ? $notifyList[$item['root_id']]['notify'] : ''; $item['is_manager'] = isset($employees[$item['root_id']]) ? $employees[$item['root_id']]['is_manager'] : 0; $item['org_name'] = (isset($employees[$item['root_id']]) && isset($orgs[$employees[$item['root_id']]['org_id']])) ? $orgs[$employees[$item['root_id']]['org_id']]['name'] : ''; if ($item['status']==1) { $item['off'] = 1; $item['off_remark'] = '账号被禁用'; }elseif ($item['end_date'] self::success, 'data' => $companyList]); } /** * 切换店面 */ public function changeCompany(){ $company_id = input('company_id', '', 'intval'); $company_info = Company::where('id', $company_id)->find(); if ($company_info['end_date'] < date('Y-m-d') || $company_info['status'] == 1) { //账号过期或关闭 return json(['code'=> self::error_msg, 'msg'=> '店面账号异常']); } $token = $this->request->token; $wx_uid = Employee::where('id', '=', $token['employee_id'])->value('weworksingle_uid'); $wx_user = WeworksingleUser::where('id', '=', $wx_uid)->findOrEmpty(); if ($wx_user->isEmpty()) { return json(['code'=> self::error_msg, 'msg'=> '操作失败']); } $old_user = User::where('id', '=', $token['uid'])->find(); // 选择的企业 $company_root = Company::where('id', '=', $company_id)->value('root_id'); $uidList = User::where([['mini_openid', '=', $old_user['mini_openid']], ['root_id', '=', $company_root]])->column('id'); if (count($uidList) == 0) { $employee = null; } else { $condition = [['uid', 'in', $uidList], ['state', 'in', ['在职']]]; $employee = Employee::where($condition)->order('updatetime desc')->find(); } if (empty($employee)) { return json(['code'=> self::error_msg, 'msg'=> '操作失败', 'data'=> []]); } else { $employee->updatetime = date('Y-m-d H:i:s'); $employee->save(); } //企业微信用户表信息copy $company_user = WeworksingleUser::where([['userid', '=', $wx_user['userid']], ['company_id', '=', $company_id]])->findOrEmpty(); if ($company_user->isEmpty()){ $data = $wx_user; unset($data['id']); $data['company_id'] = $company_id; WeworksingleUser::create($data); } $user = User::where('id', '=', $employee['uid'])->find(); $miniType = Miniprogram::where('root_id', '=', $employee['root_id'])->value('notify'); // 初始token $token = [ 'client_type' => $miniType, 'root_org' => $employee['root_id'], 'isEmployee' => true, 'uid' => $employee['uid'], 'employee_id'=> $employee['id'], 'org_id' => $employee['org_id'], 'isManager' => $employee['is_manager'] ]; // 查询是设计部门还是销售部门 $orgType = Org::where('id', $employee->org_id)->value('org_type'); $token['org_type'] = $orgType; $user->updatetime = date('Y-m-d H:i:s'); $user->save(); $logic = new UserLogic(); $user = $logic->getInfo([['id', '=', $employee['uid']]], ['id', 'nickname', 'headimgurl', 'sex', 'subscribe', 'phone']); $company = Company::where('root_id', $employee['root_id'])->find(); $company['client_type'] = $miniType; // 信息加密 $data = http_build_query($token); $aes = new Aes(config('app.jwt_key')); $key = $aes->encrypt($data); // token数据设置 $payload = array( "iss" => "https://" . request()->domain(), "aud" => 'mini', "iat" => time(), "nbf" => time(), "data" => $key ); // 自定义登陆状态 $token = JWT::encode($payload, config('app.jwt_key')); $returnData = ['code' => self::success, 'token' => $token, 'user' => $user, 'company' =>$company->company_name, 'company_data'=>$company]; return json($returnData); } /** * 企业微信和员工账号解绑 */ public function unbind(){ $token = $this->request->token; $employee = Employee::where('id', '=', $token['employee_id'])->find(); $employee->weworksingle_uid = ''; $result = $employee->save(); if ($result){ return json(['code'=> self::success, 'msg'=> '解绑成功']); } else { return json(['code'=> self::error_msg, 'msg'=> '操作失败']); } } /** * 返回JS-SDK所需配置 */ public function getJsSdk(){ $url = input('url', '', 'trim'); $root_org = $this->request->token['root_org']; $company_id = Company::where('root_id', '=', $root_org)->value('id'); $setting = WeworksingleCompanySetting::where('company_id', '=', $company_id)->find(); if (empty($setting)) { return json(['code'=> self::error_msg, 'msg'=> '请求失败']); } $config['corp_id'] = $setting['corp_id']; $config['agent_id'] = $setting['agentid']; $config['secret'] = $setting['agent_secret']; $app = Factory::work($config); $jssdk = $app->jssdk->buildConfig([],false, false, false, [], $url); return json(['code'=> self::success, 'data'=> $jssdk, 'msg'=> '请求成功']); } /** * 返回应用的JS-SDK所需配置 */ public function getAgentJsSdk(){ $url = input('url', '', 'trim'); $root_org = $this->request->token['root_org']; $company_id = Company::where('root_id', '=', $root_org)->value('id'); $setting = WeworksingleCompanySetting::where('company_id', '=', $company_id)->find(); if (empty($setting)) { return json(['code'=> self::error_msg, 'msg'=> '请求失败']); } $config['corp_id'] = $setting['corp_id']; $config['agent_id'] = $setting['agentid']; $config['secret'] = $setting['agent_secret']; $app = Factory::work($config); $jssdk = $app->jssdk->buildAgentConfig([], $setting['agentid'], true, false, false, [], $url); return json(['code'=> self::success, 'data'=> $jssdk, 'msg'=> '请求成功']); } /** * 获取某位员工的外部联系人列表 */ public function getExternalContact(){ $search = $this->request->param('name', '', 'trim'); $external_userid = $this->request->param('external_userid', '', 'trim'); $page = $this->request->param('page', 1, 'intval'); $employee_id = $this->request->token['employee_id']; $employee = Employee::find($employee_id)->toArray(); $wx_user = WeworksingleUser::find($employee['weworksingle_uid']); if (empty($wx_user)){ return json(['code'=> self::error_msg, 'msg'=> '获取失败']); } $config = WeworksingleCompanySetting::where('company_id', '=', $wx_user['company_id'])->find(); if (empty($config['customer_secret']) || empty($config['customer_token']) || empty($config['customer_aes_key'])){ return json(['code'=> self::error_msg, 'msg'=> '获取失败']); } $customer_config['corp_id'] = $config['corp_id']; $customer_config['secret'] = $config['customer_secret']; $customer_config['token'] = $config['customer_token']; $customer_config['aes_key'] = $config['customer_aes_key']; // 外部联系人id /*$external_ids_result = Factory::work($customer_config)->external_contact->list($wx_user['userid']); $external_ids = $external_ids_result['external_userid'];*/ // 外部联系人拉取并更新 $app = (new apiSingle($customer_config)); $external_list = $app->getCustomerDetailByUser([$wx_user['userid']]); $old_list = (new WeworksingleCustomer())->where('userid', '=', $wx_user['userid'])->select()->toArray(); $save_data = []; // 需要保存的数组 foreach ($external_list as $k => $v) { unset($data); $data['customer_id'] = 0; // 如果用户存在,则默认更新 foreach ($old_list as $h_k => $h_v){ if ($v['external_contact']['external_userid'] == $h_v['external_userid'] && $v['follow_info']['userid'] == $h_v['userid']) { $data['id'] = $h_v['id']; $data['customer_id'] = $h_v['customer_id']; unset($old_list[$h_k]); // 匹配到则删除,剩余的为被删除的客户。 } } $data['userid'] = $wx_user['userid']; $data['employee_id'] = $employee_id; $data['company_id'] = $wx_user['company_id']; $data['external_userid'] = !empty($v['external_contact']['external_userid']) ? $v['external_contact']['external_userid'] : ''; $data['status'] = 0; $data['name'] = !empty($v['external_contact']['name']) ? $v['external_contact']['name'] : ''; $data['avatar'] = !empty($v['external_contact']['avatar']) ? $v['external_contact']['avatar'] : ''; $data['type'] = !empty($v['external_contact']['type']) ? $v['external_contact']['type'] : ''; $data['gender'] = !empty($v['external_contact']['gender']) ? $v['external_contact']['gender'] : ''; $data['unionid'] = !empty($v['external_contact']['unionid']) ? $v['external_contact']['unionid'] : ''; $data['position'] = !empty($v['external_contact']['position']) ? $v['external_contact']['position'] : ''; $data['corp_name'] = !empty($v['external_contact']['corp_name']) ? $v['external_contact']['corp_name'] : ''; $data['corp_full_name'] = !empty($v['external_contact']['corp_full_name']) ? $v['external_contact']['corp_full_name'] : ''; $data['external_profile'] = !empty($v['external_contact']['external_profile']) ? json_encode($v['external_contact']['external_profile']) : ''; $data['remark'] = !empty($v['follow_info']['remark']) ? $v['follow_info']['remark'] : ''; $data['description'] = !empty($v['follow_info']['description']) ? $v['follow_info']['description'] : ''; $data['createtime'] = !empty($v['follow_info']['createtime']) ? $v['follow_info']['createtime'] : ''; $data['tags'] = !empty($v['follow_info']['tag_id']) ? json_encode($v['follow_info']['tag_id']) : ''; $data['remark_corp_name'] = !empty($v['follow_info']['remark_corp_name']) ? $v['follow_info']['remark_corp_name'] : ''; $data['remark_mobiles'] = !empty($v['follow_info']['remark_mobiles']) ? implode(',', $v['follow_info']['remark_mobiles']) : ''; $data['add_way'] = !empty($v['follow_info']['add_way']) ? $v['follow_info']['add_way'] : ''; $data['oper_userid'] = !empty($v['follow_info']['oper_userid']) ? $v['follow_info']['oper_userid'] : ''; $data['state'] = !empty($v['follow_info']['state']) ? $v['follow_info']['state'] : ''; $save_data[] = $data; } // 被删除的客户 if (!empty($old_list)){ foreach ($old_list as $k => $v){ unset($data); if ($v['status'] !== 1) { // $data['status'] = 1; $data['deletetime'] = date('Y-m-d H:i:s', time()); $data['id'] = $v['id']; $save_data[] = $data; } } } // 更新此用户的所有外部联系人状态 (new WeworksingleCustomer())->saveAll($save_data); $where[] = ['status', '=', 0]; $where[] = ['employee_id', '=', $employee_id]; $where[] = ['customer_id', '=', 0]; if ($search) { $where[] = ['name', 'like', '%'.$search.'%']; } if ($external_userid) { $where[] = ['external_userid', '=', $external_userid]; } $list = WeworksingleCustomer::where($where)->page($page, 10)->select(); return json(['code'=> self::success, 'data'=> $list, 'msg'=> '请求成功']); } /** * 通过手机号返回此员工名下对应的客户ID */ public function getCustomerByPhone(){ $phone = input('phone', '', 'trim'); if (empty($phone)) { return json(['code'=> self::error_msg, 'msg'=> '请输入手机号']); } $phone = cypherphone($phone); $orgids = orgSubIds($this->request->token['root_org']); $c_where = [ ['phone', '=', $phone], ['org_id', 'in', $orgids], ['employee_id', '=', $this->request->token['employee_id']] ]; $customer = Customer::where($c_where)->find(); if (empty($customer)) { return json(['code'=> self::success, 'msg'=> '未匹配到客户', 'data'=> []]); } else { $external_where['customer_id'] = $customer['id']; $external_where['employee_id'] = $this->request->token['employee_id']; $external_find = WeworksingleCustomer::where($external_where)->find(); if (!empty($external_find)) { if ($external_find['status'] == 1) { // 该外部联系人被删除,可以选择绑定新的外部联系人 $external_find->customer_id = 0; $external_find->save(); } else { return json(['code'=> self::error_msg, 'msg'=> '该客户已绑定', 'data'=> []]); } } return json(['code'=> self::success, 'msg'=> '请求成功', 'data'=> $customer]); } } /** * 企业微信外部联系人绑定已有客户 */ public function bindCustomer(){ $external_userid = $this->request->param('external_userid', '', 'trim'); $employee_id = $this->request->token['employee_id']; $phone = $this->request->param('phone', '', 'trim'); if (empty($external_userid) || empty($phone)) { return json(['code'=> self::error_msg, 'msg'=> '绑定失败']); } $phone = cypherphone($phone); $orgids = orgSubIds($this->request->token['root_org']); $c_where = [ ['phone', '=', $phone], ['org_id', 'in', $orgids] ]; $customer = Customer::where($c_where)->find(); if (empty($customer)) { return json(['code'=> self::error_msg, 'msg'=> '客户不存在,请手动添加']); } else { // 属于本员工( 或者 无人跟进且此客户属于本组织 此情况排除) if ($customer['employee_id'] == $employee_id) { // 先查询是否有之前的绑定数据,清除 WeworksingleCustomer::where('customer_id', '=', $customer['id'])->save(['customer_id'=> 0]); // 匹配上客户则绑定 $where['external_userid'] = $external_userid; $where['employee_id'] = $employee_id; $result = WeworksingleCustomer::where($where)->save(['customer_id'=> $customer['id']]); // Customer::where('id', '=', $customer['id'])->save(['employee_id'=> $employee_id]); // 客户自动领取 if ($result !== false) { return json(['code'=> self::success, 'msg'=> '绑定成功']); } else { return json(['code'=> self::error_msg, 'msg'=> '绑定失败']); } } else { return json(['code'=> self::error_msg, 'msg'=> '绑定失败']); } } } /** * 根据外部联系人userid返回系统内对应的客户信息 */ public function getCustomerByExternalUid(){ $externalUid = input('uid', '', 'trim'); $employee_id = $this->request->token['employee_id']; $where['employee_id'] = $employee_id; $where['external_userid'] = $externalUid; $find = WeworksingleCustomer::where($where)->find(); if (empty($find)) { // 判断系统内是否有这个外部联系人,没有则拉取 $wx_uid = Employee::where('id','=', $employee_id)->value('weworksingle_uid'); if (!empty($wx_uid)) { // 企业微信用户 $wx_user = WeworksingleUser::find($wx_uid); $e_where['userid'] = $wx_user['userid']; $e_where['external_userid'] = $externalUid; $e_find = WeworksingleCustomer::where($e_where)->find(); if (empty($e_find)) { $root_org = $this->request->token['root_org']; $company_id = Company::where('root_id', '=', $root_org)->value('id'); $setting = WeworksingleCompanySetting::where('company_id', '=', $company_id)->find(); if (!empty($setting)) { $config['corp_id'] = $setting['corp_id']; $config['agent_id'] = $setting['agentid']; $config['secret'] = $setting['customer_secret']; $config['token'] = $setting['customer_token']; $config['aes_key'] = $setting['customer_aes_key']; $app = (new apiSingle($config)); $external_info = $app->getCustomerDetailById($externalUid); $data['userid'] = $wx_user['userid']; $data['employee_id'] = $employee_id; $data['company_id'] = $company_id; $data['customer_id'] = 0; $data['external_userid'] = $externalUid; $data['status'] = 0; $data['deletetime'] = null; $data['name'] = !empty($external_info['external_contact']['name']) ? $external_info['external_contact']['name'] : ''; $data['avatar'] = !empty($external_info['external_contact']['avatar']) ? $external_info['external_contact']['avatar'] : ''; $data['type'] = !empty($external_info['external_contact']['type']) ? $external_info['external_contact']['type'] : ''; $data['gender'] = !empty($external_info['external_contact']['gender']) ? $external_info['external_contact']['gender'] : ''; $data['unionid'] = !empty($external_info['external_contact']['unionid']) ? $external_info['external_contact']['unionid'] : ''; $data['position'] = !empty($external_info['external_contact']['position']) ? $external_info['external_contact']['position'] : ''; $data['corp_name'] = !empty($external_info['external_contact']['corp_name']) ? $external_info['external_contact']['corp_name'] : ''; $data['corp_full_name'] = !empty($external_info['external_contact']['corp_full_name']) ? $external_info['external_contact']['corp_full_name'] : ''; $data['external_profile'] = !empty($external_info['external_contact']['external_profile']) ? json_encode($external_info['external_contact']['external_profile']) : ''; foreach ($external_info['follow_user'] as $v){ if ($v['userid'] == $wx_user['userid']) { $data['remark'] = !empty($v['remark']) ? $v['remark'] : ''; $data['description'] = !empty($v['description']) ? $v['description'] : ''; $data['createtime'] = !empty($v['createtime']) ? $v['createtime'] : ''; $data['tags'] = !empty($v['tags']) ? json_encode($v['tags']) : ''; $data['remark_corp_name'] = !empty($v['remark_corp_name']) ? $v['remark_corp_name'] : ''; $data['remark_mobiles'] = !empty($v['remark_mobiles']) ? implode(',', $v['remark_mobiles']) : ''; $data['add_way'] = !empty($v['add_way']) ? $v['add_way'] : ''; $data['oper_userid'] = !empty($v['oper_userid']) ? $v['oper_userid'] : ''; $data['state'] = !empty($v['state']) ? $v['state'] : ''; } } WeworksingleCustomer::create($data); } } else { $data['id'] = $e_find['id']; $data['status'] = 0; $data['deletetime'] = null; $e_find->save($data); } } return json(['code'=> self::success, 'msg'=> '请求成功', 'data'=> '']); } else { return json(['code'=> self::success, 'msg'=> '请求成功', 'data'=> $find['customer_id']]); } } public function sendMessage(){ $msg = [ 'external_userid' => [ 'wmpEonCwAA1WyNGdGcPr5h7WO_Gy_elA', 'wmpEonCwAA9BWQW6_yFQ8YLgyrWidZ7g', ], 'sender' => 'WuHao', 'text' => [ 'content' => '此条是测试消息', ]/*, 'image' => [ 'media_id' => 'MEDIA_ID', ], 'link' => [ 'title' => '消息标题', 'picurl' => '', 'desc' => '消息描述', 'url' => 'https://example.link.com/path', ], 'miniprogram' => [ 'title' => '消息标题', 'pic_media_id' => 'MEDIA_ID', 'appid' => 'wx8bd80126147df384', 'page' => '/path/index', ],*/ ]; $config = WeworksingleCompanySetting::where('company_id', '=', 2)->find(); if (empty($config['customer_secret']) || empty($config['customer_token']) || empty($config['customer_aes_key'])){ return json(['code'=> self::error_msg, 'msg'=> '发送失败']); } $customer_config['corp_id'] = $config['corp_id']; $customer_config['secret'] = $config['customer_secret']; $customer_config['token'] = $config['customer_token']; $customer_config['aes_key'] = $config['customer_aes_key']; $app = Factory::work($customer_config); $result = $app->external_contact_message->submit($msg); Log::record($result)->save(); } /** * 获取客户聊天记录(企业微信) */ public function getChatRecord(){ $customer_id = input('customer_id', '', 'intval'); $customer_id = input('customer_id', '', 'intval'); $employee_id = request()->token['employee_id']; $p = input('page', 1, 'intval'); $wework_customer = WeworksingleCustomer::where([['employee_id', '=', $employee_id], ['customer_id', '=', $customer_id]])->findOrEmpty(); if ($wework_customer->isEmpty()) { return json(['code'=> 0, 'msg'=> 'success', 'data'=> []]); } $employee_uid = Employee::where('id', $employee_id)->value('weworksingle_uid'); if (empty($employee_uid)) { return json(['code'=> 0, 'msg'=> 'success', 'data'=> []]); } $employee_user = WeworksingleUser::where('id', $employee_uid)->findOrEmpty(); if ($employee_user->isEmpty()) { return json(['code'=> 0, 'msg'=> 'success', 'data'=> []]); } $company_id = Company::where('root_id', '=', request()->token['root_org'])->value('id'); $where[] = ['msgtype', '<>', 'revoke']; $where[] = ['company_id', '=', $company_id]; $where[] = ['msgfrom', 'in', [$employee_user['userid'], $wework_customer['external_userid']]]; $where[] = ['msgtype', 'not in', ['revoke', 'switch', 'meeting_voice_call']]; $chat_list = WeworksingleChatRecord::with('chatFile')->where($where)->order('msgtime desc id desc')->field('id,msgid,action,msgfrom,msgtime,msgtype,content,json_content,is_recall')->page($p, 10)->select()->each(function($item) use ($wework_customer, $employee_user){ $msgtime = strtotime(get_microtime_format($item['msgtime'])); $item['msgtime'] = date('Y-m-d H:i:s', $msgtime); $item['json_content'] = json_decode($item['json_content'], 'true'); $msgfrom = $item['msgfrom']; if ($wework_customer['external_userid'] == $msgfrom) { $item['msgfrom'] = $wework_customer['name']; $item['msg_loaction'] = 'left'; } else if ($employee_user['userid'] == $msgfrom) { $item['msgfrom'] = $employee_user['name']; $item['msg_loaction'] = 'right'; } // 判断聊天文件位置 if (!empty($item['chatFile'])) { if ($item['chatFile']['is_local'] == 1) { $item['chatFile']['path'] = request()->domain() . '/' . $item['chatFile']['path']; } else { $ali_oss_bindurl = config('app.wework_ali_oss_bindurl'); $url = 'https://' . $ali_oss_bindurl . '/'; $item['chatFile']['path'] = $url . $item['chat_file']['oss_path']; } } switch ($item['msgtype']) { case 'text': $item['msgtype_name'] = '文本'; break; case 'image': $item['msgtype_name'] = '图片'; break; case 'revoke': $item['msgtype_name'] = '撤回消息'; break; case 'agree': $item['msgtype_name'] = '同意会话聊天内容'; break; case 'voice': $item['msgtype_name'] = '语音消息'; break; case 'video': $item['msgtype_name'] = '视频消息'; break; case 'card': $item['msgtype_name'] = '名片消息'; break; case 'location': $item['msgtype_name'] = '位置消息'; break; case 'emotion': $item['msgtype_name'] = '表情消息'; $item['width'] = $item['json_content']['emotion']['width'] ?? 240; $item['height'] = $item['json_content']['emotion']['height'] ?? 240; break; case 'file': $item['msgtype_name'] = '文件消息'; break; case 'link': $item['msgtype_name'] = '链接消息'; break; case 'weapp': $item['msgtype_name'] = '小程序消息'; break; case 'chatrecord': $item['msgtype_name'] = '会话记录消息'; break; case 'todo': $item['msgtype_name'] = '待办消息'; break; case 'vote': $item['msgtype_name'] = '投票消息'; break; case 'collect': $item['msgtype_name'] = '填表消息'; break; case 'redpacket': $item['msgtype_name'] = '红包消息'; break; case 'meeting': $item['msgtype_name'] = '会议邀请消息'; break; case 'docmsg': $item['msgtype_name'] = '在线文档消息'; break; case 'markdown': $item['msgtype_name'] = '系统消息'; break; case 'news': $item['msgtype_name'] = '图文消息'; break; case 'calendar': $item['msgtype_name'] = '日程消息'; break; case 'mixed': $item['msgtype_name'] = '混合消息'; break; case 'meeting_voice_call': $item['msgtype_name'] = '音频存档消息'; break; case 'voip_doc_share': $item['msgtype_name'] = '音频共享文档消息'; break; case 'external_redpacket': $item['msgtype_name'] = '互通红包消息'; if (!empty($item['json_content']['redpacket'])) { switch (intval($item['json_content']['redpacket']['type'])) { case 1: $item['redpacket_type'] = '普通红包'; break; case 2: $item['redpacket_type'] = '拼手气群红包'; break; case 3: $item['redpacket_type'] = '激励群红包'; break; default: $item['redpacket_type'] = '普通红包'; break; } $item['redpacket_wish'] = $item['json_content']['redpacket']['wish']; $item['redpacket_total'] = $item['json_content']['redpacket']['totalcnt']; $item['redpacket_totalamount'] = round($item['json_content']['redpacket']['totalcnt']/100, 2); } else { $item['redpacket_type'] = '未知'; $item['redpacket_wish'] = '未知'; $item['redpacket_total'] = '未知'; $item['redpacket_totalamount'] = '未知'; } break; case 'sphfeed': $item['msgtype_name'] = '视频号消息'; break; case 'voiptext': // 音视频通话 switch ($item['json_content']['info']['invitetype']) { case 1: $voiptext_name = '视频通话'; break; case 2: $voiptext_name = '语音通话'; break; case 3: $voiptext_name = '多人视频通话'; break; case 4: $voiptext_name = '多人语音通话'; break; default: $voiptext_name = '音视频通话'; break; } $item['msgtype_name'] = $voiptext_name; $long = $item['json_content']['info']['callduration']; $long_s = $long > 60 ? $long % 60 : $long; $long_m = $long > 60 ? intval($long / 60) : 0; $item['content'] = $long_m > 0 ? $long_m . '分' . $long_s . '秒' : $long_s . '秒'; break; case 'qydiskfile': // 微盘文件 $once_msg['content'] = $msg['info']['filename']; break; default: $item['msgtype_name'] = '未知格式消息'; break; } }); return json(['code'=> 0, 'msg'=> 'success', 'data'=> $chat_list]); } }