OauthPlatformsController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <?php
  2. namespace App\Http\Controllers\Wechat\ThirdWx;
  3. use App\Http\Models\WechatGroupGzh;
  4. use App\Http\Controllers\WechatController;
  5. use App\Http\Requests;
  6. use Illuminate\Http\Request;
  7. use Illuminate\Http\Response;
  8. use WechatOP;
  9. use Illuminate\Support\Facades\Redis;
  10. use App\Http\Controllers\Wechat\Menu\MenusController;
  11. use App\Http\Controllers\Wechat\Template\TemplateBasesController;
  12. /**
  13. * 授权第三方平台获取公众号权限
  14. * @author zhoulingjie
  15. *
  16. */
  17. class OauthPlatformsController extends WechatController
  18. {
  19. public function __construct()
  20. {
  21. parent::__construct();
  22. }
  23. /**
  24. * 公众号授权第三方平台并跳转
  25. http://zydy/oauth/oauth_platform?distribution_channel_id=1&official_account_type=force_subscribe&group_nick=aizhuishu&redirect_url=http%3a%2f%2fchannel.aizhuishu.com%2fservice-setting%3ftab%3d3&timestamp=1513240244&sign=577684945fd6f2dc0295b7dc3f5cf60c
  26. * @param Request $request
  27. */
  28. function oauth_platform(Request $request){
  29. v('oauth_platform_start');
  30. $result = array('code'=>1,'msg'=>'','data'=>'');
  31. $official_account_type = $request->get('official_account_type');
  32. $distribution_channel_id = $request->get('distribution_channel_id');
  33. $origin_redirect_url = $request->get('redirect_url');
  34. $group_nick = $request->get('group_nick');
  35. $redirect_url = urlencode($origin_redirect_url);
  36. v($request->all());
  37. if(empty($official_account_type) || empty($distribution_channel_id) || empty($redirect_url) || empty($group_nick)){
  38. $result['code'] = 0;
  39. $result['msg'] = 'invalid param';
  40. json_echo($result);
  41. }
  42. $check_result = $this->check_sign_params($request);
  43. if($check_result['code'] == 0){
  44. $result['code'] = 0;
  45. $result['msg'] = $check_result['msg'];
  46. json_echo($result);
  47. }
  48. $_param = $official_account_type.'*'.$distribution_channel_id.'*'.$redirect_url.'*'.$group_nick;
  49. $this->oauth_platform_callback_url = $this->oauth_platform_callback_base_url.$_param.'/oauth_platform_callback';
  50. v('oauth_platform_callback_url:'.$this->oauth_platform_callback_url);
  51. try{
  52. $response = WechatOP::oauth()->redirect($this->oauth_platform_callback_url);
  53. v('$response');
  54. $target_url = $response->getTargetUrl();
  55. v('target_url');v($target_url);
  56. }catch(\Exception $e){
  57. v('oauth_callback_ept:'.$e->getMessage());
  58. $origin_redirect_url .= "&distribution_channel_id=".$distribution_channel_id."&success=0&msg=授权异常:".urlencode($e->getMessage());
  59. v('ept_redirect_url:'.$origin_redirect_url);
  60. // 跳转回去
  61. $this->redirect_url($origin_redirect_url);
  62. exit();
  63. }
  64. v('oauth_platform_end');
  65. // 注意:直接跳转会有bug
  66. echo "
  67. <html>
  68. <head>
  69. <script LANGUAGE='JavaScript'>
  70. window.location= '".$target_url."';
  71. </script>
  72. </head>
  73. <body>
  74. <br><a href='".$target_url."'>若没有自动跳转,点击本链接跳转到授权页</a><br>
  75. </body>
  76. </html>
  77. ";
  78. }
  79. /**
  80. * 授权结束回调给平台调用凭据
  81. * @param Request $request
  82. */
  83. function oauth_platform_callback(Request $request){
  84. v('oauth_platform_callback');v($request->all());
  85. $official_account_type = $distribution_channel_id = $group_nick = '';
  86. // 提取授权公众号的基础回调参数,回调格式domain/oauth/official_account_type*distribution_channel_id/oauth_platform_callback
  87. preg_match('/oauth\/(.*)?\/oauth_platform_callback/i',$_SERVER['REQUEST_URI'],$data);
  88. if(isset($data[1]) && !empty($data[1])){
  89. $_param =$data[1];
  90. $_param_arr = explode('*',$_param);
  91. $official_account_type = $_param_arr[0];
  92. $distribution_channel_id = $_param_arr[1];
  93. $redirect_url = $_param_arr[2];
  94. $group_nick = $_param_arr[3];
  95. $redirect_url = urldecode($redirect_url);
  96. if(strpos($redirect_url,'?') === false){
  97. $redirect_url .= '?';
  98. }
  99. }
  100. v('oauth_platform_callback:official_account_type:'.$official_account_type.' distribution_channel_id:'.$distribution_channel_id.' redirect_url:'.$redirect_url);
  101. // die('end');
  102. $authInfo = WechatOP::oauth()->user();
  103. $authInfo = objectToArray($authInfo);
  104. // 取第一个val
  105. $authInfo = current($authInfo);
  106. v('authInfo');v($authInfo);
  107. // 授权信息
  108. $authorization_info = $authInfo['authorization_info'];
  109. v('authorization_info');v($authorization_info);
  110. $appid = isset($authorization_info['authorizer_appid'])?$authorization_info['authorizer_appid']:'';
  111. $is_service_auth = isset($authInfo['authorizer_info']['service_type_info']['id']) &&
  112. $authInfo['authorizer_info']['service_type_info']['id'] == 2 &&
  113. isset($authInfo['authorizer_info']['verify_type_info']['id']) &&
  114. $authInfo['authorizer_info']['verify_type_info']['id'] == 0;
  115. $is_white_appids = false;
  116. $white_appids = Redis::smembers('auth_white_appids');
  117. v('white_appids');v($white_appids);
  118. if(!empty($appid) && in_array($appid,$white_appids)){
  119. $is_white_appids = true;
  120. }
  121. v('oauth_platform_callback:appid:'.$appid.' is_service_auth:'.$is_service_auth.' is_white_appids:'.$is_white_appids);
  122. // 只有认证微信服务号才支持,或者白名单列表
  123. if($is_service_auth || $is_white_appids)
  124. {
  125. // 保存token信息
  126. $authorizer_appid = $authorization_info['authorizer_appid'];
  127. $authorizer_refresh_token = $authorization_info['authorizer_refresh_token'];
  128. $redis_key = '[wechat_op.common.component_refresh_token.'.$authorizer_appid.']';
  129. $redis_val = $authorizer_refresh_token;
  130. v('oauth_platform_callback:redis_key:'.$redis_key.' redis_val:'.$redis_val);
  131. Redis::Set($redis_key, $authorizer_refresh_token);
  132. $redis_res = Redis::Get($redis_key);
  133. v('redis_res:'.$redis_res);
  134. // 重要:要先保存映射表
  135. $insert_group = array();
  136. $insert_group['group_nick'] = $group_nick;
  137. $insert_group['appid'] = $authorizer_appid;
  138. WechatGroupGzh::save_group_gzh($insert_group);
  139. // 初始化接口
  140. parent::__construct($authorizer_appid);
  141. $origin_distribution_channel_id = isset($this->official_account['distribution_channel_id'])?$this->official_account['distribution_channel_id']:'';
  142. $origin_appid = isset($this->official_account['appid'])?$this->official_account['appid']:'';
  143. v('check_official_account,distribution_channel_id:'.$distribution_channel_id.' origin_distribution_channel_id:'.$origin_distribution_channel_id.' origin_appid:'.$origin_appid);
  144. // 空账号或者同一个账号
  145. if(empty($origin_appid) || ($distribution_channel_id == $origin_distribution_channel_id)){
  146. v('third_oauth_save_or_update:'.$authorizer_appid.' distribution_channel_id:'.$distribution_channel_id);
  147. // 保存商户公众号信息
  148. $authorizer_info = $authInfo['authorizer_info'];
  149. v('$authorizer_info');v($authorizer_info);
  150. $insert_offical_account = array();
  151. $insert_offical_account['nickname'] = isset($authorizer_info['nick_name'])?$authorizer_info['nick_name']:'';
  152. $insert_offical_account['head_img'] = isset($authorizer_info['head_img'])?$authorizer_info['head_img']:'';
  153. $insert_offical_account['service_type_info'] = isset($authorizer_info['service_type_info']['id'])?$authorizer_info['service_type_info']['id']:null;
  154. $insert_offical_account['verify_type_info'] = isset($authorizer_info['verify_type_info']['id'])?$authorizer_info['verify_type_info']['id']:null;
  155. $insert_offical_account['name'] = isset($authorizer_info['user_name'])?$authorizer_info['user_name']:'';
  156. $insert_offical_account['alias'] = isset($authorizer_info['alias'])?$authorizer_info['alias']:'';
  157. $insert_offical_account['qrcode_url'] = isset($authorizer_info['qrcode_url'])?$authorizer_info['qrcode_url']:'';
  158. $insert_offical_account['principal_name'] = isset($authorizer_info['principal_name'])?$authorizer_info['principal_name']:'';
  159. $insert_offical_account['authorizer_refresh_token'] = $authorizer_refresh_token;
  160. $insert_offical_account['appid'] = $authorizer_appid;
  161. $insert_offical_account['func_info'] = json_encode($authorization_info['func_info']);
  162. $insert_offical_account['is_auth'] = 1;
  163. $insert_offical_account['official_account_type'] = $official_account_type;
  164. $insert_offical_account['distribution_channel_id'] = $distribution_channel_id;
  165. v('authorizer_info_insert_data:');v($insert_offical_account);
  166. $this->WechatApi->save_official_account($insert_offical_account);
  167. // 自动生成菜单和模板消息,如果默认是登录或者支付公众号,则不生成菜单
  168. // TODO check下是否自动生成
  169. if(!in_array($official_account_type,array('third_platform_default_login','third_platform_pay'))){
  170. v('auto_set_menu:'.$authorizer_appid);
  171. $this->auto_set_menu_and_template($authorizer_appid,'all');
  172. }else{
  173. v('not_set_menu:'.$authorizer_appid);
  174. }
  175. $redirect_url .= "&distribution_channel_id=".$distribution_channel_id."&authorizer_appid=".$authorizer_appid."&success=1";
  176. }
  177. // 已存在的
  178. else{
  179. v('third_oauth_direct_return:'.$authorizer_appid.' distribution_channel_id:'.$distribution_channel_id);
  180. $redirect_url .= "&distribution_channel_id=".$distribution_channel_id."&success=0&msg=该服务号已经被渠道号:".$origin_distribution_channel_id." 授权,不能再次授权!";
  181. }
  182. }else{
  183. $redirect_url .= "&distribution_channel_id=".$distribution_channel_id."&success=0&msg=只支持认证的服务号!";
  184. }
  185. v('redirect_url:'.$redirect_url);
  186. // 跳转回去
  187. $this->redirect_url($redirect_url);
  188. }
  189. function auto_set_menu_and_template($authorizer_appid='',$set_type='all'){
  190. if(empty($authorizer_appid)){
  191. v('auto_set_menu_and_template_param_null:'.$authorizer_appid);
  192. return false;
  193. }
  194. parent::__construct($authorizer_appid);
  195. if($set_type == 'all'){
  196. $menu = new MenusController($this->param);
  197. $menu->set_menu();
  198. $template = new TemplateBasesController($this->param);
  199. $template->auto_set_dustry_templates();
  200. }elseif($set_type == 'menu'){
  201. $menu = new MenusController($this->param);
  202. $menu->set_menu();
  203. }elseif($set_type == 'template'){
  204. $template = new TemplateBasesController($this->param);
  205. $template->auto_set_dustry_templates();
  206. }else{
  207. v('auto_set_menu_and_template_invalid_set_type:'.$authorizer_appid);
  208. }
  209. }
  210. /**
  211. * 嘉言小说 wxdbc486f1b4f6a8c3
  212. http://zydy/oauth/auto_set_menu_and_template_test?set_type=menu&authorizer_appid=wxdbc486f1b4f6a8c3&timestamp=1511509543&sign=98dccc7b29e3c05e4b4367f488ff1966
  213. */
  214. function auto_set_menu_and_template_test(Request $request){
  215. $result = array('code'=>1,'msg'=>'','data'=>'');
  216. $authorizer_appid = $request->get('authorizer_appid');
  217. $set_type = $request->get('set_type');
  218. if(empty($authorizer_appid) || empty($set_type)){
  219. $result['code'] = 0;
  220. $result['msg'] = 'invalid param';
  221. json_echo($result);
  222. }
  223. $check_result = $this->check_sign_params($request);
  224. if($check_result['code'] == 0){
  225. $result['code'] = 0;
  226. $result['msg'] = $check_result['msg'];
  227. json_echo($result);
  228. }
  229. $this->auto_set_menu_and_template($authorizer_appid,$set_type);
  230. }
  231. }