微信开放平台开发(四) 授权

授权 & 预授权码

第三方平台即是用来对多个公众号进行授权的。授权就得使用到授权码,不,微信开放平台里叫预授权码。

获取预授权码的方式和获取component_access_token一样简单,只需要请求https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=xxx在url带上component_access_token(component_access_token的获取方式在上一篇博客里有说明),再附带上component_appid即可。

由于该类的操作是向微信发送请求,接下来还会有类似向微信请求数据的接口,我们就添加一个WXDataGatherService及其Impl类,现在该类里只有一个方法:

    /**
     * 获取一个新的预授权码
     */
    String getNewPreAuthCode();

具体实现类请参看博客最后的git链接。

使用预授权码

获取了预授权码后就可以进行授权了。 授权的操作流程大致为:1)用户点击一个链接,2)网页跳转到微信,并生成二维码,3)用户扫描二维码并确认授权,4)微信回调至我们的服务器。 所以需要有一个引导页面来使用户点击。我们添加一个页面(/page/auth.jsp)并在里面添加一个链接让它跳转到/auth/redirectToAuth里,该路径对应我们AuthController里的redirectToAuth()方法里,该方法如下:

    /**
     * 重定向到微信进行授权
     * @param response response
     */
    @RequestMapping("redirectToAuth")
    public void redirectToAuth(HttpServletResponse response) throws IOException {
        String redirectUri = ServerPropertiesUtil.getBaseUrl() + "/auth/authorized";
        String encodeRedirectUri = URLEncoder.encode(redirectUri, "utf-8");

        String url = "https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid="
                + ServerPropertiesUtil.getAppId() + "&pre_auth_code=" + wxDataGatherService.getNewPreAuthCode()
                + "&redirect_uri=" + encodeRedirectUri + "&auth_type=1";
        response.sendRedirect(url);
    }

上面的代码中有两处需要注意的点。

  • redirectUri是指用户确认授权后微信回调的路径,该路径需要进行url编码
  • pre_auth_code即是预授权码,我们通过
    wxDataGatherService.getNewPreAuthCode()

即可获取到。

这个时候页面会显示一个二维码。用户扫描后会检测该用户下管理的公众号,选择一个后即可确认授权,之后会请求到AuthController的authorized()方法里:

    /**
     * 微信公众平台完成授权后的回调请求
     *
     */
    @RequestMapping("authorized")
    @ResponseBody
    public String authorized() {
        LOG.debug("wx notify");
        return "success";
    }

该方法仅打印一句日志以测试微信是否能成功回调。

注意,本博客功能的主要流程是:在浏览器中访问/page/auth.jsp -> 在浏览器点击微信授权 -> 浏览器中显示二维码 -> 用户打开微信扫描 -> 用户在微信上确认授权 -> 微信回调到我们的服务器。

坑一

redirect_uri一定要在在开放平台中配置的域名下,我一开始时填写是https://www.baidu.com,就报一个错说回调地址没有在域名下。

扫描二维码关注公众号,回复: 88201 查看本文章

坑二

pre_auth_code是一个授权绑定对应一个,当开始我做的时候也是做了一个类似ComponentAccessTokenTask的任务来每两小时更新一下预授权码,这样当一个授权码被使用后,下一个用户再次扫描授权时,就会提示“预授权码已被使用”。

本博客对应的代码在https://gitee.com/valuetodays/open-wx-demo/tree/V0.3

再关联一下自己的博客网站

猜你喜欢

转载自my.oschina.net/valuetodays/blog/1786804