PHP支付宝支付开发流程
2.1用户向商城网站发起确认订单的请求
2.2商城网站接收到请求保存订单数据到数据库或其他存储介质
2.3返回订单确认页面,页面上应该显示订单金额等信息
2.4用户确认支付,发起支付请求。注:支付请求是发送到支付网关(比如支付宝、网银在线)而不是发送到商城网站。
2.5显示支付页面
2.6用户填写认证信息(账号密码等)提交
2.7这里有两个步骤一个是扣款成功后页面跳转到支付结果页面(展示给用户),另一个是支付通知,这两步没有先后顺序可能同时执行,商城网站接收到支付通知后根据验证规则验证信息的有效性,并作出相应的更改操作(例:有效则更改订单为已付款状态,无效则记录非法请求信息)。
以支付宝为例:如果实现在网站中集成支付宝接口,首先要有一个支付宝账号,接下来向支付宝申请在线支付业务,签署协议。协议生效后有支付宝一方会给网站方一个合作伙伴ID,和安全校验码,有了这两样东西就可以按照支付宝接口文档开发支付宝接口了,在上图的几个步骤中只有4和7两个步骤在商城与支付网关之间有信息交互。在步骤4中指将数据发送到支付网关(支付宝),在步骤7中是的通知验证部分,验证网关请求网站某地址,网站按验证规则对信息进行验证记录并作出响应,我们几乎在开发任何支付接口时,重点是这两部分的开发,明白支付接口原理,开发支付接口就不难了。
选择“我要自助集成”接下来会看到的链接,点击下载技术文档。
在下载后的文件中有标准支付宝交易服务接口、商家工具、接口集成指南等接文档,另外还有几种语言写的demo.我们可以根据接口文档按规则全新开发,也可以再demo基础上修改集成到网站,需要注意的是开发支付接口需要在公网(服务器必须可以通过外网访问)才可以完成整个调试过程,如果服务器在外网访问不到,则无法接收到支付通知。
create_direct_pay_by_user-php-UTF-8
│
├lib┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈类文件夹
│ │
│ ├alipay_core.function.php ┈┈┈┈┈┈支付宝接口公用函数文件
│ │
│ ├alipay_notify.class.php┈┈┈┈┈┈┈支付宝通知处理类文件
│ │
│ ├alipay_submit.class.php┈┈┈┈┈┈┈支付宝各接口请求提交类文件
│ │
│ └alipay_md5.function.php┈┈┈┈┈┈┈支付宝接口MD5函数文件
│
├log.txt┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈日志文件
│
├alipay.config.php┈┈┈┈┈┈┈┈┈┈┈┈基础配置类文件
│
├alipayapi.php┈┈┈┈┈┈┈┈┈┈┈┈┈┈支付宝接口入口文件
│
├notify_url.php ┈┈┈┈┈┈┈┈┈┈┈┈┈服务器异步通知页面文件
│
├return_url.php ┈┈┈┈┈┈┈┈┈┈┈┈┈页面跳转同步通知文件
│
├cacert.pem ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈用于CURL中校验SSL的CA证书文件
│
└readme.txt ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈使用说明文本
这里已经下载好了(见资源目录pay文件夹),为了便于调试增加修改了若干文件,并增加了一张数据表保存订单信息,我们修改一下配置文件完成一个测试过程。
alipay_config.php是基础信息配置文件,我们需要将在支付宝后台获取的PID与Key写入到配置文件中。
配置项:
其中方框内的数据是我们需要重点修改的。支付通知地址与返回地址的区别,前面已经提到,在步骤7中有两项:支付结果页面与支付通知信息,支付结果页面是用户支付完成后会自动跳转到这个地址这里是返回地址($return_url)。
$host = $_SERVER[\’HTTP_HOST\’];
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
//合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
$alipay_config[\’partner\’] = \’****************\’;
//收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号
$alipay_config[\’seller_id\’] = $alipay_config[\’partner\’];
// MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
$alipay_config[\’key\’] = \’****************************\’;
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
$alipay_config[\’notify_url\’] = “http://”.$host.”/paycallback/notify”;
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
$alipay_config[\’return_url\’] = “http://”.$host.”/paycallback/return”;
$alipay_config[\’exter_invoke_ip\’] = “182.92.27.46”;
数据库中增加了一条“订单信息”.
如果点击“确认支付”按钮或者确认支付
链接将会跳转到支付宝页面,点击按钮时通过表单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.支付宝的返回数据中同样有一个签名串(采取和支付请求同样的签名方式),在支付通知文件中首先要对数据进行签名验证。除了验证签名,还需要将参数中的notify_id提交到支付宝的验证网关支付宝系统这个通知的真实性,通知验证。支付宝系统判断通知是否是自己发送,如果是以字符串格式返回
true,否则返回false,我们通过验证服务器返回的数据验证请求的真实性,如果都验证通过则可以进行更改订单数据、给用户发送邮件通知等操作。关于验证签名可以看一下通知文件中的源码。带demo中将参数中的notify_id提交到支付宝是通过POST方式提交并取得返回数据,代码片段:
重点就是fsockopen函数,在发送电子邮件时我们已经接触过,通过此函数打开套接字连接,类似于以前学过的fopen函数返回的是一个文件句柄,之后可以使用文件函数(
fgets()、fgetss()、fputs()、fclose()
feof()等)对其进行操作,代码中使用了fputs()(同fwrite())函数,写入数据来模拟表单以POST方式提交数据,最后通过fgets()函数获取返回的数据保存到数组中,最后进行验证,具体参照源码