Model_apittv1.php 4.6 KB

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