| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- package com.cslg.ppa.service.commom;
- import com.cslg.ppa.common.okhttp.MyCookieStore;
- import com.cslg.ppa.common.utils.HttpUtils;
- import com.cslg.ppa.dto.MailMessageDTO;
- import com.cslg.ppa.entity.commom.Article;
- import com.cslg.ppa.entity.commom.WxResultBody;
- import lombok.RequiredArgsConstructor;
- import lombok.extern.slf4j.Slf4j;
- import org.apache.commons.compress.utils.IOUtils;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.scheduling.annotation.Scheduled;
- import org.springframework.stereotype.Service;
- import org.springframework.util.CollectionUtils;
- import javax.swing.*;
- import java.io.*;
- import java.nio.file.Files;
- import java.nio.file.StandardCopyOption;
- import java.util.Collections;
- import java.util.List;
- import java.util.Map;
- import java.util.concurrent.*;
- @Slf4j
- @Service
- @RequiredArgsConstructor
- public class WeChatLoginCheckService {
- private final MailSendService emailService;
- private final FileManagerService fileManagerService;
- @Value("${FileDownloadUrl}")
- private String fileDownloadUrl;
- // 线程安全控制
- private volatile boolean isWaitingForLogin = false;
- /**
- * 定时检查微信登录状态(注释掉的定时任务需根据实际需求启用)
- */
- // @Scheduled(fixedRate = 30, timeUnit = TimeUnit.MINUTES)
- // @Scheduled(cron = "0 0/30 * * * ?")
- public void checkWeChatLoginStatus() throws Exception {
- log.info("开始检查微信登录状态...");
- if (isWaitingForLogin) {
- log.warn("系统正在等待扫码登录,跳过本次检查。");
- return;
- }
- String uaid = WeiXinApi.initCookieUaid();
- String uuid = WeiXinApi.initCookieUuid();
- String cookie = uaid + ";" + uuid;
- boolean isLoggedIn = WeiXinApi.checkLoginStatus(MyCookieStore.getToken(), cookie);
- if (!isLoggedIn) {
- log.warn("微信登录凭证已失效,准备发送登录二维码邮件...");
- isWaitingForLogin = true;
- sendLoginQRCodeEmail(cookie);
- } else {
- log.info("微信登录状态正常。");
- }
- }
- /**
- * 生成登录二维码并发送邮件(完整流程)
- */
- private void sendLoginQRCodeEmail(String cookie) {
- try {
- InputStream qrCodeInputStream = WeiXinApi.getQRCode(cookie);
- if (qrCodeInputStream == null) {
- log.error("获取微信登录二维码失败,输入流为空。");
- return;
- }
- File tempFile = File.createTempFile("qrCode_", ".jpg");
- tempFile.deleteOnExit();
- Files.copy(qrCodeInputStream, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
- List<String> ids = fileManagerService.uploadFileGetGuid2(Collections.singletonList(tempFile));
- if (!CollectionUtils.isEmpty(ids)) {
- String guid = ids.get(0);
- MailMessageDTO messageDTO = new MailMessageDTO();
- messageDTO.setUrl(fileDownloadUrl + guid);
- messageDTO.setEmail("2672485393@qq.com");
- emailService.sendEmail(messageDTO);
- log.info("已触发发送微信登录二维码邮件流程。");
- while (true) {
- // 假设接口需要cookie参数(需与后端确认)
- WxResultBody askQRCode = null;
- try {
- askQRCode = WeiXinApi.askQRCode(cookie);
- Integer status = askQRCode.getStatus();
- System.out.println(status);
- if (status == 3) {
- log.warn("二维码已过期");
- checkWeChatLoginStatus();
- break;
- } else if (status == 1) {
- handleLoginSuccess(cookie);
- break;
- }
- } catch (Exception ignored) {
- }
- }
- }
- } catch (Exception e) {
- log.error("生成或发送微信登录二维码邮件时发生错误: {}", e.getMessage(), e);
- }
- }
- /**
- * 处理登录成功逻辑
- */
- private void handleLoginSuccess(String cookie) {
- try {
- // 确认登录后,请求登录接口,拿到登录状态的cookie
- WxResultBody bizlogin = WeiXinApi.bizlogin(cookie);
- //重定向地址
- String redirect_url = bizlogin.getRedirect_url();
- //解析成键值对
- Map<String, String> loginRes = HttpUtils.parseQueryParams(redirect_url);
- //得到token
- String token = loginRes.get("token");
- System.out.println("------------------");
- System.out.println(cookie);
- System.out.println(token);
- //设置全局token值
- MyCookieStore.setToken(token);
- final String token1 = MyCookieStore.getToken();
- System.out.println("AAA:" + token1);
- try {
- WxResultBody<List<Article>> findExList = WeiXinApi.findExList("MzA4NDAzMjcyOA==", token, cookie);
- List<Article> exList = findExList.getApp_msg_list();
- System.out.println("=====================");
- System.out.println(exList);
- System.out.println(exList.size());
- } catch (Exception ignored) {
- }
- log.info("微信登录成功,token已保存: {}", token);
- } catch (Exception e) {
- log.error("处理登录成功失败: {}", e.getMessage(), e);
- }
- }
- }
|