做支付宝或者其他第三方的都需要去申请接口,需要自己的去申请的。
即时交易需要企业支付宝和备案号的网站,而且网站是建设的完全。
注册的时候选择企业版的支付宝,然后按照他的流程注册,注册完成后就可以去 产品商店 去签约 即时交易 了
签约之后就是等待了,在这里就可以去整合支付宝了,等申请的 KEY 和 PID 下来就可以测试了。
支付宝签约后的即时交易下载包地址:(我自己留了一份)http://pan.baidu.com/s/1pJRcYvT
下载好之后解压-文件里面有详细的说明,这里目录我就不一一介绍了,自己看说明文档
第一步就是完成集成,所以需要做的是:
文件重命名
alipay_core.function.php -> Corefunction.php alipay_notify.class.php -> Notify.php alipay_submit.class.php -> Submit.php alipay_md5.function.php -> Md5function.php
这样的话就符合TP的命名方式了。
修改文件
其中 Notify.php 和 Md5function.php 需要删除前面引入的两行代码
require_once("alipay_core.function.php"); require_once("alipay_md5.function.php");
然后把文件放入 \ThinkPHP\Library\Vendor\Alipay 目录下
增加配置文件
把 签名文件 cacert.pem 放在网站的跟目录
然后再对应需要支付的模块的conf/config.php中添加支付宝的参数:(没申请下来这里就先预留)
'alipay_config' => array( //支付宝配置参数 'partner' => '20880xxxxxxxxxx', //这里是你在成功申请支付宝接口后获取到的PID; 'key' => 'xxxxxxxxxxxxxxxxxxxxxxn', //这里是你在成功申请支付宝接口后获取到的Key 'sign_type' => strtoupper('MD5'), 'input_charset' => strtolower('utf-8'), 'cacert' => getcwd().'\\cacert.pem', //liunx这里需要注意 \\ 和 / 在liunx的区别 'transport' => 'http', 'seller_email' => 'xx@xx.com', // 这里是你的收款账号, ), 'alipay' => array( 'notify_url' => 'http://www.xxxx.wang/Home/Alipay/notifyurl', 'return_url' => 'http://www.xxxx .wang/Home/Alipay/returnurl', ),
添加逻辑方法
<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK IT ] // +---------------------------------------------------------------------- // | Copyright (c) 2015 http://ming-yu.com All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: long <admin@loveteemo.com> // +---------------------------------------------------------------------- namespace Home\Controller; use Think\Controller; class AlipayController extends Controller{ /** * 函数说明:引入支付宝参数 */ public function _initialize(){ vendor('Alipay.Corefunction'); vendor('Alipay.Md5function'); vendor('Alipay.Notify'); vendor('Alipay.Submit'); } /** * 函数说明:生成订单-支付 * 传递参数: * $_POST['WIDout_trade_no']; 商户订单号 * $_POST['WIDsubject']; 订单名称 必填 * $_POST['WIDtotal_fee']; 付款金额 必填 * $_POST['WIDbody']; 订单描述 * $_POST['WIDshow_url']; 商品展示地址 */ //生成订单 public function dowithpay(){ if(!IS_POST){ $this->error("非法请求"); } $info = xxx;//根据传递的订单号,信息查询 if(!$info){ $this->error("参数非法"); } $alipay_config = C('alipay_config'); $payment_type = "1"; //支付类型 必填,不能修改 $notify_url = C('alipay.notify_url'); //服务器异步通知页面路径 $return_url = C('alipay.return_url'); //页面跳转同步通知页面路径 $out_trade_no = $info['onumber']; //商户订单号 商户网站订单系统中唯一订单号,必填 $subject = $info['oname']; //订单名称 必填 $total_fee = $info['opay']; //付款金额 必填 $body = $info['oname']; //订单描述 $show_url = ''; //商品展示地址 $anti_phishing_key = ""; //防钓鱼时间戳 $exter_invoke_ip = ""; //非局域网的外网IP地址,如:221.0.0.1 /************************************************************/ $parameter = array( "service" => "create_direct_pay_by_user", "partner" => trim($alipay_config['partner']), "seller_email" => trim($alipay_config['seller_email']), "payment_type" => $payment_type, "notify_url" => $notify_url, "return_url" => $return_url, "out_trade_no" => $out_trade_no, "subject" => $subject, "total_fee" => $total_fee, "body" => $body, "show_url" => $show_url, "anti_phishing_key" => $anti_phishing_key, "exter_invoke_ip" => $exter_invoke_ip, "_input_charset" => trim(strtolower($alipay_config['input_charset'])) ); //建立请求 $alipaySubmit = new \AlipaySubmit($alipay_config); $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认"); echo $html_text; } /** * 函数说明:支付宝回调异步函数 * 附带操作数据库 */ public function notifyurl(){ header("Content-Type:text/html;charset=utf-8"); $alipay_config = C('alipay_config'); $alipayNotify = new \AlipayNotify($alipay_config); $verify_result = $alipayNotify->verifyNotify(); //计算得出通知验证结果 if($verify_result) { //验证成功 $out_trade_no = $_POST['out_trade_no']; //商户订单号 $trade_no = $_POST['trade_no']; //支付宝交易号 $trade_status = $_POST['trade_status']; //交易状态 if($_POST['trade_status'] == 'TRADE_FINISHED') { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的 //如果有做过处理,不执行商户的业务程序 //用户登陆支付宝的时候把支付宝的订单存入数据库,而状态修改为 98 //M('order')->where(array("onumber"=>$out_trade_no,"ostatic"=>98))->save(array("ostatic"=>1,"etime"=>time())); //注意: //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知 } else if ($_POST['trade_status'] == 'TRADE_SUCCESS') { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的 //如果有做过处理,不执行商户的业务程序 M('order')->where(array("onumber"=>$out_trade_no,"ostatic"=>0))->save(array("opaynumber"=>$trade_no,"ostatic"=>1)); //注意: //付款完成后,支付宝系统发送该交易状态通知 //logResult("付款完成,订单号:".$out_trade_no .",支付宝交易号:".$trade_no.",交易状态:".$trade_status.""); } echo "success"; //请不要修改或删除 }else { echo "fail"; //验证失败 } } /** * 函数说明:支付宝成功支付后的转跳页面 * */ public function returnurl(){ header("Content-Type:text/html;charset=utf-8"); $alipay_config = C('alipay_config'); $alipayNotify = new \AlipayNotify($alipay_config); $verify_result = $alipayNotify->verifyReturn(); if($verify_result) { //验证成功 $out_trade_no = $_GET['out_trade_no']; //商户订单号 $trade_no = $_GET['trade_no']; //支付宝交易号 $trade_status = $_GET['trade_status']; //交易状态 if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') { redirect(U('Home/Member/orderpay',array("onumber"=>$out_trade_no))); } else { echo "trade_status=".$_GET['trade_status']; } echo "验证成功<br />"; } else { echo "验证失败"; } } }
到这里基本算完成了,需要等到申请的 KEY 和 PID 下来就可以测试了,需要注意的是:
notifyurl需要在服务器上才能用,本地测试这里写的任何逻辑是无效的。
文章写到这里基本完成了,自己做过的东西拿出来分享,有疑问请留言告诉我,谢谢~