微信扫码登录
微信开放平台扫码登录介绍
链接地址: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);
}
}
}
来自一个菜逼程序员
浙公网安备 33010602011771号