選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
 

451 行
13 KiB

  1. <?php
  2. /**
  3. * 接口调用
  4. * ============================================================================
  5. * * 版权所有 蜘蛛行 * *
  6. * 网站地址: http://www.zhizhuchuxing.com
  7. * ----------------------------------------------------------------------------
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和
  9. * 使用;不允许对程序代码以任何形式任何目的的再发布。
  10. * ============================================================================
  11. * Author By: 倪宗锋
  12. * PhpStorm CurlInterface.php
  13. * Create By 2016/11/10 13:20 $
  14. */
  15. namespace common\util;
  16. class CurlInterface
  17. {
  18. protected $url = null;
  19. protected $verb = 'GET';
  20. protected $body = '';
  21. protected $requestLength = 0;
  22. protected $baseUrl = null;
  23. protected $timeOut = 200;
  24. protected $clientId = 1;//站点类型 1 微信
  25. protected $responseBody = null;//接收到的返回值
  26. protected $notReturn = false; //是否有返回值
  27. protected $siteConfig = null; //配置参数
  28. protected $curlGetInfo = null;//交易概要
  29. private $logMessage = ''; //日志内容
  30. private $curlOptHeader = 0; //是否返回头部信息
  31. private $bodyType = 1;
  32. private $cert = false;//是否使用证书
  33. private $certPem;
  34. private $keyPem;
  35. /****************============类的初始化=============*******************/
  36. /**
  37. * @param null $body 2:xml
  38. * @param int $type 1:json 2:xml 3 发送原数据接收xml 4 发送原数据 接收json 5:都是原数据
  39. */
  40. public function __construct($body = null, $type = 1)
  41. {
  42. $this->setBody($body, $type);
  43. $this->setBaseUrl();
  44. }
  45. /*****************==========参数设置函数开始=========******************/
  46. /**
  47. * Function Description:设置是否返回头部信息
  48. * Function Name: setCurlOptHeader
  49. * @param $curlOptHeader
  50. *
  51. *
  52. * @author 倪宗锋
  53. */
  54. public function setCurlOptHeader($curlOptHeader)
  55. {
  56. $this->curlOptHeader = $curlOptHeader;
  57. }
  58. /**
  59. * Function Description:获取交易概要
  60. * Function Name: getCurlGetInfo
  61. *
  62. * @return null
  63. *
  64. * @author 倪宗锋
  65. */
  66. public function getCurlGetInfo()
  67. {
  68. return $this->curlGetInfo;
  69. }
  70. /**
  71. * Function Description:获取返回值报文
  72. * Function Name: getResponseBody
  73. *
  74. * @return null
  75. *
  76. * @author 倪宗锋
  77. */
  78. public function getResponseBody()
  79. {
  80. return $this->responseBody;
  81. }
  82. /**
  83. * Function Description:获取全路径地址
  84. * Function Name: getUrl
  85. *
  86. * @return null
  87. *
  88. * @author 倪宗锋
  89. */
  90. public function getUrl()
  91. {
  92. return $this->url;
  93. }
  94. /**
  95. * Function Description:设置路径 在baseUrl基础上
  96. * Function Name: setUrl
  97. * @param $url
  98. *
  99. *
  100. * @author 倪宗锋
  101. */
  102. public function setUrl($url)
  103. {
  104. $this->url = $this->baseUrl . $url;
  105. }
  106. /**
  107. * Function Description:设置过期时间
  108. * Function Name: setTimeOut
  109. * @param $timeOut
  110. *
  111. *
  112. * @author 倪宗锋
  113. */
  114. public function setTimeOut($timeOut)
  115. {
  116. $this->timeOut = $timeOut;
  117. }
  118. /**
  119. * Function Description:设置传值方式
  120. * Function Name: setVerb
  121. * @param $verb
  122. *
  123. *
  124. * @author 倪宗锋
  125. */
  126. public function setVerb($verb)
  127. {
  128. $this->verb = $verb;
  129. }
  130. /**
  131. * Function Description:设置baseUrl
  132. * Function Name: setBaseUrl
  133. * @param $baseUrl string
  134. *
  135. * @author 倪宗锋
  136. */
  137. public function setBaseUrl($baseUrl = '')
  138. {
  139. $this->baseUrl = $baseUrl;
  140. }
  141. /**
  142. * Function Description:获取BaseUrl
  143. * Function Name: getBaseUrl
  144. *
  145. * @return null
  146. *
  147. * @author 倪宗锋
  148. */
  149. public function getBaseUrl()
  150. {
  151. return $this->baseUrl;
  152. }
  153. /**
  154. * Function Description:设置是否有返回值
  155. * Function Name: setNotReturn
  156. * @param $str
  157. *
  158. *
  159. * @author 倪宗锋
  160. */
  161. public function setNotReturn($str)
  162. {
  163. $this->notReturn = $str;
  164. }
  165. /**
  166. * Function Description:设置请求报文 $body 必须是个数组
  167. * Function Name: setBody
  168. * @param $body
  169. * @param $type int 1:json 2:xml 3 发送原数据接收xml 4 发送原数据 接收json 5:都是原数据
  170. *
  171. * @author 倪宗锋
  172. */
  173. public function setBody($body, $type = 1)
  174. {
  175. $this->body = '';
  176. if (is_array($body)) {
  177. if ($type == 1) {
  178. $this->body = json_encode($body);
  179. $this->requestLength = strlen($this->body);
  180. } elseif ($type == 2) {
  181. $this->body = Util::arrayToXml($body);
  182. $this->requestLength = strlen($this->body);
  183. } elseif (in_array($type, array(3, 4, 5))) {
  184. $this->body = $body;
  185. }
  186. } else {
  187. $this->body = $body;
  188. }
  189. $this->bodyType = $type;
  190. }
  191. /**
  192. * Function Description:设置ssl类型
  193. * Function Name: setCert
  194. * @param $certArr array
  195. *
  196. *
  197. * @author 倪宗锋
  198. */
  199. public function setCert($certArr)
  200. {
  201. $this->cert = true;
  202. $this->certPem = $certArr['SSLCERT_PATH'];
  203. $this->keyPem = $certArr['SSLKEY_PATH'];
  204. }
  205. /*****************==========参数设置函数结束=========******************/
  206. /*****************==========调用接口并返回结果===开始======******************/
  207. /**
  208. * Function Description:执行交易
  209. * Function Name: execute
  210. *
  211. * @param $url string sap地址
  212. * @param $verb string 请求方式 post|get
  213. *
  214. * @return array
  215. *
  216. * @author nizongfeng
  217. * Modify Date:2016.11.10
  218. */
  219. public function execute($url, $verb = 'GET')
  220. {
  221. $this->verb = $verb;
  222. $this->url = $this->baseUrl . $url;
  223. $this->logMessage .= date('Y-m-d H:i:s') . " Url : {$this->url}";
  224. $this->logMessage .= ' Method:' . $this->verb;
  225. if (is_array($this->body)) {
  226. $this->logMessage .= "sendContent: " . print_r($this->body, 1) . PHP_EOL;
  227. } else {
  228. $this->logMessage .= "sendContent: {$this->body}" . PHP_EOL;
  229. }
  230. $ch = curl_init($this->url);
  231. try {
  232. switch (strtoupper($this->verb)) {
  233. case 'GET':
  234. $this->executeGet($ch);
  235. break;
  236. case 'POST':
  237. $this->executePost($ch);
  238. break;
  239. case 'PUT':
  240. $this->executePut($ch);
  241. break;
  242. case 'DELETE':
  243. $this->executeDelete($ch);
  244. break;
  245. default:
  246. $this->logMessage .= "current verb: {$this->verb}, is an invalid REST verb." . PHP_EOL;
  247. break;
  248. }
  249. } catch (\Exception $e) {
  250. $this->logMessage .= $e->getMessage() . PHP_EOL;
  251. }
  252. curl_close($ch);
  253. $ch = null;
  254. return $this->getResult();
  255. }
  256. /**
  257. * Function Description:获取返回数据
  258. * Function Name: getResult
  259. *
  260. * @return array|mixed
  261. *
  262. * @author nizongfeng
  263. * Modify Date:2016.11.10
  264. */
  265. public function getResult()
  266. {
  267. if (in_array($this->bodyType, array(1, 4))) {
  268. $return = json_decode($this->responseBody, true);
  269. } elseif (in_array($this->bodyType, array(2, 3))) {
  270. $return = Util::xmlToArray($this->responseBody);
  271. } elseif ($this->bodyType == 5) {
  272. $return = $this->responseBody;
  273. } else {
  274. $return = '';
  275. }
  276. file_put_contents(APP_PATH . '/log/curl/' . date('Y-m-d') . '.log', $this->logMessage . PHP_EOL, FILE_APPEND);
  277. return $return;
  278. }
  279. /*******************=====GET传值=====********************/
  280. /**
  281. * Function Description:GET传值
  282. * Function Name: executeGet
  283. * @param $ch
  284. *
  285. * @return void
  286. *
  287. * @author nizongfeng 2016.11.10
  288. */
  289. protected function executeGet($ch)
  290. {
  291. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  292. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  293. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  294. $this->doExecute($ch);
  295. }
  296. /*******************=====POST传值=====********************/
  297. /**
  298. * Function Description:POST传值
  299. * Function Name: executePost
  300. * @param $ch
  301. *
  302. * @return void
  303. *
  304. * @author nizongfeng 2016.11.10
  305. */
  306. protected function executePost($ch)
  307. {
  308. // curl_setopt($ch, CURLOPT_VERBOSE, true);
  309. curl_setopt($ch, CURLOPT_POST, true);
  310. if (is_array($this->body)) {
  311. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($this->body));
  312. } else {
  313. curl_setopt($ch, CURLOPT_POSTFIELDS, $this->body);
  314. }
  315. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  316. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  317. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  318. $this->doExecute($ch);
  319. }
  320. /*******************=====PUT传值=====********************/
  321. /**
  322. * Function Description:PUT传值
  323. * Function Name: executePut
  324. * @param $ch
  325. *
  326. *
  327. * @author 倪宗锋
  328. */
  329. protected function executePut($ch)
  330. {
  331. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
  332. curl_setopt($ch, CURLOPT_POSTFIELDS, $this->body);
  333. $this->doExecute($ch);
  334. }
  335. /*******************=====DELETE传值=====********************/
  336. /**
  337. * Function Description:DELETE传值
  338. * Function Name: executeDelete
  339. * @param $ch
  340. *
  341. *
  342. * @author 倪宗锋
  343. */
  344. protected function executeDelete($ch)
  345. {
  346. curl_setopt($ch, CURLOPT_POSTFIELDS, $this->body);
  347. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
  348. $this->doExecute($ch);
  349. }
  350. /*******************=====传值及接收=====********************/
  351. /**
  352. * Function Description: 传值及接受数据
  353. * Function Name: doExecute
  354. * @param $curlHandle
  355. *
  356. * @return void
  357. *
  358. * @author nizongfeng 2015.12.08
  359. */
  360. protected function doExecute(&$curlHandle)
  361. {
  362. if ($this->verb != 'get') {
  363. $this->setCurlOpts($curlHandle);
  364. }
  365. curl_setopt($curlHandle, CURLOPT_HEADER, $this->curlOptHeader);
  366. curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, true);
  367. curl_setopt($curlHandle, CURLOPT_TIMEOUT, $this->timeOut);
  368. //记录报文发送时间
  369. $sendTime = microtime(true);
  370. $this->responseBody = curl_exec($curlHandle);
  371. //记录报文返回时间
  372. $responseTime = microtime(true);
  373. $timeIncrement = round(floatval($responseTime - $sendTime), 3);
  374. //记录返回的报文信息
  375. $this->logMessage .= "response: {$this->responseBody}" . PHP_EOL;
  376. $curlInfo = curl_getinfo($curlHandle);
  377. $this->curlGetInfo = $curlInfo;
  378. if (empty($curlInfo['primary_port'])) {
  379. $curlInfo['primary_port'] = '';
  380. }
  381. $curlInfoStr = '';
  382. if (isset($_SERVER['SERVER_ADDR']) && $_SERVER['SERVER_PORT']) {
  383. $curlInfoStr = " toIP {$curlInfo['primary_ip']}:{$curlInfo['primary_port']}";
  384. $curlInfoStr .= " selfIP {$_SERVER['SERVER_ADDR']} {$_SERVER['SERVER_PORT']}";
  385. }
  386. //记录通信信息及性能指标
  387. $this->logMessage .= "Info: " . json_encode($curlInfoStr) . PHP_EOL;
  388. $this->logMessage .= "sendTime: " . date('H:i:s', $sendTime) . " , responseTime: ";
  389. $this->logMessage .= date('H:i:s', $responseTime) . " , timeIncrement:" . $timeIncrement . 's'
  390. . PHP_EOL;
  391. $curlError = curl_error($curlHandle);
  392. if ($curlError) {
  393. $this->logMessage .= "Error: " . $curlError . PHP_EOL;
  394. }
  395. }
  396. /*******************=====头部设置=====********************/
  397. /**
  398. * Function Description:头部设置
  399. * Function Name: setCurlOpts
  400. * @param $curlHandle
  401. *
  402. *
  403. * @author 倪宗锋
  404. */
  405. protected function setCurlOpts(&$curlHandle)
  406. {
  407. if ($this->cert == 1) {
  408. //设置证书
  409. //使用证书:cert 与 key 分别属于两个.pem文件
  410. curl_setopt($curlHandle, CURLOPT_SSLCERTTYPE, 'PEM');
  411. curl_setopt($curlHandle, CURLOPT_SSLCERT, $this->certPem);
  412. curl_setopt($curlHandle, CURLOPT_SSLKEYTYPE, 'PEM');
  413. curl_setopt($curlHandle, CURLOPT_SSLKEY, $this->keyPem);
  414. }
  415. }
  416. /*****************==========调用接口并返回结果===结束======******************/
  417. }
  418. ?>