摘要:背景項(xiàng)目基于開(kāi)發(fā)服務(wù)器用,提供微信授權(quán)和跨域使用微信獲取經(jīng)緯度,再利用百度地圖獲取用戶所在城市待優(yōu)化問(wèn)題項(xiàng)目的微信授權(quán)基于老的項(xiàng)目,寫的有點(diǎn)不夠優(yōu)雅自己開(kāi)發(fā)時(shí)把授權(quán)信息存到了里面,導(dǎo)致每次進(jìn)入項(xiàng)目都要走一遍授權(quán),浪費(fèi)時(shí)間和影響用戶體驗(yàn)解決方
背景
項(xiàng)目基于angular1.3開(kāi)發(fā)
web服務(wù)器用node,提供微信授權(quán)和跨域
使用微信jssdk獲取經(jīng)緯度,再利用百度地圖API獲取用戶所在城市
待優(yōu)化問(wèn)題:
項(xiàng)目的微信授權(quán)基于老的項(xiàng)目,寫的有點(diǎn)不夠優(yōu)雅;
自己開(kāi)發(fā)時(shí)把授權(quán)信息存到了sessionStorage里面,導(dǎo)致每次進(jìn)入項(xiàng)目都要走一遍授權(quán),浪費(fèi)時(shí)間和影響用戶體驗(yàn);
解決方案:
重寫授權(quán),讓項(xiàng)目初始化時(shí)只請(qǐng)求一個(gè)接口,就可以拿到用戶的基本信息;將獲取的用戶基本信息存在cookie里面,并設(shè)置一個(gè)比較長(zhǎng)的過(guò)期時(shí)間,以便用戶在某一段時(shí)間內(nèi)訪問(wèn)可以不用再次授權(quán),拿微信授權(quán)的相關(guān)代碼就貼在下面了.
服務(wù)端用node+express
路由部分 router.js /** * router */ const express = require("express"); const router = express.Router(); const wxAuth = require("../wxAuth.js"); router.get("/auth", wxAuth.getCode, (req, res, next) => { // 授權(quán)調(diào)用 }); router.get("/wxAuth/getUserInfo", wxAuth.getAccessToken, wxAuth.getUserInfo, (req, res, next) => { let back_url = req.query.back_url; console.log("back_url=="+back_url); if (back_url.indexOf("?path=")) { back_url = back_url.replace("?path=","#/") console.log(back_url); } res.redirect(back_url); }); module.exports = router; 授權(quán)中間件 wxAuth.js //微信公眾號(hào)的appId和appSecret配置文件 const weixin = require("../weixin.config.js") const request = require("request") const appId = weixin.appID; const appSecret = weixin.appsecret; const Host = "http://example.com" exports.getCode = (req, res, next) => { if (req.cookies && req.cookies.openid) { next(); } else { console.log(req) let back_url = escape(req.query.back_url); console.log(req.query.back_url) let redirect_url = `http://mall.yizhenjia.com/wxAuth/getUserInfo?back_url=${back_url}`; let url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${redirect_url}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect `; console.log(url); res.redirect(url); } } exports.getAccessToken = (req, res, next) => { console.log("====accessToken") // console.log(req.query) let code = req.query.code; let url = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=${appId}&secret=${appSecret}&code=${code}&grant_type=authorization_code `; request(url, (error, response, body) => { let result = JSON.parse(body); console.log(result) req.access_token = result.access_token; req.openid = result.openid; next(); }); } exports.getUserInfo = (req, res, next) => { console.log("====getUserInfo") let access_token = req.access_token; let openid = req.openid; let url = `https://api.weixin.qq.com/sns/userinfo?access_token=${access_token}&openid=${openid}&lang=zh_CN ` request(url, (error, response, body) => { console.log(body) let result = JSON.parse(body); res.cookie("openid", result.openid, { maxAge: 24 * 60 * 60 * 1000, httpOnly: false }); res.cookie("unionid", result.unionid, { maxAge: 24 * 60 * 60 * 1000, httpOnly: false }); res.cookie("nickname", result.nickname, { maxAge: 24 * 60 * 60 * 1000, httpOnly: false }); res.cookie("headimgurl", result.headimgurl, { maxAge: 24 * 60 * 60 * 1000, httpOnly: false }); next(); }); }
在angular項(xiàng)目啟動(dòng)的時(shí)候,就判斷有沒(méi)有用戶union的cookie存在,如果不存在就去授權(quán),并阻止視圖渲染
獲取授權(quán),因?yàn)槲⑿攀跈?quán)的時(shí)候,會(huì)忽略angular路由的哈希值后面的內(nèi)容,所以把哈希值做了轉(zhuǎn)換,在服務(wù)端的router.js里面,又把哈希值還原,在重定向的時(shí)候?qū)懺趗rl里
//放在commonUtil服務(wù)里面 轉(zhuǎn)換url,將路由參數(shù)傳給服務(wù)器,然后在授權(quán)結(jié)束后,在重定向的url里獲取路由的哈希值(這里的哈希處理更多的是為了后面微信支付路徑的問(wèn)題) self.getAuth = function() { var hash = window.location.hash.replace("#/", "?path="); var origin = window.location.origin; var pathname = window.location.pathname; var bcakUrl = origin + pathname + hash; window.location.href = "/auth?back_url=" + bcakUrl; } 判斷授權(quán),沒(méi)有授權(quán)情況下阻止默認(rèn)渲染,并請(qǐng)求授權(quán)(在其他框架的時(shí)候也可以做類似處理) $rootScope.$on("$stateChangeStart", function(event) { if (!cookieUtil.hasCookie("unionid") || !cookieUtil.hasCookie("openid")) { commonUtil.getAuth(); event.preventDefault(); } }); //cookieUtil判斷cookie是否存在,設(shè)置cookie和獲取cookie值(angular service)
授權(quán)源碼
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/90232.html
摘要:最初產(chǎn)生這個(gè)項(xiàng)目的想法應(yīng)該是在年月份,當(dāng)時(shí)正在學(xué)習(xí)中,就萌生了這樣一個(gè)想法從一個(gè)用戶這一年發(fā)布的微博數(shù)據(jù)中,提取最有意義的個(gè)關(guān)鍵詞。這些東西提交完就可以提交審核了,微博應(yīng)用審核的速度還算比較快的,一兩天基本差不多會(huì)審核完。 最初產(chǎn)生這個(gè)項(xiàng)目的想法應(yīng)該是在2018年10月份,當(dāng)時(shí)正在學(xué)習(xí)python中,就萌生了這樣一個(gè)想法:從一個(gè)用戶這一年發(fā)布的微博數(shù)據(jù)中,提取最有意義的top50個(gè)關(guān)鍵...
摘要:內(nèi)網(wǎng)穿透由于微信開(kāi)發(fā)的端口必須是最近貌似增加了,所以一個(gè)內(nèi)網(wǎng)穿透工具還是很有必要的。我個(gè)人使用的是瀏覽器微信調(diào)試工具。若確認(rèn)此次請(qǐng)求來(lái)自微信服務(wù)器,請(qǐng)?jiān)瓨臃祷貐?shù)內(nèi)容,則接入生效,成為開(kāi)發(fā)者成功,否則接入失敗。 首先github地址奉上:https://github.com/xiadd/shorthand 歡迎star?最近又拾起了微信開(kāi)發(fā),之前的公眾號(hào)是用的flask進(jìn)行開(kāi)發(fā)的,所以...
摘要:下面介紹在微信開(kāi)發(fā)調(diào)試方面的應(yīng)用。微信網(wǎng)頁(yè)開(kāi)發(fā)中,由于有接口安全域名和授權(quán)域名等的限制,導(dǎo)致部分功能需要部署到線上才能測(cè)試。設(shè)置代理服務(wù)器打開(kāi)微信開(kāi)發(fā)者工具,設(shè)置代理設(shè)置選擇手動(dòng)設(shè)置代理。 Fiddler是一個(gè)非常強(qiáng)大的代理工具,可以讓你的前端開(kāi)發(fā)調(diào)試更加方便。下面介紹在微信開(kāi)發(fā)調(diào)試方面的應(yīng)用。 微信網(wǎng)頁(yè)開(kāi)發(fā)中,由于有js接口安全域名和授權(quán)域名等的限制,導(dǎo)致部分功能需要部署到線上才能測(cè)...
摘要:接口安全域名主要是在調(diào)用微信時(shí)用到。到這里為止測(cè)試號(hào)配置就完成了二微信網(wǎng)頁(yè)授權(quán)篇接口地址為這里你可以使用此地址上的接口進(jìn)行自己編寫,也可以使用別人封裝好的。 說(shuō)明:由于最近開(kāi)發(fā)公眾號(hào),特寫篇文章來(lái)記錄下開(kāi)發(fā)流程和開(kāi)發(fā)中的坑。開(kāi)發(fā)用的技術(shù)為 react + express , nodejs作為中間層。 一.配置篇 首先申請(qǐng)接口測(cè)試號(hào)地址:https://mp.weixin.qq.com/...
摘要:假如是在同一個(gè)域名下,例如與,因?yàn)樵试S設(shè)置到二級(jí)域名下,所以和是可以共享的,用戶的信息可以通過(guò)可逆加密放在二級(jí)域名下的,并且設(shè)置,就可以一站登錄,站站登錄。 原文鏈接:BlueSun | 登錄那些事兒 也不知道是什么原因,剛開(kāi)始不久的職業(yè)生涯,在技術(shù)這條路走著走著,和「登錄」總是有著一個(gè)不解之緣。還記得當(dāng)初學(xué)習(xí)Web編程的時(shí)候么?不管是Java、.Net、PHP,繼經(jīng)典「Hello W...
閱讀 3662·2021-11-15 11:37
閱讀 2990·2021-11-12 10:36
閱讀 4450·2021-09-22 15:51
閱讀 2394·2021-08-27 16:18
閱讀 898·2019-08-30 15:44
閱讀 2176·2019-08-30 10:58
閱讀 1792·2019-08-29 17:18
閱讀 3288·2019-08-28 18:25