1. 程式人生 > >PHP常用功能元件方法---程式碼塊

PHP常用功能元件方法---程式碼塊

工作中常用的幾個功能封裝,收集整理,留用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 new 
Exception("陣列資料異常!"); } $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  需要postxml資料
* @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);//嚴格校驗 02,預設嚴格校驗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;
}