"xxxx", // "channel_id" => "xxxx", // "device" => "xxxx", // "gameid" => "xxxx", // "imeil" => "17322362573792438064", // "version" => "v3.4.0", // ]; // // $str = $this->handleEncrypt($data, 'h5'); // // $data = '{"username":"13121776520","password":"123456","token":"{{token}}","device":4,"channel_id":5215,"imeil":"00000000-1645-d5b5-ffff-ffffef05ac4a-wen","version":"v3.4.4","client_appkey":"dda26b4dab356247eb84193fe51baa97","aes_key":"qmQWERBABA202308","aes_key_h5":"qmQWERBABA20241210","appid":30,"gameid":30}'; // $str = openssl_encrypt($data, 'AES-128-ECB', 'qmQWERBABA20241210'); // var_dump($str); // // $str = 'hyvW9z17k/Gz1Ja2ghqw6YcFrvbAqT57xl2/kj3L8k35G8gB2kBxYKW2TZ7u+riaWjxcQ/0mvNqQQ0rPd+KQuUC/a8CQatA602Dy4FGVS3UKHTX+GlUa2DBGY+wDr/jPw6l3EYbbnjH9U5yXTQa4fmOptFo87WDNkhlIQuAZeEo='; // $str = 'msVNNwhwHMAs8wiDo5Y6pw2+R//+8NcWC34E94YmlrenPY++V1pQa4QIBOZfh3PyviREDG09vmxyKN+jvxrGUw1s6rVPuB9sy/oo2XrnyPt5nRHL2rk0scMofF9U8Ani0EFXJ2tbttcRKB5dcfG2yaP2BdWWV27xWEiX+0KXXdU='; // // $str = '9fU3EmTnXKV7a84pnRVopcapXDYvNwkR1orMUE2Kcka+vGT31AuvfM0E7mDDIp9/x2Q89cobiFdBmV1SO557Sa/5eShMosFcd73nMTG9rIPWh/2g51rsPD8Uv7QQftTr'; // // $res = $this->opensslDecrypt($str, Config::get('aes_key_h5')); // $res = $this->opensslDecrypt($str, 'qmQWERBABA202308'); // app // // $res = $this->opensslDecrypt($str, 'qmQWERBABA202412'); // h5 // // dump(Config::get('aes_key_h5'), $str, $res, json_decode($res)); try { // $param = [ // "app_id" => 'ks684828619578671316', // "channel_id" => 'ks', // "game_id" => '120592009db298fe1307fb38a3cdf83acb', // "role_id" => 'xxxx', // "role_name" => 'xxx', // "role_level" => 'xxx', // "server_id" => 'xxx', // "server_name" => 'xxx', // "product_id" => 'xxx', // "product_name" => 'xxx', // "product_desc" => 'xxx', // "money" => formatYuanToFen(1), // "currency_type" => 'CNY', // "notify_url" => 'xxx', // "extension" => json_encode(['order_id' => 'xxx']), // "user_ip" => 'xxx', // "third_party_trade_no" => 'xxx', // ]; // $sign = $this->handleQm($param, $this->getKeyData('pay')); // dump($sign); $param = input(); $sign = input('sign'); dump($param); $sign = $this->handleSignVerify($param, $this->getKeyData('notify'), $sign); dump('## sign: ', $sign); }catch (Exception $e){ dump("ERROR: ", $e->getMessage()); } } /** * 获取签名秘钥 * * @param $type 类型 pay|notify * @return string */ public function getKeyData($type = 'pay') { $key_file = APP_PATH . 'common/config/complex/qm_private_key.pem'; if ($type == 'notify') { $key_file = APP_PATH . 'common/config/complex/kuaishou_public.pem'; // $key_file = APP_PATH . 'common/config/complex/qm_public_key.pem'; // $key_file = APP_PATH . 'common/config/complex/qm_public_key.pem'; } if (!file_exists($key_file)) { return ''; } return file_get_contents($key_file); } /** * 处理签名数据 * * @param $data * * @return string */ public function handleSignData($data){ ksort($data); $signString = ''; foreach ($data as $key => $value) { if($key == 'sign'){ continue; } if ($signString !== '') { $signString .= '&'; } $signString .= $key . '=' . $value; } return $signString; } /** * 使用 RSA 私钥 + SHA512 签名数组 * * @param array $data 要签名的数组 * @param string $privateKey 私钥内容(PEM格式) * @return string Base64 编码签名字符串 */ function handleSign(array $data, string $privateKey): string { $signString = $this->handleSignData($data); $pkey = openssl_pkey_get_private($privateKey); if (!$pkey) { throw new Exception('无效的 RSA 私钥'); } $signature = ''; $success = openssl_sign($signString, $signature, $pkey, OPENSSL_ALGO_SHA512); openssl_free_key($pkey); if (!$success) { throw new Exception('签名失败'); } // 6. 返回 Base64 编码后的签名 return base64_encode($signature); } /** * 签名效验 * * @param array $data * @param string $publicKey * @param string $signstr * * @return bool */ function handleSignVerify(array $data, string $publicKey, string $signstr): string { $publicKey = <<handleSignData($data); $public_key_res = openssl_get_publickey($publicKey); $res = openssl_verify($signString, base64_decode($signstr), $public_key_res, OPENSSL_ALGO_SHA512); if($res == 1){ return true; } return false; } }