<?php
namespace app\util;
use app\exception\LogicException;
use app\service\util\CmbLifeUtils;
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;

class CmbHttpUtils
{
    /**
     * post 提交
     * @param $funcName
     * @param $requestParams
     * @return mixed|string
     * @throws LogicException
     */
    public static function doPost($funcName, $requestParams)
    {
        //添加公共参数
        $cmbConfig = config('cmb');
        $requestParams['mid'] = $cmbConfig['mid'];
        $requestParams['aid'] = $cmbConfig['aid'];
        $requestParams['date'] = date('YmdHis');
        $requestParams['random'] = StringUtil::generateRandomString(32); // 随机字符串,
        $requestParams['keyAlias'] = 'CO_PUB_KEY_SM2';
        $requestParams['cmbKeyAlias'] = 'SM2_CMBLIFE'; //当 cmbKeyAlias 为 SM2_CMBLIFE 时,走国密算法进行验签
        $sign = CmbLifeUtils::signForRequest($funcName, $requestParams, $cmbConfig['merchant_sm2_pri_key']);
        $requestParams['sign'] = $sign;
        $url = env('cmb.api_host') . $funcName . '.json';
        $data = self::httpPost($url, $requestParams);
        $res = \GuzzleHttp\json_decode($data, true);
        // 校验返回报文
        if (isset($res['sign'])) {
            $verifyResult = CmbLifeUtils::verifyForResponse($res);
            if ($verifyResult) { // 验签成功获取数据
                if (isset($res['encryptBody'])) {
                    $res['decryptBody'] = CmbLifeUtils::decrypt((string)$res['encryptBody'], $cmbConfig['merchant_sm2_pri_key']);
                } else {
                    return $res;
                }
            }
        }
        return $res;
    }
    private static function httpPost(string $uri, array $data)
    {
        $client = new Client([
            'base_uri' => env('cmb.api_host'),
            'timeout' => 50,
        ]);
        $response = $client->request('POST', $uri, [
            RequestOptions::FORM_PARAMS => $data,
        ]);
        return $response->getBody()->getContents();
    }
}