PHP下基于MVC结构实现支付宝交易接口

本文档介绍了在PHP环境下,基于MVC结构如何实现支付宝即时到账接口。通过下载支付宝提供的PHP开发包,详细解析了各个文件的作用,如配置文件、库函数、日志文件以及服务器异步通知和同步通知模板。在MVC模式下,这些组件如何协同工作以确保交易接口的正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近因为工作需要学习使用了支付宝的“即时到账交易接口”,在学习应用的过程中走了很多的弯路,也感觉到官方说明文档中有些许不足 ,这里一并总结下来。
<h2>名词解释:</h2>
商户:通过支付宝来销售商品的商家,即支付宝接口实现者。 客户:通过支付宝购买商品的商家,即支付宝接口使用者。 同步通知: 异步通知:
<h2>支付宝接口实现原理</h2>

官方的图片很形象的表达了支付宝接口的原理: 

alipay

<h3>商户构建请求数据</h3>
首先,商户网站根据用户的操作以及实际情况在本地构造请求数据,例如客户要付款的金额、在商户网站中的唯一订单号、产品名称等等,这些数据是要在本地确定下来,然后发送给支付宝系统的。
<h3>发送请求数据</h3>
商户将数据整理好后,通过支付宝提供的接口发送给支付宝系统服务器,事实上,关于整合数据的过程,支付宝已经提供了非常实用的demo,届时直接复制,然后根据实际需要再进行补充即可。
<h3>交易进行</h3>
这是支付宝系统内部的事情,就不多赘述了……
<h3>返回响应数据</h3>
我认为这里只支付宝接口实现中一个很关键的过程,支付宝将交易结果回传是通过两种方式的,一种叫做页面回转同步通知,另一种叫做服务器异步通知。 页面回转同步通知:简单来说就是将交易结果显示给客户看,在付款完成,支付宝系统现实交易完成后,页面会在几秒之后自动跳转到商户指定的一个网址去,而交易的结果(如支付宝交易号等)会以GET方式附加到网址里面,到时商户通过自行提取,然后显示在页面中,告知客户即可。 服务器异步通知:简单来说就是将更详细的交易结果以POST的方式直接发送给商户的服务器。 我个人认为这是页面回转同步通知是用来给客户看的,服务器异步通知是用来更新商户服务器的,最好不要根据页面回转同步通知的结果来更新数据库,一来异步通知的信息量更大,信息更完善,二来把“渲染信息为页面”与“将信息更新到数据库”两个功能分开也更符合模块化思想,欢迎指正。
<h3>对响应数据进行处理</h3>
就是根据支付宝系统返回的交易结果来更新数据库了,比如记录交易时间、订单号、交易金额等等了。
<h2>实战:在MVC模式下实现支付宝接口</h2>
就把我开发接口的经验跟教训分享给大家吧。 工作中使用的是Yii框架1.1版本,基于MVC模式。
<h3>支付宝demo文件夹</h3>

我们在支付宝官网可以下到即时到账收款的开发包: 


<a href="http://download.alipay.com/public/api/base/alipaydirect.zip">http://download.alipay.com/public/api/base/alipaydirect.zip</a>


 这里用PHP语言,UTF-8编码的demo包,可以看到结构如下:   这个demo包放到localhost中是可以直接用的,默认就是打开index.php文件作为入口。 下面介绍各个文件: Images:这是index.php的资源文件夹,存放图片等。 lib:这是库函数文件,不需要改动,只需要仿照demo引用到各个功能模块中就可以了。 alipay.config.php:这是支付宝接口的配置文件,在里面可以填写商户合作者ID与秘钥,其他内容一般不需要改动。 cacert.pem:这好像是用来验证链接的文件,就是验证return_url跟notify_url链接是不是由支付宝系统发出的…… index.php:支付宝接口入口文件,其实就是HTML表单了,将信息提交给alipayapi.php文件。 log.txt:这是日志文件,使用支付宝自带的logResult(str)函数写入内容,如果要调试notify_url的话,这个文件会非常有用!logResult()函数在alipay_core.function.php中! notify_url.php:服务器异步通知模板文件,对服务器异步通知信息的提取基本就是按里面的步骤来走的,在MVC中可以看做是个action。 readme.txt:T_T我怎么早没看到这个文件……关于每个文件的介绍这里面都有……关于cacert.pem和库函数的使用里面都有介绍,cacert.pem的要是还看不懂的话那就没办法了,因为我也不是很懂╮(╯_╰)╭ return_url:与notify_url.php相似,区别只是面向同步通知的。

<h3>MVC结构</h3>
<h4>Model</h4>
在数据表中的字段有:
<pre class="lang:php decode:1 ">/**
 *  表 "bill_alipay_log" 模型.
 *
  @out_trade_no:商户唯一订单号,str
@notify_time:通知时间,datetime
@subject:商品名称,str
@payment_type:支付类型,str
@trade_no:支付宝交易号,str
@trade_status:交易状态,str
@gmt_create:交易创建时间,datetime
@gmt_payment:交易付款时间,datetime
@gmt_close:交易关闭时间,datetime
@buyer_id:买家支付宝用户号,str
@buyer_email:买家支付宝账号,str
@buyer_account_name:买家别名支付宝账号,str
@total_fee:交易金额,decimal
@price:商品单价,decimal
@quantity:购买数量,int
@body:商品描述,str
@discount:折扣,int
 */
</pre>
&nbsp;
<h4>Controller</h4>
控制器下有四个action: actionIndex:用来渲染填写信息的表单页面。(index.php) actionPush:用来接收用户填写的表单,并将数据发送到支付宝服务器。 actionReturnUrl:用来接收同步通知,渲染给客户看的结果页面。(return_url.php) actionNotifyUrl:用来接收异步通知,更新数据库。
<h4>View</h4>
index.php(客户填写的表单) return_url.php(给客户看的交易结果)
<h3>原理</h3>
当需要交易时,首先调用actionIndex,来生成商户订单号、商品名称、商品简介、卖家支付宝账号等信息,然后显示给用户。比如在渲染给用户的表单中,我只让用户填写交易金额一项,其他的都是后台生成的。 表单的action路径指向actionPush,actionPush的内容基本上照搬alipayapi.php中的PHP代码,根据实际需要进行增删即可。其中$return_url 值为 actionReturnUrl路径,$notify_url值为actionNotifyUrl路径。 actionReturnUrl是接收支付宝传回的同步通知的,在交易完成后会调用这个方法(如果$return_url设置的对的话),基本照搬return_url.php中的代码,然后自行增删即可,记得将最后输出的结果渲染成页面哦! actionNotifyUrl是接收服务器异步通知的,照搬notify_url.php中的代码,然后根据需要增加要获取的数据,因为我发现交易状态只有SUCCESS没有FINISH,所以就删除了判断FINISH的语句,而是改成了如果交易状态为SUCCESS的话,就更新数据库。这个模块因为没法看到输出的信息,如果有bug的话很难改,一个办法是调用自带的logResult()方法,它能将信息写到log.txt文件中(如果文件内容没有更新的话就在服务器里搜索一下log.txt……很有可能在根目录下……或者在服务器根目录下创建一个log.txt……),这样调bug的话就比较方便了。   PS:虽然官方文档中说通知会返回很多可选参数,但是很多可选参数是根本不会返回的(比如payment_close似乎在直接交易中就不会有)!我在这里被坑了好久…… PS2:最好把官方的文档看一遍啊!
<h3>代码</h3>
<pre class="lang:php decode:1 ">public function actionIndex(){
/*生成订单填写页面,页面中填写充值金额,提交到actionPush*/
/*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值