$value) { if (empty($value)) { continue; } if ($isUrlEncode) { $value = urlencode($value); } $queryString .= $key . '=' . $value . '&'; } return trim($queryString, '&'); } /** * 加密 * @param string $encryptBody * @param string $encryptKey 加密使用的key SM2公钥 * @return string * @throws LogicException */ public static function encrypt(string $encryptBody, string $encryptKey) { if (empty($encryptBody)) { throw new LogicException('报文不能为空'); } if (empty($encryptKey)) { throw new LogicException('公钥不能为空'); } return Sm::sm4Encrypt($encryptKey, $encryptBody); } /** * 解密 * @param string $encryptBody * @param string $decryptKey 解密使用的Key SM2私钥 * @throws LogicException */ public static function decrypt(string $encryptBody, string $decryptKey) { if (empty($encryptBody)) { throw new LogicException('报文不能为空!'); } if (empty($decryptKey)) { throw new LogicException('秘钥不能为空!'); } return json_decode(Sm::sm4decrypt($decryptKey, $encryptBody), true); } /** * 签名 * @param string $signBody * @param string $signKey * @param string $algorithmEnum * @return string * @throws LogicException */ public static function sign(string $signBody, string $signKey) { if (empty($signBody)) { throw new LogicException('待签名数据不能为空!'); } if (empty($signKey)) { throw new LogicException('私钥不能为空'); } return Sm::sign($signKey, $signBody); } /** * 验签,国密算法SM3WithSM2 * @param string $verifyBody * @param string $sign * @param string $verifyKey sm2公钥 * @return bool * @throws LogicException */ public static function verify(string $verifyBody, string $sign, string $verifyKey) { if (empty($verifyBody)) { throw new LogicException('验签数据不能为空'); } if (empty($sign)) { throw new LogicException("签名不能为空"); } if (empty($verifyKey)) { throw new LogicException("公钥不能为空"); } return Sm::verify($verifyKey, $sign, $verifyBody); } /** * 对请求签名 * @param string $funcName * @param array $params * @param string $signKey sm2 私钥 * @param string $signAlgorithm SM3WithSM2 * @return string */ public static function signForRequest(string $funcName, array $params, string $signKey, string $signAlgorithm = 'SM3WithSM2') { if (!empty($funcName) && !strpos($funcName, '.json')) { $funcName = $funcName . '.json'; } $assembleUrl = self::getAssembleUrl($funcName, $params, false); return self::sign($assembleUrl, $signKey); } /** * 对响应签名 * @param array $params * @return string * @throws LogicException */ public static function signForResponse(array $params) { if (empty($params)) { throw new LogicException('参数不能为空'); } $cmbConfig = config('cmb'); $signKey = $cmbConfig['merchant_sm2_pri_key']; $assembleUrl = self::getAssembleUrl('', $params, false); unset($params['sign']); return self::sign($assembleUrl, $signKey); } /** * 对响应验签 * @param array $data * @return bool true 验签成功 false 验签失败 * @throws LogicException */ public static function verifyForResponse(array $data): bool { if (empty($data)) { throw new LogicException('参数不能为空'); } $cmbConfig = config('cmb'); $verifyKey = $cmbConfig['merchant_sm2_pub_key']; $sign = $data['sign']; unset($data['sign']); return self::verify(self::getAssembleUrl('', $data, false), $sign, $verifyKey); } /** * @param array $params * @param string $verifyKey 验签所使用的Key,为掌上生活公钥 * @return bool * @throws LogicException */ public static function verifyForRequest(array $params, string $verifyKey): bool { if (empty($params)) { throw new LogicException('参数不能为空'); } $sign = $params['sign']; unset($params['sign']); $assembleUrl = self::getAssembleUrl('', $params, false); return self::verify($assembleUrl, $sign, $verifyKey); } }