php微信退款

<?php

namespace wxpay;

/**
 * 微信退款
 * @author        zzy
 * @version     $V1.0.0$
 * @date        2018-11-9
 */
class WXRefund
{
    private $SSLCERT_PATH;//证书
    private $SSLKEY_PATH;//证书
    private $opUserId;//商户号
    private $key;//API密钥
    private $appId;//appId
    private $totalFee;
    private $refundFee;
    private $outTradeNo;
    private $outRefundNo;

    function __construct($outTradeNo = '', $totalFee = '', $outRefundNo = '', $refundFee = '')
    {
        //初始化退款类需要的变量
        $this->totalFee = $totalFee;//订单金额
        $this->refundFee = $refundFee;//退款金额
        $this->outTradeNo = $outTradeNo;//订单号
        $this->outRefundNo = $outRefundNo;//退款订单
        $this->opUserId = config('wxpay.mch_id');
        $this->key = config('wxpay.key');
        $this->appId = config('wxpay.app_id');
        $this->SSLCERT_PATH = dirname(__FILE__) . '/cert/apiclient_cert.pem';
        $this->SSLKEY_PATH = dirname(__FILE__) . '/cert/apiclient_key.pem';
    }

    /**
     * 通过微信api进行退款流程 唯一对外接口
     * @return string
     */
    public function refundApi()
    {
        $parma = array(
            'appid' => $this->appId,
            'mch_id' => $this->opUserId,
            'nonce_str' => $this->randoms(32),
            'out_refund_no' => $this->outRefundNo,
            'out_trade_no' => $this->outTradeNo,
            'total_fee' => intval($this->totalFee * 100),
            'refund_fee' => intval($this->refundFee * 100),
        );
        $parma['sign'] = $this->getSign($parma, $this->key);
        $xmldata = $this->arrayToXml($parma);
        $xmlresult = $this->postXmlSSLCurl($xmldata, 'https://api.mch.weixin.qq.com/secapi/pay/refund');
        halt($xmlresult);
        $result = $this->arrayToXml($xmlresult);
        return $result;
    }

    /**
     * 数组转xml
     * @param $arr
     * @return string
     */
    protected function arrayToXml($arr = '')
    {
        $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;
    }

    /**
     * 签名加密
     * @param $params
     * @param $key
     */
    protected function getSign($params, $key)
    {
        ksort($params, SORT_STRING);
        $unSignParaString = $this->formatQueryParaMap($params, false);
        return $signStr = strtoupper(md5($unSignParaString . "&key=" . $key));
    }

    /**
     * 排序
     * @param $paraMap
     * @param bool $urlEncode
     * @return bool|string
     */
    protected function formatQueryParaMap($paraMap, $urlEncode = false)
    {
        $buff = "";
        ksort($paraMap);
        foreach ($paraMap as $k => $v) {
            if (null != $v && "null" != $v) {
                if ($urlEncode) {
                    $v = urlencode($v);
                }
                $buff .= $k . "=" . $v . "&";
            }
        }
        $reqPar = '';
        if (strlen($buff) > 0) {
            $reqPar = substr($buff, 0, strlen($buff) - 1);
        }
        return $reqPar;
    }

    /**
     * 需要使用证书的请求
     * @param $xml
     * @param $url
     * @param int $second
     * @return bool|mixed
     */
    protected function postXmlSSLCurl($xml, $url, $second = 30)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_TIMEOUT, $second);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');
        curl_setopt($ch, CURLOPT_SSLCERT, $this->SSLCERT_PATH);
        curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');
        curl_setopt($ch, CURLOPT_SSLKEY, $this->SSLKEY_PATH);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
        $data = curl_exec($ch);

        if ($data) {
            curl_close($ch);
            return $data;
        } else {
            $error = curl_errno($ch);
            echo "curl出错,错误码:$error" . "<br>";
            curl_close($ch);
            return false;
        }
    }

    protected function randoms($length = 32)
    {
        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }
}
去调用上面的退款
$refundObj = new WXRefund($order['order_number'], $order['money'], $order['order_number'], $order['money']);
$result = $refundObj->refundApi();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值