『壹』 java基於微信開發,用oauth2靜默授權是,回調的url總是執行兩次,怎麼回事呀
用戶關注微信公眾賬號;
微信公眾賬號提供用戶請求授權頁面URL;
用戶點擊授權頁面URL,將向伺服器發起請求;
伺服器詢問用戶是否同意授權給微信公眾賬號;
用戶同意(scope為snsapi_base時無此步驟);
伺服器將CODE通過回調傳給微信公眾賬號;
微信公眾賬號獲得CODE;
微信公眾賬號通過CODE向伺服器請求Access Token;
伺服器返回Access Token和OpenID給微信公眾賬號;
微信公眾賬號通過Access Token向伺服器請求用戶信息;
伺服器將用戶信息回送給微信公眾賬號。
『貳』 緊急求助,微信設置「開發者中心」的 OAuth2.0網頁授權設置
1.OAuth 2.0網頁授權有兩種模式:
(1)
Base(基本型),用戶可直接通過鏈接訪問,相應的微信公眾賬號只能獲取用戶的openid,無法獲取到其它信息。
(2) Userinfo(用戶信息型),訪問時會彈出授權頁面,同意後微信公眾賬號可以獲取用戶其它信息,比如昵稱、頭像、性別、省份等等。
具體的設置方法,你可以按照韓順平的PHP微信開發課程來設置
『叄』 java中微信分享鏈接獲取openid,
1 首先,我們需要進入我們的服務號,點擊左側欄開發者中心--->修改網頁授權獲取用戶基本信息的值,假設我們對外的ip為183.33.212.175,tomcat的埠號為8016,這個修改為183.33.212.175:8016。
2 創建WeiXinOauth2Token類。該類具有以下屬性:(自行添加get,set方法)
private String accessToken;
private int expiresIn;
private String refeshToken;
private String openId;
private String scope;
3 調用微信的授權介面
4 然後將redirect_uri進行encode
5 獲取用戶openid
『肆』 java怎麼獲取微信的openid
java獲取微信的openid的方法是根據授權code來獲取的,方法如下:
一個Servlet請求 獲取code:
/**
* 根據code取得openId
*
* @param appid 公眾號的唯一標識
* @param secret 公眾號的appsecret密鑰
* @param code code為換取access_token的票據
* @return
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//參數
String code = request.getParameter("code");
if(null != code && !"".equals(code)){
log.info("==============[OAuthServlet]獲取網頁授權code不為空,code="+code);
//根據code換取openId
OAuthInfo oa = WeixinUtil.getOAuthOpenId(Constants.appId,Constants.appSecret,code);
UserInfo info = WeixinUtil.getUserInfo(oa.getAccessToken(), oa.getOpenId());
if(!"".equals(oa) && null != oa){
request.setAttribute("openid", oa.getOpenId());
request.setAttribute("nickname", info.getNickname());
request.getRequestDispatcher("/index.jsp").forward(request, response);
}else{
log.info("==============[OAuthServlet]獲取網頁授權openId失敗!");
}
}else{
log.info("==============[OAuthServlet]獲取網頁授權code失敗!");
}
}
替換相應的APPID APPSECRET SCOPE。
過code換取網頁授權access_token 這里的access_token與基礎獲取的access_token不同
獲取code後,請求以下鏈接獲取access_token:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
具體做法與上面基本一致。更換相對應的值。需要注意的是code可以寫一個Servlet獲取。String code = request.getParameter("code");get/post都可以。
這樣子就會返回一下json格式數據
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
『伍』 微信web開發者工具如何進行調試微信網頁授權
具體操作步驟為:
開發者可以在調試器中點擊「登錄」,使用手機微信掃碼登錄,從而使用真實的用戶身份來開發和調試微信網頁授權。請確認手機登錄頁,綁定的公眾號為「微信 web 開發者工具」,如下圖所示:
為了保證開發者身份信息的安全,對於希望調試的公眾號,我們要求開發者微信號與之建立綁定關系。具體操作為:公眾號登錄管理後台,啟用開發者中心,在開發者工具——web 開發者工具頁面,向開發者微信號發送綁定邀請。
開發者在手機微信上接受邀請,即可完成綁定。每個公眾號最多可同時綁定10個開發者微信號。
完成登錄和綁定後,開發者就可以開始調試微信網頁授權了:
非靜默授權的 URL: https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx841a97238d9e17b2&redirect_uri=http://cps.dianping.com/weiXinRedirect&response_type=code&scope=snsapi_userinfo&state=type%3Dquan%2Curl%3Dhttp%3A%2F%2Fmm.dianping.com%2Fweixin%2Faccount%2Fhome
點擊「確認登錄」即可帶著用戶信息跳轉到第三方頁面,很方便的進行後續的開發和調試。
靜默授權的 URL: https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx841a97238d9e17b2&redirect_uri=http://cps.dianping.com/weiXinRedirect&response_type=code&scope=snsapi_base&state=type%3Dquan%2Curl%3Dhttp%3A%2F%2Fmm.dianping.com%2Fweixin%2Faccount%2Fhome
在微信 web 開發者工具中打開該 URL 則會自動跳轉到第三方頁面。
『陸』 oauth2.0網頁授權微信怎麼用java獲取code
@RequestMapping(value="oauth2/{type}/{appId}/{scope}", method=RequestMethod.GET)
public ModelAndView index(@PathVariable String type,@PathVariable String appId,@PathVariable String scope,String openId){
ModelAndView view=new ModelAndView();
if(StringUtils.isEmpty(appId)||mapWxAppInfo.get(appId)==null){
view.setViewName("fail");
return view;
}
//scope=snsapi_base 獲取用戶openId,無需授權
//scope=snsapi_userinfo 獲取用戶基本信息,需授權
String oauthUrl="https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s#wechat_redirect";
//處理授權回調地址
String callback="http://wx.lrlz.com/wx/callback/"+appId;
if(!StringUtils.isEmpty(openId)){
callback += "/"+openId;
}
oauthUrl=String.format(oauthUrl, appId,callback,scope,type);
log.info("微信授權認證地址="+oauthUrl);
view.setViewName("redirect:" + oauthUrl);
return view;
}
/**
* 處理網頁授權回調
* */
@RequestMapping(value="callback/{appId}")
public ModelAndView callback(@PathVariable String appId,String code,String state,String redirectUri,HttpServletRequest req,HttpServletResponse response){
return getCallback(appId,code,state,null);
}
這樣就行了