微信和支付宝支付模式详解及实现(.Net标准库)

 支付基本上是很多产品都必须的一个模块,大家最熟悉的应该就是微信和支付宝支付了,不过更多的可能还是停留在直接sdk的调用上,甚至和业务系统高度耦合,网上也存在各种解决方案,但大多形式各异,东拼西凑而成。所以这里我介绍下OSS.PayCenter开源跨平台支付组件 及其框架设计。并对常用支付模式进行一个全面介绍,方便大家开发以及跨平台使用。这篇文章主要围绕以下几个模块:

1. 微信和支付宝对比

2. 支付模式介绍

3. OSS.PayCenter框架设计

4. 调用示例

5. 注意事项

一. 微信和支付宝对比

  这两者现在已经占领了移动支付的90%市场,支付形式也都大抵相同,只是在实现细节上略微不同。这里之所以要专门对比,是因为有些接口的不同在后边的框架的设计中也会有所影响。主要集中在以下几个方面:

  1. 支付方式上:

    a. 支付宝多了一个声波支付

    b. 手机端H5支付方式中, 微信只支持微信内部浏览器

    c. 微信用户扫码方式中除了正常下单返回支付二维码,还提提供了回调下单模式(即扫描的二维码并不是支付二维码,而是商品二维码,微信会回调商户指定地址才真实下单)

  2. 接口安全

    a.  微信不同接口安全等级不一样,涉及付款等接口加密相对简单(MD5,SHA1),涉及到退款,发送红包等接口需要使用双向证书验证

    b.  支付宝所有接口统一使用RSA加密验证,需要公私钥验证。

  3. 接口协议

    a. 微信使用的xml协议,所有参数基本都在同一层级。

    b. 支付宝使用json协议,核心参数放在biz_content字段中。

 

 

二. 支付模式介绍

  1. 完整支付的流程

   随着时间的发展,线上线下的支付场景都已经比较完善,各支付平台虽然接口不同,但是两者在业务流程都有着相似之处。这里我用一个流程图来展示核心的业务流程(线上线下主要是指在用户在线下单还是线下商户辅助下单):

以上流程图将线上和线下集中支付形式做了一个概要的说明,两个支付平台在具体的细节上可能或有略微不同,不过基本上都在这个流程范围之内。

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

  2.  支付方式介绍

    首先:线上支付

  1). 用户扫码支付  

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

  2). 手机端支付

    这个一般应用在H5站点或者app中,商户系统下单后后台直接发起下单请求,唤起手机支付平台客户端,完成支付。(微信的H5支付只能在微信内部浏览器中唤起。

 

  其次:线下支付,这个主要集中在超市,商场等。常见的如:

  1). 商户发起扫码支付

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

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

    这个一般出现自动贩售机,或者聚会相互付款等,不需要用户扫来扫去,按住开关就可发现周边设备。暂时只有支付提供

 

 

  3. 支付结果及后续处理

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

  如果当前订单在一定时间内一直未支付,建议调用取消支付请求订单接口,以防止后续出现错误支付或者订单支付异常问题。

 

三. OSS.PayCenter框架设计

  1. 框架流程

 了解了以上的几种支付方式之后,那么具体的调用什么接口其实已经比较清晰了,那么我们纵向的来看一下接口调用的流程。如果把一个请求当做一个生命周期,以发起一个POST请求为例,在OSS.PayCenter中主要流程如下:

 

 在这个框架中,分为两个部分:

  下层为基类,完成  签名=》内容协议格式化=》请求=》响应内容协议格式化=》全局错误处理。其中提供了两个基本请求方法,PostApiAsync-为当前请求签名,封装xml内容调用网络请求。 RestCommonAsync-执行当前请求,并对结果格式化和全局错误处理。

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

 

  2. 框架介绍

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

  1). 基础配置

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

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

  2). 命名规则

    当前项目中主要接口都已经实现完毕,但是如果你需要自己重新实现,或者个别特殊未实现的接口,可以参照各个子类的实现

    实体的命名规则: 平台名称+动作名称 + 接口名称 +Req/Resp (如微信下单接口:WxAddPayUniOrderReq),实体都会继承至对应的BaseReq/BaseResp,具体可参见源码。

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

 

四. 调用示例

  这里以支付宝回调结果解析为例:

这个示例展示了主要个三个步骤,当前仅仅是解析回调结果,没有发起网络请求,下边再给出一个发起支付请求的示例:

凡是涉及到网络请求的接口都会返回一个异步Task对象,如果需要同步使用,使用.WaitResult()扩展方法即可,这个我在OSS.Http文章中已经介绍。

 

五. 注意事项

     1. 在微信项目中同时提供有发送红包,企业付款,代金券等接口,详情可参见具体类。

  2. 由于.net standard类库当前还并不是十分完整,有两个地方需要注意一下。(下个月.net standard 2.0版本发布后估计应该会完善了)

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

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

    b. 支付宝的加解密使用的RSA,本身提供的方法依赖于Windows系统的“crypt32.dll”和“advapi32.dll”两个组件,所以我重写了整个签名加密模块,隔离系统的依赖。但是在当前标准库版本下RSACryptoServiceProvider类内部的linux平台版本依然没有具体实现,也就是说支付宝当前项目可以运行windows系统中.net core下,linux下暂时不可以,看2.0版本更新情况如何吧。 

如果你还有其他问题,欢迎关注公众号(OSSCoder)

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


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

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

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

相关文章

DFS

//深度优先算法//i第一次就是0public void dfs(boolean[]isVisited,int i){//首先我们访问该节点System.out.println(getValueByIndex(i));isVisited[i]true;int wgetFirstNeighbor(i);while (w!-1){if(!isVisited[w]){dfs(isVisited,w);}//如果w节点已经被访问过wgetNextNeigh…

这些Spring面试题,你都会了吗?

转载自 这些Spring面试题,你都会了吗? 问题一: 什么是Spring? Spring是Enterprise Java的开源开发框架。Spring Framework的核心功能可用于开发任何Java应用程序,但有一些扩展用于在Java EE平台之上构建Web应用程…

计算机操作基础知识点总结

 计算机组装: 一、计算机硬件组成: 1.CPU 2.主板 3.内存 4.硬盘 5.光驱 6.显卡 7.网卡 8.声卡 9.电源 10.操作系统 二、CPU型号: 1.INTEL 1)主频:2.8-3.7GHZ 2)核心:双核、四核、八核、十核 3)高速总缓冲&#xff1a…

Kafka启动出现Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Pr

kafka启动时,出现报错! [rootSpark1 bin]# cat nohup.out Unrecognized VM option ‘UseCompressedOops’ Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit. 原因: 开始…

BFS

public void bfs(boolean[]isVisited,int i){int u;//表示队列的头结点对应的下标int w;//表示邻接节点w//队列LinkedList queue new LinkedList();//访问节点,输出节点信息System.out.println(getValueByIndex(i)">");isVisited[i]true;queue.addLas…

.NET遇上Docker - 使用Docker Compose组织Ngnix和.NETCore运行

本文工具准备: Docker for WindowsVisual Studio 2015 与 Visual Studio Tools for Docker或 Visual Studio 2017 需要在安装时选择“容器开发支持”,如图: Docker的思想是将不同的应用放在不同的容器中分开运行,如运行.NetCore …

平面设计基础(PS)知识点总结

 PS基础知识: 一、ps全称:Adobe Photoshop ,Adobe Photoshop是由Adobe Systems 开发和发行的专门用于图形图像处理的软件。 二、PS的应用领域: 1.在平面设计中的应用 2.在插画设计中的应用 3.在网页设计中的应用 4.在界面设计中…

为什么大公司一定要使用DevOps

转载自 为什么大公司一定要使用DevOps 0 DevOps的意图 究竟什么是DevOps? 要想回答这个问题,首先要明确DevOps这个过程参与的人员是谁?即开发团队和IT运维团队!那么,DevOps的意图是什么呢?即在两个团队之间&#…

基于ZooKeeper实现HA高可用性以及自动主备切换

默认情况下,standalone cluster manager对于worker节点的失败是具有容错性的(迄今为止,Spark自身而言对于丢失部分计算工作是有容错性的,它会将丢失的计算工作迁移到其他worker节点上执行)。然而,调度器是依…

怎样访问Springboot项目中static中的资源

第一步 成功启动 第二步 输入 协议://ip:端口/资源的名字 eg http://localhost:8080/06-demo-point.html

数据库基础的知识点

 数据库系统基础: 一、数据库:存储数据的仓库 二、数据库能够做什么: 1.存储大量的数据,方便检索和访问。 2.保持数据的信息一致、完整 3.共享和安全 4.通过组合分析,产生新的有用信息。 三、应用程序和数据库的关系…

asp.net core源码飘香:Logging组件

简介: 作为基础组件,日志组件被其他组件和中间件所使用,它提供了一个统一的编程模型,即不需要知道日志最终记录到哪里去,只需要调用它即可。 使用方法很简单,通过依赖注入ILogFactory(CreateL…

互联网账户系统如何设计

转载自 互联网账户系统如何设计 在很多互联网公司业务发展的早期,业务模式比较单一的情况下,涉及用户账户资金交易相关的逻辑也比较简单,但是随着公司业务模式的不断创新及类型的多元化发展,会渐渐发现现有系统账户逻辑越来越雍…

html、sqlserver、java基础总结

1.锚链接&#xff1a;<a name"maker1" id"marker2">乙位置</a><a href"#marker1、#marker2">甲位置</a> 2.块级元素和行内元素&#xff1a;块级元素&#xff1a;<li></li> <p></p> <td>…

数组(ArrayList)底层怎样扩容

ArrayList维护了数组transient Object[] elementData; 初始化 数组需要扩容时

HBase出现java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration问题

问题&#xff1a;Hbase在集群上运行报错&#xff1a;NoClassDefFoundError:org/apache/hadoop/hbase/HBaseConfiguration 需求&#xff1a;HBase使用Java创建表&#xff0c;打包成jar&#xff0c;提交到集群上行运行&#xff01; 在IDEA中使用Maven添加Hbase 代码&#xff1…

Visual Basic 15语言新特性

对于C#的两个重要特性元组和Ref返回值&#xff0c;Visual Basic 15提供了对等的实现。这两个特性都是“不完全的”&#xff0c;但已经可以提供足够的变通方案&#xff0c;让VB应用程序可以消费使用了这些特性的C#库。 元组 在VB中&#xff0c;从单个函数调用直接返回多个值是…

Struts2面试问题

转载自 Struts2面试问题 1.什么是Struts2&#xff1f; Apache Struts2是一个用Java构建Web应用程序的开源框架。Struts2基于OpenSymphony WebWork框架。它从Struts1中得到了很大的改进&#xff0c;使其更加灵活&#xff0c;易于使用和扩展。Struts2的核心组件是Action&…

java、sqlserver复习

一、java简答题&#xff1a; 1.java中我们学过的数据库类型转换有几种&#xff1f;分别是什么&#xff1f;转换规则是什么&#xff1f; 答&#xff1a;两种&#xff0c;自动类型转换和强制类型转换。 源类型大于目标类型时&#xff0c;需要自动转换。 源类型小于目标类型时&…

新版csdn

欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来&#xff0c;用它写博客&#xff0c;将会带来全新的体验哦&#xff1a; Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰…