| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- <?php
- namespace app\api\controller;
- use think\Config;
- use think\Env;
- use think\Exception;
- class Test extends Api
- {
- public function _initialize(){
- // parent::_initialize();
- }
- public function index(){
- // http://sdkapi.newsdk.com/test/index
-
- // ## 客户端加密
- // $data = [
- // "appid" => "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 = <<<EOD
- -----BEGIN PUBLIC KEY-----
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8eW4XgoSoaBptOKjuLWY
- Dzec+jGeJEYLCMEnIqPIvr6M695mZDkiS4Q5eO+Ksdrh9aTTfqRkZ+BfjJaNrNT1
- MYfhHT3u75WHslIVa7iNz/9440OnAJ2U+eqLjDPTJzEojxvMw+3E5i205Y9DG53S
- 4YcRkutQ2akmtD7ujBi7/bsp5FpgDlER5IP2lUq0Qo6cH0ZQvwjrC3OR3M63YUDE
- yThJrNsdBGR5bKVg4LGgeI48V29YLhcc8p18MgqbrXULdAfe2zFnsJ16pOLuxnNJ
- OSvVPe7U5IPMKxSfiA0jYNn8r74efXQL1EPdG/3Og1R9h0EnZRCiFMpczwOYacEl
- ewIDAQAB
- -----END PUBLIC KEY-----
- EOD;
- // dump($publicKey, $public_key1);
- $signString = $this->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;
- }
- }
|