1,'msg'=>'','data'=>'');
$official_account_type = $request->get('official_account_type');
$distribution_channel_id = $request->get('distribution_channel_id');
$origin_redirect_url = $request->get('redirect_url');
$group_nick = $request->get('group_nick');
$redirect_url = urlencode($origin_redirect_url);
v($request->all());
if(empty($official_account_type) || empty($distribution_channel_id) || empty($redirect_url) || empty($group_nick)){
$result['code'] = 0;
$result['msg'] = 'invalid param';
json_echo($result);
}
$check_result = $this->check_sign_params($request);
if($check_result['code'] == 0){
$result['code'] = 0;
$result['msg'] = $check_result['msg'];
json_echo($result);
}
$_param = $official_account_type.'*'.$distribution_channel_id.'*'.$redirect_url.'*'.$group_nick;
$this->oauth_platform_callback_url = $this->oauth_platform_callback_base_url.$_param.'/oauth_platform_callback';
v('oauth_platform_callback_url:'.$this->oauth_platform_callback_url);
try{
$response = WechatOP::oauth()->redirect($this->oauth_platform_callback_url);
v('$response');
$target_url = $response->getTargetUrl();
v('target_url');v($target_url);
}catch(\Exception $e){
v('oauth_callback_ept:'.$e->getMessage());
$origin_redirect_url .= "&distribution_channel_id=".$distribution_channel_id."&success=0&msg=授权异常:".urlencode($e->getMessage());
v('ept_redirect_url:'.$origin_redirect_url);
// 跳转回去
$this->redirect_url($origin_redirect_url);
exit();
}
v('oauth_platform_end');
// 注意:直接跳转会有bug
echo "
若没有自动跳转,点击本链接跳转到授权页
";
}
/**
* 授权结束回调给平台调用凭据
* @param Request $request
*/
function oauth_platform_callback(Request $request){
v('oauth_platform_callback');v($request->all());
$official_account_type = $distribution_channel_id = $group_nick = '';
// 提取授权公众号的基础回调参数,回调格式domain/oauth/official_account_type*distribution_channel_id/oauth_platform_callback
preg_match('/oauth\/(.*)?\/oauth_platform_callback/i',$_SERVER['REQUEST_URI'],$data);
if(isset($data[1]) && !empty($data[1])){
$_param =$data[1];
$_param_arr = explode('*',$_param);
$official_account_type = $_param_arr[0];
$distribution_channel_id = $_param_arr[1];
$redirect_url = $_param_arr[2];
$group_nick = $_param_arr[3];
$redirect_url = urldecode($redirect_url);
if(strpos($redirect_url,'?') === false){
$redirect_url .= '?';
}
}
v('oauth_platform_callback:official_account_type:'.$official_account_type.' distribution_channel_id:'.$distribution_channel_id.' redirect_url:'.$redirect_url);
// die('end');
$authInfo = WechatOP::oauth()->user();
$authInfo = objectToArray($authInfo);
// 取第一个val
$authInfo = current($authInfo);
v('authInfo');v($authInfo);
// 授权信息
$authorization_info = $authInfo['authorization_info'];
v('authorization_info');v($authorization_info);
$appid = isset($authorization_info['authorizer_appid'])?$authorization_info['authorizer_appid']:'';
$is_service_auth = isset($authInfo['authorizer_info']['service_type_info']['id']) &&
$authInfo['authorizer_info']['service_type_info']['id'] == 2 &&
isset($authInfo['authorizer_info']['verify_type_info']['id']) &&
$authInfo['authorizer_info']['verify_type_info']['id'] == 0;
$is_white_appids = false;
$white_appids = Redis::smembers('auth_white_appids');
v('white_appids');v($white_appids);
if(!empty($appid) && in_array($appid,$white_appids)){
$is_white_appids = true;
}
v('oauth_platform_callback:appid:'.$appid.' is_service_auth:'.$is_service_auth.' is_white_appids:'.$is_white_appids);
// 只有认证微信服务号才支持,或者白名单列表
if($is_service_auth || $is_white_appids)
{
// 保存token信息
$authorizer_appid = $authorization_info['authorizer_appid'];
$authorizer_refresh_token = $authorization_info['authorizer_refresh_token'];
$redis_key = '[wechat_op.common.component_refresh_token.'.$authorizer_appid.']';
$redis_val = $authorizer_refresh_token;
v('oauth_platform_callback:redis_key:'.$redis_key.' redis_val:'.$redis_val);
Redis::Set($redis_key, $authorizer_refresh_token);
$redis_res = Redis::Get($redis_key);
v('redis_res:'.$redis_res);
// 重要:要先保存映射表
$insert_group = array();
$insert_group['group_nick'] = $group_nick;
$insert_group['appid'] = $authorizer_appid;
WechatGroupGzh::save_group_gzh($insert_group);
// 初始化接口
parent::__construct($authorizer_appid);
$origin_distribution_channel_id = isset($this->official_account['distribution_channel_id'])?$this->official_account['distribution_channel_id']:'';
$origin_appid = isset($this->official_account['appid'])?$this->official_account['appid']:'';
v('check_official_account,distribution_channel_id:'.$distribution_channel_id.' origin_distribution_channel_id:'.$origin_distribution_channel_id.' origin_appid:'.$origin_appid);
// 空账号或者同一个账号
if(empty($origin_appid) || ($distribution_channel_id == $origin_distribution_channel_id)){
v('third_oauth_save_or_update:'.$authorizer_appid.' distribution_channel_id:'.$distribution_channel_id);
// 保存商户公众号信息
$authorizer_info = $authInfo['authorizer_info'];
v('$authorizer_info');v($authorizer_info);
$insert_offical_account = array();
$insert_offical_account['nickname'] = isset($authorizer_info['nick_name'])?$authorizer_info['nick_name']:'';
$insert_offical_account['head_img'] = isset($authorizer_info['head_img'])?$authorizer_info['head_img']:'';
$insert_offical_account['service_type_info'] = isset($authorizer_info['service_type_info']['id'])?$authorizer_info['service_type_info']['id']:null;
$insert_offical_account['verify_type_info'] = isset($authorizer_info['verify_type_info']['id'])?$authorizer_info['verify_type_info']['id']:null;
$insert_offical_account['name'] = isset($authorizer_info['user_name'])?$authorizer_info['user_name']:'';
$insert_offical_account['alias'] = isset($authorizer_info['alias'])?$authorizer_info['alias']:'';
$insert_offical_account['qrcode_url'] = isset($authorizer_info['qrcode_url'])?$authorizer_info['qrcode_url']:'';
$insert_offical_account['principal_name'] = isset($authorizer_info['principal_name'])?$authorizer_info['principal_name']:'';
$insert_offical_account['authorizer_refresh_token'] = $authorizer_refresh_token;
$insert_offical_account['appid'] = $authorizer_appid;
$insert_offical_account['func_info'] = json_encode($authorization_info['func_info']);
$insert_offical_account['is_auth'] = 1;
$insert_offical_account['official_account_type'] = $official_account_type;
$insert_offical_account['distribution_channel_id'] = $distribution_channel_id;
v('authorizer_info_insert_data:');v($insert_offical_account);
$this->WechatApi->save_official_account($insert_offical_account);
// 自动生成菜单和模板消息,如果默认是登录或者支付公众号,则不生成菜单
// TODO check下是否自动生成
if(!in_array($official_account_type,array('third_platform_default_login','third_platform_pay'))){
v('auto_set_menu:'.$authorizer_appid);
$this->auto_set_menu_and_template($authorizer_appid,'all');
}else{
v('not_set_menu:'.$authorizer_appid);
}
$redirect_url .= "&distribution_channel_id=".$distribution_channel_id."&authorizer_appid=".$authorizer_appid."&success=1";
}
// 已存在的
else{
v('third_oauth_direct_return:'.$authorizer_appid.' distribution_channel_id:'.$distribution_channel_id);
$redirect_url .= "&distribution_channel_id=".$distribution_channel_id."&success=0&msg=该服务号已经被渠道号:".$origin_distribution_channel_id." 授权,不能再次授权!";
}
}else{
$redirect_url .= "&distribution_channel_id=".$distribution_channel_id."&success=0&msg=只支持认证的服务号!";
}
v('redirect_url:'.$redirect_url);
// 跳转回去
$this->redirect_url($redirect_url);
}
function auto_set_menu_and_template($authorizer_appid='',$set_type='all'){
if(empty($authorizer_appid)){
v('auto_set_menu_and_template_param_null:'.$authorizer_appid);
return false;
}
parent::__construct($authorizer_appid);
if($set_type == 'all'){
$menu = new MenusController($this->param);
$menu->set_menu();
$template = new TemplateBasesController($this->param);
$template->auto_set_dustry_templates();
}elseif($set_type == 'menu'){
$menu = new MenusController($this->param);
$menu->set_menu();
}elseif($set_type == 'template'){
$template = new TemplateBasesController($this->param);
$template->auto_set_dustry_templates();
}else{
v('auto_set_menu_and_template_invalid_set_type:'.$authorizer_appid);
}
}
/**
* 嘉言小说 wxdbc486f1b4f6a8c3
http://zydy/oauth/auto_set_menu_and_template_test?set_type=menu&authorizer_appid=wxdbc486f1b4f6a8c3×tamp=1511509543&sign=98dccc7b29e3c05e4b4367f488ff1966
*/
function auto_set_menu_and_template_test(Request $request){
$result = array('code'=>1,'msg'=>'','data'=>'');
$authorizer_appid = $request->get('authorizer_appid');
$set_type = $request->get('set_type');
if(empty($authorizer_appid) || empty($set_type)){
$result['code'] = 0;
$result['msg'] = 'invalid param';
json_echo($result);
}
$check_result = $this->check_sign_params($request);
if($check_result['code'] == 0){
$result['code'] = 0;
$result['msg'] = $check_result['msg'];
json_echo($result);
}
$this->auto_set_menu_and_template($authorizer_appid,$set_type);
}
}