/*********************************************************************** * Project: CoreCms.Net * * Web: https://CoreCms.Net * * ProjectName: 核心内容管理系统 * * Author: 大灰灰 * * Email: JianWeie@163.com * * CreateTime: 2020-08-25 1:25:29 * Description: 暂无 ***********************************************************************/ using CoreCms.Net.IServices; using CoreCms.Net.Model.Entities; using Newtonsoft.Json; using System; using SKIT.FlurlHttpClient.Wechat.TenpayV3; using SKIT.FlurlHttpClient.Wechat.TenpayV3.Settings; using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models; namespace CoreCms.Net.Task { /// /// 定时更新微信支付平台证书 /// public class AutoRefreshPlatformCertificateJob { private readonly IWeChatPayConfigServices _weChatPayConfigServices; private readonly IWechatTenpayClientFactory _wechatTenpayClientFactory; private readonly ICoreCmsWeChatPayPlatformCertificateServices _weChatPayPlatformCertificateServices; private readonly ISysTaskLogServices _taskLogServices; /// /// 构造函数 /// public AutoRefreshPlatformCertificateJob(IWeChatPayConfigServices weChatPayConfigServices, IWechatTenpayClientFactory wechatTenpayClientFactory, ICoreCmsWeChatPayPlatformCertificateServices weChatPayPlatformCertificateServices, ISysTaskLogServices taskLogServices) { _weChatPayConfigServices = weChatPayConfigServices; _wechatTenpayClientFactory = wechatTenpayClientFactory; _weChatPayPlatformCertificateServices = weChatPayPlatformCertificateServices; _taskLogServices = taskLogServices; } public async System.Threading.Tasks.Task Execute() { var config = await _weChatPayConfigServices.QueryListByClauseAsync(p => p.isDefault == true && p.isEnable == true); if (config != null) { foreach (var item in config) { try { const string algorithmType = "RSA"; var client = await _wechatTenpayClientFactory.Create(item.mchId); var request = new QueryCertificatesRequest() { AlgorithmType = algorithmType }; var response = await client.ExecuteQueryCertificatesAsync(request); if (response.IsSuccessful()) { // NOTICE: // 如果构造 Client 时启用了 `AutoDecryptResponseSensitiveProperty` 配置项,则无需再执行下面一行的手动解密方法: response = client.DecryptResponseSensitiveProperty(response); foreach (var certificate in response.CertificateList) { var entity = CertificateEntry.Parse(algorithmType, certificate); // 将证书添加到平台证书管理器中 var model = await _weChatPayPlatformCertificateServices.QueryByClauseAsync(p => p.merchantId == item.mchId); if (model != null) { model.algorithmType = entity.AlgorithmType; model.serialNumber = entity.SerialNumber; model.certificate = entity.Certificate; model.effectiveTime = entity.EffectiveTime.DateTime; model.expireTime = entity.ExpireTime.DateTime; model.updataTime = DateTime.Now; await _weChatPayPlatformCertificateServices.UpdateAsync(model); } else { model = new CoreCmsWeChatPayPlatformCertificate(); model.algorithmType = entity.AlgorithmType; model.serialNumber = entity.SerialNumber; model.certificate = entity.Certificate; model.effectiveTime = entity.EffectiveTime.DateTime; model.expireTime = entity.ExpireTime.DateTime; model.merchantId = item.mchId; model.createTime = DateTime.Now; await _weChatPayPlatformCertificateServices.InsertAsync(model); } //client.PlatformCertificateManager.AddEntry(entity); } //插入日志 var log = new SysTaskLog { createTime = DateTime.Now, isSuccess = true, name = "刷新微信商户平台证书成功", parameters = JsonConvert.SerializeObject(response) }; await _taskLogServices.InsertAsync(log); } else { //插入日志 var log = new SysTaskLog { createTime = DateTime.Now, isSuccess = true, name = "刷新微信商户平台证书失败", parameters = $"刷新微信商户平台证书失败(状态码:{response.GetRawStatus()},错误代码:{response.ErrorCode},错误描述:{response.ErrorMessage})。", }; await _taskLogServices.InsertAsync(log); } } catch (Exception ex) { //插入日志 var log = new SysTaskLog { createTime = DateTime.Now, isSuccess = true, name = "刷新微信商户平台证书遇到异常", parameters = JsonConvert.SerializeObject(ex) }; await _taskLogServices.InsertAsync(log); } } } } } }