Java开发微信公众号
復源碼(文章結尾)
目錄
申請公眾號測試號與設置
?各配置解釋
接口配置信息
JS接口安全域名
測試號二維碼
模板消息接口
如何獲取用戶的openid
獲取網頁授權用戶基本信息解釋
域名
參數scope
UnionID
代碼獲取openId、scope=snsapi_base
第一步:先獲取code
第二步:通過code換取access_token(鑒權token)
第三步:通過openid 獲取用戶個人信息
代碼獲取openId、scope=snsapi_userinfo
太多了,直接貼代碼
兩個access_token的不同
采坑說明
說兩句廢話
?
前言:工作中需要用到開發公眾號,第一次摸索,記一下筆記,避免以后忘干凈;
申請公眾號測試號與設置
? ? ? ? ?微信提供了測試開發平臺給開發者,開發者可以申請測試號來進行申請;剛開始開發的時候,我還申請了一個公眾號,現在發現根本沒有必要,雖然在開發中,也可以在自己的公眾號中進行設置,也可以開發,但是畢竟也走了一些彎路,而且很多高級接口需要權限才能調用,或者有次數限制,不推薦;申請的測試號如下圖
?其中:appID、appsecret這兩個信息,是你公眾號的標識;調用接口的時候知道帶上就行
?各配置解釋
-
接口配置信息
?
剛開始開發,就傻乎乎的配置了一通,也成功了,但是在后面的開發中,發現這玩意配置不配置無所謂,一樣能調用微信的接口,比如創建公眾號菜單等;可能是我太菜雞?
其實反復查看微信文檔說的,這個接口配置是這個意思,一下是微信官方文檔原話;“開發者填寫的服務器配置URL將得到微信服務器推送過來的消息和事件,開發者可以依據自身業務邏輯進行響應,如回復消息。”
一句話描述就是,微信調我們的接口的時候需要用到;這就懂了,艸皿艸 ;所以我們項目中還沒有用到(尷尬);
源碼位置(com.wechat.demo.wxcontroller.WeChatController#wechat)
-
JS接口安全域名
?就是,你可以設置一個域名(反正不可能支持ip地址調用),直接調用微信的JS接口;關于域名,可以使用ngrok做映射,就不啰嗦;
-
測試號二維碼
?
微信提供的測試公眾號,使用手機微信掃碼關注就行,可以實時看到自己開發的咋樣;
-
模板消息接口
沒用過,不清楚,等我用過之后,再來完善文章;?
-
體驗接口權限表
這些列表就是微信提供的所有接口了;按照說明文檔開發就行;?比較重要的是下圖中的 網頁授權獲取用戶信息 這個接口;
?
點擊修改的時候,會展示下圖;意思是,用戶同意授權之后,微信會調用咱們寫的頁面,或者是接口。把code專遞過來,然后我們自己再通過code換取access_token;
?
如何獲取用戶的openid
在微信公眾號開發中,獲取關注公眾號用戶的openid是至關重要的,不然你都分不清誰是誰;點擊 “網頁授權獲取用戶基本信息” ,查看文檔,按接口調用就行了,不過坑是真滴多;說一說,加強一下記憶吧;
獲取網頁授權用戶基本信息解釋
鄙人當時看過這個文檔之后,就像說一句話,這啥啊?自己摸索了一周之后,搞明白了;
域名
網頁授權獲取用戶基本信息?:這個修改時,填的是域名,不加 `http://`或者 `https://`的 (艸)
授權回調域名配置規范為全域名 : 意思是?redirect_uri (回調參數) 寫的是帶http的
參數scope
scope為snsapi_base :可以理解為,只要在微信公眾號中,點擊可按鈕,就可以獲取到用戶的授權;
scope為snsapi_userinfo:可以理解為,彈出一個頁面,讓你點同意,才能授權;
UnionID
就是你公司有10個公眾號,用戶只認證了其中一個,其他公眾號關注了之后也可以操作,不用再重復認證;
代碼獲取openId、scope=snsapi_base
第一步:先獲取code
在申請的測試號中讓用戶點擊一個連接登陸,或者點擊一個菜單登錄也行、如下圖;創建菜單和公眾號自動回復功能比較簡單;太多了,實在是敲不動了;后面有源碼,源碼位置(com.wechat.demo.wxcontroller.WeChatController#getUserMsg)
?登錄的連接如下
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxef4d3ff57f4ced1f&redirect_uri=http://9e18-222-94-217-138.ngrok.io/getUserInfoBase&response_type=code&scope=snsapi_base&state=123#wechat_redirect當點擊連接的時候,我們就可以獲取code了;其中 url 中的?redirect_uri參數的值,回調的是我們自己的接口;這個時候我們可以在接口中獲取到code中的值;其中?scope=snsapi_base
上面這個鏈接,只能在微信中打開,也可以在微信開發者中打開;
第二步:通過code換取access_token(鑒權token)
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code把第一步回調過來的code,放入url中,APPID、SECRET換成你自己的測試號信息就行;其實這一步,接口調用后,不光能獲取到access_token;也能獲取到openId;哈哈哈;
那獲取access_token(鑒權token)有什么用呢?其實是有用的;如果scope為snsapi_userinfo,那么這個access_token(鑒權token)是有用的,下面再說;
其實這個時候就已經拿到openId 了;
第三步:通過openid 獲取用戶個人信息
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN說明:這個url是 scope為 snsapi_base 的獲取個人信息的接口,它的access_token傳值傳的就是普通的access_token;這樣就能獲取管住的用戶的個人信息了;返回的信息參考微信文檔就行;
而下面這個url?
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
這個url 是 scope 為?snsapi_userinfo 的獲取個人信息的接口,它的access_token傳值傳的是網頁鑒權token,名字也叫 access_token;而這個access_token(鑒權access_token)怎么傳值呢?其實就是上邊說的第二步;
操蛋不操蛋?我搞清楚這兩個不同,用了好幾天,可能我是一個菜雞啊;
/*** getUserInfoBase 通過code交換accessToken ,再通過accessToken獲取openId,再通過openId,獲取用戶信息* @param request* @param response* @throws IOException*/@RequestMapping(value = "/getUserInfoBase",method = RequestMethod.GET)public Object getUserInfoBase(HttpServletRequest request, HttpServletResponse response, Model model) throws IOException {String code = request.getParameter("code");System.out.println("code:"+code);// 通過code 換取accessToken的地址String getAccess_token = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";String replace = getAccess_token.replace("APPID", "wxef4d3ff57f4ced1f").replace("SECRET", "e012bfb1fc0bbebc67324112902a2ca6").replace("CODE", code);String s = HttpClientTool.doGet(replace, null);System.out.println("獲取到的accessToken結果是:" + JSONObject.toJSONString(s));Object openid = JSONObject.parseObject(s).get("openid");// 獲取用戶的基本信息 scope為snsapi_base,靜默的獲取用戶的信息String getUserInfo_ = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";// 這個 access_token 是 調用公眾號的接口需要傳遞的token,是普通的token(普通token通過以下url獲取 :https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxef4d3ff57f4ced1f&secret=e012bfb1fc0bbebc67324112902a2ca6);String replace1 = getUserInfo_.replace("ACCESS_TOKEN", "51_YgCgtz8jCQK1szhYiTXEFzKNKMgMcF-2TE412oL8pqdap_qomREO78Sym8PzvaTtEFoiYd4oayt7J2B-2sS89Sgf4FuUhQCyA1Mj9lfe3LuSdYuSGsNJvkfy9Yk7zxq9U3O1OzZoTIUzinlqGOEaAFAQYO").replace("OPENID", openid.toString());String s1 = HttpClientTool.doGet(replace1, null);String s2 = JSONObject.toJSONString(s1);System.out.println("getUserInfoBase 用戶的基本信息是 : " + s2);WxUser wxUser1 = JSON.parseObject(s1, WxUser.class);model.addAttribute("wxUser",wxUser1);return "index";}代碼獲取openId、scope=snsapi_userinfo
太多了,直接貼代碼
/*** getUserInfo 通過code交換accessToken ,再通過accessToken獲取openId,再通過openId,獲取用戶信息* @param request* @param response* @throws IOException*/@RequestMapping(value = "/getUserInfo",method = RequestMethod.GET)public void getUserInfo(HttpServletRequest request, HttpServletResponse response) throws IOException {String code = request.getParameter("code");System.out.println("code:"+code);// 通過code 換取accessToken的地址String getAccess_token = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";String replace = getAccess_token.replace("APPID", "wxef4d3ff57f4ced1f").replace("SECRET", "e012bfb1fc0bbebc67324112902a2ca6").replace("CODE", code);String s = HttpClientTool.doGet(replace, null);System.out.println("獲取到的accessToken結果是:" + JSONObject.toJSONString(s));Object access_token = JSONObject.parseObject(s).get("access_token");Object openid = JSONObject.parseObject(s).get("openid");// 獲取用戶的基本信息 需scope為 snsapi_userinfo; 這個 access_token 是 調用用戶信息,需要傳遞的token,是網頁鑒權token;String getUserInfo_snsAPI_userinfo = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";String replace1 = getUserInfo_snsAPI_userinfo.replace("ACCESS_TOKEN", access_token.toString()).replace("OPENID", openid.toString());String s1 = HttpClientTool.doGet(replace1, null);String s2 = JSONObject.toJSONString(s1);System.out.println("用戶的基本信息是 : " + s2);}兩個access_token的不同
其中一個access_token就是普通的access_token,這個普通的access_token可以讓我們調微信的接口,比如創建菜單,查詢菜單,刪除菜單等;就像我們網頁中的登錄token一樣;
而網頁鑒權access_token,是scope為snsapi_userinfo時,調用一面這個url、
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN中的access_token,而這個token是在第二步中獲取的;
采坑說明
1、一個code只能使用一次;
2、授權連接只能在微信頁面中打開;、
3、redirect_url 配置和后臺不一致,認真檢查配置就行;
4、vue 中如何獲取code,是一個問題,獲取之后還要刷新登錄頁;體驗不好,暫時沒有什么好的解決辦法;
5、兩個access_token賊搞笑;
?有空結合前端寫個完整的(手動狗頭)
說兩句廢話
文章就說這么多,也不可能說的很清楚;不懂的靜下心來慢慢理解就行了;不懂的看B站視頻(我也是看的B站視頻才會的);還有我自己寫的Demo;供大家交流學習;
鏈接: https://pan.baidu.com/s/1TsEobfHrN7R8PmsOCM65pA
提取碼: y8yv?
覺得還不錯的話,點個贊吧;奧利給、、、、、、、、、、、、
總結
以上是生活随笔為你收集整理的Java开发微信公众号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言学习笔记--函数与指针
- 下一篇: [C语言 - 12] Union联合