随着微软的开源,越来越多的项目支持跨平台,但是各种支付平台提供的类库,又老又不支持跨平台,吐槽下,尤其是微信,还有好多坑,于是ICanPay诞生了,今天就来讲ICanPay是什么,怎么使用?

ICanPay是一个支持多商户多种支付方式的跨平台网关处理类库,使用ICanPay可以简化订单的创建、查询、退款和接收网关返回的支付通知等操作。

目前支持的支付网关有:支付宝(Alipay)、微信支付(Wechatpay)、银联支付(Unionpay)

下面以支付宝为例,其余两种支付,请参考Wiki

1. 配置商户数据

1.在Startup中添加商户数据

    services.AddICanPay(a =>
{
var gateways = new Gateways(); var merchant = new Merchant
{
AppId = "",
NotifyUrl = "",
ReturnUrl = "",
AlipayPublicKey = "",
Privatekey = ""
}; gateways.Add(new AlipayGateway(merchant)); return gateways;
});

2.在Startup中使用ICanPay

    app.UseICanPay();

以上就简单的完成了对ICanPay的配置操作

2.支付

ICanPay支持多种支付方式,下面就来讲解如何使用

1.获取支付网关

    private readonly IGateways gateways;

    public YourController(IGateways gateways)
{
this.gateways = gateways;
}

2.创建订单

    var order = new Order()
{
Amount = 0.01,
OutTradeNo = "订单号",
Subject = "测试",
};

3.设置支付方式

    var gateway = gateways.Get<AlipayGateway>(GatewayTradeType.Web);

4.支付

    gateway.Payment(order);

特殊说明:GatewayTradeType.Barcode支付方式,需要再实现PaymentSucceed和PaymentFailed事件

3.异步通知

1.获取支付网关

    private readonly IGateways gateways;

    public NotifyController(IGateways gateways)
{
this.gateways = gateways;
}

2.实现支付通知事件

    PaymentNotify notify = new PaymentNotify(gateways);
notify.PaymentSucceed += Notify_PaymentSucceed;
notify.PaymentFailed += Notify_PaymentFailed;
notify.UnknownGateway += Notify_UnknownGateway; private void Notify_PaymentSucceed(object sender, PaymentSucceedEventArgs e)
{
// 支付成功时时的处理代码
/* 建议添加以下校验。
* 1、需要验证该通知数据中的OutTradeNo是否为商户系统中创建的订单号,
* 2、判断Amount是否确实为该订单的实际金额(即商户订单创建时的金额),
*/
if (e.GatewayType == typeof(AlipayGateway))
{
var notify = (Notify)e.Notify;
}
} private void Notify_PaymentFailed(object sender, PaymentFailedEventArgs e)
{
// 支付失败时的处理代码
} private void Notify_UnknownGateway(object sender, UnknownGatewayEventArgs e)
{
// 无法识别支付网关时的处理代码
}

3.接收支付通知

    await notify.ReceivedAsync();

4.辅助接口

1.查询

    var notify = (Notify)gateway.Query(new Auxiliary
{
OutTradeNo = "订单号"
});

2.撤销

    var notify = (Notify)gateway.Cancel(new Auxiliary
{
OutTradeNo = "订单号"
});

3.关闭

    var notify = (Notify)gateway.Close(new Auxiliary
{
OutTradeNo = "订单号"
});

4.退款

    var notify = (Notify)gateway.Refund(new Auxiliary
{
OutTradeNo = "订单号",
RefundAmount = 123,
OutRefundNo = "退款单号"
});

5.退款查询

    var notify = (Notify)gateway.RefundQuery(new Auxiliary
{
OutTradeNo = "订单号",
OutRefundNo = "退款单号"
});

6.对账单下载

    gateway.BillDownload(new Auxiliary
{
BillType = "trade",
BillDate = "2017-10-31"
}); 以上就简单的讲解了如何使用ICanPay,如果有什么问题,也可以在Github上提问。
项目地址:ICanPay

C# 跨平台的支付类库ICanPay的更多相关文章

  1. PHP 支付类库, cURL开源HTTP类库

    未做任何测试 支付类库地址:http://doc.yurunsoft.com/PaySDK cURL开源HTTP类库地址:http://doc.yurunsoft.com/YurunHttp/1

  2. Visual Studio 调试技巧:10 篇热文汇总

    本文精选了 DotNet  2017年11月份的10篇热门文章.其中有技术分享.技术资源. 注:以下文章,点击标题即可阅读 <Visual Studio的调试技巧 > 调试技巧是衡量程序员 ...

  3. ICanPay介绍

    ICanPay介绍 ICanPay是一个支持多商户多种支付方式的跨平台网关处理类库,使用ICanPay可以简化订单的创建.查询.退款和接收网关返回的支付通知等操作. 目前支持的支付网关有:支付宝(Al ...

  4. ***CodeIgniter集成微信支付(转)

    微信支付Native扫码支付模式二之CodeIgniter集成篇  http://www.cnblogs.com/24la/p/wxpay-native-qrcode-codeigniter.html ...

  5. 微信支付Native扫码支付模式二之CodeIgniter集成篇

    CI:3.0.5 微信支付API类库来自:https://github.com/zhangv/wechat-pay 请先看一眼官方场景及支付时序图:https://pay.weixin.qq.com/ ...

  6. 从Java看跨平台的.NET需要些什么?

    跨平台的运行时(Runtime):JRE(JVM)  -> .NET Core CLR . 跨平台的编译器(Compiler):javac  -> Roslyn [github.com/d ...

  7. 微信支付开发-Senparc.Weixin.MP详解

    年底了,反而工作更忙了,我从15年11月开始写<1024伐木累>系列小说和爆笑对白,得到了很多身边的技术好友的支持,现在爆笑对白已经有越来越多的朋友一起帮着写段子,整理,包括小说内容的编辑 ...

  8. C#微信支付

    回归主题,16年1月初我对微信开发比较好奇,由于自己是一个比较喜欢钱的人,所以对支付功能颇为冲动,就用公司信息在微信平台申请了一个服务号,还给腾讯打赏了300大洋做了下认证,抽空看了下微信支付官方的文 ...

  9. tp5 -- 微信公众号支付

    近来期间比较忙, 忙完之后发现最近有挺多的东西没有整理,于是乎.就将以前用到的一些小东西整理了一下. 如果对您有帮助,则是我最大的幸运. 本篇主要是说了一下整合TP5的微信公众号支付. 不过由于最近T ...

随机推荐

  1. SQL Server2008安装教程

    SQL Server2008安装教程   第一步,打开文件,点击开始安装: 第二步,打开后点击左边项的安装,选择右边第一项: 第三步,点击确定: 第四步,选择接受服务条款,点击下一步: 第五步,按着一 ...

  2. Android Annotations(1)

    特性:   Android Annotations是一个开源的框架,用于加速 Android应用的开发,可以让你把重点放在功能的实现上,简化了代码,提升了可维护性. 特性: 依赖注入: inject ...

  3. Android的快速开发框架 afinal

    afinal 框架学习: http://www.oschina.net/p/afinal

  4. 在centos6编译配置httpd2.4的N种方法

    前言 我们使用linux的过程中,一定会用到httpd这个服务,在centos7上,默认安装的httpd就是2.4版本,大家都知道,2.4版本相对之前的版本已经做了改进,用起来更加方便,但是我们的ce ...

  5. SpringMVC Spring MyBatis整合配置文件

    1.spring管理SqlSessionFactory.mapper 1)在classpath下创建mybatis/sqlMapConfig.xml <?xml version="1. ...

  6. 基于Lua脚本解决实时数据处理流程中的关键问题

    摘要 在处理实时数据的过程中需要缓存的参与,由于在更新实时数据时并发处理的特点,因此在更新实时数据时经常产生新老数据相互覆盖的情况,针对这个情况调查了Redis事务和Lua脚本后,发现Redis事务并 ...

  7. Java8 函数式编程详解

    Java8 函数式编程详解 Author:Dorae Date:2017年11月1日23:03:26 转载请注明出处 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与S ...

  8. PHP内写css样式

    <1>php的两种输出方式 1,echo: 2,print; 栗子: <?php echo:"你好,我的名字是LHH"; print:"你好,我的名字是 ...

  9. Hat's Fibonacci

    Problem Description A Fibonacci sequence is calculated by adding the previous two members the sequen ...

  10. (纪念第一道完全自己想的树DP)CodeForces 219D Choosing Capital for Treeland

    Choosing Capital for Treeland time limit per test 3 seconds memory limit per test 256 megabytes inpu ...