WechatServiceImpl.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package com.boman.wechat.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.boman.common.redis.RedisKey;
  5. import com.boman.common.redis.service.RedisService;
  6. import com.boman.domain.dto.AjaxResult;
  7. import com.boman.domain.form.LoginBody;
  8. import com.boman.wechat.config.WechatProperties;
  9. import com.boman.wechat.service.WechatService;
  10. import com.boman.wechat.utils.HttpClientUtils;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.apache.commons.lang3.StringUtils;
  13. import org.slf4j.Logger;
  14. import org.slf4j.LoggerFactory;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.stereotype.Service;
  17. import javax.annotation.Resource;
  18. import java.util.HashMap;
  19. import java.util.Map;
  20. import java.util.concurrent.TimeUnit;
  21. @Slf4j
  22. @Service
  23. public class WechatServiceImpl implements WechatService {
  24. private static final Logger logger = LoggerFactory.getLogger(WechatServiceImpl.class);
  25. @Resource
  26. private RedisService redisService;
  27. @Autowired
  28. private WechatProperties properties;
  29. @Override
  30. public AjaxResult getWechatInfo(LoginBody loginBody) {
  31. JSONObject infoJsonObject = new JSONObject();
  32. String code = loginBody.getCode();
  33. // 获取openId && sessionKey
  34. String openId = "";
  35. // 这里的ErrorCodeEnum是自定义错误字段,可以删除,用自己的方式处理
  36. String sessionKey = "";
  37. // logger报错的话,删掉就好,或者替换为自己的日志对象
  38. logger.info("Start get SessionKey,loginRequest的数据为:" + JSONObject.toJSONString(loginBody));
  39. JSONObject authInfo = null;
  40. try {
  41. authInfo = this.getSessionKeyAndOpenId(code);
  42. }catch (Exception e) {
  43. return AjaxResult.error(-1, "获取信息失败");
  44. }
  45. // 这里的ErrorCodeEnum是自定义错误字段,可以删除,用自己的方式处理
  46. if(authInfo == null) {
  47. return AjaxResult.error(-1, "未获取到认证");
  48. }
  49. String errMsg = this.validatWechatInfo(authInfo);
  50. if(StringUtils.isNotEmpty(errMsg)) {
  51. return AjaxResult.error(-1, errMsg);
  52. }
  53. // 获取openId && sessionKey
  54. openId = authInfo.getString("openid");
  55. // 这里的ErrorCodeEnum是自定义错误字段,可以删除,用自己的方式处理
  56. sessionKey = authInfo.getString("session_key");
  57. // 根据code保存openId和sessionKey
  58. JSONObject sessionObj = new JSONObject();
  59. sessionObj.put("openId", openId);
  60. sessionObj.put("sessionKey", sessionKey);
  61. // sessionkey 保存到redis
  62. redisService.setCacheObject(RedisKey.USER_OPPEN_ID_AND_SESSION_KEY_PREFIX, sessionObj.toJSONString(), 10L, TimeUnit.DAYS);
  63. infoJsonObject.put("unionid", authInfo.get("unionid"));
  64. infoJsonObject.put("openId", openId);
  65. infoJsonObject.put("sessionKey", sessionKey);
  66. return AjaxResult.successZero(infoJsonObject);
  67. }
  68. private String validatWechatInfo(JSONObject authInfo) {
  69. String errMsg = "";
  70. int errcode = (Integer) authInfo.get("errcode");
  71. switch (errcode) {
  72. case -1:
  73. errMsg = "系统繁忙,此时请开发者稍候再试";
  74. break;
  75. case 40029:
  76. errMsg = "code 无效";
  77. break;
  78. case 41002:
  79. errMsg = "appId 丢失";
  80. break;
  81. case 45011:
  82. errMsg = "频率限制,每个用户每分钟100次";
  83. break;
  84. default:
  85. errMsg = "信息接口调用未知错误";
  86. break;
  87. }
  88. return errMsg;
  89. }
  90. /**
  91. * 获取小程序验证信息
  92. * @param code
  93. * @return
  94. * @throws Exception
  95. */
  96. private JSONObject getSessionKeyAndOpenId(String code) throws Exception {
  97. Map<String, String> requestUrlParam = new HashMap<>();
  98. // 小程序appId,自己补充
  99. requestUrlParam.put("appid", properties.getAppId());
  100. // 小程序secret,自己补充
  101. requestUrlParam.put("secret", properties.getSecret());
  102. // 小程序端返回的code
  103. requestUrlParam.put("js_code", code);
  104. // 默认参数
  105. requestUrlParam.put("grant_type", properties.getGrantType());
  106. // 发送post请求读取调用微信接口获取openid用户唯一标识
  107. String result = HttpClientUtils.doGet(properties.getHost(), requestUrlParam);
  108. return JSON.parseObject(result);
  109. }
  110. }