Magicodes.Pay已支持Volo Abp
Magicodes.Pay已支持Volo Abp
简介
Magicodes.Pay希望打造一个统一支付库,相关库均使用.NET标准库编写,支持.NET Framework以及.NET Core。目前已提供Abp及Abp VNext(Volo Abp)模块的封装,支持开箱即用。
GitHub:https://github.com/xin-lai/Magicodes.Pay
Nuget
| 名称 | 说明 | Nuget |
|---|---|---|
| Magicodes.Pay.Alipay | 支付宝支付库 | |
| Magicodes.Pay.Notify | 支付通用回调库 | |
| Magicodes.Pay.Wxpay | 微信支付库 | |
| Magicodes.Pay.Alipay.Global | 国际支付宝支付库 | |
| Magicodes.Pay.Allinpay | 通联支付库 | |
| Magicodes.Pay.Abp | ABP 支付通用封装库 | |
| Magicodes.Pay.Abp.Allinpay | ABP 通联支付模块 | |
| Magicodes.Pay.Abp.Wxpay | ABP 微信支付模块 | |
| Magicodes.Pay.Abp.Alipay.Global | ABP 国际支付宝模块 | |
| Magicodes.Pay.Abp.Alipay | ABP 支付宝模块 | |
| Magicodes.Pay.Volo.Abp | ABP VNext基础模块 | |
| Magicodes.Pay.Volo.Abp.Allinpay | ABP VNext 通联支付模块 | |
| Magicodes.Pay.Volo.Abp.Wxpay | ABP VNext 微信支付模块 | |
| Magicodes.Pay.Volo.Abp.Alipay | ABP VNext 支付宝支付模块 |
主要功能
目前已提供Abp(含Volo Abp)模块的封装,支持开箱即用。支持以下支付方式和功能:
- 支付宝支付
- APP支付
- Wap支付
- 支付宝国际支付
- 支持分账
- 微信支付
- 小程序支付
- APP支付
- 订单查询
- 企业付款(提现)
- 退款申请
- 普通红包
- 通联支付
- 小程序支付
- 微信JSAPI支付
- 统一支付回调处理
- 支持日志函数注入(不依赖支付库)
- 支持支付配置函数注入,以便于支持自定义配置获取逻辑,以应用于不同的场景(比如从配置文件、用户设置获取配置,或者多租户支持)
- 针对ABP提供模块封装,添加模块依赖即可立即使用。主要包括:
- 统一支付服务封装(见IPayAppService)
- 支付管理器封装(IPaymentManager),包含:
- 支付渠道注册(IPaymentRegister)
- 支付回调逻辑处理(IPaymentCallbackAction)
- 统一支付服务实现(IToPayService)
- 交易日志封装,自动记录客户端信息以及自动异常处理和记录
- 仅需编写一次回调逻辑,即可支持多个支付渠道
- 业务参数支持更大长度(500)
开始使用(Volo Abp)
当前教程仅适用于Volo Abp。主要步骤如下:
- 引用对应的Abp支付的Nuget包
如果仅需某个支付,仅需引用该支付的包。下面以通联支付为例,我们需要在工程中引用此包:
| 名称 | 说明 | Nuget |
|---|---|---|
| Magicodes.Pay.Volo.Abp.Allinpay | ABP VNext通联支付模块 |
- 添加模块依赖
在对应工程的Abp的模块(AbpModule)中,添加对“AbpAllinpayModule”的依赖,如:
[DependsOn(typeof(AbpAllinpayModule))]
- 在DbContext中添加名为“TransactionLogs”的DbSet
整个支付过程中(无论是支付成功还是出现异常),均会记录交易日志。交易日志会记录交易过程中的一些信息,比如客户端信息、交易参数、自定义参数以及异常信息。因此我们需要针对EF添加对TransactionLog的支持。需要在DbContext中添加的完整代码如下所示:
public DbSet<TransactionLog> TransactionLogs { get; set; }
- 注册回调逻辑
我们需要实现“IPaymentCallbackAction”接口来编写自定义的回调逻辑,一个逻辑需注册一个,通过业务关键字来匹配对应的回调逻辑,比如“缴费支付”、“充值”。如以下示例所示:
public class TestPaymentCallbackAction : IPaymentCallbackAction
{
/// <summary>
/// 业务Key
/// </summary>
public string Key { get; set; } = "缴费支付";
/// <summary>
/// 执行回调
/// </summary>
/// <returns></returns>
public async Task Process(IUnitOfWorkManager unitOfWork, TransactionLog transactionLog)
{
var data = transactionLog.CustomData.FromJsonString<JObject>();
//业务处理
await Task.FromResult(0);
}
}
注意Key不要重复。
- 向容器中注册回调逻辑
如未自动注册,可以使用以下代码进行手动注册:
ontext.Services.AddTransient<IPaymentCallbackAction, TestPaymentCallbackAction>();
除了上面的方式,我们还可以通过注入IPaymentManager对象,通过其RegisterCallbackAction方法来注册自定义的回调逻辑。
- 配置支付参数
支付参数支持配置文件或SettingManager配置,下面以配置文件为例,配置如下所示:
"Allinpay": {
"IsEnabled": "true",
"CusId": "testtest",
"ApiGateWay": "https://vsp.allinpay.com/apiweb/unitorder",
"AppKey": "testtesttesttest",
"AppId": "testtesttesttesttesttest",
"Version": "11",
"NotifyUrl": "{域名}/PayNotify/{tenantId?}/{支付提供程序Key}",
"WeChatAppId": "微信小程序支付的APPID",
"JsApiAppId":"JSAPI支付的APPID"
}
如上述代码所示,配置节点 “Allinpay”对应提供程序的Key。相关支付提供程序的Key如下所示:
- 支付宝:Alipay
- 国际支付宝:Global.alipay
- 通联支付:Allinpay
- 微信:Wxpay
值得注意的是,默认情况,回调统一由【Magicodes.Pay.Notify】下的“PayNotifyController”控制器来处理,因此回调地址配置格式如下所示:
{域名}/PayNotify/{tenantId?}/{支付提供程序Key}
- 发起支付
配置完成后,就可以使用统一封装的IPayAppService来发起支付。仅需注入IPayAppService,然后调用Pay方法即可。也可以自行再次封装,如下述代码所示:
public async Task<object> Payment(PaymentInput input)
{
return await _payAppService.Pay(new PayInputBase()
{
Body = $"{input.Name} {input.ChargeProjectName}",
CustomData = input.ToJsonString(),
Key = "缴费支付",
OpenId = input.OpenId,
Subject = input.ChargeProjectName,
TotalAmount = input.Amount,
PayChannel = input.PayChannel
});
}
通过IPayAppService统一支付有如下好处:
- 统一支付(无论支付宝还是微信各种端的支付,均可统一)
- 自动记录交易日志以及进行相关逻辑处理
- 自定义数据依赖交易日志进行存储,而不依赖支付渠道,因此支持无业务参数的支付渠道,也支持存储更多自定义数据
老Abp集成教程
如果使用Abp相关模块,则使用起来比较简单,具体您可以参考相关单元测试的编写。主要有以下步骤:
- 引用对应的Abp支付的Nuget包
如果仅需某个支付,仅需引用该支付的包。下面以通联支付为例,我们需要在工程中引用此包:
| 名称 | 说明 | Nuget |
|---|---|---|
| Magicodes.Pay.Abp.Allinpay | ABP 通联支付模块 |
- 添加模块依赖
在对应工程的Abp的模块(AbpModule)中,添加对“AbpAllinpayModule”的依赖,如:
[DependsOn(typeof(AbpAllinpayModule))]
- 在DbContext中添加名为“TransactionLogs”的DbSet
整个支付过程中(无论是支付成功还是出现异常),均会记录交易日志。交易日志会记录交易过程中的一些信息,比如客户端信息、交易参数、自定义参数以及异常信息。因此我们需要针对EF添加对TransactionLog的支持。需要在DbContext中添加的完整代码如下所示:
public DbSet<TransactionLog> TransactionLogs { get; set; }
- 注册回调逻辑
我们需要实现“IPaymentCallbackAction”接口来编写自定义的回调逻辑,一个逻辑需注册一个,通过业务关键字来匹配对应的回调逻辑,比如“缴费支付”、“充值”。如以下示例所示:
public class TestPaymentCallbackAction : IPaymentCallbackAction
{
/// <summary>
/// 业务Key
/// </summary>
public string Key { get; set; } = "缴费支付";
/// <summary>
/// 执行回调
/// </summary>
/// <returns></returns>
public async Task Process(IUnitOfWorkManager unitOfWork, TransactionLog transactionLog)
{
var data = transactionLog.CustomData.FromJsonString<JObject>();
//业务处理
await Task.FromResult(0);
}
}
注意Key不要重复。
- 向容器中注册回调逻辑
我们可以将回调逻辑写在一个公共的程序集,然后使用以下代码进行注册:
IocManager.IocContainer.Register(
//注册自定义支付回调逻辑
Classes.FromAssembly(typeof(ApplicationCoreModule).GetAssembly())
.BasedOn<IPaymentCallbackAction>()
.LifestyleTransient()
.Configure(component => component.Named(component.Implementation.FullName))
.WithServiceFromInterface()
);
除了上面的方式,我们还可以通过注入IPaymentManager对象,通过其RegisterCallbackAction方法来注册自定义的回调逻辑。
- 配置支付参数
支付参数支持配置文件和SettingManager配置,下面以配置文件为例,配置如下所示:
"Allinpay": {
"IsEnabled": "true",
"CusId": "testtest",
"ApiGateWay": "https://vsp.allinpay.com/apiweb/unitorder",
"AppKey": "testtesttesttest",
"AppId": "testtesttesttesttesttest",
"Version": "11",
"NotifyUrl": "{域名}/PayNotify/{tenantId?}/{支付提供程序Key}",
"WeChatAppId": "微信小程序支付的APPID",
"JsApiAppId":"JSAPI支付的APPID"
}
如上述代码所示,配置节点 “Allinpay”对应提供程序的Key。相关支付提供程序的Key如下所示:
- 支付宝:Alipay
- 国际支付宝:Global.alipay
- 通联支付:Allinpay
- 微信:Wxpay
值得注意的是,默认情况,回调统一由【Magicodes.Pay.Notify】下的“PayNotifyController”控制器来处理,因此回调地址配置格式如下所示:
{域名}/PayNotify/{tenantId?}/{支付提供程序Key}
- 发起支付
配置完成后,就可以使用统一封装的IPayAppService来发起支付。仅需注入IPayAppService,然后调用Pay方法即可。也可以自行再次封装,如下述代码所示:
public async Task<object> Payment(PaymentInput input)
{
return await _payAppService.Pay(new PayInputBase()
{
Body = $"{input.Name} {input.ChargeProjectName}",
CustomData = input.ToJsonString(),
Key = "缴费支付",
OpenId = input.OpenId,
Subject = input.ChargeProjectName,
TotalAmount = input.Amount,
PayChannel = input.PayChannel
});
}
通过IPayAppService统一支付有如下好处:
- 统一支付(无论支付宝还是微信各种端的支付,均可统一)
- 自动记录交易日志以及进行相关逻辑处理
- 自定义数据依赖交易日志进行存储,而不依赖支付渠道,因此支持无业务参数的支付渠道,也支持存储更多自定义数据
非ABP集成
请参考Abp相关模块的封装或者历史代码。
问题排查
检查日志,相关环节基本上均有日志输出。系统初始化时会打印已注册的支付服务以及回调逻辑,回调时会打印回调进度。如已发起支付,可以查看数据库的交易日志表的数据来辅助排查问题。
相关QQ群
编程交流群<85318032>
官方博客/文档站
Magicodes.Pay已支持Volo Abp的更多相关文章
- Magicodes.SwaggerUI 已支持.NET Core 3.1
Magicodes.SwaggerUI 通过配置文件简单配置即可快速完成SwaggerUI的配置,包括: SwaggerUI的文档信息 API分组 API隐藏 API JSON生成(枚举.API架构I ...
- Magicodes.IE已支持导出Word、Pdf和Html
关于Magicodes.IE 导入导出通用库,通过导入导出DTO模型来控制导入和导出,支持Excel.Word.Pdf和Html. GitHub地址:https://github.com/xin-la ...
- Magicodes.Pay,打造开箱即用的统一支付库,已提供ABP模块封装
Magicodes.Pay,打造开箱即用的统一支付库,已提供ABP模块封装 简介 Magicodes.Pay,是心莱科技团队提供的统一支付库,相关库均使用.NET标准库编写,支持.NET Framew ...
- 开源库支付库Magicodes.Pay发布
Magicodes.Pay,是心莱科技团队提供的统一支付库,相关库均使用.NET标准库编写,支持.NET Framework以及.NET Core.目前支持以下支付方式和功能: 支付宝APP支付 支付 ...
- 使用Volo.Abp.MailKit发送邮件
Volo.Abp.MailKit封装继承MailKit库,为Abp邮件发送提供了快捷实现. 邮箱配置 qq邮箱支持smtp功能,需要去申请开通.参考qq邮箱设置,最重要的是smtp发送邮件,qq邮箱对 ...
- WebGL 支持测试,并已支持的浏览器版本摘要
WebGL 支持情况检測与已支持浏览器版本号汇总 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公 ...
- 开源:Taurus.MVC 框架 (已支持.NET Core)
为什么要创造Taurus.MVC: 记得被上一家公司忽悠去负责公司电商平台的时候,情况是这样的: 项目原版是外包给第三方的,使用:WebForm+NHibernate,代码不堪入目,Bug无限,经常点 ...
- IdentityServer4 中文文档 -3- (简介)已支持的规范
IdentityServer4 中文文档 -3- (简介)已支持的规范 原文:http://docs.identityserver.io/en/release/intro/specs.html 目 录 ...
- 那些ie6已支持的方法属性,成为事实标准。或者方便大家的api
很多api,都是ie6实现,后来其他w3c或其他浏览器支持,或者用类似的方法模拟 onselectionchange 判断选区改变 ,chrome已支持 Element.contains 判断元 ...
随机推荐
- Vulhub靶场搭建教程
Vulhub靶机环境搭建 Vulhub地址: Vulhub下载地址 一.所需环境 1.Ubuntu16.04 2.最新版本Docker 二.安装之路 1.下载Ubuntu16.04下载地址(迅雷下载6 ...
- ConfigurationManager姿势快闪
C# ConfigurationManager使用记录 最近一个祖传代码是使用.NET Fx写就的,我在使用控制台程序获取配置时有些折腾. 下面记录一些管理配置文件的姿势: Configuration ...
- 2021.03.13【NOIP提高A&B组】模拟 总结
T1 题目大意:从原点开始循环执行命令,问最后的位置 好吧这就是一道幼儿园的周期问题,模拟即可 #include<bits/stdc++.h> using namespace std; c ...
- SQL语句修改MySQL用户密码
SQL语句修改MySQL用户密码 前言 上数据库安全实验课,用命令行和DataGrip试图修改用户密码,一直语法报错.最后用Navicat才修改成功,预览Navicat的SQL语句,发现语句和网上都不 ...
- Django——表单
一.前言 看了下教程,以为表单很简单呢,结果搞了一两个钟才弄懂,哈哈哈,所以说不要小瞧每一件事. 先说明下HTTP请求: HTTP协议以"请求-回复"的方式工作.客户发送请求时,可 ...
- 牛亚男:基于多Domain多任务学习框架和Transformer,搭建快精排模型
导读: 本文主要介绍了快手的精排模型实践,包括快手的推荐系统,以及结合快手业务展开的各种模型实战和探索,全文围绕以下几大方面展开: 快手推荐系统 CTR模型--PPNet 多domain多任务学习框架 ...
- 合宙AIR105(三): 定时器, 定时器中断和PWM输出
目录 合宙AIR105(一): Keil MDK开发环境, DAP-Link 烧录和调试 合宙AIR105(二): 时钟设置和延迟函数 合宙AIR105(三): 定时器, 定时器中断和PWM输出 Ai ...
- Redis实现延迟队列的正确姿势
在之前探讨延时队列的文章中我们提到了 redisson delayqueue 使用 redis 的有序集合结构实现延时队列,遗憾的是 go 语言社区中并无类似的库.不过问题不大,没有轮子我们自己造. ...
- 关闭windows更新、设置自启动、提高开发机性能
做Java开发的朋友都知道,每次开机启动一堆的软件和工具,包括未写完的文档,是非常花时间的,加上一桌面的快捷方式,往往不是那么容易直接找到.windows的自动更新往往在凌晨自动启动,导致很多软件被异 ...
- POI导出复杂Excel,合并单元格(1)
/** * 导出复杂excel 合并单元格 (HSSFWorkbook) */ @GetMapping("/testHSSFWorkbook.do") public void te ...