tp5實作簡單的支付功能。
思路:
1、下載下傳支付寶提供的sdk,
2、打開支付寶開放平台,尋找沙箱應用,
3、将sdk放到自己的項目路徑中,
4、編寫簡單的一個支付調用
5、建立控制器方法,調用sdk方法
6、編寫同步跳轉位址,因為異步跳轉需要向我們的伺服器上發送通知,是以暫時就不做了。
sdk結合項目路徑
将sdk包放到public/plugins,目錄下,然後修改config.php的檔案,配置好環境。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPB5keFRVT4dmeNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLwkDO4UTMzQTM4ITMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<title>支付寶支付</title>
</head>
<body>
<div style="margin:300px auto;width: 1200px;text-align: center;">
<form action="{:url('home/order/pay')}" method="post" class="form">
商品名稱:<input type="text" name="username" id="username">
<br>
<br>
商品數量:<input type="number" name="number" id="number">
<br>
<br>
商品價格:<input type="number" name="price" id="price">
<br>
<br>
<button class="btn" type="button">購買</button>
</form>
</div>
</body>
</html>
<script>
$(function(){
$(".btn").click(function(){
var flag = true;
if($("#username").val() == ""){
alert("商品名稱不允許為空");
flag = false;
}
if($("#number").val() == ""){
alert("商品數量不允許為空");
flag = false;
}
if($("#price").val() == ""){
alert("商品價格不允許為空");
flag = false;
}
if(flag){
$(".form").submit();
}
})
})
</script>
控制器方法
// 跳轉到支付接口
public function pay(Request $request)
{
$data = $request->param();
$OrderNum = mt_rand(100000000000,999999999999);
$price = $data['price'];
$number = $data['number'];
$sum = $price * $number;
// 支付寶支付跳轉
$html = "<form name='alipayment' id='alipay' action='/plugins/alipay/pagepay/pagepay.php' method='post' style='display:none'>
<!-- 訂單編号 -->
<input id='WIDout_trade_no' name='WIDout_trade_no' value='{$OrderNum}'/>
<!-- 商場 -->
<input id='WIDsubject' name='WIDsubject' value='默生'/>
<!-- 總金額 -->
<input id='WIDtotal_amount' name='WIDtotal_amount' value='{$sum}'/>
<!-- 商品資訊 -->
<input id='WIDbody' name='WIDbody' value='哈哈哈'/>
<button class='new-btn-login' type='submit' style='text-align:center;'>付 款</button>
</form><script>document.getElementById('alipay').submit()</script>";
echo $html;
}
// 支付結果頁 支付寶的同步跳轉位址 成功之後跳轉的位址
public function payResult(Request $request)
{
# 接受參數
$data = $request->param();
// 驗證是否支付成功
require_once("./plugins/alipay/config.php");
require_once './plugins/alipay/pagepay/service/AlipayTradeService.php';
$alipaySevice = new \AlipayTradeService($config);
$result = $alipaySevice->check($data);
// 支付成功傳回的頁面
if($result){
// 驗簽成功傳回的界面
//支付寶交易号
$trade_no = htmlspecialchars($data['trade_no']);
echo "success"."<br />"."支付寶交易号:".$trade_no;
die;
}else{
// 支付驗簽失敗傳回的頁面
echo "驗證失敗";
die;
}
}
// 支付寶異步跳轉位址 再本地并不可以調用成功,因為這是支付寶發送伺服器端的。
public function payRe(){
// 支付成功之後 支付寶的伺服器端向我們的伺服器端發送的一個通知,會傳遞一下參數,我們通過這些參數進行驗證然後修改訂單狀态。
// 接受參數
$data = request()->param();
// 驗簽
require_once './plugins/alipay/config.php';
require_once './plugins/alipay/pagepay/service/AlipayTradeService.php';
$alipaySevice = new \AlipayTradeService($config);
// 記錄日志
$alipaySevice->writeLog(var_export($_POST,true));
// 傳回的支付結果
$result = $alipaySevice->check($data);
// 判斷支付結果
if($result){
// 驗簽成功之後的結果
// 判斷交易狀态
if($data['trade_status'] == "TRADE_SUCCESS"){
// 交易支付成功
echo "success";
die;
}else if($data['trade_status'] == "TRADE_FINISHED"){
# 交易結束,不可退款
echo "fail";
die;
}
echo "success";
die;
}else{
# 驗簽失敗
$alipaySevice->writeLog("驗簽失敗");
// 失敗傳回的結果
echo "fail";die;
}
}
調用結果頁
基本的一套支付流程就算完成,但是最主要的還是裡面的配置需要好好修改,我這個是超簡單的一個支付流程。不過,回了這個了解怎麼支付,到時候結合實際項目就會好做很多了,要優化的地方還是很多。