Model_apittv1.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <?php
  2. class Model_apittv1 extends Lin_Model {
  3. function __construct(){
  4. parent::__construct();
  5. $this->load->_model("Model_logic_ding","logic_ding");
  6. }
  7. private function sign($url,$appSecret,$body='')
  8. {
  9. // 解析URL获取查询参数
  10. $queryParams = array();
  11. parse_str(parse_url($url, PHP_URL_QUERY), $queryParams);
  12. // 排除'sign'和'access_token'
  13. unset($queryParams['sign'], $queryParams['access_token']);
  14. // 按字典顺序排序查询参数
  15. ksort($queryParams);
  16. // 拼接参数为{key}{value}格式
  17. $input = '';
  18. foreach ($queryParams as $key => $value)
  19. {
  20. $input .= $key . $value;
  21. }
  22. // 追加请求路径
  23. $path = parse_url($url, PHP_URL_PATH);
  24. $input = $path . $input;
  25. if ($body)
  26. {
  27. $input .= json_encode($body);
  28. }
  29. // 使用app_secret包裹生成的字符串
  30. $input = $appSecret . $input . $appSecret;
  31. // 生成签名
  32. $sign = hash_hmac('sha256', $input,$appSecret);
  33. return $sign;
  34. }
  35. // private function sign($url,$header,$body,$secret){
  36. // //解析URL
  37. // $urlParts = parse_url($url);
  38. // //获取路径
  39. // $path = $urlParts['path']??'';
  40. // //解析查询参数
  41. // $queryParams = [];
  42. // if(isset($urlParts['query'])){
  43. // parse_str($urlParts['query'],$queryParams);
  44. // }
  45. // // 移除sign和access_token参数
  46. // unset($queryParams['sign']);
  47. // unset($queryParams['access_token']);
  48. // // 按参数名排序
  49. // ksort($queryParams);
  50. // // 构建参数字符串
  51. // $parameterStr = $path;
  52. // foreach ($queryParams as $key => $value) {
  53. // $parameterStr .= $key . $value;
  54. // }
  55. // // 检查Content-Type,如果不是multipart/form-data,则追加body
  56. // $contentType = $this->getHeader($header, 'Content-Type');
  57. // if (stripos($contentType, 'multipart/form-data') === false && !empty($body)) {
  58. // $parameterStr .= $body;
  59. // }
  60. // // 用secret包裹参数字符串
  61. // $signatureParams = $secret . $parameterStr . $secret;
  62. // // 使用HMAC-SHA256生成签名
  63. // return $this->generateSHA256($signatureParams, $secret);
  64. // }
  65. // private function getHeader($header,$name){
  66. // $lowerName = strtolower($name);
  67. // foreach ($header as $key => $value) {
  68. // if (strtolower($key) === $lowerName) {
  69. // return $value;
  70. // }
  71. // }
  72. // return '';
  73. // }
  74. // private function generateSHA256($signatureParams, $secret){
  75. // return hash_hmac('sha256', $signatureParams, $secret);
  76. // }
  77. private function reqGet($url,$headers){
  78. // 初始化cURL
  79. $ch = curl_init();
  80. // 设置cURL选项
  81. curl_setopt_array($ch, [
  82. CURLOPT_URL => $url,
  83. CURLOPT_RETURNTRANSFER => true,
  84. CURLOPT_HTTPGET => true, // 明确设置为GET请求
  85. CURLOPT_HTTPHEADER => $headers,
  86. // SSL设置 - 禁用验证(仅测试环境)
  87. CURLOPT_SSL_VERIFYPEER => false,
  88. CURLOPT_SSL_VERIFYHOST => false,
  89. // 其他设置
  90. CURLOPT_TIMEOUT => 300,
  91. CURLOPT_FOLLOWLOCATION => true,
  92. ]);
  93. // 执行请求
  94. $response = curl_exec($ch);
  95. // 检查错误
  96. $error_msg = "";
  97. if (curl_errno($ch)) {
  98. $error_msg = $ch;
  99. }
  100. // 获取HTTP状态码
  101. $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  102. return [
  103. 'httpCode'=>$httpCode,
  104. 'response'=>$response,
  105. 'errorMsg'=>$error_msg
  106. ];
  107. }
  108. private function reqPost($url,$headers,$data){
  109. // 初始化cURL
  110. $ch = curl_init();
  111. // 设置cURL选项
  112. curl_setopt_array($ch, [
  113. CURLOPT_URL => $url,
  114. CURLOPT_RETURNTRANSFER => true,
  115. CURLOPT_POST => true,
  116. CURLOPT_HTTPHEADER => $headers,
  117. CURLOPT_POSTFIELDS => json_encode($data),
  118. CURLOPT_SSL_VERIFYPEER => false, // 根据实际情况调整,生产环境建议设为true
  119. CURLOPT_TIMEOUT => 300,
  120. ]);
  121. // 执行请求
  122. $response = curl_exec($ch);
  123. // 检查错误
  124. $error_msg = "";
  125. if (curl_errno($ch)) {
  126. $error_msg = curl_error($ch);
  127. }
  128. // 获取HTTP状态码
  129. $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  130. // 关闭cURL资源
  131. curl_close($ch);
  132. return [
  133. 'httpCode'=>$httpCode,
  134. 'response'=>$response,
  135. 'errorMsg'=>$error_msg
  136. ];
  137. }
  138. public function downloadLabel($package_id,$shop,$info){
  139. $url = 'https://open-api.tiktokglobalshop.com';
  140. $link = '/fulfillment/202309/packages/'.$package_id.'/shipping_documents';
  141. $time = time();
  142. $link .= '?shop_cipher='.$shop['shop_cipher'].'&app_key='.$shop['app_key'].'&timestamp='.$time."&document_type=SHIPPING_LABEL";
  143. $url = $url.$link;
  144. $headers = array('Content-Type: application/json','x-tts-access-token:'.$shop['token']);
  145. $sign = $this->sign($url,$headers,[],$shop['app_key']);
  146. $url .= $link.'&sign='.$sign;
  147. $res = $this->reqGet($url,$headers);
  148. if($res['httpCode'] != 200){
  149. echo "<pre>";
  150. print_r($res);
  151. }else{
  152. echo "<pre>";
  153. print_r($res);
  154. }
  155. }
  156. }