支付宝开发流程与第三方支付原理详解

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

支付宝发展历程

1.首先我们来谈谈第三方支付

所谓第三方支付,是由与一些大型银行签约的、具有一定实力和信誉的第三方独立机构提供的交易平台。

目前市场上最常见的支付方式有支付宝、财付通、网银、易宝支付等。网站若需要实现第三方支付,需要先向第三方申请账户并签订协议,协议生效后,第三方支付平台才会为其开通网上支付功能。

2.第三方支付的原理

2.1用户向商城网站发起确认订单的请求

2.2 商城网站收到保存订单数据到数据库或其他存储介质的请求

2.3 返回订单确认页面,显示订单金额等信息

2.4用户确认付款,发起支付请求。注意:支付请求发送到支付网关(如支付宝、网银),而不是商城网站。

2.5 显示支付页面

2.6 用户填写认证信息(账号密码等)并提交

2.7 这里有两个步骤,一个是扣款成功后跳转支付结果页(展示给用户),一个是支付通知,这两个步骤可以同时执行,无先后顺序。商城网站收到支付通知后,根据验证规则验证信息的有效性,并做相应的修改(例如:如果有效,则将订单改为已付款状态;如果无效,则记录非法请求信息)。

以支付宝为例:如果想在网站集成支付宝接口,首先要有支付宝账号,然后向支付宝申请在线支付服务并签订协议。协议生效后,支付宝会给网站一个合作伙伴ID和一个安全验证码。有了这两个东西,就可以根据支付宝接口文档开发支付宝接口了。上图的步骤中,只有步骤4和步骤7有商城与支付网关的信息交互。步骤4是指发送数据给支付网关(支付宝),步骤7是通知验证部分。验证网关请求网站的某个地址,网站根据验证规则验证并记录信息并作出响应。我们开发几乎任何支付接口的时候,重点都是在这两个部分的开发上。如果理解了支付接口的原理,开发支付接口并不难。

其实看图,我们做的事情很有限,基本就在1到3之间,生成订单数据,然后通过支付宝进行认证(当然省略了一些购物车和下单步骤),基本流程就完成了。

3.支付宝接口开发

3.1 接口介绍及测试

目前支付宝提供了担保交易、标准即时支付、双开功能等多个接口,功能上只是有些许差异,集成方式都是一样的。以标准即时支付接口为例,与支付宝签订协议后,需要经过几个步骤才能完成集成。

选择“我想要自己集成”,然后单击您将看到的链接以下载技术文档。

下载的文件里面包含了标准的支付宝交易服务接口、商户工具、接口集成指南等文档,以及用多种语言编写的demo。我们可以根据接口文档和规则重新开发一个,也可以在demo的基础上修改后集成到网站中。需要注意的是,支付接口的开发需要在公网(服务器必须能通过外网访问)才能完成整个调试过程,如果服务器不能通过外网访问,将无法收到支付通知。

demo中各个文件的作用

php-utf-8 编码

│ ...

│ │

│ ═..php ┈┈┈┈┈┈┈支付宝接口公共函数文件

│ │

│ │ ═..php┈┈┈┈┈┈┈┈支付宝通知处理类文件

│ │

│ ═..php┈┈┈┈┈┈┈┈支付宝接口请求提交类文件

│ │

│ └..php┈┈┈┈┈┈┈┈支付宝接口MD5函数文件

═log.txt┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈日志文件

═..php┈┈┈┈┈┈┈┈┈┈┈┈┈基础配置类文件

═.php┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈支付宝接口入口文件

═.php ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈服务器异步通知页面文件

═.php ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈页面跳转同步通知文件

═════════════════════════════════ 用于在 CURL 中验证 SSL 的 CA 证书文件

三方代码支付宝怎么弄_第三方支付代码_三方支付代码大全

└.txt ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 说明文本

这里已经下载好了(见资源目录下的pay文件夹),为了方便调试,增加修改了几个文件,还增加了一个数据表用于保存订单信息,下面我们来修改一下配置文件,完成一个测试流程。

.php是基本信息配置文件,我们需要将从支付宝后台获取的PID和Key写入到配置文件中。

配置项:

框里的数据就是我们需要修改的,支付通知地址和退货地址的区别前面已经说了,第7步里面有两项:支付结果页和支付通知信息,支付结果页就是用户支付完成后会自动跳转的地址,这里就是退货地址($)。

$主机=$[''];

//↓↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

//合作者ID,合约账户,以2088开头的16位纯数字字符串,校验地址:

$[''] = '****************';

//支付宝的支付账户是一个以2088开头的16位字符串,一般支付账户为合约账户。

$[''] = $[''];

// MD5密钥,安全验证码,由数字和字母组成的32位字符串,查看地址:

$['key'] = '****************************';

// 服务端异步通知页面路径需为格式完整路径,不能添加?id=123等自定义参数,必须外网可以正常访问。

[′′]=";.[''] = ";.​[′​rl′]=";.host."//";

// 页面跳转同步通知页面路径需为全路径格式,不能添加?id=123等自定义参数,必须外网可以正常访问。

[′′]=";.[''] = ";.​[′​rl′]=";.host."//";

// 客户端的IP地址不是局域网的外部IP地址,如:221.0.0.1

$[''] = “182.92.27.46”;

支付通知地址也是用户支付完成之后支付宝会请求的地址(),但是支付通知是支付宝服务器直接请求的,不会被用户看到。这两个地址必须都是http开头的完整路径格式。为了完成测试流程,这里已经重写了/pay//.php,并且​rl),但是支付通知是支付宝服务器直接请求的,不会被用户看到。这两个地址必须都是http开头的完整路径格式。为了完成测试流程,这里已经重写了/pay//.php,并且​rl),但是支付通知是支付宝服务器直接请求的,不会被用户看到。这两个地址必须都是http开头的完整路径格式。为了完成测试流程,这里已经重写了/pay//.php,并且​rl),但是支付通知是支付宝服务器直接请求的,不会被用户看到。这两个地址必须都是http开头的完整路径格式。 为了完成测试流程,这里重写了/pay//​rl.php,并将​rl.php设置为可以访问此文件的URL。配置完这几项后,根据数据库脚本(pay/.sql)创建数据表。并根据数据库配置信息修改.php。通过对支付宝提供的demo进行简单修改,即可完成支付请求的创建(步骤4)。这里将支付首页及其他页面进行改动(见源码包中的pay目录)。我们先测试一下:

数据库中添加了“订单信息”。

点击“确认支付”按钮或者确认支付链接,会跳转到支付宝页面。点击按钮后,信息会通过表单POST方式提交给支付网关。由于支付请求数据不需要对用户可见,所以写在隐藏字段中。确认支付链接通过URL传递。由于支付宝接口允许POST或GET方式提交,所以两种方式都可以接受。将参数提交给支付网关后,页面跳转到支付页面。我们看到下图:

我们可以看到支付宝给我们提供了两种支付方式,一种是通过支付宝账户支付,一种是通过银行卡支付。比如选择银行卡支付,填写邮箱地址或者手机号即可跳转到如下页面:

当我们打开订单时,支付宝支持几乎所有的银行卡支付,包括信用卡和分行支付。选择对应的银行,按照提示进行支付即可。支付完成后,页面会返回到我们在配置文件中配置的$地址,“订单状态”也会发生变化。

注意:若未在外网进行测试(即外网无法访问付款通知地址),则无法请求付款通知,也无法自动修改订单状态。

3.2 支付宝接口规范及代码分析

关于支付宝接口规范,可以参考/pay/doc/支付宝标准交易服务接口(防钓鱼网站专用).pdf,里面有比较详细的说明。

3.2.1 如何创建付款请求

在前面的测试中,我们点击“确认付款”后,就将信息提交给了支付宝的支付网关。我们可以思考一下,哪些参数应该发送给支付网关。请求参数列表请参考标准支付宝交易服务接口(防钓鱼网站专用)PDF中的3.2.2。需要注意的是,我们不能将这些参数原封不动地提交给支付宝。为了保证数据安全,支付宝目前采用了MD5签名机制,防止数据被篡改。

在提交数据之前,需要把需要提交的数据按照一定的规则组装成一个字符串(见接口文档),加上安全校验码(Key)组成新的字符串,并通过MD5生成32字节的签名,我们在提交支付请求的时候,也需要提交这个签名。看一下表单源码

支付宝收到参数后,会验证请求参数的合法性,如果验证正确则显示支付页面,否则提示错误。

3.2.2 如何验证付款通知

用户完成支付后,支付宝会请求网站支付通知地址(创建支付请求时,这个地址要作为参数传递),返回参数列表请参考标准支付宝交易服务接口(反钓鱼网站专用)pdf3.3.1。支付宝的返回数据中还有一段签名字符串(采用和支付请求相同的签名方式),在支付通知文件中,首先要对数据进行签名验证。除了验证签名之外,还需要将参数提交给支付宝的验证网关支付宝系统进行通知真实性和通知验证。支付宝系统判断通知是否是自己发送的,如果是字符串格式,则返回true,否则返回。我们通过验证服务器返回的数据来验证请求的真实性,如果全部验证通过,我们就可以进行更改订单数据、给用户发送邮件通知等操作。关于签名验证,可以看一下通知文件中的源码。 demo中向支付宝提交参数是通过POST方式提交并获取返回数据,代码片段为:

重点是函数,这个函数我们在发邮件的时候已经接触过了,这个函数用来打开连接,和之前学过的函数类似,返回一个文件句柄,然后可以使用文件函数( ()、 ()、 ()、 () feof() 等)来操作这个文件句柄。代码中使用了 ()(同上 ())函数写入数据,模拟POST方式的表单提交数据,最后通过()函数获取返回的数据并保存到数组中,最后进行验证。具体请参考源码。

原来的:

分享