Thinkphp5支付宝app支付和退款的入坑与退坑


  1. 支付宝app支付三大基本参数:  APPID; 秘钥,应用公钥;
  2. 支付宝退款三大基本参数: APPID; 秘钥,支付宝公钥;
  3. 支付宝需要自己生成唯一订单号,这个和支付宝商户中心商户订单号不一样,但成功后回调也会把我们这个发过去的订单号回调发过来,以此订单号为条件,查询订单表数据,更改订单状态;可以顺便把支付宝交易号回调过来保存数据库,后面退款需要用到.
  4. 支付宝回调地址必须公网可以访问

多的不说啦,上代码:

Thinkphp5支付宝app支付和退款的入坑与退坑_第1张图片

gatewayUrl = 'https://openapi.alipay.com/gateway.do';
          $aop->appId = $this->appId;
          $aop->rsaPrivateKey = $this->rsaPrivateKey;
          $aop->alipayrsaPublicKey = $this->alipayrsaPublicKey_zhifubao;
          $aop->apiVersion = '1.0';
          $aop->signType = "RSA2";
          $aop->postCharset = 'UTF-8';
          $aop->format = "json";
          $request = new \AlipayTradeRefundRequest ();

          //需要传入的参数变量
          $trade_no  = "支付宝交易流水号";           
          $refund_fee = "退款金额";
          $out_trade_no = "支付宝订单号号";

          $request->setBizContent("{" .
            "\"trade_no\":\"{$trade_no}\"," . //支付宝交易号,和商户订单号不能同时为空 特殊可选
            "\"out_trade_no\":\"{$out_trade_no}\"," .  //订单支付时传入的商户订单号,不能和 trade_no同时为空。 特殊可选
            "\"refund_amount\":\"{$refund_fee}\"," . //需要退款的金额,该金额不能大于订单金额,单位为元,支持两位小数     必选
            "\"refund_reason\":\"订单取消-退款\"" . //退款的原因说明    正常退款 可选 最后的“,”逗号去掉
            "}");

          $result = $aop->execute($request);
          $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
          $resultCode = $result->$responseNode->code;
          if(!empty($resultCode) && $resultCode == 10000){
              //退款成功,处理订单状态以及更新退款等信息
            
               return json(['code'=>200,'msg'=>'退款成功']); 
          } else {
              return json(['code'=>400,'msg'=>'退款失败']); 
          }
    }
    
    //支付宝app支付付款  支付用的是应用公钥
    public function payOrder(Request $request)
    {   	

        $subject="测试公益付款";//商品标题
        $body = '公益事业';
        $out_trade_no = "需要自己去生成一个唯一订单号,然后支付宝回调给给我们返回来,然后用他去操作订单状态,这个跟支付宝商户中心的订单号不一样,注意了哦";
        $total_amount = 0.01;//付款金额
        $aop = new \AopClient ();
        $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
        $aop->appId = $this->appId;
        $aop->rsaPrivateKey = $this->rsaPrivateKey;
        $aop->format = "json";
        $aop->charset = "UTF-8";
        $aop->signType = "RSA2";
        $aop->alipayrsaPublicKey = $this->alipayrsaPublicKey;
        $request = new \AlipayTradeAppPayRequest();
        $bizcontent = "{\"body\":\"".$body."\","
                . "\"subject\": \"".$subject."\","
                . "\"out_trade_no\": \"".$out_trade_no."\","
                . "\"timeout_express\": \"30m\","
                . "\"total_amount\": \"".$total_amount."\","
                . "\"product_code\":\"QUICK_MSECURITY_PAY\""
                . "}";       
        $request->setNotifyUrl($this->notify_url);
        $request->setBizContent($bizcontent);
       //这里和普通的接口调用不同,使用的是sdkExecute
        $response = $aop->sdkExecute($request);        
        return json(["code" => 200, "data" =>  $response]);  
    }
    //支付宝支付成功之后异步回调处理
    public function notify()
    {     

         if ($_POST['trade_status'] == 'TRADE_SUCCESS')
          {//如果支付成功
             //===============修改订单状态===========================//         
              $orderSn = $_POST['out_trade_no'];//获取订单号             
              $data1['batch'] = $_POST['trade_no']; //交易流水号
              //根据订单号,以此为条件,修改订单状态以及存入交易流水号
              echo 'success'; //必须success结尾,否则支付宝会多次回调
              exit;
          }
    }

 }

 

你可能感兴趣的:(点石成金,PHP)