前言


微信網(wǎng)頁登錄授權(quán)、APP登錄授權(quán)、JS-SDK接口調(diào)用




溫馨提示:實(shí)踐某項(xiàng)功能請至少讀完準(zhǔn)備工作,可以避免很多的坑




官方文檔


H5網(wǎng)頁授權(quán)


https://developers.weixin.qq.com


APP授權(quán)


https:" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運(yùn)營 > 微信網(wǎng)頁登錄授權(quán)、APP登錄授權(quán)、JS-SDK接口調(diào)用

微信網(wǎng)頁登錄授權(quán)、APP登錄授權(quán)、JS-SDK接口調(diào)用

時(shí)間:2022-08-06 21:18:01 | 來源:網(wǎng)站運(yùn)營

時(shí)間:2022-08-06 21:18:01 來源:網(wǎng)站運(yùn)營

@TOC




前言




微信網(wǎng)頁登錄授權(quán)、APP登錄授權(quán)、JS-SDK接口調(diào)用




溫馨提示:實(shí)踐某項(xiàng)功能請至少讀完準(zhǔn)備工作,可以避免很多的坑




官方文檔




H5網(wǎng)頁授權(quán)




https://developers.weixin.qq.com



APP授權(quán)




https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_Login/Development_Guide.html



小程序授權(quán)




[https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/authorize.html](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/authorize.html)



JS-SDK說明文檔




https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.htmlhttps://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html)



準(zhǔn)備工作






































































流程講解





























































  1. 簽名用的noncestr和timestamp必須與wx.config中的nonceStr和timestamp相同。



      1. 簽名用的url必須是調(diào)用JS接口頁面的完整URL。

































功能實(shí)現(xiàn)























APP 與 H5 獲取 code 的區(qū)別:h5 是前端通過后臺(tái)拿到授權(quán) url,然后前端請求該 url 得到 code 再請求后臺(tái);APP 則是前端配合使用微信開放平臺(tái)提供的 SDK 進(jìn)行授權(quán)登錄請求,用戶同意授權(quán)后得到 code 再去請求后臺(tái);

獲取code請求路徑

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx6fb2b539e0663d3b&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_re

獲取code 需要先設(shè)置REDIRECT_URI 回調(diào)路徑

如果用戶同意授權(quán),頁面將跳轉(zhuǎn)至 redirect_uri/?code=CODE&state=STATE。

code說明 : code作為換取access_token的票據(jù),每次用戶授權(quán)帶上的code將不一樣,code只能使用一次,5分鐘未被使用自動(dòng)過期。









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








需要用緩存存儲(chǔ)access_token

https://api.weixin.qq.com/sns/userinfo?access_token=" + ACCESS_TOKEN + "&openid=" + OPEN_ID + "&lang=zh_CN";






檢查token是否失效









@ApiOperation("網(wǎng)頁拉起微信授權(quán)頁面,返回微信校驗(yàn)信息") @GetMapping("/auth") public R<String> callBack(@ApiParam(value = "*code",required = true)String code) throws IOException { /** * 獲取到授權(quán)標(biāo)志code(用戶同意微信授權(quán)之后產(chǎn)生的code) */ log.info("進(jìn)入微信回調(diào)code={}",code); String url = WxAuthUtil.H5_ACCESS_TOKEN_URL. replace(WxAuthUtil.APP_ID,WxMpConfig.appId). replace(WxAuthUtil.SECRET, WxMpConfig.secret). replace(WxAuthUtil.CODE,code); JSONObject jsonObject = WxAuthUtil.doGet(url); log.info("授權(quán)結(jié)果{}",jsonObject); return R.ok(jsonObject.getString("openid")); } @ApiOperation("拉取微信用戶信息,每天獲取token的次數(shù)受限,需要將accessToken緩存(目前不需要獲取用戶信息)") @GetMapping("/userInfo") public R<WxUserVO> getWeiChatUserInfo(@RequestParam("code")String openid, @RequestParam("accessToken")String accessToken, @RequestParam("refreshToken")String refreshToken) throws IOException { /** * 校驗(yàn)access_token是否失效 */ String checkoutUrl = WxAuthUtil.CHECK_H5_URL. replace(WxAuthUtil.ACCESS_TOKEN, accessToken). replace(WxAuthUtil.OPEN_ID,openid); JSONObject checkoutInfo = WxAuthUtil.doGet(checkoutUrl); log.info("校驗(yàn)信息-----{}",checkoutInfo.toString()); if (!"0".equals(checkoutInfo.getString("errcode"))) { // 刷新access_token String refreshTokenUrl = WxAuthUtil.REFRESH_TOKEN_URL .replace(WxAuthUtil.APP_ID,WxMpConfig.appId) .replace(WxAuthUtil.REFRESH_TOKEN, refreshToken); JSONObject refreshInfo = WxAuthUtil.doGet(refreshTokenUrl); System.out.println(refreshInfo.toString()); accessToken = refreshInfo.getString("access_token"); } /** * 使用access_token拉取用戶信息 */ String infoUrl = WxAuthUtil.USER_INFO_URL .replace(WxAuthUtil.ACCESS_TOKEN, accessToken) .replace(WxAuthUtil.OPEN_ID, openid); JSONObject userInfo = WxAuthUtil.doGet(infoUrl); WxUserVO wxUserVO = JSONObject.parseObject(String.valueOf(userInfo), WxUserVO.class); log.info("用戶數(shù)據(jù)-----{}", userInfo); return R.ok(wxUserVO); }





@ApiOperation("生成微信JS-SDK簽名") @PostMapping( "/signature") public R<Map<String, String>> makeWxSignature(@RequestBody @Validated WxH5VO wxH5VO){ //獲取jsapiTicket String jsapiTicket = getJsapiTicket(); Map<String, String> ret = new HashMap<>(6); String nonceStr = RandomUtils.getRandomStr(); long timestamp = System.currentTimeMillis()/1000L; //加密 String signature = SHA1.genWithAmple( "jsapi_ticket=" + jsapiTicket, "noncestr=" + nonceStr, "timestamp=" + timestamp, "url=" + wxH5VO.getUrl()); ret.put("url", wxH5VO.getUrl()); ret.put("jsapi_ticket", jsapiTicket); ret.put("nonceStr", nonceStr); ret.put("timestamp", Long.toString(timestamp)); ret.put("signature", signature); ret.put("appId", WxMpConfig.appId); return R.ok(ret); } /** * 1、緩存中獲取 jsApiTicket * 2、沒有 已過期 重新獲取 * 2、獲取緩存中的access_token * 3、沒有 證明已經(jīng)過期 重新獲取 * 獲取jsapiTicket * @return jsapiTicket */ private String getJsapiTicket(){ String jsapiTicket = null; try{ //根據(jù)access_token 獲取jsapiTicket jsapiTicket = redisService.getCacheObject(WxAuthUtil.WX_JSAPI_TICKET); if(Objects.isNull(jsapiTicket)){ //獲取access_token String accessToken = redisService.getCacheObject(WxAuthUtil.WX_ACCESS_TOKEN); if(Objects.isNull(accessToken)){ JSONObject accessTokenMap = WxAuthUtil.getAccessToken(); accessToken = accessTokenMap.getString("access_token"); log.info("訪問獲取access_token數(shù)據(jù){}", accessTokenMap); redisService.setCacheObject(WxAuthUtil.WX_ACCESS_TOKEN, accessToken, accessTokenMap.getLong("expires_in"), TimeUnit.SECONDS); } String requestUrl = WxAuthUtil.JS_API_TICKET_URL.replace("ACCESS_TOKEN", accessToken); //向微信發(fā)送get請求 JSONObject callBack = WxAuthUtil.doGet(requestUrl); log.info("訪問獲取jsApiTicket數(shù)據(jù){}", callBack); jsapiTicket = callBack.getString("ticket"); redisService.setCacheObject(WxAuthUtil.WX_JSAPI_TICKET, jsapiTicket,callBack.getLong("expires_in"), TimeUnit.SECONDS); } log.info("獲取jsApiTicket:{}", jsapiTicket); }catch (IOException e){ log.info("獲取簽名異常:" + e.getMessage()); } return jsapiTicket; }

錯(cuò)誤處理




? 官方常見錯(cuò)誤及解決方法

























關(guān)鍵詞:授權(quán),調(diào)用

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉