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

转载于:https://www.cnblogs.com/varorbc/p/7890331.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET CORE 下收发邮件之 MAILKIT

背景利用代码发送邮件在工作中还是比较常见的&#xff0c;相信大家都用过SmtpClient来处理发送邮件的操作&#xff0c;不过这个类以及被标记已过时&#xff0c;所以介绍一个微软推荐的库MailKit来处理。MailKit开源地址&#xff1a;https://github.com/jstedfast/MailKit需要邮…

【20181026T2】**图【最小瓶颈路+非旋Treap+启发式合并】

题面 【错解】 最大最小&#xff1f;最小生成树嘛 蛤&#xff1f;还要求和&#xff1f; 点分治&#xff1f; 不可做啊 写了个MST暴力LCA&#xff0c;30pts&#xff0c;140多行 事后发现30分是给dijkstra的 woc 【正解】 树上计数问题&#xff1a;①并查集②启发式合并③点分治 …

java实现关键词云_Java synchronized 关键词详细说明

Java synchronized 关键词详细说明外置专业技能点系统进程和进程的定义进程建立方法进程的情况情况变换线程安全的定义synchronized 关键词的几类使用方法装饰非静态数据组员方式synchronized public void sync(){}装饰静态数据组员方式synchronized public static void sync()…

损失函数(Loss function) 和 代价函数(Cost function)

1损失函数和代价函数的区别&#xff1a; 损失函数(Loss function)&#xff1a;指单个训练样本进行预测的结果与实际结果的误差。 代价函数(Cost function)&#xff1a;整个训练集&#xff0c;所有样本误差总和(所有损失函数总和)的平均值。&#xff08;这一步体现在propagate()…

Hadoop/HDFS命令

Hadoop中文手册&#xff1a;http://hadoop.apache.org/docs/r1.0.4/cn/commands_manual.html 英文手册&#xff1a;http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/CommandsManual.html Hadoop fs命令 hadoop fs: 该命令可以用于其他文件系统&#x…

《Node.js 入门系列》—— 一些简单的排错方法(一)

目录 TypeError: undefined is not a functionTypeError: Cannot read property xxx of undefined 或者 TypeError: Cannot read property xxx of null检查变量是未赋值检查函数是否有返回值检查变量是否引用了某个对象不存在的属性检查调用函数时是否未该传递参数俗话说“常在…

内置IOC容器ServiceCollection

.NetCore内置IOC容器ServiceCollection一、IOC介绍IOC&#xff1a;全名(Inversion of Control)-控制反转IOC意味着我们将对象的创建控制权交给了外部容器&#xff0c;我们不管它是如何创建的&#xff0c;我们只需要知道&#xff0c;当我们想要某个实例时&#xff0c;我们可以直…

java中 有没有方法将浏览器标签栏去掉_用JS去掉IE窗口的标题栏,工具栏,地址栏...

前言:经常上网的朋友可能会到过这样一些网站&#xff0c;一进入首页立刻会弹出一个窗口&#xff0c;或者按一个连接或按钮弹出&#xff0c;通常在这个窗口里会显示一些注意事项、版权信息 、警告、欢迎光顾之类的话或者作者想要特别提示的信息。其实制作这样的页面效果非常的容…

React+Redux仿Web追书神器

引言 由于 10 月份做的 React Native 项目没有使用到 Redux 等库&#xff0c;写了一段时间想深入学习 React&#xff0c;有个想法想做个 demo 练手下&#xff0c;那时候其实还没想好要做哪一个类型的&#xff0c;也看了些动漫的&#xff0c;小说阅读&#xff0c;聚合资源的开源…

【算法】LeetCode算法题-Maximum Subarray

这是悦乐书的第154次更新&#xff0c;第156篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第13题&#xff08;顺位题号是53&#xff09;。给定一个整数数组nums&#xff0c;找出一个最大和&#xff0c;此和是由数组中索引连续的元素组成&#xff0c;至少包含一个…

windows配置solr5.5.2(不通过tomcat,使用内置jetty)

一、windows下配置solr5.5.2(不通过tomcat,使用内置jetty) 第一步&#xff1a;安装Jdk1.7 Solr5.5好像只支持Jdk1.7及以上的版本&#xff0c;没亲测&#xff0c;solr6.0是只支持jdk1.8及以上的&#xff0c;下图为启动solr时的截图&#xff1a; 如何在windows环境下配置jdk及验证…

java起源英文_Abbreviation 英文词组缩写(来源:南阳理工大学ACM)java

As we know, we often use a short sequence of characters in place of some words with a very long name. For example, ACM is an abbreviation of “Association for Computing Machinery”. Now we are using an acronymic method to get the abbreviation. An acronym i…

【C# Personal Handbook】运行环境

一、CLR、CLI、CTS、CLS、BCL、FCL简介CLI&#xff08;公共语言基础&#xff09;CLI是微软公司向ECMA提交的一份语言和数据格式规范&#xff0c;CLR是目前为止唯一一个公共语言基础的实现版本。CLI包括了公共类型系统&#xff08;CTS&#xff09;、公共中间语言&#xff08;CIL…

如何完善自己的知识结构

★领域 &#xff08;本来想用“学科”这个词&#xff0c;后来觉得“学科”的范畴还是偏小&#xff0c;就改用“领域”&#xff09;  按照传统的习惯&#xff0c;通常会把知识归类到不同的领域&#xff08;比如&#xff1a;文学、数学、计算机、烹调、等等&#xff09;。 ◇领…

MATLAB编程与应用系列-关于MATLAB编程入门教程的总体编写安排

本系列教程来源于出版设计《基于MATLAB编程基础与典型应用书籍》&#xff0c;如涉及版权问题&#xff0c;请联系&#xff1a;156204968qq.com。 出版社&#xff1a;人民邮电出版社&#xff0c; 页数&#xff1a;525。 本系列教程目前基于MATLABR2006a&#xff0c;可能对于更高级…

python语言特性-------python2.7教程学习【廖雪峰版】(一)

开始学习廖雪峰的py2.7教程&#xff1a; 2017年6月5日12:54:28 笔记&#xff1a; 廖雪峰python2.7教程1.用任何编程语言来开发程序&#xff0c;都是为了让计算机干活。 2.Python是一种相当高级的语言。代码少还不好&#xff1f;代码少的代价是运行速度慢。3.用Python可以做什么…

java调c++代码_Java中调用C++代码的实现 | 学步园

JNI为 Java Native Interface 即Java本地接口&#xff0c;使用此种方式可以对C/C代码进行调用&#xff0c;其在本质上是对C/C生成的动态库进行调用而不是直接对C/C代码进行调用Java代码如下&#xff1a;public class TestJNI{//JNI在本质上是调用C/C的动态库来实现的&#xff…

jeesite1.X 集成多数据源

2019独角兽企业重金招聘Python工程师标准>>> 网上看了几个例子&#xff0c;都是相同数据源的动态切换&#xff0c;如果不是同一种数据库类型&#xff0c;分页查询就出问题。经过研究解决问题。 jeesite.properties配置多数数据源地址,这里以mysql5.7和sqlserver2008…

k8s HPA(HorizontalPodAutoscaler)-自动水平伸缩

Horizontal Pod Autoscaling in Kubernetes写在前面我们平时部署web服务&#xff0c;当服务压力大撑不住的时候&#xff0c;我们会加机器(加钱)&#xff1b;一般没有上容器编排是手动加的&#xff0c;临时加的机器&#xff0c;临时部署的服务还要改Nginx的配置&#xff0c;最后…

jQuery 基金会和 Dojo 基金会合并:Open Web

统一基金会&#xff0c;服务开发人员&#xff0c;推动开放 Web 技术发展jQuery 基金会和 Dojo 基金会今天宣布计划联合&#xff0c;旨在建立最大&#xff0c;最多样化和最全面的基金会&#xff0c;通过服务开发者&#xff0c;他们的项目&#xff0c;他们的社区来构建开放的 Web…