个人觉得上图描述已经很清晰。更多的可以参考:网页授权获取用户基本信息
贴一下微信测试号和测试地址:微信测试号、微信公众平台接口调试工具
下面贴下部分代码:
依赖包:该依赖包里面呢,有别人封装好的一些方法,可以直接拿来用,如果不怕麻烦呢,也可以直接封装。
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>${weixin-java-mp.version}</version>
</dependency>
WxUserController.java
@Autowired
WxUtil wxUtil;
@Autowired
RedisTemplate redisTemplate;
@ApiOperation(value = "用户绑定服务",notes = "@auth liuwanli")
@PostMapping("bind")
public Result<WxUser> bind(@RequestBody WxUser user,HttpServletResponse response){
WxUser wxUser = WxAuthUtil.getWxUserTemp();
if(wxUser == null){
return Result.fail("获取用户信息失败");
}
//补充用户填写的信息
wxUser.setUsername(user.getUsername());
wxUser.setPhone(user.getPhone());
wxUser.setIdCard(user.getIdCard());
wxUser.setCreateTime(new Date());
wxUser.setUpdateTime(new Date());
getWxUserService().save(wxUser);
WxAuthUtil.setWxUser(wxUser,redisTemplate,response);
wxUser.setOpenid(null);
WxAuthUtil.removeUserTemp();
return Result.ok().setContent(wxUser);
}
@ApiOperation(value = "验证用户是否已经绑定服务",notes = "@auth liuwanli")
@ApiImplicitParam(name = "code")
@GetMapping("has/{code}")
public Result<WxUser> hasBind(@PathVariable String code, HttpServletResponse response, HttpServletRequest request){
WxUser wxUser = wxUtil.getWxUser(code);
//用openid查询已绑定的用户
WxUser dbWxUser = getWxUserService().findByOpenId(wxUser.getOpenid());
if(dbWxUser!=null){
//已绑定,就返回用户信息
WxAuthUtil.setWxUser(dbWxUser,redisTemplate,response);
wxUser.setOpenid(null);
return Result.ok().setContent(wxUser);
}else{
//把微信用户信息缓存一下,等下绑定服务用
WxAuthUtil.setWxUserTemp(request,wxUser);
}
return Result.ok().setContent(wxUser);
}
@ApiOperation(value = "获取微信授权路径",notes = "@auth liuwanli")
@GetMapping("authurl")
public void authUrl(HttpServletResponse response) throws IOException {
response.sendRedirect(wxUtil.getWxAuthUrl());
}
WxUtil.java
@Component
@Configuration
@EnableConfigurationProperties(WxPushMsgConfig.class)
public class WxUtil {
@Autowired
WxMpService wxMpService;
@Autowired
WxUserService wxUserService;
@Autowired
WxAuthConfig wxAuthConfig;
/**
* 获取微信授权路径
* @return
*/
public String getWxAuthUrl(){
return wxMpService.oauth2buildAuthorizationUrl(wxAuthConfig.getRedirect_uri(),wxAuthConfig.getScope(),wxAuthConfig.getState());
}
/**
* 输入微信给的code去拿用户信息
* @param code
* @return
*/
public WxUser getWxUser(String code){
try {
WxMpOAuth2AccessToken wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
WxMpUser wxMpUser = wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken,null);
WxUser user = new WxUser();
user.setProvince(wxMpUser.getProvince());
user.setSex(wxMpUser.getSex());
user.setHeadimgurl(wxMpUser.getHeadImgUrl());
user.setCity(wxMpUser.getCity());
user.setOpenid(wxMpUser.getOpenId());
user.setUsername(wxMpUser.getNickname());
return user;
} catch (WxErrorException e) {
e.printStackTrace();
}
return null;
}
}
另附上一个网络穿透工具natapp,可以用来测试。