基于.Net Core开发的支付SDK,简化支付功能开发

news2024/11/16 10:49:22

更多开源项目请查看:一个专注推荐.Net开源项目的榜单

在我们做项目中,不管是电商系统、外卖系统、还是上门维修系统等等,都需要支付功能,这就需要我们与第三方支付平台进行对接,但是第三方平台文档,往往都存在很多小细节问题,基本都需要靠调试来完成支付功能,特别是第三平台升级后,我们又需要进行调整,极其浪费时间。

所以,今天给大家推荐一个基于.Net Core开发的支付SDK,让我们可以快速集成支付功能。

项目简介

这是基于.NetCore 开发的支付SDK,支持微信支付、支付宝支付平台,作者一直在迭代升级,支持最新版本.Net Core 7。

技术架构

1、跨平台:这是基于.NetCore开发的系统,可以部署在Docker,Windows,Linux,Mac;

项目结构

图片

src文件夹为支付宝、微信SDK源码,samples文件夹为示例源码。

SDK功能

1、支持:支付宝、微信支付平台,封装了的所有API,简化操作。

2、微信:支持V2、V3版本。

3、示例代码:包含二维码/条码/声波支付、网页支付、H5支付、APP支付,以及退款流程、订单查等功能的示例。

使用示例

支付宝网页支付,前端源码

<form asp-controller="Alipay" asp-action="PagePay" target="_blank">
    <div asp-validation-summary="All" class="text-danger"></div>
    <div class="form-group">
        <label asp-for="OutTradeNo"></label>
        <input type="text" class="form-control" asp-for="OutTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
    </div>
    <div class="form-group">
        <label asp-for="Subject"></label>
        <input type="text" class="form-control" asp-for="Subject" value="电脑网站支付测试" />
    </div>
    <div class="form-group">
        <label asp-for="ProductCode"></label>
        <input type="text" class="form-control" asp-for="ProductCode" value="FAST_INSTANT_TRADE_PAY" />
    </div>
    <div class="form-group">
        <label asp-for="Body"></label>
        <input type="text" class="form-control" asp-for="Body" value="电脑网站支付描述信息" />
    </div>
    <div class="form-group">
        <label asp-for="TotalAmount"></label>
        <input type="text" class="form-control" asp-for="TotalAmount" value="0.01" />
    </div>
    <div class="form-group">
        <label asp-for="ReturnUrl"></label>
        <input type="text" class="form-control" asp-for="ReturnUrl" value="http://domain.com/alipay/return/pagepay" />
    </div>
    <div class="form-group">
        <label asp-for="NotifyUrl"></label>
        <input type="text" class="form-control" asp-for="NotifyUrl" value="http://domain.com/alipay/notify/pagepay" />
    </div>
    <button type="submit" class="btn btn-primary">提交请求</button>
</form>

后端源码

处理前端请求的参数,并提交至支付宝。

/// <summary>
/// 电脑网站支付
/// </summary>
/// <param name="viewModel"></param>
[HttpPost]
public async Task<IActionResult> PagePay(AlipayTradePagePayViewModel viewModel)
{
    var model = new AlipayTradePagePayModel
    {
        Body = viewModel.Body,
        Subject = viewModel.Subject,
        TotalAmount = viewModel.TotalAmount,
        OutTradeNo = viewModel.OutTradeNo,
        ProductCode = viewModel.ProductCode
    };
    var req = new AlipayTradePagePayRequest();
    req.SetBizModel(model);
    req.SetNotifyUrl(viewModel.NotifyUrl);
    req.SetReturnUrl(viewModel.ReturnUrl);

    var response = await _client.PageExecuteAsync(req, _optionsAccessor.Value);
    return Content(response.Body, "text/html", Encoding.UTF8);
}

支付成功异步回调

/// <summary>
/// 电脑网站支付异步通知
/// </summary>
[Route("pagepay")]
[HttpPost]
public async Task<IActionResult> PagePay()
{
    try
    {
        var notify = await _client.CertificateExecuteAsync<AlipayTradePagePayNotify>(Request, _optionsAccessor.Value);
        switch (notify.TradeStatus)
        {
            case AlipayTradeStatus.Success: // 支付成功
                _logger.LogInformation("电脑网站支付异步通知-交易支付成功 => OutTradeNo: " + notify.OutTradeNo);
                return AlipayNotifyResult.Success;
            case AlipayTradeStatus.Closed: // 交易关闭
                _logger.LogInformation("电脑网站支付异步通知-未付款交易超时关闭,或支付完成后全额退款 => OutTradeNo: " + notify.OutTradeNo);
                return AlipayNotifyResult.Success;
            case AlipayTradeStatus.Finished: // 交易完结
                _logger.LogInformation("电脑网站支付异步通知-交易结束,不可退款 => OutTradeNo: " + notify.OutTradeNo);
                return AlipayNotifyResult.Success;
            default:
                return AlipayNotifyResult.Failure;
        }
    }
    catch (AlipayException ex)
    {
        _logger.LogWarning("出现异常: " + ex.Message);
        return AlipayNotifyResult.Failure;
    }}

项目地址

Github:

https://github.com/essensoft/paylink

Gitee:

https://gitee.com/essensoft/paylink

- End -

推荐阅读

一个简单、功能完整的WMS仓库管理系统
推荐一个.Net分布式微服务开发框架
一款统计摸鱼时长的开源项目
一个基于.Net开发齐全的加密库
用C#自己动手写个操作系统,爽!

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

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

相关文章

05语法分析——自下而上分析

文章目录一、自下而上分析基本问题二、算符优先分析构造FIRSTVT(P)的算法构造LASTVT(P)的算法构造优先表的算法三、LR分析法1.LR(0)构造LR(0)项目集规范族构造识别活前缀的DFA构造LR(0)分析表2.SLRSLR解决冲突办法SLR(1)分析表的构造算法3.LR(1)【规范LR】LR(1)项目集I的闭包状…

【MySQL基础】运算符及相关函数详解

序号系列文章3【MySQL基础】MySQL基本数据类型4【MySQL基础】MySQL表的七大约束5【MySQL基础】字符集与校对集详解6【MySQL基础】MySQL单表操作详解文章目录前言MySQL运算符1&#xff0c;算术运算符1.1&#xff0c;算术运算符的基本使用1.2&#xff0c;常用数学函数的基本使用2…

iOS:OpenGLES 实验室之2D篇 第一弹 の 智能弹幕

本文字数&#xff1a;3046字预计阅读时间&#xff1a;15 分钟iOS&#xff1a;OpenGLES 实验室之2D篇 第一弹 の 智能弹幕笔者之前发表的音视频文章&#xff0c;有图像的处理&#xff0c;音频的重采样等等&#xff0c;都属于入门级别。通过阅读它们&#xff0c;读者能对音视频有…

【复习 自用】JavaScript知识汇总(DOM)

注&#xff1a;之前学过JavaScript&#xff0c;本贴仅用于复习(自用)&#xff0c;建议没基础的朋友先学基础。会混入typescript&#xff01; 更新中~~~~~ Dom核心内容 创建节点 ① document.write() 是直接将内容写入页面的内容流&#xff0c;但是文档流执行完毕&#xff0c…

云原生技能树-docker caontainer 操作

运行 一个Docker镜像(image)运行后&#xff0c;就是一个容器实例&#xff0c;称为container 以镜像hello-world为例&#xff0c;启动容器&#xff1a; docker container run -it hello-world 可以看到输出了Hello World 信息&#xff1a; 以下描述错误的是&#xff1f; 答…

数字逻辑理论——从卡诺图到门电路

卡诺图化简 卡诺图化简 第一步&#xff1a;在卡诺图中圈出相邻为1的小方格&#xff08;方格的个数为2m2^{m}2m&#xff09;&#xff0c;圈里面的1越多越好&#xff0c;并且这个小方格可以重复使用。 第二步&#xff1a;上一步中的方格或者圈出来的方框——每一个都代表一个与…

Linux软件安装及管理程序

Linux安装及管理程序Linux软件安装及管理程序一、Linux应用程序基础二、RPM软件包管理工具2.1、RPM介绍2.2、RPM命令三、源码编译安装四、yum安装Linux软件安装及管理程序 一、Linux应用程序基础 应用程序与系统命令的关系 角色系统命令应用程序文件位置般在/bin和/sbin目录…

linux系统中实现智能家居的基本方法

大家好&#xff0c;今天主要和大家分享一下&#xff0c;智能家居物联网的基本实现与操作方法。 目录 第一&#xff1a;智能家居基本简介 第二&#xff1a;测试WIFI模块功能 第三&#xff1a;智能家居物联UI界面开发 第四&#xff1a;核心代码的具体实现 第五&#xff1a;最…

【阅读笔记】《重构》 第三四章

第三章 代码的味道 DuplicatedCode(重复代码) 同一个类的两个函数含有相同的表达式两个互为兄弟的子类含有相同表达式两个毫不相干的类出现重复代码 LongMethod(过长函数) 函数不宜过长&#xff0c;函数越长越难理解如果想利用单个类做太多事情&#xff0c;其内往往就会出现…

联合证券|港股再融资“春江水暖” 资本争购热门赛道企业

进入2023年&#xff0c;港股再融资商场有所回暖。到1月18日&#xff0c;已有27家港股上市公司发布拟配售股份&#xff08;简称“配股”&#xff09;再融资&#xff0c;募资总额164.01亿港元&#xff0c;较上一年同期增加148.16%。其间&#xff0c;微盟集团的配股再融资吸引了众…

fpga实操训练(lcd测试)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面我们测试过vga输出,当时是找了一个老式的显示器来完成的,也就是本身自带vga接口的显示器。但是,现在市面上大部分显示器都是默认支持hdmi接口的。所以说,如果真的想用fpga测…

都说InnoDB好,那还要不要使用Memory引擎?

我在上一篇文章末尾留给你的问题是:两个 group by 语句都用了 order by null,为什么使用内存临时表得到的语句结果里,0 这个值在最后一行;而使用磁盘临时表得到的结果里,0 这个值在第一行? 今天我们就来看看,出现这个问题的原因吧。 内存表的数据组织结构 为了便于分…

如何在SpringBoot项目中访问静态资源

在springboot项目中如果要在不集成templates的情况下访问静态资源需要做以下配置 1.在项目的application.yml文件中做如下配置 spring:profiles:active: devmvc:view:prefix: /suffix: .html 重点在 配置后生成为WebMvcProperties 配置类。该配置类中有一个内部类View Conf…

各式各样图标的特点

笔者近期在翻看各种样式的图标&#xff0c;逛了下 Iconfont、IconFinder 等图标网站&#xff0c;现根据自己的经验&#xff0c;总结了一些图标特点的描述用语 线性/面性/线面组合平面/立体无层次感&#xff08;或阴影&#xff09;/有层次感&#xff08;或阴影&#xff09;无填…

Oracle强制加了hint实效三种连接方式使用场合判断

开发写了一个语句使用了connect by level函数 SELECT DISTINCT CTMID FROM ( SELECT CTMID, REGEXP_SUBSTR(FLTUSERIDSTR, ‘[^;]’, 1, l) AS userid FROM s_userinfo,(SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<300) b WHERE l < LENGTH(FLTUSERIDSTR) - LENGTH(rege…

链表的算法题

目录 题型一、克隆含有rand指针的链表 笔试&#xff1a;哈希表 面试&#xff1a;不用容器&#xff0c;模拟哈希表的功能 题型二、给一个单链表头节点Head&#xff0c;判断是否构成回文 题型三、将单链表按某值划分为左边小&#xff0c;中间相等&#xff0c;右边大 6个变量…

Allegro如何设置创建Pin Pair的快捷键操作指导

Allegro如何设置创建Pin Pair的快捷键操作指导 在做PCB设计的时候需要做一组信号的等长,需要使用到创建Pin Pair的功能,如下图,如果每个网络都右键去选择添加比较浪费时间,如下图 Allegro支持给创建一个Create Pin Pair的快捷键位 具体操作如下 打开规则管理器选择Tools

单调栈与单调队列

单调栈与单调队列一、单调栈1.1 思路1.2 例题&#xff1a;单调栈二、单调队列2.1 思路2.2 例题&#xff1a;滑动窗口一、单调栈 1.1 思路 单调栈主要解决以下问题&#xff1a; 1️⃣ 寻找下一个更大元素 2️⃣ 寻找前一个更大元素 3️⃣ 寻找下一个更小元素 4️⃣ 寻找前一个…

理性和感性 - 如何对待错误

上次的博客&#xff0c; 我写了一些关于 软件开发中的理性和感性决定 的故事。 不论是感性还是理性&#xff0c;我们的目的就是要把软件交给用户去用&#xff0c; 在软件行业中有这样一句俗话&#xff1a; 当你把产品交给用户的时候&#xff0c;你的学习才刚刚开始。 当然每个团…

【设计模式】结构型模式·桥接模式

学习汇总入口【23种设计模式】学习汇总(数万字讲解体系思维导图) 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01; 一.概述 将抽象与实现分离&#xff0c;使它们可以独立变化。用组合关系代替继承关系&#xff0c…