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. 結構分為兩部分:接入部分與通知 返回 部分。接入部分即為傳遞參數等信息組合成超級鏈接,並用該鏈接來進行跳轉。通知返回部分則是支付寶服務器對該筆訂單處理完畢後,通知與返回該筆訂單的詳細信息到商戶服務器,商
戶服務器接收到後,並對其進行數據處理。
5. 接入部分:
在 alipay.config.php中對需要配置的參數信息已經有詳細說明, 具體在項目中一般會在config.php中配置好,將lib下的類文件(可以重命名)以及cacert.pem 放置在項目的合適位置,確保能夠正確引入。
構造 alipayapi.php中$parameter需要的參數
/**************************請求參數**************************/ //商戶訂單號,商戶網站訂單系統中唯一訂單號,必填 $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參數所對應的頁面文件。
具備的屬性:
1、支付接口中買家的購買流程已經走到支付寶裡且支付寶提示支付成功時,頁面會自動跳轉回自身網站的這個頁面裡來。
2、同步的,無時差
3、獲得參數的方法是用get方式獲取。
4、不論跳轉回來程序判斷是真還是假($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS')只跳轉回來一次,不重復。
5、這個並不是支付寶服務器調用了該頁面,而是通過與組合拼接各參數形成的URL鏈接原理等同,拼接出來的URL鏈接,之後程序上做自動跳轉。
6、基於5的原因,該頁面的程序調試可不必在服務器上而是本機上調試、運行。
b) 通知頁
傳遞給支付寶時的notify_url參數所對應的頁面文件
具備的屬性:
1、這個通知頁就是被支付寶調用才能啟動的。
2、服務器間的互動,不像返回頁肉眼可以看到,這個是看不到的。
3、獲得參數的方法是用POST方式獲取。
4、支付寶中的該筆交易存在,且該筆交易狀態發生了變更,就會被調用。
5、被調用程序判斷(if(sign = mysign and responseTxt = true)),若我們自己在該判斷中有做程序編寫,成功則不再被調用,不成功則會反復被調用。
6、異步的,第一次收到訂單信息(以下都稱之為“通知”)是與返回頁近乎等同或等同的同步時間,在判斷不成功的情況下,會收到第二次第三次等次數的通知,時間間隔從最先的一兩分鐘,到後面的幾個小時。失效時間是4
8小時。
7、基於6的原因,該頁面的程序調試必須在服務器上調試、運行。
8、程序編寫時必須采用程序執行成功,才寫頁面response.Write(“success”);,不成功則寫頁面response.Write(“fail”); 支付寶根據success來判定是否要重新再次發送通知。
9、該頁面的Html頁面中必須是空白、無任何Html標簽、無任何空格。
c) 在支付寶的眾多接口中,不是所有的接口都擁有通知頁與返回頁的。
有的接口只有返回頁;有的接口有通知頁且用XML格式的內容顯示在當前頁面中;有的沒有通知頁也沒有返回頁僅僅只以XML格式的內容顯示在當前頁面中。所以,我們要根據各接口的技術文檔與程序實例來做相應的數據處
理。
d) 大家這裡存在一個疑問,一般大家的做法都是把數據庫更新些在返回頁中,但是很多情況下出現了訂單不同步即掉單現象。這是為什麼?
答:返回頁是當前頁面自動跳轉的,這雖然跳轉的反應速度不錯,但人的手動關閉該頁面操作絕對可以使之在沒有跳轉回來之前就關掉了該頁面,此時原本該數據庫更新的程序並沒有被啟動,這樣直接導致了掉單,所以一般大商
戶,尤其是網絡游戲行業的即時到帳充值的技術做法是:返回頁中有訂單處理程序,通知頁中也有,當返回頁中的訂單沒做過處理時,通知頁中的數據處理程序便啟動;這樣即可近乎100%解決掉單問題(還有種掉單原因是大家自己的服務器出現問題,比如MS3XML.DLL問題,這個問題至今沒有什麼可以解決的辦法,只能重裝或是更換服務器,也有的服務器因為中毒才導致的)。
還有很多細節沒有描述 只是大概思路 待以後補充
另 最近刷屏的一個截圖軟件 感覺還不錯 記錄下官網地址 :http://zh.snipaste.com/。