推荐先把支付宝的id key申请好,容易测试些,申请过程中也是欲仙欲死的,用公司的账号申请,直接开一个域名shop.xxx.com,然后装一个ecshop原版进去,模板就用原始的,团购去掉,ecshop自带的测试数据 移动充值哪那里要删掉(不然说你价格过低,有欺诈嫌疑,当时看的我都哭了),要申请的自己去体会吧,申请的是即使到帐支付,然后下载即时到账交易接口(create_direct_pay_by_user)(DEMO下载),飞机票
这里就使用PHP-UTF-8的,
在你的项目里打开thinkphp目录,进入Extend/Vendor,建立一个文件夹取名Alipay,然后把刚下载下来的demo里的lib文件夹里面的四个文件复制到这里来,改名(alipay_core.function.php,alipay_md5.function.php,alipay_notify.class.php,alipay_submit.class.php),然后,打开alipay_submit.class.php和alipay_notify.class.php文件,把以下代码去掉:
require_once("alipay_core.function.php"); require_once("alipay_md5.function.php");
为啥要去掉呢,因为待会儿我们直接在控制器里引入就行了,
然后在你的项目配置文件里配置好支付宝的相关参数,例子如下
'alipay_config'=>array( 'partner' =>'208802xxxxxxxx', //这里是你在成功申请支付宝接口后获取到的PID; 'key'=>'kgut3dmxxxxxxxxx',//这里是你在成功申请支付宝接口后获取到的Key 'sign_type'=>strtoupper('MD5'), 'input_charset'=> strtolower('utf-8'), 'cacert'=> getcwd().'\\cacert.pem', 'transport'=> 'http', 'seller_email'=>'admin@xueqianduan.cn', //这里就是你的卖家账号了 ), 'alipay' =>array( //这里是卖家的支付宝账号,也就是你申请接口时注册的支付宝账号 'seller_email'=>'admin@xueqianduan.cn', //这里是异步通知页面url,提交到项目的Pay控制器的notifyurl方法; 'notify_url'=>'http://www.xxx.com/Pay/notifyurl', //这里是页面跳转通知url,提交到项目的Pay控制器的returnurl方法; 'return_url'=>'http://www.xxx.com/Pay/returnurl', ),
上面的notify_url和return_url地址都是你项目里的回调函数,下面会讲到
然后在项目中新建一个控制器PayAction.class.php,这个地方不要求一样,看自己的需求,在这里我就直接把我的贴上来了
class PayAction extends Action{ //在类初始化方法中,引入相关类库 public function _initialize() { vendor('Alipay.Corefunction'); vendor('Alipay.Md5function'); vendor('Alipay.Notify'); vendor('Alipay.Submit'); //引入刚刚的四个文件 } public function doalipay(){ $alipay_config=C('alipay_config'); //通过C方法读取配置文件 //支付类型 $payment_type = "1"; //必填,不能修改 //服务器异步通知页面路径 $notify_url = C('alipay.notify_url'); //需http://格式的完整路径,不能加?id=123这类自定义参数 //页面跳转同步通知页面路径 $return_url = C('alipay.return_url'); //需http://格式的完整路径,不能加?id=123这类自定义参数,不能写成http://localhost/ //商户订单号 $out_trade_no = I('order_id'); //商户网站订单系统中唯一订单号,必填 //订单名称 $subject = '啥啥网站充值_'.I('order_price'); //必填 //付款金额 $total_fee = floatval(I('order_price')); //必填 //订单描述 $body = '网站充值!'; //商品展示地址 $show_url ='http://www.xxx.com/goods/id/123'; //需以http://开头的完整路径,例如:http://www.商户网址.com/myorder.html //防钓鱼时间戳 $anti_phishing_key = ""; //若要使用请调用类文件submit中的query_timestamp函数 //客户端的IP地址 $exter_invoke_ip = get_client_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; } /****************************** 服务器异步通知页面方法 *******************************/ function notifyurl(){ $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']; //交易状态 $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']; //买家支付宝帐号; if($_POST['trade_status'] == 'TRADE_FINISHED') { // }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') { //这里就写上你的内部的处理流程了 } echo "success"; //请不要修改或删除,因为这是异步通知,你处理好,就会echo出success这7个字符,支付宝的服务器才能知道你已经处理了,不然支付宝会以一定的时间不停的发送这个到你这儿来 }else { //验证失败 echo "fail"; } } /* 页面跳转处理方法;也就是同步通知 */ function returnurl(){ unset($_GET['_URL_']); //这里要写一下,不然你的同步通知永远是支付失败的,这个_URL_是thinkphp待进去的,即使他的值是空的,支付宝会把这个参数用来算结果的,结果想想就知道了。 $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']; //交易状态 $total_fee = $_GET['total_fee']; //交易金额 $notify_id = $_GET['notify_id']; //通知校验ID。 $notify_time = $_GET['notify_time']; //通知的发送时间。 $buyer_email = $_GET['buyer_email']; //买家支付宝帐号; if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') { //这里就写你的项目处理函数了 }else { //这里是支付失败,你的项目处理函数 } }else { //验证失败 //如要调试,请看alipay_notify.php页面的verifyReturn函数 echo "支付失败!"; } } }
支付宝有两种通知,一个是异步,一个是同步。同步就是用户跳转支付宝支付完成后,支付宝又跳转回来,但是有的用户在跳转开始前就关闭了页面,这个时候就无法通知到商户了,所以就出现了异步通知,支付宝直接post相关参数过来告诉你订单支付的情况,所以在通知这里千万要写上你的订单状态判断!别重复写入了。
如果有啥不懂得可以留言@我,虽然我也是初学者!