前瞻:
代码实现
- 预先下订单
//引入sdk
require($_SERVER['DOCUMENT_ROOT'].'/../vendor/aop/AopClient.php');
require($_SERVER['DOCUMENT_ROOT'].'/../vendor/aop/request/AlipayTradeAppPayRequest.php');
$aliPayConfig = Config::get('app.ALI_PAY_CONFIG');
$aop = new \AopClient();
$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
$aop->appId = $aliPayConfig['APPID'];
$aop->rsaPrivateKey = $aliPayConfig['RSA_PRIVATE_KEY']; //私钥
$aop->format = "json";
$aop->charset = "UTF-8";
$aop->signType = "RSA2";
$aop->alipayrsaPublicKey = $aliPayConfig['RSA_PUBLIC_KEY']; //公钥
$request = new \AlipayTradeAppPayRequest();
$bizcontent = json_encode([
'body'=> $data['body'],
'subject'=> $data['subject'],
'out_trade_no'=> $data['out_trade_no'],
'total_amount'=> $data['total_amount'],
//'total_amount'=> 0.01,
'timeout_express'=>'30m',
'product_code'=>'QUICK_MSECURITY_PAY'
]);
$returnUrl = 'http://'.$_SERVER['HTTP_HOST'].'/api/v2/payment/aliNotify';// 异步链接
$request->setNotifyUrl($returnUrl);//设置回调地址
$request->setBizContent($bizcontent);
$response = $aop->sdkExecute($request);
save_payment_log('alipay', '订单编号:'.$data['out_trade_no'].'请求支付宝预下单返回参数','unifiedorder', json_encode($response, FILE_APPEND));
if($response){
return ['code' => 200, 'tips' => 'success', 'data' => $response];
}else{
return ['code' => 400, 'tips' => '调起支付宝失败'];
}
- 支付宝回调接口
这里注意下HTTPS和HTTP的情况,可能测试站我们用的HTTP,有可能线上我们用的是HTTPS,然后代码里写的是HTTP,就有可能回调的时候HTTPS就给301给跳转走了,所以如果不回调的时候,别的没问题的时候,去看下Nginx的请求是否被重定向了
//支付宝回调的参数是通过form-data类型传参的
$input = input();
save_payment_log('alipay', '支付宝支付回调开始','alipayNotify', json_encode($input, FILE_APPEND));
require($_SERVER['DOCUMENT_ROOT'].'/../vendor/aop/AopClient.php');
require($_SERVER['DOCUMENT_ROOT'].'/../vendor/aop/request/AlipayTradeAppPayRequest.php');
$aliPayConfig = Config::get('app.ALI_PAY_CONFIG');
$aop = new \AopClient();
$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
$aop->appId = $aliPayConfig['APPID'];
$aop->rsaPrivateKey = $aliPayConfig['RSA_PRIVATE_KEY']; //私钥
$aop->format = "json";
$aop->charset = "UTF-8";
$aop->signType = "RSA2";
$aop->alipayrsaPublicKey = $aliPayConfig['RSA_PUBLIC_KEY']; //公钥
$flag = $aop->rsaCheckV1($input, NULL, "RSA2");
if(!$flag){
save_payment_log('alipay', '支付宝支付回调验签','alipayNotify', '支付单号为' . $input['out_trade_no'] . '支付回调失败:验签失败!');
echo 'fail';exit();
}
if($input['trade_status'] == 'TRADE_SUCCESS' ){
//业务处理
$payments = Db::table('payments')
->where('trade_no', $input['out_trade_no'])
->order('created_at', 'desc')
->select();
if($payments){
foreach ($payments as $payment){
if($payment['paid']){//如果 paid为1 则已经完成
save_payment_log('alipay', '支付宝支付回调检测是否有之前已经被支付','alipayNotify', '支付单号为' . $input['out_trade_no'] . '支付回调失败:之前 已经有交易完成记录了!');
echo 'fail';exit();
}
}
$status = $this->hadPaidChangeOrderStatus($input, 'alipay');
if($status){
save_payment_log('alipay', '支付宝支付回调完成','alipayNotify', '支付单号为' . $input['out_trade_no'] . '支付回调完成,更改了订单状态!');
echo 'success';exit();
}
save_payment_log('alipay', '支付宝支付回调异常','alipayNotify', '支付单号为' . $input['out_trade_no'] . '回调异常,在修改订单状态时出异常');
echo 'fail';exit();
}else{
save_payment_log('alipay', '支付宝支付回调异常','alipayNotify', '支付单号为' . $input['out_trade_no'] . '支付回调失败:未找到预支付单!');
echo 'fail';exit();
}
}else{
save_payment_log('alipay', '支付宝支付回调支付状态','alipayNotify', '支付单号为' . $input['out_trade_no'] . '支付回调成功:支付失败!');
echo 'fail';exit();
}