美文网首页
微信签名算法实现 (微信退款为例)

微信签名算法实现 (微信退款为例)

作者: vins | 来源:发表于2019-12-17 10:50 被阅读0次
    class wxService {
    
        public static function postXmlCurl($xml, $url,$useCert=false,$f1="",$f2="", $second = 60){
            $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); //严格校验
            //设置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, $f1);
                curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
                curl_setopt($ch,CURLOPT_SSLKEY, $f2);
            }
            //post提交方式
            curl_setopt($ch, CURLOPT_POST, TRUE);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
            curl_setopt($ch, CURLOPT_TIMEOUT, 40);
            set_time_limit(0);
    
            //运行curl
            $data = curl_exec($ch);
            // echo json_encode($data);
            // exit;
            //返回结果
            if ($data) {
                curl_close($ch);
                return $data;
            } else {
                $error = curl_errno($ch);
                curl_close($ch);
                exit("curl出错,错误码:$error");
            }
        }
        
        //数组转换成xml
        public function arrayToXml($arr) {
            $xml = "<root>";
            foreach ($arr as $key => $val) {
                if (is_array($val)) {
                    $xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">";
                } else {
                    $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
                }
            }
            $xml .= "</root>";
            return $xml;
        }
    
        //xml转换成数组
        public function xmlToArray($xml) {
            //禁止引用外部xml实体 
            libxml_disable_entity_loader(true);
            $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
            $val = json_decode(json_encode($xmlstring), true);
            return $val;
        }
    
        //作用:产生随机字符串,不长于32位
        public function createNoncestr($length = 32) {
            $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
            $str = "";
            for ($i = 0; $i < $length; $i++) {
                $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
            }
            return $str;
        }
    
        //作用:生成签名
        public function getSign($Obj,$key) {
            foreach ($Obj as $k => $v) {
                $Parameters[$k] = $v;
            }
            //签名步骤一:按字典序排序参数
            ksort($Parameters);
            $String = $this->formatBizQueryParaMap($Parameters, false);
            //签名步骤二:在string后加入KEY
            $String = $String . "&key=" . $key;
            //签名步骤三:MD5加密
            $String = md5($String);
            //签名步骤四:所有字符转为大写
            $result_ = strtoupper($String);
            return $result_;
        }
    
        ///作用:格式化参数,签名过程需要使用
        public function formatBizQueryParaMap($paraMap, $urlencode) {
            $buff = "";
            ksort($paraMap);
            foreach ($paraMap as $k => $v) {
                if ($urlencode) {
                    $v = urlencode($v);
                }
                $buff .= $k . "=" . $v . "&";
            }
            $reqPar = '';
            if (strlen($buff) > 0) {
                $reqPar = substr($buff, 0, strlen($buff) - 1);
            }
            return $reqPar;
        }
    
    }
    

    相关文章

      网友评论

          本文标题:微信签名算法实现 (微信退款为例)

          本文链接:https://www.haomeiwen.com/subject/pbcsnctx.html