/**
*产生随机字符串,不长于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 = "
"; foreach ($arr as $key => $val) {
if (is_numeric($val)){
$xml.="<".$key.">".$val."".$key.">";
}else{
$xml.="<".$key.">".$key.">";
}
}
$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"."
";echo "错误原因查询";
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;
}