支付宝支付是PHP高级课程中ThinkPHP商城项目课的内容之一,在此视频中将会讲解如何将支付宝作为第三方库集成到ThinkPHP框架中,并且将支付宝的配置参数写入自定义配置中从而达到在整个项目中灵活调用支付的目的。涉及到的知识点有使用vendor函数加载第三方扩展库,对vendor函数做了详细的介绍。使用C函数来读取自定义配置。结合ThinkPHP的特性和支付宝第三方支付的调用方式做了支付宝集成到ThinkPHP框架的完整流程。
1. 支付宝支付–即时到账
1.1. 获取即时到账sdk
获取即时到账sdk地址为:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.Ix6HLx&treeId=62&articleId=103566&docType=1
这是一个非常强大的SDK,包含了完整的demo,也就是说我们下载后只要简单的配置就可以测试完整的付款流程!!
1.2. SDK目录结构讲解
目录包括lib和img,当然为什么我的demo脚Alipay呢!是因为我下载后自己修改了名称。好了我们先来看看sdk中都有哪些东西。上图让大家看得更明白
1.3. 开始使用demo
1.3.1. 使用前的配置(alipay.config.php)
当然我们只需要配置这四个位置,partner是在你的支付宝商家后台可以查看得到,key也是在支付宝商家后台查看,看下边会有一副高清大图带大家看看在哪儿查找,这些本来是保密的东西哦。
注意notify_url和return_url的配置:听过我讲解的微信支付的同学应该已经明白这个是干什么用的了。对的就是告诉我们支付结果的地址。那这个地址的配置肯定是有讲究的。首先,他的格式为http://商户网址。这个商户网址必须是经过备案的,而且在地址中不能带有get方式的参数,必须保证外网可以正常访问。如果不对了是不能跳转的哦。往下看是不是有一个地址
1.3.2. 教你两步完成支付
第一步拼接参数,这个参数的格式是怎么样的呢:
注意了,除了out_trade_no,subject,total_fee,body其他的参数都是从配置文件中读取的。那么这四个特立独行的参数是什么意思呢?其实分别是订单编号,商品名称,订单金额,订单描述。
第二步建立请求
要注意了支付是调用阿里的东西支付的,那肯定要建立关系的,你来我往的一起完成支付,那就必须建立请求。建立请求是实例化AlipaySubmit,实例化之前当然要引入了。那就需要require_once lib/alipay_submit.class.php这个文件。
然后调用对象的buildRequestForm来建立请求当然是建立一个html请求了。那么这个方法的输出也是一段html字符串了,为了解析我们简单粗暴的使用了php的echo来处理。这一步执行时的结果就是下图的样子。
再熟悉不过了有木有。
1.4. 在ThinkPHP中集成支付宝支付
1.4.1. 有何不同?
当然是大有文章,其实也没有什么不同。既然在TP中集成那么我们还是要入乡随俗,复合TP开发规范。那就是第三方扩展放在Libraray中的Vendor目录下。那当然是把我们刚刚的demo拖过去就行了,简单粗暴的拖过去,别手软。然后,为了管理方便那个alipay.config.php我们是否可以阉割掉呢?当然是,但是又不能没有配置数据,怎么办呢?那就写在自定义配置中。还记得C()函数吗?当你需要配置中的数据时你肯定会想到他。
1.4.2. 把配置写在Common/config.php中
是不是看着都感觉身心愉悦了?这样我们就可以在项目中用C()函数非常方便的读取到支付宝配置参数。
1.4.3. 引入alipay_submit.class.php
如果你在引入vendor中的扩展时你想不到vendor()这个函数时那么你就有必要来魏老师的课堂再学习下ThinkPHP的项目开发了,魏老师一定会念叨到你想吐,还记得大话西游中的only you吗?
vendor(‘Alipay.lib.alipay_submit’,’’,’.class.php’);
vendor的三个参数我再说一次喽,第一个参数就是类库的路径,第二个参数本来可以定义类库的根目录的默认是Vendor那就不用修改了,第三个参数是类库的后缀,因为默认是.php而我们的文件时alipay_submit.class.php那么我们就自己设定下。
1.4.4. 获取配置参数:
1.4.5. 构造要请求的参数数组
看着注释中的无需改动就感觉很感动有木有,阿里的工程师真的好贴心。其他参数都是从配置中拿到的。只有四个参数要自己传。他们的意义我已经唠叨过了。当然还有很多参数,根据自己的需求自己去查阅一下。
1.4.6. 建立请求,距离成功只有半步之遥
这样你的请求就建立了,那么,如果看到扫码页面说明你成功了,如果报错了,请别砸电脑,掰键盘。静下心来分析分析。
1.4.7. 关于通知
为了接收支付结果消息,支付宝是允许我们自己设置两个地址作为通知地址的,分别是异步通知地址和同步通知地址。异步通知地址是不需用页面参与的,将结果推送到后台,而且不能有除约定之外的其他输出。
1.4.8. 异步消息通知地址
异步消息通知地址配置的参数名为notify_url,这个地址必须符合外网可以访问的条件。在支付时支付宝系统会带着POST的参数来访问该地址。该地址接受的参数可以再支付宝即时到账文档中查看。我们在接收到数据后要对数据进行判断并更新我们自己系统中的订单状态。
当然你可能会想这样安全吗?万一别人知道我们的异步通知地址后模拟post怎么办。其实支付宝为我们考虑到了这一点。所以我们需要对接受到的请求进行验证。验证的方法如下。
private $_notifyObj;
public function _initialize()
{
vendor(\'Alipay.lib.alipay_notify\', \'\', \'.class.php\');
$this->_notifyObj = new \AlipayNotify(C(\'ALIPAY_CONFIG\'));
}
需要引入notify这个类,我们还是用vendor来引入。这样我们就实例化了AlipayNotify这个类。
对于异步通知的验证是调用AlipayNotify中的verifyNotify()方法
$verifyResult = $this->_notifyObj->verifyNotify();
该方法的返回结果如果验证通过为true如果失败为false。如果为false说明不是支付宝系统发送来的请求。
如果为true我们就可以继续处理支付的其他操作了。
1.4.9. 同步消息通知地址
通知消息同步意思是当支付完成后支付宝系统会给我们跳转到我们设置在return_url中的地址,并且会在url中带有参数,这样我们就可以接收传来的参数并且对参数判断后给用户输出一个漂亮的界面。在该过程中我们还是需要对请求进行判断,判断是否是支付宝系统发来的请求,指示在此处调用的是AlipayNotify中的verifyReturn()方法,该方法的返回结果也是true或者false。
$verifyResult = $this->_notifyObj->verifyReturn ();
1.5. 讲完了该做什么
我的学生当然是该交作业了,但是在这儿我还要梳理下支付的流程。
首先是我们的商城平台中创建了支付的订单,这儿订单的状态当然是未支付了。然后调用支付来支付订单。在请求建立后我们会让支付宝支付系统去处理,支付系统处理完后会将结果给我们的通知地址,通知地址收到结果后分析下,如果成功了那就修改订单状态为已支付,然后给用户一个可爱的提醒。其实所有的支付流程都是这样的,所以在会用支付宝支付后这个支付流程你值得拥有,不然你有钱都不知道怎么花,那就去扫一扫魏老师的线上demon,当然说明了,一角钱以上才能找我退款哈。