zoukankan      html  css  js  c++  java
  • 微信 OAuth2 网页授权获取用户信息

    文档:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html

    !!!

    微信跟用户没有关系类接口采用了OAUTH2 【客户端模式(Client Credentials Grant)】,而跟用户有关系的接口,采用OAuth2.0服务端【授权码模式(Authorization Code)】来获得用户的openid;另外需要注意的一点就是需要在开发者中心页配置授权回调域名,域名必须与设置的域名在同一个域下

    网页授权access_token和普通access_token的区别

    1、微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息;
    2、其他微信接口,需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。

    实现

    一般了解了OAUTH2的授权流程做起来就比较简单了,可以使用Apache Oltu 的客户端来简化代码;我使用了一个JAVA实现微信的SDK fastweixin ,实现也比较简单

    /**
     * 微信公众号控制器
     * Created by Irving on 2014/7/6.
     */
    @Controller
    @RequestMapping("/weixin")
    public class WeixinController extends WeixinControllerSupport {
        private static final Logger logger = LoggerFactory.getLogger(WeixinController.class);
    
        private static final String AppId = "";
        private static final String AppSecret = "";
        //令牌
        private static final String TOKEN = "e_llt";
        //设置TOKEN,用于绑定微信服务器
        @Override
        protected String getToken() {
            return TOKEN;
        }
        //不再强制重写,有加密需要时自行重写该方法[使用安全模式时设置:APPID]
        @Override
        protected String getAppId() {
            return null;
        }
        //不再强制重写,有加密需要时自行重写该方法[使用安全模式时设置:密钥]
        @Override
        protected String getAESKey() {
            return null;
        }
    
        //重写父类方法,处理对应的微信消息
        @Override
        protected BaseMsg handleTextMsg(TextReqMsg msg) {
            String content = msg.getContent();
            logger.debug("用户发送到服务器的内容:{}", content);
            return new TextMsg("hava fun,by irving!");
        }
    
        @Override
        protected BaseMsg handleSubscribe(BaseEvent event) {
            UserAPI userAPI =new UserAPI(new ApiConfig(AppId,AppSecret));
            logger.info("handleSubscribe json: "+ toJSON(event) + "  userAPI : "+toJSON(userAPI));
            GetUserInfoResponse user= userAPI.getUserInfo(event.getFromUserName());
            String msg ="Hi "+user.getNickname()+" 欢迎关注!";
            return new TextMsg(msg);
        }
    
        @Override
        protected BaseMsg handleUnsubscribe(BaseEvent event) {
            logger.info("handleUnsubscribe json: "+ toJSON(event));
            return super.handleUnsubscribe(event);
        }
    
    
        /*1.1版本新增,重写父类方法,加入自定义微信消息处理器
             *不是必须的,上面的方法是统一处理所有的文本消息,如果业务觉复杂,上面的会显得比较乱
             *这个机制就是为了应对这种情况,每个MessageHandle就是一个业务,只处理指定的那部分消息
             */
        @Override
        protected List<MessageHandle> initMessageHandles() {
            List<MessageHandle> handles = new ArrayList<MessageHandle>();
            //handles.add(new MyMessageHandle());
            return handles;
        }
    
        @Override
        protected List<EventHandle> initEventHandles() {
            List<EventHandle> handles = new ArrayList<EventHandle>();
            //handles.add(new MyEventHandle());
            return handles;
        }
    
        /**
         * oauth2 授权
         * @return
         */
        @RequestMapping("/authorize")
        public String authorize() {
            OauthAPI oauthAPI = new OauthAPI(new ApiConfig(AppId,AppSecret));
            String url=oauthAPI.getOauthPageUrl("http://xxx.com/wx/weixin/oauth2", OauthScope.SNSAPI_USERINFO, "ellt");
            return "redirect:"+url;
        }
    
        /**
         * 授权成功页
         * @param code
         * @param state
         * @return
         */
        @RequestMapping("/oauth2")
        public String oauth2(HttpServletRequest request,String code,String state) {
            logger.info("weixin oauth2 code :"+code +" state : "+state);
            OauthAPI oauthAPI = new OauthAPI(new ApiConfig(AppId,AppSecret));
            OauthGetTokenResponse oauthGetToken =oauthAPI.getToken(code);
            GetUserInfoResponse oauthUserInfo= oauthAPI.getUserInfo(oauthGetToken.getAccessToken(),oauthGetToken.getOpenid());
            request.setAttribute("userInfo", toJSONString(oauthUserInfo));
            request.setAttribute("user",oauthUserInfo);
            return "weixin/oauth2";
        }

    !!!集成springmvc 放到github:https://github.com/zhouyongtao/ellt-weixin

    Refer:
    https://github.com/Wechat-Group/weixin-java-tools
  • 相关阅读:
    【不错的文章收藏了】我的Delphi开发经验谈
    【转载】Delphi异常处理try except语句和try finally语句用法以及区别
    Asp防止网页频繁刷新和强制不缓存的方法
    JavaScript的document和window对象详解
    Delphi下获取系统默认的UserAgent的方法
    【转载】ACCESS技巧集(DELPHI AND SQL)
    c#中const与readonly区别
    C#中virtual 方法和abstract方法的区别
    static(C# 参考)
    按键精灵
  • 原文地址:https://www.cnblogs.com/Irving/p/4690945.html
Copyright © 2011-2022 走看看