Browse Source

Merge branch 'master' of ssh://10.10.101.21/source/sso-parent into hotfix-844-wangmh

wangmh 7 years ago
parent
commit
ba678ffa58

+ 48 - 1
sso-server/src/main/java/com/uas/sso/controller/LoginController.java

@@ -3,7 +3,6 @@ package com.uas.sso.controller;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.uas.account.AccountConfig;
-import com.uas.account.entity.UserDetail;
 import com.uas.sso.*;
 import com.uas.sso.common.util.HttpUtil;
 import com.uas.sso.core.Const;
@@ -12,6 +11,8 @@ import com.uas.sso.entity.Token;
 import com.uas.sso.service.*;
 import com.uas.sso.util.*;
 import com.uas.sso.web.waf.request.WafRequestWrapper;
+import com.uas.sso.weixin.entity.OAuthInfo;
+import com.uas.sso.weixin.service.WeChatService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.ui.ModelMap;
 import org.springframework.util.Assert;
@@ -68,6 +69,9 @@ public class LoginController extends BaseController {
     @Autowired
     private PersonalAccountService personalAccountService;
 
+    @Autowired
+    private WeChatService weChatService;
+
     @RequestMapping(method = RequestMethod.POST)
     public ModelMap login() {
         // 获取登录信息
@@ -737,6 +741,7 @@ public class LoginController extends BaseController {
      */
     private ModelMap login(Long userUU, String appId, String spaceUU, String returnUrl) {
         // 登录
+        appId = StringUtils.isEmpty(appId) ? AccountConfig.ACCOUNT_CENTER : appId;
         App app = appService.findOne(appId);
         if (app == null) {
             throw new VerifyError("应用不存在");
@@ -777,4 +782,46 @@ public class LoginController extends BaseController {
             return loginByUser(userAccount, returnUrl, true);
         }
     }
+
+    /**
+     * 微信获取code
+     * @param code 获取用户信息的code
+     * @param state 验证请求
+     * @return
+     */
+    @RequestMapping(value = "/wxqrLogin", method = RequestMethod.POST)
+    public ModelMap wxqrLogin(@RequestParam(defaultValue = "sso") String appId, String code, String state) {
+        // TODO 校验state
+
+        // 获取用户信息
+        OAuthInfo oAuthInfo = weChatService.getOAuthInfoByCode(code);
+        User user = null;
+        if (oAuthInfo == null || StringUtils.isEmpty(oAuthInfo.getAccess_token())) {
+            Long userUU = (Long) request.getSession().getAttribute("userUU");
+            if (userUU == null) {
+                return error("验证信息过期,请重新扫码登录");
+            }
+            user = new User(userUU);
+        } else {
+            user = userService.findByWxUnionid(oAuthInfo.getUnionid());
+            if (user == null) {
+                // 提示前端用户微信未绑定账号
+                Token token = new Token(oAuthInfo, oAuthInfo.getExpires_in());
+                tokenService.save(token);
+                ModelMap data = new ModelMap("hasRegister", false);
+                data.put("token", token.getId());
+                return success(data);
+            }
+            request.getSession().setAttribute("userUU", user.getUserUU());
+        }
+
+        // 登录
+        WafRequestWrapper wr = new WafRequestWrapper(request);
+        String spaceUU = wr.getParameter("spaceUU");
+        String returnUrl = wr.getParameter("returnUrl");
+        String baseUrl = wr.getParameter("baseUrl");
+        request.getSession().setAttribute("baseUrl", baseUrl);
+        return success(login(user.getUserUU(), appId, spaceUU, returnUrl));
+    }
+
 }

+ 10 - 1
sso-server/src/main/java/com/uas/sso/controller/PersonalRegisterController.java

@@ -7,6 +7,7 @@ import com.uas.sso.core.Step;
 import com.uas.sso.core.Type;
 import com.uas.sso.core.PasswordStrength;
 import com.uas.sso.entity.App;
+import com.uas.sso.entity.Token;
 import com.uas.sso.entity.User;
 import com.uas.sso.entity.UserAccount;
 import com.uas.sso.logging.LoggerManager;
@@ -15,6 +16,7 @@ import com.uas.sso.service.AppService;
 import com.uas.sso.service.PersonalAccountService;
 import com.uas.sso.service.UserService;
 import com.uas.sso.util.PasswordLevelUtils;
+import com.uas.sso.weixin.entity.OAuthInfo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
@@ -57,7 +59,7 @@ public class PersonalRegisterController extends BaseController {
      */
     @RequestMapping(method = RequestMethod.POST)
     @ResponseBody
-    public ModelMap register(User user, String appId, String code, String token, String baseUrl) {
+    public ModelMap register(User user, String appId, String code, String token, String baseUrl, String t) {
         // 获取参数
         String vipName = user.getVipName();
         String mobile = user.getMobile();
@@ -87,6 +89,13 @@ public class PersonalRegisterController extends BaseController {
         }
 
         // 注册并添加注册日志
+        if (!StringUtils.isEmpty(t)) {
+            Token unionidToken = tokenService.findOne(t);
+            if (unionidToken != null) {
+                OAuthInfo oAuthInfo = (OAuthInfo) unionidToken.getBind();
+                user.setWxUnionid(oAuthInfo.getUnionid());
+            }
+        }
         appId = StringUtils.isEmpty(appId) ? "sso" : appId;
         user = userService.register(user, appId);
         registerLogger.info(Type.REGISTER_PERSONAL.getValue(), Step.FIRST.getValue(), "个人注册成功", user, user.getFromApp());

+ 2 - 1
sso-server/src/main/java/com/uas/sso/controller/UpdateUserController.java

@@ -135,6 +135,7 @@ public class UpdateUserController extends BaseController {
         tokenService.save(token);
         ModelMap data = new ModelMap();
         data.put("vipName", user.getVipName());
+        data.put("url", url + (url.contains("?") ? "&" : "?") + "token=" + token.getId());
         // TODO 邮件认证地址
         switch (operate) {
             case "mobile":
@@ -142,6 +143,7 @@ public class UpdateUserController extends BaseController {
                 break;
             case "email":
                 data.put("type", "验证邮箱");
+                data.put("url", url + (url.contains("?") ? "&" : "?") + "step=2&token=" + token.getId());
                 break;
             case "question":
                 data.put("type", "设置密保");
@@ -149,7 +151,6 @@ public class UpdateUserController extends BaseController {
             default:
                 return error("参数错误");
         }
-        data.put("url", url + (url.contains("?") ? "&" : "?") + "token=" + token.getId());
 
         // 发送邮件
         if (!StringUtils.isEmpty(email)) {

+ 10 - 5
sso-server/src/main/java/com/uas/sso/controller/UserspaceRegisterController.java

@@ -8,10 +8,7 @@ import com.uas.sso.core.PasswordStrength;
 import com.uas.sso.core.Status;
 import com.uas.sso.core.Step;
 import com.uas.sso.core.Type;
-import com.uas.sso.entity.App;
-import com.uas.sso.entity.User;
-import com.uas.sso.entity.UserAccount;
-import com.uas.sso.entity.Userspace;
+import com.uas.sso.entity.*;
 import com.uas.sso.logging.LoggerManager;
 import com.uas.sso.logging.RegisterBufferedLogger;
 import com.uas.sso.service.AppService;
@@ -19,6 +16,7 @@ import com.uas.sso.service.UserAccountService;
 import com.uas.sso.service.UserService;
 import com.uas.sso.service.UserspaceService;
 import com.uas.sso.util.PasswordLevelUtils;
+import com.uas.sso.weixin.entity.OAuthInfo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
@@ -96,7 +94,7 @@ public class UserspaceRegisterController extends BaseController {
      */
     @RequestMapping(method = RequestMethod.POST)
     @ResponseBody
-    public ModelMap register(Userspace userspace, User user, String appId, String baseUrl) {
+    public ModelMap register(Userspace userspace, User user, String appId, String baseUrl, String t) {
         // 获取企业信息
         String spaceName = userspace.getSpaceName();
         String businessCode = userspace.getBusinessCode();
@@ -153,6 +151,13 @@ public class UserspaceRegisterController extends BaseController {
         }
 
         // 企业注册
+        if (!StringUtils.isEmpty(t)) {
+            Token unionidToken = tokenService.findOne(t);
+            if (unionidToken != null) {
+                OAuthInfo oAuthInfo = (OAuthInfo) unionidToken.getBind();
+                admin.setWxUnionid(oAuthInfo.getUnionid());
+            }
+        }
         userspace.setAdmin(admin);
         userspace = userspaceService.register(userspace, appId);
 

+ 6 - 1
sso-server/src/main/java/com/uas/sso/core/Type.java

@@ -56,7 +56,12 @@ public enum Type {
     /**
      * 用户解除绑定企业
      */
-    UNBIND_USERSPACE("UNBIND");
+    UNBIND_USERSPACE("UNBIND"),
+
+    /**
+     * 用户绑定微信账号
+     */
+    BIND_WEIXIN("BINDWEIXIN");
 
     private String value;
 

+ 7 - 0
sso-server/src/main/java/com/uas/sso/dao/UserDao.java

@@ -126,4 +126,11 @@ public interface UserDao extends JpaRepository<User, Long>, JpaSpecificationExec
      */
     @Query("select u.fromApp as appId , count(u) as count from User u where u.fromApp in ?1 group by u.fromApp")
     List<Map<String,Object>> getCountByRegisterDate(List<String> fromApps);
+
+    /**
+     * 根据用户unionID获取用户信息
+     * @param wxUnionid 用户unionID
+     * @return
+     */
+    User findByWxUnionid(String wxUnionid);
 }

+ 16 - 2
sso-server/src/main/java/com/uas/sso/entity/App.java

@@ -112,6 +112,12 @@ public class App implements Serializable {
     @Column(name = "personal_enable", nullable = false)
     private Integer personalEnable;
 
+    /**
+     * 是否支持个人账号
+     */
+    @Column(name = "wx_appid", length = 20)
+    private String wxAppid;
+
     /**
      * 应用页面样式
      */
@@ -231,14 +237,22 @@ public class App implements Serializable {
         this.defaultUse = defaultUse;
     }
 
-    public int getPersonalEnable() {
+    public Integer getPersonalEnable() {
         return personalEnable;
     }
 
-    public void setPersonalEnable(int personalEnable) {
+    public void setPersonalEnable(Integer personalEnable) {
         this.personalEnable = personalEnable;
     }
 
+    public String getWxAppid() {
+        return wxAppid;
+    }
+
+    public void setWxAppid(String wxAppid) {
+        this.wxAppid = wxAppid;
+    }
+
     @JsonIgnore
     @JSONField(serialize = false)
     public PageStyle getPageStyle() {

+ 14 - 0
sso-server/src/main/java/com/uas/sso/entity/User.java

@@ -152,6 +152,12 @@ public class User implements Serializable {
     @Column(name = "wx_openid")
     private String wxOpenid;
 
+    /**
+     * 微信号(微信扫码授权或微信客户端授权,不用出现在注册页面,预留)
+     */
+    @Column(name = "wx_unionid", unique = true)
+    private String wxUnionid;
+
     /**
      * qq号(qq扫码或qq客户端授权,不用出现在注册页面,预留)
      */
@@ -397,6 +403,14 @@ public class User implements Serializable {
         this.wxOpenid = wxOpenid;
     }
 
+    public String getWxUnionid() {
+        return wxUnionid;
+    }
+
+    public void setWxUnionid(String wxUnionid) {
+        this.wxUnionid = wxUnionid;
+    }
+
     public Integer getQqNumber() {
         return qqNumber;
     }

+ 56 - 0
sso-server/src/main/java/com/uas/sso/erp/controller/ErpUserManagerController.java

@@ -0,0 +1,56 @@
+package com.uas.sso.erp.controller;
+
+import com.alibaba.dubbo.common.utils.Assert;
+import com.uas.sso.entity.User;
+import com.uas.sso.entity.UserLog;
+import com.uas.sso.logging.Logger;
+import com.uas.sso.logging.LoggerManager;
+import com.uas.sso.logging.UserBufferedLogger;
+import com.uas.sso.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.ui.ModelMap;
+import org.springframework.util.StringUtils;
+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;
+
+/**
+ * @author wangmh
+ * @create 2018-07-03 15:38
+ * @desc 用户管理接口(erp接口)
+ **/
+@RestController
+@RequestMapping("/api/user/erp")
+public class ErpUserManagerController extends ErpBaseController {
+
+    @Autowired
+    private UserService userService;
+
+    UserBufferedLogger userLog = LoggerManager.getLogger(UserBufferedLogger.class);
+
+    @RequestMapping(value = "/update", method = RequestMethod.POST)
+    public ModelMap updateUserInfo(@RequestParam(defaultValue = "uas") String appId, User user) {
+        Assert.notNull(user, "用户信息不能为空");
+        Assert.notNull(user.getUserUU(), "用户uu号不能为空");
+
+        User oldUser = userService.findOne(user.getUserUU());
+
+        StringBuffer sb = new StringBuffer();
+        sb.append("update ");
+        // 修改用户名
+        if (!StringUtils.isEmpty(user.getVipName())) {
+            oldUser.setVipName(user.getVipName());
+            sb.append("name ");
+        }
+        // 修改性别
+        if (!StringUtils.isEmpty(user.getSex())) {
+            oldUser.setSex(user.getSex());
+            sb.append("sex ");
+        }
+        userService.save(oldUser);
+        userLog.info(oldUser, sb.toString());
+
+        return success(oldUser);
+    }
+}

+ 23 - 0
sso-server/src/main/java/com/uas/sso/service/UserService.java

@@ -110,6 +110,15 @@ public interface UserService {
      */
     void checkPasswordByEmail(String email, String password, boolean isEncry);
 
+    /**
+     * 根据账号校验优软云密码,不能校验erp的密码
+     * @param username 账号
+     * @param password 密码
+     * @param isEncry 密码是否加密
+     * @return 密码是否正确
+     */
+    boolean checkPasswordByUsername(String username, String password, boolean isEncry);
+
     /**
      * 获得当前账号密码输错次数
      *
@@ -319,4 +328,18 @@ public interface UserService {
      */
     Map<String, Long> countInCurrentWeek(List<String> fromApps);
 
+    /**
+     * 根据用户unionID获取用户信息
+     * @param unionid 用户unionID
+     * @return
+     */
+    User findByWxUnionid(String unionid);
+
+    /**
+     * 微信绑定账号
+     * @param username 用户名
+     * @param password 密码
+     * @param unionid 用户微信唯一标志
+     */
+    User bindUnionId(String username, String password, String unionid);
 }

+ 36 - 0
sso-server/src/main/java/com/uas/sso/service/impl/UserServiceImpl.java

@@ -201,6 +201,17 @@ public class UserServiceImpl implements UserService {
         }
     }
 
+    @Override
+    public boolean checkPasswordByUsername(String username, String password, boolean isEncry) {
+        Assert.hasText(username, "用户名不能为空");
+        Assert.hasText(password, "密码不能为空");
+
+        User user = findByUsername(username);
+        checkPassword(user, password, isEncry);
+
+        return true;
+    }
+
     @Override
     public int getPwdErrorCount(String username) {
         User user = findByUsername(username);
@@ -704,6 +715,31 @@ public class UserServiceImpl implements UserService {
         });
     }
 
+    @Override
+    public User findByWxUnionid(String unionid) {
+        return userDao.findByWxUnionid(unionid);
+    }
+
+    @Override
+    public User bindUnionId(String username, String password, String unionid) {
+        Assert.hasText(username, "用户名不能为空");
+        Assert.hasText(password, "密码不能为空");
+
+        User user = findByUsername(username);
+        if (user == null) {
+            throw new IllegalArgumentException("该用户不存在");
+        }
+
+        checkPassword(user.getUserUU(), password, false);
+
+        user.setWxUnionid(unionid);
+        userDao.save(user);
+
+        userLogger.info(user, Type.BIND_WEIXIN.getValue());
+
+        return user;
+    }
+
     /**
      * 同步用户信息到各个应用
      * @param user 用户信息

+ 112 - 0
sso-server/src/main/java/com/uas/sso/weixin/controller/WeChatController.java

@@ -0,0 +1,112 @@
+package com.uas.sso.weixin.controller;
+
+import com.uas.sso.controller.BaseController;
+import com.uas.sso.entity.App;
+import com.uas.sso.entity.User;
+import com.uas.sso.service.AppService;
+import com.uas.sso.weixin.entity.OAuthInfo;
+import com.uas.sso.entity.Token;
+import com.uas.sso.service.UserService;
+import com.uas.sso.weixin.entity.UserInfo;
+import com.uas.sso.weixin.service.WeChatService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.ui.ModelMap;
+import org.springframework.util.Assert;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+/**
+ * @author wangmh
+ * @create 2018-06-07 11:27
+ * @desc 微信登录
+ **/
+@RequestMapping("/weChat")
+@RestController
+public class WeChatController extends BaseController {
+
+    @Autowired
+    private WeChatService weChatService;
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private AppService appService;
+
+    private static final String DEFAULT_WX_APPID = "wxa14aec4edce8a2d2";
+
+    private static final String WX_APPSECRET = "9749d2df03eb161f4d4075df69c2e2c9";
+
+    private static final String WX_REDIRECT_URI = "http://sso.ubtob.com/";
+
+    private static final String WX_LOGIN_SCOPE = "snsapi_login";
+
+    @RequestMapping("/getQrUrl")
+    public ModelMap getQrUrl(@RequestParam(defaultValue = "sso") String appId, @RequestParam String url) {
+        try {
+            url = URLEncoder.encode(url, "utf8");
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException("程序编码异常");
+        }
+        String qrUrl = "https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
+        App app = appService.findOne(appId);
+        String wx_appid = DEFAULT_WX_APPID;
+        if (app != null && !StringUtils.isEmpty(app.getWxAppid())) {
+            wx_appid = app.getWxAppid();
+        }
+        qrUrl = qrUrl.replace("APPID", wx_appid).replace("REDIRECT_URI", url).replace("SCOPE", WX_LOGIN_SCOPE).replace("STATE", "");
+        return success(qrUrl);
+    }
+
+    @RequestMapping("/getQrParams")
+    public ModelMap getQrParams(String appId) {
+        ModelMap params = new ModelMap();
+        App app = appService.findOne(appId);
+        String wx_appid = DEFAULT_WX_APPID;
+        if (app != null && !StringUtils.isEmpty(app.getWxAppid())) {
+            wx_appid = app.getWxAppid();
+        }
+        params.addAttribute("appid", wx_appid).addAttribute("state", "");
+        return params;
+    }
+
+    /**
+     * 绑定微信账号
+     * @param t 微信登录失败返回的token
+     * @param username 绑定用户名
+     * @param password 绑定密码
+     * @return
+     */
+    @RequestMapping(value = "/addAccount", method = RequestMethod.POST)
+    public ModelMap addAccount(@RequestParam String t, String username, String password) {
+        Token token = tokenService.findOne(t);
+        if (token == null || token.isExpired()) {
+            return error("绑定失败,请重新扫描二维码");
+        }
+
+        Token unionidToken = tokenService.findOne(t);
+        if (unionidToken != null) {
+            OAuthInfo oAuthInfo = (OAuthInfo) unionidToken.getBind();
+            User user = userService.bindUnionId(username, password, oAuthInfo.getUnionid());
+            request.getSession().setAttribute("userUU", user.getUserUU());
+        }
+
+        tokenService.delete(t);
+
+        return success();
+    }
+
+    @RequestMapping(value = "/userInfo/{token}", method = RequestMethod.GET)
+    public ModelMap findUserByToken(@PathVariable("token") String t) {
+        Token token = tokenService.findOne(t);
+        Assert.notNull(token, "验证信息过期,请重新扫码");
+        Assert.isTrue(token.getBind() instanceof OAuthInfo, "参数错误");
+
+        OAuthInfo oAuthInfo = (OAuthInfo) token.getBind();
+        UserInfo userInfo = weChatService.findUserByUnionid(oAuthInfo.getUnionid(), oAuthInfo.getAccess_token());
+        return success(userInfo);
+    }
+}

+ 73 - 0
sso-server/src/main/java/com/uas/sso/weixin/entity/OAuthInfo.java

@@ -0,0 +1,73 @@
+package com.uas.sso.weixin.entity;
+
+import java.io.Serializable;
+
+/**
+ * @author wangmh
+ * @create 2018-06-28 14:18
+ * @desc 微信用户登录信息
+ **/
+public class OAuthInfo implements Serializable{
+
+    private static final long serialVersionUID = 1L;
+
+    private String access_token;
+
+    private Integer expires_in;
+
+    private String refresh_token;
+
+    private String openid;
+
+    private String scope;
+
+    private String unionid;
+
+    public String getAccess_token() {
+        return access_token;
+    }
+
+    public void setAccess_token(String access_token) {
+        this.access_token = access_token;
+    }
+
+    public Integer getExpires_in() {
+        return expires_in;
+    }
+
+    public void setExpires_in(Integer expires_in) {
+        this.expires_in = expires_in;
+    }
+
+    public String getRefresh_token() {
+        return refresh_token;
+    }
+
+    public void setRefresh_token(String refresh_token) {
+        this.refresh_token = refresh_token;
+    }
+
+    public String getOpenid() {
+        return openid;
+    }
+
+    public void setOpenid(String openid) {
+        this.openid = openid;
+    }
+
+    public String getScope() {
+        return scope;
+    }
+
+    public void setScope(String scope) {
+        this.scope = scope;
+    }
+
+    public String getUnionid() {
+        return unionid;
+    }
+
+    public void setUnionid(String unionid) {
+        this.unionid = unionid;
+    }
+}

+ 111 - 0
sso-server/src/main/java/com/uas/sso/weixin/entity/UserInfo.java

@@ -0,0 +1,111 @@
+package com.uas.sso.weixin.entity;
+
+import java.util.List;
+
+/**
+ * @author wangmh
+ * @create 2018-07-02 15:54
+ * @desc 微信用户信息
+ **/
+public class UserInfo {
+
+    private String openid;
+
+    private String nickname;
+
+    private String sex;
+
+    private String language;
+
+    private String city;
+
+    private String province;
+
+    private String country;
+
+    private String headimgurl;
+
+    private List<String> privilege;
+
+    private String unionid;
+
+    public String getOpenid() {
+        return openid;
+    }
+
+    public void setOpenid(String openid) {
+        this.openid = openid;
+    }
+
+    public String getNickname() {
+        return nickname;
+    }
+
+    public void setNickname(String nickname) {
+        this.nickname = nickname;
+    }
+
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+
+    public String getLanguage() {
+        return language;
+    }
+
+    public void setLanguage(String language) {
+        this.language = language;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getCountry() {
+        return country;
+    }
+
+    public void setCountry(String country) {
+        this.country = country;
+    }
+
+    public String getHeadimgurl() {
+        return headimgurl;
+    }
+
+    public void setHeadimgurl(String headimgurl) {
+        this.headimgurl = headimgurl;
+    }
+
+    public List<String> getPrivilege() {
+        return privilege;
+    }
+
+    public void setPrivilege(List<String> privilege) {
+        this.privilege = privilege;
+    }
+
+    public String getUnionid() {
+        return unionid;
+    }
+
+    public void setUnionid(String unionid) {
+        this.unionid = unionid;
+    }
+}

+ 21 - 0
sso-server/src/main/java/com/uas/sso/weixin/service/WeChatService.java

@@ -0,0 +1,21 @@
+package com.uas.sso.weixin.service;
+
+import com.uas.sso.weixin.entity.OAuthInfo;
+import com.uas.sso.weixin.entity.UserInfo;
+
+/**
+ * @author wangmh
+ * @create 2018-06-11 16:54
+ * @desc 微信服务
+ **/
+public interface WeChatService {
+
+    /**
+     * 根据code获取用户的信息
+     * @param code
+     * @return
+     */
+    OAuthInfo getOAuthInfoByCode(String code);
+
+    UserInfo findUserByUnionid(String unionid, String access_token);
+}

+ 55 - 0
sso-server/src/main/java/com/uas/sso/weixin/service/impl/WeChatServiceImpl.java

@@ -0,0 +1,55 @@
+package com.uas.sso.weixin.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.uas.sso.common.util.HttpUtil;
+import com.uas.sso.weixin.entity.OAuthInfo;
+import com.uas.sso.weixin.entity.UserInfo;
+import com.uas.sso.weixin.service.WeChatService;
+import org.springframework.stereotype.Service;
+
+import static com.uas.sso.common.util.HttpUtil.doGet;
+
+/**
+ * @author wangmh
+ * @create 2018-06-11 16:57
+ * @desc
+ **/
+@Service
+public class WeChatServiceImpl implements WeChatService {
+    @Override
+    public OAuthInfo getOAuthInfoByCode(String code) {
+        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
+        url= url.replace("APPID", "wxa14aec4edce8a2d2");
+        url = url.replace("SECRET", "9749d2df03eb161f4d4075df69c2e2c9");
+        url = url.replace("CODE", code);
+        try {
+            HttpUtil.ResponseWrap res = HttpUtil.doGet(url);
+            if (res.getContent() != null) {
+                System.out.println(res.getContent().toString());
+                // {"access_token":"xxx","expires_in":7200,"refresh_token":"xxx","openid":"xxx","scope":"snsapi_userinfo","unionid":"xxx"}
+                OAuthInfo oAuthInfo = JSON.parseObject(res.getContent().toString(), OAuthInfo.class);
+                return oAuthInfo;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    @Override
+    public UserInfo findUserByUnionid(String unionid, String access_token) {
+        String url = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
+        url = url.replace("ACCESS_TOKEN", access_token).replace("OPENID", unionid);
+        try {
+            HttpUtil.ResponseWrap res = HttpUtil.doGet(url);
+            if (res.getContent() != null) {
+                System.out.println(res.getContent().toString());
+                UserInfo userInfo = JSON.parseObject(res.getContent().toString(), UserInfo.class);
+                return userInfo;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}