java微信开发API解析(七)-网页开发-微信网页授权

java微信开发API解析(七)-网页开发-微信网页授权

全局说明

* 详细说明请参考前两篇文章。

本文说明

  • 本文主要完成获取用户基本信息的工作,包括(昵称、头像、地址、国家等基本信息)
  • 对于snsapi_base和snsapi_userinfo我们只演示关于snsapi_userinfo。因为snsapi_userinfo更难,如果能够理解snsapi_userinfo,那么snsapi_base不在话下。
  • 对于该部分(微信网页开发)我们只介绍如何获取用户基本信息,对于开发样式库,js-SDK、开发者工具不能再讲解。(我是搞技术的,不会UI=_+)
  • 文章最后有演示的地址和操作源码

效果图

文档原文-网页授权获取用户基本信息(摘要)

  • 文档地址:http://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html
  • 接入微信公众平台开发,开发者需要按照如下步骤完成:
    1 第一步:用户同意授权,获取code
    2 第二步:通过code换取网页授权access_token
    3 第三步:刷新access_token(如果需要)
    4 第四步:拉取用户信息(需scope为 snsapi_userinfo)
    
  • 关于网页授权回调域名的说明
    1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的开发者中心页配置授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;
    2、授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com无法进行OAuth2.0鉴权
    3、如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可
    
  • 关于网页授权的两种scope的区别说明
    1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
    2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
    3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。
    
  • 理解
    • 在开发之前我们需要填写回调地址,该地址就是我们项目的服务器地址(ip或者域名)
    • 我们需要按照文档的要求进行四步操作才能获取到用户的基本信息。当然,如果我们只是获取snsapi_base,也就是一个用户的openid,就不需要四步了。
    • 请特别注意:关于网页授权access_token和普通access_token的区别,它们是不一样的。

实现

  • 前奏:首先构建需要的json对应的bean

    • 通过code换取网页授权access_token,我们将返回的值存在AutoWebParams

      public class AutoWebParams {
      private String access_token;
      private String expires_in;
      private String refresh_token;
      private String openid;
      private String scope;
      //Setter、Getter...
      }
      

    *最终返回的用户信息,我们存储到UserInfo

    public class UserInfo {
    private String openid;
    private String nickname;
    private String sex;
    private String province;
    private String city;
    private String country;
    private String headimgurl;
    private List<String> privilege;
    private String unionid;
    //Setter、Getter...
    }
    
  • 第一步:用户同意授权,获取code,需要引导用户打开此页面
    @WebServlet("/GuideServlet")
    public class GuideServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            // 设置编码
            req.setCharacterEncoding("utf-8");
            resp.setContentType("text/html;charset=utf-8");
            resp.setCharacterEncoding("utf-8");
            PrintWriter writer = resp.getWriter();
            /**
             * 第一步:用户同意授权,获取code:https://open.weixin.qq.com/connect/oauth2/authorize
             * ?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE
             * &state=STATE#wechat_redirect
             */
            String redirect_uri = "http://42.96.144.28/WeixinApiDemo/WeixinWebServlet";// 目标访问地址
            redirect_uri = URLEncoder.encode(
                    "http://42.96.144.28/WeixinApiDemo/WeixinWebServlet", "UTF-8");// 授权后重定向的回调链接地址,请使用urlencode对链接进行处理(文档要求)
            // 按照文档要求拼接访问地址
            String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="
                    + GlobalParams.APPID
                    + "&redirect_uri="
                    + redirect_uri
                    + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
            resp.sendRedirect(url);// 跳转到要访问的地址
    
        }
    }
    
  • 第二步:通过code换取网页授权access_token
        /**
         * 第二步:通过code换取网页授权access_token
         */
        String code = req.getParameter("code");// 获取返回码
        // 同意授权
        if (code != null) {
            // 拼接请求地址
            String url = "https://api.weixin.qq.com/sns/oauth2/access_token?"
                    + "appid=" + GlobalParams.APPID + "&secret="
                    + GlobalParams.SECERT
                    + "&code=" + code
                    + "&grant_type=authorization_code";
            String json = MyHttpUtils.getReturnJson(url, null);// 拿去返回值
            AutoWebParams autoWebParams = new AutoWebParams();
            Gson gson = new Gson();
            autoWebParams = gson.fromJson(json, new AutoWebParams().getClass());
        }
    
  • 第三步:刷新access_token(如果需要),我们按照文档要求来,使用这一步
        /**
         * 第三步:刷新access_token(如果需要)
         */
        String url2 = "https://api.weixin.qq.com/sns/oauth2/refresh_token?"
                + "appid=" + GlobalParams.APPID
                + "&grant_type=refresh_token&refresh_token="
                + autoWebParams.getRefresh_token();
        String json2 = MyHttpUtils.getReturnJson(url2, null);// 拿去返回值
        AutoWebParams autoWebParams2 = new AutoWebParams();
        Gson gson2 = new Gson();
        autoWebParams2 = gson2
                .fromJson(json2, new AutoWebParams().getClass());
    
  • 第四步:拉取用户信息(需scope为 snsapi_userinfo)
        /**
         * 第四步:拉取用户信息(需scope为 snsapi_userinfo)
         */
        String url3 = "https://api.weixin.qq.com/sns/userinfo?access_token="
                + autoWebParams2.getAccess_token()
                + "&openid="
                + autoWebParams2.getOpenid() + "&lang=zh_CN";
        String json3 = MyHttpUtils.getReturnJson(url3, null);// 拿去返回值
        UserInfo userInfo = new UserInfo();
        Gson gson3 = new Gson();
        userInfo = gson3.fromJson(new String(json3.getBytes(), "utf-8"),
                new UserInfo().getClass());
        System.out.println(userInfo);
    
  • 测试显示
        // 显示用户信息
        req.setAttribute("userInfo", userInfo);
        req.getRequestDispatcher("userinfo.jsp").forward(req, resp);
    
  • 显示的userinfo.jsp
    <body>
    <h1>页面太丑,只看内容</h1>
        <table style="margin: 0 auto;">
            <tr>
                <td>openid(id)</td>
                <td>${userInfo.openid}</td>
            </tr>
            <tr>
                <td>nickname(昵称)</td>
                <td>${userInfo.nickname}</td>
            </tr>
            <tr>
                <td>sex(性别)</td>
                <td>
                <c:if test="${userInfo.sex==0}">未知</c:if>
                <c:if test="${userInfo.sex==1}">男</c:if>
                <c:if test="${userInfo.sex==2}">女</c:if>
                </td>
            </tr>
            <tr>
                <td>province(省)</td>
                <td>${userInfo.province}</td>
            </tr>
            <tr>
                <td>city(市)</td>
                <td>${userInfo.city}</td>
            </tr>
            <tr>
                <td>country(国家)</td>
                <td>${userInfo.country}</td>
            </tr>
            <tr>
                <td>headimgurl(头像)</td>
                <td><img alt="头像" style="width: 40px;height: 40px;" src="${userInfo.headimgurl}"></td>
            </tr>
            <tr>
                <td>privilege(特权,什么意思看文档)</td>
                <td>
                <c:forEach items="${userInfo.privilege}" var="p">
                ${p.String }|
                </c:forEach>
                </td>
            </tr>
            <tr>
                <td>unionid(unionid)</td>
                <td>${userInfo.unionid}</td>
            </tr>
        </table>
    </body>
    

测试请在下面的测试号中访问该地址

http://42.96.144.28/WeixinApiDemo/GuideServlet

测试的微信号二维码

技术博客

源码下载

http://download.csdn.net/detail/wgyscsf/9508289

时间: 2024-10-06 18:46:33

java微信开发API解析(七)-网页开发-微信网页授权的相关文章

java微信开发API解析(五)-用户管理

java微信开发API解析(五)-用户管理 全局说明 * 详细说明请参考前两篇文章. 本文说明 *本文分为五部分: * 工具类MyHttpUtils的封装 * 用户分组管理文档的简单阅读解析 * 分组bean的构建以及各种分组管理的实现源码 * 用户管理的应用场景 * 测试的微信号二维码 * 本文只分析用户管理的用户分组管理部分,其它都大同小异,不再分析处理.如需要,请留言. * 以后原理分析会越来越简洁,具体原理分析请查看以前文章. * 下一篇文章会对于用户普通消息.自定义菜单消息.自动完成用

java微信开发API解析(六)-综合运用(消息处理、自定义菜单响应处理、用户自动分组处理;包含源码)

java微信开发API解析(六) 全局说明 * 详细说明请参考前两篇文章. 本文说明 * 本文主要是对前面学习的知识进行综合整合. * 我们对需要的bean.工具类.xml.file进行必要的包装. * 我们构建一个可以直接使用的Java微信应用. * 文后包含该部分效果的测试微信公众号 * 文后包含构建好的源码供下载 bean的构建 public class Access_token,获取Access_token对应的bean. private String access_token; pri

Force.com微信开发系列(七)OAuth2.0网页授权

OAuth是一个开放协议,允许用户让第三方应用以安全且标准的方式获取该用户在某一网站上存储的私密资源(如用户个人信息.照片.视频.联系人列表),而无须将用户名和密码提供给第三方应用.本文将详细介绍OAuth协议以及在微信里的具体实现. OAuth2.0协议介绍 OAuth2.0是OAuth协议的下一版本,但不向后兼容OAuth 1.0. OAuth 2.0关注客户端开发者的简易性,同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程. OAuth2.0允许用户提供一个令牌,而不是用户

Android开发-API指南-应用程序开发基础

Application Fundamentals 英文原文:http://developer.android.com/guide/components/fundamentals.html 采集日期:2014-04-16 搬迁自原博客:http://blog.sina.com.cn/s/blog_48d491300101h41p.html 在本文中 应用程序组件 激活组件 Manifest 文件 声明组件 声明应用程序的需求 应用程序资源 Android 应用程序是用 Java 语言编写的.And

java微信开发API解析(四)-自定义菜单以及个性化菜单实现

全局说明 * 详细说明请参考前两篇文章. 本文说明 *本文分为五部分: * 工具类AccessTokenUtils的封装 * 自定义菜单和个性化菜单文档的阅读解析 * 菜单JSON的分析以及构建对应bean * 自定义菜单的实现 * 个性化菜单的实现 * 微信自定义菜单所有类型菜单都给出演示 * 本文结束会给出包括本文前四篇文章的所有演示源码 工具类AccessTokenUtils的封装 在上文中关于AccessToken的获取和定时保存已经详细介绍过,此处直接给出处理过之后封装的AccessT

微信网页开发实践与总结

最新项目需要,开发微信端应用,用到微信生成菜单访问web应用,实际开发中一些技巧与大家分享,不足之处,欢迎交流指正! 一:注册微信开发测试账号 微信企业号申请比较繁琐,好找有微信测试账号,几乎可以开发微信全部的API 访问地址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 微信扫描登录即可 此时你会得到一个appID 和 appsecret 二:配置外网服务器    微信开发,必须将项目部署到外网并且端口必须为80,这

微信公众平台开发教程(七)安全策略

微信公众平台开发教程(七)安全策略 尽管处理微信请求的服务器,处于微信服务器的后端,但是安全问题依然不可小觑. 大概总结以下几个方面,希望引起注意. 一.设置高复杂度的Token,尽量隐藏服务地址URL URL:即为处理微信请求的链接地址Token:用户身份凭证 申请成为开发者或者修改URL\Token时,微信会通过Get请求访问URL,验证签名,其中需要Token. 过程相当于一次握手,如果握手成功,可进行后续的通信. 成为开发者后,我们也可以进行修改 面临的危险:  1.如URL和Token

微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码

教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码 由于最近比较忙,这个教程没有连续上,我会尽量连载.书节上回,上次我介绍了代公众号调用接口的方法和SDK的使用.不少朋友也都加了QQ群(2489462

微信公众平台网页开发实战--1.微信分享一个网页到朋友圈

对微信的JSSDK进行封装一下,创建一份类似的文件结构,增加index.html与shareApi.js文件,结构如图3.3所示. 图3.3  3.2节文件结构 另外,提醒读者一下,wxJSSDK.js文件的JSSDK环境配置中,需要更改一下配置参数,代码如下: 01 jsApiList: [ // 其他代码略 02 "onMenuShareTimeline", 03 "onMenuShareAppMessage", 04 "onMenuShareQQ&q