個人覺得上圖描述已經很清晰。更多的可以參考:網頁授權獲取用戶基本信息
貼一下微信測試號和測試地址:微信測試號、微信公衆平臺接口調試工具
下面貼下部分代碼:
依賴包:該依賴包裏面呢,有別人封裝好的一些方法,可以直接拿來用,如果不怕麻煩呢,也可以直接封裝。
<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,可以用來測試。