DingTalkAuthService.java 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package com.malk.guangming.service;
  2. import com.malk.guangming.config.GuangmingConfig;
  3. import com.malk.service.dingtalk.DDClient;
  4. import com.malk.service.dingtalk.DDClient_Contacts;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Service;
  8. import java.util.Map;
  9. @Slf4j
  10. @Service
  11. public class DingTalkAuthService {
  12. @Autowired
  13. private GuangmingConfig config;
  14. @Autowired
  15. private DDClient ddClient;
  16. @Autowired
  17. private DDClient_Contacts ddClientContacts;
  18. /**
  19. * 通过免登授权码获取用户userId
  20. *
  21. * @param authCode 前端JSAPI获取的免登授权码
  22. * @return 用户userId
  23. */
  24. public String getUserId(String authCode) {
  25. String accessToken = ddClient.getAccessToken(
  26. config.getDingtalk().getAppKey(),
  27. config.getDingtalk().getAppSecret());
  28. Map userInfo = ddClient.getUserInfoByCode(accessToken, authCode);
  29. return userInfo.get("userid").toString();
  30. }
  31. /**
  32. * 根据userId获取用户邮箱
  33. *
  34. * @param userId 钉钉用户ID
  35. * @return 用户企业邮箱
  36. */
  37. public String getUserEmail(String userId) {
  38. String accessToken = ddClient.getAccessToken(
  39. config.getDingtalk().getAppKey(),
  40. config.getDingtalk().getAppSecret());
  41. Map userInfo = ddClientContacts.getUserInfoById(accessToken, userId);
  42. // 优先取企业邮箱(org_email),其次取个人邮箱(email)
  43. Object orgEmail = userInfo.get("org_email");
  44. if (orgEmail != null && !orgEmail.toString().isEmpty()) {
  45. return orgEmail.toString();
  46. }
  47. Object email = userInfo.get("email");
  48. if (email != null && !email.toString().isEmpty()) {
  49. return email.toString();
  50. }
  51. log.error("[钉钉] 用户 {} 未配置邮箱, 返回字段: {}", userId, userInfo.keySet());
  52. throw new RuntimeException("该用户未配置企业邮箱");
  53. }
  54. }