diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application.Contracts/EasyAbp/WeChatManagement/MiniPrograms/Login/Dtos/BindPreAuthorizeInfoInput.cs b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application.Contracts/EasyAbp/WeChatManagement/MiniPrograms/Login/Dtos/BindPreAuthorizeInfoInput.cs new file mode 100644 index 00000000..d3a87d9a --- /dev/null +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application.Contracts/EasyAbp/WeChatManagement/MiniPrograms/Login/Dtos/BindPreAuthorizeInfoInput.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Text; + +namespace EasyAbp.WeChatManagement.MiniPrograms.Login.Dtos +{ + [Serializable] + public class BindPreAuthorizeInfoInput + { + [Required] + public string Token { get; set; } + } +} diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application.Contracts/EasyAbp/WeChatManagement/MiniPrograms/Login/Dtos/BindPreAuthorizeInput.cs b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application.Contracts/EasyAbp/WeChatManagement/MiniPrograms/Login/Dtos/BindPreAuthorizeInput.cs new file mode 100644 index 00000000..66d9014a --- /dev/null +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application.Contracts/EasyAbp/WeChatManagement/MiniPrograms/Login/Dtos/BindPreAuthorizeInput.cs @@ -0,0 +1,18 @@ +using System.ComponentModel.DataAnnotations; + +namespace EasyAbp.WeChatManagement.MiniPrograms.Login.Dtos +{ + public class BindPreAuthorizeInput : LoginInput + { + [Required] + public string Token { get; set; } + /// + /// 微信昵称(预留参数) + /// + public string NickName { get; set; } + /// + /// 用户头像(预留参数) + /// + public string AvatarUrl { get; set; } + } +} diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application.Contracts/EasyAbp/WeChatManagement/MiniPrograms/Login/Dtos/GetPcBindACodeOutput.cs b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application.Contracts/EasyAbp/WeChatManagement/MiniPrograms/Login/Dtos/GetPcBindACodeOutput.cs new file mode 100644 index 00000000..a80cf113 --- /dev/null +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application.Contracts/EasyAbp/WeChatManagement/MiniPrograms/Login/Dtos/GetPcBindACodeOutput.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace EasyAbp.WeChatManagement.MiniPrograms.Login.Dtos +{ + public class GetPcBindACodeOutput : GetPcLoginACodeOutput + { + public bool HasBound { get; set; } + public string NickName { get; set; } + public string AvatarUrl { get; set; } + } +} diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application.Contracts/EasyAbp/WeChatManagement/MiniPrograms/Login/Dtos/PcBindingAuthorizationInfoOutput.cs b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application.Contracts/EasyAbp/WeChatManagement/MiniPrograms/Login/Dtos/PcBindingAuthorizationInfoOutput.cs new file mode 100644 index 00000000..7c6b4757 --- /dev/null +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application.Contracts/EasyAbp/WeChatManagement/MiniPrograms/Login/Dtos/PcBindingAuthorizationInfoOutput.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace EasyAbp.WeChatManagement.MiniPrograms.Login.Dtos +{ + public class PcBindingAuthorizationInfoOutput : LoginInput + { + public string NickName { get; set; } + public string AvatarUrl { get; set; } + } +} diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application.Contracts/EasyAbp/WeChatManagement/MiniPrograms/Login/ILoginAppService.cs b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application.Contracts/EasyAbp/WeChatManagement/MiniPrograms/Login/ILoginAppService.cs index 794b06ea..049a3823 100644 --- a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application.Contracts/EasyAbp/WeChatManagement/MiniPrograms/Login/ILoginAppService.cs +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application.Contracts/EasyAbp/WeChatManagement/MiniPrograms/Login/ILoginAppService.cs @@ -8,16 +8,23 @@ namespace EasyAbp.WeChatManagement.MiniPrograms.Login public interface ILoginAppService : IApplicationService { Task LoginAsync(LoginInput input); - + Task RefreshAsync(RefreshInput input); Task GetPcLoginACodeAsync([NotNull] string miniProgramName, [CanBeNull] string handlePage = null); - + + Task GetPcBindACodeAsync([NotNull] string miniProgramName, + [CanBeNull] string handlePage = null); + + Task AuthorizePcBindingAsync(BindPreAuthorizeInput input); + + Task GetPcBindingAuthorizationInfoAsync(BindPreAuthorizeInfoInput input); + Task AuthorizePcAsync(AuthorizePcInput input); - + Task PcLoginAsync(PcLoginInput input); - + Task PcLoginRequestTokensAsync(PcLoginInput input); Task BindAsync(LoginInput input); diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application/EasyAbp/WeChatManagement/MiniPrograms/Login/BindingAuthorizeTooFrequentlyException.cs b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application/EasyAbp/WeChatManagement/MiniPrograms/Login/BindingAuthorizeTooFrequentlyException.cs new file mode 100644 index 00000000..b7b605e3 --- /dev/null +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application/EasyAbp/WeChatManagement/MiniPrograms/Login/BindingAuthorizeTooFrequentlyException.cs @@ -0,0 +1,16 @@ +using System; +using Microsoft.Extensions.Logging; +using Volo.Abp; + +namespace EasyAbp.WeChatManagement.MiniPrograms.Login +{ + public class BindingAuthorizeTooFrequentlyException : UserFriendlyException + { + public BindingAuthorizeTooFrequentlyException( + string message = "BindingAuthorizeTooFrequently", + string code = "BindingAuthorizeTooFrequently", + string details = null, + Exception innerException = null, + LogLevel logLevel = LogLevel.Warning) : base(message, code, details, innerException, logLevel) { } + } +} diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application/EasyAbp/WeChatManagement/MiniPrograms/Login/LoginAppService.cs b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application/EasyAbp/WeChatManagement/MiniPrograms/Login/LoginAppService.cs index cf6262e3..e0241eb1 100644 --- a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application/EasyAbp/WeChatManagement/MiniPrograms/Login/LoginAppService.cs +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application/EasyAbp/WeChatManagement/MiniPrograms/Login/LoginAppService.cs @@ -47,6 +47,7 @@ public class LoginAppService : MiniProgramsAppService, ILoginAppService private readonly IMiniProgramLoginNewUserCreator _miniProgramLoginNewUserCreator; private readonly IMiniProgramLoginProviderProvider _miniProgramLoginProviderProvider; private readonly IDistributedCache _pcLoginAuthorizationCache; + private readonly IDistributedCache _pcBindingAuthorizationInfoCache; private readonly IDistributedCache _pcLoginUserLimitCache; private readonly IOptions _identityOptions; private readonly IdentityUserManager _identityUserManager; @@ -65,6 +66,7 @@ public LoginAppService( IMiniProgramLoginProviderProvider miniProgramLoginProviderProvider, IDistributedCache pcLoginAuthorizationCache, IDistributedCache pcLoginUserLimitCache, + IDistributedCache pcBindingAuthorizationInfoCache, IOptions identityOptions, IdentityUserManager identityUserManager) { @@ -80,6 +82,7 @@ public LoginAppService( _miniProgramLoginNewUserCreator = miniProgramLoginNewUserCreator; _miniProgramLoginProviderProvider = miniProgramLoginProviderProvider; _pcLoginAuthorizationCache = pcLoginAuthorizationCache; + _pcBindingAuthorizationInfoCache = pcBindingAuthorizationInfoCache; _pcLoginUserLimitCache = pcLoginUserLimitCache; _identityOptions = identityOptions; _identityUserManager = identityUserManager; @@ -516,5 +519,79 @@ public virtual async Task PcLoginRequestTokensAsync( RawData = response.Raw }; } + + + [Authorize] + public virtual async Task GetPcBindACodeAsync(string miniProgramName, + string handlePage = null) + { + var miniProgram = await _weChatAppRepository.GetMiniProgramAppByNameAsync(miniProgramName); + + var hasBound = await _weChatAppUserRepository.AnyAsync(x => x.UserId == CurrentUser.GetId() && x.WeChatAppId == miniProgram.Id); + + if (hasBound) + { + var userinfo = await _userInfoRepository.GetAsync(x => x.UserId == CurrentUser.GetId()); + return new GetPcBindACodeOutput + { + HasBound = true, + NickName = userinfo.NickName, + AvatarUrl = userinfo.AvatarUrl, + }; + } + + var acode = await GetPcLoginACodeAsync(miniProgramName, handlePage); + + var bindACode = new GetPcBindACodeOutput + { + ACode = acode.ACode, + Token = acode.Token, + HandlePage = acode.HandlePage + }; + + return bindACode; + } + + public virtual async Task AuthorizePcBindingAsync(BindPreAuthorizeInput input) + { + if (await _pcBindingAuthorizationInfoCache.GetAsync(input.Token) != null) + { + throw new BindingAuthorizeTooFrequentlyException(); + } + + await _pcBindingAuthorizationInfoCache.SetAsync(input.Token, + new MiniProgramPcBindingAuthorizationInfoCacheItem() + { + AppId = input.AppId, + Code = input.Code, + AvatarUrl = input.AvatarUrl, + NickName = input.NickName, + }, + new DistributedCacheEntryOptions + { + AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(30) + }); + } + + [Authorize] + public virtual async Task GetPcBindingAuthorizationInfoAsync(BindPreAuthorizeInfoInput input) + { + if (await _pcBindingAuthorizationInfoCache.GetAsync(input.Token) == null) + { + return new PcBindingAuthorizationInfoOutput() { }; + } + + var preAuthorizeInfo = await _pcBindingAuthorizationInfoCache.GetAsync(input.Token); + + await _pcBindingAuthorizationInfoCache.RemoveAsync(input.Token); + + return new PcBindingAuthorizationInfoOutput + { + AppId = preAuthorizeInfo.AppId, + Code = preAuthorizeInfo.Code, + NickName = preAuthorizeInfo.NickName, + AvatarUrl = preAuthorizeInfo.AvatarUrl, + }; + } } } \ No newline at end of file diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application/EasyAbp/WeChatManagement/MiniPrograms/Login/MiniProgramPcBindingAuthorizationInfoCacheItem.cs b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application/EasyAbp/WeChatManagement/MiniPrograms/Login/MiniProgramPcBindingAuthorizationInfoCacheItem.cs new file mode 100644 index 00000000..9c72231c --- /dev/null +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application/EasyAbp/WeChatManagement/MiniPrograms/Login/MiniProgramPcBindingAuthorizationInfoCacheItem.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EasyAbp.WeChatManagement.MiniPrograms.Login +{ + public class MiniProgramPcBindingAuthorizationInfoCacheItem + { + /// + /// 小程序 AppId + /// + public string AppId { get; set; } + /// + /// wx.login 调用后返回的 code 的值 + /// + public string Code { get; set; } + /// + /// 微信昵称 + /// + public string NickName { get; set; } + /// + /// 用户头像 + /// + public string AvatarUrl { get; set; } + } +} diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application/EasyAbp/WeChatManagement/MiniPrograms/Login/WeChatAccountHasBeenBoundException.cs b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application/EasyAbp/WeChatManagement/MiniPrograms/Login/WeChatAccountHasBeenBoundException.cs index 9b0fa52b..4b1974b9 100644 --- a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application/EasyAbp/WeChatManagement/MiniPrograms/Login/WeChatAccountHasBeenBoundException.cs +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application/EasyAbp/WeChatManagement/MiniPrograms/Login/WeChatAccountHasBeenBoundException.cs @@ -7,7 +7,7 @@ namespace EasyAbp.WeChatManagement.MiniPrograms.Login public class WeChatAccountHasBeenBoundException : BusinessException { public WeChatAccountHasBeenBoundException( - string message = null, + string message = "WeChatAccountHasBeenBound", string code = "WeChatAccountHasBeenBound", string details = null, Exception innerException = null, diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application/EasyAbp/WeChatManagement/MiniPrograms/Login/WeChatAccountHasNotBeenBoundException.cs b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application/EasyAbp/WeChatManagement/MiniPrograms/Login/WeChatAccountHasNotBeenBoundException.cs index 91c580e9..8283f859 100644 --- a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application/EasyAbp/WeChatManagement/MiniPrograms/Login/WeChatAccountHasNotBeenBoundException.cs +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Application/EasyAbp/WeChatManagement/MiniPrograms/Login/WeChatAccountHasNotBeenBoundException.cs @@ -7,7 +7,7 @@ namespace EasyAbp.WeChatManagement.MiniPrograms.Login public class WeChatAccountHasNotBeenBoundException : BusinessException { public WeChatAccountHasNotBeenBoundException( - string message = null, + string message = "WeChatAccountHasNotBeenBound", string code = "WeChatAccountHasNotBeenBound", string details = null, Exception innerException = null, diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Domain.Shared/EasyAbp/WeChatManagement/MiniPrograms/Localization/en.json b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Domain.Shared/EasyAbp/WeChatManagement/MiniPrograms/Localization/en.json index e9010251..f5034716 100644 --- a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Domain.Shared/EasyAbp/WeChatManagement/MiniPrograms/Localization/en.json +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Domain.Shared/EasyAbp/WeChatManagement/MiniPrograms/Localization/en.json @@ -3,7 +3,7 @@ "texts": { "Permission:MiniPrograms": "MiniProgramManagement", "Menu:MiniProgramManagement": "MiniProgramManagement", - "ACodeGenerationFailed": "ACodeGenerationFailed", + "ACodeGenerationFailed": "Binding Code Generation Failed", "Permission:UserInfo": "UserInfo", "Menu:UserInfo": "MenuUserInfo", "UserInfo": "UserInfo", @@ -17,7 +17,11 @@ "UserInfoAvatarUrl": "UserInfoAvatarUrl", "Setting:PcLoginHandlePage": "Setting:PcLoginHandlePage", "Setting:DefaultPcLoginWeChatAppName": "Setting:DefaultPcLoginWeChatAppName", + "Setting:BindCodeExpiredTime": "Setting:BindCodeExpiredTime", + "HasBound": "HasBound", "WeChatAccountHasBeenBound": "WeChatAccountHasBeenBound", - "WeChatAccountHasNotBeenBound": "WeChatAccountHasNotBeenBound" + "WeChatAccountHasNotBeenBound": "WeChatAccountHasNotBeenBound", + "Verification": "Verification", + "Succeed": "Succeed" } } \ No newline at end of file diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Domain.Shared/EasyAbp/WeChatManagement/MiniPrograms/Localization/zh-Hans.json b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Domain.Shared/EasyAbp/WeChatManagement/MiniPrograms/Localization/zh-Hans.json index 51872706..9300b5c3 100644 --- a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Domain.Shared/EasyAbp/WeChatManagement/MiniPrograms/Localization/zh-Hans.json +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Domain.Shared/EasyAbp/WeChatManagement/MiniPrograms/Localization/zh-Hans.json @@ -17,7 +17,13 @@ "UserInfoAvatarUrl": "头像图片", "Setting:PcLoginHandlePage": "PC 登录处理页面", "Setting:DefaultPcLoginWeChatAppName": "PC 登录默认微信应用名", + "Setting:BindCodeExpiredTime": "绑定码过期时间(秒)", + "HasBound": "已绑定", "WeChatAccountHasBeenBound": "您的微信已被其他用户绑定", - "WeChatAccountHasNotBeenBound": "您的微信尚未绑定" + "WeChatAccountHasNotBeenBound": "您的微信尚未绑定", + "Verification": "检验码", + "Cancel": "取消", + "Binding": "绑定", + "Succeed": "绑定成功" } } \ No newline at end of file diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Domain.Shared/EasyAbp/WeChatManagement/MiniPrograms/Localization/zh-Hant.json b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Domain.Shared/EasyAbp/WeChatManagement/MiniPrograms/Localization/zh-Hant.json index 1ec1947e..9746d8ca 100644 --- a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Domain.Shared/EasyAbp/WeChatManagement/MiniPrograms/Localization/zh-Hant.json +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Domain.Shared/EasyAbp/WeChatManagement/MiniPrograms/Localization/zh-Hant.json @@ -17,7 +17,13 @@ "UserInfoAvatarUrl": "頭像圖片", "Setting:PcLoginHandlePage": "PC 登錄處理頁面", "Setting:DefaultPcLoginWeChatAppName": "PC 登錄默認微信應用名", + "Setting:BindCodeExpiredTime": "綁定碼過期時間(秒)", + "HasBound": "已綁定", "WeChatAccountHasBeenBound": "您的微信已被其他用戶綁定", - "WeChatAccountHasNotBeenBound": "您的微信尚未綁定" + "WeChatAccountHasNotBeenBound": "您的微信尚未綁定", + "Verification": "校驗碼", + "Cancel": "取消", + "Binding": "綁定", + "Succeed": "绑定成功" } } \ No newline at end of file diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.HttpApi/EasyAbp/WeChatManagement/MiniPrograms/Login/LoginController.cs b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.HttpApi/EasyAbp/WeChatManagement/MiniPrograms/Login/LoginController.cs index c936301c..ab295d89 100644 --- a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.HttpApi/EasyAbp/WeChatManagement/MiniPrograms/Login/LoginController.cs +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.HttpApi/EasyAbp/WeChatManagement/MiniPrograms/Login/LoginController.cs @@ -38,6 +38,27 @@ public Task GetPcLoginACodeAsync(string miniProgramName, return _service.GetPcLoginACodeAsync(miniProgramName, handlePage); } + [HttpGet] + [Route("pc-bind-acode/{miniProgramName}")] + public Task GetPcBindACodeAsync(string miniProgramName, string handlePage = null) + { + return _service.GetPcBindACodeAsync(miniProgramName, handlePage); + } + + [HttpPost] + [Route("authorize-pc-binding")] + public Task AuthorizePcBindingAsync(BindPreAuthorizeInput input) + { + return _service.AuthorizePcBindingAsync(input); + } + + [HttpPost] + [Route("pc-bind-authorization-info")] + public Task GetPcBindingAuthorizationInfoAsync(BindPreAuthorizeInfoInput input) + { + return _service.GetPcBindingAuthorizationInfoAsync(input); + } + [HttpPost] [Route("authorize-pc")] public Task AuthorizePcAsync(AuthorizePcInput input) diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/Default.cshtml b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/Default.cshtml new file mode 100644 index 00000000..2bc9ee47 --- /dev/null +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/Default.cshtml @@ -0,0 +1,33 @@ +@using EasyAbp.WeChatManagement.MiniPrograms.Localization +@using Microsoft.AspNetCore.Mvc.Localization +@model EasyAbp.WeChatManagement.MiniPrograms.Web.Pages.WeChatManagement.MiniPrograms.Components.WeChatMiniProgramPcBindWidget.WeChatMiniProgramPcBindViewModel +@inject IHtmlLocalizer L + +
+
+ @if (!Model.ACode.IsNullOrEmpty()) + { + ACode + + + } + else if (Model.HasBound) + { +

@L["HasBound"]

+ avatar +
@Model.NickName
+ } + else + { +

@L["ACodeGenerationFailed"]

+ } +
+
\ No newline at end of file diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/WeChatMiniProgramPcBindScriptBundleContributor.cs b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/WeChatMiniProgramPcBindScriptBundleContributor.cs new file mode 100644 index 00000000..e464dc27 --- /dev/null +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/WeChatMiniProgramPcBindScriptBundleContributor.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; + +namespace EasyAbp.WeChatManagement.MiniPrograms.Web.Pages.WeChatManagement.MiniPrograms.Components.WeChatMiniProgramPcBindWidget +{ + public class WeChatMiniProgramPcBindScriptBundleContributor : BundleContributor + { + public override void ConfigureBundle(BundleConfigurationContext context) + { + context.Files.AddIfNotContains( + "/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/default.js"); + } + } +} diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/WeChatMiniProgramPcBindStyleBundleContributor.cs b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/WeChatMiniProgramPcBindStyleBundleContributor.cs new file mode 100644 index 00000000..175a4773 --- /dev/null +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/WeChatMiniProgramPcBindStyleBundleContributor.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; + +namespace EasyAbp.WeChatManagement.MiniPrograms.Web.Pages.WeChatManagement.MiniPrograms.Components.WeChatMiniProgramPcBindWidget +{ + public class WeChatMiniProgramPcBindStyleBundleContributor : BundleContributor + { + public override void ConfigureBundle(BundleConfigurationContext context) + { + context.Files.AddIfNotContains( + "/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/default.css"); + } + } +} diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/WeChatMiniProgramPcBindViewModel.cs b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/WeChatMiniProgramPcBindViewModel.cs new file mode 100644 index 00000000..a3217e74 --- /dev/null +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/WeChatMiniProgramPcBindViewModel.cs @@ -0,0 +1,9 @@ +using EasyAbp.WeChatManagement.MiniPrograms.Login.Dtos; + +namespace EasyAbp.WeChatManagement.MiniPrograms.Web.Pages.WeChatManagement.MiniPrograms.Components.WeChatMiniProgramPcBindWidget +{ + public class WeChatMiniProgramPcBindViewModel : GetPcBindACodeOutput + { + public string MiniProgramName { get; set; } + } +} diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/WeChatMiniProgramPcBindWidgetViewComponent.cs b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/WeChatMiniProgramPcBindWidgetViewComponent.cs new file mode 100644 index 00000000..732fa0c2 --- /dev/null +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/WeChatMiniProgramPcBindWidgetViewComponent.cs @@ -0,0 +1,62 @@ +using System; +using System.Threading.Tasks; +using EasyAbp.WeChatManagement.MiniPrograms.Login; +using EasyAbp.WeChatManagement.MiniPrograms.Login.Dtos; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.UI.Widgets; + +namespace EasyAbp.WeChatManagement.MiniPrograms.Web.Pages.WeChatManagement.MiniPrograms.Components.WeChatMiniProgramPcBindWidget +{ + [ViewComponent(Name = "WeChatMiniProgramPcBind")] + [Widget( + ScriptTypes = new[] { typeof(WeChatMiniProgramPcBindScriptBundleContributor) }, + StyleTypes = new[] { typeof(WeChatMiniProgramPcBindStyleBundleContributor) } + )] + public class WeChatMiniProgramPcBindWidgetViewComponent : AbpViewComponent + { + private readonly ILoginAppService _loginAppService; + + public WeChatMiniProgramPcBindWidgetViewComponent(ILoginAppService loginAppService) + { + _loginAppService = loginAppService; + } + + /// + /// + /// + /// + /// 二维码类型 + /// + public async Task InvokeAsync(string miniProgramName) + { + GetPcBindACodeOutput aCode; + try + { + aCode = await _loginAppService.GetPcBindACodeAsync(miniProgramName); + } + catch + { + aCode = new GetPcBindACodeOutput + { + ACode = null, + Token = null + }; + } + + var viewModel = new WeChatMiniProgramPcBindViewModel + { + MiniProgramName = miniProgramName, + Token = aCode.Token, + ACode = aCode.ACode, + HasBound = aCode.HasBound, + NickName = aCode.NickName, + AvatarUrl = aCode.AvatarUrl, + }; + + return View( + "~/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/Default.cshtml", + viewModel); + } + } +} diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/default.css b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/default.css new file mode 100644 index 00000000..5858e410 --- /dev/null +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/default.css @@ -0,0 +1,17 @@ +.weChat-miniProgram-pcBind-aCode { + max-width: 350px; + margin: 30px auto 0; +} + +.weChat-miniProgram-pcBind-aCode img { + width: 100%; +} + +.hidden{ + display:none; +} + +.avatar-img { + border-radius: 50%; + max-width: 120px; +} \ No newline at end of file diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/default.js b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/default.js new file mode 100644 index 00000000..302c69bf --- /dev/null +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/Components/WeChatMiniProgramPcBindWidget/default.js @@ -0,0 +1,84 @@ +(function ($) { + $(document).ready(function () { + + abp.widgets.WeChatMiniProgramPcBind = function ($widget) { + + intervalID = ''; + + function getLocalize(key) { + return abp.localization.localize(key, 'EasyAbpWeChatManagementMiniPrograms') + } + + var preInfo = { + appId: '', + avatarUrl: '', + code: '', + lookupUseRecentlyTenant: false, + nickName: '', + } + + $(document.querySelector('#btn_bind')).on("click", function () { + easyAbp.weChatManagement.miniPrograms.login.login.bind(preInfo, { abpHandleError: false }) + .then(function () { + abp.notify.info(getLocalize("Succeed")); + setTimeout(function () { + window.location.reload(); + }, 1500) + }).catch(function (res) { + abp.notify.error(getLocalize(res.code)); + $(document.querySelector('#btn_destroy')).click(); + }); + }) + + $(document.querySelector('#btn_destroy')).bind("click", function () { + document.querySelector("#bindCode").removeAttribute("class", "hidden") + document.querySelector("#ready").setAttribute("class", "hidden") + var intervalID = window.setInterval(function () { + easyAbp.weChatManagement.miniPrograms.login.login.getPcBindingAuthorizationInfo({ token: token }, { + success: function (data) { + preInfo = data; + if (data.code != null) { + document.querySelector("#bindCode").setAttribute("class", "hidden") + document.querySelector("#ready").removeAttribute("class", "hidden") + document.querySelector("#avatar").setAttribute("src", data.avatarUrl) + document.querySelector("#code").innerHTML = getLocalize("Verification") + ":" + (data.code.substr(0, 6)); + document.querySelector("#nickname").innerHTML = data.nickName; + clearInterval(intervalID); + } + } + }); + }, 2000); + }) + + function getFilters() { + return {}; + } + + function init() { + if (token == null || token === '') return; + var intervalID = window.setInterval(function () { + easyAbp.weChatManagement.miniPrograms.login.login.getPcBindingAuthorizationInfo({ token: token }, { + success: function (data) { + preInfo = data; + if (data.code != null) { + document.querySelector("#bindCode").setAttribute("class", "hidden") + document.querySelector("#ready").removeAttribute("class", "hidden") + document.querySelector("#avatar").setAttribute("src", data.avatarUrl) + document.querySelector("#code").innerHTML = getLocalize("Verification") + ":" + (data.code.substr(0, 6)); + document.querySelector("#nickname").innerHTML = data.nickName; + clearInterval(intervalID); + } + } + }); + }, 3000); + } + return { + init: init, + getFilters: getFilters + }; + }; + + var widgetManager = new abp.WidgetManager({ filterForm: 'WeChatMiniProgramPcBind' }); + widgetManager.init(); + }); +})(jQuery); \ No newline at end of file diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/UserInfos/UserInfo/index.css b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/UserInfos/UserInfo/index.css index e69de29b..c9143168 100644 --- a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/UserInfos/UserInfo/index.css +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/UserInfos/UserInfo/index.css @@ -0,0 +1,4 @@ +.avatar { + width: 34px; + border-radius: 50%; +} diff --git a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/UserInfos/UserInfo/index.js b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/UserInfos/UserInfo/index.js index 14436da2..4d6a602e 100644 --- a/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/UserInfos/UserInfo/index.js +++ b/modules/MiniPrograms/src/EasyAbp.WeChatManagement.MiniPrograms.Web/Pages/WeChatManagement/MiniPrograms/UserInfos/UserInfo/index.js @@ -33,7 +33,15 @@ $(function () { { data: "city" }, { data: "province" }, { data: "country" }, - { data: "avatarUrl" }, + { + data: "avatarUrl", + render: function (data, m, r) { + if (data) { + return 'avatar'; + } + return ''; + } + }, ] })); }); \ No newline at end of file diff --git a/modules/MiniPrograms/test/EasyAbp.WeChatManagement.MiniPrograms.Application.Tests/MiniPrograms/FakeLoginAppService.cs b/modules/MiniPrograms/test/EasyAbp.WeChatManagement.MiniPrograms.Application.Tests/MiniPrograms/FakeLoginAppService.cs index 14cfd7b0..e0e0643c 100644 --- a/modules/MiniPrograms/test/EasyAbp.WeChatManagement.MiniPrograms.Application.Tests/MiniPrograms/FakeLoginAppService.cs +++ b/modules/MiniPrograms/test/EasyAbp.WeChatManagement.MiniPrograms.Application.Tests/MiniPrograms/FakeLoginAppService.cs @@ -30,10 +30,11 @@ public FakeLoginAppService(AbpSignInManager signInManager, IDataFilter dataFilte IMiniProgramLoginProviderProvider miniProgramLoginProviderProvider, IDistributedCache pcLoginAuthorizationCache, IDistributedCache pcLoginUserLimitCache, + IDistributedCache pcBindingAuthorizationInfoCache, IOptions identityOptions, IdentityUserManager identityUserManager) : base(signInManager, dataFilter, configuration, httpClientFactory, userInfoRepository, weChatAppRepository, stringEncryptionService, weChatAppUserRepository, abpWeChatServiceFactory, miniProgramLoginNewUserCreator, - miniProgramLoginProviderProvider, pcLoginAuthorizationCache, pcLoginUserLimitCache, identityOptions, + miniProgramLoginProviderProvider, pcLoginAuthorizationCache, pcLoginUserLimitCache, pcBindingAuthorizationInfoCache, identityOptions, identityUserManager) { } diff --git a/samples/WeChatManagementSample/aspnet-core/src/WeChatManagementSample.Web.Ids4/Pages/Index.cshtml b/samples/WeChatManagementSample/aspnet-core/src/WeChatManagementSample.Web.Ids4/Pages/Index.cshtml index 4229d681..b221a227 100644 --- a/samples/WeChatManagementSample/aspnet-core/src/WeChatManagementSample.Web.Ids4/Pages/Index.cshtml +++ b/samples/WeChatManagementSample/aspnet-core/src/WeChatManagementSample.Web.Ids4/Pages/Index.cshtml @@ -1,4 +1,5 @@ @page +@using EasyAbp.WeChatManagement.MiniPrograms.Web.Pages.WeChatManagement.MiniPrograms.Components.WeChatMiniProgramPcBindWidget; @using Microsoft.AspNetCore.Mvc.Localization @using WeChatManagementSample.Localization @using Volo.Abp.Users @@ -24,8 +25,16 @@ abp.io +
@if (!CurrentUser.IsAuthenticated) { @L["Login"] } + else + { +
+ 绑定现有账号 +
+ @await Component.InvokeAsync(typeof(WeChatMiniProgramPcBindWidgetViewComponent), Model.MiniProgramName) + } \ No newline at end of file diff --git a/samples/WeChatManagementSample/aspnet-core/src/WeChatManagementSample.Web.Ids4/Pages/Index.cshtml.cs b/samples/WeChatManagementSample/aspnet-core/src/WeChatManagementSample.Web.Ids4/Pages/Index.cshtml.cs index bfffbdea..8a4c936f 100644 --- a/samples/WeChatManagementSample/aspnet-core/src/WeChatManagementSample.Web.Ids4/Pages/Index.cshtml.cs +++ b/samples/WeChatManagementSample/aspnet-core/src/WeChatManagementSample.Web.Ids4/Pages/Index.cshtml.cs @@ -1,10 +1,17 @@ -namespace WeChatManagementSample.Web.Ids4.Pages +using EasyAbp.WeChatManagement.MiniPrograms.Settings; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; + +namespace WeChatManagementSample.Web.Ids4.Pages { public class IndexModel : WeChatManagementSamplePageModel { - public void OnGet() + [BindProperty(SupportsGet = true)] + public string MiniProgramName { get; set; } + + public async Task OnGetAsync() { - + MiniProgramName ??= await SettingProvider.GetOrNullAsync(MiniProgramsSettings.PcLogin.DefaultProgramName); } } } \ No newline at end of file diff --git a/samples/WeChatManagementSample/aspnet-core/src/WeChatManagementSample.Web.OpenIddict/Pages/Index.cshtml b/samples/WeChatManagementSample/aspnet-core/src/WeChatManagementSample.Web.OpenIddict/Pages/Index.cshtml index e19b0883..e6ad26e4 100644 --- a/samples/WeChatManagementSample/aspnet-core/src/WeChatManagementSample.Web.OpenIddict/Pages/Index.cshtml +++ b/samples/WeChatManagementSample/aspnet-core/src/WeChatManagementSample.Web.OpenIddict/Pages/Index.cshtml @@ -1,4 +1,5 @@ @page +@using EasyAbp.WeChatManagement.MiniPrograms.Web.Pages.WeChatManagement.MiniPrograms.Components.WeChatMiniProgramPcBindWidget; @using Microsoft.AspNetCore.Mvc.Localization @using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Alert @using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Blockquote @@ -28,8 +29,16 @@ abp.io +
@if (!CurrentUser.IsAuthenticated) { @L["Login"] } + else + { +
+ 绑定现有账号 +
+ @await Component.InvokeAsync(typeof(WeChatMiniProgramPcBindWidgetViewComponent), Model.MiniProgramName) + } \ No newline at end of file diff --git a/samples/WeChatManagementSample/aspnet-core/src/WeChatManagementSample.Web.OpenIddict/Pages/Index.cshtml.cs b/samples/WeChatManagementSample/aspnet-core/src/WeChatManagementSample.Web.OpenIddict/Pages/Index.cshtml.cs index bfffbdea..f0963bfc 100644 --- a/samples/WeChatManagementSample/aspnet-core/src/WeChatManagementSample.Web.OpenIddict/Pages/Index.cshtml.cs +++ b/samples/WeChatManagementSample/aspnet-core/src/WeChatManagementSample.Web.OpenIddict/Pages/Index.cshtml.cs @@ -1,10 +1,18 @@ -namespace WeChatManagementSample.Web.Ids4.Pages +using EasyAbp.WeChatManagement.MiniPrograms.Settings; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; + +namespace WeChatManagementSample.Web.Ids4.Pages { public class IndexModel : WeChatManagementSamplePageModel { - public void OnGet() + [BindProperty(SupportsGet = true)] + public string MiniProgramName { get; set; } + + public async Task OnGetAsync() { - + MiniProgramName ??= await SettingProvider.GetOrNullAsync(MiniProgramsSettings.PcLogin.DefaultProgramName); } + } } \ No newline at end of file