tp5实现简单的支付功能。
思路:
1、下载支付宝提供的sdk,
2、打开支付宝开放平台,寻找沙箱应用,
3、将sdk放到自己的项目路径中,
4、编写简单的一个支付调用
5、创建控制器方法,调用sdk方法
6、编写同步跳转地址,因为异步跳转需要向我们的服务器上发送通知,所以暂时就不做了。
sdk结合项目路径
将sdk包放到public/plugins,目录下,然后修改config.php的文件,配置好环境。
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;
}
}
调用结果页
基本的一套支付流程就算完成,但是最主要的还是里面的配置需要好好修改,我这个是超简单的一个支付流程。不过,回了这个了解怎么支付,到时候结合实际项目就会好做很多了,要优化的地方还是很多。