common.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: 流年 <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11. // 在 application/common.php 中添加
  12. //本站点请求地址
  13. function commonURL(){
  14. // return 'http://127.0.0.1:3335';
  15. return 'http://192.168.10.115:3335';
  16. }
  17. //开放平台请求地址(仅限本机请求)
  18. function commonOpenURL(){
  19. return 'http://192.168.10.115:3338';
  20. }
  21. //apiHTTP公网版
  22. function commonOpenURLHTTP(){
  23. // return 'http://127.0.0.1:3337';
  24. return 'http://192.168.10.115:3340';
  25. }
  26. //apiSSE公网版
  27. function commonOpenURLSSE(){
  28. // return 'http://127.0.0.1:3336';
  29. return 'http://192.168.10.115:3339';
  30. }
  31. //开放平台请求地址(内网)
  32. function commonOpenURLLocal(){
  33. // return 'http://127.0.0.1:3338';
  34. return 'http://192.168.10.115:3338';
  35. }
  36. //apiHTTP内网版
  37. function commonOpenURLLocalHTTP(){
  38. return 'http://192.168.10.115:3340';
  39. }
  40. //apiSSE内网版
  41. function commonOpenURLLocalSSE(){
  42. return 'http://192.168.10.115:3339';
  43. }
  44. //websocket
  45. function commonWebsocket(){
  46. // return 'ws://127.0.0.1:8033';
  47. return 'ws://192.168.10.115:8023';
  48. }
  49. //内网数据集请求地址
  50. function commonDataURL(){
  51. // 3334
  52. return 'http://192.168.10.102:3334';
  53. }
  54. //创建项目密钥
  55. function commonPublicKey(){
  56. return '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
  57. }
  58. //创建项目sm4的key
  59. function commonPrivateKey(){
  60. return 'kdOVYNCDa50ZaKQF';
  61. }
  62. //生成随机16位key字符串做sm4的iv
  63. function getSMIV() {
  64. $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  65. $randomString = '';
  66. for ($i = 0; $i < 16; $i++) {
  67. $index = rand(0, strlen($characters) - 1);
  68. $randomString .= $characters[$index];
  69. }
  70. return $randomString;
  71. }
  72. //判断是否是手机端还是电脑端
  73. function isMobile() {
  74. // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
  75. if (isset ($_SERVER['HTTP_X_WAP_PROFILE']))
  76. return true;
  77. //此条摘自TPM智能切换模板引擎,适合TPM开发
  78. if(isset ($_SERVER['HTTP_CLIENT']) &&'PhoneClient'==$_SERVER['HTTP_CLIENT'])
  79. return true;
  80. //如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
  81. if (isset ($_SERVER['HTTP_VIA']))
  82. //找不到为flase,否则为true
  83. return stristr($_SERVER['HTTP_VIA'], 'wap') ? true : false;
  84. //判断手机发送的客户端标志,兼容性有待提高
  85. if (isset ($_SERVER['HTTP_USER_AGENT'])) {
  86. $clientkeywords = array(
  87. 'nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile'
  88. );
  89. //从HTTP_USER_AGENT中查找手机浏览器的关键字
  90. if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
  91. return true;
  92. }
  93. }
  94. //协议法,因为有可能不准确,放到最后判断
  95. if (isset ($_SERVER['HTTP_ACCEPT'])) {
  96. // 如果只支持wml并且不支持html那一定是移动设备
  97. // 如果支持wml和html但是wml在html之前则是移动设备
  98. if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
  99. return true;
  100. }
  101. }
  102. return false;
  103. }
  104. //判断用户设备是ios还是安卓
  105. function mobileType(){
  106. $userAgent = $_SERVER['HTTP_USER_AGENT'];
  107. if (preg_match('/(iPhone|iPod|iPad)/', $userAgent)) {
  108. return "ios";
  109. } elseif (preg_match('/Android/', $userAgent)) {
  110. return "android";
  111. } else {
  112. return "unknow";
  113. }
  114. }
  115. //公共请求方法
  116. function curlPost($url, $data = null, $headers = [], $json = false) {
  117. $curl = curl_init($url);
  118. $options = [
  119. CURLOPT_RETURNTRANSFER => true,
  120. CURLOPT_SSL_VERIFYPEER => false,
  121. CURLOPT_SSL_VERIFYHOST => false,
  122. CURLOPT_POST => !empty($data) || $json,
  123. ];
  124. if ($json) {
  125. $headers = array_filter($headers, function($h) {
  126. return stripos($h, 'Content-Type:') === false;
  127. });
  128. $headers[] = 'Content-Type: application/json';
  129. $data = json_encode($data, JSON_UNESCAPED_UNICODE);
  130. }
  131. if (!empty($headers)) {
  132. $options[CURLOPT_HTTPHEADER] = $headers;
  133. }
  134. if (!empty($data)) {
  135. $options[CURLOPT_POSTFIELDS] = $data;
  136. }
  137. curl_setopt_array($curl, $options);
  138. $result = curl_exec($curl);
  139. curl_close($curl);
  140. return $result;
  141. }
  142. //将对象转为数组
  143. function stdClassObjToArray($array) {
  144. if(is_object($array)) {
  145. $array = (array)$array;
  146. }
  147. if(is_array($array)) {
  148. foreach($array as $key=>$value) {
  149. $array[$key] = stdClassObjToArray($value);
  150. }
  151. }
  152. return $array;
  153. }
  154. //公共公众号appid
  155. function commonAPPID(){
  156. return 'wxbd4f2db9777efe2e';
  157. }
  158. // 生成签名的随机串
  159. function nonceStr($length){
  160. $str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJK1NGJBQRSTUVWXYZ';//随即串,62个字符
  161. $strlen = 62;
  162. while($length > $strlen){
  163. $str .= $str;
  164. $strlen += 62;
  165. }
  166. $str = str_shuffle($str);
  167. return substr($str,0,$length);
  168. }
  169. // 获取微信公众号accessToken
  170. function getOfficialAccessToken() {
  171. // 构建查询条件判断accesstoken接口是否存在
  172. $mapWxOfficial['api'] = array('eq','accessToken');
  173. $accessTokenExist = db('Wxofficial') -> where($mapWxOfficial) -> value('id');
  174. // 如果accessToken接口不存在
  175. if(!$accessTokenExist){
  176. // 获取公众号的accessToken
  177. $accessTokenRequest = file_get_contents('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxbd4f2db9777efe2e&secret=78937f347edd0a7e8882ce3ac3b7fe94');
  178. $accessTokenRequestJson = json_decode($accessTokenRequest,true);
  179. $accessToken = $accessTokenRequestJson['access_token'];
  180. $time = time();
  181. $data = ['api' => 'accessToken','info' => $accessToken,'time' => $time];
  182. db('Wxofficial') -> insert($data);
  183. }
  184. // 如果accessToken接口存在
  185. else{
  186. // 获取accessToken存储的最后时间
  187. $accessTokenTime = db('Wxofficial') -> where($mapWxOfficial) -> value('time');
  188. $time = time();
  189. // 如果当前时间比accessToken存储时间超出60秒
  190. if(($time-$accessTokenTime) > 60){
  191. // 获取公众号的accessToken
  192. $accessTokenRequest = file_get_contents('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxbd4f2db9777efe2e&secret=78937f347edd0a7e8882ce3ac3b7fe94');
  193. $accessTokenRequestJson = json_decode($accessTokenRequest,true);
  194. $accessToken = $accessTokenRequestJson['access_token'];
  195. db('Wxofficial') -> where($mapWxOfficial) -> update(['info' => $accessToken,'time' => $time]);
  196. }
  197. else{
  198. $accessToken = db('Wxofficial') -> where($mapWxOfficial) -> value('info');
  199. }
  200. }
  201. return $accessToken;
  202. }
  203. // 获取微信公众号jsapiTicket
  204. function getOfficialJsapiTicket() {
  205. // 构建查询条件判断jsapiTicket接口是否存在
  206. // $mapWxOfficialJsapiTicket['api'] = array('eq','jsapiTicket');
  207. // $jsapiTicketExist = db('Wxofficial') -> where($mapWxOfficialJsapiTicket) -> value('id');
  208. // // 如果jsapiTicket接口不存在
  209. // if(!$jsapiTicketExist){
  210. // $accessToken = getOfficialAccessToken();
  211. // // 获取公众号的jsapiTicket
  212. // $jsapiTicketRequest = file_get_contents('https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$accessToken.'&type=jsapi');
  213. // $jsapiTicketRequestJson = json_decode($jsapiTicketRequest,true);
  214. // $jsapiTicket = $jsapiTicketRequestJson['ticket'];
  215. // $time = time();
  216. // $data = ['api' => 'jsapiTicket','info' => $jsapiTicket,'time' => $time];
  217. // db('Wxofficial') -> insert($data);
  218. // }
  219. // // 如果jsapiTicket接口存在
  220. // else{
  221. // // 获取jsapiTicket存储的最后时间
  222. // $jsapiTicketTime = db('Wxofficial') -> where($mapWxOfficialJsapiTicket) -> value('time');
  223. // $time = time();
  224. // // 如果当前时间比jsapiTicket存储时间超出60秒
  225. // if(($time-$jsapiTicketTime) > 60){
  226. // $accessToken = getOfficialAccessToken();
  227. // // 获取公众号的jsapiTicket
  228. // $jsapiTicketRequest = file_get_contents('https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$accessToken.'&type=jsapi');
  229. // $jsapiTicketRequestJson = json_decode($jsapiTicketRequest,true);
  230. // $jsapiTicket = $jsapiTicketRequestJson['ticket'];
  231. // db('Wxofficial') -> where($mapWxOfficialJsapiTicket) -> update(['info' => $jsapiTicket,'time' => $time]);
  232. // }
  233. // else{
  234. // $jsapiTicket = db('Wxofficial') -> where($mapWxOfficialJsapiTicket) -> value('info');
  235. // }
  236. // }
  237. return "dasds";
  238. }
  239. function curlPostRAG($url, $data = null, $headers = [], $json = true) {
  240. $curl = curl_init($url);
  241. $options = [
  242. CURLOPT_RETURNTRANSFER => true,
  243. CURLOPT_SSL_VERIFYPEER => false,
  244. CURLOPT_SSL_VERIFYHOST => false,
  245. CURLOPT_POST => true, // 强制启用 POST(JSON 模式下始终 POST)
  246. ];
  247. if ($json) {
  248. // 移除已有的 Content-Type 和 Accept 头,避免冲突
  249. $headers = array_filter($headers, function($h) {
  250. return stripos($h, 'Content-Type:') === false && stripos($h, 'Accept:') === false;
  251. });
  252. // 添加 JSON 专用头
  253. $headers[] = 'Content-Type: application/json';
  254. $headers[] = 'Accept: application/json';
  255. // 编码数据为 JSON(空数据编码为 "{}" 避免服务器解析错误)
  256. $data = $data !== null ? json_encode($data, JSON_UNESCAPED_UNICODE) : '{}';
  257. }
  258. // 设置请求头和数据
  259. if (!empty($headers)) {
  260. $options[CURLOPT_HTTPHEADER] = $headers;
  261. }
  262. if ($data !== null) {
  263. $options[CURLOPT_POSTFIELDS] = $data;
  264. }
  265. curl_setopt_array($curl, $options);
  266. $result = curl_exec($curl);
  267. // 错误处理(调试时启用)
  268. if ($result === false) {
  269. $error = curl_error($curl);
  270. $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
  271. throw new Exception("CURL请求失败: HTTP状态码 $httpCode, 错误信息: $error");
  272. }
  273. curl_close($curl);
  274. return $result;
  275. }