php支付宝在线支付接口开发教程


Posted in PHP onSeptember 19, 2016

1.什么是第三方支付

所谓第三方支付,就是一些和各大银行签约、并具备一定实力和信誉保障的第三方独立机构提供的交易支持平台。在通过第三方支付平台的交易中,买方选购商品后,使用第三方平台提供的账户进行货款支付,由第三方通知卖家货款到达。

目前提供第三方支付的机构很多,常见的有支付宝、财付通、快钱、网银在线、易宝支付、云网等各大支付平台。网站如果需要实现第三方支付首先应该向第三方支付平台申请一个账号并签署协议,协议生效后第三方支付平台将为其开通在线支付功能,通过程序将接口集成到网站中。

为什么要使用第三方支付?因为第三方支付平台已经与各大银行进行签约,网站主只需要在此平台申请一个账号即可支持几乎所有的种类的银行卡信用卡的交易。

2.第三方支付原理

php支付宝在线支付接口开发教程

以上简要说明了支付过程,当然其中省略了一些步骤(比如购物车,订单等),我们重点来看支付流程。

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

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

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

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

2.5显示支付页面

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

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

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

3.支付宝接口开发

3.1接口简介与测试

支付宝目前提供了,担保交易、标准即时到帐、双功能等几种接口,只是在功能上有些差异,网站集成方式是一样的。以标准即时到帐接口为例,在与支付宝签署协议后,还需要几个步骤才能完成集成。

php支付宝在线支付接口开发教程

选择“我要自助集成”接下来会看到的链接,点击下载技术文档。

在下载后的文件中有标准支付宝交易服务接口、商家工具、接口集成指南等接文档,另外还有几种语言写的demo.我们可以根据接口文档按规则全新开发,也可以再demo基础上修改集成到网站,需要注意的是开发支付接口需要在公网(服务器必须可以通过外网访问)才可以完成整个调试过程,如果服务器在外网访问不到,则无法接收到支付通知。

看一下demo中每个文件的作用:

php支付宝在线支付接口开发教程

这里已经下载好了(见资源目录pay文件夹),为了便于调试增加修改了若干文件,并增加了一张数据表保存订单信息,我们修改一下配置文件完成一个测试过程。

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

配置项:

php支付宝在线支付接口开发教程

其中方框内的数据是我们需要重点修改的。支付通知地址与返回地址的区别,前面已经提到,在步骤7中有两项:支付结果页面与支付通知信息,支付结果页面是用户支付完成后会自动跳转到这个地址这里是返回地址($return_url)。

php支付宝在线支付接口开发教程

支付通知地址同样是用户支付完成后,支付宝会请求该地址($notify_url),但是支付通知是支付宝服务器直接请求,不会被用户看到。这两个地址必须是以http开头的完整路径格式为了完成测试过程,这里已经将/pay/alipay/notify_url.php改写,将$notify_url设置为可访问到此文件的URL即可。这几项配置好后再根据数据库脚本(pay/orders.sql)创建一张数据表。并根据数据库的配置信息修改mysql_config.php.通过对支付宝提供的demo做简单修改就可以完成创建支付请求(步骤4)了,这里更改了支付首页等页面(见源码包pay目录)。我们先测试一下:

php支付宝在线支付接口开发教程

数据库中增加了一条“订单信息”.

如果点击“确认支付”按钮或者确认支付 链接将会跳转到支付宝页面,点击按钮时通过表单POST方式将信息提交到支付网关,由于支付请求数据无需让用户看到,这里都写在隐藏域中了。确认支付 链接是通过URL传参,因为支付宝接口允许以POST或者GET方式提交,所以两种方式都可以。把参数提交给支付网关后,页面跳转到到支付页面。我们看到如下图所示:

php支付宝在线支付接口开发教程

我们看到支付宝为我们提供了两种支付方式,一种是通过支付宝账户支付,另一种是通过银行卡支付。例如选择使用银行卡支付,填写邮箱或手机号跳转到如下页面:

php支付宝在线支付接口开发教程

我们开单支付宝几乎支持所有的银行卡支付,同时有信用卡和网点方式付款,选择对应的银行下一步按提示付款即可。付款完成后页面会返回到我们在配置文件中配置的$return_url地址,同时“订单状态”也会发生改变。

php支付宝在线支付接口开发教程

注:测试时如果没有在外网测试(即支付通知地址无法在外网访问)则支付通知无法被请求到,无法自动完成订单状态的修改。

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

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

3.2.1如何创建支付请求

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

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

php支付宝在线支付接口开发教程

支付宝接收到参数后会进行验证请求参数的合法性,验证无误后将显示支付页面,否则提示错误。

3.2.2 如何验证支付通知

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

php支付宝在线支付接口开发教程

这里重点就是fsockopen函数,在发送电子邮件时我们已经接触过,通过此函数打开套接字连接,类似于以前学过的fopen函数返回的是一个文件句柄,之后可以使用文件函数( fgets()、fgetss()、fputs()、fclose() feof()等)对其进行操作,代码中使用了fputs()(同fwrite())函数,写入数据来模拟表单以POST方式提交数据,最后通过fgets()函数获取返回的数据保存到数组中,最后进行验证,具体参照源码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php下使用SMTP发邮件的代码
Jan 10 PHP
PHP编实现程动态图像的创建代码
Sep 28 PHP
Base64在线编码解码实现代码 演示与下载
Jan 08 PHP
PHP中限制IP段访问、禁止IP提交表单的代码
Apr 23 PHP
基于PHP文件操作的详细诠释
Jun 21 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
Jan 14 PHP
php中的curl使用入门教程和常见用法实例
Apr 10 PHP
PH P5.2至5.5、5.6的新增功能详解
Jul 14 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
Dec 07 PHP
如何利用预加载优化Laravel Model查询详解
Aug 11 PHP
在Laravel5.6中使用Swoole的协程数据库查询
Jun 15 PHP
php 读取文件夹下所有图片、文件的实例
Oct 17 PHP
iOS10推送通知开发教程
Sep 19 #PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
Sep 19 #PHP
手把手编写PHP框架 深入了解MVC运行流程
Sep 19 #PHP
PHP 接入支付宝即时到账功能
Sep 18 #PHP
PHP 等比例缩放图片详解及实例代码
Sep 18 #PHP
php mysql 封装类实例代码
Sep 18 #PHP
thinkphp自带验证码全面解析
Sep 18 #PHP
You might like
网站当前的在线人数
2006/10/09 PHP
php4的session功能评述(二)
2006/10/09 PHP
PHP 翻页 实例代码
2009/08/07 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
2014/08/25 PHP
Phpstorm+Xdebug断点调试PHP的方法
2018/05/14 PHP
javascript操作css属性
2013/12/30 Javascript
node.js正则表达式获取网页中所有链接的代码实例
2014/06/03 Javascript
yepnope.js使用详解及示例分享
2014/06/23 Javascript
JavaScript使用Max函数返回两个数字中较大数的方法
2015/04/06 Javascript
Boostrap入门准备之border box
2016/05/09 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
Node.js npm命令运行node.js脚本的方法
2018/10/10 Javascript
[04:19]完美世界携手游戏风云打造 卡尔工作室模型介绍篇
2013/04/24 DOTA
[03:22]DSPL第一期精彩集锦:酷炫到底!
2014/11/07 DOTA
[19:15]DK战队纪录片
2014/09/02 DOTA
python通过ElementTree操作XML获取结点读取属性美化XML
2013/12/02 Python
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
python ddt数据驱动最简实例代码
2019/02/22 Python
Django 开发调试工具 Django-debug-toolbar使用详解
2019/07/23 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
python实现发送带附件的邮件代码分享
2020/09/22 Python
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
捷克家居装饰及图书音像购物网站:Velký košík
2018/04/16 全球购物
ghd官网:英国ghd直发器品牌
2018/05/04 全球购物
联想马亚西亚官方网站:Lenovo Malaysia
2018/09/19 全球购物
土耳其玩具商店:Toyzz Shop
2019/08/02 全球购物
阿姆斯特丹城市卡:Amsterdam Pass
2019/12/01 全球购物
什么是Linux虚拟文件系统VFS
2012/01/31 面试题
自主实习接收函
2014/01/13 职场文书
低碳生活倡议书
2014/04/14 职场文书
幼师求职自荐信
2014/05/31 职场文书
2015年国际护士节演讲稿
2015/03/18 职场文书
《蟋蟀的住宅》教学反思
2016/02/17 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书
OpenCV实现反阈值二值化
2021/11/17 Java/Android