BaseController.php 4.12 KB
<?php

namespace App\Http\Controllers\Icms;

use App\Helper\Response;
use App\Http\Controllers\Controller;
use GuzzleHttp\Client;
use Illuminate\Support\Facades\Log;

class BaseController extends Controller
{
    /**
     * 基础变量
     * @var string
     */
    private $domain, $cp_id, $key;
    protected $resCode = [
        200 => '成功',
        5000=> '系统错误',
        4000=> '缺少必要参数, 或者参数值格式不正确',
        4100=> '签名鉴权失败',
        4200=> '请求已过期',
        4300=> '拒绝访问',
        4400=> '请求过于频繁',
        4500=> '配置错误'
    ];

    public function __construct()
    {
        $this->domain = env('ICMS_DOMAIN','https://mgw-uat.tencentmusic.com/icms/sit-api');
        $this->cp_id = env('ICMS_CPID',7389);
        $this->key = env('ICMS_KEY','50d74110004d94605d12c241eeafee27');
    }

    /**
     * 获取签名和去空的参数
     * @param array $array
     * @param int $timestamp
     * @return array
     */
    private function signData(array $array,int $timestamp)
    {
        $common_params = [
            'timestamp' => $timestamp,
            'cp_id' => $this->cp_id
        ];
        $param_arr = array_merge($common_params,$array);
        ksort($param_arr);
        $params = '';
        $signData = [];
        foreach ($param_arr as $k=>$v)
        {
            if ('' === $v || null === $v || [] === $v) {
                continue;
            } if (is_array($v)) {
                $params .= $k.'='.json_encode($v).'&';
            } else {
                $params .= $k.'='.$v.'&';
            }
            $signData[$k] = $v;
        }
        $params = trim($params,'&');
        $signData['sign'] = strtoupper(md5($params.$this->key));
        dd($signData);
        return $signData;
    }

    /**
     * 重组请求数据
     * @param string $uri
     * @param array $reqData
     * @param bool $isLocal
     * @return array
     */
    private function requestData(string $uri, array $reqData, bool $isLocal = true)
    {
        if ($isLocal) {
            $data_file = database_path('Icms/'.$uri.'.query.php');
            $params = include("$data_file");
        } else {
            $params = $reqData;
        }
        $timestamp = time();
        $cp_id = $this->cp_id;
        $signData = $this->signData($params,$timestamp);
        return array_merge($signData,compact('cp_id','timestamp'));
    }

    /**
     * 请求接口
     * @param string $uri
     * @param string $method
     * @param array $reqData
     * @return \Illuminate\Http\JsonResponse|mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    protected function doApi(string $uri, array $reqData = [], string $method = 'POST')
    {
        $url = rtrim($this->domain,'/').'/'.$uri;
        $data = $this->requestData($uri, $reqData);
        try {
            $client = new Client(['verify'=>false]); //实体公钥['verify'=>'/path/to/public.pem']
            switch (strtoupper($method)) {
                case 'GET':
                    $response = $client->request('GET', $url, ['query' => $data]);
                    break;
                case 'POST':
                default:
                    $response = $client->request('POST', $url, ['json' => $data]);
                    break;
            }
            $data = json_decode($response->getBody()->getContents(), true);
            Log::channel('api')->info(__METHOD__, $data);
            if (200 !== $data['code']) {
                return Response::error(-1,$this->resCode[$data['code']] ?? '操作失败');
            } else {
                $response_path = 'Icms/'.$uri;
                if (! is_dir($response_path)) {
                    @mkdir($response_path,'0777');
                }
                $response_file = database_path($response_path.'.resp');
                file_put_contents($response_file, var_export($data['data'],true));
                return Response::success($data['data']);
            }
        } catch (\Exception $e) {
            Log::channel('api')->error(__METHOD__, ['msg'=>$e->getMessage()]);
            return Response::error(-1,'接口请求失败!');
        }
    }
}