1 <?php 2 /** 3 * 威富通支付接口 4 */
5 class SwiftpassClient { 6
7 function __construct() { 8 //todo
9 } 10
11 // 獲取請求支付的頁面url
12 public function getUrl($url, $postData) 13 { 14 ksort($postData); 15 $postData = $this->urlencode_array($postData); 16 $postData['sign'] = md5(implode('', $postData) . md5('!!wxpay!!')); 17 return $url . '?' . http_build_query($postData); 18 } 19
20 // 獲取簽名信息
21 public function getSign($postData, $key) 22 { 23 $returnStr = ''; 24 if ($postData) { 25 if (isset($postData['sign'])) unset($postData['sign']); 26 ksort($postData); 27 $signStr = ''; 28 foreach ($postData as $_k => $_v) { 29 $signStr .= "{$_k}={$_v}&"; 30 } 31 $signStr .= 'key=' . $key; 32 $returnStr = strtoupper(md5($signStr)); 33 } 34
35 return $returnStr; 36 } 37
38 // 生成隨機碼 默認16位
39 public function getRandKey($digit=16) 40 { 41 $returnStr = ''; 42 // A-Za-z0-9 共62個
43 $baseKey = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; 44 $randKeyArr = str_split($baseKey); 45 $maxLen = count($randKeyArr); 46
47 for ($i=0; $i<$digit; $i++) { 48 // 每10次, 打亂一次
49 if (($i % 10) == 0) shuffle($randKeyArr); 50 $k = $i % $maxLen; 51 $returnStr .= $randKeyArr{$k}; 52 } 53
54 return $returnStr; 55 } 56
57 // 解析PostData xml格式
58 public function xmlToArray($xmlStr) 59 { 60 return json_decode(json_encode(simplexml_load_string($xmlStr, 'SimpleXMLElement', LIBXML_NOCDATA)), true); 61 } 62
63 /** 64 * 將xml轉換成數組 65 * @param $xmlData 66 * @return array 67 */
68 public function xmlToArray2($xml) { 69 $xml = simplexml_load_string($xml); 70 //獲取xml編碼
71 $ret = preg_match ("/<?xml[^>]* encoding=\"(.*)\"[^>]* ?>/i", $xml, $arr); 72 if($ret) { 73 $encode = strtoupper ( $arr[1] ); 74 } else { 75 $encode = ""; 76 } 77 if($xml && $xml->children()) { 78 foreach ($xml->children() as $node){ 79 //有子節點
80 if($node->children()) { 81 $k = $node->getName(); 82 $nodeXml = $node->asXML(); 83 $v = substr($nodeXml, strlen($k)+2, strlen($nodeXml)-2*strlen($k)-5); 84
85 } else { 86 $k = $node->getName(); 87 $v = (string)$node; 88 } 89
90 if($encode!="" && $encode != "UTF-8") { 91 $k = iconv("UTF-8", $encode, $k); 92 $v = iconv("UTF-8", $encode, $v); 93 } 94
95 $parameters[$k] = $v; 96 } 97 } 98 return $parameters; 99 } 100
101 // 數組轉xml
102 public function arrayToXml($array) 103 { 104 $returnStr = "<xml>"; 105 foreach ($array as $key => $val) { 106 if (is_numeric($val)) { 107 $returnStr .= "<".$key.">".$val."</".$key.">"; 108 } else { 109 $returnStr .= "<".$key."><![CDATA[".$val."]]></".$key.">"; 110 } 111 } 112 $returnStr .= "</xml>"; 113 return $returnStr; 114 } 115
116
117 // 數組值urlencode編碼
118 public function urlencode_array($array) 119 { 120 if (is_array($array)) { 121 foreach ($array as $_key => $_val) { 122 $array[$_key] = $this->urlencode_array($_val); 123 } 124 } else { 125 $array = rawurlencode($array); 126 } 127
128 return $array; 129 } 130
131 // 數組值urldecode解碼
132 public function urldecode_array($array) 133 { 134 if (is_array($array)) { 135 foreach ($array as $_key => $_val) { 136 $array[$_key] = $this->urldecode_array($_val); 137 } 138 } else { 139 $array = rawurldecode($array); 140 } 141
142 return $array; 143 } 144
145 // post xml數據
146 public function postXml($url, $array) 147 { 148 // curl初始化設置
149 $ch = curl_init(); 150 curl_setopt($ch, CURLOPT_TIMEOUT, 14); // 設置超時
151 curl_setopt($ch, CURLOPT_URL, $url); 152 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 153 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 154 curl_setopt($ch, CURLOPT_HEADER, false); 155 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 156 curl_setopt($ch, CURLOPT_POST, true); 157 curl_setopt($ch, CURLOPT_POSTFIELDS, $array); 158
159 // 運行curl
160 $response = curl_exec($ch); 161 curl_close($ch); 162
163 return $response; 164 } 165
166 public function postXmlSSL($url, $array) 167 { 168 // curl初始化設置
169 $ch = curl_init(); 170 curl_setopt($ch, CURLOPT_TIMEOUT, 14); // 設置超時
171 curl_setopt($ch, CURLOPT_URL, $url); 172 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 173 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 174 curl_setopt($ch, CURLOPT_HEADER, false); 175 curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM'); 176 curl_setopt($ch, CURLOPT_SSLCERT, '證書路徑'); 177 curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM'); 178 curl_setopt($ch, CURLOPT_SSLKEY, '密鑰路徑'); 179 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 180 curl_setopt($ch, CURLOPT_POST, true); 181 curl_setopt($ch, CURLOPT_POSTFIELDS, $array); 182
183 // 運行curl
184 $response = curl_exec($ch); 185 curl_close($ch); 186
187 return $response; 188 } 189
190 } 191 ?>