wxpay-func

2023-05-04  本文已影响0人  xueyueshuai
<?php
/**
 *产生随机字符串,不长于32位
 *@param int $length
 *@return (str)产生的随机字符串 
*/
function get_nonce_str($length = 32){
    $chars = "abcdefghijklmnopqrstuvwxyz0123456789";  
    $str ="";
    for ( $i = 0; $i < $length; $i++ ){  
        $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);  
    } 
    return $str;
}

/**
 *生成微信支付签名 本函数不覆盖sign成员变量
 *@param (arr)$arr 要签名的数组
 *@param (str)$key 商户秘钥
 *@return (str)签名 
*/
function make_sign($arr, $key){
    //签名步骤一:按字典序排序参数
    ksort($arr);
    $str = to_url_params($arr);
    //签名步骤二:在str后加入KEY
    $str = $str . "&key=".$key;
    //签名步骤三:MD5加密
    $str = md5($str);
    //签名步骤四:所有字符转为大写
    $result = strtoupper($str);
    return $result;
}

// 关联数组 格式化成 url传参格式的str 
function to_url_params($arr){
    $str = "";
    foreach ($arr as $k => $v){
        if($k != "sign" && $v != "" && !is_array($v)){
            $str .= $k . "=" . $v . "&";
        }
    }
    $str = trim($str, "&");
    return $str;
}

// array 转 xml
function array_to_xml($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; 
}

// xml 转 array  $xml 为XML格式的str
function xml_to_array($xml){
    libxml_disable_entity_loader(true);
    $arr= json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    return $arr;
}

// 以post方式提交xml到对应的接口url
function post_xml_curl($xml, $url, $second = 30){
    //初始化curl        
    $ch = curl_init();
    //设置超时
    curl_setopt($ch, CURLOPT_TIMEOUT, $second);
    //这里设置代理,如果有的话
    //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
    //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);
    //设置header
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    //要求结果为字符串且输出到屏幕上
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    //post提交方式
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
    //运行curl
    $data = curl_exec($ch);
    //curl_close($ch);
    //返回结果
    if($data){
        curl_close($ch);
        return $data;
    }else{ 
        $error = curl_errno($ch);
        echo "curl出错,错误码:$error"."<br>"; 
        echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>错误原因查询</a></br>";
        curl_close($ch);
        return false;
    }
}

// 接收 xml (本质为str 符合一定的格式)
function get_post_xml(){
    // $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
    $xml = file_get_contents('php://input');
    return $xml;
}

// 回复微信的支付通知
function reply_notify($bool){
    if($bool){
        $arr = [];
        $arr['return_code'] = 'SUCCESS';
        $arr['return_msg'] = 'OK';  
    }else{
        $arr = [];
        $arr['return_code'] = 'FAIL'; 
        $arr['return_msg'] = 'error';  
    }
    $xml = array_to_xml($arr);
    return $xml;
}

上一篇 下一篇

猜你喜欢

热点阅读