微信公眾號網頁授權獲取用戶openid


最近一個項目是在微信公眾號內二次開發,涉及到微信公眾號支付,根據文檔要求想要支付就必須要獲取到用戶的openid。

這是微信官方文檔https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

官方流程 
網頁授權流程分為四步: 
1、引導用戶進入授權頁面同意授權,獲取code 
2、通過code換取網頁授權access_token(與基礎支持中的access_token不同) 
3、如果需要,開發者可以刷新網頁授權access_token,避免過期 
4、通過網頁授權access_token和openid獲取用戶基本信息(支持UnionID機制)

我的思路 
1、首先是要在公眾號后台進行配置,設置回調路徑,具體要求參照官方文檔。

這里寫圖片描述

要將這里的txt文件放在項目根路徑下,否則上面的回調域名是無法保存的。

這里寫圖片描述

這里寫圖片描述 
2、用戶訪問第三方頁面時,先去請求一個api,獲取code和state

code說明 : code作為換取access_token的票據,每次用戶授權帶上的code將不一樣,code只能使用一次,5分鍾未被使用自動過期。

請求API參數拼接 
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxXXXXXXXXXXXXXXXXXXXXXX&redirect_uri=http://XXXXXXXXXXX/ydx-business/payWeiXin/getOpenId&response_type=code&scope=snsapi_userinfo&state=1&connect_redirect=1#wechat_redirect

這里的scope分為兩種:一種是靜默方式(snsapi_base);一種是非靜默方式(snsapi_userinfo),需要用戶去手動點擊同意才能獲取用戶的信息。

這是非靜默方式授權

非靜默方式

靜默方式直接就獲取到了openid

這里寫圖片描述

3、在1中配置的回調方法中根據獲取到的code和state再去請求如下接口,獲取access_token 和openid。

獲取code后,請求以下鏈接獲取access_token: 
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

代碼段


@SuppressWarnings("null") @RequestMapping("/getOAuth") public String getOAuth(){ String code = request.getParameter("code");//獲取微信服務器授權返回的code值 String state = request.getParameter("state");//驗證是否來自微信重定向的請求 PrintWriter pw = null; try { pw = response.getWriter(); if(Constant.STATE.equals(state)){ /** * 構造請求鏈接 * https://api.weixin.qq.com/sns/oauth2/access_token? * appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code */ String url = Constant.ACCESS_TOKEN_URL+Constant.APP_ID+"&secret="+Constant.APP_SECRET+"&code="+code+"&grant_type=authorization_code"; String jsonStr = HttpUtil.httpRequest(url); String openid = JSONObject.parseObject(jsonStr).getString("openid"); System.out.println(openid+"=========================="); session = request.getSession(); session.setAttribute("openid", openid); return "login/wx_login";//登錄頁面 }else{ response.setContentType("text/html;charset=utf-8"); pw.write("<script>alert('授權失敗!');</script>"); pw.flush(); pw.close(); } } catch (IOException e) { e.printStackTrace(); response.setContentType("text/html;charset=utf-8"); pw.write("<script>alert('發生后台異常!');</script>"); pw.flush(); pw.close(); } return null; }

 

總結:到此就已經獲取到了用戶的openid,因為只涉及支付業務所用就不再往下獲取用戶的個人信息。感覺微信這里的官方文檔邏輯還都比較清楚,照着流程走下來一般都沒什么問題,具體如何獲取到openid的代碼可以參考我前文里的那段,已經在實際項目中實踐過。


免責聲明!

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



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