手机号
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
18631081161 2026-03-25 23:44:30 +08:00
parent 725cf1a287
commit 3ae1f99374
7 changed files with 131 additions and 62 deletions

View File

@ -186,6 +186,7 @@
}
],
"license": "MIT",
"peer": true,
"engines": {
"node": ">=18"
},
@ -209,6 +210,7 @@
}
],
"license": "MIT",
"peer": true,
"engines": {
"node": ">=18"
}
@ -1053,6 +1055,7 @@
"resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
"integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@types/lodash": "*"
}
@ -1078,6 +1081,7 @@
"resolved": "https://registry.npmjs.org/@uppy/core/-/core-2.3.4.tgz",
"integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@transloadit/prettier-bytes": "0.0.7",
"@uppy/store-default": "^2.1.1",
@ -1109,6 +1113,7 @@
"resolved": "https://registry.npmjs.org/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz",
"integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@uppy/companion-client": "^2.2.2",
"@uppy/utils": "^4.1.2",
@ -1509,6 +1514,7 @@
"resolved": "https://registry.npmjs.org/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
"integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
"license": "MIT",
"peer": true,
"dependencies": {
"is-url": "^1.2.4"
},
@ -1541,6 +1547,7 @@
"resolved": "https://registry.npmjs.org/@wangeditor/core/-/core-1.1.19.tgz",
"integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
"license": "MIT",
"peer": true,
"dependencies": {
"@types/event-emitter": "^0.3.3",
"event-emitter": "^0.3.5",
@ -1571,6 +1578,7 @@
"resolved": "https://registry.npmjs.org/@wangeditor/editor/-/editor-5.1.23.tgz",
"integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@uppy/core": "^2.1.1",
"@uppy/xhr-upload": "^2.0.3",
@ -1938,6 +1946,7 @@
"resolved": "https://registry.npmjs.org/dom7/-/dom7-3.0.0.tgz",
"integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
"license": "MIT",
"peer": true,
"dependencies": {
"ssr-window": "^3.0.0-alpha.1"
}
@ -1961,6 +1970,7 @@
"resolved": "https://registry.npmjs.org/echarts/-/echarts-6.0.0.tgz",
"integrity": "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==",
"license": "Apache-2.0",
"peer": true,
"dependencies": {
"tslib": "2.3.0",
"zrender": "6.0.0"
@ -2479,7 +2489,8 @@
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.2.0.tgz",
"integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==",
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/is-plain-object": {
"version": "5.0.0",
@ -2521,6 +2532,7 @@
"integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"cssstyle": "^4.1.0",
"data-urls": "^5.0.0",
@ -2560,13 +2572,15 @@
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/lodash-es": {
"version": "4.17.22",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz",
"integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==",
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/lodash-unified": {
"version": "1.0.3",
@ -2583,44 +2597,51 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/lodash.foreach": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
"integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==",
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
"integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
"deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.",
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/lodash.throttle": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
"integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==",
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/lodash.toarray": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
"integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==",
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/loupe": {
"version": "3.2.1",
@ -2743,6 +2764,7 @@
}
],
"license": "MIT",
"peer": true,
"bin": {
"nanoid": "bin/nanoid.cjs"
},
@ -2837,6 +2859,7 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@ -3041,6 +3064,7 @@
"resolved": "https://registry.npmjs.org/slate/-/slate-0.72.8.tgz",
"integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==",
"license": "MIT",
"peer": true,
"dependencies": {
"immer": "^9.0.6",
"is-plain-object": "^5.0.0",
@ -3064,6 +3088,7 @@
"resolved": "https://registry.npmjs.org/snabbdom/-/snabbdom-3.6.3.tgz",
"integrity": "sha512-W2lHLLw2qR2Vv0DcMmcxXqcfdBaIcoN+y/86SmHv8fn4DazEQSH6KN3TjZcWvwujW56OHiiirsbHWZb4vx/0fg==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12.17.0"
}
@ -3256,6 +3281,7 @@
"integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
"devOptional": true,
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@ -3270,6 +3296,7 @@
"integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"esbuild": "^0.25.0",
"fdir": "^6.4.4",
@ -4391,6 +4418,7 @@
"integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"esbuild": "^0.21.3",
"postcss": "^8.4.43",
@ -4457,6 +4485,7 @@
"resolved": "https://registry.npmjs.org/vue/-/vue-3.5.26.tgz",
"integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/compiler-dom": "3.5.26",
"@vue/compiler-sfc": "3.5.26",

View File

@ -54,7 +54,8 @@ public class AuthController : ControllerBase
var result = await _authService.WechatMiniProgramLoginAsync(
request.Code,
request.Pid,
request.ClickId);
request.ClickId,
request.PhoneCode);
if (result.Success && result.LoginResponse != null)
{

View File

@ -3,95 +3,95 @@ using MiAssessment.Model.Models.Auth;
namespace MiAssessment.Core.Interfaces;
/// <summary>
/// 认证服务接口
/// <EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
/// </summary>
public interface IAuthService
{
/// <summary>
/// 微信小程序登录
/// ΢<EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼
/// </summary>
/// <param name="code">微信授权code</param>
/// <param name="pid">推荐人ID</param>
/// <param name="clickId">点击ID</param>
/// <returns>登录结果</returns>
Task<LoginResult> WechatMiniProgramLoginAsync(string code, int? pid, string? clickId);
/// <param name="code">΢<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩcode</param>
/// <param name="pid"><EFBFBD>Ƽ<EFBFBD><EFBFBD><EFBFBD>ID</param>
/// <param name="clickId"><EFBFBD><EFBFBD><EFBFBD>ID</param>
/// <returns><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD></returns>
Task<LoginResult> WechatMiniProgramLoginAsync(string code, int? pid, string? clickId, string? phoneCode = null);
/// <summary>
/// 手机号验证码登录
/// <EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD>¼
/// </summary>
/// <param name="mobile">手机号</param>
/// <param name="code">短信验证码</param>
/// <param name="pid">推荐人ID</param>
/// <param name="clickId">点击ID</param>
/// <returns>登录结果</returns>
/// <param name="mobile"><EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="code"><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD></param>
/// <param name="pid"><EFBFBD>Ƽ<EFBFBD><EFBFBD><EFBFBD>ID</param>
/// <param name="clickId"><EFBFBD><EFBFBD><EFBFBD>ID</param>
/// <returns><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD></returns>
Task<LoginResult> MobileLoginAsync(string mobile, string code, int? pid, string? clickId);
/// <summary>
/// 验证码绑定手机号
/// <EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="userId">用户ID</param>
/// <param name="mobile">手机号</param>
/// <param name="code">短信验证码</param>
/// <returns>绑定结果</returns>
/// <param name="userId"><EFBFBD>û<EFBFBD>ID</param>
/// <param name="mobile"><EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="code"><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD></param>
/// <returns><EFBFBD>󶨽<EFBFBD><EFBFBD></returns>
Task<BindMobileResponse> BindMobileAsync(long userId, string mobile, string code);
/// <summary>
/// 微信授权绑定手机号
/// ΢<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="userId">用户ID</param>
/// <param name="wechatCode">微信授权code</param>
/// <returns>绑定结果</returns>
/// <param name="userId"><EFBFBD>û<EFBFBD>ID</param>
/// <param name="wechatCode">΢<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩcode</param>
/// <returns><EFBFBD>󶨽<EFBFBD><EFBFBD></returns>
Task<BindMobileResponse> WechatBindMobileAsync(long userId, string wechatCode);
/// <summary>
/// 记录登录信息
/// <EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>Ϣ
/// </summary>
/// <param name="userId">用户ID</param>
/// <param name="device">设备类型</param>
/// <param name="deviceInfo">设备信息</param>
/// <returns>记录登录响应</returns>
/// <param name="userId"><EFBFBD>û<EFBFBD>ID</param>
/// <param name="device"><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="deviceInfo"><EFBFBD><EFBFBD><EFBFBD>Ϣ</param>
/// <returns><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>Ӧ</returns>
Task<RecordLoginResponse> RecordLoginAsync(long userId, string? device, string? deviceInfo);
/// <summary>
/// 账号注销
/// <EFBFBD>˺<EFBFBD>ע<EFBFBD><EFBFBD>
/// </summary>
/// <param name="userId">用户ID</param>
/// <param name="type">类型0=注销 1=取消注销</param>
/// <returns>异步任务</returns>
/// <param name="userId"><EFBFBD>û<EFBFBD>ID</param>
/// <param name="type"><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>0=ע<><D7A2> 1=ȡ<><C8A1>ע<EFBFBD><D7A2></param>
/// <returns><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
Task LogOffAsync(long userId, int type);
/// <summary>
/// H5绑定手机号(无需验证码)
/// H5<EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD>ţ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD>
/// </summary>
/// <param name="userId">用户ID</param>
/// <param name="mobile">手机号</param>
/// <returns>绑定结果</returns>
/// <param name="userId"><EFBFBD>û<EFBFBD>ID</param>
/// <param name="mobile"><EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD></param>
/// <returns><EFBFBD>󶨽<EFBFBD><EFBFBD></returns>
Task<BindMobileResponse> BindMobileH5Async(long userId, string mobile);
#region Refresh Token
#region Refresh Token <EFBFBD><EFBFBD>ط<EFBFBD><EFBFBD><EFBFBD>
/// <summary>
/// 刷新 Token
/// ˢ<EFBFBD><EFBFBD> Token
/// </summary>
/// <param name="refreshToken">Refresh Token</param>
/// <param name="ipAddress">客户端 IP 地址</param>
/// <returns>刷新结果,包含新的 Access Token 和 Refresh Token</returns>
/// <param name="ipAddress"><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD> IP <20><>ַ</param>
/// <returns>ˢ<EFBFBD>½<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> Access Token <20><> Refresh Token</returns>
Task<RefreshTokenResult> RefreshTokenAsync(string refreshToken, string? ipAddress);
/// <summary>
/// 撤销 Token
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Token
/// </summary>
/// <param name="refreshToken">要撤销的 Refresh Token</param>
/// <param name="ipAddress">客户端 IP 地址</param>
/// <returns>异步任务</returns>
/// <param name="refreshToken">Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Refresh Token</param>
/// <param name="ipAddress"><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD> IP <20><>ַ</param>
/// <returns><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
Task RevokeTokenAsync(string refreshToken, string? ipAddress);
/// <summary>
/// 撤销用户的所有 Token
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Token
/// </summary>
/// <param name="userId">用户ID</param>
/// <param name="ipAddress">客户端 IP 地址</param>
/// <returns>异步任务</returns>
/// <param name="userId"><EFBFBD>û<EFBFBD>ID</param>
/// <param name="ipAddress"><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD> IP <20><>ַ</param>
/// <returns><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
Task RevokeAllUserTokensAsync(long userId, string? ipAddress);
#endregion

View File

@ -60,9 +60,9 @@ public class AuthService : IAuthService
/// ΢<><CEA2>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>¼
/// Requirements: 1.1-1.8
/// </summary>
public async Task<LoginResult> WechatMiniProgramLoginAsync(string code, int? pid, string? clickId)
public async Task<LoginResult> WechatMiniProgramLoginAsync(string code, int? pid, string? clickId, string? phoneCode = null)
{
_logger.LogInformation("[AuthService] ΢<>ŵ<EFBFBD>¼<EFBFBD><C2BC>ʼ<EFBFBD><CABC>code={Code}, pid={Pid}", code, pid);
_logger.LogInformation("[AuthService] ΢<>ŵ<EFBFBD>¼<EFBFBD><C2BC>ʼ<EFBFBD><CABC>code={Code}, pid={Pid}, hasPhoneCode={HasPhoneCode}", code, pid, !string.IsNullOrWhiteSpace(phoneCode));
if (string.IsNullOrWhiteSpace(code))
{
@ -132,10 +132,29 @@ public class AuthService : IAuthService
{
// 1.3 新用户,创建并绑定上级
_logger.LogInformation("[AuthService] 用户不存在,开始创建新用户, pid={Pid}", pid);
// 通过 phoneCode 获取手机号
string? mobile = null;
if (!string.IsNullOrWhiteSpace(phoneCode))
{
_logger.LogInformation("[AuthService] 开始通过phoneCode获取手机号");
var mobileResult = await _wechatService.GetMobileAsync(phoneCode);
if (mobileResult.Success && !string.IsNullOrWhiteSpace(mobileResult.Mobile))
{
mobile = mobileResult.Mobile;
_logger.LogInformation("[AuthService] 手机号获取成功");
}
else
{
_logger.LogWarning("[AuthService] 手机号获取失败: {Error}", mobileResult.ErrorMessage);
}
}
var createDto = new CreateUserDto
{
OpenId = openId,
UnionId = unionId,
Mobile = mobile,
Nickname = await GetDefaultNicknameAsync(),
Headimg = await GetDefaultAvatarAsync(openId),
Pid = pid ?? 0
@ -155,6 +174,19 @@ public class AuthService : IAuthService
await _userService.UpdateUserAsync(user.Id, new UpdateUserDto { UnionId = unionId });
_logger.LogInformation("[AuthService] unionid更新成功");
}
// 已有用户如果没有手机号,也尝试通过 phoneCode 补充
if (string.IsNullOrWhiteSpace(user.Phone) && !string.IsNullOrWhiteSpace(phoneCode))
{
_logger.LogInformation("[AuthService] 已有用户缺少手机号尝试通过phoneCode补充");
var mobileResult = await _wechatService.GetMobileAsync(phoneCode);
if (mobileResult.Success && !string.IsNullOrWhiteSpace(mobileResult.Mobile))
{
await _userService.UpdateUserAsync(user.Id, new UpdateUserDto { Mobile = mobileResult.Mobile });
user.Phone = mobileResult.Mobile;
_logger.LogInformation("[AuthService] 手机号补充成功");
}
}
}
// 1.5 <20><><EFBFBD><EFBFBD>˫ Token<65><6E>Access Token + Refresh Token<65><6E>

View File

@ -13,6 +13,12 @@ public class WechatLoginRequest
[JsonPropertyName("code")]
public string Code { get; set; } = string.Empty;
/// <summary>
/// 微信获取手机号的授权code
/// </summary>
[JsonPropertyName("phoneCode")]
public string? PhoneCode { get; set; }
/// <summary>
/// 推荐人ID前端可能传空字符串所以用string接收
/// </summary>

View File

@ -1,6 +1,6 @@
{
"name" : "学业邑规划",
"appid" : "__UNI__1BAACAB",
"appid" : "__UNI__A612028",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : "100",

View File

@ -543,6 +543,7 @@ onLoad((options) => {
class="invite-input"
type="text"
placeholder="请输入5位邀请码"
placeholder-style="letter-spacing: 0rpx;"
:value="inviteCode"
@input="onInviteCodeInput"
maxlength="5"
@ -947,7 +948,7 @@ onLoad((options) => {
font-size: $font-size-lg;
color: $text-color;
text-align: center;
letter-spacing: 8rpx;
letter-spacing: 16rpx;
box-sizing: border-box;
}
</style>