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

微信实现退款请求

作者: 表弟_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