PopHttpClient.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <?php
  2. namespace Com\Pdd\Pop\Sdk;
  3. /**
  4. * Pop接口调用的客户端类
  5. */
  6. class PopHttpClient
  7. {
  8. /**
  9. * SDK版本号
  10. */
  11. public static $VERSION="0.0.2";
  12. /**
  13. * 接口超时时间
  14. */
  15. private static $SECONDS = "30";
  16. /**
  17. * @var string API协议版本号,默认V1
  18. */
  19. private $API_VERSION = "V1";
  20. private $clientId;
  21. private $clientSecret;
  22. private $apiServerUrl = "https://gw-api.pinduoduo.com/api/router";
  23. /**
  24. * 构造函数
  25. * @param $clientId 开放平台分配的clientId
  26. * @param $clientSecret 开放平台分配的clientSecret
  27. */
  28. public function __construct($clientId, $clientSecret){
  29. $this->clientId = $clientId;
  30. $this->clientSecret = $clientSecret;
  31. }
  32. /**
  33. * 接口调用函数
  34. * @param $request 是 Array 类型,里面包含API接口名称type(必填)、data_type(返回数据格式选填)和接口其他参数
  35. * @param $access_token 表示调用接口的授权码
  36. * @return 接口返回信息
  37. */
  38. public function syncInvoke($request, $access_token = ""){
  39. $params = $this->uniqueParams($request, $access_token);
  40. $sign = $this->makeSign($params);
  41. $params['sign'] = $sign;
  42. $response = $this->postCurl($params);
  43. return $response;
  44. }
  45. /**
  46. * 构造全部参数
  47. * @param $request请求参数 $access_token 授权参数
  48. * @return 构造后的所有参数
  49. */
  50. private function uniqueParams($request, $access_token){
  51. $params = $request->getParamsMap();
  52. $params['client_id'] = $this->clientId;
  53. if($access_token){
  54. $params['access_token'] = $access_token;
  55. }
  56. //把boolean转为true 和 false
  57. foreach ($params as $key=>$val){
  58. if(is_bool($val)){
  59. $params[$key] = $val?"true":"false";
  60. }
  61. }
  62. return $params;
  63. }
  64. /**
  65. * @param $request 请求的参数
  66. * @return 返回md5后的sign值
  67. */
  68. private function makeSign($params){
  69. //签名步骤一:按字典序排序参数
  70. ksort($params);
  71. $string = $this->toUrlParams($params);
  72. //签名步骤二:在string首尾加上client_secret
  73. $string = $this->clientSecret . $string . $this->clientSecret;
  74. //签名步骤三:MD5加密
  75. $string = md5($string);
  76. //签名步骤四:所有字符转为大写
  77. $result = strtoupper($string);
  78. return $result;
  79. }
  80. /**
  81. * 格式化参数格式化成url参数
  82. */
  83. private function toUrlParams($params)
  84. {
  85. $buff = "";
  86. foreach ($params as $k => $v)
  87. {
  88. if($k != "sign" && $v !== "" && !is_array($v)){
  89. $buff .= $k . $v ;
  90. }
  91. }
  92. return $buff;
  93. }
  94. private function postCurl($params){
  95. $ch = curl_init();
  96. $curlVersion = curl_version();
  97. $ua = "PopSDK/".self::$VERSION." (".PHP_OS.") PHP/".PHP_VERSION." CURL/".$curlVersion['version']." "
  98. .$this->clientId;
  99. //设置超时
  100. curl_setopt($ch, CURLOPT_TIMEOUT, self::$SECONDS);
  101. curl_setopt($ch,CURLOPT_URL, $this->apiServerUrl);
  102. curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
  103. curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);//严格校验
  104. curl_setopt($ch,CURLOPT_USERAGENT, $ua);
  105. //设置header
  106. curl_setopt($ch, CURLOPT_HEADER,false);
  107. //设置header
  108. $headers = array(
  109. "Cache-Control: no-cache",
  110. "Pragma: no-cache",
  111. "Pdd-Sdk-Version: ".self::$VERSION,
  112. "Pdd-Sdk-Type: PHP"
  113. );
  114. curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  115. //要求结果为字符串且输出到屏幕上
  116. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  117. //post提交方式
  118. curl_setopt($ch, CURLOPT_POST, TRUE);
  119. curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
  120. //运行curl
  121. $raw_response = curl_exec($ch);
  122. $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  123. //返回结果
  124. if($raw_response){
  125. curl_close($ch);
  126. $response = new PopHttpResponse();
  127. $response->setStatusCode($status_code);
  128. $response->setBody($raw_response);
  129. return $response;
  130. } else {
  131. $error = curl_errno($ch);
  132. curl_close($ch);
  133. throw new PopHttpException("curl出错,错误码:$error");
  134. }
  135. }
  136. }