123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- <?php namespace App\Servers\WeiBan;
- use Ixudra\Curl\Facades\Curl;
- use App\Facades\Servers\Logs\Log;
- use App\Models\WeiBan\Taglist;
- /**
- * 微信小程序
- *
- */
- class OpenApi
- {
- // 微伴接口API
- private $domain = 'https://open.weibanzhushou.com';
- // 微伴接口调用接口凭证
- private $accessToken = null;
- // 返回结果
- public function __construct(){
- // 接口凭证不存在则获取
- if( is_null($this->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;
- }
- /**
- * 给客户添加企业标签
- *
- */
- public function addTag($staffId,$extUserid,$tagGroup,$tagName){
- // 获取调用凭证
- $accessToken = $this->getAccessToken();
- // 如果没有返回
- if( !$accessToken ) return [];
- // 组装接口
- $url = $this->domain.'/open-api/tag/add?access_token='.$accessToken;
- $param = ['staff_id'=>$staffId,'external_user_id'=>$extUserid,'tag_group'=>$tagGroup,'tag_name'=>$tagName];
- // 调用接口
- $result = Curl::to($url)->withData($param)->asJson(true)->post();
- // 如果没有返回
- if( !isset($result['errcode']) ) {
- Log::error('weiban_openai/tag_add','接口未返回数据',$result);
- return false;
- }
- // 如果是凭证错误,递归
- if( $result['errcode'] == '10001' ) return $this->addTag($staffId,$extUserid,$tagGroup,$tagName);
- // 如果调用结果失败
- if( $result['errcode'] != 0 ) {
- Log::error('weiban_openai/tag_add',$result['errcode'].'=>'.$result['errmsg']);
- return false;
- }
- return true;
- }
- }
- ?>
|