关于微信支付退款

废话不多少 直接上代码 退款是需要证书验证的 根据你自己的证书存放的位置自己修改

 // 订单退款
    public function refund($order){

        // 需要传递的参数
        $post = array(

            'appid'=>Config::get('AppId'),

            'mch_id'=>Config::get('MchId'),

            'nonce_str'=>md5($order['transaction_id']),

            'transaction_id'=>$order['transaction_id'],

            'out_refund_no'=>$order['out_refund_no'],

            'out_trade_no'=>$order['order_sn'],

            'total_fee'=>$order['order_amount']*100,

            'refund_fee'=>$order['order_amount']*100,
        );

        // 排序
        ksort( $post);

        // 获取签名
        $post['sign'] = $this->get_sign($post);

        // 生成XML
        $post_data = $this->arrayToXml($post);

        // 请求路径
        $url = "https://api.mch.weixin.qq.com/secapi/pay/refund";

        // curl 请求接口
        $dataxml =$this->post($url, $post_data);

        $objectxml = (array)simplexml_load_string($dataxml, 'SimpleXMLElement', LIBXML_NOCDATA); //将微信返回的XML 转换成数组

        return  $objectxml;

    }


    // 生成签名
    private function get_sign($arrdata){

        // 数组序列化
        $strdata = $this->myKsort($arrdata);

        //  串上KEY
        $strSignTmp = $strdata."&key=".Config::get('key');

        // md5加密
        $sign = MD5($strSignTmp);

        // 数据小写
        $sign = strtoupper($sign);

        return $sign;
    }


    // 请求数据序列化
    private function myKsort($data){
        // 数组按照ASK排序
        // 去空
        $data=array_filter($data);

        //签名步骤一:按字典序排序参数
        ksort($data);

        $strdata=http_build_query($data);

        $strdata=urldecode($strdata);

        // 打回数据
        return $strdata;
    }

    // 数组转XML
    private function arrayToXml($arr)
    {
        $xml = "<xml>";
        foreach ($arr as $key=>$val)
        {

            $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
            // if (is_numeric($val)){
            //     $xml.="<".$key.">".$val."</".$key.">";
            // }else{
            //      $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
            // }
        }
        $xml.="</xml>";
        return $xml;
    }
  private function post( $url,$strXml) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 只信任CA颁布的证书
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 检查证书中是否设置域名,并且是否与提供的主机名匹配
        curl_setopt($ch, CURLOPT_SSLCERT,$_SERVER['DOCUMENT_ROOT'].'/weixin/apiclient_cert.pem');
        curl_setopt($ch, CURLOPT_SSLKEY,$_SERVER['DOCUMENT_ROOT'].'/weixin/apiclient_key.pem');
        //curl_setopt($ch, CURLOPT_CAINFO, $_SERVER['DOCUMENT_ROOT'].'/public/weixin/rootca.pem'); // CA根证书(用来验证的网站证书是否是CA颁布)
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $strXml);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        $res = curl_exec($ch);
        $err_code = curl_errno($ch);
        curl_close($ch);
        return $res;
    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值