diff --git a/app/api/controller/StudentController.php b/app/api/controller/StudentController.php index 371d4f3..28f8c82 100644 --- a/app/api/controller/StudentController.php +++ b/app/api/controller/StudentController.php @@ -8,7 +8,7 @@ use support\Request; class StudentController extends BaseController { - protected $noNeedLogin = ['login']; + protected $noNeedLogin = ['login', 'getCode']; /** * @desc 登录 @@ -22,6 +22,20 @@ class StudentController extends BaseController return $this->json($res); } + /** + * @desc 获取code + * @param Request $request + * @return \support\Response + */ + public function getCode(Request $request) + { + $appid = getenv('WECHAT_APPID'); + $redirect_uri = urlencode(getenv('SERVER_DOMAIN') . "/h5/teacher#/pages/index/index");//重定向地址 + + $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=$redirect_uri&response_type=code&scope=snsapi_userinfo&state=STATE&connect_redirect=1#wechat_redirect"; + return redirect($url); + } + /** * @desc 学生信息 * @param Request $request @@ -34,4 +48,10 @@ class StudentController extends BaseController return $this->json($res); } + public function updateOpenid(Request $request) + { + $service = new StudentService(); + + } + } \ No newline at end of file diff --git a/app/api/controller/TeacherController.php b/app/api/controller/TeacherController.php index 87e3c6c..100be8b 100644 --- a/app/api/controller/TeacherController.php +++ b/app/api/controller/TeacherController.php @@ -9,7 +9,7 @@ use support\Request; class TeacherController extends BaseController { - protected $noNeedLogin = ['login']; + protected $noNeedLogin = ['login', 'getCode']; public function login(Request $request) { @@ -19,6 +19,20 @@ class TeacherController extends BaseController } + /** + * @desc 获取code + * @param Request $request + * @return \support\Response + */ + public function getCode(Request $request) + { + $appid = getenv('WECHAT_APPID'); + $redirect_uri = urlencode(getenv('SERVER_DOMAIN') . "/h5/teacher#/pages/login/login");//重定向地址 + + $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=$redirect_uri&response_type=code&scope=snsapi_userinfo&state=STATE&connect_redirect=1#wechat_redirect"; + return redirect($url); + } + /** * @desc 设置时区 * @param Request $request @@ -43,5 +57,13 @@ class TeacherController extends BaseController return $this->json($res); } + public function updateOpenid(Request $request) + { + $service = new TeacherService(); + $res = $service->updateOpenid($request); + return $this->json($res); + + } + } \ No newline at end of file diff --git a/app/api/controller/WechatSubscriptController.php b/app/api/controller/WechatSubscriptController.php index d8b445f..a747634 100644 --- a/app/api/controller/WechatSubscriptController.php +++ b/app/api/controller/WechatSubscriptController.php @@ -4,22 +4,69 @@ namespace app\api\controller; use app\BaseController; use app\constant\ResponseCode; +use GuzzleHttp\Client; use support\Request; +use think\Exception; class WechatSubscriptController extends BaseController { protected $noNeedLogin = ['*']; + const GENERAL_ACCESS_TOKEN = 'general_access_token'; + const CODE_ACCESS_TOKEN = 'code_access_token'; + const BASE_URI = 'https://api.weixin.qq.com'; public function getCode(Request $request) { $appid = getenv('WECHAT_APPID'); - $redirect_uri = urlencode(getenv('SERVER_DOMAIN') . "/index.html#/pages/login/login ");//重定向地址 + if($request->all('client') == 'student'){ + $redirect_uri = urlencode(getenv('SERVER_DOMAIN') . "/h5/student#/pages/login/login");//重定向地址 + }else{ + $redirect_uri = urlencode(getenv('SERVER_DOMAIN') . "/h5/teacher#/pages/login/login");//重定向地址 + } + $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=$redirect_uri&response_type=code&scope=snsapi_userinfo&state=STATE&connect_redirect=1#wechat_redirect"; - return $this->json([ - 'code' => ResponseCode::SUCCESS, - 'data' => $url - ]); + return redirect($url); + } + + + + /** + * @desc 获取网页授权code的access_token + * @param $code + * @return array|void + * @throws \GuzzleHttp\Exception\GuzzleException + */ + public static function getCodeAccessToken($code) + { + try { + $client = new Client(['base_uri'=>self::BASE_URI]); + $response = $client->request('get', 'sns/oauth2/access_token', [ + 'query' => [ + 'appid' => getenv('APPID'), + 'secret' => getenv('APPSECRET'), + 'code'=>$code, + 'grant_type'=>'authorization_code' + ] + ]); + + $response_contents = $response->getBody()->getContents(); + raw_log('wechat/code_access_token', ['result' => $response_contents]); + if ($response->getStatusCode() == 200) { + $result = json_decode($response_contents, true); + raw_log('wechat/code_access_token', ['result' => $result]); + if (isset($result['errcode'])) { + throw new Exception($result['errmsg']); + } + return $result; + } + + }catch (Exception $e){ + return [ + 'code'=>ResponseCode::FAIL, + 'msg'=>$e->getMessage() + ]; + } } } \ No newline at end of file diff --git a/app/common/service/StudentService.php b/app/common/service/StudentService.php index 74534dc..51520d0 100644 --- a/app/common/service/StudentService.php +++ b/app/common/service/StudentService.php @@ -2,6 +2,7 @@ namespace app\common\service; +use app\api\controller\WechatSubscriptController; use app\common\model\Student; use app\constant\ResponseCode; use think\Exception; @@ -79,4 +80,45 @@ class StudentService } } + + /** + * @desc 更新code + * @param $request + * @return array|void + * @throws \GuzzleHttp\Exception\GuzzleException + */ + public function updateOpenid($request) + { + try { + if(empty($request->teacher)){ + throw new Exception('请先教师登陆'); + } + $teacher = Student::where(['id' => $request->teacher->id])->findOrEmpty(); + if($teacher->isEmpty()){ + throw new Exception('未找到教师信息'); + } + + $data = $request->post('code'); + $user_info = WechatSubscriptController::getCodeAccessToken($data['code']); + if (isset($result['code'])) { + $message = '获取信息失败'; + } + $openid = $user_info['openid']; + $teacher = Student::where(['id'=>$request->teacher->id])->findOrEmpty(); + $teacher->save([ + 'openid' => $openid, + ]); + + return [ + 'code' => ResponseCode::SUCCESS, + 'msg' => 'success' + ]; + }catch (Exception $e){ + return [ + 'code' => ResponseCode::FAIL, + 'msg' => $e->getMessage() + ]; + } + } + } \ No newline at end of file diff --git a/app/common/service/TeacherService.php b/app/common/service/TeacherService.php index 56fc93c..baf3e3c 100644 --- a/app/common/service/TeacherService.php +++ b/app/common/service/TeacherService.php @@ -2,6 +2,7 @@ namespace app\common\service; +use app\api\controller\WechatSubscriptController; use app\common\model\Teacher; use app\common\model\TimeZone; use app\constant\ResponseCode; @@ -115,4 +116,44 @@ class TeacherService } } + /** + * @desc 更新code + * @param $request + * @return array|void + * @throws \GuzzleHttp\Exception\GuzzleException + */ + public function updateOpenid($request) + { + try { + if(empty($request->teacher)){ + throw new Exception('请先教师登陆'); + } + $teacher = Teacher::where(['id' => $request->teacher->id])->findOrEmpty(); + if($teacher->isEmpty()){ + throw new Exception('未找到教师信息'); + } + + $data = $request->post('code'); + $user_info = WechatSubscriptController::getCodeAccessToken($data['code']); + if (isset($result['code'])) { + $message = '获取信息失败'; + } + $openid = $user_info['openid']; + $teacher = Teacher::where(['id'=>$request->teacher->id])->findOrEmpty(); + $teacher->save([ + 'openid' => $openid, + ]); + + return [ + 'code' => ResponseCode::SUCCESS, + 'msg' => 'success' + ]; + }catch (Exception $e){ + return [ + 'code' => ResponseCode::FAIL, + 'msg' => $e->getMessage() + ]; + } + } + } \ No newline at end of file