微信扫码登录

微信开放平台扫码登录介绍

链接地址:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html




流程梳理

微信登录

  • 通过页面向第三方平台(自己的服务器)去请求获取微信的扫码登录的地址[需要封装回调等必填参数]
  • 页面获取到扫码登录地址使用相关插件把地址变成二维码
  • 用户扫码确认授权
  • 微信服务器确认授权并调用请求微信扫码登录携带的回调接口把code和state传递
  • 回调接口根据传递的code和相关必填参数向微信服务获取token和登录者的openid
  • 根据返回的openid和相关必填参数向微信服务获取登录者的信息做业务逻辑处理



Constants

public class WechatConfig{
    
    //MD5加密串
    public static final String MD5_STR = "javacat7";
    
    //微信应用的APPID
    public static final String APPID = "wx66666666666666";
    
    //应用秘钥
    public static final String SECRET = "CpwFeY1iLjLF7hpYdeiDO6qKB4ii7sOI"
    
    //获取二维码的请求地址
    public static final String WECHAT_LOGIN_URL = "https://open.weixin.qq.com/connect/qrconnect?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_login&state=%s#wechat_redirect";
    
    //微信回调的地址
    public static final String WECHAT_CALLBACK_URL = "https://www.javacat7.com/api/wechat/loginCallback";
    
    //获取登录用户信息的地址
    public static final String GET_LOGIN_USER_INFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
    
    //获取accessToken的请求地址
    public static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";
    
    
}

WechatService

public interface WechatService{
    /**
     *	获取微信的二维码登录地址
     */
    public String getWechatLoginURL();
    
    
    /**
     *	获取用户的信息信息
     */
    public WechatLoginUserInfo getLoginUserInfo();
    
    
    /**
     *	获取信息AccessToken
     */
    public AccessToken getAccessToken(String code);
    
}

WechatServiceImpl

@Service
public class WechatServiceImpl implements WechatService{
    
    
    /**
     *	获取微信的二维码登录地址
     */
    public String getWechatLoginURL(){
        //创建一个state变量并进行加密,防止CSRF跨站请求伪造攻击
        String state = MyMD5Utils.getSecurityCode(WechatConfig.MD5_STR);
        
        //对请求的二维码进行编码,官网要求
        String callbackUrl = URLEncoder.encode(WechatConfig.WECHAT_CALLBACK_URL,"GBK");
        
        //格式化请求的地址,并返回
        return  String.format(WechatConfig.WECHAT_LOGIN_URL,WechatConfig.APPID,callbackUrl,state);
    }
    
    
    /**
     *	获取用户的信息信息
     */
    public WechatLoginUserInfo getLoginUserInfo(String accessToken,String userOpenId){
        //格式化请求获取用户信息的地址
        String accessTokenUrl = String.format(WechatConfig.GET_LOGIN_USER_INFO_URL,accessToken,userOpenId);
        
        //创建一个Http请求去请求这个地址并获取用户的信息
        String responseContent = HttpClient.getInstance().sendHttpGet(accessTokenUrl);
        
        //解析数据
        JSONObject result = JSONObject.parseObject(responseContent);
        WechatLoginUserInfo wechatUserInfo = result.toJavaObject(result,WechatLoginUserInfo);
        
        return wechatUserInfo;
    }
    
    /**
     *	获取信息AccessToken
     */
    public AccessToken getAccessToken(String code){
        //格式化请求获取AccessToken的地址
        String accessTokenUrl = String.format(WechatConfig.ACCESS_TOKEN_URL,WechatConfig.APPID,WechatConfig.SECRET,code);
        
        //创建一个Http请求,去请求并获取到响应的信息
       String responseContent = HttpClientUtils.getInstance().sendHttpGet(accessTokenUrl);
       
       //解析返回的结果
       JSONObject result = JSONObject.parseObject(responseContent);
       AccessToken accessToken = JSONObject.toJavaObject(result,AccessToken.class);
       
        return accessToken;
    }
    
    
}

WechatController

@RestController
@RequestMapping("api/wechat/")
public class WechatController{
    
    @Autowired
    private WechatService wechatService;
    
    @Autowired
    private WebSocket webSocket;
    
    /**
     * 获取微信登录二维码的接口
     */
    @RequestMapping("getLoginUrl")
    public String getWechatLoginUrl(){
        return wechatService.getWechatLoginURL();
    }
    
    /**
     * 微信的回调
     */
    @RequestMapping("loginCallback")
    public void wechatCallback(String state,String code){
        //防止csrf跨站请求
        if(!String.isEmpty(state) && myMD5Utils.matcher(state)){
            
            //获取Token信息结果
            AccessToken accessTokenInfo= wechatService.getAccessToken(code);
            
            //通过token去获取登录用户的信息
            String accessToken = accessTokenInfo.getAccessToken();
            String userOpenid = accessTokenInfo.getOpenId();
            
            //获取用户的信息
            WechatLoginUserInfo userInfo = wechatService.getLoginUserInfo(accessToken,userOpenid);
        
            //业务处理
            ResultMap<String,String> map = new HashMap();
            
            JSONObject result = new JSONObject(map);
            String resultJson = result.toJSONString();
            
            
            //通知前端页面
            webSocket.sendMessage(resultJson);
        }
        
    }
    
    
}
posted on 2021-04-17 14:54  JavaCat7  阅读(552)  评论(0)    收藏  举报