alipay的支付通知有兩類。異步通知(notify_url)與return_url.前面是post異步通知,后面的return_url 是get返回url只返回一次。
A服務(wù)器通知,對(duì)應(yīng)的參數(shù)為notify_url,支付寶通知使用POST方式
B頁(yè)面跳轉(zhuǎn)通知,對(duì)應(yīng)的參數(shù)為return_url,支付寶通知使用GET方式 (通知地址不需要像以前一樣去賬戶內(nèi)設(shè)置,而是由客戶在支付的時(shí)候通過(guò)參數(shù)傳遞給我地址)。
類似 notify_url=http://www.geizy.cn/notify_alipay.php 注意:www.geizy.cn是您網(wǎng)站的域名,也可以用ip地址代替。對(duì)于服務(wù)器通知,ip地址一定是公網(wǎng)的,私有地址獲取不到alipay的返回?cái)?shù)據(jù)
一、 文件結(jié)構(gòu)
1 由兩部分組成,支付接口與支付成功返回接口部分。支付寶快捷支付接口一般為url直接發(fā)起網(wǎng)頁(yè)支付。返回就是支付寶服務(wù)器對(duì)該筆訂單處理完畢后,通知與返回該筆訂單的詳細(xì)信息到你填寫的notify_url地址,服務(wù)器接收到后,對(duì)返回?cái)?shù)據(jù)處理對(duì)應(yīng)訂單狀態(tài)。
2 以PHP代碼中的程序?yàn)槔?nbsp;
接入部分的頁(yè)面文件包含:配置頁(yè)alipay_Config.php、方法詳細(xì)頁(yè)alipay/Alipay_Payto.php、程序入口頁(yè)index.php以及MD5加密方法類頁(yè)alipayto/Alipay_md5.php。通知返回部分的頁(yè)面文件包含:方法詳細(xì)頁(yè)alipay/Alipay_Payto.php、MD5加密方法類頁(yè)alipayto /Alipay_md5.php、支付完成后(支付寶處理完畢后)自動(dòng)跳轉(zhuǎn)回的自定義頁(yè)面return_Alipay_Notify.php、兩方服務(wù)器間相互交互(無(wú)法直接看到)通知頁(yè)Alipay_Notify.php。
-----------------------------------------------------------------
工作原理
對(duì)結(jié)構(gòu)有所了解之后,就可以開(kāi)始研究具體是如何運(yùn)行的了
a) 接入部分原理
i. 第一步——配置文件參數(shù)信息:
public function config() { $alipay_config = array(); $alipay_config['partner'] = '2088***********'; //收款支付寶賬號(hào),以2088開(kāi)頭由16位純數(shù)字組成的字符串,一般情況下收款賬號(hào)就是簽約賬號(hào) $alipay_config['seller_id'] = '2088***********'; // MD5密鑰,安全檢驗(yàn)碼,由數(shù)字和字母組成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm $alipay_config['key'] = '12345679810111213141516'; // 服務(wù)器異步通知頁(yè)面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問(wèn) $alipay_config['notify_url'] = "http://www.geizy.cn/notify_url"; // 頁(yè)面跳轉(zhuǎn)同步通知頁(yè)面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問(wèn) $alipay_config['return_url'] = "http://www.geizy.cn/return_url"; //簽名方式 $alipay_config['sign_type'] = strtoupper('MD5'); //字符編碼格式 目前支持 gbk 或 utf-8 $alipay_config['input_charset'] = strtolower('utf-8'); //ca證書路徑地址,用于curl中ssl校驗(yàn) //請(qǐng)保證cacert.pem文件在當(dāng)前文件夾目錄中 $alipay_config['cacert'] = getcwd() . '\\cacert.pem'; //訪問(wèn)模式,根據(jù)自己的服務(wù)器是否支持ssl訪問(wèn),若支持請(qǐng)選擇https;若不支持請(qǐng)選擇http $alipay_config['transport'] = 'http'; // 支付類型 ,無(wú)需修改 $alipay_config['payment_type'] = "1"; // 產(chǎn)品類型,無(wú)需修改 $alipay_config['service'] = "create_direct_pay_by_user"; //↑↑↑↑↑↑↑↑↑↑請(qǐng)?jiān)谶@里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ //↓↓↓↓↓↓↓↓↓↓ 請(qǐng)?jiān)谶@里配置防釣魚信息,如果沒(méi)開(kāi)通防釣魚功能,為空即可 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ // 防釣魚時(shí)間戳 若要使用請(qǐng)調(diào)用類文件submit中的query_timestamp函數(shù) $alipay_config['anti_phishing_key'] = ""; // 客戶端的IP地址 非局域網(wǎng)的外網(wǎng)IP地址,如:221.0.0.1 $alipay_config['exter_invoke_ip'] = ""; //↑↑↑↑↑↑↑↑↑↑請(qǐng)?jiān)谶@里配置防釣魚信息,如果沒(méi)開(kāi)通防釣魚功能,為空即可 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ return $alipay_config; }
配置完成之后,直接調(diào)用封裝好的執(zhí)行代碼:
a) 以php程序代碼為例:
$out_trade_no = $_POST['WIDout_trade_no']; //訂單名稱,必填 $subject = $_POST['WIDsubject']; //付款金額,必填 $total_fee = '0.01'; //商品描述,可空 $body = $_POST['WIDbody']; /************************************************************/ //構(gòu)造要請(qǐng)求的參數(shù)數(shù)組,無(wú)需改動(dòng) $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'])) ); //建立請(qǐng)求 $alipaySubmit = new AlipaySubmit($alipay_config); $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "確認(rèn)"); echo $html_text;
封裝的demo中已經(jīng)將對(duì)應(yīng)的方法封裝成了PHP函數(shù),demo中直接調(diào)用就可以發(fā)起alipay支付請(qǐng)求。
a) 不可缺少的參數(shù)
i. service服務(wù)參數(shù),這個(gè)是用來(lái)區(qū)別這個(gè)接口是用的什么接口,所以絕對(duì)不能修改。
ii. partner合作身份者ID、key安全校驗(yàn)碼或稱私鑰這一組參數(shù)是簽約合同生效后才能拿的到,partner是來(lái)鑒別是哪個(gè)商家與支付寶簽約,而這個(gè)Key它如同鑰匙般相當(dāng)重要。
iii. seller_email收款人支付寶賬號(hào),支付寶中有手機(jī)類型、電子郵件類型的支付寶賬號(hào)是都可以用這個(gè)參數(shù)的。
iv. subject在支付寶的收銀臺(tái)里是直接與商品名稱關(guān)聯(lián)在一起的,但是說(shuō)的更準(zhǔn)確些的話,這個(gè)參數(shù)是這筆交易的名稱,因?yàn)檫@筆交易不一定只買一件商品。它的作用不僅是在收銀臺(tái)里可以清晰的顯示出來(lái),而且在支付寶的賬
--------------------------------------------------------
通知返回
a) 返回頁(yè)
傳遞給支付寶時(shí)的return_url參數(shù)所對(duì)應(yīng)的頁(yè)面文件。
具備的屬性:
1、發(fā)起支后,買家已經(jīng)成功付款以后流,頁(yè)面會(huì)自動(dòng)跳轉(zhuǎn)回配置文件中填寫的 return_url 地址中。
2、支付完成后跳轉(zhuǎn)
3、參數(shù)以get方式傳輸。
4、網(wǎng)址只跳轉(zhuǎn)一次,不能重復(fù)跳轉(zhuǎn)。
b) 通知頁(yè)
傳遞給支付寶時(shí)的notify_url參數(shù)所對(duì)應(yīng)的頁(yè)面文件
具備的屬性:
1、被支付寶調(diào)用才能啟動(dòng)。
2、服務(wù)器間的傳遞,看不見(jiàn)執(zhí)行操作。
3、參數(shù)以post方式傳輸。
4、支付寶中的該筆交易存在,且該筆交易狀態(tài)發(fā)生了變更,就會(huì)被調(diào)用。
5、被調(diào)用程序判斷(if(sign = mysign and responseTxt = true)),若我們自己在該判斷中有做程序編寫,成功則不再被調(diào)用,不成功則會(huì)反復(fù)被調(diào)用。
6、異步的,第一次收到訂單信息(以下都稱之為“通知”)是與返回頁(yè)近乎等同或等同的同步時(shí)間,在判斷不成功的情況下,會(huì)收到第二次第三次等次數(shù)的通知,時(shí)間間隔從最先的一兩分鐘,到后面的幾個(gè)小時(shí)。失效時(shí)間是4
8小時(shí)。
7、程序必須在服務(wù)器上調(diào)試、運(yùn)行。
8、程序編寫時(shí)必須采用程序執(zhí)行成功,才寫頁(yè)面echo(“success”);,不成功則寫頁(yè)面echo(“fail”); 支付寶根據(jù)success來(lái)判定是否要重新再次發(fā)送通知該頁(yè)面的Html頁(yè)面中必須是空白、無(wú)任何Html標(biāo)簽、無(wú)任何空格、不允許做頁(yè)面跳轉(zhuǎn)。