C# 跨平台的支付类库ICanPay
随着微软的开源,越来越多的项目支持跨平台,但是各种支付平台提供的类库,又老又不支持跨平台,吐槽下,尤其是微信,还有好多坑,于是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的更多相关文章
- PHP 支付类库, cURL开源HTTP类库
未做任何测试 支付类库地址:http://doc.yurunsoft.com/PaySDK cURL开源HTTP类库地址:http://doc.yurunsoft.com/YurunHttp/1
- Visual Studio 调试技巧:10 篇热文汇总
本文精选了 DotNet 2017年11月份的10篇热门文章.其中有技术分享.技术资源. 注:以下文章,点击标题即可阅读 <Visual Studio的调试技巧 > 调试技巧是衡量程序员 ...
- ICanPay介绍
ICanPay介绍 ICanPay是一个支持多商户多种支付方式的跨平台网关处理类库,使用ICanPay可以简化订单的创建.查询.退款和接收网关返回的支付通知等操作. 目前支持的支付网关有:支付宝(Al ...
- ***CodeIgniter集成微信支付(转)
微信支付Native扫码支付模式二之CodeIgniter集成篇 http://www.cnblogs.com/24la/p/wxpay-native-qrcode-codeigniter.html ...
- 微信支付Native扫码支付模式二之CodeIgniter集成篇
CI:3.0.5 微信支付API类库来自:https://github.com/zhangv/wechat-pay 请先看一眼官方场景及支付时序图:https://pay.weixin.qq.com/ ...
- 从Java看跨平台的.NET需要些什么?
跨平台的运行时(Runtime):JRE(JVM) -> .NET Core CLR . 跨平台的编译器(Compiler):javac -> Roslyn [github.com/d ...
- 微信支付开发-Senparc.Weixin.MP详解
年底了,反而工作更忙了,我从15年11月开始写<1024伐木累>系列小说和爆笑对白,得到了很多身边的技术好友的支持,现在爆笑对白已经有越来越多的朋友一起帮着写段子,整理,包括小说内容的编辑 ...
- C#微信支付
回归主题,16年1月初我对微信开发比较好奇,由于自己是一个比较喜欢钱的人,所以对支付功能颇为冲动,就用公司信息在微信平台申请了一个服务号,还给腾讯打赏了300大洋做了下认证,抽空看了下微信支付官方的文 ...
- tp5 -- 微信公众号支付
近来期间比较忙, 忙完之后发现最近有挺多的东西没有整理,于是乎.就将以前用到的一些小东西整理了一下. 如果对您有帮助,则是我最大的幸运. 本篇主要是说了一下整合TP5的微信公众号支付. 不过由于最近T ...
随机推荐
- Vuex state 状态浅解
对于Vuex中的state里面的理解总是有些欠缺,机制似乎理解了.但是还有很多的不足,在这就先浅谈下自己的理解. vuex 机制中,定义了全局Store,在各个vue组件面的this.$store指向 ...
- CountDownLatch、CyclicBarrier和 Semaphore比较
1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同: CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行: ...
- QT:用QWebSocket实现webchannel,实现C++与HTML通信
基本原理是通过channel将C++对象暴露给HTML,在HTML中调用qwebchannel.js.前提是建立transport,QT只提供了一个抽象基类QWebChannelAbstractTra ...
- javascript入门知识点总结(一)
学了几天javascript,现总结一下原生javascript的基本知识点. 一.javascript基本知识 变量 定义: var a = 123; var b = 'abc'; //连写 var ...
- Asp.net MVC4高级编程学习笔记-模型学习第四课基架与模型绑定20171027
MVC模型 一.构建基架. MVC中的基架可以为应用程序提供CURD各种功能生成所需要的样板代码.在添加控制器的时候可以选择相应的模板以及实体对象来生成相应的模板代码. 首先定义一个模型类如下所示: ...
- 记一次mysql千万订单汇总查询优化
公司订单系统每日订单量庞大,有很多表数据超千万.公司SQL优化这块做的很不好,可以说是没有做,所以导致查询很慢. 正题 节选某个功能中的一句SQL EXPLAIN 查看执行计划 EXPLAIN + S ...
- TensorFlow Object Detection API(Windows下训练)
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 最近事情比较多,前面坑挖的有点久,今天终于有时间总结一下,顺便把Windows下训练跑通.Li ...
- datagrid参数queryParams--easyUI
datagrid参数queryParams--easyUI Html <div region="center" border="false&qu ...
- 工具:Entity Framework Profiler
使用方式: 1.项目中添加引用:EntityFrameworkProfiler.Appender 2.应用程序启动方法中添加下面一行代码: HibernatingRhinos.Profiler.App ...
- Can you find it?
Can you find it? Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others) T ...