EsignHttpHelper.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. namespace App\Servers\ESign\comm;
  3. /**
  4. * esignHttp请求类
  5. * @author 澄泓
  6. * @date 2022/08/18 15:10
  7. */
  8. class EsignHttpHelper
  9. {
  10. /**
  11. * 常规请求
  12. * @param $host
  13. * @param $url
  14. * @param $reqType
  15. * @param $header
  16. * @param $paramStr
  17. * @return EsignResponse
  18. */
  19. public static function doCommHttp($host, $url, $reqType, $header, $paramStr)
  20. {
  21. //做encode编码防止中文乱码
  22. $url = EsignHttpHelper::querySort($url, true);
  23. return EsignHttpCfgHelper::sendHttp($reqType, $host . $url, $header, $paramStr);
  24. }
  25. /**
  26. * 文件上传
  27. * @param $uploadUrls
  28. * @param $filePath
  29. * @param $ContenType
  30. * @return EsignResponse
  31. */
  32. public static function upLoadFileHttp($uploadUrls, $filePath, $ContenType)
  33. {
  34. $fileContent = file_get_contents($filePath);
  35. $contentBase64Md5 = EsignUtilHelper::getContentBase64Md5($filePath);
  36. return EsignHttpCfgHelper::upLoadFileHttp($uploadUrls, $contentBase64Md5, $fileContent, $ContenType);
  37. }
  38. /**
  39. * 签名计算并且构建一个签名鉴权+json数据的esign请求头
  40. * @param $projectId
  41. * @param $secret
  42. * @param $paramStr
  43. * @param $reqType
  44. * @param $url
  45. * @param string $accept
  46. * @param string $contentType
  47. * @return array
  48. */
  49. public static function signAndBuildSignAndJsonHeader($projectId, $secret, $paramStr, $reqType, $url,$accept="*/*",$contentType="application/json; charset=UTF-8")
  50. {
  51. $contentMd5="";
  52. //get和delete方式请求不能携带body体
  53. if (strtoupper($reqType) == "GET" || strtoupper($reqType) == "DELETE") {
  54. $paramStr=null;
  55. }else{
  56. $contentMd5 = EsignUtilHelper::getContentMd5($paramStr);
  57. }
  58. //对body体做md5摘要
  59. //构造一个初步请求头
  60. $buildSignAndJsonHeader = self::buildSignAndJsonHeader($projectId, $contentMd5, $accept, $contentType, "Signature");
  61. //对url做排序
  62. self::querySort($url);
  63. //传入生成的bodyMd5,加上其他请求头部信息拼接成字符串,整体做sha256签名
  64. $reqSignature = EsignUtilHelper::getSignature($secret, $reqType, $accept, $contentType, $contentMd5, "", "", $url);
  65. array_push($buildSignAndJsonHeader,"X-Tsign-Open-Ca-Signature:".$reqSignature);
  66. return $buildSignAndJsonHeader;
  67. }
  68. /**
  69. * 建一个签名鉴权+json数据的esign初步请求头
  70. * @param $projectId
  71. * @param $contentMD5
  72. * @param $accept
  73. * @param $contentType
  74. * @param $authMode
  75. * @return array
  76. */
  77. public static function buildSignAndJsonHeader($projectId, $contentMD5, $accept, $contentType, $authMode)
  78. {
  79. $headers = array(
  80. 'X-Tsign-Open-App-Id:'.$projectId,
  81. 'X-Tsign-Open-Ca-Timestamp:'.EsignUtilHelper::getMillisecond(),
  82. 'Accept:'.$accept,
  83. 'Content-Type:'.$contentType,
  84. 'X-Tsign-Open-Auth-Mode:'.$authMode,
  85. 'X-Tsign-Dns-App-Id:'.$projectId
  86. );
  87. if(!empty($contentMD5)){
  88. array_push($headers,'Content-MD5:'.$contentMD5);
  89. }
  90. return $headers;
  91. }
  92. public static function querySort($url,$isEncode=false){
  93. #存在query参数
  94. if (!strpos($url, "?") === false) {
  95. $query_arr = [];
  96. $url_path = substr($url, 0, strpos($url, "?"));
  97. $url_query = substr($url, strpos($url, "?") + 1, mb_strlen($url));
  98. parse_str($url_query, $query_arr);
  99. ksort($query_arr);
  100. //reset()内部指针指向数组中的第一个元素
  101. reset($query_arr);
  102. $query_str = http_build_query($query_arr);
  103. if(!$isEncode){
  104. $query_str = urldecode($query_str);
  105. }
  106. $url = $url_path . '?' . $query_str;
  107. return $url;
  108. }
  109. return $url;
  110. }
  111. /**
  112. * 构造头部信息
  113. * @param $contentMD5
  114. * @param $reqSignature
  115. * @return array
  116. */
  117. public static function buildCommHeader($projectId, $contentMD5, $reqSignature)
  118. {
  119. $headers = array(
  120. 'X-Tsign-Open-App-Id:' . $projectId,
  121. 'X-Tsign-Open-Ca-Timestamp:' . EsignUtilHelper::getMillisecond(),
  122. 'Accept:*/*',
  123. 'X-Tsign-Open-Ca-Signature:' . $reqSignature,
  124. 'Content-MD5:' . $contentMD5,
  125. 'Content-Type:application/json; charset=UTF-8',
  126. 'X-Tsign-Open-Auth-Mode:Signature'
  127. );
  128. return $headers;
  129. }
  130. }