|
@@ -0,0 +1,142 @@
|
|
|
+package com.boman.wechat.service.impl;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.boman.common.redis.RedisKey;
|
|
|
+import com.boman.common.redis.service.RedisService;
|
|
|
+import com.boman.domain.dto.AjaxResult;
|
|
|
+import com.boman.domain.form.LoginBody;
|
|
|
+import com.boman.wechat.config.WechatProperties;
|
|
|
+import com.boman.wechat.service.WechatService;
|
|
|
+import com.boman.wechat.utils.HttpClientUtils;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class WechatServiceImpl implements WechatService {
|
|
|
+
|
|
|
+ private static final Logger logger = LoggerFactory.getLogger(WechatServiceImpl.class);
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private RedisService redisService;
|
|
|
+ @Autowired
|
|
|
+ private WechatProperties properties;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public AjaxResult getWechatInfo(LoginBody loginBody) {
|
|
|
+ JSONObject infoJsonObject = new JSONObject();
|
|
|
+ String code = loginBody.getCode();
|
|
|
+ // 获取openId && sessionKey
|
|
|
+ String openId = "";
|
|
|
+ // 这里的ErrorCodeEnum是自定义错误字段,可以删除,用自己的方式处理
|
|
|
+ String sessionKey = "";
|
|
|
+
|
|
|
+ // logger报错的话,删掉就好,或者替换为自己的日志对象
|
|
|
+ logger.info("Start get SessionKey,loginRequest的数据为:" + JSONObject.toJSONString(loginBody));
|
|
|
+ JSONObject authInfo = null;
|
|
|
+ try {
|
|
|
+ authInfo = this.getSessionKeyAndOpenId(code);
|
|
|
+ }catch (Exception e) {
|
|
|
+ return AjaxResult.error(-1, "获取信息失败");
|
|
|
+ }
|
|
|
+ // 这里的ErrorCodeEnum是自定义错误字段,可以删除,用自己的方式处理
|
|
|
+ if(authInfo == null) {
|
|
|
+ return AjaxResult.error(-1, "未获取到认证");
|
|
|
+ }
|
|
|
+ logger.info("微信返回的数据:" + authInfo.toJSONString());
|
|
|
+ String errMsg = this.validatWechatInfo(authInfo);
|
|
|
+ if(StringUtils.isNotEmpty(errMsg)) {
|
|
|
+ return AjaxResult.error(-1, errMsg);
|
|
|
+ }
|
|
|
+ // 获取openId && sessionKey
|
|
|
+ openId = authInfo.getString("openid");
|
|
|
+ // 这里的ErrorCodeEnum是自定义错误字段,可以删除,用自己的方式处理
|
|
|
+ sessionKey = authInfo.getString("session_key");
|
|
|
+ // 根据code保存openId和sessionKey
|
|
|
+ JSONObject sessionObj = new JSONObject();
|
|
|
+ sessionObj.put("openId", openId);
|
|
|
+ sessionObj.put("sessionKey", sessionKey);
|
|
|
+ // sessionkey 保存到redis
|
|
|
+ redisService.setCacheObject(RedisKey.USER_OPPEN_ID_AND_SESSION_KEY_PREFIX + code, sessionObj.toJSONString(), 10L, TimeUnit.DAYS);
|
|
|
+ infoJsonObject.put("unionid", authInfo.get("unionid"));
|
|
|
+ infoJsonObject.put("openId", openId);
|
|
|
+ infoJsonObject.put("sessionKey", sessionKey);
|
|
|
+ logger.info("微信登陆验证返回的数据: " + infoJsonObject.toJSONString());
|
|
|
+ return AjaxResult.successZero(infoJsonObject);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public AjaxResult getTmpIds() {
|
|
|
+ String str = properties.getTemplateId();
|
|
|
+ String[] ids = str.split(",");
|
|
|
+ return AjaxResult.success(ids);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 解析返回的状态码对应的问题
|
|
|
+ *
|
|
|
+ * @param authInfo
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private String validatWechatInfo(JSONObject authInfo) {
|
|
|
+ String errMsg = "";
|
|
|
+ Integer errcode = (Integer) authInfo.get("errcode");
|
|
|
+ if(errcode == null) {
|
|
|
+ return errMsg;
|
|
|
+ }
|
|
|
+ switch (errcode) {
|
|
|
+ case -1:
|
|
|
+ errMsg = "系统繁忙,此时请开发者稍候再试";
|
|
|
+ break;
|
|
|
+ case 40029:
|
|
|
+ errMsg = "code 无效";
|
|
|
+ break;
|
|
|
+ case 41002:
|
|
|
+ errMsg = "appId 丢失";
|
|
|
+ break;
|
|
|
+ case 45011:
|
|
|
+ errMsg = "频率限制,每个用户每分钟100次";
|
|
|
+ case 40163:
|
|
|
+ errMsg = "code已经被使用";
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ errMsg = (String) authInfo.get("errmsg");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return errMsg;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取小程序验证信息
|
|
|
+ * @param code
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ private JSONObject getSessionKeyAndOpenId(String code) throws Exception {
|
|
|
+ Map<String, String> requestUrlParam = new HashMap<>();
|
|
|
+ // 小程序appId,自己补充
|
|
|
+ requestUrlParam.put("appid", properties.getAppId());
|
|
|
+ // 小程序secret,自己补充
|
|
|
+ requestUrlParam.put("secret", properties.getSecret());
|
|
|
+ // 小程序端返回的code
|
|
|
+ requestUrlParam.put("js_code", code);
|
|
|
+ // 默认参数
|
|
|
+ requestUrlParam.put("grant_type", properties.getGrantType());
|
|
|
+ // 发送post请求读取调用微信接口获取openid用户唯一标识
|
|
|
+ String result = HttpClientUtils.doGet(properties.getHost(), requestUrlParam);
|
|
|
+ if(StringUtils.isEmpty(result)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return JSON.parseObject(result);
|
|
|
+ }
|
|
|
+}
|