美文网首页
微信实现退款请求

微信实现退款请求

作者: 表弟_212 | 来源:发表于2019-02-12 10:25 被阅读0次

    直接上代码了,要带入的微信商家的证书

    <?php
    include './Base.php';
    /* 
     * @QQ 1152569785
     */
    
    class Refund extends Base
    {   
        const REFUND = 'https://api.mch.weixin.qq.com/secapi/pay/refund';
        private $params;
        public function __construct($data) {
            parent::__construct();
            //组装数据
            $this->params = [
                'appid'   =>  self::APPID, //APPID
                'mch_id'  =>  self::MCHID, //商户号
                'nonce_str'=> md5(time()), //随机串
                'sign'  => 'md5',          //签名方式
                'transaction_id'=> $data['transaction_id'],//微信支付订单号 与商户订单号二选一
                //'out_trade_no'=> '', //商户订单号 和微信支付订单号二选一
                'out_refund_no' => $data['out_refund_no'],//退单号
                'total_fee'     => $data['total_fee'],    //订单金额
                'refund_fee'    => $data['refund_fee']    //退款金额
            ];
        }
        //发送退款请求
        public function orderRefund(){
            //生成签名
           $signParams = $this->setSign($this->params);
            //将数据转换为xml
            $xmlData = $this->ArrToXml($signParams);
            //发送请求
           return  $this->postStr(self::REFUND, $xmlData);
        }
        
        //post 字符串到接口
        public function postStr($url,$postfields){
            $ch = curl_init();
            $params[CURLOPT_URL] = $url;    //请求url地址
            $params[CURLOPT_HEADER] = false; //是否返回响应头信息
            $params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回
            $params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向
            $params[CURLOPT_POST] = true;
            $params[CURLOPT_SSL_VERIFYPEER] = false;//禁用证书校验
        $params[CURLOPT_SSL_VERIFYHOST] = false;
            //以下是证书相关代码
        $params[CURLOPT_SSLCERTTYPE] = 'PEM';
        $params[CURLOPT_SSLCERT] = './cert/apiclient_cert.pem';
        $params[CURLOPT_SSLKEYTYPE] = 'PEM';
        $params[CURLOPT_SSLKEY] = './cert/apiclient_key.pem';
            
            $params[CURLOPT_POSTFIELDS] = $postfields;
            curl_setopt_array($ch, $params); //传入curl参数
            $content = curl_exec($ch); //执行
            curl_close($ch); //关闭连接
            return $content;
        }
    }
    
    $data = [
        'transaction_id'    => '4200000069201801250597519804', //微信交易号
        'out_refund_no'    => '1003', //退款单号
        'total_fee'    => '2', //原订单金额
        'refund_fee'    => '1' //退款金额
    ];
    $obj = new Refund($data);
    
    $res = $obj->orderRefund();
    
    print_r($obj->XmlToArr($res));
    
    

    Base.php类

    <?php
    
    /* 
     * 黎明互联
     * https://www.liminghulian.com/
     */
    
    class Base
    {
        const KEY = ''; //支付秘钥需要更改成自己的
        const APPID = ''; //APPID需要更改为自己的
        const MCHID = ''; //商户号需要更改成自己的
        const SECRET = ''; //开发者密码需要更改为自己的
        const UOURL = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; //无需更改 统一下单API地址
        const NOTIFY = '';   //支付通知地址需要更改成你自己服务器的地址
    
        public function __construct() {
           
        }
        //获取签名
        public function getSign($arr){ 
            //去除数组的空值
            array_filter($arr);
            if(isset($arr['sign'])){
                unset($arr['sign']);
            }
            //排序
            ksort($arr);
            //组装字符
            $str = $this->arrToUrl($arr) . '&key=' . self::KEY;
            //使用md5 加密 转换成大写 
           return strtoupper(md5($str));
        }
        //获取带签名的数组
        public function setSign($arr){
            $arr['sign'] = $this->getSign($arr);
            return $arr;
        }
        //校验签名
        public function checkSign($arr){        
            //生成新签名
            $sign = $this->getSign($arr);
            //和数组中原始签名比较
            if($sign == $arr['sign']){
                return true;
            }else{
                return false;
            }
        }
        //数组转URL字符串 不带key
        public function arrToUrl($arr){
            return urldecode(http_build_query($arr));
        }
        //记录到文件
        public  function logs($file,$data){
            $data = is_array($data) ? print_r($data,true) : $data;
            file_put_contents('./logs/' .$file, $data);
        }
        public function getPost(){
            return file_get_contents('php://input');
        }
        //Xml 文件转数组
        public function XmlToArr($xml)
        {   
            if($xml == '') return '';
            libxml_disable_entity_loader(true);
            $arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);     
            return $arr;
        }
        //数组转XML
        public function ArrToXml($arr)
        {
            if(!is_array($arr) || count($arr) == 0) return '';
    
            $xml = "<xml>";
            foreach ($arr as $key=>$val)
            {
                    if (is_numeric($val)){
                            $xml.="<".$key.">".$val."</".$key.">";
                    }else{
                            $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
                    }
            }
            $xml.="</xml>";
            return $xml; 
        }
        //post 字符串到接口
        public function postStr($url,$postfields){
            $ch = curl_init();
            $params[CURLOPT_URL] = $url;    //请求url地址
            $params[CURLOPT_HEADER] = false; //是否返回响应头信息
            $params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回
            $params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向
            $params[CURLOPT_POST] = true;
            $params[CURLOPT_SSL_VERIFYPEER] = false;//禁用证书校验
        $params[CURLOPT_SSL_VERIFYHOST] = false;
            $params[CURLOPT_POSTFIELDS] = $postfields;
            curl_setopt_array($ch, $params); //传入curl参数
            $content = curl_exec($ch); //执行
            curl_close($ch); //关闭连接
            return $content;
        }
      
    }
    
    

    相关文章

      网友评论

          本文标题:微信实现退款请求

          本文链接:https://www.haomeiwen.com/subject/noyheqtx.html