更新wechat,增加获取登陆二维码

This commit is contained in:
云泽网 2025-06-05 23:31:37 +08:00
parent c1038b7337
commit 9b981b68e7

View File

@ -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}"; $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";
try { try {
// 使用 GuzzleHttp 发送请求 // 使用 GuzzleHttp 发送请求禁用SSL验证
$client = new Client(); $client = new Client([
$response = $client->get($url); 'verify' => false
$data = json_decode($response->getBody(), true); ]);
$response = $client->get($url); $response = $client->get($url);
$data = json_decode($response->getBody(), true); $data = json_decode($response->getBody(), true);
@ -158,46 +158,70 @@ class WechatController extends BaseController
} }
} }
//获取登录二维码的 ticket /**
* 获取微信登录二维码
* @return \think\response\Json
*/
public function getLoginTicket() public function getLoginTicket()
{ {
// 获取access_token try {
$access_token = $this->getGZHAccessToken(); // 获取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 // 发送请求获取ticket
$url = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token={$access_token}&type=image"; $client = new Client(['verify' => false]);
$response = $client->post($url, [
'body' => $postData,
'headers' => [
'Content-Type' => 'application/json'
]
]);
// 准备二维码图片文件 $result = json_decode($response->getBody(), true);
$file = request()->file('qrcode');
if (!$file) { if (isset($result['errcode']) && $result['errcode'] != 0) {
return json(['code' => 1, 'msg' => '请上传二维码图片']); 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']
]
]);
} }
} }