TP5實現支付寶電腦網站支付學習筆記

這兩天在公司作一個小型WEB項目,須要有支付功能。第一次作支付寶的支付,踩了點小坑,還算順利。激動的我趕忙記下實現的流程。
第一步固然是在支付寶開放平臺申請公鑰私鑰APPID等,支付寶關官方文檔都有詳細介紹,這裏就省略。
申請完了下面開始開發者的實現流程。首先是下載支付寶的官方DEMO,網址是https://docs.open.alipay.com/... 這裏建議下載官方的DEMO而不是SDK,由於對新手來講DEMO裏有封裝好的函數能夠直接拿來改改就用,比較友好。之後技術提高了,再拿SDK玩玩。
圖片描述php

由於我是個PHPer,固然選擇PHP版。下載好以後默認名字是alipay.trade.page.pay-PHP-UTF-8,建議更名字爲alipay便可。
由於我是用TP5開發,因此放到項目根目錄下的外部資源包vendor目錄中。
圖片描述數據庫

放進去以後,找到alipay目錄下pagepay目錄下的pagepay.php文件,這即是阿里官方提供的支付方法樣例,
圖片描述
我學着網上一位學長的寫法改了一下放到TP5的方法中,見下圖:
圖片描述
走到這裏若是順利,便會出現支付寶的二維碼頁面。我這裏由於客戶從新申請權限因此無法截圖了。就是那個支付寶二維碼的頁面。掃碼支付,便會跳轉到支付成功頁面,最後會跳到你自定義的同步跳轉地址。json

價格由前臺表單傳值便可,這裏強調有三個必填項:訂單號、訂單名稱、付款金額,這三個缺哪個都會報錯。我剛開始腦殼發暈,把訂單名稱去掉了,結果報錯了...
這裏寫完以後,便去config.php配置各項參數,config.php在alipay的根目錄下,配置這一項相當重要。若是錯了,商家但是收不到款的噢...
這裏是傻瓜填法,應用ID、私鑰、異步地址、同步地址、公鑰。這6項必須填正確。由於我是用的TP5,因此通知地址那裏我改爲了TP5的寫法,模塊/控制器/方法.
支付寶網關那裏不要更改,若是是沙箱環境,須要改爲"https://openapi.alipaydev.com/gateway.do" 多了個"dev",由於我是真實環境,因此就不用更改。 api

圖片描述

這裏再說一下異步和同步地址,新人確定不知道是有什麼用,大佬略過便可。支付寶支付成功後會執行這兩個方法,系統會把你支付的信息用POST方式異步傳給你的方法。由於是異步,因此頁面是沒有變化的,所謂"打槍的不要,悄悄地進村..."在異步這個方法裏能夠寫你本身的業務邏輯。好比接收值,存入數據庫之類。這裏有個大坑,坑了我兩天即在異步方法裏是無法用session取值的,我本來想用session取用戶登陸id存入數據庫中,後來問了師傅才知道,異步是服務器和服務器之間的交互,因此沒有cookieId,沒有cookieId固然沒有session值。對這裏不懂的童鞋能夠複習下session基礎知識,慚愧,我竟然把這麼基礎的東西忘了...由此可知,同步方法是能夠取session的,由於是服務器和客戶端的交互。若是對此沒概念,能夠在異步方法接收參數後轉成JSON格式,而後用file_put_contents()函數寫到記事本里看一下。
例:{安全

"gmt_create":"xxxxxxxx",//訂單建立時間
"charset":"UTF-8",
"gmt_payment":"xxxxxxxx", //付款時間
"notify_time":"xxxxx",   //異步回調時間
"subject":"XXXXX",     //訂單名稱
"sign":"xxxxxxxxxxxxxxxxxxx",
"buyer_id":"xxxxxxxx",
"invoice_amount":"xxxxx",
"version":"1.0",
"notify_id":"xxxxxxxxx",
"fund_bill_list":"[{"amount":"0.01","fundChannel":"ALIPAYACCOUNT"}]",
"notify_type":"trade_status_sync",
"out_trade_no":"xxxxxxxx", //訂單號
"total_amount":"0.01",
"trade_status":"TRADE_SUCCESS", //success表明支付成功,商家會收到錢
"trade_no":"xxxxxx", //支付寶流水號
"auth_app_id":"xxxxxxxx",
"receipt_amount":"0.01",
"point_amount":"0.00",
"app_id":"xxxxxxxxx",
"buyer_pay_amount":"0.01",
"sign_type":"RSA2",
"seller_id":"xxxxxxxxxxxxx"

}
重要的我都加了註釋了,其餘不明白的參數能夠去官方文檔查詢。
同步方法,顧名思義,就是頁面同步跳轉的地址,即能讓客戶看見的頁面。這裏自定義便可,好比提示用戶支付成功之類文字。
下面是異步和同步方法的示例寫法:
/**服務器

  • 異步同步示例

*/
class Alipay extends Controller {cookie

/**
 * 異步方法
 * @return [void] 
 */
public function notify(){
    $post = input();
    if($post['trade_status'] == "TRADE_SUCCESS"){
        //操做數據庫 修改狀態
        echo "SUCCESS";//返回給支付寶成功 ,不返回這個  字符 ,支付寶定時 回調這個方法 時間 5   10   30/m  1小時 成功爲止
    }
    //寫在文本里看一下參數
    $data = json_encode($post);
    file_put_contents("alipaytext.txt",$data);
}

/**
 * 同步方法
 * @return [type] [description]
 */
public function returnfy(){
    //同步跳轉地址
    return $this->fetch();
}

}
這裏面重要的是須要在異步方法裏判斷trade_status字段,若是等於"TRADE_SUCCESS"即支付成功,後面必須echo返回一個"SUCCESS",不然支付寶會認爲你沒有付款成功,而在24小時內定時回調這個方法。實際業務邏輯根據你的需求來好比存入訂單表等等,固然不會這麼簡單,最好加一些驗證。爲了安全。下面是前臺代碼示例:
{include file="public/header"}session

<!-- HEADER END -->
<!-- CONTENT BEGIN -->
<div id="content" class="right_sidebar">
    <div class="inner">
        <div class="general_content">
            <div class="main_content">    
                <form name=alipayment action="{:url('index/alipay/index')}" method="post">
                商戶訂單號:<input type="text" name="out_trade_no" value="123" /><br/>
                訂單名稱:<input type="text" name="t_name" value="a"/><br/>
                付款金額:<input type="text" name="total_amount" /><br/>
                商品描述:<input type="text" name="t_body" value=""/><br/>
                <button type="submit">付 款</button>
            </form>

            </div>
            {include file="public/right"}

            <div class="separator" style="height:31px;"></div>
            <div class="clearboth"></div>
        </div>
    </div>
</div>
<!-- CONTENT END -->

<!-- FOOTER BEGIN -->

{include file="public/tail"}app

最後補上一句:日誌文件必定要開啓寫權限,不然沒法自動寫入。即在alipay文件夾下右鍵log.txt屬性設置。出了問題能夠在日誌裏查看。異步

走到這裏,流程就基本介紹完了。歡迎各位大佬拍磚指導。作完支付,會感受本身又上了一個臺階!

相關文章
相關標籤/搜索