1. 调用微信开放平台的接口 按照如下步骤操作:
image.png
1. 控制类
/**
* (1)调用微信平台提供的接口生成二维码
* (2)用户扫描二维码后 调用回调函数 返回扫描之后的票据
* (3)拿到票据之后请求微信地址 获取到一个凭证
* (4)拿到凭证后请求微信地址 获取到用户的相关信息
**/
@Controller
@RequestMapping(value = "/api/ucenter/wx")
@CrossOrigin
public class WxApiController {
@Autowired
private UcenterMemberService ucenterMemberService ;//
//第一步 : 生成二维码
@GetMapping(value = "login") // /api/ucenter/wx/login
// @ResponseBody
public String getQrConnect(HttpSession session){
//1. 微信开放平台授权baseUrl
String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" +
"?appid=%s" +
"&redirect_uri=%s" +
"&response_type=code" +
"&scope=snsapi_login" +
"&state=%s" +
"#wechat_redirect";
//2. 扫描之后的回调地址
String redirectUrl=null;
try {
//3. 对回调的url进行编码
redirectUrl = URLEncoder.encode(ConstantPropertiesUtil.WX_OPEN_REDIRECT_URL, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
//4 拼接出来最终生成二维码的地址
String state = "tina";//TODD 为了测试:这个值传递是注册内网穿透的域名名称 实现域名跳转
String qrcodeUrl = String.format(baseUrl,ConstantPropertiesUtil.WX_OPEN_APP_ID,redirectUrl,state);
// 5重定向到二维码的地址
return "redirect:"+qrcodeUrl;
}
//用户扫描二维码会调用该回调函数获取到用户的相关信息
@GetMapping(value = "callback")
public String callback(String code,String state){
//获取扫描之后的票据code
//拿到票据之后去请求微信地址
String baseAccessTokenUrl = "https://api.weixin.qq.com/oauth2/access_token" +
"?appid=%s" +
"&secret=%s" +
"&code=%s" +
"&grant_type=authorization_code";
String accessTokenUrl = String.format(baseAccessTokenUrl,ConstantPropertiesUtil.WX_OPEN_APP_ID,ConstantPropertiesUtil.WX_OPEN_APP_SECRET,code); //拼接出最终的微信地址
//请求微信地址获取凭证
String result = HttpClientUtils.get(accessTokenUrl);//HttpClientUtils这个工具需要额外引入 此次为贴代码
//将获取的凭证信息进行解析
Gson gson = new Gson();
HashMap map = gson.fromJson(result, HashMap.class);
String accessToken = (String)map.get("access_token");
String openid = (String)map.get("openid");
UcenterMember member = ucenterMemberService.getById(openid);
if(member == null ){
//为空则说明是新用户,则拿着凭证和微信ID请求微信地址获取用户的相关信息
String baseUrlInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +
"?access_token=%s" +
"&openid=%s";
//拼接成最终的微信地址
String userInfoUrl = String.format(baseUrlInfoUrl,accessToken,openid);
String resultUserInfo = HttpClientUtils.get(userInfoUrl) ;
//将获取的用户信息转换json
HashMap userInfomap = gson.fromJson(resultUserInfo, HashMap.class);
String nickname = (String)userInfomap.get("nickname");//用户的微信昵称
String headimgurl = (String)userInfomap.get("headimgurl");//用户的微信头像
//TODD 将新获取的用户信息调用sql方法存储到数据库中, 然后标记登陆状态
}
//否则说名是老用户 用户的相关信息为member,标记登陆状态
//重定义向到前端页面中
return "redirect:http://3000";
}
}
2. 配置
#微信开发平台的appid
wx.open.app_id=wxc606fb748aedee7c
#微信开放平台
wx.open.app_secret=6c94e426cc7f49e29b42231ee202b1a3
#微信开放平台 重定向url
wx.open.redirect_url=http://yaohuan.work/api/ucenter/wx/callback
网友评论