java110 4 lat temu
rodzic
commit
c7760529a1

+ 2 - 0
service-api/src/main/java/com/java110/api/configuration/ServiceConfiguration.java

@@ -48,6 +48,8 @@ public class ServiceConfiguration {
         exclusions.append("/app/wechat/gateway,");//微信公众号对接接口
         exclusions.append("/app/loginOwnerWechatAuth,");//微信公众号对接接口
         exclusions.append("/app/refreshToken,");//微信公众号对接接口
+        exclusions.append("/app/refreshOpenId,");//微信公众号对接接口
+        exclusions.append("/app/openServiceNotifyOpenId,");//微信公众号对接接口
         exclusions.append("/app/renting/queryRentingPool,");//微信公众号对接接口
         exclusions.append("/app/activitiesType/queryActivitiesType,");//查询大类
         exclusions.append("/app/product/queryProductLabel,");//查询大类

+ 46 - 8
service-api/src/main/java/com/java110/api/controller/app/OwnerController.java

@@ -16,12 +16,12 @@
 package com.java110.api.controller.app;
 
 import com.alibaba.fastjson.JSONObject;
+import com.java110.api.smo.login.IOwnerAppLoginSMO;
 import com.java110.api.smo.login.IWxLoginSMO;
 import com.java110.api.smo.staff.IStaffAuthSMO;
 import com.java110.core.base.controller.BaseController;
 import com.java110.core.context.IPageData;
 import com.java110.core.context.PageData;
-import com.java110.api.smo.login.IOwnerAppLoginSMO;
 import com.java110.core.factory.WechatFactory;
 import com.java110.utils.cache.CommonCache;
 import com.java110.utils.constant.CommonConstant;
@@ -32,7 +32,11 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -66,7 +70,7 @@ public class OwnerController extends BaseController {
     public ResponseEntity<String> loginOwner(@RequestBody String postInfo, HttpServletRequest request) {
         /*IPageData pd = (IPageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA);*/
         String appId = request.getHeader("APP_ID");
-        if(StringUtil.isEmpty(appId)){
+        if (StringUtil.isEmpty(appId)) {
             appId = request.getHeader("APP-ID");
         }
         IPageData pd = PageData.newInstance().builder("", "", "", postInfo,
@@ -93,7 +97,7 @@ public class OwnerController extends BaseController {
     public ResponseEntity<String> loginOwnerByKey(@RequestBody String postInfo, HttpServletRequest request) {
         /*IPageData pd = (IPageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA);*/
         String appId = request.getHeader("APP_ID");
-        if(StringUtil.isEmpty(appId)){
+        if (StringUtil.isEmpty(appId)) {
             appId = request.getHeader("APP-ID");
         }
         IPageData pd = PageData.newInstance().builder("", "", "", postInfo,
@@ -123,7 +127,7 @@ public class OwnerController extends BaseController {
         IPageData pd = PageData.newInstance().builder("", "", "", JSONObject.toJSONString(params),
                 "login", "", "", "", appId
         );
-        ResponseEntity responseEntity = ownerAppLoginSMOImpl.getPageAccessToken(pd,request);
+        ResponseEntity responseEntity = ownerAppLoginSMOImpl.getPageAccessToken(pd, request);
         request.setAttribute(CommonConstant.CONTEXT_PAGE_DATA, pd);
         return responseEntity;
     }
@@ -142,17 +146,51 @@ public class OwnerController extends BaseController {
         IPageData pd = PageData.newInstance().builder("", "", "", "",
                 "login", "", "", "", request.getHeader("app-id")
         );
-        return ownerAppLoginSMOImpl.refreshToken(pd, redirectUrl,errorUrl,loginFlag, request, response);
+        return ownerAppLoginSMOImpl.refreshToken(pd, redirectUrl, errorUrl, loginFlag, request, response);
+
+    }
+
+    /**
+     * 微信登录接口
+     *
+     * @param request
+     */
+    @RequestMapping(path = "/openServiceNotifyOpenId")
+    public ResponseEntity<String> openServiceNotifyOpenId(HttpServletRequest request) {
+
+        Map<String, String> params = getParameterStringMap(request);
+        String appId = params.get("appId");
+        IPageData pd = PageData.newInstance().builder("", "", "", JSONObject.toJSONString(params),
+                "login", "", "", "", appId
+        );
+        ResponseEntity responseEntity = ownerAppLoginSMOImpl.openServiceNotifyOpenId(pd, request);
+        request.setAttribute(CommonConstant.CONTEXT_PAGE_DATA, pd);
+        return responseEntity;
+    }
+
+    /**
+     * 微信公众号号鉴权
+     *
+     * @param request
+     */
+    @RequestMapping(path = "/refreshOpenId")
+    public ResponseEntity<String> refreshOpenId(@RequestParam String redirectUrl,
+                                                @RequestParam String wAppId,
+                                                HttpServletRequest request,
+                                                HttpServletResponse response) {
+        IPageData pd = PageData.newInstance().builder("", "", "", "",
+                "login", "", "", "", request.getHeader("app-id")
+        );
+        return ownerAppLoginSMOImpl.refreshOpenId(pd, redirectUrl,wAppId, request, response);
 
     }
 
     @RequestMapping(path = "/getWId")
-    public ResponseEntity<String> getWId(@RequestParam String appId){
+    public ResponseEntity<String> getWId(@RequestParam String appId) {
         return ResultVo.createResponseEntity(WechatFactory.getWId(appId));
     }
 
 
-
     /**
      * 微信登录接口
      * /app/loginStaffWechatAuth

+ 2 - 0
service-api/src/main/java/com/java110/api/controller/app/WechatGatewayController.java

@@ -220,4 +220,6 @@ public class WechatGatewayController extends BaseController {
 
         return token;
     }
+
+
 }

+ 14 - 1
service-api/src/main/java/com/java110/api/smo/login/IOwnerAppLoginSMO.java

@@ -39,7 +39,7 @@ public interface IOwnerAppLoginSMO {
      * @return
      * @throws SMOException
      */
-    ResponseEntity<String> getPageAccessToken(IPageData pd,HttpServletRequest request) throws SMOException;
+    ResponseEntity<String> getPageAccessToken(IPageData pd, HttpServletRequest request) throws SMOException;
 
 
     /**
@@ -52,4 +52,17 @@ public interface IOwnerAppLoginSMO {
     ResponseEntity<String> refreshToken(IPageData pd, String redirectUrl, String errorUrl,
                                         String loginFlag,
                                         HttpServletRequest request, HttpServletResponse response) throws SMOException;
+
+    /**
+     * 刷新openId
+     *
+     * @param pd
+     * @param redirectUrl
+     * @param request
+     * @param response
+     * @return
+     */
+    ResponseEntity<String> refreshOpenId(IPageData pd, String redirectUrl, String wAppId, HttpServletRequest request, HttpServletResponse response);
+
+    ResponseEntity openServiceNotifyOpenId(IPageData pd, HttpServletRequest request);
 }

+ 103 - 5
service-api/src/main/java/com/java110/api/smo/login/impl/OwnerAppLoginSMOImpl.java

@@ -2,8 +2,9 @@ package com.java110.api.smo.login.impl;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.java110.api.properties.WechatAuthProperties;
 import com.java110.api.smo.DefaultAbstractComponentSMO;
-import com.java110.core.base.smo.front.AbstractFrontServiceSMO;
+import com.java110.api.smo.login.IOwnerAppLoginSMO;
 import com.java110.core.context.IPageData;
 import com.java110.core.context.PageData;
 import com.java110.core.factory.AuthenticationFactory;
@@ -11,10 +12,11 @@ import com.java110.core.factory.WechatFactory;
 import com.java110.dto.owner.OwnerAppUserDto;
 import com.java110.dto.smallWeChat.SmallWeChatDto;
 import com.java110.dto.user.UserDto;
-import com.java110.api.properties.WechatAuthProperties;
-import com.java110.api.smo.login.IOwnerAppLoginSMO;
 import com.java110.utils.cache.CommonCache;
-import com.java110.utils.constant.*;
+import com.java110.utils.constant.CommonConstant;
+import com.java110.utils.constant.ResponseConstant;
+import com.java110.utils.constant.ServiceCodeConstant;
+import com.java110.utils.constant.WechatConstant;
 import com.java110.utils.exception.SMOException;
 import com.java110.utils.util.Assert;
 import com.java110.utils.util.Base64Convert;
@@ -377,6 +379,102 @@ public class OwnerAppLoginSMOImpl extends DefaultAbstractComponentSMO implements
         return ResultVo.createResponseEntity(ResultVo.CODE_MACHINE_OK, ResultVo.MSG_OK, urlObj);
     }
 
+    @Override
+    public ResponseEntity<String> refreshOpenId(IPageData pd, String redirectUrl, String wAppId, HttpServletRequest request, HttpServletResponse response) {
+        //分配urlCode
+        String urlCode = UUID.randomUUID().toString();
+        JSONObject param = new JSONObject();
+        param.put("redirectUrl", redirectUrl);
+        CommonCache.setValue(urlCode, param.toJSONString(), expireTime);
+        SmallWeChatDto smallWeChatDto = null;
+        if (!StringUtil.isEmpty(wAppId)) {
+            JSONObject paramIn = new JSONObject();
+            paramIn.put("appId", wAppId);
+            smallWeChatDto = getSmallWechat(pd, paramIn);
+        }
+        if (smallWeChatDto == null) { //从配置文件中获取 小程序配置信息
+            smallWeChatDto = new SmallWeChatDto();
+            smallWeChatDto.setAppId(wechatAuthProperties.getWechatAppId());
+            smallWeChatDto.setAppSecret(wechatAuthProperties.getWechatAppSecret());
+            smallWeChatDto.setMchId(wechatAuthProperties.getMchId());
+            smallWeChatDto.setPayPassword(wechatAuthProperties.getKey());
+        }
+
+        URL url = null;
+        String openUrl = "";
+        try {
+            url = new URL(redirectUrl);
+
+            String newUrl = url.getProtocol() + "://" + url.getHost();
+            if (url.getPort() > 0) {
+                newUrl += (":" + url.getPort());
+            }
+
+            openUrl = WechatConstant.OPEN_AUTH
+                    .replace("APPID", smallWeChatDto.getAppId())
+                    .replace("SCOPE", "snsapi_userinfo")
+                    .replace(
+                            "REDIRECT_URL",
+                            URLEncoder
+                                    .encode(
+                                            (newUrl
+                                                    + "/app/openServiceNotifyOpenId?appId=992020061452450002&urlCode=" +
+                                                    urlCode + "&wId=" + WechatFactory.getWId(wAppId)),
+                                            "UTF-8")).replace("STATE", "1");
+
+        } catch (Exception e) {
+            logger.error("微信公众号鉴权 redirectUrl 错误 " + redirectUrl, e);
+            throw new SMOException(ResponseConstant.RESULT_CODE_ERROR, e.getLocalizedMessage());
+        }
+        return ResultVo.redirectPage(openUrl);
+    }
+
+    @Override
+    public ResponseEntity openServiceNotifyOpenId(IPageData pd, HttpServletRequest request) {
+        JSONObject paramIn = JSONObject.parseObject(pd.getReqData());
+        String authCode = paramIn.getString("code");
+        String state = paramIn.getString("state");
+        String paramStr = CommonCache.getAndRemoveValue(paramIn.getString("urlCode"));
+
+        if (StringUtil.isEmpty(paramStr)) {
+            return ResultVo.redirectPage("/");
+        }
+
+        JSONObject param = JSONObject.parseObject(paramStr);
+        String redirectUrl = param.getString("redirectUrl");
+        String wId = paramIn.getString("wId");
+        SmallWeChatDto smallWeChatDto = null;
+        if (!StringUtil.isEmpty(wId)) {
+            paramIn.put("appId", WechatFactory.getAppId(wId));
+            smallWeChatDto = getSmallWechat(pd, paramIn);
+        }
+        if (smallWeChatDto == null) { //从配置文件中获取 小程序配置信息
+            smallWeChatDto = new SmallWeChatDto();
+            smallWeChatDto.setAppId(wechatAuthProperties.getWechatAppId());
+            smallWeChatDto.setAppSecret(wechatAuthProperties.getWechatAppSecret());
+            smallWeChatDto.setMchId(wechatAuthProperties.getMchId());
+            smallWeChatDto.setPayPassword(wechatAuthProperties.getKey());
+        }
+
+        String url = WechatConstant.APP_GET_ACCESS_TOKEN_URL.replace("APPID", smallWeChatDto.getAppId())
+                .replace("SECRET", smallWeChatDto.getAppSecret())
+                .replace("CODE", authCode);
+
+        ResponseEntity<String> paramOut = outRestTemplate.getForEntity(url, String.class);
+
+        logger.debug("调用微信换去openId " + paramOut);
+        if (paramOut.getStatusCode() != HttpStatus.OK) {
+            return ResultVo.redirectPage("/");
+        }
+        JSONObject paramObj = JSONObject.parseObject(paramOut.getBody());
+        //获取 openId
+        String openId = paramObj.getString("openid");
+        redirectUrl = redirectUrl + "&openId=" + openId;
+
+        //redirectUrl = redirectUrl + (redirectUrl.indexOf("?") > 0 ? "&key=" + tmpUserDto.getKey() : "?key=" + tmpUserDto.getKey());
+        return ResultVo.redirectPage(redirectUrl);
+    }
+
     /**
      * 公众号登录
      *
@@ -562,5 +660,5 @@ public class OwnerAppLoginSMOImpl extends DefaultAbstractComponentSMO implements
     public void setRestTemplate(RestTemplate restTemplate) {
         this.restTemplate = restTemplate;
     }
-    
+
 }