accessToken) ) $this->accessToken = $this->getAccessToken(); } /** * 获取接口调用凭证 * */ public function getAccessToken(){ // 从缓存获取数据 $corpId = config('weiban.corp_id'); $secret = config('weiban.secret'); // 如果没有配置 if( !$corpId || !$secret ) return '';//['error'=>'请先配置微伴助手接口参数']; // 缓存key $key = 'weiban:corpid:access_token:'.$corpId; // 获取凭证 $accessToken = cache($key); // 如果存在凭证 if( $accessToken ) return $accessToken; // 组装接口 $url = $this->domain.'/open-api/access_token/get'; // 获取凭证 $result = Curl::to($url)->withData(['corp_id'=>$corpId,'secret'=>$secret])->asJson(true)->post(); // 如果没有返回 if( !isset($result['errcode']) ) { // 记录错误信息 Log::error('weiban_openai/access_token','未获取到凭证'); return ''; } // 调用失败 if( $result['errcode'] != 0 ) { // 记录错误信息 Log::error('weiban_openai/access_token',$result['errcode'].'=>'.$result['errmsg']); return ''; } // 调用成功,缓存调用凭证 cache([$key=>$result['access_token']],$result['expires_in']); // 返回凭证 return $result['access_token']; } /** * 获取更新的用户列表 * * @param int $limit 每页条数 * @param int $offset 列表偏移。用于迭代获取所有数据,默认值为0 * @param int $startTime 时间筛选开始时间,时间戳格式。 * @param string $source 客户关联信息的类型,可选external_user(用户信息), remark(客户详情页的基本信息和自定义信息), staff_relation(客户关系), tag_relation(标签数据)。 * (注:返回的数据是external_user的updated_at,source选external_user外的其他条件是筛选(remark:客户更新基本信息, staff_relation:客户更新关系,tag_relation: 客户更新标签)时间。) * */ public function getUserList($limit,$offset,$startTime=0,$source='remark'){ // 获取调用凭证 $accessToken = $this->getAccessToken(); // 如果没有返回 if( !$accessToken ) return ['total'=>0,'user_list'=>[]]; // 参数 $param = ['order'=>'asc','source'=>$source,'start_update_time'=>$startTime,'limit'=>$limit,'offset'=>$offset,'access_token'=>$accessToken]; // 组装接口 $url = $this->domain.'/open-api/external_user/update/list'; // 调用接口 $result = Curl::to($url)->withData($param)->asJson(true)->get(); // 如果没有返回 if( !isset($result['errcode']) ) { Log::error('weiban_openai/external_user_update',$source.'=>未获取到用户列表'); return ['total'=>0,'user_list'=>[]]; } // 如果是凭证错误,递归 if( $result['errcode'] == '10001' ) return $this->getUserList($limit,$offset,$startTime); // 调用失败 if( $result['errcode'] != 0 ) { Log::error('weiban_openai/external_user_update',$source.'=>'.$result['errcode'].'=>'.$result['errmsg']); return ['total'=>0,'user_list'=>[]]; } // 返回结果 return ['total'=>$result['total'],'user_list'=>$result['external_user_list']]; } /** * 获取手机号用户 * * @param string $phone 手机号 * */ public function getUserListByPhone($phone){ // 获取调用凭证 $accessToken = $this->getAccessToken(); // 如果没有返回 if( !$accessToken ) return []; // 参数 $param = ['phone_number'=>$phone,'access_token'=>$accessToken]; // 组装接口 $url = $this->domain.'/open-api/external_user/list'; // 调用接口 $result = Curl::to($url)->withData($param)->asJson(true)->get(); // 如果没有返回 if( !isset($result['errcode']) ) { Log::error('weiban_openai/external_user_list','未获取到用户列表'); return []; } // 如果是凭证错误,递归 if( $result['errcode'] == '10001' ) return $this->getUserListByPhone($phone); // 调用失败 if( $result['errcode'] != 0 ) { Log::error('weiban_openai/external_user_list',$result['errcode'].'=>'.$result['errmsg']); return []; } // 返回结果 return $result['external_user_list']; } /** * 获取用户详情 * * @param string 客户id。对应企业微信客户 id * */ public function getUserDetail($id) { // 获取调用凭证 $accessToken = $this->getAccessToken(); // 如果没有返回 if( !$accessToken ) return []; // 组装接口 $url = $this->domain.'/open-api/external_user/get'; // 调用接口 $result = Curl::to($url)->withData(['id'=>$id,'access_token'=>$accessToken])->asJson(true)->get(); // 如果没有返回 if( !isset($result['errcode']) ) { Log::error('weiban_openai/external_user_get',$id.'=>接口未返回数据'); return []; } // 如果是凭证错误,递归 if( $result['errcode'] == '10001' ) return $this->getUserDetail($id); // 调用失败 if( $result['errcode'] != 0 ) { Log::error('weiban_openai/external_user_get',$id.'=>'.$result['errcode'].'=>'.$result['errmsg']); return []; } // 返回结果 return $result['external_user']; } /** * 获取标签列表 * * @param int $limit 每页条数 * @param int $offset 列表偏移。用于迭代获取所有数据,默认值为0 * * @return array 标签列表 * * */ public function getTagList($limit=100,$offset=0){ // 获取调用凭证 $accessToken = $this->getAccessToken(); // 如果没有返回 if( !$accessToken ) return []; // 组装接口 $url = $this->domain.'/open-api/tag/list'; // 调用接口 $result = Curl::to($url)->withData(['access_token'=>$accessToken,'limit'=>$limit,'offset'=>$offset])->asJson(true)->get(); // 如果没有返回 if( !isset($result['errcode']) ) { Log::error('weiban_openai/tag_list','接口未返回数据'); return []; } // 如果是凭证错误,递归 if( $result['errcode'] == '10001' ) return $this->getTagList($limit,$offset); // 如果调用结果失败 if( $result['errcode'] != 0 ) { Log::error('weiban_openai/tag_list',$result['errcode'].'=>'.$result['errmsg']); return []; } // 如果列表偏移量小于标签总数 if( $offset < $result['total'] ) { // 休眠一秒钟,避免超限错误 sleep(1); // 获取下一页 $result['tag_list'] = array_merge($result['tag_list'],$this->getTagList($limit,$offset+$limit)); } // 修改数据 (new Taglist)->upsertData($result['tag_list']); // 返回结果 return $result['tag_list']; } /** * 批量更新客户企业标签 * * */ public function markTags($extUserid,$addTags,$rmTags,$staffId){ // 获取调用凭证 $accessToken = $this->getAccessToken(); // 如果没有返回 if( !$accessToken ) return []; // 组装接口 $url = $this->domain.'/open-api/tag/batch_update?access_token='.$accessToken; $param = ['staff_id'=>$staffId,'external_user_id'=>$extUserid,'add_tag_id_list'=>$addTags,'remove_tag_id_list'=>$rmTags]; // 调用接口 $result = Curl::to($url)->withData($param)->asJson(true)->post(); // 如果没有返回 if( !isset($result['errcode']) ) { Log::error('weiban_openai/tag_batch_update','接口未返回数据',$result); return false; } // 如果是凭证错误,递归 if( $result['errcode'] == '10001' ) return $this->markTags($extUserid,$addTags,$rmTags,$staffId); // 如果调用结果失败 if( $result['errcode'] != 0 ) { Log::error('weiban_openai/tag_batch_update',$result['errcode'].'=>'.$result['errmsg']); return false; } // 返回结果 return true; } } ?>