ICanPay 统一支付网关

https://github.com/hiihellox10/ICanPay 统一支付网关。对原代码优化。支持NET46和NETSTANDARD2_0。支持支付宝,微信,银联支付渠道通过Web,App,Wap,QRCode方式支付。简化订单的创建、查询、退款跟接收网关返回的支付通知等功能

初始网关信息

NET46,需依赖AuotoFac组件

     var builder = new ContainerBuilder();builder.RegisterControllers(typeof(MvcApplication).Assembly);builder.Register(c =>{                var gateways = new Gateways();gateways.Add(new AlipayGateway(){Merchant = new Merchant(){AppId = ConfigurationManager.AppSettings["alipay.appid"],Partner = ConfigurationManager.AppSettings["alipay.partner"],Email = ConfigurationManager.AppSettings["alipay.seller_email"],Key = ConfigurationManager.AppSettings["alipay.key"],PublicKey = ConfigurationManager.AppSettings["alipay.publicKey"],PrivateKey = ConfigurationManager.AppSettings["alipay.privateKey"],NotifyUrl = new Uri(ConfigurationManager.AppSettings["alipay.notify_url"]),ReturnUrl = new Uri(ConfigurationManager.AppSettings["alipay.return_url"]),}});               return gateways;}).As<IGateways>().InstancePerDependency();            //autofac 注册依赖IContainer container = builder.Build();DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

NETSTANDARD2_0,在Startup初始化

    public void ConfigureServices(IServiceCollection services) {services.AddMvc();services.AddSingleton<IConfiguration>(Configuration);services.AddICanPay(a =>{                var gateways = new Gateways();gateways.Add(new AlipayGateway(){Merchant = new Merchant(){AppId = Configuration["alipay:appid"],Partner = Configuration["alipay:partner"],Email = Configuration["alipay:seller_email"],Key = Configuration["alipay:key"],PublicKey = Configuration["alipay:publicKey"],PrivateKey = Configuration["alipay:privateKey"],NotifyUrl = new Uri(Configuration["alipay:notifyurl"]),ReturnUrl = new Uri(Configuration["alipay:returnurl"]),}});               return gateways;});}

WebPayment(网站支付)

   public void CreateOrder(GatewayType gatewayType) {         
var gateway = gateways.Get(gatewayType, GatewayTradeType.Web);
var paymentSetting = new PaymentSetting(gateway);paymentSetting.Order = new Order(){OrderAmount = 0.01,OrderNo = DateTime.Now.ToString("yyyyMMddhhmmss"),Subject = "WebPayment",PaymentDate = DateTime.Now};paymentSetting.Payment();}

WapPayment(手机网站支付)

    public void CreateOrder(GatewayType gatewayType) {         
var gateway = gateways.Get(gatewayType, GatewayTradeType.Wap);
var paymentSetting = new PaymentSetting(gateway);paymentSetting.Order = new Order(){OrderAmount = 0.01,OrderNo = DateTime.Now.ToString("yyyyMMddhhmmss"),Subject = "WapPayment",PaymentDate = DateTime.Now};paymentSetting.Payment();}

QRCodePayment(二维码支付)

        public void CreateOrder(GatewayType gatewayType) {          
var gateway = gateways.Get(gatewayType, GatewayTradeType.QRCode);
var paymentSetting = new PaymentSetting(gateway);paymentSetting.Order = new Order(){OrderAmount = 0.01,OrderNo = DateTime.Now.ToString("yyyyMMddhhmmss"),Subject = "QRCodePayment",PaymentDate = DateTime.Now};paymentSetting.Payment();}

AppPayment(手机APP支付)

        public JsonResult CreateOrder(GatewayType gatewayType) {    
var gateway = gateways.Get(gatewayType, GatewayTradeType.APP);
var paymentSetting = new PaymentSetting(gateway);paymentSetting.Order = new Order(){OrderAmount = 0.01,OrderNo = DateTime.Now.ToString("yyyyMMddhhmmss"),Subject = "AppPayment",PaymentDate = DateTime.Now}; return Json(paymentSetting.Payment());}

QueryPayment(查询订单)

    public void QueryOrder(GatewayType gatewayType) {       
var gateway = gateways.Get(gatewayType);
var querySetting = new PaymentSetting(gateway);
// 查询时需要设置订单的Id与金额,在查询结果中将会核对订单的Id与金额,如果不相符会返回查询失败。querySetting.Order.OrderNo = "20";querySetting.Order.OrderAmount = 0.01;
if (querySetting.QueryNow()){ // 订单已支付}}

Refund(退款和退款查询)

    public void CreateRefund(GatewayType gatewayType) {         
var gateway = gateways.Get(gatewayType);
var paymentSetting = new PaymentSetting(gateway);
if (paymentSetting.CanRefund){ var refund = new Refund();refund.OutRefundNo = "000000000000000";paymentSetting.BuildRefund(refund);paymentSetting.BuildRefundQuery(refund);}}

Notify(异步通知)

        private readonly IGateways gateways;        
private PaymentNotify notify;
public NotifyController(IGateways gateways) {
this.gateways = gateways;notify = new PaymentNotify(gateways.Merchants);notify.PaymentSucceed += new PaymentSucceedEventHandler(notify_PaymentSucceed);notify.PaymentFailed += new PaymentFailedEventHandler(notify_PaymentFailed);notify.UnknownGateway += new UnknownGatewayEventHandler(notify_UnknownGateway);}
public void ServerNotify() { // 接收并处理支付通知notify.Received(PaymentNotifyMethod.ServerNotify);}

public void AutoReturn() { // 接收并处理支付通知notify.Received(PaymentNotifyMethod.AutoReturn);}
private void notify_PaymentSucceed(object sender, PaymentSucceedEventArgs e) {
// 支付成功时时的处理代码if (e.PaymentNotifyMethod == PaymentNotifyMethod.AutoReturn){ // 当前是用户的浏览器自动返回时显示充值成功页面} else{ // 支付结果的发送方式,以服务端接收为准}}

private void notify_PaymentFailed(object sender, PaymentFailedEventArgs e) {
// 支付失败时的处理代码}
private void notify_UnknownGateway(object sender, UnknownGatewayEventArgs e) {
// 无法识别支付网关时的处理代码}


原文: https://github.com/milanyangbo/ICanPay

相关文章: 

  • C# 跨平台的支付类库ICanPay


原文:https://github.com/milanyangbo/ICanPay


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

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

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

相关文章

2021未来职业规划以及对过去的总结

我已经好久没写博客了&#xff0c;记得上次写博客还是去年很久的时候&#xff0c;转眼间&#xff0c;打开csdn&#xff0c;有好多评论和私信&#xff0c;都没来得及回复。这段时间真的很忙&#xff0c;但也的确是我人生中比较重要的时刻&#xff0c;有选择&#xff0c;有犹豫&a…

P2834-能力测验【数论,整除分块】

正题 题目链接:https://www.luogu.org/problemnew/show/P2834 题目大意 求∑i1n∑j1m(n%i)∗(m%j)∗(i!j)\sum_{i1}^n\sum_{j1}^m(n\%i)*(m\%j)*(i!j)i1∑n​j1∑m​(n%i)∗(m%j)∗(i!j) 解题思路 ∑i1n(n%i)∗∑j1m(m%j)−∑i1min{n,m}(n%i)∗(m%i)\sum_{i1}^n(n\%i)*\sum_{…

使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例)

引子这一篇文章将用一个完整的实例&#xff0c;给大家介绍如何基于dotnet core&#xff08;微软.NET的最新版本&#xff0c;支持跨平台&#xff0c;跨设备的应用开发&#xff0c;详情请参考 https://www.microsoft.com/net 开发一个Web API Service&#xff0c;并且利用Azure的…

如何基于Canal 和 Kafka,实现 MySQL 的 Binlog 近实时同步

转载自 如何基于Canal 和 Kafka&#xff0c;实现 MySQL 的 Binlog 近实时同步 近段时间&#xff0c;业务系统架构基本完备&#xff0c;数据层面的建设比较薄弱&#xff0c;因为笔者目前工作重心在于搭建一个小型的数据平台。优先级比较高的一个任务就是需要近实时同步业务系统…

spring boot添加swagger步骤

在xml中添加如下代码 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version></dependency><dependency><groupId>io.springfox</groupId><…

P1332,nssl1316-血色先锋军【bfs】

正题 题目链接:https://www.luogu.org/problemnew/show/P1332 题目大意 对于每个领主求与最近的感染源的距离 解题思路 那么水还要我讲&#xff1f;&#xff1f;&#xff1f; codecodecode #include<cstdio> #include<algorithm> #include<queue> using …

采用Opserver来监控你的ASP.NET项目系列(二、监控SQL Server与Asp.Net项目)

前言之前有过2篇关于如何监控ASP.NET core项目的文章,有兴趣的也可以看看.ASP.NET Core之跨平台的实时性能监控ASP.NET Core之跨平台的实时性能监控(2.健康检查)今天我们主要来介绍一下,如何使用Opserver监控我们的SQL Server 和ASP.NET项目的异常监控监控效果如下:SQL Server的…

Spring Boot 参数校验 Validation 入门

转载自 芋道 Spring Boot 参数校验 Validation 入门 本文在提供完整代码示例&#xff0c;可见 https://github.com/YunaiV/SpringBoot-Labs 的 lab-22 目录。 原创不易&#xff0c;给点个 Star 嘿&#xff0c;一起冲鸭&#xff01; 1. 概述 在想标题的时候&#xff0c;到底应该…

用turtle画皮卡丘

如何绘制皮卡丘 画左偏曲线函数 setheading属性的作用是什么&#xff1f; def radian_left(ang,dis,step,n):for i in range(n):disstep #dis增大stept.lt(ang) #向左转ang度t.fd(dis) #向前走dis的步长画右偏曲线函数 def radian_right(ang,dis,step,n):for i in range(n)…

nssl1317-灵魂分流药剂【分组背包,二维费用背包】

正题 题目大意 一个二维费用的分组背包 NoNoNo解题思路 codecodecode #include<cstdio> #include<algorithm> using namespace std; const int N110; int n,m,A,B,w[N],v[N],t[N],p[N],f[11][N][N]; int main() {scanf("%d%d%d%d",&n,&m,&…

Orchard Core一分钟搭建ASP.NET Core CMS

Orchard Core 是Orchard CMS的ASP.NET Core版本。Orchard Core是全新一代的ASP.NET Core CMS。官方文档介绍&#xff1a;http://orchardcore.readthedocs.io/en/latest/GitHub: https://github.com/OrchardCMS/OrchardCore下面快速开始搭建CMS新建项目打开VS2017 新建一个CMSWe…

在Linux系统上部署java web项目

将Spring boot项目打成jar包后放在服务器进行运行&#xff1a; 部署命令&#xff1a; nohup java -jar mybatis-0.0.1-SNAPSHOT.jar >output 2>&1 &查看进程&#xff1a; ps aux杀死服务器进程&#xff1a; kill -9 PID

nssl1318-地铁重组【dp】

正题 题目大意 n个东西依次进入一个容量为p的栈&#xff0c;求出栈的序列数量。 解题思路 设fi,jf_{i,j}fi,j​表示iii个已经进过栈了(不管还有没有出)&#xff0c;jjj个还在栈里。 首先是将现在这个进栈fi−1,j−1f_{i-1,j-1}fi−1,j−1​&#xff0c;然后是出栈fi,j1f_{i,…

面试:你说你精通Java并发,给我讲讲Java并发之J.U.C

转载自 面试&#xff1a;你说你精通Java并发&#xff0c;给我讲讲Java并发之J.U.C J.U.C J.U.C即java.util.concurrent包&#xff0c;为我们提供了很多高性能的并发类&#xff0c;可以说是java并发的核心。 J.U.C和CAS和Unsafe和AQS Concurrent包下所有类底层都是依靠CAS操…

.Net Core配置与自动更新

.Net Core 将之前Web.Config中的配置迁移到了appsettings.json文件中&#xff0c;并使用ConfigurationBuilder来读取这个配置文件。并可设置在配置文件变化以后&#xff0c;自动重新加载&#xff0c;这样可不用重启你的程序。12345var builder new ConfigurationBuilder().Set…

校园中介骗子

五一不回去就想着做个兼职&#xff0c;正好在学校群里看到了相关信息&#xff0c;就想丰富下自己的阅历。但是遇到了个黑心中介&#xff0c;专骗押金的。 我真的非常生气&#xff0c;不是说押金多少&#xff0c;而是这个行为&#xff0c;你发的信息上说的好的可以做一天&#x…

nssl1319-埃雷萨拉斯寻宝【SPFA,建图】

正题 题目大意 从第一列出发&#xff0c;到最后一列&#xff0c;然后可以传送到相同的魔法格里&#xff0c;经过不同的魔法格会损伤不同的生命(如果之前经过过就不会)。求最大剩余生命。 解题思路 因为相同的魔法格可以传送&#xff0c;所以你肯定不会回到相同的魔法格两次&a…

闲话权限系统的设计

一、权限的本质权限管理&#xff0c;首先要理清权限的本质&#xff1a;权限就是对受保护资源的有限许可访问。理解了权限的本质&#xff0c;就好谈权限的管理了。权限就是对受保护资源的有限许可访问--这句话包含两层含义&#xff1a;1&#xff0c;受保护的资源2&#xff0c;有…

初级Java开发与架构之间的差距不仅仅是开发时间

转载自 初级Java开发与架构之间的差距不仅仅是开发时间 一、基础篇 JVM JVM内存结构 堆、栈、方法区、直接内存、堆和栈区别 Java内存模型 内存可见性、重排序、顺序一致性、volatile、锁、final 垃圾回收 内存分配策略、垃圾收集器&#xff08;G1&#xff09;、GC算法…

欢乐SSL初二组周六赛【2019.4.27】

前言 AK???AK???AK??? 成绩 只放前101010&#xff0c;然后T3T3T3数据锅了一会 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCCDDD1112017WYC2017WYC2017WYC4004004001001001001001001001001001001001001002222016LJW2016LJW2016LJW39039039010010010010010…