美文网首页
oppo小游戏 PHP签名算法生成与检验

oppo小游戏 PHP签名算法生成与检验

作者: 码农工号9527 | 来源:发表于2021-08-18 15:15 被阅读0次

    通过游戏大厅 Token 获取用户信息签名生成步骤

        /**
         * 登陆签名生成
         * @param $query_params
         * @param $app_key
         * @param $app_secret
         * @return string
         */
        private function loginSign($query_params, $app_key, $app_secret) :string
        {
            $query_params['appKey'] = $app_key;
            $query_params['appSecret'] = $app_secret;
            ksort($query_params);
            $query_arr = [];
            foreach ($query_params as $k => $v) $query_arr[] = "$k=$v";
            $query_str = implode('&', $query_arr);
            return strtoupper(md5($query_str));
        }
    

    统一下单签名算法

        /**
         * 统一下单签名
         * @param $query_params
         * @param $app_secret
         * @return string
         */
        private function placeOrderSign($query_params, $private_key) : string
        {
            ksort($query_params);
            $query_arr = [];
            foreach ($query_params as $k => $v) {
                if(empty($v)) continue;
                $query_arr[] = "$k=$v";
            }
            $query_str = implode('&', $query_arr);
            $private_key = "-----BEGIN RSA PRIVATE KEY-----\n".wordwrap($private_key, 64, "\n", true)."\n-----END RSA PRIVATE KEY-----";
            $key = openssl_get_privatekey($private_key);
    
            openssl_sign($query_str, $signature, $key, "SHA256");
            openssl_free_key($key);
            return base64_encode($signature);
        }
    

    其中,发起支付参数信息如下:


    paySign由 CP 服务端使用 appKey (不是 appId )、orderNotimestamp 进行签名算法生成返回。签名规则,跟"统一下单接口"的签名规则一致。 pkgNameminPlatformVersion>=1040可以不传,此接口向下兼容,不会影响老版本的使用,他的生成规则可以直接使用上面的统一下单算法生成,只不过传入的参数只需要他特定的几个参数了。

    支付结果通知验证签名

        private function payCallBackSign($query_params, $public_key)
        {
            ksort($query_params);
            $query_arr = [];
            foreach($query_params as $k => $v){
                if($k == 'sign' or $k == 'userId' ) continue;
                $query_arr[] = $k.'='.$v;
            }
            $query_str = implode('&', $query_arr);
    
            
            $public_key = "-----BEGIN PUBLIC KEY-----\n" .
                wordwrap($public_key, 64, "\n", true) .
                "\n-----END PUBLIC KEY-----";
    
            $key = openssl_get_publickey($public_key);
            $signature =base64_decode($query_params['sign']);
            $ok = openssl_verify($query_str,$signature, $key, 'SHA256');
            openssl_free_key($key);
            return $ok;
        }
    

    在这里遇到了一个坑,oppo小游戏回调会多传了个userId字段,以为只要sign排除在检验的字符串外面来着,后来问了他们技术才知道,所以$query_str在处理时需要把userId字段过滤掉。

    相关文章

      网友评论

          本文标题:oppo小游戏 PHP签名算法生成与检验

          本文链接:https://www.haomeiwen.com/subject/dzpgbltx.html