| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- <?php
- declare (strict_types=1);
- namespace app\traits;
- use think\facade\Log;
- /**
- * 请求公证处统一请求API
- * Trait GzcApiRequest
- * @package app\traits
- */
- trait GzcApiRequest
- {
- /**
- * 发送请求
- * @return mixed|string
- * @author php迷途小书童
- * @created 2021/1/14 14:34
- */
- public static function request(string $method, string $url, array $params = [], array $options = [])
- {
- $base_uri = env('GZC.HOSTNAME');
- $request_uri = $base_uri.$url;
- try {
- $data = json_encode($params);
- $headerArray =array(
- "Content-type:application/json;charset='utf-8'",
- "Accept:application/json"
- );
- if ($url != '/v1/api/third/auth/token') {
- $Token = self::getTokenFromServer();
- $accessToken = $Token['extendData']['accessToken'];
- array_push($headerArray, "token:".$accessToken);
- }
- Log::info($data);
- $curl = curl_init();
- curl_setopt($curl, CURLOPT_URL, $request_uri);
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
- curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
- curl_setopt($curl, CURLOPT_POST, 1);
- curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
- curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- $output = curl_exec($curl);
- curl_close($curl);
- return json_decode($output, true);
- } catch (\Throwable $e) {
- return $e->getMessage();
- }
- }
- /**
- * 查询账户余额
- * @author php迷途小书童
- * @created 2021/1/14 16:34
- */
- public static function checkAmount($user)
- {
- $data = [
- 'platformNo' => env('GZC.PLATFORM_NO'),
- 'appNo' => env('GZC.APP_NO'),
- 'conName' => $user['user_name'],
- 'conCertType' => 1,
- 'conCertNo' => $user['user_card'],
- ];
- foreach (['conName', 'conCertNo'] as $key) {
- if (empty($data[$key])) {
- Log::error('[checkAmount] 参数缺失', [
- 'missing_field' => $key,
- 'user' => $user,
- 'data' => $data
- ]);
- }
- }
- $tokenData = self::getTokenFromServer();
- $token = $tokenData['extendData']['accessToken'] ?? null;
- if (empty($token)) {
- Log::error('[checkAmount] Token 获取失败', [
- 'tokenData' => $tokenData,
- 'user' => $user
- ]);
- } else {
- Log::info('[checkAmount] 成功获取 Token', ['token' => $token]);
- }
- Log::info('[checkAmount] 请求开始', [
- 'url' => '/v1/api/third/in/in30',
- 'data' => $data,
- 'user' => $user
- ]);
- $response = self::request('POST', '/v1/api/third/in/in30', $data);
- Log::info('[checkAmount] 接口返回', [
- 'response' => $response
- ]);
- $code = $response['code'] ?? null;
- $msg = $response['msg'] ?? '';
- $amount = $response['data']['amount'] ?? null;
- if ($code !== 200) {
- Log::error('[checkAmount] 接口返回异常状态码', [
- 'code' => $code,
- 'msg' => $msg,
- 'user' => $user,
- 'response' => $response
- ]);
- }
- if (!isset($response['data']['amount'])) {
- Log::error('[checkAmount] 响应结构异常,缺少金额字段', [
- 'user' => $user,
- 'response' => $response
- ]);
- }
- // 情况三:金额为 0,分析可能原因
- if ($amount === 0) {
- $possibleReasons = [];
- if (empty($token)) {
- $possibleReasons[] = 'Token 获取失败或未附带';
- }
- if (empty($data['conCertNo']) || empty($data['conName'])) {
- $possibleReasons[] = '用户姓名或身份证号为空';
- }
- if (stripos($msg, '未开户') !== false || stripos($msg, '未实名') !== false) {
- $possibleReasons[] = '用户未开户或未实名';
- }
- if (stripos($msg, '无账户') !== false) {
- $possibleReasons[] = '第三方系统中不存在此账户';
- }
- if (stripos($msg, 'success') !== false && $amount === 0) {
- $possibleReasons[] = '接口返回成功但余额确实为0(正常情况)';
- }
- Log::warning('[checkAmount] 返回金额为0,可能原因如下', [
- 'user' => $user,
- 'params' => $data,
- 'response' => $response,
- 'token' => $token,
- 'possible_reasons' => $possibleReasons
- ]);
- }
- return $response;
- // return self::request('POST', '/v1/api/third/in/in30', $data);
- }
- /**
- * 获取TOKEN
- * @return mixed|string
- * @author php迷途小书童
- * @created 2021/1/14 14:38
- */
- public static function getTokenFromServer()
- {
- $timestamp = (int)(microtime(true) * 1000);
- $appid = env('GZC.APP_ID');
- $data = [
- 'appid' => $appid,
- 'sign' => self::getSignContent($timestamp, $appid),
- 'timestamp' => $timestamp
- ];
- return self::request('POST', '/v1/api/third/auth/token', $data);
- }
- /**
- * 获取签名
- * @return string
- * @author php迷途小书童
- * @created 2020/10/29 9:35
- */
- public static function getSignContent(int $timestamp, string $appid) {
- $appsecret = md5(env('GZC.APP_SECRET'));
- $stringToBeSigned = "appid={$appid}&secret={$appsecret}×tamp={$timestamp}";
- return md5($stringToBeSigned);
- }
- }
|