OSS.PayCenter 开源跨平台支付组件:框架设计与常用支付模式全面介绍

2024-07-25
来源:网络整理

支付基本是很多产品必备的模块,最熟悉的应该就是微信、支付宝支付了,但大部分可能还停留在直接SDK调用,甚至和业务系统耦合度高,网上也有各种解决方案,但大多形式各异、拼凑起来。所以这里我就来介绍一下OSS开源的跨平台支付组件及其框架设计。并对常见的支付模式做一个全面的介绍,方便大家开发和跨平台使用。本文主要针对以下几个模块进行介绍:

1. 微信与支付宝对比

2. 付款方式介绍

3.OSS框架设计

4.调用示例

5. 注意事项

1. 微信与支付宝对比

这两者如今已经占据了移动支付 90% 的市场份额,支付方式也大致相同,但在实现细节上略有不同。之所以在这里特别对比,是因为接口上的一些差异也会对后续框架的设计产生影响。主要集中在以下几个方面:

1.付款方式:

a.支付宝新增声波支付功能

b. 手机H5支付方式中,微信仅支持微信内置浏览器

c.微信用户除了正常下单时返回支付二维码外,还提供回调下单模式(即扫描的二维码不是支付二维码,而是商品二维码,微信会回调商家到指定地址后再进行实际下单)

2. 接口安全

a.微信对不同接口的安全级别不同,涉及支付的接口加密比较简单(MD5、SHA1),涉及退款、发红包等接口需要双向证书验证。

b.支付宝所有接口均采用RSA加密验证,需要进行公钥和私钥验证。

3.接口协议

a.微信使用的XML协议中,所有参数基本都是同一级别的。

b.支付宝采用JSON协议,核心参数放在字段里。

2. 付款方式介绍

1. 完成付款流程

随着时间的推移,线上线下支付场景日趋完善,虽然各个支付平台的界面有所不同,但在业务流程上有相似之处,这里我用流程图来展示核心业务流程(线上线下主要指用户是线上下单还是线下商家协助下单):

以上流程图大致描述了线上线下中心化支付方式,两家支付平台在具体细节上可能略有不同,但基本都在本流程的范畴之内。

注意:微信的二维码支付中,除了普通的返回支付二维码支付外,还可以直接扫描商品二维码,通过微信后台回调商户接口,在回调中完成支付请求,调用客户端支付。

2. 付款方式介绍

第一:网上支付

1). 用户扫描二维码支付

这个一般用在线上PC网站支付,用户在商户系统下单后,选择方便的支付平台,商户系统向支付平台发起支付请求,返回对应的支付二维码,完成支付。(微信提供了两种形式,一种可以直接扫描商品二维码,回调处理。这个可以方便地应用在线下活动推广中,微信后台可以间接帮助完成订单。)

2). 移动支付

这个一般用在H5网站或者APP上,商户系统下单后,后台直接发起下单请求,调用移动支付平台客户端,完成支付。(微信的H5支付只能在微信内部浏览器调用)。

其次:线下支付,这种支付主要集中在超市、商场等,常见的有:

1).商户发起扫码支付

这个基本都是在餐厅、超市、商场等,客流量比较大,服务员需要快速完成支付操作,商户在后台下单后直接扫码支付,如果是多人同时操作时用户扫码支付,很容易出现错误等问题

2).声波支付(支付宝)

支付宝支付安全_支付宝的安全措施有哪些_支付宝安全控件

这通常出现在自动售货机上,或者在聚会上互相付款时等。用户不需要四处寻找,只需按住开关即可发现外围设备。目前仅提供支付

3. 付款结果及后续处理

以上介绍了支付的主要流程,在线支付时客户端同步返回支付结果,页面直接跳转完成支付,因此此支付结果不能作为实际支付结果,防止前端恶意攻击或者支付平台内部处理异常导致支付失败,正确的支付结果需要以后台异步通知为准。

若当前订单在一定时间内还未支付,建议调用取消支付请求订单API,防止后续出现错误支付或者订单支付异常。

3.OSS框架设计

1. 框架流程

了解了上面的支付方式之后,具体要调用什么接口就很明确了,我们纵向看一下接口调用的流程,如果把一次请求看成一个生命周期的话,以发起一个POST请求为例,OSS中主要的流程如下:

这个框架主要包括两个部分:

下层为基类,完成签名=》内容协议格式化=》请求=》响应内容协议格式化=》全局错误处理。提供两种基本请求方法: - 对当前请求进行签名并封装XML内容调用网络请求。 - 执行当前请求并格式化结果及处理全局错误。

上层为子类,有具体的接口名和对应的请求内容参数。(注:退款和支付在单独的子类中,与其他接口物理隔离)

2.框架介绍

目前的项目都是基于.Net标准库的项目,也就是说是同时支持.Net和.Net Core的,每个项目中都会有文件夹,主要存放当前类库的辅助类。

1). 基本配置

两个库中最底层的基类都提供了静态属性,可以方便的在程序全局入口设置相应的支付平台配置信息。

同时如果您有多个租户,则可以在具体的接口类构造函数中传入不同租户的支付平台配置信息。

2). 命名规则

当前项目中主要的接口都已经实现了,但如果需要自己重新实现,或者有一些特殊的未实现接口,可以参考各个子类的实现

实体的命名规则为:平台名+动作名+接口名+Req/Resp(如微信下单接口:),所有实体都会继承到对应的/,具体请参考源码。

目前的框架中有两个项目:OSS..WX(微信)和OSS..ZFB(支付宝),两个项目的接口协议、参数格式完全不同,所以对应的底层基类细节也会有所不同,具体请阅读具体代码。

4.调用示例

这里我们以支付宝回调结果分析为例:

本示例展示了三个主要步骤,目前只解析回调结果,并未发起网络请求,下面以发起支付请求为例:

所有涉及网络请求的接口都会返回一个异步的Task对象,如果需要同步使用,可以使用.()扩展方法,这个我在OSS.Http那篇文章中有介绍。

5. 注意事项

1、微信项目还提供了发红包、企业支付、优惠券等接口,具体请参考具体的类。

2.由于.net类库还没有完全完成,所以有两个地方需要注意。(估计下个月.net 2.0发布后才会完成)

a.请求的双向证书绑定是在wx项目中用到的,在.net core和.net中已经实现,但是标准库中暂时还没有实现,所以我在微信配置实体中暴露了一个属性,调用的时候只需要赋值如下即可:

config.SetCertificata = (handler, cert) => {    handler.ServerCertificateCustomValidationCallback =
    (msg, c, chain, sslErrors) => true;    handler.ClientCertificates.Add(cert); };

b.支付宝采用RSA进行加密解密,其提供的方法依赖于系统的“.dll”和“.dll”组件,因此我重写了整个签名加密模块,隔离了系统的依赖。但是ider类里面的平台版本在目前的标准库版本中还是没有实现,也就是说目前的支付宝项目在系统的.net core下是可以运行的,但暂时还不能在2.0版本下运行。

如有其他疑问,请关注公众号()

原文地址:http://www.cnblogs.com/osscoder/p/6708222.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

分享