一张图说清微信网页授权

在这里插入图片描述

个人觉得上图描述已经很清晰。更多的可以参考:网页授权获取用户基本信息
贴一下微信测试号和测试地址:微信测试号微信公众平台接口调试工具
下面贴下部分代码:
依赖包:该依赖包里面呢,有别人封装好的一些方法,可以直接拿来用,如果不怕麻烦呢,也可以直接封装。

		<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,可以用来测试。

发布了41 篇原创文章 · 获赞 22 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq1049545450/article/details/104819193