電腦端網頁 微信掃碼支付和支付寶支付
注意:支付完成后的通知地址中,格式要使用a\5\b\3這種的,而不是a=5&b=3這種的,否則通知不到。
電腦端手機端的微信和支付寶支付都已掌握,貼一下代碼備用 ,基於thinkphp
微信:
class WxpayMobile extends Action{ //在類初始化方法中,引入相關類庫 public function _initialize() { header("Content-type:text/html;charset=utf-8"); vendor('WxPayPubHelper.SDKRuntimeException'); define("APPID", C('WX_APPID')); define("MCHID", C('WX_MCHID')); define("KEY", C('WX_KEY')); define("APPSECRET", C('WX_APPSECRET')); define("JS_API_CALL_URL", C('site_url').U('Wxpay/wap_dowxpay')); define('SSLCERT_PATH',C('site_url').'/Framework/Extend/Vendor/WxPayPubHelper/cacert/apiclient_cert.pem'); define('SSLKEY_PATH',C('site_url').'/Framework/Extend/Vendor/WxPayPubHelper/cacert/apiclient_key.pem'); define('NOTIFY_URL',C('site_url').'/index.php/Wxpay/通知接口'); define('CURL_TIMEOUT',30); vendor('WxPayPubHelper.WxPayPubHelper'); } public function index() { echo "禁止訪問"; } public function dowxpay(){ //使用統一支付接口 $unifiedOrder = new UnifiedOrder_pub(); $fee = $_POST['pay_cash']*100; //echo "'".$_POST['mas_id']."'"; //設置統一支付接口參數 //設置必填參數 //appid已填,商戶無需重復填寫 //mch_id已填,商戶無需重復填寫 //noncestr已填,商戶無需重復填寫 //spbill_create_ip已填,商戶無需重復填寫 //sign已填,商戶無需重復填寫 $unifiedOrder->setParameter("body","訂單付款");//商品描述 //自定義訂單號,此處僅作舉例 $out_trade_no = $_POST['order_no']; $unifiedOrder->setParameter("out_trade_no",$out_trade_no);//商戶訂單號 $unifiedOrder->setParameter("total_fee",$fee);//總金額 $unifiedOrder->setParameter("notify_url",NOTIFY_URL);//通知地址 $unifiedOrder->setParameter("trade_type","NATIVE");//交易類型 //非必填參數,商戶可根據實際情況選填 //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商戶號 //$unifiedOrder->setParameter("device_info","XXXX");//設備號 //$unifiedOrder->setParameter("attach","'".$_POST['mas_id']."'");//附加數據 //$unifiedOrder->setParameter("time_start","XXXX");//交易起始時間 //$unifiedOrder->setParameter("time_expire","XXXX");//交易結束時間 //$unifiedOrder->setParameter("goods_tag","XXXX");//商品標記 //$unifiedOrder->setParameter("openid","XXXX");//用戶標識 //$unifiedOrder->setParameter("product_id","XXXX");//商品ID //獲取統一支付接口結果 $unifiedOrderResult = $unifiedOrder->getResult(); //print_r($unifiedOrderResult); //商戶根據實際情況設置相應的處理流程 if ($unifiedOrderResult["return_code"] == "FAIL") { //商戶自行增加處理流程 // echo "通信出錯:".$unifiedOrderResult['return_msg']."<br>"; } elseif($unifiedOrderResult["result_code"] == "FAIL") { //商戶自行增加處理流程 // echo "錯誤代碼:".$unifiedOrderResult['err_code']."<br>"; //echo "錯誤代碼描述:".$unifiedOrderResult['err_code_des']."<br>"; } elseif($unifiedOrderResult["code_url"] != NULL) { //從統一支付接口獲取到code_url $code_url = $unifiedOrderResult["code_url"]; //商戶自行增加處理流程 //...... } $this->assign('code_url',$code_url); $this->assign('out_trade_no',$out_trade_no); $this->display(); } //支付界面 public function pay_online(){ //獲取會員信息 if(!isset($_SESSION['open_id'])){ get_code(); } $Apply = D('ApplyView'); $where = array( 'id'=>$_GET['out_trade_no'], ); $my_order=$Apply->where($where)->find(); //$my_order = $Apply->where($where)->find(); if(empty($my_order)){ $this->error('該訂單不存在!',U('User/index')); }elseif($my_order['pay_state']==1){ $this->error('該訂單已經支付過!',U('User/index')); }else{ header("Content-type:text/html;charset=utf-8"); //獲取店鋪微信支付數據 define("APPID", C('WX_APPID')); define("MCHID", C('WX_MCHID')); define("KEY", C('WX_KEY')); define("APPSECRET", C('WX_APPSECRET')); define('NOTIFY_URL','http://'.$_SERVER['HTTP_HOST'].'/index.php/Wxpay/notifyurl'); define('CURL_TIMEOUT',30); vendor('WxPayPubHelper.WxPayPubHelper'); vendor('WxPayPubHelper.SDKRuntimeException'); $out_trade_no = $my_order['id']; //訂單號 $fee = $my_order['cost']; //應付金額 //使用jsapi接口 $jsApi = new JsApi_pub(); //=========步驟1:網頁授權獲取用戶openid============ //通過code獲得openid $openid = $_SESSION['open_id']; //=========步驟2:使用統一支付接口,獲取prepay_id============ //使用統一支付接口 $unifiedOrder = new UnifiedOrder_pub(); /* 2015年10月12日 18:27:53 用戶子商戶付款 ↓*/ //$Shop = M('Shop'); //$shop = $Shop->where('shopid = '.$my_order['shopid'])->find(); //$unifiedOrder->setParameter("sub_appid",$shop['wx_appid']);//子商戶號碼 // echo $shop['wx_appid']; // $unifiedOrder->setParameter("sub_mch_id",MCHID);//子商戶號碼 /* 2015年10月12日 18:27:53 用戶子商戶付款 ↑*/ //dump($openid);dump($out_trade_no);dump(NOTIFY_URL); $unifiedOrder->setParameter("openid","$openid");//商品描述 $unifiedOrder->setParameter("body","報名付款");//商品描述 //自定義訂單號,此處僅作舉例 $unifiedOrder->setParameter("out_trade_no",$out_trade_no);//商戶訂單號 $unifiedOrder->setParameter("total_fee",$fee*100);//總金額 $unifiedOrder->setParameter("notify_url",NOTIFY_URL);//通知地址 $unifiedOrder->setParameter("trade_type","JSAPI");//交易類型 $prepay_id = $unifiedOrder->getPrepayId(); if($prepay_id==null){ $this->error('發起支付失敗,請聯系管理員!',U('User/index')); } //=========步驟3:使用jsapi調起支付============ $jsApi->setPrepayId($prepay_id); $jsApiParameters = $jsApi->getParameters(); $this->assign('jsApiParameters',$jsApiParameters); $this->assign('my_order',$my_order); $this->assign('share_ok_url',U('User/index')); $this->assign('title',"微信支付"); $this->display(); } } public function wap_dowxpay(){ if($_POST['order_no']){ $_SESSION['order_no'] = $_POST['order_no']; } if($_POST['pay_cash']){ $_SESSION['pay_cash'] = $_POST['pay_cash']; } if($_SESSION['order_no']){ $out_trade_no = $_SESSION['order_no']; } if($_SESSION['pay_cash']){ $fee = $_SESSION['pay_cash']; } //使用jsapi接口 $jsApi = new JsApi_pub(); //=========步驟1:網頁授權獲取用戶openid============ //通過code獲得openid if (!isset($_GET['code'])) { //觸發微信返回code碼 $url = $jsApi->createOauthUrlForCode(JS_API_CALL_URL); Header("Location: $url"); }else { //獲取code碼,以獲取openid $code = $_GET['code']; $jsApi->setCode($code); $openid = $jsApi->getOpenId(); } //=========步驟2:使用統一支付接口,獲取prepay_id============ //使用統一支付接口 $unifiedOrder = new UnifiedOrder_pub(); //設置統一支付接口參數 //設置必填參數 //appid已填,商戶無需重復填寫 //mch_id已填,商戶無需重復填寫 //noncestr已填,商戶無需重復填寫 //spbill_create_ip已填,商戶無需重復填寫 //sign已填,商戶無需重復填寫 $unifiedOrder->setParameter("openid","$openid");//商品描述 $unifiedOrder->setParameter("body","訂單付款");//商品描述 //自定義訂單號,此處僅作舉例 $unifiedOrder->setParameter("out_trade_no",$out_trade_no);//商戶訂單號 $unifiedOrder->setParameter("total_fee",$fee*100);//總金額 $unifiedOrder->setParameter("notify_url",NOTIFY_URL);//通知地址 $unifiedOrder->setParameter("trade_type","JSAPI");//交易類型 //非必填參數,商戶可根據實際情況選填 //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商戶號 //$unifiedOrder->setParameter("device_info","XXXX");//設備號 //$unifiedOrder->setParameter("attach","XXXX");//附加數據 //$unifiedOrder->setParameter("time_start","XXXX");//交易起始時間 //$unifiedOrder->setParameter("time_expire","XXXX");//交易結束時間 //$unifiedOrder->setParameter("goods_tag","XXXX");//商品標記 //$unifiedOrder->setParameter("openid","XXXX");//用戶標識 //$unifiedOrder->setParameter("product_id","XXXX");//商品ID $prepay_id = $unifiedOrder->getPrepayId(); //=========步驟3:使用jsapi調起支付============ $jsApi->setPrepayId($prepay_id); $jsApiParameters = $jsApi->getParameters(); $this->assign('catename',"微信支付"); $this->assign('pay_cash',$fee); $this->assign('jsApiParameters',$jsApiParameters); $this->assign_ur_here('微信支付',array(array('title'=>'微信支付','url'=>U('Index/wap_dowxpay')))); $this->display('Index:wap_dowxpay'); } /****************************** 服務器異步通知頁面方法 其實這里就是將notify_url.php文件中的代碼復制過來進行處理 *******************************/ public function notifyurl(){ //使用通用通知接口 $notify = new Notify_pub(); //存儲微信的回調 $xml = $GLOBALS['HTTP_RAW_POST_DATA']; $notify->saveData($xml); //驗證簽名,並回應微信。 //對后台通知交互時,如果微信收到商戶的應答不是成功或超時,微信認為通知失敗, //微信會通過一定的策略(如30分鍾共8次)定期重新發起通知, //盡可能提高通知的成功率,但微信不保證通知最終能成功。 if($notify->checkSign() == FALSE){ $notify->setReturnParameter("return_code","FAIL");//返回狀態碼 $notify->setReturnParameter("return_msg","簽名失敗");//返回信息 }else{ $notify->setReturnParameter("return_code","SUCCESS");//設置返回碼 } $returnXml = $notify->returnXml(); echo $returnXml; //==商戶根據實際情況設置相應的處理流程,此處僅作舉例======= //$log_name="notify_url.log";//log文件路徑 //$this->log_result($log_name,"【接收到的notify通知】:\n".$xml."\n"); if($notify->checkSign() == TRUE) { if ($notify->data["return_code"] == "FAIL") { //此處應該更新一下訂單狀態,商戶自行增刪操作 //$this->log_result($log_name,"【通信出錯】:\n".$xml."\n"); } elseif($notify->data["result_code"] == "FAIL"){ //此處應該更新一下訂單狀態,商戶自行增刪操作 //$this->log_result($log_name,"【業務出錯】:\n".$xml."\n"); } else{ //此處應該更新一下訂單狀態,商戶自行增刪操作 //買家支付成功,開始修改訂單的支付方式和付款狀態 //$this->log_result($log_name,$out_trade_no."【支付成功0000】:\n".$xml."\n"); $out_trade_no = $notify->data["out_trade_no"]; $Apply=M('Apply'); $data['pay_state']=1; $data['pay_type']='wxpay'; $ret= $Apply->where(array('id'=>$out_trade_no))->save($data); if($ret){ echo "success"; } } } } //查詢訂單的支付狀態 public function order_query(){ //退款的訂單號 if (!isset($_POST["out_trade_no"])) { $out_trade_no = " "; }else{ $out_trade_no = $_POST["out_trade_no"]; //使用訂單查詢接口 $orderQuery = new OrderQuery_pub(); $orderQuery->setParameter("out_trade_no","$out_trade_no");//商戶訂單號 //獲取訂單查詢結果 $orderQueryResult = $orderQuery->getResult(); //商戶根據實際情況設置相應的處理流程,此處僅作舉例 if ($orderQueryResult["return_code"] == "FAIL") { echo json_encode($orderQueryResult["return_code"]); } elseif($orderQueryResult["result_code"] == "FAIL"){ echo json_encode($orderQueryResult["result_code"]); } else{ echo json_encode($orderQueryResult['trade_state']); } } } //空操作處理,所有空操作都指向空模塊 public function _empty(){ $this->redirect('Empty/index'); } //獲取面包屑標題 protected function assign_ur_here($title,$bread){ //$bread 是一個數組 array $bread = array('title'=>'ThinkPHP','url'=>'ThinkPHP@gmail.com'); $breadcrumb = "<a href=".U('Index/index').">首頁</a>"; foreach($bread as $key=>$v){ $breadcrumb.= "><a href='".$v['url']."'>".$v['title']."</a>"; } $this->assign('breadcrumb',$breadcrumb); $this->assign('seo_title',$title); } }
支付寶:
class AlipayMobile extends Action{ public function _initialize() { header("Content-type:text/html;charset=utf-8"); } public function index() { echo "禁止訪問"; } //doalipay方法 /*該方法其實就是將接口文件包下alipayapi.php的內容復制過來 然后進行相關處理 */ public function doalipay(){ vendor('Alipay.Corefunction'); vendor('Alipay.Md5function'); vendor('Alipay.Notify'); vendor('Alipay.Submit'); /**************************請求參數**************************/ //這里我們通過TP的C函數把配置項參數讀出,賦給$alipay_config; $alipay_config = array( 'partner' => C('alipay_partner'), //這里是你在成功申請支付寶接口后獲取到的PID; 'key' => C('alipay_key'),//這里是你在成功申請支付寶接口后獲取到的Key 'private_key_path' => 'key/rsa_private_key.pem', 'ali_public_key_path' => 'key/alipay_public_key.pem', 'sign_type' => strtoupper('MD5'), 'input_charset' => 'utf-8', 'cacert' => getcwd().'\\cacert.pem', 'transport' => 'http', ); $notify_url = C('site_url').'/index.php/Alipay/通知接口'; //服務器異步通知頁面路徑 $return_url = C('site_url').U('User/index'); //頁面跳轉同步通知頁面路徑 $payment_type = "1"; //支付類型 //必填,不能修改 $seller_email = C('alipay_seller_email');//賣家支付寶帳戶必填 $out_trade_no = $_POST['order_no'];//商戶訂單號 通過支付頁面的表單進行傳遞,注意要唯一! $subject = "對訂單".$_POST['order_no'].'付款'; //訂單名稱 //必填 通過支付頁面的表單進行傳遞 $total_fee = $_POST['pay_cash']; //付款金額 //必填 通過支付頁面的表單進行傳遞 $body = '訂單付款'; $anti_phishing_key = "";//防釣魚時間戳 //若要使用請調用類文件submit中的query_timestamp函數 $exter_invoke_ip = get_client_ip(); //客戶端的IP地址 /************************************************************/ $extra_common_param = $_SESSION['master']['mas_id']; //構造要請求的參數數組,無需改動 $parameter = array( "service" => "create_direct_pay_by_user", "partner" => trim(C('alipay_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, "extra_common_param" => $extra_common_param, "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,"post", "確認"); echo $html_text; } //手機端支付 public function wap_doalipay(){ header("Content-type:text/html;charset=utf-8"); vendor('Wap_alipay.Corefunction'); vendor('Wap_alipay.Md5function'); vendor('Wap_alipay.Notify'); vendor('Wap_alipay.Submit'); $alipay_config = array( 'partner' => C('alipay_partner'), //這里是你在成功申請支付寶接口后獲取到的PID; 'key' => C('alipay_key'),//這里是你在成功申請支付寶接口后獲取到的Key 'private_key_path' => 'key/rsa_private_key.pem', 'ali_public_key_path' => 'key/alipay_public_key.pem', 'sign_type' => strtoupper('MD5'), 'input_charset' => 'utf-8', 'cacert' => getcwd().'\\cacert.pem', 'transport' => 'http', ); //返回格式 $format = "xml"; //必填,不需要修改 //返回格式 $v = "2.0"; //必填,不需要修改 //請求號 $req_id = date('Ymdhis'); //必填,須保證每次請求都是唯一 //**req_data詳細信息** //服務器異步通知頁面路徑 $notify_url = C('site_url').'/index.php/Alipay/wap_notifyurl'; //服務器異步通知頁面路徑 //需http://格式的完整路徑,不允許加?id=123這類自定義參數 //頁面跳轉同步通知頁面路徑 $call_back_url = C('site_url').'/index.php/User/index'; //頁面跳轉同步通知頁面路徑 //需http://格式的完整路徑,不允許加?id=123這類自定義參數 //操作中斷返回地址 $merchant_url = C('site_url').'/index.php/User/index'; //頁面跳轉同步通知頁面路徑 //用戶付款中途退出返回商戶的地址。需http://格式的完整路徑,不允許加?id=123這類自定義參數 //賣家支付寶帳戶 $seller_email = C('alipay_seller_email'); //必填 //商戶訂單號 $out_trade_no = $_GET['order_no']; //商戶網站訂單系統中唯一訂單號,必填 //訂單名稱 $subject = "對訂單".$out_trade_no.'付款'; //必填 //查詢付款金額 $where=array( "is_del"=>'0', "id"=>$out_trade_no ); $Apply=M('Apply'); $data=$Apply->where($where)->find(); $total_fee = $data['cost']; //必填 通過支付頁面的表單進行傳遞$acount //dump($out_trade_no);dump($subject);dump($data);dump($total_fee); //return; //付款金額 //$total_fee = $_POST['pay_cash']; //必填 通過支付頁面的表單進行傳遞$acount //必填 $pay_expire = 3; //三分鍾有效 //請求業務參數詳細 $req_data = '<direct_trade_create_req><notify_url>' . $notify_url . '</notify_url><call_back_url>' . $call_back_url . '</call_back_url><seller_account_name>' . $seller_email . '</seller_account_name><out_trade_no>' . $out_trade_no . '</out_trade_no><subject>' . $subject . '</subject><total_fee>' . $total_fee . '</total_fee><merchant_url>' . $merchant_url . '</merchant_url><pay_expire>'.$pay_expire.'</pay_expire></direct_trade_create_req>'; //必填 /************************************************************/ //構造要請求的參數數組,無需改動 $para_token = array( "service" => "alipay.wap.trade.create.direct", "partner" => trim($alipay_config['partner']), "sec_id" => trim($alipay_config['sign_type']), "format" => $format, "v" => $v, "req_id" => $req_id, "req_data" => $req_data, "_input_charset" => trim(strtolower($alipay_config['input_charset'])) ); //dump($para_token); //return; //建立請求 $alipaySubmit = new AlipaySubmit($alipay_config); $html_text = $alipaySubmit->buildRequestHttp($para_token); //URLDECODE返回的信息 $html_text = urldecode($html_text); //解析遠程模擬提交后返回的信息 $para_html_text = $alipaySubmit->parseResponse($html_text); //獲取request_token $request_token = $para_html_text['request_token']; /**************************根據授權碼token調用交易接口alipay.wap.auth.authAndExecute**************************/ //業務詳細 $req_data = '<auth_and_execute_req><request_token>' . $request_token . '</request_token></auth_and_execute_req>'; //必填 //構造要請求的參數數組,無需改動 $parameter = array( "service" => "alipay.wap.auth.authAndExecute", "partner" => trim($alipay_config['partner']), "sec_id" => trim($alipay_config['sign_type']), "format" => $format, "v" => $v, "req_id" => $req_id, "req_data" => $req_data, "_input_charset" => trim(strtolower($alipay_config['input_charset'])) ); //建立請求 $alipaySubmit = new AlipaySubmit($alipay_config); $html_text = $alipaySubmit->buildRequestForm($parameter, 'get', '確認'); echo $html_text; } /****************************** 手機支付寶的異步接收 *******************************/ public function wap_notifyurl(){ vendor('Wap_alipay.Corefunction'); vendor('Wap_alipay.Md5function'); vendor('Wap_alipay.Notify'); vendor('Wap_alipay.Submit'); //這里我們通過TP的C函數把配置項參數讀出,賦給$alipay_config; $alipay_config = array( 'partner' => C('alipay_partner'), //這里是你在成功申請支付寶接口后獲取到的PID; 'key' => C('alipay_key'),//這里是你在成功申請支付寶接口后獲取到的Key 'private_key_path' => 'key/rsa_private_key.pem', 'ali_public_key_path' => 'key/alipay_public_key.pem', 'sign_type' => strtoupper('MD5'), 'input_charset' => 'utf-8', 'cacert' => getcwd().'\\cacert.pem', 'transport' => 'http', ); //計算得出通知驗證結果 $alipayNotify = new AlipayNotify($alipay_config); $verify_result = $alipayNotify->verifyNotify(); if($verify_result) {//驗證成功 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //請在這里加上商戶的業務邏輯程序代 //——請根據您的業務邏輯來編寫程序(以下代碼僅作參考)—— //獲取支付寶的通知返回參數,可參考技術文檔中服務器異步通知參數列表 //解析notify_data //注意:該功能PHP5環境及以上支持,需開通curl、SSL等PHP配置環境。建議本地調試時使用PHP開發軟件 $doc = new DOMDocument(); if ($alipay_config['sign_type'] == 'MD5') { $doc->loadXML($_POST['notify_data']); } if ($alipay_config['sign_type'] == '0001') { $doc->loadXML($alipayNotify->decrypt($_POST['notify_data'])); } if( ! empty($doc->getElementsByTagName( "notify" )->item(0)->nodeValue) ) { //商戶訂單號 $out_trade_no = $doc->getElementsByTagName( "out_trade_no" )->item(0)->nodeValue; //支付寶交易號 $trade_no = $doc->getElementsByTagName( "trade_no" )->item(0)->nodeValue; //交易狀態 $trade_status = $doc->getElementsByTagName( "trade_status" )->item(0)->nodeValue; if($trade_status == 'TRADE_FINISHED') { //判斷該筆訂單是否在商戶網站中已經做過處理 //如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序 //如果有做過處理,不執行商戶的業務程序 //注意: //該種交易狀態只在兩種情況下出現 //1、開通了普通即時到賬,買家付款成功后。 //2、開通了高級即時到賬,從該筆交易成功時間算起,過了簽約時的可退款時限(如:三個月以內可退款、一年以內可退款等)后。 //調試用,寫文本函數記錄程序運行情況是否正常 //logResult("這里寫入想要調試的代碼變量值,或其他運行的結果記錄"); echo "success"; //請不要修改或刪除 } else if ($trade_status == 'TRADE_SUCCESS') { //買家支付成功,開始修改訂單的支付方式和付款狀態 //買家支付成功,開始修改訂單的支付方式和付款狀態 /*$Apply=M('Apply'); $data['pay_state']=1; $data['pay_type']='alipay'; $ret= $Apply->where(array('id'=>$out_trade_no))->save($data); if($ret){ echo "success"; }*/ } echo "success"; //請不要修改或刪除 } //——請根據您的業務邏輯來編寫程序(以上代碼僅作參考)—— ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// } else { //驗證失敗 echo "fail".$_SESSION['master']['mas_id']; //調試用,寫文本函數記錄程序運行情況是否正常 //logResult("這里寫入想要調試的代碼變量值,或其他運行的結果記錄"); } } /****************************** 服務器異步通知頁面方法 其實這里就是將notify_url.php文件中的代碼復制過來進行處理 *******************************/ public function notifyurl(){ vendor('Alipay.Corefunction'); vendor('Alipay.Md5function'); vendor('Alipay.Notify'); vendor('Alipay.Submit'); //這里我們通過TP的C函數把配置項參數讀出,賦給$alipay_config; $alipay_config = array( 'partner' => C('alipay_partner'), //這里是你在成功申請支付寶接口后獲取到的PID; 'key' => C('alipay_key'),//這里是你在成功申請支付寶接口后獲取到的Key 'private_key_path' => 'key/rsa_private_key.pem', 'ali_public_key_path' => 'key/alipay_public_key.pem', 'sign_type' => strtoupper('MD5'), 'input_charset' => 'utf-8', 'cacert' => getcwd().'\\cacert.pem', 'transport' => 'http', ); //計算得出通知驗證結果 $alipayNotify = new AlipayNotify($alipay_config); $verify_result = $alipayNotify->verifyNotify(); if($verify_result) { //驗證成功 //獲取支付寶的通知返回參數,可參考技術文檔中服務器異步通知參數列表 $out_trade_no = $_POST['out_trade_no']; //商戶訂單號 $extra_common_param = $_POST['extra_common_param']; $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, //交易狀態 "extra_common_param" => $extra_common_param, "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') { //買家支付成功,開始修改訂單的支付方式和付款狀態 $Apply=M('Apply'); $data['pay_state']=1; $data['pay_type']='alipay'; $ret= $Apply->where(array('id'=>$out_trade_no))->save($data); if($ret){ echo "success"; } } echo "success"; //請不要修改或刪除 }else { //驗證失敗 echo "fail".$_SESSION['master']['mas_id']; } } /* 頁面跳轉處理方法; 這里其實就是將return_url.php這個文件中的代碼復制過來,進行處理; */ public function returnurl(){ vendor('Alipay.Corefunction'); vendor('Alipay.Md5function'); vendor('Alipay.Notify'); vendor('Alipay.Submit'); //這里我們通過TP的C函數把配置項參數讀出,賦給$alipay_config; $alipay_config = array( 'partner' => C('alipay_partner'), //這里是你在成功申請支付寶接口后獲取到的PID; 'key' => C('alipay_key'),//這里是你在成功申請支付寶接口后獲取到的Key 'private_key_path' => 'key/rsa_private_key.pem', 'ali_public_key_path' => 'key/alipay_public_key.pem', 'sign_type' => strtoupper('MD5'), 'input_charset' => 'utf-8', 'cacert' => getcwd().'\\cacert.pem', 'transport' => 'http', ); $notify_url = C('site_url').'/index.php/Alipay/notifyurl'; //服務器異步通知頁面路徑 $return_url = C('site_url').U('User/order'); //頁面跳轉同步通知頁面路徑 $alipayNotify = new AlipayNotify($alipay_config);//計算得出通知驗證結果 $verify_result = $alipayNotify->verifyReturn(); if($verify_result) { //驗證成功 if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') { $this->success('支付成功',$return_url); }else { $this->error('支付失敗,'.$_GET['trade_status'],$return_url); } }else { //驗證失敗 //如要調試,請看alipay_notify.php頁面的verifyReturn函數 $this->error('支付失敗,'.$_GET['trade_status'],$return_url); } } //空操作處理,所有空操作都指向空模塊 public function _empty(){ $this->redirect('Empty/index'); } }



