You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
215 lines
8.0 KiB
215 lines
8.0 KiB
using Microsoft.AspNetCore.Authentication;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.AspNetCore.Identity;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.Extensions.Caching.Distributed;
|
|
using Microsoft.Extensions.Configuration;
|
|
using OpenIddict.Abstractions;
|
|
using Shentun.Peis.Enums;
|
|
using Shentun.Peis.Models;
|
|
using Shentun.Peis.SysParmValues;
|
|
using SqlSugar;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Net.Http;
|
|
using System.Net.Http.Headers;
|
|
using System.Security.Claims;
|
|
using System.Text;
|
|
using System.Text.Json;
|
|
using System.Threading.Tasks;
|
|
using Volo.Abp;
|
|
using Volo.Abp.Application.Services;
|
|
using Volo.Abp.Caching;
|
|
using Volo.Abp.Domain.Repositories;
|
|
using Volo.Abp.Identity;
|
|
|
|
namespace Shentun.Peis.ThirdUsers
|
|
{
|
|
/// <summary>
|
|
/// 第三方用户
|
|
/// </summary>
|
|
[ApiExplorerSettings(GroupName = "Work")]
|
|
[Authorize]
|
|
public class ThirdUserAppService : ApplicationService
|
|
{
|
|
|
|
|
|
private readonly IConfiguration _configuration;
|
|
private readonly IDistributedCache<string, string> _cache;
|
|
private readonly IRepository<ThirdUser, Guid> _thirdUserRepository;
|
|
private readonly CacheService _cacheService;
|
|
private readonly IRepository<IdentityUser, Guid> _identityUserRepository;
|
|
public ThirdUserAppService(
|
|
IConfiguration configuration,
|
|
IDistributedCache<string, string> cache,
|
|
IRepository<ThirdUser, Guid> thirdUserRepository,
|
|
CacheService cacheService,
|
|
IRepository<IdentityUser, Guid> identityUserRepository)
|
|
{
|
|
_configuration = configuration;
|
|
_cache = cache;
|
|
_thirdUserRepository = thirdUserRepository;
|
|
_cacheService = cacheService;
|
|
_identityUserRepository = identityUserRepository;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 微信用户登录
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
[AllowAnonymous]
|
|
[HttpPost("api/app/ThirdUser/WeChatUserLogin")]
|
|
public async Task<ThirdLoginDto> WeChatUserLoginAsync(WeChatUserLoginInputDto input)
|
|
{
|
|
var dic = new Dictionary<string, object>
|
|
{
|
|
{"jsCode",input.JsCode},
|
|
{"client_id","Peis_MiniProgram"},
|
|
{"mobile_phone",input.MobilePhone},
|
|
{"grant_type","mini_program"},
|
|
{"scope","Peis"}
|
|
};
|
|
//
|
|
var dicStr = dic.Select(m => m.Key + "=" + m.Value).DefaultIfEmpty().Aggregate((m, n) => m + "&" + n);
|
|
var token = await GetTokenAsync(dicStr);
|
|
var options = new DistributedCacheEntryOptions()
|
|
.SetAbsoluteExpiration(TimeSpan.FromDays(3));
|
|
var sessionKey = CacheKeys.SessionKey + Guid.NewGuid().ToString();
|
|
var sessionKeyValue = Guid.NewGuid().ToString();
|
|
_cache.Set(sessionKey, sessionKeyValue, options);
|
|
token.SessionKey = sessionKey;
|
|
token.SessionKeyValue = sessionKeyValue;
|
|
|
|
return token;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 获取第三方用户信息
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[HttpPost("api/app/ThirdUser/GetList")]
|
|
public async Task<List<ThirdUserDto>> GetListAsync(ThirdUserInputDto input)
|
|
{
|
|
var query = await _thirdUserRepository.GetQueryableAsync();
|
|
if (input.AbpUserId != null)
|
|
{
|
|
query = query.Where(m => m.AbpUserId == input.AbpUserId);
|
|
}
|
|
if (input.UserRegisterFlag != null)
|
|
{
|
|
query = query.Where(m => m.UserRegisterFlag == input.UserRegisterFlag);
|
|
}
|
|
if (input.IsActive != null)
|
|
{
|
|
query = query.Where(m => m.IsActive == input.IsActive);
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(input.MobilePhone))
|
|
{
|
|
query = query.Where(m => m.MobilePhone == input.MobilePhone);
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(input.WechatOpenId))
|
|
{
|
|
query = query.Where(m => m.WechatOpenId == input.WechatOpenId);
|
|
}
|
|
|
|
var entListDto = query.OrderByDescending(o => o.CreationTime).ToList().Select(s => new ThirdUserDto
|
|
{
|
|
AbpUserId = s.AbpUserId,
|
|
CreationTime = s.CreationTime,
|
|
CreatorId = s.CreatorId,
|
|
CreatorName = _cacheService.GetSurnameAsync(s.CreatorId).GetAwaiter().GetResult(),
|
|
Id = s.Id,
|
|
IsActive = s.IsActive,
|
|
LastModificationTime = s.LastModificationTime,
|
|
LastModifierId = s.LastModifierId,
|
|
LastModifierName = _cacheService.GetSurnameAsync(s.LastModifierId).GetAwaiter().GetResult(),
|
|
MobilePhone = s.MobilePhone,
|
|
UserRegisterFlag = s.UserRegisterFlag,
|
|
WechatOpenId = s.WechatOpenId
|
|
}).ToList();
|
|
|
|
return entListDto;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 绑定第三方用户归属到系统用户
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[HttpPost("api/app/ThirdUser/BindThirdUserInAbpUser")]
|
|
public async Task BindThirdUserInAbpUserAsync(BindThirdUserInAbpUserInputDto input)
|
|
{
|
|
var identityUser = await _identityUserRepository.FirstOrDefaultAsync(f => f.Id == input.AbpUserId);
|
|
if (identityUser == null)
|
|
{
|
|
throw new UserFriendlyException("系统用户不存在");
|
|
}
|
|
|
|
var thirdUser = await _thirdUserRepository.FirstOrDefaultAsync(f => f.Id == input.ThirdUserId);
|
|
if (thirdUser == null)
|
|
{
|
|
throw new UserFriendlyException("第三方用户不存在");
|
|
}
|
|
|
|
thirdUser.AbpUserId = input.AbpUserId;
|
|
|
|
await _thirdUserRepository.UpdateAsync(thirdUser);
|
|
|
|
}
|
|
|
|
|
|
private async Task<ThirdLoginDto> GetTokenAsync(string request)
|
|
{
|
|
using var client = new HttpClient();
|
|
HttpContent httpContent = new StringContent(request);
|
|
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
|
|
var url = _configuration.GetSection("AuthServer").
|
|
GetSection("Authority").Value + "/connect/token";
|
|
var tokenResult = await client.PostAsync(url
|
|
, httpContent);
|
|
var tokenResultStr = await tokenResult.Content.ReadAsStringAsync();
|
|
if (tokenResult.IsSuccessStatusCode)
|
|
{
|
|
var thirdLoginDto = new ThirdLoginDto();
|
|
|
|
if (!string.IsNullOrEmpty(tokenResultStr))
|
|
{
|
|
|
|
if (tokenResultStr.ToLower().Contains("openid"))
|
|
{
|
|
thirdLoginDto = JsonSerializer.Deserialize<ThirdLoginDto>(tokenResultStr,
|
|
new JsonSerializerOptions() { PropertyNameCaseInsensitive = true });
|
|
}
|
|
else
|
|
{
|
|
var signResult = JsonSerializer.Deserialize<SignInResultDto>(tokenResultStr,
|
|
new JsonSerializerOptions() { PropertyNameCaseInsensitive = true });
|
|
thirdLoginDto = new ThirdLoginDto
|
|
{
|
|
IsToken = "Y",
|
|
ExpiresIn = signResult.expires_in,
|
|
AccessToken = signResult.access_token,
|
|
RefreshToken = signResult.refresh_token
|
|
};
|
|
}
|
|
|
|
return thirdLoginDto;
|
|
}
|
|
else
|
|
{
|
|
throw new UserFriendlyException("token值为空");
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
throw new UserFriendlyException("获取token失败:" + tokenResultStr);
|
|
}
|
|
}
|
|
}
|
|
}
|