首頁  >  文章  >  後端開發  >  TP5實現支付寶電腦網站支付的範例介紹

TP5實現支付寶電腦網站支付的範例介紹

不言
不言轉載
2019-02-28 11:43:184412瀏覽

這篇文章帶給大家的內容是關於TP5實現支付寶電腦網站支付的範例介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

這兩天在公司做一個小型WEB專案,需要有支付功能。第一次做支付寶的支付,踩了點小坑,還算順利。激動的我趕緊記下實現的流程。
第一步當然是在支付寶開放平台申請公鑰私鑰APPID等,支付寶關官方文件都有詳細介紹,這裡就省略。
申請完了下面開始開發者的實作流程。首先是下載支付寶的官方DEMO,網址是https://docs.open.alipay.com/... 這裡建議下載官方的DEMO而不是SDK,因為對新手來說DEMO裡有封裝好的函數可以直接拿來改改就用,比較友善。以後技術提升了,再拿SDK玩玩。

TP5實現支付寶電腦網站支付的範例介紹

因為我是PHPer,當然選擇PHP版。下載好之後預設名字是alipay.trade.page.pay-PHP-UTF-8,建議改名字為alipay即可。
因為我是用TP5開發,所以放到專案根目錄下的外部資源包vendor目錄。

TP5實現支付寶電腦網站支付的範例介紹

放進去之後,找到alipay目錄下pagepay目錄下的pagepay.php文件,這便是阿里官方提供的付款方法範例,

TP5實現支付寶電腦網站支付的範例介紹

我學著網路上一位學長的寫法改了一下放到TP5的方法中,見下圖:

TP5實現支付寶電腦網站支付的範例介紹

走到這裡如果順利,便會出現支付寶的二維碼頁面。我這裡因為客戶重新申請權限所以沒辦法截圖了。就是那個支付寶二維碼的頁面。掃碼支付,便會跳到付款成功頁面,最後會跳到你自訂的同步跳轉位址。

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

TP5實現支付寶電腦網站支付的範例介紹

這裡再說一下非同步和同步位址,新人一定不知道有什麼用,大佬略過即可。支付寶支付成功後會執行這兩個方法,系統會把你支付的資訊用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 {
/**
 * 异步方法
 * @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"}
<!-- HEADER END -->
<!-- CONTENT BEGIN -->
<div>
    <div>
        <div>
            <div>    
                <form>
                商户订单号:<input><br>
                订单名称:<input><br>
                付款金额:<input><br>
                商品描述:<input><br>
                <button>付 款</button>
            </form>

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

            <div></div>
            <div></div>
        </div>
    </div>
</div>
<!-- CONTENT END -->

<!-- FOOTER BEGIN -->
{include file="public/tail"}

最后补上一句:日志文件一定要开启写权限,否则无法自动写入。即在alipay文件夹下右键log.txt属性设置。出了问题可以在日志里查看。

走到这里,流程就基本介绍完了。欢迎各位大佬拍砖指导。做完支付,会感觉自己又上了一个台阶!

以上是TP5實現支付寶電腦網站支付的範例介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除