ShopApi.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <?php
  2. /**
  3. * 内部API助手类
  4. * Created by PhpStorm.
  5. * User: Ming
  6. * Date: 2018/3/13
  7. * Time: 10:21
  8. */
  9. namespace common\helpers\http;
  10. use Yii;
  11. use yii\httpclient\Client;
  12. class ShopApi {
  13. /**
  14. * 通讯密钥
  15. */
  16. const AUTH_KEY = '';
  17. /**
  18. * 允许的时间差(秒)
  19. */
  20. const TIME_DIFF = '';
  21. /**
  22. * 请求方法
  23. */
  24. const HTTP_METHOD_POST = 'post';
  25. const HTTP_METHOD_GET = 'get';
  26. /**
  27. * 返回成功的标记
  28. */
  29. const RETURN_SUCCESS = 'success';
  30. /**
  31. * http client
  32. * @var null
  33. */
  34. private static $_client = null;
  35. /**
  36. * http response
  37. * @var null
  38. */
  39. protected static $response = null;
  40. /**
  41. * 错误代码
  42. * @var int
  43. */
  44. private static $_errorCode = 0;
  45. /**
  46. * 错误信息
  47. * @var null
  48. */
  49. private static $_errorMessage = null;
  50. /**
  51. * 获取密钥
  52. * @return string
  53. */
  54. public static function getAuthKey(){
  55. if(self::AUTH_KEY === ''){
  56. return Yii::$app->params['http']['shopApi']['authKey'];
  57. }
  58. return self::AUTH_KEY;
  59. }
  60. /**
  61. * 获取允许的时间差
  62. * @return string
  63. */
  64. public static function getTimeDiff(){
  65. if(self::TIME_DIFF === ''){
  66. return Yii::$app->params['http']['shopApi']['timeDiff'];
  67. }
  68. return self::TIME_DIFF;
  69. }
  70. /**
  71. * 生成签名
  72. * @param array $params
  73. * @return array
  74. */
  75. public static function paramsFormat(array $params){
  76. if(!isset($params['timestamp'])){
  77. $params['timestamp'] = time();
  78. }
  79. if(isset($params['signature'])){
  80. unset($params['signature']);
  81. }
  82. ksort($params);
  83. $string = '';
  84. foreach($params as $key=>$value){
  85. $string .= $key.'='.$value . '&';
  86. }
  87. $params['signature'] = sha1(trim($string,'&') . self::getAuthKey());
  88. return $params;
  89. }
  90. /**
  91. * 验证签名
  92. * @param $signature
  93. * @param array $params
  94. * @return bool
  95. */
  96. public static function checkSignature($signature, array $params){
  97. $params = self::paramsFormat($params);
  98. if($params['signature'] !== $signature){
  99. return false;
  100. }
  101. $timeDiff = (int)self::getTimeDiff();
  102. if($timeDiff > 0 && (time() -> $params['timestamp']) > $timeDiff){
  103. return false;
  104. }
  105. return true;
  106. }
  107. /**
  108. * 获取http client 对象
  109. * @return null|Client
  110. */
  111. public static function client(){
  112. if(is_null(self::$_client)){
  113. self::$_client = new Client();
  114. }
  115. return self::$_client;
  116. }
  117. /**
  118. * request
  119. * @return \yii\httpclient\Request
  120. */
  121. public static function request(){
  122. return self::client()->createRequest();
  123. }
  124. /**
  125. * POST请求
  126. * @param $url
  127. * @param $data
  128. * @return mixed
  129. */
  130. public static function post($url, $data){
  131. $data = self::paramsFormat($data);
  132. static::$response = self::request()
  133. ->setMethod(self::HTTP_METHOD_POST)
  134. ->setUrl($url)
  135. ->setData($data)
  136. ->send();
  137. unset($data);
  138. return static::$response;
  139. }
  140. /**
  141. * GET请求
  142. * @param $url
  143. * @param array $data
  144. * @return \yii\httpclient\Response
  145. */
  146. public static function get($url, $data = []){
  147. $data = self::paramsFormat($data);
  148. $query = self::request()
  149. ->setMethod(self::HTTP_METHOD_GET)
  150. ->setUrl($url);
  151. if($data){
  152. $query->setData($data);
  153. }
  154. static::$response = $query->send();
  155. unset($data, $query);
  156. return static::$response;
  157. }
  158. /**
  159. * 输出是否正确
  160. * @return mixed
  161. */
  162. public static function responsed(){
  163. return self::$response->isOk && (is_array(self::$response->data) && isset(self::$response->data[self::RETURN_SUCCESS]));
  164. }
  165. /**
  166. * 获取报文
  167. * @return null
  168. */
  169. public static function getResponse(){
  170. return self::$response;
  171. }
  172. /**
  173. * 获取报文数据
  174. * @return mixed
  175. */
  176. public static function result(){
  177. return self::$response->data;
  178. }
  179. /**
  180. * 设置错误
  181. * @param $message
  182. * @param null $code
  183. */
  184. public static function setError($message, $code = null){
  185. if(!is_null($code)){
  186. self::$_errorCode = $code;
  187. }
  188. self::$_errorMessage = $message;
  189. }
  190. /**
  191. * 获取错误
  192. * @return array
  193. */
  194. public static function getError(){
  195. return [self::$_errorMessage, self::$_errorCode];
  196. }
  197. }