支付宝订单金额原路退回

以PHP为例:

参考支付宝官方文档地址:

小程序文档 - 支付宝文档中心支付宝文档中心https://opendocs.alipay.com/open/6c0cdd7d_alipay.trade.refund操作步骤:

一:下载SDK

二:沙箱测试

        登录支付宝账号后,使用在线调试工具时,工具自动将沙盒环境的参数配置好了,沙盒环境测试流程通过后,换成正式环境的参数配置即可。

三:正式环境测试

具体实施:

1:应用加签名。

登录支付宝控制台,创建网页/移动应用并检查是否开通了对应的APP支付或网页支付,并配置接口加签方式。

扫描二维码关注公众号,回复: 16304418 查看本文章

加签主要是使用支付宝开放平台密钥工具 生成 支付宝应用公钥和支付宝应用私钥

并把应用公钥配置在创建的应用上,此时,支付宝后台会自动生成支付宝公钥在后面的代码中,会用到支付宝应用私钥和支付宝公钥。

2:sdk下载

需要去支付宝GitHub地址,下载v2版本即可。使用里面的aop模块

https://github.com/alipay/alipay-sdk-php-all

下载解压缩后,将v2复制到自己的项目中,然后在代码中引用即可。 在此,我是把v2放在了sdk/alipay_refund文件夹下,可根据自己的需求创建文件夹,注意:下面的代码部分也要替换为自己自定义的文件夹名称。

在线调试工具:

支付宝开放平台https://open.alipay.com/api/apiDebug?frontProdCode=I1080300001000041313&backProdCode=I1011000100000000004

3:示例代码

此处的代码流程是先执行退款接口,退款失败的话再执行退款查询接口。

fund_change  为Y代表退款成功,但为N时并不代表退款失败。

因为可能存在一种情况是重复退款时,退款接口返回N,那此时我们需要调用一下查询接口,来验证是否真正退款成功,只有查询时返回的refund_status为REFUND_SUCCESS时,才代表退款成功。具体可参考支付宝官方文档说明:

小程序文档 - 支付宝文档中心支付宝文档中心https://opendocs.alipay.com/support/01rawa

//支付宝退款
//$out_trade_no 商户系统内唯一订单号
//$trade_no 支付宝侧订单号
//$money 退款金额(单位:元)
    function AlipayRefund($out_trade_no,$trade_no,$money){

        $rs=array('code'=>0,'msg'=>'','info'=>[]);
        //引入sdk路径时注意路径层级
        require_once '/sdk/alipay_refund/aop/AopClient.php';
        require_once '/sdk/alipay_refund/aop/AopCertClient.php';
        require_once '/sdk/alipay_refund/aop/AopCertification.php';
        require_once '/sdk/alipay_refund/aop/AlipayConfig.php';
        require_once '/sdk/alipay_refund/aop/request/AlipayTradeRefundRequest.php';
        require_once '/sdk/alipay_refund/aop/request/AlipayTradeFastpayRefundQueryRequest.php'; //退款查询

        //支付宝应用私钥
        $aliapp_refund_privatekey='';
        //支付宝公钥
        $aliapp_refund_publickey='';
        
        //<-- 应用私钥 -->
        $privateKey = $aliapp_refund_privatekey;
        //<-- 支付宝公钥 -->
        $alipayPublicKey = $aliapp_refund_publickey;
        $alipayConfig = new AlipayConfig();
        //沙盒环境下的应用网关:https://openapi-sandbox.dl.alipaydev.com/gateway.do
        //正式环境下的应用网关:https://openapi.alipay.com/gateway.do
        $alipayConfig->setServerUrl("https://openapi.alipay.com/gateway.do");
        //<-- 应用AppId -->
        $aliapp_appid='';
        $alipayConfig->setAppId($aliapp_appid);
        $alipayConfig->setPrivateKey($privateKey);
        $alipayConfig->setFormat("json");
        $alipayConfig->setAlipayPublicKey($alipayPublicKey);
        $alipayConfig->setCharset("UTF-8"); //注意此处的编码格式
        $alipayConfig->setSignType("RSA2");
        $alipayClient = new AopClient($alipayConfig);

        //退款
        $request = new AlipayTradeRefundRequest();

       /* $request->setBizContent("{".
            "\"out_trade_no\":\"2_20230816163057378\",".
            "\"trade_no\":\"2023081622001472631443028556\",".
            "\"refund_amount\":\"0.01\"".
        "}");*/

        $request->setBizContent("{".
            "\"out_trade_no\":\"".$out_trade_no."\",".
            "\"trade_no\":\"".$trade_no."\",".
            "\"refund_amount\":\"".$money."\"".
        "}");

        $responseResult = $alipayClient->execute($request);
        $responseApiName = str_replace(".","_",$request->getApiMethodName())."_response";
        $response = $responseResult->$responseApiName;

        file_put_contents('/log/支付宝退款'.date('Y-m-d').'.txt',date('y-m-d H:i:s').'返回信息 :'.json_encode($response)."\r\n",FILE_APPEND);

        if(!empty($response->code)&&$response->code==10000){
            //var_dump("退款调用成功");
            //退款成功
            if($response->fund_change=='Y'){
                $rs['msg']='退款成功';
                return $rs;
            }
            
            //退款未成功,需要查询核实
            if($response->fund_change=='N'){

                //查询
                $request = new AlipayTradeFastpayRefundQueryRequest();

                /*$request->setBizContent("{".
                    "\"out_request_no\":\"2_20230816163057378\",".
                    "\"out_trade_no\":\"2_20230816163057378\",".
                    "\"trade_no\":\"2023081622001472631443028556\",".
                    "\"refund_amount\":\"0.01\"".
                "}");*/

                $request->setBizContent("{".
                    "\"out_request_no\":\"".$out_trade_no."\",".
                    "\"out_trade_no\":\"".$out_trade_no."\",".
                    "\"trade_no\":\"".$trade_no."\",".
                    "\"refund_amount\":\"".$money."\"".
                "}");

                $responseResult = $alipayClient->execute($request);
                $responseApiName = str_replace(".","_",$request->getApiMethodName())."_response";
                $response1 = $responseResult->$responseApiName;

                file_put_contents('/log/支付宝退款查询'.date('Y-m-d').'.txt',date('y-m-d H:i:s').'返回信息 :'.json_encode($response1)."\r\n",FILE_APPEND);

                if(!empty($response1->code)&&$response1->code==10000){
                    //var_dump("退款查询调用成功");
                    if($response1->refund_status=='REFUND_SUCCESS'){
                        $rs['msg']='退款成功';
                        return $rs;
                    }else{
                        $rs['code']=1002;
                        $rs['msg']='退款失败,请检查支付宝商户余额或稍后再试';
                        return $rs;
                    }
                }
                else{
                    file_put_contents('/log/支付宝退款查询'.date('Y-m-d').'.txt',date('y-m-d H:i:s').'返回信息 :订单号==>'.$out_trade_no.";支付宝交易号:==>".$trade_no."退款查询失败"."\r\n",FILE_APPEND);
                    //var_dump("退款查询调用失败");
                    $rs['code']=1003;
                    $rs['msg']='退款查询失败';
                    return $rs;
                }

            }
        }
        else{
            //var_dump("退款调用失败");
            $rs['code']=1001;
            $rs['msg']='退款失败,请检查支付宝商户余额或稍后再试';
            return $rs;
        }

    }

注意:

正式环境下的应用AppId为:

猜你喜欢

转载自blog.csdn.net/salestina/article/details/132423261
今日推荐