【支付宝支付】APP支付

前瞻:

支付文档和SDK链接

代码实现

  • 预先下订单
 //引入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();
 }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值