微信 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM