PHP 支付宝支付,支付宝回调

下载官方SDK:https://openhome.alipay.com/doc/sdkDownload.resource?sdkType=PHP
在支付宝所创建的应用中添加“ 电脑网站支付、手机网站支付、APP支付、转账到支付宝账户”功能
vue可参考:https://blog.csdn.net/qq_33026699/article/details/106069905

一、电脑网站支付

public function pcpay($order_id){
    $m_order = Db::name("order");
    $order_map['id'] = $order_id;
    $order_data = $m_order->where($order_map)->find();
    
    Vendor('sdk.aop.AopClient');
    Vendor('sdk.aop.request.AlipayTradePagePayRequest');

    $aop = new \AopClient ();
    $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
    $aop->appId = '******';    #appid
    $aop->rsaPrivateKey = '******';     #开发者私钥
    $aop->alipayrsaPublicKey='******';   #支付宝公钥
    $aop->apiVersion = '1.0';
    $aop->postCharset='UTF-8';
    $aop->format='json';
    $aop->signType='RSA2';
    $request = new \AlipayTradePagePayRequest ();
    $www_url = $_SERVER['HTTP_HOST'];
	
	$data['body']='******';  #描述
    $data['subject']='******';   #应用名
    $data['out_trade_no']=$order_data['order'];     #订单号
    $data['timeout_express']='30m';
    $data['total_amount']=$order_data['money'];    #金额
    $data['product_code']='FAST_INSTANT_TRADE_PAY';
    #$data['qr_pay_mode']='3';   #PC扫码支付的方式,支持前置模式和跳转模式。 
    $bizcontent = json_encode($data);
    $request->setNotifyUrl("http://".$www_url.".******");    #异步回调地址
    $request->setReturnUrl("http://".$www_url);   #同步回调地址,如果是前置模式,那么就需要自己写个判断订单状态的方法,让前端循环调取,前端自己做跳转
    $request->setBizContent($bizcontent);
    $result = $aop->pageExecute ( $request); 
    #$this->success("请求成功",$result);
    echo $result;
}

值得注意的是qr_pay_mode属性,在前端使用iframe标签套住支付宝返回的代码,可以自定义自己支付页面的样式。

二、手机网站支付

	public function webapp($order_id){
    $m_order = Db::name("order");
    $order_map['id'] = $order_id;
    $order_data = $m_order->where($order_map)->find();
    
    Vendor('sdk.aop.AopClient');
    Vendor('sdk.aop.request.AlipayTradeWapPayRequest');

    $aop = new \AopClient ();
    $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
    $aop->appId = '******';   #appid
    $aop->rsaPrivateKey = '******';    #开发者私钥
    $aop->alipayrsaPublicKey='******';    #支付宝公钥
    $aop->apiVersion = '1.0';
    $aop->postCharset='UTF-8';
    $aop->format='json';
    $aop->signType='RSA2';
    $request = new \AlipayTradeWapPayRequest ();
    $www_url = $_SERVER['HTTP_HOST'];
    
	 $data['body']='******';   #描述
    $data['subject']='******';   #应用名
    $data['out_trade_no']=$order_data['order'];     #订单号
    $data['timeout_express']='30m';
    $data['total_amount']=$order_data['money'];     #金额
    $data['product_code']='QUICK_WAP_WAY';
    $bizcontent = json_encode($data);
    $request->setNotifyUrl("http://".$www_url."*****");    #异步回调地址
    $request->setReturnUrl("http://".$www_url);   #同步回调回调地址
    $request->setBizContent($bizcontent);
    $result = $aop->pageExecute ( $request); 
    #$this->success("请求成功",$result);
    echo $result;
}

三、app支付

public function aoppay($order_id){
    Vendor('sdk.aop.AopClient');
    Vendor('sdk.aop.request.AlipayTradeAppPayRequest');
    $aop = new \AopClient();

    $m_order = Db::name("order");
    $order_map['id'] = $order_id;
    $order_data = $m_order->where($order_map)->find();

    $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
    $aop->appId = '******';   #appid
    $aop->rsaPrivateKey = '******';//开发者私钥
    $aop->format = "json";
    $aop->charset = "UTF-8";
    $aop->signType = "RSA2";
    $aop->alipayrsaPublicKey = '******';//支付宝公钥
    //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
    //$this->ajaxReturn($aop);
    $request = new \AlipayTradeAppPayRequest();
    //SDK已经封装掉了公共参数,这里只需要传入业务参数
    $data['body']='******';   #描述
    $data['subject']='******';    #应用名
    $data['out_trade_no']=$order_data['order'];    #订单号
    $data['timeout_express']='30m';
    $data['total_amount']=$order_data['money'];    #金额
    $data['product_code']='QUICK_MSECURITY_PAY';
    $bizcontent = json_encode($data);
    $www_url = $_SERVER['HTTP_HOST'];
    //$this->ajaxReturn($bizcontent);
    $request->setNotifyUrl("http://".$www_url."****");   #回调地址
    $request->setBizContent($bizcontent);
//这里和普通的接口调用不同,使用的是sdkExecute
    $response = $aop->sdkExecute($request);

//htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题
//        echo htmlspecialchars($response);//就是orderString 可以直接给客户端请求,无需再做处理。
//         $res= htmlspecialchars($response);
     //$res= htmlspecialchars_decode($response);
    
     $this->success("请求成功",$response);
}

四、支付宝转账

    Vendor('sdk.aop.AopClient');
    Vendor('sdk.aop.request.AlipayFundTransToaccountTransferRequest');
    $order = date('Ymd') . substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);   //订单号
    $aop = new \AopClient ();
    $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
    $aop->appId = '这里是应用appid';
    $aop->rsaPrivateKey = '开发者私钥';

    //转帐的是使用支付宝公钥的验签,默认使用的是初始化客户端时候的公钥,需要把初始化客户端的公钥修改为支付宝的公钥。应用公钥实际没有用处。
    //$aop->alipayrsaPublicKey='请填写支付宝公钥,一行字符串';

    $aop->apiVersion = '1.0';
    $aop->signType = 'RSA2';
    $aop->postCharset='UTF-8';
    $aop->format='json';
    $request = new \AlipayFundTransToaccountTransferRequest ();
	
	$data['out_biz_no']=$order;     #订单号
    $data['payee_type']='ALIPAY_LOGONID';
    $data['payee_account']='******';    #这里是支付宝账号
    $data['payee_real_name']='******';   #这里是真实姓名
    $data['remark']='******';   #注释
    $data['amount']='******';   #金额,最低0.1
    $request->setBizContent($data);
     
     $result = $aop->execute ($request);
    $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
    $resultCode = $result->$responseNode->code;
    #$msg = $result->$responseNode->msg;
    if(!empty($resultCode)&&$resultCode == 10000){
        echo "转账成功!";
    } else {
        echo "转账失败!";
    }

支付成功回调

	header("Content-Type: text/html;charset=utf-8");
    $request = Request::instance();
    
    Vendor('sdk.AopSdk');
    Vendor('sdk.aop.AopClient');

    $aop = new \AopClient;
    $aop->alipayrsaPublicKey = '******************';  #支付宝公钥,这里注意,一定是支付宝公钥,不是应用公钥
    $flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
    /*
    #将上边一行验签代码注释,以下代码可以帮助自己检查验签错误
    if($request->IsPost()){
        $str = json_encode($_POST);
        $fp = fopen("./pay.txt",'w');
        fwrite($fp,$str);
        
        $flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
        $fp = fopen("./pay1.txt",'w');
        fwrite($fp,$flag);
    }else{
        $filename = "./pay.txt";
        $handle = fopen($filename, "r");
        $contents = fread($handle, filesize ($filename));
        $json_array = json_decode($contents,TRUE);
        $flag = $aop->rsaCheckV1($json_array, NULL, "RSA2");
        dump($json_array);
        dump($flag);
        die;
    }*/
    
    #验签通过后再实现业务逻辑,比如修改订单表中的支付状态。
    /**
     * 验签通过后通过trade_status验证订单是否成功,通过out_trade_no获取订单号
     * 修改订单表,以及执行自己的逻辑
     **/
    if (!empty($flag)) {
        if ($_POST['trade_status'] == 'TRADE_SUCCESS' || $_POST['trade_status'] == 'TRADE_FINISHED') {    //处理交易完成或者支付成功的通知

            $data['out_trade_no'] = $_POST['out_trade_no'];
            #$data['out_trade_no'] = '2020042955504899';

            $m_order = Db::name('order');
            
            #查询订单状态是否完成,完成则应答支付宝,未完成则修改订单状态,执行自己的支付成功逻辑
            $order_map['order'] = $data['out_trade_no'];
            $order_map['status'] = 2;
            $order_data = $m_order->where($order_map)->find();
            if(empty($order_data)){
                echo 'success';exit();
            }

            #修改订单状态,成功后逻辑在这里写
           
        }
        //打印success,应答支付宝。必须保证本界面无错误。只打印了success,否则支付宝将重复请求该回调地址。
        echo 'success';
    }
    echo 'success';

你可能感兴趣的:(支付宝)