110 lines
3.6 KiB
PHP
110 lines
3.6 KiB
PHP
<?php
|
|
|
|
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');
|
|
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 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('APP_ID'),
|
|
'secret' => getenv('APP_SECRET'),
|
|
'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()
|
|
];
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* @desc 获取微信用户信息
|
|
* @param $openid
|
|
* @param $access_token
|
|
* @return array|mixed|void
|
|
* @throws \GuzzleHttp\Exception\GuzzleException
|
|
*/
|
|
public static function getUserInfo($openid, $access_token)
|
|
{
|
|
try {
|
|
$client = new Client(['base_uri' => self::BASE_URI]);
|
|
$response = $client->request('get', 'sns/userinfo', [
|
|
'query' => [
|
|
'access_token' => $access_token,
|
|
'openid' => $openid,
|
|
'lang' => 'zh_CN',
|
|
]
|
|
]);
|
|
|
|
$response_contents = $response->getBody()->getContents();
|
|
raw_log('wechat/get_user_info', ['result' => $response_contents]);
|
|
if ($response->getStatusCode() == 200) {
|
|
$result = json_decode($response_contents, true);
|
|
raw_log('wechat/get_user_info', ['result' => $result]);
|
|
if (isset($result['errcode'])) {
|
|
throw new Exception($result['errmsg']);
|
|
}
|
|
return $result;
|
|
}
|
|
}catch (Exception $e) {
|
|
return [
|
|
'code' => ResponseCode::FAIL,
|
|
'msg' => $e->getMessage()
|
|
];
|
|
}
|
|
}
|
|
|
|
}
|