diff --git a/app/index/controller/WechatController.php b/app/index/controller/WechatController.php index 2aa7bbc..7b6c419 100644 --- a/app/index/controller/WechatController.php +++ b/app/index/controller/WechatController.php @@ -140,10 +140,10 @@ class WechatController extends BaseController $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}"; try { - // 使用 GuzzleHttp 发送请求 - $client = new Client(); - $response = $client->get($url); - $data = json_decode($response->getBody(), true); + // 使用 GuzzleHttp 发送请求,禁用SSL验证 + $client = new Client([ + 'verify' => false + ]); $response = $client->get($url); $data = json_decode($response->getBody(), true); @@ -158,46 +158,70 @@ class WechatController extends BaseController } } - //获取登录二维码的 ticket + /** + * 获取微信登录二维码 + * @return \think\response\Json + */ public function getLoginTicket() { - // 获取access_token - $access_token = $this->getGZHAccessToken(); + try { + // 获取access_token + $access_token = $this->getGZHAccessToken(); + + // 构建请求URL - 使用正确的接口生成临时二维码 + $url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={$access_token}"; + + // 准备请求数据 - 生成临时二维码,有效期5分钟 + $postData = json_encode([ + 'expire_seconds' => 300, // 5分钟有效期 + 'action_name' => 'QR_STR_SCENE', + 'action_info' => [ + 'scene' => [ + 'scene_str' => md5(uniqid() . time()) // 生成唯一场景值 + ] + ] + ]); - // 构建请求URL - $url = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token={$access_token}&type=image"; + // 发送请求获取ticket + $client = new Client(['verify' => false]); + $response = $client->post($url, [ + 'body' => $postData, + 'headers' => [ + 'Content-Type' => 'application/json' + ] + ]); - // 准备二维码图片文件 - $file = request()->file('qrcode'); - if (!$file) { - return json(['code' => 1, 'msg' => '请上传二维码图片']); + $result = json_decode($response->getBody(), true); + + if (isset($result['errcode']) && $result['errcode'] != 0) { + return json(['code' => 1, 'msg' => '获取二维码失败:' . $result['errmsg']]); + } + + // 使用ticket获取二维码图片URL + $ticket = urlencode($result['ticket']); + $qrcodeUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket={$ticket}"; + + // 将场景值保存到缓存中,用于后续验证 + Cache::set('wx_login_scene_' . $result['ticket'], [ + 'scene_str' => $postData['action_info']['scene']['scene_str'], + 'create_time' => time(), + 'expire_time' => time() + 300 + ], 300); + + return json([ + 'code' => 0, + 'msg' => '获取二维码成功', + 'data' => [ + 'ticket' => $result['ticket'], + 'expire_seconds' => $result['expire_seconds'], + 'url' => $qrcodeUrl, + 'scene_str' => $postData['action_info']['scene']['scene_str'] + ] + ]); + + } catch (\Exception $e) { + Log::error('获取微信登录二维码失败:' . $e->getMessage()); + return json(['code' => 1, 'msg' => '获取二维码失败:' . $e->getMessage()]); } - - // 将文件转换为CURLFile对象 - $file_path = $file->getPathname(); - $file_name = $file->getOriginalName(); - $file_type = $file->getMime(); - - $data = [ - 'media' => new \CURLFile($file_path, $file_type, $file_name) - ]; - - // 发送请求获取ticket - $result = $this->curlPost($url, $data); - $response = json_decode($result, true); - - if (isset($response['errcode']) && $response['errcode'] != 0) { - return json(['code' => 1, 'msg' => '获取ticket失败:' . $response['errmsg']]); - } - - return json([ - 'code' => 0, - 'msg' => '获取ticket成功', - 'data' => [ - 'media_id' => $response['media_id'], - 'created_at' => $response['created_at'], - 'type' => $response['type'] - ] - ]); } } \ No newline at end of file