申请开发应用
可使用公司营业执照或个体工商户申请
支付宝开放平台
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';
}