支付寶及時到賬接口,如今整理如下:php
1.先將支付寶提供的公共類庫函數庫文件防盜thinkPHP的Vender目錄下建的一個alipay文件下,以便以後的調用。html
//四個文件我分別給他們改了下名字,由於因爲thinkphp Vender目錄下,調用路徑的問題,如Vender("Alipay.Core.function")這樣的結果的Alipay目錄下的Core目錄下function.php 文件
7 |~Alipay/ 8 | |-Corefunction.php* 9 | |-Md5function.php* 10 | |-Notify.php* 11 | |`-Submit.php*
2.新建一個PayAction.class.php文件 thinkphp
一共三個方法,doalipay是api文件,returnurl是同步傳輸文件,notifyurl是異步傳輸文件 api
<?php header("content-type:text/html;charset=utf-8"); class PayAction extends Action{ //在類初始化方法中,引入相關類庫 public function _initialize() { vendor('Alipay.Corefunction'); vendor('Alipay.Md5function'); vendor('Alipay.Notify'); vendor('Alipay.Submit'); } public function doalipay(){ //這裏咱們經過TP的C函數把配置項參數讀出,賦給$alipay_config; $alipay_config=C('alipay_config'); /**************************請求參數**************************/ $payment_type = "1"; //支付類型 //必填,不能修改 $notify_url = C('alipay.notify_url'); //服務器異步通知頁面路徑 $return_url = C('alipay.return_url');//頁面跳轉同步通知頁面路徑 $seller_email = C('alipay.seller_email');//賣家支付寶賬戶必填 $out_trade_no = $_POST['trade_no']; //商戶訂單號 經過支付頁面的表單進行傳遞,注意要惟一! $subject = $_POST['ordsubject']; //訂單名稱 //必填 經過支付頁面的表單進行傳遞 $total_fee = $_POST['ordtotal_fee']; //付款金額 //必填 經過支付頁面的表單進行傳遞 //對前臺傳過來的價錢數據作判斷 $orderId=$out_trade_no; $oOb=M("order"); $orderArr=$oOb->field("count(*) as num")->where("orderId='{$orderId}'")->select(); $num=$orderArr[0]['num']; if($num==0){ $coOb = M("cardorder"); $arr = $coOb->where("orderId='{$orderId}'")->select(); //var_dump($arr); $realPrice = $arr[0]['price'] - $arr[0]['discount'] - $arr[0]['yhqPrice']; //var_dump($total_fee); var_dump($realPrice); die; if($total_fee != $realPrice){ header("location:index.php?m=Member&a=payFail"); } }else{ $arr=$oOb->where("orderId='{$orderId}'")->select(); $realPrice = $arr[0]['price'] - $arr[0]['discount'] - $arr[0]['yhq']; if($total_fee != $realPrice){ header("location:index.php?m=Member&a=payFail"); } } $body = $_POST['ordbody']; //訂單描述 經過支付頁面的表單進行傳遞 $show_url = $_POST['ordshow_url'];//商品展現地址 經過支付頁面的表單進行傳遞 $anti_phishing_key = "";//防釣魚時間戳 //若要使用請調用類文件submit中的query_timestamp函數 //$exter_invoke_ip = get_client_ip();//var_dump($exter_invoke_ip);die(); //客戶端的IP地址 $exter_invoke_ip = $_SERVER["REMOTE_ADDR"];//var_dump($exter_invoke_ip);die(); //客戶端的IP地址 /************************************************************/ //構造要請求的參數數組,無需改動 $parameter = array( "service" => "create_direct_pay_by_user", "partner" => trim($alipay_config['partner']), "payment_type" => $payment_type, "notify_url" => $notify_url, "return_url" => $return_url, "seller_email" => $seller_email, "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'])) ); //var_dump($parameter);die(); //創建請求 $alipaySubmit = new AlipaySubmit($alipay_config); $html_text = $alipaySubmit->buildRequestForm($parameter,"post", "確認"); 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']; //買家支付寶賬號; $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, //買家支付寶賬號; ); //file_put_contents("/index/paylog.txt",$parameter,FILE_APPEND); if($_POST['trade_status'] == 'TRADE_FINISHED') { // }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') { if(!checkorderstatus($out_trade_no)){ orderhandle($parameter); //進行訂單處理,並傳送從支付寶返回的參數; } } echo "success"; //請不要修改或刪除 }else { //驗證失敗 echo "fail"; } } function returnurl(){ $alipay_config = C('alipay_config'); $alipayNotify = new AlipayNotify($alipay_config);//計算得出通知驗證結果 $verify_result = $alipayNotify->verifyReturn(); //var_dump($_GET); 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']; //買家支付寶賬號; $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, //買家支付寶賬號 ); //echo "<pre>";var_dump($parameter);echo "</pre>";die(); if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') { if(!checkorderstatus($out_trade_no)){ orderhandle($parameter); //進行訂單處理,並傳送從支付寶返回的參數; //die(); } $this->redirect(C('alipay.successpage'));//跳轉到配置項中配置的支付成功頁面; }else { echo "trade_status=".$_GET['trade_status']; $this->redirect(C('alipay.errorpage'));//跳轉到配置項中配置的支付失敗頁面; } }else { //驗證失敗 //如要調試,請看alipay_notify.php頁面的verifyReturn函數 echo "支付失敗!"; } } }
3.在index/Common/common.php中加入兩個函數,在上面Action中調用數組
//判斷訂單的狀態是否已經修改 function checkorderstatus($orderId){ 94 $oOb=M("order"); 95 $cOb=M('cardorder'); 96 $orderArr=$oOb->field("count(*) as num")->where("orderId='{$orderId}'")->select(); 97 $num=$orderArr[0]['num']; 98 if($num==0){ 99 $ordstatus=$cOb->where("orderId='".$orderId."'")->getField('status'); 100 }else{ 101 $ordstatus=$oOb->where("orderId='".$orderId."'")->getField('status'); 102 } 103 if($ordstatus==1){ 104 return false; 105 }else{ 106 return true; 107 } 108 }
function orderhandle($parameter){ 112 123 $orderId=$parameter['out_trade_no']; 124 $oOb=M("order"); 125 $orderArr=$oOb->field("count(*) as num")->where("orderId='{$orderId}'")->select(); 126 $num=$orderArr[0]['num']; 130 $date=date("Y-m-d H:i:s"); 131 if($num==0){ 132 $coOb=M("cardorder"); 133 $arr=$coOb->where("orderId='{$orderId}'")->select(); 134 //echo "<pre>";var_dump($arr);echo "</pre>"; 135 $pid=$arr[0]['pid']; 136 $coOb->query("update r_cardorder set status=2,updateTime='{$date}' where orderId='{$orderId}'"); 137 //echo $coOb->getLastSql(); 138 $cOb=M("card"); 139 $cOb->query("update r_card set store=store-1 where id={$pid}"); 140 $cArr=$cOb->where("id={$pid}")->select(); 141 $buyedOb=M("buyedcard"); $type = $cArr[0]['type']; 152 $buyedArr=array("CCID"=>$arr[0]['CCID'],"type"=>$type,"beginTime"=>$cArr[0]['beginTime'],"endTime"=>$cArr[0]['endTime'], "data"=>$cArr[0]['data']); 153 $re2=$buyedOb->data($buyedArr)->add(); 154 $yhqId=$arr[0]['yhqId']; 155 if($yhqId!=0){ 156 $yOb=M("yhq"); 157 $yOb->query("update r_yhq set status=2,updateTime='{$date}' where id={$yhqId}"); 158 } 159 160 }else{ 161 $arr=$oOb->where("orderId='{$orderId}'")->select(); 162 //var_dump($arr); 163 $pid=$arr[0]['pid']; 164 $oOb->query("update r_order set status=2 ,updated_at='{$date}' where orderId='{$orderId}'"); 165 $ob=M("product"); 166 $ob->query("update r_product set store=store-1 where id={$pid}"); 167 }
4.修改配置文件 index/config.php 服務器
共5個必傳參數異步
//支付寶配置參數 36 'alipay_config'=>array( 37 'partner' =>'1234567890123456', //這裏是你在成功申請支付寶接口後獲取到的PID; 38 'key'=>'qwaszxasqwqi07jyl6eudgzdfcmtpmxu',//這裏是你在成功申請支付寶接口後獲取到的Key 39 'sign_type'=>strtoupper('MD5'), 40 'input_charset'=> strtolower('utf-8'), 41 'cacert'=> getcwd().'\\cacert.pem', 42 'transport'=> 'http', 43 ), 44 46 47 'alipay' =>array( 48 //這裏是賣家的支付寶帳號,也就是你申請接口時註冊的支付寶帳號 49 'seller_email'=>'xxx@xxx.cn', 50 //這裏是異步通知頁面url,提交到項目的Pay控制器的notifyurl方法; 51 //'notify_url'=>'http://www.xxx.com/index.php?m=Pay&a=notifyurl', 52 'notify_url'=>'http://www.xxx.com/alipay_notifyurl.php', 53 //這裏是頁面跳轉通知url,提交到項目的Pay控制器的returnurl方法; 54 'return_url'=>'http://www.xxx.com/index.php?m=Pay&a=returnurl', 55 //支付成功跳轉到的頁面,我這裏跳轉到項目的Member控制器,myorder方法,並傳參payed(已支付列表)
5.在html中將支付寶必要的參數傳到PayAction.class.php 裏的doalipay 中,html文件以下:函數
<form action="?m=Pay&a=doalipay" method="post" id="form"> 237 238 <div class="title1 clear"> 239 <div class="leftt"> 240 <img style="margin: 0.4em" src="{{$pArr.thumbimg}}" class="iconimg" width="100%"> 241 </div> 242 <div class="desc"> 243 <h2>{{$pArr.title}}</h2> 244 245 <div>價格:¥{{$pArr.price-$pArr.discount}} 元</div> 246 247 </div> 248 <input type="hidden" name="trade_no" value="{{$orderId}}"><!--訂單號--> //必傳 249 250 <input type="hidden" name="ordsubject" value="WiFi隨身寶"><!--訂單名稱--> //必傳 251 <input type="hidden" name="ordbody" value="{{$data}}"><!--訂單描述--> //必傳 252 </div> 253 254 255 <input type="hidden" name="ordtotal_fee" value="{{$pArr.price-$pArr.discount}}" id="priceNew"><!--總金額--> //必傳 256 <input type="hidden" name="ordshow_url" value="http://m.heimiwifi.com/index.php?m=Product&a=detail_buy&id={{$pArr.id}}"><!--商品展現url--> //必傳 257 258 </div> 259 260 <div class="card_pay"> 261 <div class="cp_title">選擇支付方式</div> 262 <div class="pay_div clear pay_div1"> 263 <div class="pay_left"> 264 <img width="100%" src="__ROOT__/index/Tpl/images/checked.png" id="pay1"> 265 </div> 266 <div class="pay_middle"> 267 <img width="100%" src="__ROOT__/index/Tpl/images/alipayicon.png"> 268 </div> 269 <div class="pay_right clear pay_div2"> 270 <span class="p1">支付寶在線支付</span>
284 </div>
285 </div>
286 </div>
287
288 <div class="sureOrderBtn">
289 <div class="sure_left">
290 <h2 style="color:#e54a3e;">應付金額:¥<span id="totalprice">{{$pArr.price-$pArr.discount}}</span> 元</h2>
291 </div>
292 <div class="sure_right">
293 <img style="line-height:140px" width="100%" src="__ROOT__/index/Tpl/images/ok.gif" id="orderBtn" >
294 </div>
295
296 </div>
297 </form>post