create_direct_pay_by_user-php-UTF-8 │ ├lib┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈類文件夾 │ │ │ ├alipay_core.function.php ┈┈┈┈┈┈支付寶接口公用函數文件 │ │ │ ├alipay_notify.class.php┈┈┈┈┈┈┈支付寶通知處理類文件 │ │ │ ├alipay_submit.class.php┈┈┈┈┈┈┈支付寶各接口請求提交類文件 │ │ │ └alipay_md5.function.php┈┈┈┈┈┈┈支付寶接口MD5函數文件 │ ├log.txt┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈日誌文件 │ ├alipay.config.php┈┈┈┈┈┈┈┈┈┈┈┈基礎配置類文件 │ ├alipayapi.php┈┈┈┈┈┈┈┈┈┈┈┈┈┈支付寶接口入口文件 │ ├notify_url.php ┈┈┈┈┈┈┈┈┈┈┈┈┈服務器異步通知頁面文件 │ ├return_url.php ┈┈┈┈┈┈┈┈┈┈┈┈┈頁面跳轉同步通知文件 │ ├cacert.pem ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈用於CURL中校驗SSL的CA證書文件 │ └readme.txt ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈使用說明文本
4. 結構分爲兩部分:接入部分與通知 返回 部分。接入部分即爲傳遞參數等信息組合成超級連接,並用該連接來進行跳轉。通知返回部分則是支付寶服務器對該筆訂單處理完畢後,通知與返回該筆訂單的詳細信息到商戶服務器,商
戶服務器接收到後,並對其進行數據處理。php
5. 接入部分: html
在 alipay.config.php中對須要配置的參數信息已經有詳細說明, 具體在項目中通常會在config.php中配置好,將lib下的類文件(能夠重命名)以及cacert.pem 放置在項目的合適位置,確保可以正確引入。數據庫
構造 alipayapi.php中$parameter須要的參數 api
/**************************請求參數**************************/ //商戶訂單號,商戶網站訂單系統中惟一訂單號,必填 $out_trade_no = $_POST['WIDout_trade_no']; //訂單名稱,必填 $subject = $_POST['WIDsubject']; //付款金額,必填 $total_fee = $_POST['WIDtotal_fee']; //商品描述,可空 $body = $_POST['WIDbody']; /************************************************************/ //構造要請求的參數數組,無需改動 $parameter = array( "service" => $alipay_config['service'], "partner" => $alipay_config['partner'], "seller_id" => $alipay_config['seller_id'], "payment_type" => $alipay_config['payment_type'], "notify_url" => $alipay_config['notify_url'], "return_url" => $alipay_config['return_url'], "anti_phishing_key"=>$alipay_config['anti_phishing_key'], "exter_invoke_ip"=>$alipay_config['exter_invoke_ip'], "out_trade_no" => $out_trade_no, "subject" => $subject, "total_fee" => $total_fee, "body" => $body, "_input_charset" => trim(strtolower($alipay_config['input_charset'])) //其餘業務參數根據在線開發文檔,添加參數.文檔地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.kiX33I&treeId=62&articleId=103740&docType=1 //如"參數名"=>"參數值" ); //創建請求 $alipaySubmit = new AlipaySubmit($alipay_config); $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "確認"); echo $html_text;
die;
須要注意的是開發支付接口須要在公網(服務器必須能夠經過外網訪問)才能夠完成整個調試過程,若是服務器在外網訪問不到,則沒法接收到支付通知。數組
$notify_url和$return_url 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網能夠正常訪問 。服務器
6. 通知 返回 (具體業務邏輯在通知返回頁面處理)網絡
參考:http://www.cnblogs.com/blodfox777/archive/2009/11/03/1595223.html異步
a) 返回頁
傳遞給支付寶時的return_url參數所對應的頁面文件。
具有的屬性:
一、支付接口中買家的購買流程已經走到支付寶裏且支付寶提示支付成功時,頁面會自動跳轉回自身網站的這個頁面裏來。
二、同步的,無時差
三、得到參數的方法是用get方式獲取。
四、不論跳轉回來程序判斷是真仍是假($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS')只跳轉回來一次,不重複。
五、這個並非支付寶服務器調用了該頁面,而是經過與組合拼接各參數造成的URL連接原理等同,拼接出來的URL連接,以後程序上作自動跳轉。
六、基於5的緣由,該頁面的程序調試可沒必要在服務器上而是本機上調試、運行。
b) 通知頁
傳遞給支付寶時的notify_url參數所對應的頁面文件
具有的屬性:
一、這個通知頁就是被支付寶調用才能啓動的。
二、服務器間的互動,不像返回頁肉眼能夠看到,這個是看不到的。
三、得到參數的方法是用POST方式獲取。
四、支付寶中的該筆交易存在,且該筆交易狀態發生了變動,就會被調用。
五、被調用程序判斷(if(sign = mysign and responseTxt = true)),若咱們本身在該判斷中有作程序編寫,成功則再也不被調用,不成功則會反覆被調用。
六、異步的,第一次收到訂單信息(如下都稱之爲「通知」)是與返回頁近乎等同或等同的同步時間,在判斷不成功的狀況下,會收到第二次第三次等次數的通知,時間間隔從最早的一兩分鐘,到後面的幾個小時。失效時間是4
8小時。
七、基於6的緣由,該頁面的程序調試必須在服務器上調試、運行。
八、程序編寫時必須採用程序執行成功,才寫頁面response.Write(「success」);,不成功則寫頁面response.Write(「fail」); 支付寶根據success來斷定是否要從新再次發送通知。
九、該頁面的Html頁面中必須是空白、無任何Html標籤、無任何空格。函數
c) 在支付寶的衆多接口中,不是全部的接口都擁有通知頁與返回頁的。
有的接口只有返回頁;有的接口有通知頁且用XML格式的內容顯示在當前頁面中;有的沒有通知頁也沒有返回頁僅僅只以XML格式的內容顯示在當前頁面中。因此,咱們要根據各接口的技術文檔與程序實例來作相應的數據處
理。
d) 你們這裏存在一個疑問,通常你們的作法都是把數據庫更新些在返回頁中,可是不少狀況下出現了訂單不一樣步即掉單現象。這是爲何?
答:返回頁是當前頁面自動跳轉的,這雖然跳轉的反應速度不錯,但人的手動關閉該頁面操做絕對可使之在沒有跳轉回來以前就關掉了該頁面,此時本來該數據庫更新的程序並無被啓動,這樣直接致使了掉單,因此通常大商
戶,尤爲是網絡遊戲行業的即時到賬充值的技術作法是:返回頁中有訂單處理程序,通知頁中也有,當返回頁中的訂單沒作過處理時,通知頁中的數據處理程序便啓動;這樣便可近乎100%解決掉單問題(還有種掉單緣由是你們本身的服務器出現問題,好比MS3XML.DLL問題,這個問題至今沒有什麼能夠解決的辦法,只能重裝或是更換服務器,也有的服務器由於中毒才致使的)。網站
還有不少細節沒有描述 只是大概思路 待之後補充
另 最近刷屏的一個截圖軟件 感受還不錯 記錄下官網地址 :http://zh.snipaste.com/。