文檔:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.htmlhtml
!!!java
微信跟用戶沒有關係類接口採用了OAUTH2 【客戶端模式(Client Credentials Grant)】,而跟用戶有關係的接口,採用OAuth2.0服務端【受權碼模式(Authorization Code)】來得到用戶的openid;另外須要注意的一點就是須要在開發者中心頁配置受權回調域名,域名必須與設置的域名在同一個域下。git
網頁受權access_token和普通access_token的區別github
一、微信網頁受權是經過OAuth2.0機制實現的,在用戶受權給公衆號後,公衆號能夠獲取到一個網頁受權特有的接口調用憑證(網頁受權access_token),經過網頁受權access_token能夠進行受權後接口調用,如獲取用戶基本信息;
二、其餘微信接口,須要經過基礎支持中的「獲取access_token」接口來獲取到的普通access_token調用。
通常瞭解了OAUTH2的受權流程作起來就比較簡單了,能夠使用Apache Oltu 的客戶端來簡化代碼;我使用了一個JAVA實現微信的SDK fastweixin ,實現也比較簡單spring
/** * 微信公衆號控制器 * 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 apache
Refer:https://github.com/Wechat-Group/weixin-java-tools