申請開發應用
可使用公司營業執照或個體工商戶申請
支付寶開放平臺
https://open.alipay.com/
功能簽約
密鑰要存儲起來
功能對接(使用thinkphp5.1)
接口擴展文件
配置文件
整理集合
鏈接:https://pan.baidu.com/s/1-TPJgv7IWx4cl-6YPwapNA
提取碼:jhkc
前臺操作
<!DOCTYPE html>
<html>
<head>
<title>{$user_login} - 支付充值</title>
<meta name="keywords" content="" />
<meta name="description" content="">
<include file="public@head" />
</head>
<body class="body-white" id="top">
<include file="public@nav" />
<div class="container tc-main">
<div class="row">
<div class="col-md-3">
<include file="public@usernav" />
</div>
<div class="col-md-9">
<div class="tabs">
<ul class="nav nav-tabs">
<li class="active"><a href="#one" data-toggle="tab"><i class="fa fa-edit"></i> 支付充值</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="one">
<br>
<form class="js-ajax-form" method="post">
<div class="form-group">
<label for="input-sex">支付方式</label>
<div>
<div>微信支付<input type="radio" name="type" value="1" checked></div>
<div>支付寶支付<input type="radio" name="type" value="2"></div>
</div>
</div>
<div class="form-group">
<label for="input-birthday">支付金額</label>
<input class="form-control" type="number" name="money" value="0.01">
</div>
<div class="form-group">
<input type="button" id="pay" class="btn btn-primary js-ajax-submit" value="確定">
</div>
<div id="pay_bolck" style="display: none;">
<div id="pay_qrcode"></div>
<span id="pay_text"></span>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<include file="public@footer" />
</div>
<!-- /container -->
<include file="public@scripts" />
<script src="https://cdn.bootcss.com/jquery.qrcode/1.0/jquery.qrcode.min.js"></script>
<script>
var out_trade_no = '';
$('#pay').click(function (e) {
$.ajax({
type: "method",
url: "{:url('pay')}",
data: $("form").serialize(),
method: "POST",
dataType: "json",
success: function (response) {
var type = $("input:radio[name=type]:checked").val();
$("#pay_bolck").css('display', 'block');
$("#pay_qrcode").html('');
out_trade_no = response.out_trade_no;
$("#pay_qrcode").qrcode({
width: 200,
height: 200,
text: response.url,
// background:,//背景色,
// foreground://前景色
})
if (type == 1) {
$("#pay_text").text("打開微信,掃描二維碼支付");
}
if (type == 2) {
$("#pay_text").text("打開支付寶,掃描二維碼支付");
}
}
});
});
//輪詢訂單狀態
$(document).ready(function () {
setInterval("ajaxstatus()", 3000);
});
function ajaxstatus() {
if (out_trade_no != '') {
$.ajax({
url: "{:url('payFind')}?out_trade_no=" + out_trade_no,
type: "POST",
dataType: "json",
data: "",
success: function (data) {
if (data.code == 1) { //訂單狀態爲1表示支付成功
window.location.href = "/"; //頁面跳轉
}
},
error: function () {
alert("請求訂單狀態出錯");
}
});
}
}
</script>
</body>
</html>
支付操作(不要使用收款支付寶支付)
入口文件index.php中加入常量配置
// 支付目錄
define('PAY_PATH', CMF_ROOT . 'extend/Library/');
/**
* 阿里當面付支付業務
*/
// $result
// object(AlipayF2FPrecreateResult)#52 (2) {
// ["tradeStatus":"AlipayF2FPrecreateResult":private] => string(7) "SUCCESS"
// ["response":"AlipayF2FPrecreateResult":private] => object(stdClass)#51 (4) {
// ["code"] => string(5) "10000"
// ["msg"] => string(7) "Success"
// ["out_trade_no"] => string(20) "XXXXXX"
// ["qr_code"] => string(46) "https://qr.alipay.com/XXXXX"
// }
// }
public function aliPay($money)
{
require PAY_PATH . '/ali_pay/f2fpay/service/AlipayTradeService.php'; //引入支付寶當面付
require PAY_PATH . '/ali_pay/f2fpay/model/builder/AlipayTradePayContentBuilder.php'; //引入支付寶當面付
$out_trade_no = 'ALIPAY' . date("YmdHis");
$payRequestBuilder = new \AlipayTradePayContentBuilder();
$payRequestBuilder->setBody('tset');
$payRequestBuilder->setSubject('掃碼支付' . $money . '元');
$payRequestBuilder->setTotalAmount($money);
$payRequestBuilder->setOutTradeNo($out_trade_no);
$result = new \AlipayTradeService(config('alipay.'));
$result = $result->qrPay($payRequestBuilder);
// dump($result);
// exit;
if ($result->getTradeStatus() == "SUCCESS") {
$response = $result->getResponse();
return [
'url' => $response->qr_code,
'out_trade_no' => $out_trade_no,
];
} else {
$this->error('參數錯誤');
}
}
回調操作
/**
* 阿里雲當面付支付回調處理
*/
// Array
// (
// [s] => /common/third/aliPayCallback
// [gmt_create] => 2020-01-27 14:57:13
// [charset] => UTF-8
// [seller_email] => XXXXX
// [subject] => 掃碼支付0.01元
// [sign] => XXXXX
// [body] => tset
// [buyer_id] => XXXXX
// [invoice_amount] => 0.01
// [notify_id] => XXXXX
// [fund_bill_list] => [{"amount":"0.01","fundChannel":"ALIPAYACCOUNT"}]
// [notify_type] => trade_status_sync
// [trade_status] => TRADE_SUCCESS
// [receipt_amount] => 0.01
// [buyer_pay_amount] => 0.01
// [app_id] => XXXXX
// [sign_type] => RSA2
// [seller_id] => XXXXX
// [gmt_payment] => 2020-01-27 14:57:24
// [notify_time] => 2020-01-27 14:57:25
// [version] => 1.0
// [out_trade_no] => XXXXX
// [total_amount] => 0.01
// [trade_no] => XXXXX
// [auth_app_id] => XXXXX
// [buyer_logon_id] => XXXXX
// [point_amount] => 0.00
// )
public function aliPayCallback()
{
require PAY_PATH . '/ali_pay/aop/AopClient.php'; //引入支付寶當面付
$config = config('alipay.');
$out_trade_no = input('post.out_trade_no');
$transaction_id = input('post.trade_no');
$aop = new \AopClient;
$aop->appId = $config['app_id'];
$aop->rsaPrivateKey = $config['merchant_private_key'];
$aop->alipayrsaPublicKey = $config['alipay_public_key'];
$aop->signType = $config['sign_type'];
$result = $aop->rsaCheckV1($_POST, '', $config['sign_type']);
if ($result) {
if (input('trade_status') == 'TRADE_FINISHED' || input('trade_status') == 'TRADE_SUCCESS') {
// 處理支付成功後的邏輯業務
$order = DB::name('recharge')->where(['out_trade_no' => $out_trade_no])->find();
if (!$order) {
return 'order not exists';
}
//訂單狀態錯誤 1 未付款 其他狀態均爲已處理的狀態
if ($order['status'] != 1) {
return true;
}
//改變訂單狀態
DB::name('recharge')
->where('out_trade_no', $out_trade_no) //商戶自定義訂單號
->update([
'transaction_id' => $transaction_id, //支付寶交易單號
'status' => 2, //已支付
'end_time' => time() //完成時間
]);
$recharge = DB::name('recharge')
->where('out_trade_no', $out_trade_no) //商戶自定義訂單號
->field('uid,total_fee')
->find();
//增加用戶餘額
DB::name('user')
->where('id', $recharge['uid'])
->setInc('balance', $recharge['total_fee']);
//支付成功的邏輯
return 'success';
}
return 'fail';
}
return 'fail';
}