PHP常用功能元件方法---程式碼塊
阿新 • • 發佈:2019-02-18
工作中常用的幾個功能封裝,收集整理,留用2018年6月23日15:43:03
xml 轉 array陣列
/** * 將xml轉為array * @param string $xml * @throws WxPayException */ public function FromXml($xml) { if(!$xml){ throw new Exception("xml資料異常!"); } //將XML轉為array //禁止引用外部xml實體 libxml_disable_entity_loader(true); $this->values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $this->values; }
物件中陣列 轉 xml
/** * 輸出xml字元 * @throws WxPayException **/ public function ToXml() { if(!is_array($this->values) || count($this->values) <= 0) { throw newException("陣列資料異常!"); } $xml = "<xml>"; foreach ($this->values as $key=>$val) { if (is_numeric($val)){ $xml.="<".$key.">".$val."</".$key.">"; }else{ $xml.="<".$key."><![CDATA[".$val."]]></".$key.">"; } } $xml.="</xml>"; return $xml; }
格式化URL引數
/** * 格式化引數格式化成url引數 */ public function ToUrlParams() { $buff = ""; foreach ($this->values as $k => $v) { if($k != "sign" && $v != "" && !is_array($v)){ $buff .= $k . "=" . $v . "&"; } } $buff = trim($buff, "&"); return $buff; }
生成32位隨機數
/** * * 產生隨機字串,不長於32位 * @param int $length * @return 產生的隨機字串 */ public static function getNonceStr($length = 32) { $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; $str =""; for ( $i = 0; $i < $length; $i++ ) { $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1); } return $str; }
curl方法post請求xml提交
/** * 以post方式提交xml到對應的介面url * * @param string $xml 需要post的xml資料 * @param string $url url * @param bool $useCert 是否需要證書,預設不需要 * @param int $second url執行超時時間,預設30s * @throws WxPayException */ private static function postXmlCurl($xml, $url, $useCert = false, $second = 30) { $ch = curl_init(); //設定超時 curl_setopt($ch, CURLOPT_TIMEOUT, $second); //如果有配置代理這裡就設定代理 if(WxPayConfig::CURL_PROXY_HOST != "0.0.0.0" && WxPayConfig::CURL_PROXY_PORT != 0){ curl_setopt($ch,CURLOPT_PROXY, WxPayConfig::CURL_PROXY_HOST); curl_setopt($ch,CURLOPT_PROXYPORT, WxPayConfig::CURL_PROXY_PORT); } curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE); //除錯完務必改回true curl_setopt($ch,CURLOPT_SSL_VERIFYHOST, 2);//嚴格校驗 0和2,預設嚴格校驗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); throw new WxPayException("curl出錯,錯誤碼:$error"); } }
獲取毫秒時間戳
/** * 獲取毫秒級別的時間戳 */ private static function getMillisecond() { //獲取毫秒的時間戳 $time = explode ( " ", microtime () ); $time = $time[1] . ($time[0] * 1000); $time2 = explode( ".", $time ); $time = $time2[0]; return $time; }