從接觸公眾號(hào)到現(xiàn)在,通過(guò)不斷積累學(xué)習(xí),對(duì)如何調(diào)用微信提供接口有了一定的見(jiàn)解。當(dāng)然在開(kāi)發(fā)過(guò)程中遇到很多問(wèn)題,現(xiàn)在把部分模塊功能在這備案一下,做個(gè)總結(jié)也希望能給其他人幫助
工欲善其事,必先利其器,先看看開(kāi)發(fā)公眾號(hào)需要準(zhǔn)備或了解什么
web開(kāi)發(fā)工具:官方提供的開(kāi)發(fā)工具,使用自己的微信號(hào)來(lái)調(diào)試微信網(wǎng)頁(yè)授權(quán)、調(diào)試、檢驗(yàn)頁(yè)面的 JS-SDK 相關(guān)功能與權(quán)限,模擬大部分 SDK 的輸入和輸出。下載地址:web開(kāi)發(fā)工具下載開(kāi)發(fā)文檔:https://mp.weixin.qq.com/wiki登錄微信測(cè)試公眾號(hào),獲取公眾號(hào)的appID、appsecret,登錄地址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login?(一般測(cè)試開(kāi)發(fā)階段,都不拿正式公眾號(hào)測(cè)試,因?yàn)榇嬖陲L(fēng)險(xiǎn)并且你調(diào)試時(shí)不用擔(dān)心影響到正式公眾號(hào)的正常使用,而且有些接口在正式公眾號(hào)上比較嚴(yán)格,而在測(cè)試公眾號(hào)上可以放開(kāi),如模板信息)
下面進(jìn)入正題,實(shí)現(xiàn)微信網(wǎng)頁(yè)授權(quán),獲取微信信息,主要用于以微信帳號(hào)作為用戶登錄,如果你只是需要綁定微信,就可以不用授權(quán),直接請(qǐng)求獲取微信OpenId(對(duì)當(dāng)前公眾號(hào)唯一),進(jìn)行用戶綁定(在下面代碼時(shí)是寫(xiě)明如何實(shí)現(xiàn)),該功能可在開(kāi)發(fā)文檔:微信網(wǎng)頁(yè)開(kāi)發(fā)-》微信網(wǎng)頁(yè)授權(quán)里查看詳細(xì)信息,下面正式開(kāi)始。
1.填寫(xiě)授權(quán)回調(diào)頁(yè)面域名
進(jìn)入測(cè)試公眾號(hào),在體驗(yàn)接口權(quán)限表中找到網(wǎng)頁(yè)帳號(hào),右側(cè)添加自己的域名,測(cè)試公眾號(hào)可填寫(xiě)本地IP,如你是正式公眾號(hào)只能填寫(xiě)自己的域名,如果未填寫(xiě),當(dāng)進(jìn)行接口調(diào)用時(shí),會(huì)提示:redirect_uri參數(shù)錯(cuò)誤!如果還有其他不了解的配置,可以在開(kāi)發(fā)文檔里查看詳信息,
2.代碼展示
1).調(diào)用微信接口返回的參數(shù)都是JSON格式,封裝個(gè)Http請(qǐng)求方法
[java]?view plaincopy
public?class?WeixinUtil?{????????????????????public?static?JSONObject?httpRequest(String?requestUrl,?String?requestMethod,?String?outputStr)?{??????JSONObject?jsonObject?=?null;??????StringBuffer?buffer?=?new?StringBuffer();??????try?{????????????????????TrustManager[]?tm?=?{?new?MyX509TrustManager()?};??????????SSLContext?sslContext?=?SSLContext.getInstance("SSL",?"SunJSSE");??????????sslContext.init(null,?tm,?new?java.security.SecureRandom());????????????????????SSLSocketFactory?ssf?=?sslContext.getSocketFactory();??????????URL?url?=?new?URL(requestUrl);??????????HttpsURLConnection?httpUrlConn?=?(HttpsURLConnection)?url.openConnection();??????????httpUrlConn.setSSLSocketFactory(ssf);??????????httpUrlConn.setDoOutput(true);??????????httpUrlConn.setDoInput(true);??????????httpUrlConn.setUseCaches(false);????????????????????httpUrlConn.setRequestMethod(requestMethod);??????????if?("GET".equalsIgnoreCase(requestMethod))??????????????httpUrlConn.connect();????????????????????if?(null?!=?outputStr)?{??????????????OutputStream?outputStream?=?httpUrlConn.getOutputStream();????????????????????????????outputStream.write(outputStr.getBytes("UTF-8"));??????????????outputStream.close();??????????}????????????????????InputStream?inputStream?=?httpUrlConn.getInputStream();??????????InputStreamReader?inputStreamReader?=?new?InputStreamReader(inputStream,?"utf-8");??????????BufferedReader?bufferedReader?=?new?BufferedReader(inputStreamReader);??????????String?str?=?null;??????????while?((str?=?bufferedReader.readLine())?!=?null)?{??????????????buffer.append(str);??????????}??????????bufferedReader.close();??????????inputStreamReader.close();????????????????????inputStream.close();??????????inputStream?=?null;??????????httpUrlConn.disconnect();??????????jsonObject?=?JSONObject.fromObject(buffer.toString());??????}?catch?(ConnectException?ce)?{??????????log.error("Weixin?server?connection?timed?out.");??????}?catch?(Exception?e)?{??????????log.error("https?request?error:{}",?e);??????}??????return?jsonObject;??????}??}??2).下面展示訪問(wèn)個(gè)人中心時(shí),進(jìn)行用戶授權(quán)
[java]?view plaincopy
???????@RequestMapping("/gotoPeopleIndex")??public?String?gotoPeopleIndex(HttpServletRequest?request,HttpServletResponse?response){????????????WeixinUserInfo?WeixinUserInfo?=??(WeixinUserInfo)?session.getAttribute("WeixinUserInfo");??????if(WeixinUserInfo==null){??????????String?url??=?"https://open.weixin.qq.com/connect/oauth2/authorize?appid="+TimedTask.appid+"&redirect_uri="+TimedTask.websiteAndProject+"/weixinF/getOpenInfo/gotoPeopleIndex&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";??????????return?"redirect:"+url;??????}else{??????????return?"weixin/customer/userInfo";??????}??}????????????????@RequestMapping("/getOpenInfo/{view}")??public?void?getOpenInfo(@RequestParam("code")?String?code,@RequestParam("state")?String?state,@PathVariable("view")?String?view,HttpServletRequest?request,HttpServletResponse?response)?throws?ServletException,?IOException{????????????if?(!"authdeny".equals(code))?{????????????????????OpenIdResult?open?=?WeixinUtil.getOpenId(request,?code,?TimedTask.appid,?TimedTask.appsecret);????????????????????int?result?=?WeixinUtil.checkAccessToken(open.getAccess_token(),?open.getOpenid());??????????if(0?!=?result){??????????????open?=?WeixinUtil.getNewAccess_Token(open,open.getRefresh_token(),TimedTask.appid);??????????}????????????????????String?accessToken?=?open.getAccess_token();??????????String?openId?=?open.getOpenid();????????????????????WeixinUserInfo?user?=?WeixinUtil.getWeixinUserInfo(accessToken,?openId);??????????Customer?customer?=?weixinFirstServer.getCustomerDetailByOpenId(user.getOpenId());??????????if(customer!=null){??????????????if(customer.getAccountStatus()==2){??????????????????response.setContentType("text/html;?charset=UTF-8");??????????????????try?{??????????????????????response.sendRedirect(TimedTask.websiteAndProject+"/weixin/customer/noAuthority.jsp");??????????????????}?catch?(IOException?e)?{??????????????????????e.printStackTrace();??????????????????}??????????????????return;??????????????}??????????????customer.setHeadPhoto(user.getHeadImgUrl());??????????}else{??????????????Customer?newuser?=?new?Customer();??????????????newuser.setCustomerWeixinId(openId);??????????????newuser.setCustomerWNickname(user.getNickname());??????????????newuser.setSex(user.getSex());????????????????????????????result?=?weixinFirstServer.addCustomerInfo(newuser);??????????????if(result<=0){??????????????????response.setContentType("text/html;?charset=UTF-8");??????????????????try?{??????????????????????response.sendRedirect(TimedTask.websiteAndProject+"/weixin/customer/error.jsp");??????????????????}?catch?(IOException?e)?{??????????????????????e.printStackTrace();??????????????????}??????????????}else{??????????????????customer?=?weixinFirstServer.getCustomerDetailByOpenId(user.getOpenId());??????????????????if(customer.getAccountStatus()==2){??????????????????????response.setContentType("text/html;?charset=UTF-8");??????????????????????try?{??????????????????????????response.sendRedirect(TimedTask.websiteAndProject+"/weixin/customer/noAuthority.jsp");??????????????????????}?catch?(IOException?e)?{??????????????????????????e.printStackTrace();??????????????????????}??????????????????????return;??????????????????}??????????????}??????????}??????????session.setAttribute("customerInfo",?customer);??????????session.setAttribute("WeixinUserInfo",?user);??????????request.setAttribute("state",?state);??????????response.setContentType("text/html;?charset=UTF-8");??????????try?{??????????????response.sendRedirect(TimedTask.websiteAndProject+"/weixinF/"+view);??????????}?catch?(IOException?e)?{??????????????e.printStackTrace();??????????}??????}else{??????????response.setContentType("text/html;?charset=UTF-8");??????????try?{??????????????response.sendRedirect(TimedTask.websiteAndProject+"/weixin/customer/error.jsp");??????????}?catch?(IOException?e)?{??????????????e.printStackTrace();??????????}??????}??}??
微信工具類(lèi)代碼:
[java]?view plaincopy
public?class?WeixinUtil?{??????public?final?static?String?getOpen_id_url?=?"https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";?????????????????public?static?int?checkAccessToken(String?accessToken,?String?openid)?{??????????String?requestUrl?=?"https://api.weixin.qq.com/sns/auth?access_token="+accessToken+"&openid="+openid;??????????JSONObject?jsonObject?=?httpRequest(requestUrl,?"GET",?null);??????????int?result?=?1;????????????????????if?(null?!=?jsonObject)?{??????????????try?{??????????????????result?=?jsonObject.getInt("errcode");??????????????}?catch?(JSONException?e)?{??????????????????accessToken?=?null;????????????????????????????????????log.error("獲取token失敗?errcode:{}?errmsg:{}",?jsonObject.getInt("errcode"),?jsonObject.getString("errmsg"));??????????????}??????????}??????????return?result;??????}???????????????public?static?OpenIdResult?getNewAccess_Token(OpenIdResult?open,String?refresh_token,String?openId)?{??????????String?requestUrl?=?getNewAccess_token.replace("REFRESH_TOKEN",?refresh_token).replace("APPID",?openId);??????????JSONObject?jsonObject?=?httpRequest(requestUrl,?"GET",?null);????????????????????if?(null?!=?jsonObject)?{??????????????try?{??????????????????open.setAccess_token(jsonObject.getString("access_token"));??????????????}?catch?(JSONException?e)?{????????????????????????????????????log.error("獲取token失敗?errcode:{}?errmsg:{}",?jsonObject.getInt("errcode"),?jsonObject.getString("errmsg"));??????????????}??????????}??????????return?open;??????}???????????????????public?static?OpenIdResult?getOpenId(HttpServletRequest?request,?String?code,String?appid,?String?appsecret)?{??????????String?requestURI?=?request.getRequestURI();??????????String?param?=?request.getQueryString();??????????if(param!=null){??????????????requestURI?=?requestURI+"?"+param;??????????}??????????String?url?=?getOpen_id_url.replace("APPID",appid).replace("SECRET",appsecret).replace("CODE",code);??????????JSONObject?jsonObject?=?httpRequest(url,?"POST",?null);??????????OpenIdResult?result?=?new?OpenIdResult();??????????if?(null?!=?jsonObject)?{??????????????Object?obj?=?jsonObject.get("errcode");??????????????if?(obj?==?null)?{??????????????????result.setAccess_token(jsonObject.getString("access_token"));??????????????????result.setExpires_in(jsonObject.getString("expires_in"));??????????????????result.setOpenid(jsonObject.getString("openid"));??????????????????result.setRefresh_token(jsonObject.getString("refresh_token"));??????????????????result.setScope(jsonObject.getString("scope"));??????????????}else{??????????????????System.out.println("獲取openId回執(zhí):"+jsonObject.toString()+"訪問(wèn)路徑:"+requestURI);??????????????????log.error("訪問(wèn)路徑:"+requestURI);??????????????????log.error("獲取openId失敗?errcode:{}?errmsg:{}",?jsonObject.getInt("errcode"),?jsonObject.getString("errmsg"));??????????????}??????????}??????????return?result;??????}?????????????????public?static?WeixinUserInfo?getWeixinUserInfo(String?accessToken,?String?openId)?{??????????WeixinUserInfo?user?=?null;????????????????????String?requestUrl?=?"https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";??????????requestUrl?=?requestUrl.replace("ACCESS_TOKEN",?accessToken).replace("OPENID",?openId);????????????????????JSONObject?jsonObject?=?httpRequest(requestUrl,?"GET",?null);??????????if?(null?!=?jsonObject)?{??????????????try?{??????????????????user?=?new?WeixinUserInfo();????????????????????????????????????user.setOpenId(jsonObject.getString("openid"));????????????????????????????????????user.setNickname(jsonObject.getString("nickname"));????????????????????????????????????user.setSex(jsonObject.getInt("sex"));????????????????????????????????????user.setCountry(jsonObject.getString("country"));????????????????????????????????????user.setProvince(jsonObject.getString("province"));????????????????????????????????????user.setCity(jsonObject.getString("city"));????????????????????????????????????user.setHeadImgUrl(jsonObject.getString("headimgurl"));????????????????????????????????????user.setPrivilegeList(JSONArray.toList(jsonObject.getJSONArray("privilege"),?List.class));??????????????}?catch?(Exception?e)?{??????????????????user?=?null;??????????????????int?errorCode?=?jsonObject.getInt("errcode");??????????????????String?errorMsg?=?jsonObject.getString("errmsg");??????????????????log.error("獲取用戶信息失敗?errcode:{}?errmsg:{},reqUrl{}",?errorCode,?errorMsg);??????????????}??????????}??????????return?user;??????}??}??下面展示,當(dāng)用戶session失效時(shí),自動(dòng)登錄的代碼,這時(shí)是不需要授權(quán)的
[java]?view plaincopy
@RequestMapping("/gotoGoodsView")??public?String?gotoGoodsView(@RequestParam(value="longitude",defaultValue="",required=false)?String?longitude,@RequestParam(value="latitude",defaultValue="",required=false)?String?latitude){??????String?param?=?request.getQueryString();??????String?url?=?request.getServletPath();??????if(param!=null){??????????url?=?url+"?"+param.replaceAll("&","-");??????}??????Customer?customerInfo?=?(Customer)?session.getAttribute("customerInfo");??????if(customerInfo==null){??????????return?"redirect:/weixinF/getCode?view="+TimedTask.websiteAndProject+"/weixinF/autoLogin&view2="+TimedTask.websiteAndProject+url;??????}??????return?"/weixin/customer/goodsList";??}??@RequestMapping("/getCode")??public?void?getCode(HttpServletResponse?response){??????String?view??=?request.getParameter("view");??????String?view2??=?request.getParameter("view2");??????String?redirect_url?=?"";??????try?{??????????redirect_url?=?URLEncoder.encode(view,"UTF-8");??????????if(view2!=null?&&?!"".equals(view2)){??????????????view2?=?view2.replaceAll("-","&");??????????????redirect_url?=?redirect_url?+"?redirect_url="+?URLEncoder.encode(URLEncoder.encode(view2,"UTF-8"),"UTF-8");??????????}??????}?catch?(UnsupportedEncodingException?e1)?{??????????e1.printStackTrace();??????}??????String?url?=?WeixinUtil.getCode_url.replace("APPID",TimedTask.appid).replace("REDIRECT_URI",redirect_url);??????response.setContentType("text/html;?charset=UTF-8");??????try?{??????????response.sendRedirect(url);??????}?catch?(IOException?e)?{??????????e.printStackTrace();??????}??}????????????@RequestMapping("/autoLogin")??public?String?autoLogin(HttpServletResponse?response,@RequestParam(value="code",defaultValue="")?String?code,@RequestParam(value="redirect_url",defaultValue="")?String?url){??????OpenIdResult?open?=?WeixinUtil.getOpenId(request,code,TimedTask.appid,TimedTask.appsecret);????????????Customer?customerInfo?=?weixinFirstServer.getCustomerDetailByOpenId(open.getOpenid());??????if(customerInfo!=null){??????????if(customerInfo.getAccountStatus()==2){??????????????return?"redirect:"+TimedTask.websiteAndProject+"/weixin/customer/noAuthority.jsp";??????????}??????????session.setAttribute("customerInfo",?customerInfo);??????????response.setContentType("text/html;?charset=UTF-8");??????????try?{??????????????response.sendRedirect(url);??????????}?catch?(IOException?e)?{??????????????e.printStackTrace();??????????}??????????return?null;??????}else{??????????url=?url.replaceAll("&","-");??????????url?=?url.replace(TimedTask.websiteAndProject,"");??????????String?redirectUrl??=?"https://open.weixin.qq.com/connect/oauth2/authorize?appid="+TimedTask.appid+"&redirect_uri="+TimedTask.websiteAndProject+"/weixinF/getOpenInfoRedirectAction?actionName="+url+"&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";??????????response.setContentType("text/html;?charset=UTF-8");??????????try?{??????????????response.sendRedirect(redirectUrl);??????????}?catch?(IOException?e)?{??????????????e.printStackTrace();??????????}??????????return?null;??????}??}??到此,微信網(wǎng)頁(yè)授權(quán)認(rèn)證,與session失效自動(dòng)登錄已經(jīng)完成,如果有問(wèn)題歡迎在評(píng)論區(qū)指出
總結(jié)
以上是生活随笔為你收集整理的(微信公众号开发《一》OAuth2.0网页授权认证获取用户的详细信息,实现自动登陆)http://blog.csdn.net/liaohaojian/article/details/70175835的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。