requestClient.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. /**
  3. * User: admin
  4. * Date Time: 2021/3/25 23:07
  5. */
  6. namespace common\components\dada\protocol;
  7. use common\components\dada\config\constant;
  8. class requestClient
  9. {
  10. /**
  11. * http request timeout;
  12. */
  13. private $httpTimeout = 5;
  14. /**
  15. * 配置项
  16. */
  17. private $config;
  18. /**
  19. * 接口类
  20. */
  21. private $api;
  22. /**
  23. * 构造函数
  24. */
  25. public function __construct($config, $api){
  26. $this->config = $config;
  27. $this->api = $api;
  28. }
  29. /**
  30. * 请求调用api
  31. * @return bool
  32. */
  33. public function makeRequest(){
  34. $reqParams = $this->buildRequestParams();
  35. $resp = $this->getHttpRequestWithPost(json_encode($reqParams));
  36. return $this->parseResponseData($resp);
  37. }
  38. /**
  39. * 构造请求数据
  40. * data:业务参数,json字符串
  41. */
  42. public function buildRequestParams(){
  43. $config = $this->getConfig();
  44. $api = $this->getApi();
  45. $requestParams = array();
  46. $requestParams['app_key'] = $config->getAppKey();
  47. $requestParams['body'] = $api->getBusinessParams();
  48. $requestParams['format'] = $config->getFormat();
  49. $requestParams['v'] = $config->getV();
  50. $requestParams['source_id'] = $config->getSourceId();
  51. $requestParams['timestamp'] = time();
  52. $requestParams['signature'] = $this->_sign($requestParams);
  53. return $requestParams;
  54. }
  55. /**
  56. * 签名生成signature
  57. */
  58. public function _sign($data){
  59. $config = $this->getConfig();
  60. //1.升序排序
  61. ksort($data);
  62. //2.字符串拼接
  63. $args = "";
  64. foreach ($data as $key => $value) {
  65. $args.=$key.$value;
  66. }
  67. $args = $config->getAppSecret() . $args . $config->getAppSecret();
  68. //3.MD5签名,转为大写
  69. $sign = strtoupper(md5($args));
  70. return $sign;
  71. }
  72. /**
  73. * 发送请求,POST
  74. * @param $url 指定URL完整路径地址
  75. * @param $data 请求的数据
  76. */
  77. public function getHttpRequestWithPost($data){
  78. $config = $this->config;
  79. $api = $this->api;
  80. $url = $config->getHost() . $api->getUrl();
  81. // json
  82. $headers = array(
  83. 'Content-Type: application/json',
  84. );
  85. $curl = curl_init($url);
  86. curl_setopt($curl, CURLOPT_URL, $url);
  87. curl_setopt($curl, CURLOPT_HEADER, false);
  88. curl_setopt($curl, CURLOPT_POST, true);
  89. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  90. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  91. curl_setopt($curl, CURLOPT_TIMEOUT, 3);
  92. curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
  93. $resp = curl_exec($curl);
  94. //var_dump( curl_error($curl) );//如果在执行curl的过程中出现异常,可以打开此开关查看异常内容。
  95. $info = curl_getinfo($curl);
  96. curl_close($curl);
  97. if (isset($info['http_code']) && $info['http_code'] == 200) {
  98. return $resp;
  99. }
  100. return '';
  101. }
  102. /**
  103. * 解析响应数据
  104. * @param $arr返回的数据
  105. * 响应数据格式:{"status":"success","result":{},"code":0,"msg":"成功"}
  106. */
  107. public function parseResponseData($arr){
  108. $resp = new response();
  109. if (empty($arr)) {
  110. $resp->setStatus(constant::FAIL);
  111. $resp->setMsg(constant::FAIL_MSG);
  112. $resp->setCode(constant::FAIL_CODE);
  113. }else{
  114. $data = json_decode($arr, true);
  115. $resp->setStatus($data['status']);
  116. $resp->setMsg($data['msg']);
  117. $resp->setCode($data['code']);
  118. $resp->setResult(isset($data['result'])?$data['result']:null);
  119. }
  120. return $resp;
  121. }
  122. public function getConfig(){
  123. return $this->config;
  124. }
  125. public function getApi(){
  126. return $this->api;
  127. }
  128. }