点击这里给我发消息 QQ登录
【原创】 支付宝即时交易整合TP3.2
栏目:php  作者:力涛  阅读:(3913)

做支付宝或者其他第三方的都需要去申请接口,需要自己的去申请的。

即时交易需要企业支付宝和备案号的网站,而且网站是建设的完全。

注册地址:https://www.alipay.com/

注册的时候选择企业版的支付宝,然后按照他的流程注册,注册完成后就可以去 产品商店 去签约 即时交易 

blob.png

签约之后就是等待了,在这里就可以去整合支付宝了,等申请的 KEY 和 PID 下来就可以测试了。

支付宝签约后的即时交易下载包地址:(我自己留了一份)http://pan.baidu.com/s/1pJRcYvT

下载好之后解压-文件里面有详细的说明,这里目录我就不一一介绍了,自己看说明文档

第一步就是完成集成,所以需要做的是:

blob.png

文件重命名

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' 		=>	'2088021447698852',   					//这里是你在成功申请支付宝接口后获取到的PID;
	    'key'			=>	'm94r73neschynziad6kx3ovgu19p0ikn',		//这里是你在成功申请支付宝接口后获取到的Key
	    'sign_type'		=>	strtoupper('MD5'),
	    'input_charset'	=>	strtolower('utf-8'),
	    'cacert'		=>	getcwd().'\\cacert.pem',				//liunx这里需要注意 \\ 和 / 在liunx的区别
	    'transport'		=>	'http',
	    'seller_email'	=>	'mingyu_lmy@foxmail.com',				// 这里是你的收款账号,
	),
	
	'alipay'  	 		=>	array(
		'notify_url'	=>	'http://www.7fei.wang/Home/Alipay/notifyurl',
		'return_url'	=>	'http://www.7fei.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需要在服务器上才能用,本地测试这里写的任何逻辑是无效的。

文章写到这里基本完成了,自己做过的东西拿出来分享,有疑问请留言告诉我,谢谢~



昵称
邮箱
域名
  记住 通知博主
验证码