日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > vue >内容正文

vue

Vue+abp微信扫码登录

發(fā)布時間:2024/4/15 vue 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Vue+abp微信扫码登录 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近系統(tǒng)中要使用微信掃碼登錄,根據(jù)微信官方文檔和網(wǎng)絡(luò)搜索相關(guān)文獻(xiàn)實現(xiàn)了。分享給需要的人,也作為自己的一個筆記。后端系統(tǒng)是基于ABP的,所以部分代碼直接使用了abp的接口,直接拷貝代碼編譯不通過。

注冊微信開放平臺賬號

在微信開放平臺注冊,注意是開放平臺不是公眾平臺,這里需要300元,然后申請網(wǎng)站應(yīng)用。審核通過后獲取到AppID和AppSecret以及登記的網(wǎng)站url。只有此url下的地址微信掃碼后才能回調(diào)。

具體申請條件見官方文檔。

生成登錄二維碼

在vue登錄頁面嵌入登錄二維碼,根據(jù)官方文檔,在頁面中放入一個div元素,二維碼就放在此元素中,注意var obj = new WxLogin必須放在mounted方法中執(zhí)行,此時vue才會把dom元素初始化掛載到dom樹,可以參見vue官方文檔生命周期介紹。

<template><div id="login" class="login"></div> </template><script> export default {name: "WXLogin",data: function() {return {};},mounted() {this.wechatHandleClick();document.getElementsByTagName("iframe")[0].height="320";document.getElementsByTagName("iframe")[0].style.marginLeft="30px";},methods: {wechatHandleClick() {let ba64Css ="css代碼base64編碼";// 微信需要https的樣式路徑,這里將樣式內(nèi)容加密base64,可以避免使用https,如果你的網(wǎng)站是https的可以直接使用安官方文檔使用css文件路徑const appid = "你第一步申請的Appid";const redirect_uri = encodeURIComponent("http://*/#/login");var obj = new WxLogin({id: "login", //div的idappid: appid,scope: "snsapi_login",//固定內(nèi)容redirect_uri: redirect_uri, //回調(diào)地址// href: "http://*/static/UserCss/WeChart.css" //自定義樣式鏈接,第三方可根據(jù)實際需求覆蓋默認(rèn)樣式。 href: "data:text/css;base64," + ba64Css// state: "", //參數(shù),可帶可不帶// style: "", //樣式 提供"black"、"white"可選,默認(rèn)為黑色文字描述});}} }; </script>

注冊回調(diào)事件

用戶掃碼后微信會回調(diào)訪問前一步提供的redirect_uri,這里要監(jiān)控微信回調(diào),并用微信返回的code請求后端,在后端再去訪問微信服務(wù)器獲取token及用戶openID
在回調(diào)頁面中監(jiān)控路由改變事件以監(jiān)控微信回調(diào)(因為我的二維碼和回調(diào)在同一個路由頁面),如果有其他更好的方法請告訴我。

@Watch("$route")async RouteChange(newVal, oldVal) {await this.weixinRedirect();}// 請求微信后臺async weixinRedirect() {let code = this.$route.query.code;let state = this.$route.query.state;if (code) {let wxTo = {code,state};//請求后臺this.$http("*/WeixinRedirect",data:wxTo).then((token)=>{//登錄成功,把token寫入cookie//跳轉(zhuǎn)到主頁this.$router.replace({ path: "/", replace: true });}).catch(error => {//保持當(dāng)前頁面this.$router.replace({ path: "/login", replace: true });});}} }

后端接收code請求token

在appsettings.json中配置AppId和AppSecret

[HttpPost] public async Task<AuthenticateResultModel> WeixinRedirect(string code, string state) {if (code.IsNullOrEmpty()){throw new UserFriendlyException("微信授權(quán)失敗,請重新授權(quán)");}var appid = configuration["Authentication:Wechat:AppId"];var secret = configuration["Authentication:Wechat:AppSecret"];var url = $"https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={secret}&code={code}&grant_type=authorization_code";var httpClient = httpClientFactory.CreateClient();httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");httpClient.Timeout = TimeSpan.FromMinutes(3);var resstr = await httpClient.GetStringAsync(url);try{//如果微信授權(quán)返回失敗這里序列化不成功var res = JsonSerializationHelper.DeserializeWithType<WeiXinAccess_tokenResponse>(resstr);}catch (Exception e){throw new UserFriendlyException("獲取微信access_token失敗");}if (res == null || res.openid.IsNullOrEmpty()){throw new UserFriendlyException("獲取微信access_token失敗");}var userId = //根據(jù)openID獲取用戶id,我們系統(tǒng)要求用戶提前把微信和用戶關(guān)聯(lián)綁定,所以這里可以根據(jù)微信用戶的openID獲取到戶農(nóng)戶id;//使用用戶直接登錄if (!userId.IsNullOrEmpty()&&long.TryParse(userId, out long id)){var user = await _userManager.GetUserByIdAsync(id);var loginResult = await _logInManager.LoginByUser(user);string accessToken = CreateAccessToken(CreateJwtClaims(loginResult.Identity));return new AuthenticateResultModel{AccessToken = accessToken,EncryptedAccessToken = GetEncrpyedAccessToken(accessToken),ExpireInSeconds = (int)_tokenConfiguration.Expiration.TotalSeconds,UserId = loginResult.User.Id};}throw new UserFriendlyException("微信尚未綁定賬號,請使用賬號登錄后綁定微信。");}

WeiXinAccess_tokenResponse類型

public class WeiXinAccess_tokenResponse {public string access_token { get; set; }public int expires_in { get; set; }public string refresh_token { get; set; }public string openid { get; set; }public string scope { get; set; }public string unionid { get; set; } }

轉(zhuǎn)載于:https://www.cnblogs.com/missile/p/10727581.html

總結(jié)

以上是生活随笔為你收集整理的Vue+abp微信扫码登录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。