WeChatLoginCheckService.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. package com.cslg.ppa.service.commom;
  2. import com.cslg.ppa.common.okhttp.MyCookieStore;
  3. import com.cslg.ppa.common.utils.HttpUtils;
  4. import com.cslg.ppa.dto.MailMessageDTO;
  5. import com.cslg.ppa.entity.commom.Article;
  6. import com.cslg.ppa.entity.commom.WxResultBody;
  7. import lombok.RequiredArgsConstructor;
  8. import lombok.extern.slf4j.Slf4j;
  9. import org.apache.commons.compress.utils.IOUtils;
  10. import org.springframework.beans.factory.annotation.Value;
  11. import org.springframework.scheduling.annotation.Scheduled;
  12. import org.springframework.stereotype.Service;
  13. import org.springframework.util.CollectionUtils;
  14. import javax.swing.*;
  15. import java.io.*;
  16. import java.nio.file.Files;
  17. import java.nio.file.StandardCopyOption;
  18. import java.util.Collections;
  19. import java.util.List;
  20. import java.util.Map;
  21. import java.util.concurrent.*;
  22. @Slf4j
  23. @Service
  24. @RequiredArgsConstructor
  25. public class WeChatLoginCheckService {
  26. private final MailSendService emailService;
  27. private final FileManagerService fileManagerService;
  28. @Value("${FileDownloadUrl}")
  29. private String fileDownloadUrl;
  30. // 线程安全控制
  31. private volatile boolean isWaitingForLogin = false;
  32. /**
  33. * 定时检查微信登录状态(注释掉的定时任务需根据实际需求启用)
  34. */
  35. // @Scheduled(fixedRate = 30, timeUnit = TimeUnit.MINUTES)
  36. // @Scheduled(cron = "0 0/30 * * * ?")
  37. public void checkWeChatLoginStatus() throws Exception {
  38. log.info("开始检查微信登录状态...");
  39. if (isWaitingForLogin) {
  40. log.warn("系统正在等待扫码登录,跳过本次检查。");
  41. return;
  42. }
  43. String uaid = WeiXinApi.initCookieUaid();
  44. String uuid = WeiXinApi.initCookieUuid();
  45. String cookie = uaid + ";" + uuid;
  46. boolean isLoggedIn = WeiXinApi.checkLoginStatus(MyCookieStore.getToken(), cookie);
  47. if (!isLoggedIn) {
  48. log.warn("微信登录凭证已失效,准备发送登录二维码邮件...");
  49. isWaitingForLogin = true;
  50. sendLoginQRCodeEmail(cookie);
  51. } else {
  52. log.info("微信登录状态正常。");
  53. }
  54. }
  55. /**
  56. * 生成登录二维码并发送邮件(完整流程)
  57. */
  58. private void sendLoginQRCodeEmail(String cookie) {
  59. try {
  60. InputStream qrCodeInputStream = WeiXinApi.getQRCode(cookie);
  61. if (qrCodeInputStream == null) {
  62. log.error("获取微信登录二维码失败,输入流为空。");
  63. return;
  64. }
  65. File tempFile = File.createTempFile("qrCode_", ".jpg");
  66. tempFile.deleteOnExit();
  67. Files.copy(qrCodeInputStream, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
  68. List<String> ids = fileManagerService.uploadFileGetGuid2(Collections.singletonList(tempFile));
  69. if (!CollectionUtils.isEmpty(ids)) {
  70. String guid = ids.get(0);
  71. MailMessageDTO messageDTO = new MailMessageDTO();
  72. messageDTO.setUrl(fileDownloadUrl + guid);
  73. messageDTO.setEmail("2672485393@qq.com");
  74. emailService.sendEmail(messageDTO);
  75. log.info("已触发发送微信登录二维码邮件流程。");
  76. while (true) {
  77. // 假设接口需要cookie参数(需与后端确认)
  78. WxResultBody askQRCode = null;
  79. try {
  80. askQRCode = WeiXinApi.askQRCode(cookie);
  81. Integer status = askQRCode.getStatus();
  82. System.out.println(status);
  83. if (status == 3) {
  84. log.warn("二维码已过期");
  85. checkWeChatLoginStatus();
  86. break;
  87. } else if (status == 1) {
  88. handleLoginSuccess(cookie);
  89. break;
  90. }
  91. } catch (Exception ignored) {
  92. }
  93. }
  94. }
  95. } catch (Exception e) {
  96. log.error("生成或发送微信登录二维码邮件时发生错误: {}", e.getMessage(), e);
  97. }
  98. }
  99. /**
  100. * 处理登录成功逻辑
  101. */
  102. private void handleLoginSuccess(String cookie) {
  103. try {
  104. // 确认登录后,请求登录接口,拿到登录状态的cookie
  105. WxResultBody bizlogin = WeiXinApi.bizlogin(cookie);
  106. //重定向地址
  107. String redirect_url = bizlogin.getRedirect_url();
  108. //解析成键值对
  109. Map<String, String> loginRes = HttpUtils.parseQueryParams(redirect_url);
  110. //得到token
  111. String token = loginRes.get("token");
  112. System.out.println("------------------");
  113. System.out.println(cookie);
  114. System.out.println(token);
  115. //设置全局token值
  116. MyCookieStore.setToken(token);
  117. final String token1 = MyCookieStore.getToken();
  118. System.out.println("AAA:" + token1);
  119. try {
  120. WxResultBody<List<Article>> findExList = WeiXinApi.findExList("MzA4NDAzMjcyOA==", token, cookie);
  121. List<Article> exList = findExList.getApp_msg_list();
  122. System.out.println("=====================");
  123. System.out.println(exList);
  124. System.out.println(exList.size());
  125. } catch (Exception ignored) {
  126. }
  127. log.info("微信登录成功,token已保存: {}", token);
  128. } catch (Exception e) {
  129. log.error("处理登录成功失败: {}", e.getMessage(), e);
  130. }
  131. }
  132. }