后端【新增】新增商家转账功能后台处理及接口回调获取。

This commit is contained in:
jianweie code
2025-07-29 00:51:57 +08:00
parent 596225acb1
commit c8b4bbd78d
38 changed files with 3385 additions and 436 deletions

View File

@@ -351,7 +351,9 @@ namespace CoreCms.Net.Configuration
[Description("企业付款到银行卡")]
= 2,
[Description("商家转账到零钱")]
= 3
= 3,
[Description("商家转账")]
= 4
}
#endregion
@@ -3406,6 +3408,47 @@ namespace CoreCms.Net.Configuration
#endregion
#region 线
/// <summary>
/// 抽奖活动类型
/// </summary>
public enum WeChatAutoReplyMatchModel
{
/// <summary>
/// 完全等于
/// </summary>
[Description("完全等于")]
Complete = 1,
/// <summary>
/// 模糊包含
/// </summary>
[Description("模糊包含")]
FuzzyMatching = 2,
}
#endregion
#region
/// <summary>
/// 微信支付验证微信支付身份方式
/// </summary>
public enum WeChatPayIdentityVerificationMethods
{
/// <summary>
/// 平台证书
/// </summary>
[Description("平台证书")]
PlatformCertificate = 0,
/// <summary>
/// 微信支付公钥
/// </summary>
[Description("微信支付公钥")]
PlatformPublicKey = 1,
}
#endregion
}
}

View File

@@ -0,0 +1,91 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2025/7/21 20:36:56
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using SqlSugar;
namespace CoreCms.Net.IRepository
{
/// <summary>
/// 微信支付平台证书 工厂接口
/// </summary>
public interface ICoreCmsWeChatPayPlatformCertificateRepository : IBaseRepository<CoreCmsWeChatPayPlatformCertificate>
{
#region ===========================================================
/// <summary>
/// 重写异步插入方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task<AdminUiCallBack> InsertAsync(CoreCmsWeChatPayPlatformCertificate entity);
/// <summary>
/// 重写异步更新方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task<AdminUiCallBack> UpdateAsync(CoreCmsWeChatPayPlatformCertificate entity);
/// <summary>
/// 重写异步更新方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task<AdminUiCallBack> UpdateAsync(List<CoreCmsWeChatPayPlatformCertificate> entity);
/// <summary>
/// 重写删除指定ID的数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<AdminUiCallBack> DeleteByIdAsync(object id);
/// <summary>
/// 重写删除指定ID集合的数据(批量删除)
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids);
#endregion ===========================================================
#region ==========================================================
/// <summary>
/// 获取缓存的所有数据
/// </summary>
/// <returns></returns>
Task<List<CoreCmsWeChatPayPlatformCertificate>> GetCaChe();
#endregion ==========================================================
/// <summary>
/// 重写根据条件查询分页数据
/// </summary>
/// <param name="predicate">判断集合</param>
/// <param name="orderByType">排序方式</param>
/// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param>
/// <param name="orderByExpression"></param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <returns></returns>
Task<IPageList<CoreCmsWeChatPayPlatformCertificate>> QueryPageAsync(
Expression<Func<CoreCmsWeChatPayPlatformCertificate, bool>> predicate,
Expression<Func<CoreCmsWeChatPayPlatformCertificate, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false);
}
}

View File

@@ -0,0 +1,81 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2025/7/28 23:08:04
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using SqlSugar;
namespace CoreCms.Net.IRepository
{
/// <summary>
/// 用户提现使用商家转账微信回调通知 工厂接口
/// </summary>
public interface ICoreCmsUserTocashWeChatNotifyRepository : IBaseRepository<CoreCmsUserTocashWeChatNotify>
{
#region ===========================================================
/// <summary>
/// 重写异步插入方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task<AdminUiCallBack> InsertAsync(CoreCmsUserTocashWeChatNotify entity);
/// <summary>
/// 重写异步更新方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task<AdminUiCallBack> UpdateAsync(CoreCmsUserTocashWeChatNotify entity);
/// <summary>
/// 重写异步更新方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task<AdminUiCallBack> UpdateAsync(List<CoreCmsUserTocashWeChatNotify> entity);
/// <summary>
/// 重写删除指定ID的数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<AdminUiCallBack> DeleteByIdAsync(object id);
/// <summary>
/// 重写删除指定ID集合的数据(批量删除)
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids);
#endregion ===========================================================
/// <summary>
/// 重写根据条件查询分页数据
/// </summary>
/// <param name="predicate">判断集合</param>
/// <param name="orderByType">排序方式</param>
/// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param>
/// <param name="orderByExpression"></param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <returns></returns>
Task<IPageList<CoreCmsUserTocashWeChatNotify>> QueryPageAsync(
Expression<Func<CoreCmsUserTocashWeChatNotify, bool>> predicate,
Expression<Func<CoreCmsUserTocashWeChatNotify, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false);
}
}

View File

@@ -0,0 +1,81 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2025/7/23 16:37:18
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using SqlSugar;
namespace CoreCms.Net.IRepository
{
/// <summary>
/// 用户提现使用商家转账回调记录 工厂接口
/// </summary>
public interface ICoreCmsUserTocashWeChatResponseRepository : IBaseRepository<CoreCmsUserTocashWeChatResponse>
{
#region ===========================================================
/// <summary>
/// 重写异步插入方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task<AdminUiCallBack> InsertAsync(CoreCmsUserTocashWeChatResponse entity);
/// <summary>
/// 重写异步更新方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task<AdminUiCallBack> UpdateAsync(CoreCmsUserTocashWeChatResponse entity);
/// <summary>
/// 重写异步更新方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task<AdminUiCallBack> UpdateAsync(List<CoreCmsUserTocashWeChatResponse> entity);
/// <summary>
/// 重写删除指定ID的数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<AdminUiCallBack> DeleteByIdAsync(object id);
/// <summary>
/// 重写删除指定ID集合的数据(批量删除)
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids);
#endregion ===========================================================
/// <summary>
/// 重写根据条件查询分页数据
/// </summary>
/// <param name="predicate">判断集合</param>
/// <param name="orderByType">排序方式</param>
/// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param>
/// <param name="orderByExpression"></param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <returns></returns>
Task<IPageList<CoreCmsUserTocashWeChatResponse>> QueryPageAsync(
Expression<Func<CoreCmsUserTocashWeChatResponse, bool>> predicate,
Expression<Func<CoreCmsUserTocashWeChatResponse, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false);
}
}

View File

@@ -7,6 +7,7 @@
<ItemGroup>
<PackageReference Include="AlipaySDKNet.Standard" Version="4.9.320" />
<PackageReference Include="Essensoft.Paylink.WeChatPay" Version="4.1.9" />
<PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="3.13.0" />
</ItemGroup>
<ItemGroup>

View File

@@ -0,0 +1,95 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2025/7/21 20:36:56
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using SqlSugar;
namespace CoreCms.Net.IServices
{
/// <summary>
/// 微信支付平台证书 服务工厂接口
/// </summary>
public interface ICoreCmsWeChatPayPlatformCertificateServices : IBaseServices<CoreCmsWeChatPayPlatformCertificate>
{
#region ===========================================================
/// <summary>
/// 重写异步插入方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task<AdminUiCallBack> InsertAsync(CoreCmsWeChatPayPlatformCertificate entity);
/// <summary>
/// 重写异步更新方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task<AdminUiCallBack> UpdateAsync(CoreCmsWeChatPayPlatformCertificate entity);
/// <summary>
/// 重写异步更新方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task<AdminUiCallBack> UpdateAsync(List<CoreCmsWeChatPayPlatformCertificate> entity);
/// <summary>
/// 重写删除指定ID的数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<AdminUiCallBack> DeleteByIdAsync(object id);
/// <summary>
/// 重写删除指定ID集合的数据(批量删除)
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids);
#endregion ===========================================================
#region ==========================================================
/// <summary>
/// 获取缓存的所有数据
/// </summary>
/// <returns></returns>
Task<List<CoreCmsWeChatPayPlatformCertificate>> GetCaChe();
#endregion ==========================================================
#region
/// <summary>
/// 重写根据条件查询分页数据
/// </summary>
/// <param name="predicate">判断集合</param>
/// <param name="orderByType">排序方式</param>
/// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param>
/// <param name="orderByExpression"></param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <returns></returns>
Task<IPageList<CoreCmsWeChatPayPlatformCertificate>> QueryPageAsync(
Expression<Func<CoreCmsWeChatPayPlatformCertificate, bool>> predicate,
Expression<Func<CoreCmsWeChatPayPlatformCertificate, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false);
#endregion
}
}

View File

@@ -0,0 +1,83 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2025/7/28 23:08:04
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using SqlSugar;
namespace CoreCms.Net.IServices
{
/// <summary>
/// 用户提现使用商家转账微信回调通知 服务工厂接口
/// </summary>
public interface ICoreCmsUserTocashWeChatNotifyServices : IBaseServices<CoreCmsUserTocashWeChatNotify>
{
#region ===========================================================
/// <summary>
/// 重写异步插入方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task<AdminUiCallBack> InsertAsync(CoreCmsUserTocashWeChatNotify entity);
/// <summary>
/// 重写异步更新方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task<AdminUiCallBack> UpdateAsync(CoreCmsUserTocashWeChatNotify entity);
/// <summary>
/// 重写异步更新方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task<AdminUiCallBack> UpdateAsync(List<CoreCmsUserTocashWeChatNotify> entity);
/// <summary>
/// 重写删除指定ID的数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<AdminUiCallBack> DeleteByIdAsync(object id);
/// <summary>
/// 重写删除指定ID集合的数据(批量删除)
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids);
#endregion
#region
/// <summary>
/// 重写根据条件查询分页数据
/// </summary>
/// <param name="predicate">判断集合</param>
/// <param name="orderByType">排序方式</param>
/// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param>
/// <param name="orderByExpression"></param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <returns></returns>
Task<IPageList<CoreCmsUserTocashWeChatNotify>> QueryPageAsync(
Expression<Func<CoreCmsUserTocashWeChatNotify, bool>> predicate,
Expression<Func<CoreCmsUserTocashWeChatNotify, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false);
#endregion
}
}

View File

@@ -0,0 +1,85 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2025/7/23 16:37:18
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using SqlSugar;
namespace CoreCms.Net.IServices
{
/// <summary>
/// 用户提现使用商家转账回调记录 服务工厂接口
/// </summary>
public interface ICoreCmsUserTocashWeChatResponseServices : IBaseServices<CoreCmsUserTocashWeChatResponse>
{
#region ===========================================================
/// <summary>
/// 重写异步插入方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task<AdminUiCallBack> InsertAsync(CoreCmsUserTocashWeChatResponse entity);
/// <summary>
/// 重写异步更新方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task<AdminUiCallBack> UpdateAsync(CoreCmsUserTocashWeChatResponse entity);
/// <summary>
/// 重写异步更新方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task<AdminUiCallBack> UpdateAsync(List<CoreCmsUserTocashWeChatResponse> entity);
/// <summary>
/// 重写删除指定ID的数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<AdminUiCallBack> DeleteByIdAsync(object id);
/// <summary>
/// 重写删除指定ID集合的数据(批量删除)
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids);
#endregion ===========================================================
#region
/// <summary>
/// 重写根据条件查询分页数据
/// </summary>
/// <param name="predicate">判断集合</param>
/// <param name="orderByType">排序方式</param>
/// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param>
/// <param name="orderByExpression"></param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <returns></returns>
Task<IPageList<CoreCmsUserTocashWeChatResponse>> QueryPageAsync(
Expression<Func<CoreCmsUserTocashWeChatResponse, bool>> predicate,
Expression<Func<CoreCmsUserTocashWeChatResponse, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false);
#endregion
}
}

View File

@@ -0,0 +1,13 @@
using System.Threading.Tasks;
using SKIT.FlurlHttpClient.Wechat.TenpayV3;
namespace CoreCms.Net.IServices
{
/// <summary>
/// ΢<><CEA2>֧<EFBFBD><D6A7><EFBFBD><EFBFBD><EFBFBD>ӹ<EFBFBD><D3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
/// </summary>
public interface IWechatTenpayClientFactory
{
Task<WechatTenpayClient> Create(string merchantId);
}
}

View File

@@ -4743,7 +4743,7 @@
</member>
<member name="T:CoreCms.Net.Model.Entities.CoreCmsWeChatPayConfig">
<summary>
微信支付配置
微信支付配置
</summary>
</member>
<member name="M:CoreCms.Net.Model.Entities.CoreCmsWeChatPayConfig.#ctor">
@@ -4826,6 +4826,96 @@
应用类型
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsWeChatPayConfig.payType">
<summary>
高级模式
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsWeChatPayConfig.certificateSerialNumber">
<summary>
商户证书序列号
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsWeChatPayConfig.certificatePrivateKey">
<summary>
商户证书文件内容
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsWeChatPayConfig.platformSerialNumber">
<summary>
平台证书序列号
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsWeChatPayConfig.platformPublicKeyId">
<summary>
平台公钥ID
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsWeChatPayConfig.platformPublicKey">
<summary>
平台公钥内容
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsWeChatPayConfig.transferBillsUrl">
<summary>
提现回调通知
</summary>
</member>
<member name="T:CoreCms.Net.Model.Entities.CoreCmsWeChatPayPlatformCertificate">
<summary>
微信支付平台证书
</summary>
</member>
<member name="M:CoreCms.Net.Model.Entities.CoreCmsWeChatPayPlatformCertificate.#ctor">
<summary>
构造函数
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsWeChatPayPlatformCertificate.id">
<summary>
序列
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsWeChatPayPlatformCertificate.algorithmType">
<summary>
证书算法类型
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsWeChatPayPlatformCertificate.certificate">
<summary>
证书内容
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsWeChatPayPlatformCertificate.effectiveTime">
<summary>
获取生效时间
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsWeChatPayPlatformCertificate.expireTime">
<summary>
获取过期时间
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsWeChatPayPlatformCertificate.serialNumber">
<summary>
证书编号
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsWeChatPayPlatformCertificate.merchantId">
<summary>
商户编号
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsWeChatPayPlatformCertificate.createTime">
<summary>
创建时间
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsWeChatPayPlatformCertificate.updataTime">
<summary>
更新时间
</summary>
</member>
<member name="T:CoreCms.Net.Model.Entities.CoreCmsPinTuanGoods">
<summary>
拼团商品表
@@ -8302,6 +8392,116 @@
用户昵称
</summary>
</member>
<member name="T:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatNotify">
<summary>
用户提现使用商家转账微信回调通知
</summary>
</member>
<member name="M:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatNotify.#ctor">
<summary>
构造函数
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatNotify.id">
<summary>
序列
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatNotify.callBackId">
<summary>
通知ID
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatNotify.create_time">
<summary>
通知创建时间
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatNotify.resource_type">
<summary>
通知数据类型
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatNotify.event_type">
<summary>
通知类型
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatNotify.summary">
<summary>
回调摘要
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatNotify.resource">
<summary>
通知数据
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatNotify.createTime">
<summary>
创建时间
</summary>
</member>
<member name="T:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatResponse">
<summary>
用户提现使用商家转账回调记录
</summary>
</member>
<member name="M:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatResponse.#ctor">
<summary>
构造函数
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatResponse.id">
<summary>
序列
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatResponse.out_bill_no">
<summary>
商户单号
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatResponse.transfer_bill_no">
<summary>
微信转账单号
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatResponse.create_time">
<summary>
单据创建时间
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatResponse.state">
<summary>
单据状态
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatResponse.package_info">
<summary>
跳转领取页面的package信息
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatResponse.code">
<summary>
状态码
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatResponse.message">
<summary>
消息内容
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatResponse.detail">
<summary>
描述
</summary>
</member>
<member name="P:CoreCms.Net.Model.Entities.CoreCmsUserTocashWeChatResponse.createTime">
<summary>
创建时间
</summary>
</member>
<member name="T:CoreCms.Net.Model.Entities.CoreCmsUserToken">
<summary>
用户token
@@ -10094,6 +10294,72 @@
base64数据
</summary>
</member>
<member name="T:CoreCms.Net.Model.FromBody.FMTransferBillsCallBack">
<summary>
商家转账回调通知实体数据
</summary>
</member>
<member name="P:CoreCms.Net.Model.FromBody.FMTransferBillsCallBack.id">
<summary>
通知ID】通知的唯一ID
</summary>
</member>
<member name="P:CoreCms.Net.Model.FromBody.FMTransferBillsCallBack.create_time">
<summary>
【通知创建时间】
通知创建的时间遵循rfc3339标准格式格式为yyyy-MM-DDTHH:mm:ss+TIMEZONEyyyy-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss.表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35+08:00表示北京时间2015年05月20日13点29分35秒。
</summary>
</member>
<member name="P:CoreCms.Net.Model.FromBody.FMTransferBillsCallBack.resource_type">
<summary>
【通知数据类型】通知的资源数据类型商家转账通知为encrypt-resource
</summary>
</member>
<member name="P:CoreCms.Net.Model.FromBody.FMTransferBillsCallBack.event_type">
<summary>
【通知类型】通知的类型商家转账通知的类型为MCHTRANSFER.BILL.FINISHED
</summary>
</member>
<member name="P:CoreCms.Net.Model.FromBody.FMTransferBillsCallBack.summary">
<summary>
【回调摘要】回调摘要
</summary>
</member>
<member name="P:CoreCms.Net.Model.FromBody.FMTransferBillsCallBack.resource">
<summary>
通知数据
</summary>
</member>
<member name="T:CoreCms.Net.Model.FromBody.FMTransferBillsCallBackResource">
<summary>
商家转账回调通知实体数据-通知数据
</summary>
</member>
<member name="P:CoreCms.Net.Model.FromBody.FMTransferBillsCallBackResource.original_type">
<summary>
【原始类型】原始回调类型为mch_payment
</summary>
</member>
<member name="P:CoreCms.Net.Model.FromBody.FMTransferBillsCallBackResource.algorithm">
<summary>
【加密算法类型】对开启结果数据进行加密的加密算法目前只支持AEAD_AES_256_GCM
</summary>
</member>
<member name="P:CoreCms.Net.Model.FromBody.FMTransferBillsCallBackResource.ciphertext">
<summary>
数据密文】Base64编码后的商家转账结果数据密文
</summary>
</member>
<member name="P:CoreCms.Net.Model.FromBody.FMTransferBillsCallBackResource.associated_data">
<summary>
【附加数据】附加数据
</summary>
</member>
<member name="P:CoreCms.Net.Model.FromBody.FMTransferBillsCallBackResource.nonce">
<summary>
随机串】加密使用的随机串。
</summary>
</member>
<member name="T:CoreCms.Net.Model.FromBody.FMUpdateBoolDataByIntId">
<summary>
按照序列进行更新Bool类型数据

View File

@@ -1,10 +1,10 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2023/4/22 23:40:15
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2025/7/28 22:49:53
* Description: 暂无
***********************************************************************/
@@ -15,7 +15,7 @@ using System.ComponentModel.DataAnnotations;
namespace CoreCms.Net.Model.Entities
{
/// <summary>
/// 微信支付配置
/// 微信支付配置
/// </summary>
public partial class CoreCmsWeChatPayConfig
{
@@ -25,188 +25,173 @@ namespace CoreCms.Net.Model.Entities
public CoreCmsWeChatPayConfig()
{
}
/// <summary>
/// 序列
/// </summary>
[Display(Name = "序列")]
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
[Required(ErrorMessage = "请输入{0}")]
public System.Int32 id { get; set; }
public System.Int32 id { get; set; }
/// <summary>
/// 应用号
/// </summary>
[Display(Name = "应用号")]
[Required(ErrorMessage = "请输入{0}")]
[StringLength(maximumLength:50,ErrorMessage = "{0}不能超过{1}字")]
public System.String appId { get; set; }
[StringLength(maximumLength: 50, ErrorMessage = "{0}不能超过{1}字")]
public System.String appId { get; set; }
/// <summary>
/// 商户号
/// </summary>
[Display(Name = "商户号")]
[Required(ErrorMessage = "请输入{0}")]
[StringLength(maximumLength:50,ErrorMessage = "{0}不能超过{1}字")]
public System.String mchId { get; set; }
[StringLength(maximumLength: 50, ErrorMessage = "{0}不能超过{1}字")]
public System.String mchId { get; set; }
/// <summary>
/// API秘钥
/// </summary>
[Display(Name = "API秘钥")]
[StringLength(maximumLength:50,ErrorMessage = "{0}不能超过{1}字")]
public System.String apiKey { get; set; }
[Required(ErrorMessage = "请输入{0}")]
[StringLength(maximumLength: 50, ErrorMessage = "{0}不能超过{1}字")]
public System.String apiKey { get; set; }
/// <summary>
/// APIv3密钥
/// </summary>
[Display(Name = "APIv3密钥")]
[StringLength(maximumLength:50,ErrorMessage = "{0}不能超过{1}字")]
public System.String apiV3Key { get; set; }
[StringLength(maximumLength: 50, ErrorMessage = "{0}不能超过{1}字")]
public System.String apiV3Key { get; set; }
/// <summary>
/// p12证书base64
/// </summary>
[Display(Name = "p12证书base64")]
[StringLength(maximumLength:8000,ErrorMessage = "{0}不能超过{1}字")]
public System.String certificate { get; set; }
[Required(ErrorMessage = "请输入{0}")]
public System.String certificate { get; set; }
/// <summary>
/// RSA公钥
/// </summary>
[Display(Name = "RSA公钥")]
[StringLength(maximumLength:1000,ErrorMessage = "{0}不能超过{1}字")]
public System.String rsaPublicKey { get; set; }
[StringLength(maximumLength: 1000, ErrorMessage = "{0}不能超过{1}字")]
public System.String rsaPublicKey { get; set; }
/// <summary>
/// 子商户应用号
/// </summary>
[Display(Name = "子商户应用号")]
[StringLength(maximumLength:50,ErrorMessage = "{0}不能超过{1}字")]
public System.String subAppId { get; set; }
[StringLength(maximumLength: 50, ErrorMessage = "{0}不能超过{1}字")]
public System.String subAppId { get; set; }
/// <summary>
/// 子商户号
/// </summary>
[Display(Name = "子商户号")]
[StringLength(maximumLength:50,ErrorMessage = "{0}不能超过{1}字")]
public System.String subMchId { get; set; }
[StringLength(maximumLength: 50, ErrorMessage = "{0}不能超过{1}字")]
public System.String subMchId { get; set; }
/// <summary>
/// 支付回调通知
/// </summary>
[Display(Name = "支付回调通知")]
[StringLength(maximumLength:200,ErrorMessage = "{0}不能超过{1}字")]
public System.String notifyUrl { get; set; }
[Required(ErrorMessage = "请输入{0}")]
[StringLength(maximumLength: 200, ErrorMessage = "{0}不能超过{1}字")]
public System.String notifyUrl { get; set; }
/// <summary>
/// 退款回调
/// </summary>
[Display(Name = "退款回调")]
[StringLength(maximumLength:200,ErrorMessage = "{0}不能超过{1}字")]
public System.String refundUrl { get; set; }
[Required(ErrorMessage = "请输入{0}")]
[StringLength(maximumLength: 200, ErrorMessage = "{0}不能超过{1}字")]
public System.String refundUrl { get; set; }
/// <summary>
/// 跳转地址
/// </summary>
[Display(Name = "跳转地址")]
[StringLength(maximumLength:200,ErrorMessage = "{0}不能超过{1}字")]
public System.String jumpUrl { get; set; }
[StringLength(maximumLength: 200, ErrorMessage = "{0}不能超过{1}字")]
public System.String jumpUrl { get; set; }
/// <summary>
/// 是否开启
/// </summary>
[Display(Name = "是否开启")]
[Required(ErrorMessage = "请输入{0}")]
public System.Boolean isEnable { get; set; }
public System.Boolean isEnable { get; set; }
/// <summary>
/// 是否本类默认
/// </summary>
[Display(Name = "是否本类默认")]
[Required(ErrorMessage = "请输入{0}")]
public System.Boolean isDefault { get; set; }
public System.Boolean isDefault { get; set; }
/// <summary>
/// 应用类型
/// </summary>
[Display(Name = "应用类型")]
[StringLength(maximumLength:50,ErrorMessage = "{0}不能超过{1}字")]
public System.String appType { get; set; }
[Required(ErrorMessage = "请输入{0}")]
[StringLength(maximumLength: 50, ErrorMessage = "{0}不能超过{1}字")]
public System.String appType { get; set; }
/// <summary>
/// 高级模式
/// </summary>
[Display(Name = "高级模式")]
[Required(ErrorMessage = "请输入{0}")]
public System.Int32 payType { get; set; }
/// <summary>
/// 商户证书序列号
/// </summary>
[Display(Name = "商户证书序列号")]
[StringLength(maximumLength: 50, ErrorMessage = "{0}不能超过{1}字")]
public System.String certificateSerialNumber { get; set; }
/// <summary>
/// 商户证书文件内容
/// </summary>
[Display(Name = "商户证书文件内容")]
public System.String certificatePrivateKey { get; set; }
/// <summary>
/// 平台证书序列号
/// </summary>
[Display(Name = "平台证书序列号")]
[StringLength(maximumLength: 50, ErrorMessage = "{0}不能超过{1}字")]
public System.String platformSerialNumber { get; set; }
/// <summary>
/// 平台公钥ID
/// </summary>
[Display(Name = "平台公钥ID")]
[StringLength(maximumLength: 50, ErrorMessage = "{0}不能超过{1}字")]
public System.String platformPublicKeyId { get; set; }
/// <summary>
/// 平台公钥内容
/// </summary>
[Display(Name = "平台公钥内容")]
public System.String platformPublicKey { get; set; }
/// <summary>
/// 提现回调通知
/// </summary>
[Display(Name = "提现回调通知")]
[StringLength(maximumLength: 200, ErrorMessage = "{0}不能超过{1}字")]
public System.String transferBillsUrl { get; set; }
}
}
}

View File

@@ -0,0 +1,95 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2025/7/21 20:39:06
* Description: 暂无
***********************************************************************/
using SqlSugar;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace CoreCms.Net.Model.Entities
{
/// <summary>
/// 微信支付平台证书
/// </summary>
public partial class CoreCmsWeChatPayPlatformCertificate
{
/// <summary>
/// 构造函数
/// </summary>
public CoreCmsWeChatPayPlatformCertificate()
{
}
/// <summary>
/// 序列
/// </summary>
[Display(Name = "序列")]
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
[Required(ErrorMessage = "请输入{0}")]
public System.Int32 id { get; set; }
/// <summary>
/// 证书算法类型
/// </summary>
[Display(Name = "证书算法类型")]
[Required(ErrorMessage = "请输入{0}")]
[StringLength(maximumLength: 50, ErrorMessage = "{0}不能超过{1}字")]
public System.String algorithmType { get; set; }
/// <summary>
/// 证书内容
/// </summary>
[Display(Name = "证书内容")]
[Required(ErrorMessage = "请输入{0}")]
public System.String certificate { get; set; }
/// <summary>
/// 获取生效时间
/// </summary>
[Display(Name = "获取生效时间")]
[Required(ErrorMessage = "请输入{0}")]
public System.DateTime effectiveTime { get; set; }
/// <summary>
/// 获取过期时间
/// </summary>
[Display(Name = "获取过期时间")]
[Required(ErrorMessage = "请输入{0}")]
public System.DateTime expireTime { get; set; }
/// <summary>
/// 证书编号
/// </summary>
[Display(Name = "证书编号")]
[Required(ErrorMessage = "请输入{0}")]
[StringLength(maximumLength: 50, ErrorMessage = "{0}不能超过{1}字")]
public System.String serialNumber { get; set; }
/// <summary>
/// 商户编号
/// </summary>
[Display(Name = "商户编号")]
[Required(ErrorMessage = "请输入{0}")]
[StringLength(maximumLength: 50, ErrorMessage = "{0}不能超过{1}字")]
public System.String merchantId { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[Display(Name = "创建时间")]
[Required(ErrorMessage = "请输入{0}")]
public System.DateTime createTime { get; set; }
/// <summary>
/// 更新时间
/// </summary>
[Display(Name = "更新时间")]
public System.DateTime? updataTime { get; set; }
}
}

View File

@@ -0,0 +1,91 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2025/7/28 23:08:04
* Description: 暂无
***********************************************************************/
using SqlSugar;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace CoreCms.Net.Model.Entities
{
/// <summary>
/// 用户提现使用商家转账微信回调通知
/// </summary>
public partial class CoreCmsUserTocashWeChatNotify
{
/// <summary>
/// 构造函数
/// </summary>
public CoreCmsUserTocashWeChatNotify()
{
}
/// <summary>
/// 序列
/// </summary>
[Display(Name = "序列")]
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
[Required(ErrorMessage = "请输入{0}")]
public System.Int32 id { get; set; }
/// <summary>
/// 通知ID
/// </summary>
[Display(Name = "通知ID")]
[Required(ErrorMessage = "请输入{0}")]
[StringLength(maximumLength: 50, ErrorMessage = "{0}不能超过{1}字")]
public System.String callBackId { get; set; }
/// <summary>
/// 通知创建时间
/// </summary>
[Display(Name = "通知创建时间")]
[Required(ErrorMessage = "请输入{0}")]
[StringLength(maximumLength: 50, ErrorMessage = "{0}不能超过{1}字")]
public System.String create_time { get; set; }
/// <summary>
/// 通知数据类型
/// </summary>
[Display(Name = "通知数据类型")]
[Required(ErrorMessage = "请输入{0}")]
[StringLength(maximumLength: 50, ErrorMessage = "{0}不能超过{1}字")]
public System.String resource_type { get; set; }
/// <summary>
/// 通知类型
/// </summary>
[Display(Name = "通知类型")]
[Required(ErrorMessage = "请输入{0}")]
[StringLength(maximumLength: 50, ErrorMessage = "{0}不能超过{1}字")]
public System.String event_type { get; set; }
/// <summary>
/// 回调摘要
/// </summary>
[Display(Name = "回调摘要")]
[Required(ErrorMessage = "请输入{0}")]
[StringLength(maximumLength: 100, ErrorMessage = "{0}不能超过{1}字")]
public System.String summary { get; set; }
/// <summary>
/// 通知数据
/// </summary>
[Display(Name = "通知数据")]
[Required(ErrorMessage = "请输入{0}")]
public System.String resource { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[Display(Name = "创建时间")]
[Required(ErrorMessage = "请输入{0}")]
public System.DateTime createTime { get; set; }
}
}

View File

@@ -0,0 +1,105 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2025/7/23 16:44:04
* Description: 暂无
***********************************************************************/
using SqlSugar;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace CoreCms.Net.Model.Entities
{
/// <summary>
/// 用户提现使用商家转账回调记录
/// </summary>
public partial class CoreCmsUserTocashWeChatResponse
{
/// <summary>
/// 构造函数
/// </summary>
public CoreCmsUserTocashWeChatResponse()
{
}
/// <summary>
/// 序列
/// </summary>
[Display(Name = "序列")]
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
[Required(ErrorMessage = "请输入{0}")]
public System.Int32 id { get; set; }
/// <summary>
/// 商户单号
/// </summary>
[Display(Name = "商户单号")]
[Required(ErrorMessage = "请输入{0}")]
[StringLength(maximumLength: 50, ErrorMessage = "{0}不能超过{1}字")]
public System.String out_bill_no { get; set; }
/// <summary>
/// 微信转账单号
/// </summary>
[Display(Name = "微信转账单号")]
[Required(ErrorMessage = "请输入{0}")]
[StringLength(maximumLength: 100, ErrorMessage = "{0}不能超过{1}字")]
public System.String transfer_bill_no { get; set; }
/// <summary>
/// 单据创建时间
/// </summary>
[Display(Name = "单据创建时间")]
[Required(ErrorMessage = "请输入{0}")]
public System.DateTime create_time { get; set; }
/// <summary>
/// 单据状态
/// </summary>
[Display(Name = "单据状态")]
[Required(ErrorMessage = "请输入{0}")]
[StringLength(maximumLength: 50, ErrorMessage = "{0}不能超过{1}字")]
public System.String state { get; set; }
/// <summary>
/// 跳转领取页面的package信息
/// </summary>
[Display(Name = "跳转领取页面的package信息")]
[StringLength(maximumLength: 255, ErrorMessage = "{0}不能超过{1}字")]
public System.String package_info { get; set; }
/// <summary>
/// 状态码
/// </summary>
[Display(Name = "状态码")]
public System.Int32? code { get; set; }
/// <summary>
/// 消息内容
/// </summary>
[Display(Name = "消息内容")]
[StringLength(maximumLength: 255, ErrorMessage = "{0}不能超过{1}字")]
public System.String message { get; set; }
/// <summary>
/// 描述
/// </summary>
[Display(Name = "描述")]
[StringLength(maximumLength: 255, ErrorMessage = "{0}不能超过{1}字")]
public System.String detail { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[Display(Name = "创建时间")]
[Required(ErrorMessage = "请输入{0}")]
public System.DateTime createTime { get; set; }
}
}

View File

@@ -0,0 +1,80 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CoreCms.Net.Model.FromBody
{
/// <summary>
/// 商家转账回调通知实体数据
/// </summary>
public class FMTransferBillsCallBack
{
/// <summary>
/// 通知ID】通知的唯一ID
/// </summary>
public string id { get; set; }
/// <summary>
/// 【通知创建时间】
/// 通知创建的时间遵循rfc3339标准格式格式为yyyy-MM-DDTHH:mm:ss+TIMEZONEyyyy-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss.表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35+08:00表示北京时间2015年05月20日13点29分35秒。
/// </summary>
public string create_time { get; set; }
/// <summary>
/// 【通知数据类型】通知的资源数据类型商家转账通知为encrypt-resource
/// </summary>
public string resource_type { get; set; }
/// <summary>
/// 【通知类型】通知的类型商家转账通知的类型为MCHTRANSFER.BILL.FINISHED
/// </summary>
public string event_type { get; set; }
/// <summary>
/// 【回调摘要】回调摘要
/// </summary>
public string summary { get; set; }
/// <summary>
/// 通知数据
/// </summary>
public FMTransferBillsCallBackResource resource { get; set; }
}
/// <summary>
/// 商家转账回调通知实体数据-通知数据
/// </summary>
public class FMTransferBillsCallBackResource
{
/// <summary>
/// 【原始类型】原始回调类型为mch_payment
/// </summary>
public string original_type { get; set; }
/// <summary>
/// 【加密算法类型】对开启结果数据进行加密的加密算法目前只支持AEAD_AES_256_GCM
/// </summary>
public string algorithm { get; set; }
/// <summary>
/// 数据密文】Base64编码后的商家转账结果数据密文
/// </summary>
public string ciphertext { get; set; }
/// <summary>
/// 【附加数据】附加数据
/// </summary>
public string? associated_data { get; set; }
/// <summary>
/// 随机串】加密使用的随机串。
/// </summary>
public string? nonce { get; set; }
}
}

View File

@@ -0,0 +1,212 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2025/7/21 20:36:56
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Caching.Manual;
using CoreCms.Net.Configuration;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.Model.ViewModels.UI;
using SqlSugar;
namespace CoreCms.Net.Repository
{
/// <summary>
/// 微信支付平台证书 接口实现
/// </summary>
public class CoreCmsWeChatPayPlatformCertificateRepository : BaseRepository<CoreCmsWeChatPayPlatformCertificate>, ICoreCmsWeChatPayPlatformCertificateRepository
{
private readonly IUnitOfWork _unitOfWork;
public CoreCmsWeChatPayPlatformCertificateRepository(IUnitOfWork unitOfWork) : base(unitOfWork)
{
_unitOfWork = unitOfWork;
}
#region ==========================================================
/// <summary>
/// 重写异步插入方法
/// </summary>
/// <param name="entity">实体数据</param>
/// <returns></returns>
public async Task<AdminUiCallBack> InsertAsync(CoreCmsWeChatPayPlatformCertificate entity)
{
var jm = new AdminUiCallBack();
var bl = await DbClient.Insertable(entity).ExecuteReturnIdentityAsync() > 0;
jm.code = bl ? 0 : 1;
jm.msg = bl ? GlobalConstVars.CreateSuccess : GlobalConstVars.CreateFailure;
return jm;
}
/// <summary>
/// 重写异步更新方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> UpdateAsync(CoreCmsWeChatPayPlatformCertificate entity)
{
var jm = new AdminUiCallBack();
var oldModel = await DbClient.Queryable<CoreCmsWeChatPayPlatformCertificate>().In(entity.id).SingleAsync();
if (oldModel == null)
{
jm.msg = "不存在此信息";
return jm;
}
//事物处理过程开始
oldModel.id = entity.id;
oldModel.algorithmType = entity.algorithmType;
oldModel.certificate = entity.certificate;
oldModel.effectiveTime = entity.effectiveTime;
oldModel.expireTime = entity.expireTime;
oldModel.serialNumber = entity.serialNumber;
oldModel.merchantId = entity.merchantId;
oldModel.createTime = entity.createTime;
oldModel.updataTime = entity.updataTime;
//事物处理过程结束
var bl = await DbClient.Updateable(oldModel).ExecuteCommandHasChangeAsync();
jm.code = bl ? 0 : 1;
jm.msg = bl ? GlobalConstVars.EditSuccess : GlobalConstVars.EditFailure;
return jm;
}
/// <summary>
/// 重写异步更新方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsWeChatPayPlatformCertificate> entity)
{
var jm = new AdminUiCallBack();
var bl = await DbClient.Updateable(entity).ExecuteCommandHasChangeAsync();
jm.code = bl ? 0 : 1;
jm.msg = bl ? GlobalConstVars.EditSuccess : GlobalConstVars.EditFailure;
return jm;
}
/// <summary>
/// 重写删除指定ID的数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> DeleteByIdAsync(object id)
{
var jm = new AdminUiCallBack();
var bl = await DbClient.Deleteable<CoreCmsWeChatPayPlatformCertificate>(id).ExecuteCommandHasChangeAsync();
jm.code = bl ? 0 : 1;
jm.msg = bl ? GlobalConstVars.DeleteSuccess : GlobalConstVars.DeleteFailure;
return jm;
}
/// <summary>
/// 重写删除指定ID集合的数据(批量删除)
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
{
var jm = new AdminUiCallBack();
var bl = await DbClient.Deleteable<CoreCmsWeChatPayPlatformCertificate>().In(ids).ExecuteCommandHasChangeAsync();
jm.code = bl ? 0 : 1;
jm.msg = bl ? GlobalConstVars.DeleteSuccess : GlobalConstVars.DeleteFailure;
return jm;
}
#endregion ==========================================================
#region ==========================================================
/// <summary>
/// 获取缓存的所有数据
/// </summary>
/// <returns></returns>
public async Task<List<CoreCmsWeChatPayPlatformCertificate>> GetCaChe()
{
var list = await DbClient.Queryable<CoreCmsWeChatPayPlatformCertificate>().With(SqlWith.NoLock).WithCache().ToListAsync();
return list;
}
#endregion ==========================================================
#region
/// <summary>
/// 重写根据条件查询分页数据
/// </summary>
/// <param name="predicate">判断集合</param>
/// <param name="orderByType">排序方式</param>
/// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param>
/// <param name="orderByExpression"></param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <returns></returns>
public async Task<IPageList<CoreCmsWeChatPayPlatformCertificate>> QueryPageAsync(Expression<Func<CoreCmsWeChatPayPlatformCertificate, bool>> predicate,
Expression<Func<CoreCmsWeChatPayPlatformCertificate, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false)
{
RefAsync<int> totalCount = 0;
List<CoreCmsWeChatPayPlatformCertificate> page;
if (blUseNoLock)
{
page = await DbClient.Queryable<CoreCmsWeChatPayPlatformCertificate>()
.OrderByIF(orderByExpression != null, orderByExpression, orderByType)
.WhereIF(predicate != null, predicate).Select(p => new CoreCmsWeChatPayPlatformCertificate
{
id = p.id,
algorithmType = p.algorithmType,
certificate = p.certificate,
effectiveTime = p.effectiveTime,
expireTime = p.expireTime,
serialNumber = p.serialNumber,
merchantId = p.merchantId,
createTime = p.createTime,
updataTime = p.updataTime,
}).With(SqlWith.NoLock).ToPageListAsync(pageIndex, pageSize, totalCount);
}
else
{
page = await DbClient.Queryable<CoreCmsWeChatPayPlatformCertificate>()
.OrderByIF(orderByExpression != null, orderByExpression, orderByType)
.WhereIF(predicate != null, predicate).Select(p => new CoreCmsWeChatPayPlatformCertificate
{
id = p.id,
algorithmType = p.algorithmType,
certificate = p.certificate,
effectiveTime = p.effectiveTime,
expireTime = p.expireTime,
serialNumber = p.serialNumber,
merchantId = p.merchantId,
createTime = p.createTime,
updataTime = p.updataTime,
}).ToPageListAsync(pageIndex, pageSize, totalCount);
}
var list = new PageList<CoreCmsWeChatPayPlatformCertificate>(page, pageIndex, pageSize, totalCount);
return list;
}
#endregion
}
}

View File

@@ -1,9 +1,9 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2023/4/22 23:40:15
* Description: 暂无
***********************************************************************/
@@ -29,12 +29,13 @@ namespace CoreCms.Net.Repository
public class WeChatPayConfigRepository : BaseRepository<CoreCmsWeChatPayConfig>, IWeChatPayConfigRepository
{
private readonly IUnitOfWork _unitOfWork;
public WeChatPayConfigRepository(IUnitOfWork unitOfWork) : base(unitOfWork)
{
_unitOfWork = unitOfWork;
}
#region ==========================================================
#region ==========================================================
/// <summary>
/// 重写异步插入方法
@@ -64,11 +65,11 @@ namespace CoreCms.Net.Repository
var oldModel = await DbClient.Queryable<CoreCmsWeChatPayConfig>().In(entity.id).SingleAsync();
if (oldModel == null)
{
jm.msg = "不存在此信息";
return jm;
jm.msg = "不存在此信息";
return jm;
}
//事物处理过程开始
oldModel.id = entity.id;
//oldModel.id = entity.id;
oldModel.appId = entity.appId;
oldModel.mchId = entity.mchId;
oldModel.apiKey = entity.apiKey;
@@ -83,7 +84,14 @@ namespace CoreCms.Net.Repository
oldModel.isEnable = entity.isEnable;
oldModel.isDefault = entity.isDefault;
oldModel.appType = entity.appType;
oldModel.payType = entity.payType;
oldModel.certificateSerialNumber = entity.certificateSerialNumber;
oldModel.certificatePrivateKey = entity.certificatePrivateKey;
oldModel.platformSerialNumber = entity.platformSerialNumber;
oldModel.platformPublicKeyId = entity.platformPublicKeyId;
oldModel.platformPublicKey = entity.platformPublicKey;
oldModel.transferBillsUrl = entity.transferBillsUrl;
//事物处理过程结束
var bl = await DbClient.Updateable(oldModel).ExecuteCommandHasChangeAsync();
jm.code = bl ? 0 : 1;
@@ -140,9 +148,9 @@ namespace CoreCms.Net.Repository
return jm;
}
#endregion
#endregion ==========================================================
#region ==========================================================
#region ==========================================================
/// <summary>
/// 获取缓存的所有数据
@@ -150,14 +158,14 @@ namespace CoreCms.Net.Repository
/// <returns></returns>
public async Task<List<CoreCmsWeChatPayConfig>> GetCaChe()
{
var list = await DbClient.Queryable<CoreCmsWeChatPayConfig>().With(SqlWith.NoLock).WithCache().ToListAsync();
var list = await DbClient.Queryable<CoreCmsWeChatPayConfig>().With(SqlWith.NoLock).WithCache().ToListAsync();
return list;
}
#endregion
#endregion ==========================================================
#region
/// <summary>
/// 重写根据条件查询分页数据
/// </summary>
@@ -180,22 +188,28 @@ namespace CoreCms.Net.Repository
.OrderByIF(orderByExpression != null, orderByExpression, orderByType)
.WhereIF(predicate != null, predicate).Select(p => new CoreCmsWeChatPayConfig
{
id = p.id,
appId = p.appId,
mchId = p.mchId,
apiKey = p.apiKey,
apiV3Key = p.apiV3Key,
certificate = p.certificate,
rsaPublicKey = p.rsaPublicKey,
subAppId = p.subAppId,
subMchId = p.subMchId,
notifyUrl = p.notifyUrl,
refundUrl = p.refundUrl,
jumpUrl = p.jumpUrl,
isEnable = p.isEnable,
isDefault = p.isDefault,
appType = p.appType,
id = p.id,
appId = p.appId,
mchId = p.mchId,
apiKey = p.apiKey,
apiV3Key = p.apiV3Key,
certificate = p.certificate,
rsaPublicKey = p.rsaPublicKey,
subAppId = p.subAppId,
subMchId = p.subMchId,
notifyUrl = p.notifyUrl,
refundUrl = p.refundUrl,
jumpUrl = p.jumpUrl,
isEnable = p.isEnable,
isDefault = p.isDefault,
appType = p.appType,
payType = p.payType,
certificateSerialNumber = p.certificateSerialNumber,
certificatePrivateKey = p.certificatePrivateKey,
platformSerialNumber = p.platformSerialNumber,
platformPublicKey = p.platformPublicKey,
platformPublicKeyId = p.platformPublicKeyId,
transferBillsUrl = p.transferBillsUrl
}).With(SqlWith.NoLock).ToPageListAsync(pageIndex, pageSize, totalCount);
}
else
@@ -204,29 +218,33 @@ namespace CoreCms.Net.Repository
.OrderByIF(orderByExpression != null, orderByExpression, orderByType)
.WhereIF(predicate != null, predicate).Select(p => new CoreCmsWeChatPayConfig
{
id = p.id,
appId = p.appId,
mchId = p.mchId,
apiKey = p.apiKey,
apiV3Key = p.apiV3Key,
certificate = p.certificate,
rsaPublicKey = p.rsaPublicKey,
subAppId = p.subAppId,
subMchId = p.subMchId,
notifyUrl = p.notifyUrl,
refundUrl = p.refundUrl,
jumpUrl = p.jumpUrl,
isEnable = p.isEnable,
isDefault = p.isDefault,
appType = p.appType,
id = p.id,
appId = p.appId,
mchId = p.mchId,
apiKey = p.apiKey,
apiV3Key = p.apiV3Key,
certificate = p.certificate,
rsaPublicKey = p.rsaPublicKey,
subAppId = p.subAppId,
subMchId = p.subMchId,
notifyUrl = p.notifyUrl,
refundUrl = p.refundUrl,
jumpUrl = p.jumpUrl,
isEnable = p.isEnable,
isDefault = p.isDefault,
appType = p.appType,
certificateSerialNumber = p.certificateSerialNumber,
certificatePrivateKey = p.certificatePrivateKey,
platformSerialNumber = p.platformSerialNumber,
platformPublicKey = p.platformPublicKey,
platformPublicKeyId = p.platformPublicKeyId,
transferBillsUrl = p.transferBillsUrl
}).ToPageListAsync(pageIndex, pageSize, totalCount);
}
var list = new PageList<CoreCmsWeChatPayConfig>(page, pageIndex, pageSize, totalCount);
return list;
}
#endregion
#endregion
}
}
}

View File

@@ -0,0 +1,195 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2025/7/28 23:08:04
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Caching.Manual;
using CoreCms.Net.Configuration;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.Model.ViewModels.UI;
using SqlSugar;
namespace CoreCms.Net.Repository
{
/// <summary>
/// 用户提现使用商家转账微信回调通知 接口实现
/// </summary>
public class CoreCmsUserTocashWeChatNotifyRepository : BaseRepository<CoreCmsUserTocashWeChatNotify>, ICoreCmsUserTocashWeChatNotifyRepository
{
private readonly IUnitOfWork _unitOfWork;
public CoreCmsUserTocashWeChatNotifyRepository(IUnitOfWork unitOfWork) : base(unitOfWork)
{
_unitOfWork = unitOfWork;
}
#region ==========================================================
/// <summary>
/// 重写异步插入方法
/// </summary>
/// <param name="entity">实体数据</param>
/// <returns></returns>
public async Task<AdminUiCallBack> InsertAsync(CoreCmsUserTocashWeChatNotify entity)
{
var jm = new AdminUiCallBack();
var bl = await DbClient.Insertable(entity).ExecuteReturnIdentityAsync() > 0;
jm.code = bl ? 0 : 1;
jm.msg = bl ? GlobalConstVars.CreateSuccess : GlobalConstVars.CreateFailure;
return jm;
}
/// <summary>
/// 重写异步更新方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> UpdateAsync(CoreCmsUserTocashWeChatNotify entity)
{
var jm = new AdminUiCallBack();
var oldModel = await DbClient.Queryable<CoreCmsUserTocashWeChatNotify>().In(entity.id).SingleAsync();
if (oldModel == null)
{
jm.msg = "不存在此信息";
return jm;
}
//事物处理过程开始
oldModel.id = entity.id;
oldModel.callBackId = entity.callBackId;
oldModel.create_time = entity.create_time;
oldModel.resource_type = entity.resource_type;
oldModel.event_type = entity.event_type;
oldModel.summary = entity.summary;
oldModel.resource = entity.resource;
oldModel.createTime = entity.createTime;
//事物处理过程结束
var bl = await DbClient.Updateable(oldModel).ExecuteCommandHasChangeAsync();
jm.code = bl ? 0 : 1;
jm.msg = bl ? GlobalConstVars.EditSuccess : GlobalConstVars.EditFailure;
return jm;
}
/// <summary>
/// 重写异步更新方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsUserTocashWeChatNotify> entity)
{
var jm = new AdminUiCallBack();
var bl = await DbClient.Updateable(entity).ExecuteCommandHasChangeAsync();
jm.code = bl ? 0 : 1;
jm.msg = bl ? GlobalConstVars.EditSuccess : GlobalConstVars.EditFailure;
return jm;
}
/// <summary>
/// 重写删除指定ID的数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> DeleteByIdAsync(object id)
{
var jm = new AdminUiCallBack();
var bl = await DbClient.Deleteable<CoreCmsUserTocashWeChatNotify>(id).ExecuteCommandHasChangeAsync();
jm.code = bl ? 0 : 1;
jm.msg = bl ? GlobalConstVars.DeleteSuccess : GlobalConstVars.DeleteFailure;
return jm;
}
/// <summary>
/// 重写删除指定ID集合的数据(批量删除)
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
{
var jm = new AdminUiCallBack();
var bl = await DbClient.Deleteable<CoreCmsUserTocashWeChatNotify>().In(ids).ExecuteCommandHasChangeAsync();
jm.code = bl ? 0 : 1;
jm.msg = bl ? GlobalConstVars.DeleteSuccess : GlobalConstVars.DeleteFailure;
return jm;
}
#endregion ==========================================================
#region
/// <summary>
/// 重写根据条件查询分页数据
/// </summary>
/// <param name="predicate">判断集合</param>
/// <param name="orderByType">排序方式</param>
/// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param>
/// <param name="orderByExpression"></param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <returns></returns>
public async Task<IPageList<CoreCmsUserTocashWeChatNotify>> QueryPageAsync(Expression<Func<CoreCmsUserTocashWeChatNotify, bool>> predicate,
Expression<Func<CoreCmsUserTocashWeChatNotify, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false)
{
RefAsync<int> totalCount = 0;
List<CoreCmsUserTocashWeChatNotify> page;
if (blUseNoLock)
{
page = await DbClient.Queryable<CoreCmsUserTocashWeChatNotify>()
.OrderByIF(orderByExpression != null, orderByExpression, orderByType)
.WhereIF(predicate != null, predicate).Select(p => new CoreCmsUserTocashWeChatNotify
{
id = p.id,
callBackId = p.callBackId,
create_time = p.create_time,
resource_type = p.resource_type,
event_type = p.event_type,
summary = p.summary,
resource = p.resource,
createTime = p.createTime,
}).With(SqlWith.NoLock).ToPageListAsync(pageIndex, pageSize, totalCount);
}
else
{
page = await DbClient.Queryable<CoreCmsUserTocashWeChatNotify>()
.OrderByIF(orderByExpression != null, orderByExpression, orderByType)
.WhereIF(predicate != null, predicate).Select(p => new CoreCmsUserTocashWeChatNotify
{
id = p.id,
callBackId = p.callBackId,
create_time = p.create_time,
resource_type = p.resource_type,
event_type = p.event_type,
summary = p.summary,
resource = p.resource,
createTime = p.createTime,
}).ToPageListAsync(pageIndex, pageSize, totalCount);
}
var list = new PageList<CoreCmsUserTocashWeChatNotify>(page, pageIndex, pageSize, totalCount);
return list;
}
#endregion
}
}

View File

@@ -0,0 +1,201 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2025/7/23 16:37:18
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Caching.Manual;
using CoreCms.Net.Configuration;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.Model.ViewModels.UI;
using SqlSugar;
namespace CoreCms.Net.Repository
{
/// <summary>
/// 用户提现使用商家转账回调记录 接口实现
/// </summary>
public class CoreCmsUserTocashWeChatResponseRepository : BaseRepository<CoreCmsUserTocashWeChatResponse>, ICoreCmsUserTocashWeChatResponseRepository
{
private readonly IUnitOfWork _unitOfWork;
public CoreCmsUserTocashWeChatResponseRepository(IUnitOfWork unitOfWork) : base(unitOfWork)
{
_unitOfWork = unitOfWork;
}
#region ==========================================================
/// <summary>
/// 重写异步插入方法
/// </summary>
/// <param name="entity">实体数据</param>
/// <returns></returns>
public async Task<AdminUiCallBack> InsertAsync(CoreCmsUserTocashWeChatResponse entity)
{
var jm = new AdminUiCallBack();
var bl = await DbClient.Insertable(entity).ExecuteReturnIdentityAsync() > 0;
jm.code = bl ? 0 : 1;
jm.msg = bl ? GlobalConstVars.CreateSuccess : GlobalConstVars.CreateFailure;
return jm;
}
/// <summary>
/// 重写异步更新方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> UpdateAsync(CoreCmsUserTocashWeChatResponse entity)
{
var jm = new AdminUiCallBack();
var oldModel = await DbClient.Queryable<CoreCmsUserTocashWeChatResponse>().In(entity.id).SingleAsync();
if (oldModel == null)
{
jm.msg = "不存在此信息";
return jm;
}
//事物处理过程开始
oldModel.id = entity.id;
oldModel.out_bill_no = entity.out_bill_no;
oldModel.transfer_bill_no = entity.transfer_bill_no;
oldModel.create_time = entity.create_time;
oldModel.state = entity.state;
oldModel.package_info = entity.package_info;
oldModel.code = entity.code;
oldModel.message = entity.message;
oldModel.detail = entity.detail;
oldModel.createTime = entity.createTime;
//事物处理过程结束
var bl = await DbClient.Updateable(oldModel).ExecuteCommandHasChangeAsync();
jm.code = bl ? 0 : 1;
jm.msg = bl ? GlobalConstVars.EditSuccess : GlobalConstVars.EditFailure;
return jm;
}
/// <summary>
/// 重写异步更新方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsUserTocashWeChatResponse> entity)
{
var jm = new AdminUiCallBack();
var bl = await DbClient.Updateable(entity).ExecuteCommandHasChangeAsync();
jm.code = bl ? 0 : 1;
jm.msg = bl ? GlobalConstVars.EditSuccess : GlobalConstVars.EditFailure;
return jm;
}
/// <summary>
/// 重写删除指定ID的数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> DeleteByIdAsync(object id)
{
var jm = new AdminUiCallBack();
var bl = await DbClient.Deleteable<CoreCmsUserTocashWeChatResponse>(id).ExecuteCommandHasChangeAsync();
jm.code = bl ? 0 : 1;
jm.msg = bl ? GlobalConstVars.DeleteSuccess : GlobalConstVars.DeleteFailure;
return jm;
}
/// <summary>
/// 重写删除指定ID集合的数据(批量删除)
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
{
var jm = new AdminUiCallBack();
var bl = await DbClient.Deleteable<CoreCmsUserTocashWeChatResponse>().In(ids).ExecuteCommandHasChangeAsync();
jm.code = bl ? 0 : 1;
jm.msg = bl ? GlobalConstVars.DeleteSuccess : GlobalConstVars.DeleteFailure;
return jm;
}
#endregion ==========================================================
#region
/// <summary>
/// 重写根据条件查询分页数据
/// </summary>
/// <param name="predicate">判断集合</param>
/// <param name="orderByType">排序方式</param>
/// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param>
/// <param name="orderByExpression"></param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <returns></returns>
public async Task<IPageList<CoreCmsUserTocashWeChatResponse>> QueryPageAsync(Expression<Func<CoreCmsUserTocashWeChatResponse, bool>> predicate,
Expression<Func<CoreCmsUserTocashWeChatResponse, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false)
{
RefAsync<int> totalCount = 0;
List<CoreCmsUserTocashWeChatResponse> page;
if (blUseNoLock)
{
page = await DbClient.Queryable<CoreCmsUserTocashWeChatResponse>()
.OrderByIF(orderByExpression != null, orderByExpression, orderByType)
.WhereIF(predicate != null, predicate).Select(p => new CoreCmsUserTocashWeChatResponse
{
id = p.id,
out_bill_no = p.out_bill_no,
transfer_bill_no = p.transfer_bill_no,
create_time = p.create_time,
state = p.state,
package_info = p.package_info,
code = p.code,
message = p.message,
detail = p.detail,
createTime = p.createTime,
}).With(SqlWith.NoLock).ToPageListAsync(pageIndex, pageSize, totalCount);
}
else
{
page = await DbClient.Queryable<CoreCmsUserTocashWeChatResponse>()
.OrderByIF(orderByExpression != null, orderByExpression, orderByType)
.WhereIF(predicate != null, predicate).Select(p => new CoreCmsUserTocashWeChatResponse
{
id = p.id,
out_bill_no = p.out_bill_no,
transfer_bill_no = p.transfer_bill_no,
create_time = p.create_time,
state = p.state,
package_info = p.package_info,
code = p.code,
message = p.message,
detail = p.detail,
createTime = p.createTime,
}).ToPageListAsync(pageIndex, pageSize, totalCount);
}
var list = new PageList<CoreCmsUserTocashWeChatResponse>(page, pageIndex, pageSize, totalCount);
return list;
}
#endregion
}
}

View File

@@ -16,6 +16,7 @@
<PackageReference Include="Qiniu" Version="8.7.0" />
<PackageReference Include="QRCoder" Version="1.6.0" />
<PackageReference Include="SixLabors.ImageSharp.Web" Version="3.1.3" />
<PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="3.13.0" />
<PackageReference Include="System.Data.SqlClient" Version="4.9.0" />
<PackageReference Include="System.Drawing.Common" Version="9.0.0" />
<PackageReference Include="Tencent.QCloud.Cos.Sdk" Version="5.4.40" />

View File

@@ -0,0 +1,129 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2025/7/21 20:36:56
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using SqlSugar;
namespace CoreCms.Net.Services
{
/// <summary>
/// 微信支付平台证书 接口实现
/// </summary>
public class CoreCmsWeChatPayPlatformCertificateServices : BaseServices<CoreCmsWeChatPayPlatformCertificate>, ICoreCmsWeChatPayPlatformCertificateServices
{
private readonly ICoreCmsWeChatPayPlatformCertificateRepository _dal;
private readonly IUnitOfWork _unitOfWork;
public CoreCmsWeChatPayPlatformCertificateServices(IUnitOfWork unitOfWork, ICoreCmsWeChatPayPlatformCertificateRepository dal)
{
this._dal = dal;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
}
#region ==========================================================
/// <summary>
/// 重写异步插入方法
/// </summary>
/// <param name="entity">实体数据</param>
/// <returns></returns>
public async Task<AdminUiCallBack> InsertAsync(CoreCmsWeChatPayPlatformCertificate entity)
{
return await _dal.InsertAsync(entity);
}
/// <summary>
/// 重写异步更新方法方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> UpdateAsync(CoreCmsWeChatPayPlatformCertificate entity)
{
return await _dal.UpdateAsync(entity);
}
/// <summary>
/// 重写异步更新方法方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsWeChatPayPlatformCertificate> entity)
{
return await _dal.UpdateAsync(entity);
}
/// <summary>
/// 重写删除指定ID的数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> DeleteByIdAsync(object id)
{
return await _dal.DeleteByIdAsync(id);
}
/// <summary>
/// 重写删除指定ID集合的数据(批量删除)
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
{
return await _dal.DeleteByIdsAsync(ids);
}
#endregion ==========================================================
#region ==========================================================
/// <summary>
/// 获取缓存的所有数据
/// </summary>
/// <returns></returns>
public async Task<List<CoreCmsWeChatPayPlatformCertificate>> GetCaChe()
{
return await _dal.GetCaChe();
}
#endregion ==========================================================
#region
/// <summary>
/// 重写根据条件查询分页数据
/// </summary>
/// <param name="predicate">判断集合</param>
/// <param name="orderByType">排序方式</param>
/// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param>
/// <param name="orderByExpression"></param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <returns></returns>
public async Task<IPageList<CoreCmsWeChatPayPlatformCertificate>> QueryPageAsync(Expression<Func<CoreCmsWeChatPayPlatformCertificate, bool>> predicate,
Expression<Func<CoreCmsWeChatPayPlatformCertificate, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false)
{
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
}
#endregion
}
}

View File

@@ -8,11 +8,6 @@
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Caching.AccressToken;
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
@@ -31,14 +26,27 @@ using Essensoft.Paylink.WeChatPay.V2;
using Essensoft.Paylink.WeChatPay.V2.Request;
using Essensoft.Paylink.WeChatPay.V3.Domain;
using Essensoft.Paylink.WeChatPay.V3.Request;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using SKIT.FlurlHttpClient.Wechat.Api.Models;
using SKIT.FlurlHttpClient.Wechat.TenpayV3;
using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models;
using SKIT.FlurlHttpClient.Wechat.TenpayV3.Settings;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Net.Http;
using System.Threading.Tasks;
using Yitter.IdGenerator;
using Microsoft.AspNetCore.Hosting;
using NLog;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.ECFinderLiveGetFinderLiveNoticeRecordListResponse.Types;
namespace CoreCms.Net.Services
@@ -60,11 +68,12 @@ namespace CoreCms.Net.Services
private readonly IWebHostEnvironment _webHostEnvironment;
private readonly IWeChatPayConfigServices _weChatPayConfigServices;
private readonly IWechatTenpayClientFactory _wechatTenpayClientFactory;
private readonly ICoreCmsUserTocashWeChatResponseServices _userTocashWeChatResponseServices;
public CoreCmsUserTocashServices(IUnitOfWork unitOfWork, ICoreCmsUserTocashRepository dal,
IServiceProvider serviceProvider, ICoreCmsUserServices userServices, ICoreCmsUserBalanceServices userBalanceServices, ICoreCmsUserWeChatInfoServices weChatInfoServices, IWeChatPayClient v2Client, IHttpContextAccessor httpContextAccessor, IWebHostEnvironment webHostEnvironment, Essensoft.Paylink.WeChatPay.V3.IWeChatPayClient v3Client, IWeChatPayConfigServices weChatPayConfigServices)
IServiceProvider serviceProvider, ICoreCmsUserServices userServices, ICoreCmsUserBalanceServices userBalanceServices, ICoreCmsUserWeChatInfoServices weChatInfoServices, IWeChatPayClient v2Client, IHttpContextAccessor httpContextAccessor, IWebHostEnvironment webHostEnvironment, Essensoft.Paylink.WeChatPay.V3.IWeChatPayClient v3Client, IWeChatPayConfigServices weChatPayConfigServices, IWechatTenpayClientFactory wechatTenpayClientFactory, ICoreCmsUserTocashWeChatResponseServices userTocashWeChatResponseServices)
{
this._dal = dal;
base.BaseDal = dal;
@@ -78,6 +87,8 @@ namespace CoreCms.Net.Services
_webHostEnvironment = webHostEnvironment;
_v3Client = v3Client;
_weChatPayConfigServices = weChatPayConfigServices;
_wechatTenpayClientFactory = wechatTenpayClientFactory;
_userTocashWeChatResponseServices = userTocashWeChatResponseServices;
}
/// <summary>
@@ -508,6 +519,122 @@ namespace CoreCms.Net.Services
break;
}
case (int)GlobalEnumVars.UserTocashType.:
{
var user = await _userServices.QueryByIdAsync(info.userId);
if (user == null)
{
jm.msg = "用户信息获取失败";
return jm;
}
var weChatUserInfo = await _weChatInfoServices.QueryByClauseAsync(p => p.userId == info.userId);
if (weChatUserInfo == null)
{
jm.msg = "微信用户数据获取失败";
return jm;
}
var config = await _weChatPayConfigServices.QueryByClauseAsync(p => p.isDefault == true && p.isEnable == true);
if (config == null)
{
jm.msg = "支付配置信息获取失败";
return jm;
}
var client = await _wechatTenpayClientFactory.Create(config.mchId);
var request = new CreateFundAppMerchantTransferBillRequest();
request.WechatpaySerialNumber = config.payType switch
{
(int)GlobalEnumVars.WeChatPayIdentityVerificationMethods.PlatformCertificate => config
.platformSerialNumber,
(int)GlobalEnumVars.WeChatPayIdentityVerificationMethods.PlatformPublicKey => config
.platformPublicKeyId,
_ => request.WechatpaySerialNumber
};
request.AppId = config.appId;
request.OutBillNumber = "usertocash" + info.id;
request.TransferSceneId = "1000";
request.OpenId = weChatUserInfo.openid;
//按分计算
request.TransferAmount = Convert.ToInt32(info.money * 100);
if (request.TransferAmount > 30)
{
request.UserName = info.accountName;
}
request.TransferRemark = "客户推广业务佣金提现处理";
request.NotifyUrl = config.transferBillsUrl;
request.TransferSceneReportInfoList = new List<CreateFundAppMerchantTransferBillRequest.Types.TransferSceneReportInfo>()
{
new CreateFundAppMerchantTransferBillRequest.Types.TransferSceneReportInfo()
{
InfoType = "活动名称",
InfoContent = "分销佣金提现",
},
new CreateFundAppMerchantTransferBillRequest.Types.TransferSceneReportInfo()
{
InfoType = "奖励说明",
InfoContent = "用户分销佣金提现申请",
}
};
var response = await client.ExecuteCreateFundAppMerchantTransferBillAsync(request);
if (response.IsSuccessful())
{
status = (int)GlobalEnumVars.UserTocashStatus.;
var message = JsonConvert.SerializeObject(new
{
response
});
var bl = await _dal.UpdateAsync(p => new CoreCmsUserTocash() { status = status, updateTime = DateTime.Now, message = message, type = type }, p => p.id == id && (p.status == (int)GlobalEnumVars.UserTocashStatus. || p.status == (int)GlobalEnumVars.UserTocashStatus.));
NLogUtil.WriteAll(LogLevel.Trace, LogType.Refund, "微信提现商家转账回调(成功)", JsonConvert.SerializeObject(new
{
response,
request
}));
var log = new CoreCmsUserTocashWeChatResponse();
log.out_bill_no = response.OutBillNumber;
log.transfer_bill_no = response.TransferBillNumber;
log.state = response.State;
log.create_time = response.CreateTime.DateTime;
log.package_info = response.PackageInfo;
log.message = response.FailReason;
log.createTime = DateTime.Now;
await _userTocashWeChatResponseServices.InsertAsync(log);
jm.status = bl;
jm.data = status;
}
else
{
status = (int)GlobalEnumVars.UserTocashStatus.;
var message = JsonConvert.SerializeObject(new
{
response
});
var bl = await _dal.UpdateAsync(p => new CoreCmsUserTocash() { status = status, updateTime = DateTime.Now, message = message, type = type }, p => p.id == id && (p.status == (int)GlobalEnumVars.UserTocashStatus. || p.status == (int)GlobalEnumVars.UserTocashStatus.));
NLogUtil.WriteAll(LogLevel.Trace, LogType.Refund, "微信提现商家转账回调(失败)", JsonConvert.SerializeObject(new
{
response,
request
}));
jm.status = bl;
jm.data = status;
}
break;
}
default:
jm.msg = "提现方式获取失败";
jm.status = false;

View File

@@ -0,0 +1,116 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2025/7/28 23:08:04
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using SqlSugar;
namespace CoreCms.Net.Services
{
/// <summary>
/// 用户提现使用商家转账微信回调通知 接口实现
/// </summary>
public class CoreCmsUserTocashWeChatNotifyServices : BaseServices<CoreCmsUserTocashWeChatNotify>, ICoreCmsUserTocashWeChatNotifyServices
{
private readonly ICoreCmsUserTocashWeChatNotifyRepository _dal;
private readonly IUnitOfWork _unitOfWork;
public CoreCmsUserTocashWeChatNotifyServices(IUnitOfWork unitOfWork, ICoreCmsUserTocashWeChatNotifyRepository dal)
{
this._dal = dal;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
}
#region ==========================================================
/// <summary>
/// 重写异步插入方法
/// </summary>
/// <param name="entity">实体数据</param>
/// <returns></returns>
public async Task<AdminUiCallBack> InsertAsync(CoreCmsUserTocashWeChatNotify entity)
{
return await _dal.InsertAsync(entity);
}
/// <summary>
/// 重写异步更新方法方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> UpdateAsync(CoreCmsUserTocashWeChatNotify entity)
{
return await _dal.UpdateAsync(entity);
}
/// <summary>
/// 重写异步更新方法方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsUserTocashWeChatNotify> entity)
{
return await _dal.UpdateAsync(entity);
}
/// <summary>
/// 重写删除指定ID的数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> DeleteByIdAsync(object id)
{
return await _dal.DeleteByIdAsync(id);
}
/// <summary>
/// 重写删除指定ID集合的数据(批量删除)
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
{
return await _dal.DeleteByIdsAsync(ids);
}
#endregion ==========================================================
#region
/// <summary>
/// 重写根据条件查询分页数据
/// </summary>
/// <param name="predicate">判断集合</param>
/// <param name="orderByType">排序方式</param>
/// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param>
/// <param name="orderByExpression"></param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <returns></returns>
public async Task<IPageList<CoreCmsUserTocashWeChatNotify>> QueryPageAsync(Expression<Func<CoreCmsUserTocashWeChatNotify, bool>> predicate,
Expression<Func<CoreCmsUserTocashWeChatNotify, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false)
{
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
}
#endregion
}
}

View File

@@ -0,0 +1,116 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2025/7/23 16:37:18
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using SqlSugar;
namespace CoreCms.Net.Services
{
/// <summary>
/// 用户提现使用商家转账回调记录 接口实现
/// </summary>
public class CoreCmsUserTocashWeChatResponseServices : BaseServices<CoreCmsUserTocashWeChatResponse>, ICoreCmsUserTocashWeChatResponseServices
{
private readonly ICoreCmsUserTocashWeChatResponseRepository _dal;
private readonly IUnitOfWork _unitOfWork;
public CoreCmsUserTocashWeChatResponseServices(IUnitOfWork unitOfWork, ICoreCmsUserTocashWeChatResponseRepository dal)
{
this._dal = dal;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
}
#region ==========================================================
/// <summary>
/// 重写异步插入方法
/// </summary>
/// <param name="entity">实体数据</param>
/// <returns></returns>
public async Task<AdminUiCallBack> InsertAsync(CoreCmsUserTocashWeChatResponse entity)
{
return await _dal.InsertAsync(entity);
}
/// <summary>
/// 重写异步更新方法方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> UpdateAsync(CoreCmsUserTocashWeChatResponse entity)
{
return await _dal.UpdateAsync(entity);
}
/// <summary>
/// 重写异步更新方法方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsUserTocashWeChatResponse> entity)
{
return await _dal.UpdateAsync(entity);
}
/// <summary>
/// 重写删除指定ID的数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> DeleteByIdAsync(object id)
{
return await _dal.DeleteByIdAsync(id);
}
/// <summary>
/// 重写删除指定ID集合的数据(批量删除)
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
{
return await _dal.DeleteByIdsAsync(ids);
}
#endregion ==========================================================
#region
/// <summary>
/// 重写根据条件查询分页数据
/// </summary>
/// <param name="predicate">判断集合</param>
/// <param name="orderByType">排序方式</param>
/// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param>
/// <param name="orderByExpression"></param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <returns></returns>
public async Task<IPageList<CoreCmsUserTocashWeChatResponse>> QueryPageAsync(Expression<Func<CoreCmsUserTocashWeChatResponse, bool>> predicate,
Expression<Func<CoreCmsUserTocashWeChatResponse, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false)
{
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
}
#endregion
}
}

View File

@@ -0,0 +1,79 @@
using System;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using Microsoft.Extensions.Options;
using SKIT.FlurlHttpClient.Wechat.TenpayV3;
namespace CoreCms.Net.Services
{
using SKIT.FlurlHttpClient.Wechat.TenpayV3.Settings;
/// <summary>
/// 微信支付链接管理器实现
/// </summary>
internal partial class WechatTenpayClientFactory : IWechatTenpayClientFactory
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly IWeChatPayConfigServices _weChatPayConfigServices;
private readonly ICoreCmsWeChatPayPlatformCertificateServices _weChatPayPlatformCertificateServices;
public WechatTenpayClientFactory(IHttpClientFactory httpClientFactory, IWeChatPayConfigServices weChatPayConfigServices, ICoreCmsWeChatPayPlatformCertificateServices weChatPayPlatformCertificateServices)
{
_httpClientFactory = httpClientFactory;
_weChatPayConfigServices = weChatPayConfigServices;
_weChatPayPlatformCertificateServices = weChatPayPlatformCertificateServices;
}
public async Task<WechatTenpayClient> Create(string merchantId)
{
var tenpayMerchantOptions = await _weChatPayConfigServices.QueryByClauseAsync(p => p.mchId == merchantId && p.isDefault == true && p.isEnable == true);
if (tenpayMerchantOptions == null)
{
throw new Exception("未在配置项中找到该 MerchantId 对应的微信商户号。");
}
var wechatTenpayClientOptions = new WechatTenpayClientOptions()
{
MerchantId = tenpayMerchantOptions.mchId,
MerchantV3Secret = tenpayMerchantOptions.apiV3Key,
MerchantCertificateSerialNumber = tenpayMerchantOptions.certificateSerialNumber,
MerchantCertificatePrivateKey = tenpayMerchantOptions.certificatePrivateKey,
AutoEncryptRequestSensitiveProperty = true,
AutoDecryptResponseSensitiveProperty = false,
};
// 基于平台证书的认证方式还需设置以下参数:
if (tenpayMerchantOptions.payType == (int)GlobalEnumVars.WeChatPayIdentityVerificationMethods.PlatformCertificate)
{
wechatTenpayClientOptions.PlatformAuthScheme = PlatformAuthScheme.Certificate;
var certificate = await _weChatPayPlatformCertificateServices.QueryByClauseAsync(p => p.merchantId == tenpayMerchantOptions.mchId);
if (certificate != null)
{
var entity = new CertificateEntry(certificate.algorithmType, certificate.serialNumber, certificate.certificate, certificate.effectiveTime, certificate.expireTime);
wechatTenpayClientOptions.PlatformCertificateManager.AddEntry(entity);
}
}
// 基于平台公钥的认证方式还需设置以下参数:
if (tenpayMerchantOptions.payType == (int)GlobalEnumVars.WeChatPayIdentityVerificationMethods.PlatformPublicKey)
{
wechatTenpayClientOptions.PlatformAuthScheme = PlatformAuthScheme.PublicKey;
wechatTenpayClientOptions.PlatformPublicKeyManager.AddEntry(
new PublicKeyEntry(
PublicKeyEntry.ALGORITHM_TYPE_RSA,
tenpayMerchantOptions.platformPublicKeyId!,
tenpayMerchantOptions.platformPublicKey!)
);
}
var wechatTenpayClient = WechatTenpayClientBuilder.Create(wechatTenpayClientOptions).Build();
return wechatTenpayClient;
}
}
}

View File

@@ -0,0 +1,137 @@
/***********************************************************************
* 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
{
/// <summary>
/// 定时更新微信支付平台证书
/// </summary>
public class AutoRefreshPlatformCertificateJob
{
private readonly IWeChatPayConfigServices _weChatPayConfigServices;
private readonly IWechatTenpayClientFactory _wechatTenpayClientFactory;
private readonly ICoreCmsWeChatPayPlatformCertificateServices _weChatPayPlatformCertificateServices;
private readonly ISysTaskLogServices _taskLogServices;
/// <summary>
/// 构造函数
/// </summary>
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);
}
}
}
}
}
}

View File

@@ -70,6 +70,9 @@ namespace CoreCms.Net.Task
//自动取消服务器订单任务
RecurringJob.AddOrUpdate<AutoCancelServiceOrderJob>("AutoCancelServiceOrderJob", s => s.Execute(), "0 0/5 * * * ? ", new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); // 每5分钟取消一次订单
//定时更新微信支付平台证书
RecurringJob.AddOrUpdate<AutoRefreshPlatformCertificateJob>("AutoRefreshPlatformCertificateJob", s => s.Execute(), "0 0 6 * * ? ", new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); // 每天凌晨6点执行首次可以自主进入定时任务页面手动执行一次
}

View File

@@ -10,6 +10,7 @@
<PackageReference Include="Microsoft.Extensions.Options" Version="9.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="3.6.0" />
<PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="3.13.0" />
</ItemGroup>
<ItemGroup>

View File

@@ -229,9 +229,11 @@ namespace CoreCms.Net.Web.Admin.Controllers
var jm = new AdminUiCallBack { code = 0 };
var weiChatPayTradeType = EnumHelper.EnumToList<WeiChatPayTradeType>();
var weChatPayIdentityVerificationMethods = EnumHelper.EnumToList<WeChatPayIdentityVerificationMethods>();
jm.data = new
{
weiChatPayTradeType
weiChatPayTradeType,
weChatPayIdentityVerificationMethods
};
return jm;
@@ -252,9 +254,12 @@ namespace CoreCms.Net.Web.Admin.Controllers
var jm = new AdminUiCallBack { code = 0 };
var weiChatPayTradeType = EnumHelper.EnumToList<WeiChatPayTradeType>();
var weChatPayIdentityVerificationMethods = EnumHelper.EnumToList<WeChatPayIdentityVerificationMethods>();
jm.data = new
{
weiChatPayTradeType
weiChatPayTradeType,
weChatPayIdentityVerificationMethods
};
return jm;
@@ -299,10 +304,13 @@ namespace CoreCms.Net.Web.Admin.Controllers
jm.code = 0;
var weiChatPayTradeType = EnumHelper.EnumToList<WeiChatPayTradeType>();
var weChatPayIdentityVerificationMethods = EnumHelper.EnumToList<WeChatPayIdentityVerificationMethods>();
jm.data = new
{
model,
weiChatPayTradeType
weiChatPayTradeType,
weChatPayIdentityVerificationMethods
};
return jm;

View File

@@ -1,128 +1,221 @@
<script type="text/html" template lay-done="layui.data.done(d);">
<div class="layui-form coreshop-form layui-form-pane" lay-filter="LAY-app-CoreCmsWeChatPayConfig-createForm" id="LAY-app-CoreCmsWeChatPayConfig-createForm">
<div class="layui-tab" lay-filter="test-handle" lay-allowclose="true">
<ul class="layui-tab-title">
<li class="layui-this" lay-id="11">基础设置</li>
<li lay-id="22">证书密钥配置</li>
</ul>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<div class="layui-form-item">
<label for="appType" class="layui-form-label layui-form-required">应用类型</label>
<div class="layui-input-inline layui-inline-5">
<select name="appType" lay-verify="required" placeholder="请输入应用类型" lay-reqText="请输入应用类型">
<option value="">请选择所属应用类型</option>
{{# layui.each(d.params.data.weiChatPayTradeType, function(index, item){ }}
<option value="{{ item.title }}">{{ item.description }}</option>
{{# }); }}
</select>
</div>
<label for="appId" class="layui-form-label layui-form-required">应用AppID</label>
<div class="layui-input-inline layui-inline-5">
<input name="appId" lay-verify="required" class="layui-input" placeholder="请输入应用号" lay-reqText="请输入应用号" />
</div>
<label for="mchId" class="layui-form-label layui-form-required">商户号</label>
<div class="layui-input-inline layui-inline-5">
<input name="mchId" lay-verify="required" class="layui-input" placeholder="请输入商户号" lay-reqText="请输入商户号" />
<div class="layui-form-item">
<label for="appType" class="layui-form-label layui-form-required">应用类型</label>
<div class="layui-input-inline layui-inline-5">
<select name="appType" lay-verify="required" placeholder="请输入应用类型" lay-reqText="请输入应用类型">
<option value="">请选择所属应用类型</option>
{{# layui.each(d.params.data.weiChatPayTradeType, function(index, item){ }}
<option value="{{ item.title }}">{{ item.description }}</option>
{{# }); }}
</select>
</div>
<label for="appId" class="layui-form-label layui-form-required">应用AppID</label>
<div class="layui-input-inline layui-inline-5">
<input name="appId" lay-verify="required" class="layui-input" placeholder="请输入应用号" lay-reqText="请输入应用号" />
</div>
<label for="mchId" class="layui-form-label layui-form-required">商户号</label>
<div class="layui-input-inline layui-inline-5">
<input name="mchId" lay-verify="required" class="layui-input" placeholder="请输入商户号" lay-reqText="请输入商户号" />
</div>
</div>
<div class="layui-form-item">
<label for="subAppId" class="layui-form-label">子商户应用号</label>
<div class="layui-input-inline layui-inline-4">
<input name="subAppId" class="layui-input" placeholder="请输入子商户应用号" lay-reqText="请输入子商户应用号" />
</div>
<div class="layui-form-mid">
目前仅调用服务商API时使用子商户的公众号移动应用AppId
</div>
</div>
<div class="layui-form-item">
<label for="subMchId" class="layui-form-label">子商户号</label>
<div class="layui-input-inline layui-inline-4">
<input name="subMchId" class="layui-input" placeholder="请输入子商户号" lay-reqText="请输入子商户号" />
</div>
<div class="layui-form-mid">
目前仅调用服务商API时使用子商户的商户号
</div>
</div>
<div class="layui-form-item">
<label for="notifyUrl" class="layui-form-label layui-form-required">支付回调通知</label>
<div class="layui-input-inline layui-inline-10">
<input name="notifyUrl" lay-verify="required" class="layui-input" placeholder="请输入支付回调通知" lay-reqText="请输入支付回调通知" value="https://api.pro.demo.coreshop.cn/Notify/WeChatPay/Unifiedorder" />
</div>
<div class="layui-form-mid">
webApi端接口地址+/Notify/WeChatPay/Unifiedorder
</div>
</div>
<div class="layui-form-item">
<label for="refundUrl" class="layui-form-label layui-form-required">退款回调</label>
<div class="layui-input-inline layui-inline-10">
<input name="refundUrl" lay-verify="required" class="layui-input" placeholder="请输入退款回调" lay-reqText="请输入退款回调" value="https://api.pro.demo.coreshop.cn/Notify/WeChatPay/Refund" />
</div>
<div class="layui-form-mid">
webApi端接口地址+/Notify/WeChatPay/Refund
</div>
</div>
<div class="layui-form-item">
<label for="refundUrl" class="layui-form-label layui-form-required">提现回调通知</label>
<div class="layui-input-inline layui-inline-10">
<input name="transferBillsUrl" lay-verify="required" class="layui-input" placeholder="请输入提现回调通知" lay-reqText="请输入提现回调通知" value="https://api.pro.demo.coreshop.cn/Notify/WeChatPay/TransferBillsCallBack" />
</div>
<div class="layui-form-mid">
webApi端接口地址+/Notify/WeChatPay/TransferBillsCallBack
</div>
</div>
<div class="layui-form-item">
<label for="jumpUrl" class="layui-form-label">跳转地址</label>
<div class="layui-input-inline layui-inline-8">
<input name="jumpUrl" class="layui-input" placeholder="请输入跳转地址" lay-reqText="请输入跳转地址" />
</div>
<div class="layui-form-mid">
H5PC端支付成功或者支付失败后跳转的查询支付状态的地址默认可不填写
</div>
</div>
<div class="layui-form-item">
<label for="isEnable" class="layui-form-label layui-form-required">是否开启</label>
<div class="layui-input-inline layui-inline-4">
<input type="checkbox" lay-filter="switch" name="isEnable" lay-skin="switch" lay-text="开启|关闭">
</div>
<label for="isDefault" class="layui-form-label layui-form-required">是否本类默认</label>
<div class="layui-input-inline layui-inline-4">
<input type="checkbox" lay-filter="switch" name="isDefault" lay-skin="switch" lay-text="开启|关闭">
</div>
</div>
</div>
<div class="layui-tab-item">
<div class="layui-form-item">
<label for="rsaPublicKey" class="layui-form-label">RSA公钥弃用</label>
<div class="layui-input-inline layui-inline-8">
<input name="rsaPublicKey" class="layui-input" placeholder="请输入RSA公钥" lay-reqText="请输入RSA公钥" />
</div>
<div class="layui-form-mid">
目前仅"企业付款到银行卡API"使用调用"获取RSA加密公钥API"即可获取
</div>
</div>
<div class="layui-form-item">
<label for="apiKey" class="layui-form-label layui-form-required">APIv2密钥</label>
<div class="layui-input-inline layui-inline-12">
<input name="apiKey" lay-verify="required" class="layui-input" placeholder="请输入API秘钥" lay-reqText="请输入API秘钥" />
</div>
<div class="layui-form-mid">
apiV2密钥
</div>
</div>
<div class="layui-form-item">
<label for="apiV3Key" class="layui-form-label">APIv3密钥</label>
<div class="layui-input-inline layui-inline-12">
<input name="apiV3Key" class="layui-input" placeholder="请输入APIv3密钥" lay-reqText="请输入APIv3密钥" />
</div>
<div class="layui-form-mid">
只有开启了商家付款到零钱的功能才需要录入APIv3密钥用于提现
</div>
</div>
<div class="layui-form-item">
<label for="certificateSerialNumber" class="layui-form-label layui-form-required">商户证书序列号</label>
<div class="layui-input-inline layui-inline-12">
<input name="certificateSerialNumber" lay-verify="required|verifycertificateSerialNumber" class="layui-input" lay-reqText="请输入商户证书序列号" placeholder="请输入商户证书序列号" />
</div>
<div class="layui-form-mid">
微信支付商户=> 账户中心=> API安全=> 商户API证书=> 管理证书中获取
</div>
</div>
<div class="layui-form-item layui-form-text">
<label for="certificate" class="layui-form-label layui-form-required">
商户证书文件apiclient_cert.p12内容请选择apiclient_cert.p12文件会自动上传获取base64内容不需要打开复制内容到这里
<button type="button" class="layui-btn layui-btn-xs layui-btn-danger" id="doUpload">
<i class="layui-icon">&#xe67c;</i>
</button>
</label>
<div class="layui-input-block">
<textarea name="certificate" id="certificateBox" lay-verify="required" placeholder="请选择【apiclient_cert.p12】文件" class="layui-textarea"></textarea>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label for="certificatePrivateKey" class="layui-form-label layui-form-required">商户证书文件apiclient_key.pem内容注意是直接复制文件内容进来</label>
<div class="layui-input-block">
<textarea name="certificatePrivateKey" id="certificatePrivateKey" placeholder="请复制商户证书文件内容" class="layui-textarea"></textarea>
</div>
<div class="layui-form-mid">
设置微信支付商户 API 证书私钥通常为 `apiclient_key.pem` 文件内容
</div>
</div>
<div class="layui-form-item">
<label for="payType" class="layui-form-label layui-form-required">高级模式</label>
<div class="layui-input-inline layui-inline-5">
<select name="payType" lay-verify="required" placeholder="请输入高级模式" lay-reqText="请输入高级模式">
<option value="">请选择高级模式</option>
{{# layui.each(d.params.data.weChatPayIdentityVerificationMethods, function(index, item){ }}
<option value="{{ item.value }}">{{ item.description }}</option>
{{# }); }}
</select>
</div>
<div class="layui-form-mid">
APIv3密钥模式下会用到目前主要是商家转账功能如果选择微信支付公钥模式下面平台公钥ID平台公钥内容必填
</div>
</div>
<div class="layui-form-item layui-form-text">
<label for="platformSerialNumber" class="layui-form-label">平台证书序列号</label>
<div class="layui-input-block">
<input name="platformSerialNumber" class="layui-input" lay-reqText="请输入平台证书序列号" placeholder="请输入平台证书序列号" />
</div>
<div class="layui-form-mid">
注意这是平台证书序列号不是商户证书序列号
</div>
</div>
<div class="layui-form-item layui-form-text">
<label for="platformPublicKeyId" class="layui-form-label">平台公钥ID</label>
<div class="layui-input-block">
<input name="platformPublicKeyId" lay-verify="required|verifyplatformPublicKeyId" class="layui-input" lay-reqText="请输入平台公钥ID" placeholder="请输入平台公钥ID" />
</div>
<div class="layui-form-mid">
微信支付商户=> 账户中心=> API安全=> 微信支付公钥 => 申请公钥中查看
</div>
</div>
<div class="layui-form-item layui-form-text">
<label for="platformPublicKey" class="layui-form-label">平台公钥内容直接复制pub_key.pem文件内容粘贴此处即可</label>
<div class="layui-input-block">
<textarea name="platformPublicKey" id="platformPublicKey" placeholder="请复制平台公钥内容" class="layui-textarea"></textarea>
</div>
<div class="layui-form-mid">
微信支付商户=> 账户中心=> API安全=> 微信支付公钥 => 申请公钥中下载
</div>
</div>
</div>
</div>
</div>
<div class="layui-form-item">
<label for="apiKey" class="layui-form-label layui-form-required">API秘钥</label>
<div class="layui-input-inline layui-inline-12">
<input name="apiKey" lay-verify="required" class="layui-input" placeholder="请输入API秘钥" lay-reqText="请输入API秘钥" />
</div>
<div class="layui-form-mid">
apiV2密钥
</div>
</div>
<div class="layui-form-item">
<label for="apiV3Key" class="layui-form-label">APIv3密钥</label>
<div class="layui-input-inline layui-inline-12">
<input name="apiV3Key" class="layui-input" placeholder="请输入APIv3密钥" lay-reqText="请输入APIv3密钥" />
</div>
<div class="layui-form-mid">
只有开启了商家付款到零钱的功能才需要录入APIv3密钥用于提现
</div>
</div>
<div class="layui-form-item layui-form-text">
<label for="certificate" class="layui-form-label layui-form-required">
微信支付商户p12证书请选择apiclient_cert.p12文件
<button type="button" class="layui-btn layui-btn-xs layui-btn-danger" id="doUpload">
<i class="layui-icon">&#xe67c;</i>
</button>
</label>
<div class="layui-input-block">
<textarea name="certificate" id="certificateBox" lay-verify="required" placeholder="请选择【apiclient_cert.p12】文件" class="layui-textarea"></textarea>
</div>
</div>
<div class="layui-form-item">
<label for="rsaPublicKey" class="layui-form-label">RSA公钥</label>
<div class="layui-input-inline layui-inline-8">
<input name="rsaPublicKey" class="layui-input" placeholder="请输入RSA公钥" lay-reqText="请输入RSA公钥" />
</div>
<div class="layui-form-mid">
目前仅"企业付款到银行卡API"使用调用"获取RSA加密公钥API"即可获取
</div>
</div>
<div class="layui-form-item">
<label for="subAppId" class="layui-form-label">子商户应用号</label>
<div class="layui-input-inline layui-inline-4">
<input name="subAppId" class="layui-input" placeholder="请输入子商户应用号" lay-reqText="请输入子商户应用号" />
</div>
<div class="layui-form-mid">
目前仅调用服务商API时使用子商户的公众号移动应用AppId
</div>
</div>
<div class="layui-form-item">
<label for="subMchId" class="layui-form-label">子商户号</label>
<div class="layui-input-inline layui-inline-4">
<input name="subMchId" class="layui-input" placeholder="请输入子商户号" lay-reqText="请输入子商户号" />
</div>
<div class="layui-form-mid">
目前仅调用服务商API时使用子商户的商户号
</div>
</div>
<div class="layui-form-item">
<label for="notifyUrl" class="layui-form-label layui-form-required">支付回调通知</label>
<div class="layui-input-inline layui-inline-8">
<input name="notifyUrl" lay-verify="required" class="layui-input" placeholder="请输入支付回调通知" lay-reqText="请输入支付回调通知" value="https://api.pro.demo.corecms.cn/Notify/WeChatPay/Unifiedorder" />
</div>
<div class="layui-form-mid">
webApi端接口地址+/Notify/WeChatPay/Unifiedorder
</div>
</div>
<div class="layui-form-item">
<label for="refundUrl" class="layui-form-label layui-form-required">退款回调</label>
<div class="layui-input-inline layui-inline-8">
<input name="refundUrl" lay-verify="required" class="layui-input" placeholder="请输入退款回调" lay-reqText="请输入退款回调" value="https://api.pro.demo.corecms.cn/Notify/WeChatPay/Refund" />
</div>
<div class="layui-form-mid">
webApi端接口地址+/Notify/WeChatPay/Refund
</div>
</div>
<div class="layui-form-item">
<label for="jumpUrl" class="layui-form-label">跳转地址</label>
<div class="layui-input-inline layui-inline-8">
<input name="jumpUrl" class="layui-input" placeholder="请输入跳转地址" lay-reqText="请输入跳转地址" />
</div>
<div class="layui-form-mid">
H5PC端支付成功或者支付失败后跳转的查询支付状态的地址默认可不填写
</div>
</div>
<div class="layui-form-item">
<label for="isEnable" class="layui-form-label layui-form-required">是否开启</label>
<div class="layui-input-inline layui-inline-4">
<input type="checkbox" lay-filter="switch" name="isEnable" lay-skin="switch" lay-text="开启|关闭">
</div>
<label for="isDefault" class="layui-form-label layui-form-required">是否本类默认</label>
<div class="layui-input-inline layui-inline-4">
<input type="checkbox" lay-filter="switch" name="isDefault" lay-skin="switch" lay-text="开启|关闭">
</div>
</div>
<div class="layui-form-item text-right core-hidden">
<input type="button" class="layui-btn" lay-submit lay-filter="LAY-app-CoreCmsWeChatPayConfig-createForm-submit" id="LAY-app-CoreCmsWeChatPayConfig-createForm-submit" value="确认添加">
@@ -134,7 +227,7 @@
layui.data.done = function (d) {
//开启调试情况下获取接口赋值数据
if (debug) { console.log(d.params.data); }
layui.use(['admin', 'form', 'laydate', 'upload', 'coreHelper', 'cropperImg'],
layui.use(['admin', 'form', 'laydate', 'upload', 'coreHelper', 'cropperImg', 'tabs'],
function () {
var $ = layui.$
, form = layui.form
@@ -142,6 +235,7 @@
, laydate = layui.laydate
, upload = layui.upload
, cropperImg = layui.cropperImg
, tabs = layui.tabs
, coreHelper = layui.coreHelper;
var upload = layui.upload;

View File

@@ -2,127 +2,219 @@
<div class="layui-form coreshop-form layui-form-pane" lay-filter="LAY-app-CoreCmsWeChatPayConfig-editForm" id="LAY-app-CoreCmsWeChatPayConfig-editForm">
<input type="hidden" name="id" value="{{d.params.data.model.id || '' }}" />
<div class="layui-form-item">
<label for="appType" class="layui-form-label layui-form-required">应用类型</label>
<div class="layui-input-inline layui-inline-5">
<select name="appType" lay-verify="required" placeholder="请输入应用类型" lay-reqText="请输入应用类型">
<option value="">请选择所属应用类型</option>
{{# layui.each(d.params.data.weiChatPayTradeType, function(index, item){ }}
<option value="{{ item.title }}" {{item.title===d.params.data.model.appType?'selected="selected"':''}}>{{ item.description }}</option>
{{# }); }}
</select>
</div>
<label for="appId" class="layui-form-label layui-form-required">应用AppID</label>
<div class="layui-input-inline layui-inline-5">
<input name="appId" lay-verify="required" class="layui-input" placeholder="请输入应用号" lay-reqText="请输入应用号" value="{{d.params.data.model.appId || '' }}" />
</div>
<label for="mchId" class="layui-form-label layui-form-required">商户号</label>
<div class="layui-input-inline layui-inline-5">
<input name="mchId" lay-verify="required" class="layui-input" placeholder="请输入商户号" lay-reqText="请输入商户号" value="{{d.params.data.model.mchId || '' }}" />
<div class="layui-tab" lay-filter="test-handle" lay-allowclose="true">
<ul class="layui-tab-title">
<li class="layui-this" lay-id="11">基础设置</li>
<li lay-id="22">证书密钥配置</li>
</ul>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<div class="layui-form-item">
<label for="appType" class="layui-form-label layui-form-required">应用类型</label>
<div class="layui-input-inline layui-inline-5">
<select name="appType" lay-verify="required" placeholder="请输入应用类型" lay-reqText="请输入应用类型">
<option value="">请选择所属应用类型</option>
{{# layui.each(d.params.data.weiChatPayTradeType, function(index, item){ }}
<option value="{{ item.title }}" {{item.title===d.params.data.model.appType?'selected="selected"':''}}>{{ item.description }}</option>
{{# }); }}
</select>
</div>
<label for="appId" class="layui-form-label layui-form-required">应用AppID</label>
<div class="layui-input-inline layui-inline-5">
<input name="appId" lay-verify="required" class="layui-input" placeholder="请输入应用号" lay-reqText="请输入应用号" value="{{d.params.data.model.appId || '' }}" />
</div>
<label for="mchId" class="layui-form-label layui-form-required">商户号</label>
<div class="layui-input-inline layui-inline-5">
<input name="mchId" lay-verify="required" class="layui-input" placeholder="请输入商户号" lay-reqText="请输入商户号" value="{{d.params.data.model.mchId || '' }}" />
</div>
</div>
<div class="layui-form-item">
<label for="subAppId" class="layui-form-label">子商户应用号</label>
<div class="layui-input-inline layui-inline-4">
<input name="subAppId" class="layui-input" placeholder="请输入子商户应用号" lay-reqText="请输入子商户应用号" value="{{d.params.data.model.subAppId || '' }}" />
</div>
<div class="layui-form-mid">
目前仅调用服务商API时使用子商户的公众号移动应用AppId
</div>
</div>
<div class="layui-form-item">
<label for="subMchId" class="layui-form-label">子商户号</label>
<div class="layui-input-inline layui-inline-4">
<input name="subMchId" class="layui-input" placeholder="请输入子商户号" lay-reqText="请输入子商户号" value="{{d.params.data.model.subMchId || '' }}" />
</div>
<div class="layui-form-mid">
目前仅调用服务商API时使用子商户的商户号
</div>
</div>
<div class="layui-form-item">
<label for="notifyUrl" class="layui-form-label layui-form-required">支付回调通知</label>
<div class="layui-input-inline layui-inline-10">
<input name="notifyUrl" lay-verify="required" class="layui-input" placeholder="请输入支付回调通知" lay-reqText="请输入支付回调通知" value="{{d.params.data.model.notifyUrl || '' }}" />
</div>
<div class="layui-form-mid">
webApi端接口地址+/Notify/WeChatPay/Unifiedorder
</div>
</div>
<div class="layui-form-item">
<label for="refundUrl" class="layui-form-label layui-form-required">退款回调</label>
<div class="layui-input-inline layui-inline-10">
<input name="refundUrl" lay-verify="required" class="layui-input" placeholder="请输入退款回调" lay-reqText="请输入退款回调" value="{{d.params.data.model.refundUrl || '' }}" />
</div>
<div class="layui-form-mid">
webApi端接口地址+/Notify/WeChatPay/Refund
</div>
</div>
<div class="layui-form-item">
<label for="refundUrl" class="layui-form-label layui-form-required">提现回调通知</label>
<div class="layui-input-inline layui-inline-10">
<input name="transferBillsUrl" lay-verify="required" class="layui-input" placeholder="请输入提现回调通知" lay-reqText="请输入提现回调通知" value="{{d.params.data.model.transferBillsUrl || '' }}" />
</div>
<div class="layui-form-mid">
webApi端接口地址+/Notify/WeChatPay/TransferBillsCallBack
</div>
</div>
<div class="layui-form-item">
<label for="jumpUrl" class="layui-form-label">跳转地址</label>
<div class="layui-input-inline layui-inline-8">
<input name="jumpUrl" class="layui-input" placeholder="请输入跳转地址" lay-reqText="请输入跳转地址" value="{{d.params.data.model.jumpUrl || '' }}" />
</div>
<div class="layui-form-mid">
H5PC端支付成功或者支付失败后跳转的查询支付状态的地址默认可不填写
</div>
</div>
<div class="layui-form-item">
<label for="isEnable" class="layui-form-label layui-form-required">是否开启</label>
<div class="layui-input-inline layui-inline-4">
<input type="checkbox" lay-filter="switch" name="isEnable" {{ d.params.data.model.isEnable ? 'checked' : '' }} lay-skin="switch" lay-text="开启|关闭">
</div>
<label for="isDefault" class="layui-form-label layui-form-required">是否本类默认</label>
<div class="layui-input-inline layui-inline-4">
<input type="checkbox" lay-filter="switch" name="isDefault" {{ d.params.data.model.isDefault ? 'checked' : '' }} lay-skin="switch" lay-text="开启|关闭">
</div>
</div>
</div>
<div class="layui-tab-item">
<div class="layui-form-item">
<label for="rsaPublicKey" class="layui-form-label">RSA公钥弃用</label>
<div class="layui-input-inline layui-inline-8">
<input name="rsaPublicKey" class="layui-input" placeholder="请输入RSA公钥" lay-reqText="请输入RSA公钥" value="{{d.params.data.model.rsaPublicKey || '' }}" />
</div>
<div class="layui-form-mid">
目前仅"企业付款到银行卡API"使用调用"获取RSA加密公钥API"即可获取
</div>
</div>
<div class="layui-form-item">
<label for="apiKey" class="layui-form-label layui-form-required">APIv2密钥</label>
<div class="layui-input-inline layui-inline-12">
<input name="apiKey" lay-verify="required" class="layui-input" placeholder="请输入API秘钥" lay-reqText="请输入API秘钥" value="{{d.params.data.model.apiKey || '' }}" />
</div>
<div class="layui-form-mid">
apiV2密钥
</div>
</div>
<div class="layui-form-item">
<label for="apiV3Key" class="layui-form-label">APIv3密钥</label>
<div class="layui-input-inline layui-inline-12">
<input name="apiV3Key" class="layui-input" placeholder="请输入APIv3密钥" lay-reqText="请输入APIv3密钥" value="{{d.params.data.model.apiV3Key || '' }}" />
</div>
<div class="layui-form-mid">
只有开启了商家付款到零钱的功能才需要录入APIv3密钥用于提现
</div>
</div>
<div class="layui-form-item">
<label for="certificateSerialNumber" class="layui-form-label layui-form-required">商户证书序列号</label>
<div class="layui-input-inline layui-inline-12">
<input name="certificateSerialNumber" lay-verify="required|verifycertificateSerialNumber" value="{{d.params.data.model.certificateSerialNumber || '' }}" class="layui-input" lay-reqText="请输入商户证书序列号" placeholder="请输入商户证书序列号" />
</div>
<div class="layui-form-mid">
微信支付商户=> 账户中心=> API安全=> 商户API证书=> 管理证书中获取
</div>
</div>
<div class="layui-form-item layui-form-text">
<label for="certificate" class="layui-form-label layui-form-required">
商户证书文件apiclient_cert.p12内容请选择apiclient_cert.p12文件会自动上传获取base64内容不需要打开复制内容到这里
<button type="button" class="layui-btn layui-btn-xs layui-btn-danger" id="doUpload">
<i class="layui-icon">&#xe67c;</i>
</button>
</label>
<div class="layui-input-block">
<textarea name="certificate" id="certificateBox" lay-verify="required" placeholder="请选择【apiclient_cert.p12】文件" class="layui-textarea">{{d.params.data.model.certificate || '' }}</textarea>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label for="certificatePrivateKey" class="layui-form-label layui-form-required">商户证书文件apiclient_key.pem内容注意是直接复制文件内容进来</label>
<div class="layui-input-block">
<textarea name="certificatePrivateKey" id="certificatePrivateKey" placeholder="请复制商户证书文件内容" class="layui-textarea">{{d.params.data.model.certificatePrivateKey || '' }}</textarea>
</div>
<div class="layui-form-mid">
设置微信支付商户 API 证书私钥通常为 `apiclient_key.pem` 文件内容
</div>
</div>
<div class="layui-form-item">
<label for="payType" class="layui-form-label layui-form-required">高级模式</label>
<div class="layui-input-block">
<select name="payType" lay-verify="required" placeholder="请输入高级模式" lay-reqText="请输入高级模式">
<option value="">请选择高级模式</option>
{{# layui.each(d.params.data.weChatPayIdentityVerificationMethods, function(index, item){ }}
<option value="{{ item.value }}" {{item.value===d.params.data.model.payType?'selected="selected"':''}}>{{ item.description }}</option>
{{# }); }}
</select>
</div>
<div class="layui-form-mid">
APIv3密钥模式下会用到目前主要是商家转账功能如果选择微信支付公钥模式下面平台公钥ID平台公钥内容必填转换模式是指从平台证书模式切换到公钥模式
</div>
</div>
<div class="layui-form-item layui-form-text">
<label for="platformSerialNumber" class="layui-form-label">平台证书序列号</label>
<div class="layui-input-block">
<input name="platformSerialNumber" value="{{d.params.data.model.platformSerialNumber || '' }}" class="layui-input" lay-reqText="请输入平台证书序列号" placeholder="请输入平台证书序列号" />
</div>
<div class="layui-form-mid">
注意这是平台证书序列号不是商户证书序列号
</div>
</div>
<div class="layui-form-item layui-form-text">
<label for="platformPublicKeyId" class="layui-form-label">平台公钥ID</label>
<div class="layui-input-block">
<input name="platformPublicKeyId" value="{{d.params.data.model.platformPublicKeyId || '' }}" class="layui-input" lay-reqText="请输入平台公钥ID" placeholder="请输入平台公钥ID" />
</div>
<div class="layui-form-mid">
微信支付商户=> 账户中心=> API安全=> 微信支付公钥 => 申请公钥中查看
</div>
</div>
<div class="layui-form-item layui-form-text">
<label for="platformPublicKey" class="layui-form-label">平台公钥内容直接复制pub_key.pem文件内容粘贴此处即可</label>
<div class="layui-input-block">
<textarea name="platformPublicKey" id="platformPublicKey" placeholder="请复制平台公钥内容" class="layui-textarea">{{d.params.data.model.platformPublicKey || '' }}</textarea>
</div>
<div class="layui-form-mid">
微信支付商户=> 账户中心=> API安全=> 微信支付公钥 => 申请公钥中下载
</div>
</div>
</div>
</div>
</div>
<div class="layui-form-item">
<label for="apiKey" class="layui-form-label layui-form-required">API秘钥</label>
<div class="layui-input-inline layui-inline-12">
<input name="apiKey" lay-verify="required" class="layui-input" placeholder="请输入API秘钥" lay-reqText="请输入API秘钥" value="{{d.params.data.model.apiKey || '' }}" />
</div>
<div class="layui-form-mid">
apiV2密钥
</div>
</div>
<div class="layui-form-item">
<label for="apiV3Key" class="layui-form-label">APIv3密钥</label>
<div class="layui-input-inline layui-inline-12">
<input name="apiV3Key" class="layui-input" placeholder="请输入APIv3密钥" lay-reqText="请输入APIv3密钥" value="{{d.params.data.model.apiV3Key || '' }}" />
</div>
<div class="layui-form-mid">
只有开启了商家付款到零钱的功能才需要录入APIv3密钥用于提现
</div>
</div>
<div class="layui-form-item layui-form-text">
<label for="certificate" class="layui-form-label layui-form-required">
微信支付商户p12证书请选择apiclient_cert.p12文件
<button type="button" class="layui-btn layui-btn-xs layui-btn-danger" id="doUpload">
<i class="layui-icon">&#xe67c;</i>
</button>
</label>
<div class="layui-input-block">
<textarea name="certificate" id="certificateBox" lay-verify="required" placeholder="请选择【apiclient_cert.p12】文件" class="layui-textarea">{{d.params.data.model.certificate || '' }}</textarea>
</div>
</div>
<div class="layui-form-item">
<label for="rsaPublicKey" class="layui-form-label">RSA公钥</label>
<div class="layui-input-inline layui-inline-8">
<input name="rsaPublicKey" class="layui-input" placeholder="请输入RSA公钥" lay-reqText="请输入RSA公钥" value="{{d.params.data.model.rsaPublicKey || '' }}" />
</div>
<div class="layui-form-mid">
目前仅"企业付款到银行卡API"使用调用"获取RSA加密公钥API"即可获取
</div>
</div>
<div class="layui-form-item">
<label for="subAppId" class="layui-form-label">子商户应用号</label>
<div class="layui-input-inline layui-inline-4">
<input name="subAppId" class="layui-input" placeholder="请输入子商户应用号" lay-reqText="请输入子商户应用号" value="{{d.params.data.model.subAppId || '' }}" />
</div>
<div class="layui-form-mid">
目前仅调用服务商API时使用子商户的公众号移动应用AppId
</div>
</div>
<div class="layui-form-item">
<label for="subMchId" class="layui-form-label">子商户号</label>
<div class="layui-input-inline layui-inline-4">
<input name="subMchId" class="layui-input" placeholder="请输入子商户号" lay-reqText="请输入子商户号" value="{{d.params.data.model.subMchId || '' }}" />
</div>
<div class="layui-form-mid">
目前仅调用服务商API时使用子商户的商户号
</div>
</div>
<div class="layui-form-item">
<label for="notifyUrl" class="layui-form-label layui-form-required">支付回调通知</label>
<div class="layui-input-inline layui-inline-8">
<input name="notifyUrl" lay-verify="required" class="layui-input" placeholder="请输入支付回调通知" lay-reqText="请输入支付回调通知" value="{{d.params.data.model.notifyUrl || '' }}" />
</div>
<div class="layui-form-mid">
webApi端接口地址+/Notify/WeChatPay/Unifiedorder
</div>
</div>
<div class="layui-form-item">
<label for="refundUrl" class="layui-form-label layui-form-required">退款回调</label>
<div class="layui-input-inline layui-inline-8">
<input name="refundUrl" lay-verify="required" class="layui-input" placeholder="请输入退款回调" lay-reqText="请输入退款回调" value="{{d.params.data.model.refundUrl || '' }}" />
</div>
<div class="layui-form-mid">
webApi端接口地址+/Notify/WeChatPay/Refund
</div>
</div>
<div class="layui-form-item">
<label for="jumpUrl" class="layui-form-label">跳转地址</label>
<div class="layui-input-inline layui-inline-8">
<input name="jumpUrl" class="layui-input" placeholder="请输入跳转地址" lay-reqText="请输入跳转地址" value="{{d.params.data.model.jumpUrl || '' }}" />
</div>
<div class="layui-form-mid">
H5PC端支付成功或者支付失败后跳转的查询支付状态的地址默认可不填写
</div>
</div>
<div class="layui-form-item">
<label for="isEnable" class="layui-form-label layui-form-required">是否开启</label>
<div class="layui-input-inline layui-inline-4">
<input type="checkbox" lay-filter="switch" name="isEnable" {{ d.params.data.model.isEnable ? 'checked' : '' }} lay-skin="switch" lay-text="开启|关闭">
</div>
<label for="isDefault" class="layui-form-label layui-form-required">是否本类默认</label>
<div class="layui-input-inline layui-inline-4">
<input type="checkbox" lay-filter="switch" name="isDefault" {{ d.params.data.model.isDefault ? 'checked' : '' }} lay-skin="switch" lay-text="开启|关闭">
</div>
</div>
<div class="layui-form-item text-right core-hidden">
<input type="button" class="layui-btn" lay-submit lay-filter="LAY-app-CoreCmsWeChatPayConfig-editForm-submit" id="LAY-app-CoreCmsWeChatPayConfig-editForm-submit" value="确认编辑">

View File

@@ -154,12 +154,12 @@
{ field: 'apiKey', title: 'API秘钥', sort: false, width: 155 },
//{ field: 'apiV3Key', title: 'APIv3密钥', sort: false, width: 105 },
//{ field: 'certificate', title: 'p12证书base64', sort: false, width: 105 },
{ field: 'rsaPublicKey', title: 'RSA公钥', sort: false, width: 105 },
{ field: 'subAppId', title: '子商户应用号', sort: false, width: 105 },
{ field: 'subMchId', title: '子商户号', sort: false, width: 105 },
//{ field: 'rsaPublicKey', title: 'RSA公钥', sort: false, width: 105 },
//{ field: 'subAppId', title: '子商户应用号', sort: false, width: 105 },
//{ field: 'subMchId', title: '子商户号', sort: false, width: 105 },
{ field: 'notifyUrl', title: '支付回调通知', sort: false },
{ field: 'refundUrl', title: '退款回调', sort: false },
{ field: 'jumpUrl', title: '跳转地址', sort: false },
{ field: 'transferBillsUrl', title: '提现回调通知', sort: false },
{ field: 'isEnable', title: '是否开启', width: 95, templet: '#switch_isEnable', sort: false, unresize: true },
{ field: 'isDefault', title: '是否本类默认', width: 95, templet: '#switch_isDefault', sort: false, unresize: true },
//{ field: 'appType', title: '应用类型', sort: false, width: 105 },
@@ -246,7 +246,7 @@
});
});
// 禁止弹窗出现滚动条
$(layero).children('.layui-layer-content').css('overflow', 'visible');
//$(layero).children('.layui-layer-content').css('overflow', 'visible');
}
, btn: ['确定', '取消']
, yes: function (index, layero) {
@@ -292,7 +292,7 @@
});
})
// 禁止弹窗出现滚动条
$(layero).children('.layui-layer-content').css('overflow', 'visible');
//$(layero).children('.layui-layer-content').css('overflow', 'visible');
}
, btn: ['确定', '取消']
, yes: function (index, layero) {

View File

@@ -8,20 +8,21 @@
* Description: 暂无
***********************************************************************/
using CoreCms.Net.Caching.AutoMate.RedisCache;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Loging;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.FromBody;
using Essensoft.Paylink.WeChatPay;
using Essensoft.Paylink.WeChatPay.V2;
using Essensoft.Paylink.WeChatPay.V2.Notify;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using NLog;
using System;
using System.Threading.Tasks;
using CoreCms.Net.Caching.AutoMate.RedisCache;
using Essensoft.Paylink.WeChatPay;
using Essensoft.Paylink.WeChatPay.V2;
using Essensoft.Paylink.WeChatPay.V2.Notify;
namespace CoreCms.Net.Web.WebApi.Controllers.PayNotify
{
@@ -31,26 +32,25 @@ namespace CoreCms.Net.Web.WebApi.Controllers.PayNotify
[Route("Notify/[controller]/[action]")]
public class WeChatPayController : ControllerBase
{
private readonly ICoreCmsBillPaymentsServices _billPaymentsServices;
private readonly ICoreCmsBillRefundServices _billRefundServices;
private readonly IWeChatPayNotifyClient _client;
private readonly IRedisOperationRepository _redisOperationRepository;
private readonly IWeChatPayConfigServices _weChatPayConfigServices;
private readonly ICoreCmsUserTocashWeChatNotifyServices _userTocashWeChatNotifyServices;
/// <summary>
/// 构造函数
/// </summary>
public WeChatPayController(
IWeChatPayNotifyClient client
, ICoreCmsBillPaymentsServices billPaymentsServices, ICoreCmsBillRefundServices billRefundServices, IRedisOperationRepository redisOperationRepository, IWeChatPayConfigServices weChatPayConfigServices)
IWeChatPayNotifyClient client, ICoreCmsBillRefundServices billRefundServices, IRedisOperationRepository redisOperationRepository, IWeChatPayConfigServices weChatPayConfigServices, ICoreCmsUserTocashWeChatNotifyServices userTocashWeChatNotifyServices)
{
_client = client;
_billPaymentsServices = billPaymentsServices;
_billRefundServices = billRefundServices;
_redisOperationRepository = redisOperationRepository;
_weChatPayConfigServices = weChatPayConfigServices;
_userTocashWeChatNotifyServices = userTocashWeChatNotifyServices;
}
/// <summary>
@@ -146,5 +146,55 @@ namespace CoreCms.Net.Web.WebApi.Controllers.PayNotify
return NoContent();
}
}
/// <summary>
/// 商家转账回调通知
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> TransferBillsCallBack([FromBody] FMTransferBillsCallBack entity)
{
try
{
NLogUtil.WriteAll(LogLevel.Trace, LogType.Refund, "商家转账回调通知", JsonConvert.SerializeObject(entity));
if (entity == null)
{
var obj = new
{
code = "FAIL",
message = "失败"
};
return new JsonResult(obj);
}
var log = new CoreCmsUserTocashWeChatNotify();
log.callBackId = entity.id;
log.create_time = entity.create_time;
log.resource_type = entity.resource_type;
log.event_type = entity.event_type;
log.summary = entity.summary;
log.resource = JsonConvert.SerializeObject(entity.resource);
log.createTime = DateTime.Now;
await _userTocashWeChatNotifyServices.InsertAsync(log);
return NoContent();
}
catch (Exception ex)
{
NLogUtil.WriteAll(LogLevel.Trace, LogType.Refund, "商家转账回调通知", "结果通知", ex);
var obj = new
{
code = "FAIL",
message = "失败"
};
return new JsonResult(obj);
}
}
}
}

View File

@@ -839,7 +839,7 @@
微信支付异步通知
</summary>
</member>
<member name="M:CoreCms.Net.Web.WebApi.Controllers.PayNotify.WeChatPayController.#ctor(Essensoft.Paylink.WeChatPay.V2.IWeChatPayNotifyClient,CoreCms.Net.IServices.ICoreCmsBillPaymentsServices,CoreCms.Net.IServices.ICoreCmsBillRefundServices,CoreCms.Net.Caching.AutoMate.RedisCache.IRedisOperationRepository,CoreCms.Net.IServices.IWeChatPayConfigServices)">
<member name="M:CoreCms.Net.Web.WebApi.Controllers.PayNotify.WeChatPayController.#ctor(Essensoft.Paylink.WeChatPay.V2.IWeChatPayNotifyClient,CoreCms.Net.IServices.ICoreCmsBillRefundServices,CoreCms.Net.Caching.AutoMate.RedisCache.IRedisOperationRepository,CoreCms.Net.IServices.IWeChatPayConfigServices,CoreCms.Net.IServices.ICoreCmsUserTocashWeChatNotifyServices)">
<summary>
构造函数
</summary>
@@ -854,6 +854,12 @@
退款结果通知
</summary>
</member>
<member name="M:CoreCms.Net.Web.WebApi.Controllers.PayNotify.WeChatPayController.TransferBillsCallBack(CoreCms.Net.Model.FromBody.FMTransferBillsCallBack)">
<summary>
商家转账回调通知
</summary>
<returns></returns>
</member>
<member name="T:CoreCms.Net.Web.WebApi.Controllers.PinTuanController">
<summary>
拼团接口

View File

@@ -0,0 +1,56 @@
/****** Object: Table [dbo].[CoreCmsWeChatPayPlatformCertificate] Script Date: 2025/7/29 0:19:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[CoreCmsWeChatPayPlatformCertificate](
[id] [INT] IDENTITY(1,1) NOT NULL,
[algorithmType] [NVARCHAR](50) NOT NULL,
[certificate] [NVARCHAR](MAX) NOT NULL,
[effectiveTime] [DATETIME] NOT NULL,
[expireTime] [DATETIME] NOT NULL,
[serialNumber] [NVARCHAR](50) NOT NULL,
[merchantId] [NVARCHAR](50) NOT NULL,
[createTime] [DATETIME] NOT NULL,
[updataTime] [DATETIME] NULL,
CONSTRAINT [PK_CoreCmsWeChatPayPlatformCertificate] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsWeChatPayPlatformCertificate', @level2type=N'COLUMN',@level2name=N'id'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsWeChatPayPlatformCertificate', @level2type=N'COLUMN',@level2name=N'algorithmType'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsWeChatPayPlatformCertificate', @level2type=N'COLUMN',@level2name=N'certificate'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>Чʱ<EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsWeChatPayPlatformCertificate', @level2type=N'COLUMN',@level2name=N'effectiveTime'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsWeChatPayPlatformCertificate', @level2type=N'COLUMN',@level2name=N'expireTime'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsWeChatPayPlatformCertificate', @level2type=N'COLUMN',@level2name=N'serialNumber'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'<EFBFBD>̻<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsWeChatPayPlatformCertificate', @level2type=N'COLUMN',@level2name=N'merchantId'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsWeChatPayPlatformCertificate', @level2type=N'COLUMN',@level2name=N'createTime'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsWeChatPayPlatformCertificate', @level2type=N'COLUMN',@level2name=N'updataTime'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'΢<EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD>ƽ̨֤<EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsWeChatPayPlatformCertificate'
GO

View File

@@ -0,0 +1,52 @@
/****** Object: Table [dbo].[CoreCmsUserTocashWeChatNotify] Script Date: 2025/7/29 0:16:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[CoreCmsUserTocashWeChatNotify](
[id] [INT] IDENTITY(1,1) NOT NULL,
[callBackId] [NVARCHAR](50) NOT NULL,
[create_time] [NVARCHAR](50) NOT NULL,
[resource_type] [NVARCHAR](50) NOT NULL,
[event_type] [NVARCHAR](50) NOT NULL,
[summary] [NVARCHAR](100) NOT NULL,
[resource] [NVARCHAR](MAX) NOT NULL,
[createTime] [DATETIME] NOT NULL,
CONSTRAINT [PK_CoreCmsUserTocashWeChatNotify] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatNotify', @level2type=N'COLUMN',@level2name=N'id'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'֪ͨID' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatNotify', @level2type=N'COLUMN',@level2name=N'callBackId'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatNotify', @level2type=N'COLUMN',@level2name=N'create_time'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatNotify', @level2type=N'COLUMN',@level2name=N'resource_type'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatNotify', @level2type=N'COLUMN',@level2name=N'event_type'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'<EFBFBD>ص<EFBFBD>ժҪ' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatNotify', @level2type=N'COLUMN',@level2name=N'summary'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatNotify', @level2type=N'COLUMN',@level2name=N'resource'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatNotify', @level2type=N'COLUMN',@level2name=N'createTime'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD>̼<EFBFBD>ת<EFBFBD><EFBFBD>΢<EFBFBD>Żص<EFBFBD>֪ͨ' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatNotify'
GO

View File

@@ -0,0 +1,61 @@
/****** Object: Table [dbo].[CoreCmsUserTocashWeChatResponse] Script Date: 2025/7/29 0:18:07 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[CoreCmsUserTocashWeChatResponse](
[id] [INT] IDENTITY(1,1) NOT NULL,
[out_bill_no] [NVARCHAR](50) NOT NULL,
[transfer_bill_no] [NVARCHAR](100) NOT NULL,
[create_time] [DATETIME] NOT NULL,
[state] [NVARCHAR](50) NOT NULL,
[package_info] [NVARCHAR](255) NULL,
[code] [INT] NULL,
[message] [NVARCHAR](255) NULL,
[detail] [NVARCHAR](255) NULL,
[createTime] [DATETIME] NOT NULL,
CONSTRAINT [PK_CoreCmsUserTocashWeChatResponse] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatResponse', @level2type=N'COLUMN',@level2name=N'id'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'<EFBFBD>̻<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatResponse', @level2type=N'COLUMN',@level2name=N'out_bill_no'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'΢<EFBFBD><EFBFBD>ת<EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatResponse', @level2type=N'COLUMN',@level2name=N'transfer_bill_no'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'<EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatResponse', @level2type=N'COLUMN',@level2name=N'create_time'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatResponse', @level2type=N'COLUMN',@level2name=N'state'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>ȡҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>package<EFBFBD><EFBFBD>Ϣ' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatResponse', @level2type=N'COLUMN',@level2name=N'package_info'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'״̬<EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatResponse', @level2type=N'COLUMN',@level2name=N'code'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'<EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatResponse', @level2type=N'COLUMN',@level2name=N'message'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatResponse', @level2type=N'COLUMN',@level2name=N'detail'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatResponse', @level2type=N'COLUMN',@level2name=N'createTime'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD>̼<EFBFBD>ת<EFBFBD>˻ص<EFBFBD><EFBFBD><EFBFBD>¼' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'CoreCmsUserTocashWeChatResponse'
GO