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。主要步骤如下:

  1. 引用对应的Abp支付的Nuget包

如果仅需某个支付,仅需引用该支付的包。下面以通联支付为例,我们需要在工程中引用此包:

名称 说明 Nuget
Magicodes.Pay.Volo.Abp.Allinpay ABP VNext通联支付模块
  1. 添加模块依赖

在对应工程的Abp的模块(AbpModule)中,添加对“AbpAllinpayModule”的依赖,如:

    [DependsOn(typeof(AbpAllinpayModule))]
  1. 在DbContext中添加名为“TransactionLogs”的DbSet

整个支付过程中(无论是支付成功还是出现异常),均会记录交易日志。交易日志会记录交易过程中的一些信息,比如客户端信息、交易参数、自定义参数以及异常信息。因此我们需要针对EF添加对TransactionLog的支持。需要在DbContext中添加的完整代码如下所示:

public DbSet<TransactionLog> TransactionLogs { get; set; }
  1. 注册回调逻辑

我们需要实现“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不要重复。

  1. 向容器中注册回调逻辑

如未自动注册,可以使用以下代码进行手动注册:

    ontext.Services.AddTransient<IPaymentCallbackAction, TestPaymentCallbackAction>();

除了上面的方式,我们还可以通过注入IPaymentManager对象,通过其RegisterCallbackAction方法来注册自定义的回调逻辑。

  1. 配置支付参数

支付参数支持配置文件或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}

  1. 发起支付

配置完成后,就可以使用统一封装的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相关模块,则使用起来比较简单,具体您可以参考相关单元测试的编写。主要有以下步骤:

  1. 引用对应的Abp支付的Nuget包

如果仅需某个支付,仅需引用该支付的包。下面以通联支付为例,我们需要在工程中引用此包:

名称 说明 Nuget
Magicodes.Pay.Abp.Allinpay ABP 通联支付模块
  1. 添加模块依赖

在对应工程的Abp的模块(AbpModule)中,添加对“AbpAllinpayModule”的依赖,如:

    [DependsOn(typeof(AbpAllinpayModule))]
  1. 在DbContext中添加名为“TransactionLogs”的DbSet

整个支付过程中(无论是支付成功还是出现异常),均会记录交易日志。交易日志会记录交易过程中的一些信息,比如客户端信息、交易参数、自定义参数以及异常信息。因此我们需要针对EF添加对TransactionLog的支持。需要在DbContext中添加的完整代码如下所示:

public DbSet<TransactionLog> TransactionLogs { get; set; }
  1. 注册回调逻辑

我们需要实现“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不要重复。

  1. 向容器中注册回调逻辑

我们可以将回调逻辑写在一个公共的程序集,然后使用以下代码进行注册:

            IocManager.IocContainer.Register(
//注册自定义支付回调逻辑
Classes.FromAssembly(typeof(ApplicationCoreModule).GetAssembly())
.BasedOn<IPaymentCallbackAction>()
.LifestyleTransient()
.Configure(component => component.Named(component.Implementation.FullName))
.WithServiceFromInterface()
);

除了上面的方式,我们还可以通过注入IPaymentManager对象,通过其RegisterCallbackAction方法来注册自定义的回调逻辑。

  1. 配置支付参数

支付参数支持配置文件和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}

  1. 发起支付

配置完成后,就可以使用统一封装的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的更多相关文章

  1. Magicodes.SwaggerUI 已支持.NET Core 3.1

    Magicodes.SwaggerUI 通过配置文件简单配置即可快速完成SwaggerUI的配置,包括: SwaggerUI的文档信息 API分组 API隐藏 API JSON生成(枚举.API架构I ...

  2. Magicodes.IE已支持导出Word、Pdf和Html

    关于Magicodes.IE 导入导出通用库,通过导入导出DTO模型来控制导入和导出,支持Excel.Word.Pdf和Html. GitHub地址:https://github.com/xin-la ...

  3. Magicodes.Pay,打造开箱即用的统一支付库,已提供ABP模块封装

    Magicodes.Pay,打造开箱即用的统一支付库,已提供ABP模块封装 简介 Magicodes.Pay,是心莱科技团队提供的统一支付库,相关库均使用.NET标准库编写,支持.NET Framew ...

  4. 开源库支付库Magicodes.Pay发布

    Magicodes.Pay,是心莱科技团队提供的统一支付库,相关库均使用.NET标准库编写,支持.NET Framework以及.NET Core.目前支持以下支付方式和功能: 支付宝APP支付 支付 ...

  5. 使用Volo.Abp.MailKit发送邮件

    Volo.Abp.MailKit封装继承MailKit库,为Abp邮件发送提供了快捷实现. 邮箱配置 qq邮箱支持smtp功能,需要去申请开通.参考qq邮箱设置,最重要的是smtp发送邮件,qq邮箱对 ...

  6. WebGL 支持测试,并已支持的浏览器版本摘要

    WebGL 支持情况检測与已支持浏览器版本号汇总 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公 ...

  7. 开源:Taurus.MVC 框架 (已支持.NET Core)

    为什么要创造Taurus.MVC: 记得被上一家公司忽悠去负责公司电商平台的时候,情况是这样的: 项目原版是外包给第三方的,使用:WebForm+NHibernate,代码不堪入目,Bug无限,经常点 ...

  8. IdentityServer4 中文文档 -3- (简介)已支持的规范

    IdentityServer4 中文文档 -3- (简介)已支持的规范 原文:http://docs.identityserver.io/en/release/intro/specs.html 目 录 ...

  9. 那些ie6已支持的方法属性,成为事实标准。或者方便大家的api

    很多api,都是ie6实现,后来其他w3c或其他浏览器支持,或者用类似的方法模拟 onselectionchange  判断选区改变 ,chrome已支持 Element.contains   判断元 ...

随机推荐

  1. JS - 使用 html2canvas 将页面转PDF

    JS - 使用 html2canvas 将页面转PDF 本方法可以将页面元素块转为pdf. 网站地址 jspdf.js 官网地址:http://jspdf.com GitHub 主页:https:// ...

  2. 小样本利器1.半监督一致性正则 Temporal Ensemble & Mean Teacher代码实现

    这个系列我们用现实中经常碰到的小样本问题来串联半监督,文本对抗,文本增强等模型优化方案.小样本的核心在于如何在有限的标注样本上,最大化模型的泛化能力,让模型对unseen的样本拥有很好的预测效果.之前 ...

  3. Linux文本管理命令

    touch命令: 创建空文件:touch newfile 也可以使用重定向符(>)创建空文件: > newfile 刷新文件时间: touch 已经存在的文件 cp命令:文件的复制 选项: ...

  4. bat-安装程序-切换路径的问题(小坑)

    当批处理以管理员身份运行时,默认的cmd路径是 C:\Windows\system32 如果在批处理所在目录下存放了一些 安装程序,使用bat安装程序时,bat中去执行时 不会去当前目录去找 exe文 ...

  5. 内存泄漏定位工具之 valgrind 使用

    1 前言 前面介绍了 GCC 自带的 mtrace 内存泄漏检查工具,该篇主要介绍开源的内存泄漏工具 valgrind,valgrind 是一套 Linux 下,开放源代码的动态调试工具集合,能够检测 ...

  6. 实时数据引擎系列(五): 关于 SQL Server 与 SQL Server CDC

      摘要:在企业客户里, SQL Server 在传统的制造业依然散发着持久的生命力,SQL Server 的 CDC 复杂度相比 Oracle 较低, 因此标准的官方派做法就是直接使用这个 CDC ...

  7. ArrayList集合概述和基本使用和ArrayList集合的常用方法和遍历

    什么是ArrayList类 java.util.ArrayList 是大小可变的数组的实现,存储在内的数据称为元素.此类提供一些方法来操作内部存储 的元素. ArrayList 中可不断添加元素,其大 ...

  8. static 和 final(java)

    static: 1.1static修饰成员变量: 使用static修饰的成员变量不在对象的数据结构,而是类的基本信息(参数) 使用static修饰的成员可以直接使用,类名.成员的方式访问,而不需要再n ...

  9. java。多态

    package Demo.oop.APP.Demo05; public class application { public static void main(String[] args) { //一 ...

  10. 5-19 SpringAop | 切面编程

    Aop面向切面编程 什么是Aop 面向切面的程序设计(Aspect Oriented Programming)又译作剖面导向程序设计 和OOP(Object Oriented Programming) ...