GzcApiRequest.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <?php
  2. declare (strict_types=1);
  3. namespace app\traits;
  4. use think\facade\Log;
  5. /**
  6. * 请求公证处统一请求API
  7. * Trait GzcApiRequest
  8. * @package app\traits
  9. */
  10. trait GzcApiRequest
  11. {
  12. /**
  13. * 发送请求
  14. * @return mixed|string
  15. * @author php迷途小书童
  16. * @created 2021/1/14 14:34
  17. */
  18. public static function request(string $method, string $url, array $params = [], array $options = [], $type = 1)
  19. {
  20. $base_uri = env('GZC.HOSTNAME');
  21. $request_uri = $base_uri.$url;
  22. try {
  23. $data = json_encode($params);
  24. $headerArray =array(
  25. "Content-type:application/json;charset='utf-8'",
  26. "Accept:application/json"
  27. );
  28. if ($url != '/v1/api/third/auth/token') {
  29. $Token = self::getTokenFromServer($type);
  30. $accessToken = $Token['extendData']['accessToken'];
  31. array_push($headerArray, "token:".$accessToken);
  32. }
  33. Log::info($data);
  34. $curl = curl_init();
  35. curl_setopt($curl, CURLOPT_URL, $request_uri);
  36. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  37. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
  38. curl_setopt($curl, CURLOPT_POST, 1);
  39. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  40. curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);
  41. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  42. $output = curl_exec($curl);
  43. curl_close($curl);
  44. return json_decode($output, true);
  45. } catch (\Throwable $e) {
  46. return $e->getMessage();
  47. }
  48. }
  49. /**
  50. * 查询账户余额
  51. * @author php迷途小书童
  52. * @created 2021/1/14 16:34
  53. */
  54. public static function checkAmount($user)
  55. {
  56. $cardType = $user['card_type'] ? $user['card_type'] : 10;
  57. $cxbData = [
  58. 'platformNo' => env('GZC.PLATFORM_NO'),
  59. 'appNo' => env('GZC.APP_NO'),
  60. 'conName' => $user['user_name'],
  61. 'conCertType' => $cardType,
  62. 'conCertNo' => $user['user_card'],
  63. ];
  64. Log::info('储蓄保养老金请求参数:' . json_encode($cxbData));
  65. $cxbResponseData = self::request('POST', '/v1/api/third/in/in30', $cxbData, [], 1);
  66. Log::info('储蓄保养老金请求返回:' . json_encode($cxbResponseData));
  67. if($cxbResponseData['code'] != 0) {
  68. return $cxbResponseData['message'];
  69. }
  70. $xfbData = [
  71. 'platformNo' => env('XINGFUBAO.PLATFORM_NO'),
  72. 'appNo' => env('XINGFUBAO.APP_NO'),
  73. 'conName' => $user['user_name'],
  74. 'conCertType' => $cardType,
  75. 'conCertNo' => $user['user_card'],
  76. ];
  77. Log::info('幸福保养老金请求参数:' . json_encode($xfbData));
  78. $xfbResponseData = self::request('POST', '/v1/api/third/in/in30', $xfbData, [], 2);
  79. Log::info('幸福保养老金请求返回:' . json_encode($xfbResponseData));
  80. if($xfbResponseData['code'] != 0) {
  81. return $xfbResponseData['message'];
  82. }
  83. $amount = $cxbResponseData['extendData']['amount'] + $xfbResponseData['extendData']['amount'];
  84. //return $amount;
  85. return ['amount' => $amount, 'response' => $cxbResponseData, 'responsetwo' => $xfbResponseData];
  86. }
  87. public function getAmountFromGzc()
  88. {
  89. $uid = $this->request->uid();
  90. $userInfo = Db::name('UserCertification')->where('uid', $uid)->field('user_name,user_card')->find();
  91. if (empty($userInfo['user_name']) || empty($userInfo['user_card'])) {
  92. Log::error('[getAmountFromGzc] 用户实名信息缺失', ['uid' => $uid, 'userInfo' => $userInfo]);
  93. return app('json')->fail('未找到用户实名信息');
  94. }
  95. try {
  96. $res = GzcApiRequest::checkAmount($userInfo);
  97. } catch (\Throwable $e) {
  98. Log::error('[getAmountFromGzc] 调用异常', ['uid' => $uid, 'error' => $e->getMessage()]);
  99. return app('json')->fail('查询失败(第三方异常)');
  100. }
  101. if (!is_array($res) || ($res['code'] ?? -1) !== 0) {
  102. return app('json')->fail($res['message'] ?? '查询失败');
  103. }
  104. $amountCents = $res['extendData']['amount'] ?? $res['data']['amount'] ?? $res['amount'] ?? 0;
  105. $amount = floatval($amountCents) * 0.01;
  106. $formatted = sprintf('%.2f', $amount);
  107. return app('json')->success([
  108. 'amount' => $formatted,
  109. 'debug' => $res['debug'] ?? null,
  110. ]);
  111. }
  112. /**
  113. * 获取TOKEN
  114. * @return mixed|string
  115. * @author php迷途小书童
  116. * @created 2021/1/14 14:38
  117. */
  118. public static function getTokenFromServer($type = 1)
  119. {
  120. $timestamp = (int)(microtime(true) * 1000);
  121. if ($type == 1) {
  122. $appid = env('GZC.APP_ID');
  123. }else{
  124. $appid = env('XINGFUBAO.APP_ID');
  125. }
  126. $data = [
  127. 'appid' => $appid,
  128. 'sign' => self::getSignContent($timestamp, $appid, $type),
  129. 'timestamp' => $timestamp
  130. ];
  131. return self::request('POST', '/v1/api/third/auth/token', $data);
  132. }
  133. /**
  134. * 获取签名
  135. * @return string
  136. * @author php迷途小书童
  137. * @created 2020/10/29 9:35
  138. */
  139. public static function getSignContent(int $timestamp, string $appid, $type = 1) {
  140. if ($type == 1) {
  141. $appsecret = md5(env('GZC.APP_SECRET'));
  142. }else{
  143. $appsecret = md5(env('XINGFUBAO.APP_SECRET'));
  144. }
  145. $stringToBeSigned = "appid={$appid}&secret={$appsecret}&timestamp={$timestamp}";
  146. return md5($stringToBeSigned);
  147. }
  148. }