栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

PHP 微信小程序退款

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PHP 微信小程序退款

使用的一个类库
appid = $appid;        $this->mch_id = $mch_id;        $this->notify_url = $notify_url;        $this->key = $key;
    }    
    public function unifiedOrder( $params ){        $this->body = $params['body'];        $this->out_trade_no = $params['out_trade_no'];        $this->total_fee = $params['total_fee'];        $this->trade_type = $params['trade_type'];        $this->nonce_str = $this->genRandomString();        $this->spbill_create_ip = $_SERVER['REMOTE_ADDR'];        $this->params['appid'] = $this->appid;        $this->params['mch_id'] = $this->mch_id;        $this->params['nonce_str'] = $this->nonce_str;        $this->params['body'] = $this->body;        $this->params['out_trade_no'] = $this->out_trade_no;        $this->params['total_fee'] = $this->total_fee;        $this->params['spbill_create_ip'] = $this->spbill_create_ip;        $this->params['notify_url'] = $this->notify_url;        $this->params['trade_type'] = $this->trade_type;//获取签名数据
        $this->sign = $this->MakeSign( $this->params );        $this->params['sign'] = $this->sign;
        $xml = $this->data_to_xml($this->params);
        $response = $this->postXmlCurl($xml, self::API_URL_PREFIX.self::UNIFIEDORDER_URL);        if( !$response ){            return false;
        }
        $result = $this->xml_to_data( $response );        if( !empty($result['result_code']) && !empty($result['err_code']) ){
            $result['err_msg'] = $this->error_code( $result['err_code'] );
        }        return $result;
    }    
    public function unifiedOrder2( $params ){        $this->body = $params['body'];        $this->out_trade_no = $params['out_trade_no'];        $this->total_fee = $params['total_fee'];        $this->trade_type = $params['trade_type'];        $this->nonce_str = $this->genRandomString();        $this->spbill_create_ip = $_SERVER['REMOTE_ADDR'];        $this->params['appid'] = $this->appid;        $this->params['mch_id'] = $this->mch_id;        $this->params['nonce_str'] = $this->nonce_str;        $this->params['body'] = $this->body;        $this->params['out_trade_no'] = $this->out_trade_no;        $this->params['total_fee'] = $this->total_fee;        $this->params['spbill_create_ip'] = $this->spbill_create_ip;        $this->params['notify_url'] = $this->notify_url;        $this->params['trade_type'] = $this->trade_type;        $this->params['openid'] = $params['openid'];//获取签名数据
        $this->sign = $this->MakeSign( $this->params );        $this->params['sign'] = $this->sign;
        $xml = $this->data_to_xml($this->params);
        $response = $this->postXmlCurl($xml, self::API_URL_PREFIX.self::UNIFIEDORDER_URL);        if( !$response ){            return false;
        }
        $result = $this->xml_to_data( $response );        if( !empty($result['result_code']) && !empty($result['err_code']) ){
            $result['err_msg'] = $this->error_code( $result['err_code'] );
        }        return $result;
    }    
    public function orderQuery( $out_trade_no ){        $this->params['appid'] = $this->appid;        $this->params['mch_id'] = $this->mch_id;        $this->params['nonce_str'] = $this->genRandomString();        $this->params['out_trade_no'] = $out_trade_no;//获取签名数据
        $this->sign = $this->MakeSign( $this->params );        $this->params['sign'] = $this->sign;
        $xml = $this->data_to_xml($this->params);
        $response = $this->postXmlCurl($xml, self::API_URL_PREFIX.self::ORDERQUERY_URL);        if( !$response ){            return false;
        }
        $result = $this->xml_to_data( $response );        if( !empty($result['result_code']) && !empty($result['err_code']) ){
            $result['err_msg'] = $this->error_code( $result['err_code'] );
        }        return $result;
    }    
    public function closeOrder( $out_trade_no ){        $this->params['appid'] = $this->appid;        $this->params['mch_id'] = $this->mch_id;        $this->params['nonce_str'] = $this->genRandomString();        $this->params['out_trade_no'] = $out_trade_no;//获取签名数据
        $this->sign = $this->MakeSign( $this->params );        $this->params['sign'] = $this->sign;
        $xml = $this->data_to_xml($this->params);
        $response = $this->postXmlCurl($xml, self::API_URL_PREFIX.self::CLOSEORDER_URL);        if( !$response ){            return false;
        }
        $result = $this->xml_to_data( $response );        return $result;
    }    
    public function getNotifyData(){//获取通知的数据
        $xml = $GLOBALS['HTTP_RAW_POST_DATA'];        //$xml = file_get_contents('php://input');
        $data = array();        if( empty($xml) ){            return false;
        }
        $data = $this->xml_to_data( $xml );       if( !empty($data['return_code']) ){           if( $data['return_code'] == 'FAIL' ){                return false;
           }
       }        return $data;
    }    
    public function replyNotify(){      
        $data['return_code'] = 'SUCCESS';
        $data['return_msg'] = 'OK';
        $xml = $this->data_to_xml( $data );        echo $xml;        die();
    }    
    public function getAppPayParams( $prepayid ){
        $data['appid'] = $this->appid;
        $data['partnerid'] = $this->mch_id;
        $data['prepayid'] = $prepayid;
        $data['package'] = 'Sign=WXPay';
        $data['noncestr'] = $this->genRandomString();
        $data['timestamp'] = time();
        $data['sign'] = $this->MakeSign( $data );        return $data;
    }    
    public function MakeSign( $params ){//签名步骤一:按字典序排序数组参数
        ksort($params);
        $string = $this->ToUrlParams($params);//签名步骤二:在string后加入KEY
        $string = $string . "&key=".$this->key;//签名步骤三:MD5加密
        $string = md5($string);//签名步骤四:所有字符转为大写
        $result = strtoupper($string);        return $result;
    }    
    public function ToUrlParams( $params ){
        $string = '';        if( !empty($params) ){
            $array = array();            foreach( $params as $key => $value ){
                $array[] = $key.'='.$value;
            }
            $string = implode("&",$array);
        }        return $string;
    }    
    public function data_to_xml( $params ){        if(!is_array($params)|| count($params) <= 0)
        {            return false;
        }
        $xml = "";        foreach ($params as $key=>$val)
        {            if (is_numeric($val)){
                $xml.="<".$key.">".$val."";
            }else{
                $xml.="<".$key.">";
            }
        }
        $xml.="";        return $xml;
    }    
    public function xml_to_data($xml){        if(!$xml){            return false;
        }//将XML转为array//禁止引用外部xml实体
        libxml_disable_entity_loader(true);
        $data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);        return $data;
    }    
    private static function getMillisecond(){//获取毫秒的时间戳
        $time = explode ( " ", microtime () );
        $time = $time[1] . ($time[0] * 1000);
        $time2 = explode( ".", $time );
        $time = $time2[0];        return $time;
    }    
    private function genRandomString($len = 32) {
        $chars = array(            "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",            "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",            "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",            "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",            "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",            "3", "4", "5", "6", "7", "8", "9"
        );
        $charsLen = count($chars) - 1;// 将数组打乱
        shuffle($chars);
        $output = "";        for ($i = 0; $i < $len; $i++) {
            $output .= $chars[mt_rand(0, $charsLen)];
        }        return $output;
    }    
    private function postXmlCurl($xml, $url, $useCert = false, $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,2);//设置header
        curl_setopt($ch, CURLOPT_HEADER, FALSE);//要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);        if($useCert == true){//设置证书//使用证书:cert 与 key 分别属于两个.pem文件
            curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');//curl_setopt($ch,CURLOPT_SSLCERT, WxPayConfig::SSLCERT_PATH);
            curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');//curl_setopt($ch,CURLOPT_SSLKEY, WxPayConfig::SSLKEY_PATH);
        }//post提交方式
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);//运行curl
        $data = curl_exec($ch);//返回结果
        if($data){
            curl_close($ch);            return $data;
        } else {
            $error = curl_errno($ch);
            curl_close($ch);            return false;
        }
    }    
    public function error_code( $code ){
        $errList = array(            'NOAUTH' => '商户未开通此接口权限',            'NOTENOUGH' => '用户帐号余额不足',            'ORDERNOTEXIST' => '订单号不存在',            'ORDERPAID' => '商户订单已支付,无需重复操作',            'ORDERCLOSED' => '当前订单已关闭,无法支付',            'SYSTEMERROR' => '系统错误!系统超时',            'APPID_NOT_EXIST' => '参数中缺少APPID',            'MCHID_NOT_EXIST' => '参数中缺少MCHID',            'APPID_MCHID_NOT_MATCH' => 'appid和mch_id不匹配',            'LACK_PARAMS' => '缺少必要的请求参数',            'OUT_TRADE_NO_USED' => '同一笔交易不能多次提交',            'SIGNERROR' => '参数签名结果不正确',            'XML_FORMAT_ERROR' => 'XML格式错误',            'REQUIRE_POST_METHOD' => '未使用post传递参数 ',            'POST_DATA_EMPTY' => 'post数据不能为空',            'NOT_UTF8' => '未使用指定编码格式',
        );        if( array_key_exists( $code , $errList ) ){            return $errList[$code];
        }
    }
}
退款方法
$wechatAppPay = new wechatAppPay($PAYAPPID, $PAYMCHID, $NOTIFY_URL, $PAYKEY);        //小程序的appid
        $param['appid'] = $PAYAPPID;        //商户号
        $param['mch_id'] = $PAYMCHID;        //随机字符串
        $nonce_str = $this->random(15);//随机数生成
        $param['nonce_str'] = $nonce_str;        //商户订单号
        $param['out_trade_no'] = $out_trade_no;        //商户退款单号
        $out_refund_no = $this->random(15);//生成随机数
        $param['out_refund_no'] = $out_refund_no;            //订单金额
            $param['total_fee'] = 1 * 100;            //退款金额
            $param['refund_fee'] =1* 100;            //退款原因
            $param['refund_desc'] = '拼团失败';

            $stringSignTemp = $wechatAppPay->MakeSign($param);
            $param['sign'] = $stringSignTemp;
            $xml_data = $wechatAppPay->data_to_xml($param);

       $data = $this->curl_post_ssl('https://api.mch.weixin.qq.com/secapi/pay/refund', $xml_data, '../../' . $cert_pem, '../../' . $key_pem);//            '../../wxcertificate/apiclient_cert.pem','../../wxcertificate/apiclient_key.pem'
            $res = $wechatAppPay->xml_to_data($data);

退款成功状态:

if ($res['result_code'] == 'SUCCESS') {//退款成功}

引用的方法

//file_cert_pem,file_key_pem两个退款必须的文件
 function curl_post_ssl($url, $vars,$file_cert_pem,$file_key_pem, $second = 30, $aHeader = array())
    {
        $ch = curl_init();        //超时时间
        curl_setopt($ch, CURLOPT_TIMEOUT, $second);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        //这里设置代理,如果有的话
        //curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');
        //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);        //以下两种方式需选择一种

        //第一种方法,cert 与 key 分别属于两个.pem文件
        //默认格式为PEM,可以注释
        curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');//        curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/cert.pem');
        curl_setopt($ch,CURLOPT_SSLCERT,$file_cert_pem);        //默认格式为PEM,可以注释
        curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');//        curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/private.pem');
        curl_setopt($ch,CURLOPT_SSLKEY,$file_key_pem);        //第二种方式,两个文件合成一个.pem文件//        curl_setopt($ch, CURLOPT_SSLCERT, getcwd() . '/all.pem');

        if (count($aHeader) >= 1) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
        }


        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
        $data = curl_exec($ch);        if ($data) {
            curl_close($ch);            return $data;
        } else {
            $error = curl_errno($ch);//            echo "call faild, errorCode:$errorn";
            curl_close($ch);            return false;
        }
    }



作者:程大哥T_T
链接:https://www.jianshu.com/p/149d4e9b74e1


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/227268.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号