ThinkPHP整合支付宝即时到账接口调用
首先是在支付宝的蚂蚁金服开放平台下载PHP的demo:
https://doc.open.alipay.com/doc2/detail?treeId=62&articleId=103566&docType=1
下载地址如上,里面有个MD5加密方式UTF8的PHP的demo可以拿来用,可以直接在localhost上跑,传入合适的参数即使体验支付一次,这点和微信支付接口调用的demo相同。
现在我们尝试将其中demo的lib类文件整合到thinkphp之中去。
将四个lib改名放入Vendor文件夹:(文件在我的文件之中),相比官方demo仅仅改动里面的PHP文件include
点击支付并传入订单ID:
public function pay_request() { $id = intval($_GET['order_id']);//传入订单ID if($id){ $o = D('order_info'); $order_info = $o->where('order_id = %d',$id)->find();//查询出所有订单信息 if(empty($order_info['paycode'])){ $order_info['paycode'] = 'Alipay'; } $class = 'Com\\Pay\\'.$order_info['paycode']; // import($path); $pay = new $class;//实例化支付宝类 $pay->getCode($order_info); } }
类文件:
Alipay.class.php:
在alipay里面引用vendor文件夹里面类库文件操作:
/** * 引入支付宝 */ vendor('Alipay.Corefunction'); vendor('Alipay.Md5function'); vendor('Alipay.Notify'); vendor('Alipay.Submit');
在这里复习一下ThinkPHP之中第三方类库的引用:
1、当你把类文件放在liberary下面的任意一个文件夹时候,比如alipay.class.php,给他加上相应文件夹对应的命名空间就可以直接实例化;
保存到 ThinkPHP/Library/Org/Util/Auth.class.php
。
namespace Org\Util;class Auth { }
引用:
new \Org\Util\Auth();
此时系统会自动加载那个类文件并进行实例化。
2、注册命名空间(自己在任意位置(用常量写出绝对路径)创建文件夹并且声明为一个命名空间);类库映射(命名空间过多导致类文件加载慢)加快类文件的加载。这两个不考虑使用,仅作了解。
3、第三方类库文件的引用,比如上面的vendor文件夹下面的Alipay文件夹下面的四个类文件(里面连namespace都木有,直接就是class{###}),引用有两种方法:第一种是在任意文件夹下面乱放,然后用import方法
// 导入Org类库包 Library/Org/Util/Date.class.php类库import("Org.Util.Date"); // 导入Home模块下面的 Application/Home/Util/UserUtil.class.php类库import("Home.Util.UserUtil"); // 导入当前模块下面的类库 import("@.Util.Array"); // 导入Vendor类库包 Library/Vendor/Zend/Server.class.phpimport('Vendor.Zend.Server');
这个我们不考虑如何具体使用,我们以后规定,统统放在vendor文件夹下面,然后我们就用一个方便的方法引用类文件,
如果你的第三方类库都放在Vendor目录下面,并且都以.php为类文件后缀,也没用采用命名空间的话,那么可以使用系统内置的Vendor函数简化导入。例如,我们把 Zend 的 Filter\Dir.php 放到 Vendor 目录下面,这个时候 Dir 文件的路径就是 Vendor\Zend\Filter\Dir.php,我们使用vendor 方法导入只需要使用:
Vendor('Zend.Filter.Dir'); 具体看看上面alipay四个类文件的引用;
'YUMING' => 'https://www.homewide.cn',
<?php namespace Com\Pay; class Alipay { private $config; public function __construct($config = null) { if($config){ $this->config = unserialize($config); }else{ $this->config = array( 'pid'=>'**卖家申请成功后得到的PID****', 'key'=>'**卖家申请成功后获取的key**', 'seller_email'=>'***卖家支付宝账号**', 'notify_url'=>(C('YUMING').U('Home/Login/pay_respone')),//C(‘yunyin’)这个常量是网址www.haveadream.win 'return_url'=>(C('YUMING').U('Home/User/my_order')), ); } //这里我们通过TP的C函数把配置项参数读出,赋给$alipay_config; $this->config['alipay_config'] = array( 'partner' =>$this->config['pid'], //这里是你在成功申请支付宝接口后获取到的PID; 'key'=>$this->config['key'],//这里是你在成功申请支付宝接口后获取到的Key 'sign_type'=>strtoupper('MD5'), 'input_charset'=> strtolower('utf-8'), // 'cacert'=> getcwd().'\\domain.crt', 'cacert'=> getcwd().'\\cacert.pem', 'transport'=> 'http', ); /** * 引入支付宝 */ vendor('Alipay.Corefunction'); vendor('Alipay.Md5function'); vendor('Alipay.Notify'); vendor('Alipay.Submit'); } /*生成支付按钮*/ public function getCode($order_info)//跑这个方法的时候就已经在construct函数里面将config数据传递进去了 { /********************************************************* 把alipayapi.php中复制过来的如下两段代码去掉, 第一段是引入配置项, 第二段是引入submit.class.php这个类。 为什么要去掉?? 第一,配置项的内容已经在项目的Config.php文件中进行了配置,我们只需用C函数进行调用即可; 第二,这里调用的submit.class.php类库我们已经在PayAction的_initialize()中已经引入;所以这里不再需要; *****************************************************/ /**************************请求参数**************************/ $payment_type = "1"; //支付类型 //必填,不能修改 $notify_url = $this->config['notify_url']; //服务器异步通知页面路径 $return_url = $this->config['return_url']; //页面跳转同步通知页面路径 $seller_email = $this->config['seller_email'];//卖家支付宝帐户必填 $out_trade_no = $order_info['order_sn'];//商户订单号 通过支付页面的表单进行传递,注意要唯一! $subject = '家安采购订单'; //订单名称 //必填 通过支付页面的表单进行传递 $total_fee = $order_info['pay_money']; //付款金额 //必填 通过支付页面的表单进行传递 //$total_fee = 0.01; //付款金额 //必填 通过支付页面的表单进行传递 $body = '采购上家安'; //订单描述 通过支付页面的表单进行传递 $show_url = ''; //商品展示地址 通过支付页面的表单进行传递 $anti_phishing_key = "";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数 $exter_invoke_ip = get_client_ip(); //客户端的IP地址,这个方法是ThinkPHP之中自带的方法的 //商品数量 $quantity = "1"; //必填,建议默认为1,不改变值,把一次交易看成是一次下订单而非购买一件商品 //物流费用 $logistics_fee = "0.00"; //必填,即运费 //物流类型 $logistics_type = "EXPRESS"; //必填,三个值可选:EXPRESS(快递)、POST(平邮)、EMS(EMS) //物流支付方式 $logistics_payment = "SELLER_PAY"; //必填,两个值可选:SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费) //订单描述 //收货人姓名 $receive_name = $order_info['consignee']; //如:张三 //收货人地址 $receive_address = 'XX省XXX市XXX区XXX路XXX小区XXX栋XXX单元XXX号'; //如:XX省XXX市XXX区XXX路XXX小区XXX栋XXX单元XXX号 //收货人邮编 $receive_zip = '123456'; //如:123456 //收货人电话号码 $receive_phone = '0000-0000000'; //如:0571-88158090 //收货人手机号码 $receive_mobile = '13***21'; //如:13312341234 /************************************************************/ //构造要请求的参数数组,无需改动 $parameter = array( "service" => "create_direct_pay_by_user", "partner" => trim($this->config['pid']), "payment_type" => $payment_type, "notify_url" => $notify_url, "return_url" => $return_url, "seller_email" => $seller_email, "out_trade_no" => $out_trade_no, "subject" => $subject, "price" => $total_fee, "quantity" => $quantity, "logistics_fee" => $logistics_fee, "logistics_type" => $logistics_type, "logistics_payment" => $logistics_payment, "body" => $body, "show_url" => $show_url, "receive_name" => $receive_name, "receive_address" => $receive_address, "receive_zip" => $receive_zip, "receive_phone" => $receive_phone, "receive_mobile" => $receive_mobile, "_input_charset" => trim(strtolower($this->config['alipay_config']['input_charset'])) ); // var_dump($parameter);die; // var_dump($parameter);die; //建立请求 $alipaySubmit = new \AlipaySubmit($this->config['alipay_config']); $html_text = $alipaySubmit->buildRequestForm($parameter,"post", ""); echo $html_text;die; } public function respone() { // file_put_contents('./pay.txt',var_export($_REQUEST,true)); /* 同理去掉以下两句代码; */ //require_once("alipay.config.php"); //require_once("lib/alipay_notify.class.php"); //计算得出通知验证结果 $alipayNotify = new \AlipayNotify($this->config['alipay_config']); $verify_result = $alipayNotify->verifyNotify(); // if(!$verify_result){ // file_put_contents('./pay.txt','验证失败',FILE_APPEND); // }else{ // file_put_contents('./pay.txt','验证成功!',FILE_APPEND); // } if($verify_result) { // file_put_contents('./pay.txt','进来了',FILE_APPEND); //验证成功 //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表 $out_trade_no = $_POST['out_trade_no']; //商户订单号 $trade_no = $_POST['trade_no']; //支付宝交易号 $trade_status = $_POST['trade_status']; //交易状态 $total_fee = $_POST['total_fee']; //交易金额 $notify_id = $_POST['notify_id']; //通知校验ID。 $notify_time = $_POST['notify_time']; //通知的发送时间。格式为yyyy-MM-dd HH:mm:ss。 $buyer_email = $_POST['buyer_email']; //买家支付宝帐号; $parameter = array( "out_trade_no" => $out_trade_no, //商户订单编号; "trade_no" => $trade_no, //支付宝交易号; "total_fee" => $total_fee, //交易金额; "trade_status" => $trade_status, //交易状态 "notify_id" => $notify_id, //通知校验ID。 "notify_time" => $notify_time, //通知的发送时间。 "buyer_email" => $buyer_email, //买家支付宝帐号; ); if($_POST['trade_status'] == 'TRADE_FINISHED') { }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') { if(!check_order_status($out_trade_no)){ // file_put_contents('./pay.txt','1进来了',FILE_APPEND); $data = array( 'order_sn'=>$out_trade_no, 'des'=>('订单交易:'.$out_trade_no), 'money'=>$total_fee, ); orderhandle($data); //进行订单处理,并传送从支付宝返回的参数; } } echo "success"; //请不要修改或删除 }else { //验证失败 echo "fail"; // file_put_contents('./pay.txt',var_export($verify_result,true),FILE_APPEND); // file_put_contents('./pay.txt',var_export($this->config,true),FILE_APPEND); file_put_contents('./pay.txt','验证失败',FILE_APPEND); } } } ?>
U('Home/Login/pay_respone')://服务器异步通知页面路径
public function pay_respone() { // file_put_contents('./pay.txt',var_export($_REQUEST,true)); if(IS_POST){ $o = D('order_info'); $order_info = $o->where('order_sn = "%s"',$_POST['out_trade_no'])->find(); if(empty($order_info['paycode'])){ $order_info['paycode'] = 'Alipay'; } $class = 'Com\\Pay\\'.$order_info['paycode']; // import($path); $pay = new $class; $pay->respone(); } }
U('Home/User/my_order')://页面跳转同步通知页面路径
public function my_order(){ /* 取出左边分类栏目start */ $c = D('category'); $left_menu = $c->get_category(); $this->assign('category_menu',$left_menu); /* 取出左边分类栏目end */ //取出该采购商所有订单信息 $o = D('order_info'); $list = $o->getList(); $page = $o->getPage(); $countNum = $o->getCount(); // var_dump($res); $this->assign('list',$list); $this->assign('page',$page); $this->assign('countNum',$countNum); //获取总金额 $this->assign('countMoney',sprintf('%.2f',$o->get_order_count_num())); $other = array( 'is_submit'=>$o->get_order_num('is_submit'), 'is_send'=>$o->get_order_num('is_send'), 'is_ok'=>$o->get_order_num('is_ok'), 'is_cancel'=>$o->get_order_num('is_cancel'), ); $this->assign($other); $this->display(); }
上面就是所有的alipay的接口调用,以及回调数据处理了
付款成功跳转的HTML:
<div class="status"> <ul class="title_tab"> <li id="btn_alreadyCommit" onclick="location.href='{:U('User/my_order',array('other'=>'is_submit'))}'" class="li <?php if($_GET['other'] == 'is_submit'){echo 'cur';} ?>" style="cursor:pointer">已提交<em class="f_bold c_f00">({$is_submit})</em></li> <li id="btn_alreadySure" onclick="location.href='{:U('User/my_order',array('other'=>'is_send'))}'" class="li <?php if($_GET['other'] == 'is_send'){echo 'cur';} ?>" style="cursor:pointer">已发货<em class="f_bold c_f00">({$is_send})</em></li> <li id="btn_alreadyComplay" class="li <?php if($_GET['other'] == 'is_ok'){echo 'cur';} ?>" onclick="location.href='{:U('User/my_order',array('other'=>'is_ok'))}'" style="cursor:pointer">交易完成<em class="f_bold c_f00">({$is_ok})</em></li> <li id="btn_alreadyCancel" onclick="location.href='{:U('User/my_order',array('other'=>'is_cancel'))}'" class="li <?php if($_GET['other'] == 'is_cancel'){echo 'cur';} ?>" style="cursor:pointer">已取消<em class="f_bold c_f00">({$is_cancel})</em></li> </ul> </div>
更详细参考文档:
http://www.thinkphp.cn/code/240.html
说了那么多,四个官方给的lib里面的类文件还是得看啊,兄弟!!!
ThinkPHP整合支付宝即时到账接口调用的更多相关文章
- PHP九大接口视频教程( 支付宝,QQ,短信接口,微信接口开发, 支付宝即时到账接口开发三级分销全套)
PHP九大接口视频教程( 支付宝,QQ,短信接口,微信接口开发, 支付宝即时到账接口开发三级分销全套) 需要的联系我:QQ: 1844912514 PHP九大接口视频教程( 支付宝,QQ,短信接口 ...
- thinkphp框架对接支付宝即时到账接口回调的代码
关于支付宝即时收款接口的对接过程,很简单,也有很多人发过,我这里就不在啰嗦了,对接完成后,在线支付成功后的回调,相对来说,是个难点,,我重点分享下我的经验. 我在开发二代旅游CMS(http://ww ...
- ThinkPHP 3.2 支付宝即时到账接口开发
前言: 一.支付流程 构造请求参数 向支付宝网关发送请求 生成支付宝页面 支付宝交易结果 二.构建支付类 1.官方即时到账文档地址: https://doc.open.alipay.com/doc2/ ...
- 支付宝即时到账接口开发 - DEMO讲解
支付宝即时到帐接口 环境要求 PHP5.0以上,且需要开启curl.openssl. 文档地址: https://doc.open.alipay.com/doc2/detail?treeId=62&a ...
- thinkPHP 接支付宝及时到账接口
支付宝及时到帐接口,现在整理以下: 1.先将支付宝提供的公共类库函数库文件防盗thinkPHP的Vender目录下建的一个alipay文件下,以便之后的调用. //四个文件我分别给他们改了下名字,因为 ...
- PHP实现支付宝即时到账功能
本文实例为大家分享了PHP支付宝即时到账功能的实现代码,供大家参考,具体内容如下 首先需要下载即时到账交易接口,传送门https://doc.open.alipay.com/doc2/detail?t ...
- ***CodeIgniter框架集成支付宝即时到账支付SDK
本文为CI集成支付宝即时到账支付接口 1.下载支付宝官方demo ;即时到账交易接口(create_direct_pay_by_user)(DEMO下载) 原文地址:https://doc.open. ...
- PHP 接入支付宝即时到账功能
首先请到支付宝那边申请一个及时到账的接口账户,需要提交相关材料申请.然后根据即时到账的API文档进行接入.API文档提供了各种语言版本的demo,我这里是下的php版demo,然后再进行相关修改操作. ...
- *CodeIgniter框架集成支付宝即时到账SDK
客户的网站需要支付功能,我们选择了业界用的最多的支付宝即时到账支付.申请了两次将近两周的时间终于下来了,于是我开始着手测试SDK整合支付流程. SDK中的代码并不复杂,就是构造请求发送,接收并验证签名 ...
随机推荐
- java异常处理机制throw
- flask log
import logging from logging.handlers import RotatingFileHandler from flask import Flask app = Flask( ...
- isAnagram
/*Given two strings s and t, write a function to determine if t is an anagram of s. For example, s = ...
- Caught exception while loading file struts-default.xml 错误
严重: Exception starting filter struts2 Caught exception while loading file struts-default.xml - [unkn ...
- jsp页面List迭代
1.行迭代 <tbody> <c:choose> <c:when test="${not empty result}"> &l ...
- 11-UIView与核心动画对比
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- Java-convert between INT and STRING
int -> String 三种写法 String s = 43 + ""; String s = String.valueOf(43); String s = Intege ...
- 转载KMP
出处: http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 在假期之前,断 ...
- python核心编程 第二天
1.标准输入输出: import sys saveout=sys.stdout#保存当前输出状态 logfile=open('E://log.txt','r')# 打开文件 sys.stdout=lo ...
- Android开发-API指南-<application>
<application> 英文原文:http://developer.android.com/guide/topics/manifest/application-element.html ...