page contents

PHP实现微信申请退款功能

一定要先搞定了微信支付,不然怎么退款,这次使用官方的demo。

attachments-2020-06-BpZr4TGN5ef0466f366a3.png

前期准备:
一定要先搞定了微信支付,不然怎么退款,这次使用官方的demo。当然网上可能也有很多大神自己重写和封装了demo,或许更加好用简洁,但是我还是不提倡用,原因如下:

(1)可能功能不全,或许他只是实现了微信支付,但是还有申请退款、查询退款、订单查询、撤销订单等业务功能可能是你后续需要的,如果你依赖于大神的SDK的便捷,如果有新的业务需求,你就懵逼了;

(2)安全考虑,涉及到支付涉及到金钱,必须要非常安全。官方SDK虽然我也吐槽,但至少会相对比较安全,再次重写,虽然暂时没看出问题,但是万一有漏洞就不好了。

本篇还是使用到官方提供的SDK中的最重要的一个类文件WxPay.Api.PHP中提供的refund()方法来实现,此方法在WxPay.Api.php文件的第141行,代码如下:

 /** 
     *  
     * 申请退款,WxPayRefund中out_trade_no、transaction_id至少填一个且 
     * out_refund_no、total_fee、refund_fee、op_user_id为必填参数 
     * appid、mchid、spbill_create_ip、nonce_str不需要填入 
     * @param WxPayRefund $inputObj 
     * @param int $timeOut 
     * @throws WxPayException 
     * @return 成功时返回,其他抛异常 
     */  
    public static function refund($inputObj, $timeOut = 6){  
        $url = "https://api.mch.weixin.qq.com/secapi/pay/refund";  
        //检测必填参数  
        if(!$inputObj->IsOut_trade_noSet() && !$inputObj->IsTransaction_idSet()) {  
            throw new WxPayException("退款申请接口中,out_trade_no、transaction_id至少填一个!");  
        }else if(!$inputObj->IsOut_refund_noSet()){  
            throw new WxPayException("退款申请接口中,缺少必填参数out_refund_no!");  
        }else if(!$inputObj->IsTotal_feeSet()){  
            throw new WxPayException("退款申请接口中,缺少必填参数total_fee!");  
        }else if(!$inputObj->IsRefund_feeSet()){  
            throw new WxPayException("退款申请接口中,缺少必填参数refund_fee!");  
        }else if(!$inputObj->IsOp_user_idSet()){  
            throw new WxPayException("退款申请接口中,缺少必填参数op_user_id!");  
        }  
        $inputObj->SetAppid(WxPayConfig::APPID);//公众账号ID  
        $inputObj->SetMch_id(WxPayConfig::MCHID);//商户号  
        $inputObj->SetNonce_str(self::getNonceStr());//随机字符串  

        $inputObj->SetSign();//签名  
        $xml = $inputObj->ToXml();  
        $startTimeStamp = self::getMillisecond();//请求开始时间  
        $response = self::postXmlCurl($xml, $url, true, $timeOut);  
        $result = WxPayResults::Init($response);  
        self::reportCostTime($url, $startTimeStamp, $result);//上报请求花费时间  

        return $result;  
    }  

官方的方法,写的很清楚需要哪些参数,还有一些必须参数SDK已经帮我们补齐了,我将这个方法重新封装一下,便于在项目中调用:

/** 
     * 微信退款 
     * @param  string   $order_id   订单ID 
     * @return 成功时返回(array类型),其他抛异常 
     */  
    function wxRefund($order_id){  
        //我的SDK放在项目根目录下的Api目录下  
        require_once APP_ROOT."/Api/wxpay/lib/WxPay.Api.php";  
        //查询订单,根据订单里边的数据进行退款  
        $order = M('order')->where(array('id'=>$order_id,'is_refund'=>2,'order_status'=>1))->find();  
        $merchid = WxPayConfig::MCHID;  

        if(!$order) return false;  

        $input = new WxPayRefund();  
        $input->SetOut_trade_no($order['order_sn']);         //自己的订单号  
        $input->SetTransaction_id($order['transaction_id']);     //微信官方生成的订单流水号,在支付成功中有返回  
        $input->SetOut_refund_no(getrand_num(true));         //退款单号  
        $input->SetTotal_fee($order['total_price']);         //订单标价金额,单位为分  
        $input->SetRefund_fee($order['total_price']);            //退款总金额,订单总金额,单位为分,只能为整数  
        $input->SetOp_user_id($merchid);  

        $result = WxPayApi::refund($input); //退款操作  

        // 这句file_put_contents是用来查看服务器返回的退款结果 测试完可以删除了  
        //file_put_contents(APP_ROOT.'/Api/wxpay/logs/log3.txt',arrayToXml($result),FILE_APPEND);  
        return $result;  
    }  

这里需要吐槽一下,竟然不说返回值的类型,在支付的时候返回的是XML数据,这里竟然返回的是数组,让我措手不及,不过还是返回数组比较好,可以直接判断处理。

方法调用就更加简单了:

 //微信退款  
    $result = wxRefund($order_id);  
    // 这句file_put_contents是用来查看服务器返回的退款结果 测试完可以删除了  
    //file_put_contents(APP_ROOT.'/Api/wxpay/logs/log4.txt',arrayToXml($result),FILE_APPEND);  
    if(($result['return_code']=='SUCCESS') && ($result['result_code']=='SUCCESS')){  
        //退款成功  
    }else if(($result['return_code']=='FAIL') || ($result['result_code']=='FAIL')){  
        //退款失败  
        //原因  
        $reason = (empty($result['err_code_des'])?$result['return_msg']:$result['err_code_des']);  
    }else{  
        //失败  
    }  

退款成功返回如下:

v2-98d2987563e22bac76cc75b7dc23fb85_720w.jpg


attachments-2020-06-suzij9le5ef045d421288.jpg

  • 发表于 2020-06-22 13:47
  • 阅读 ( 361 )
  • 分类:PHP开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1316 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章