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

2021-08-18  本文已影响0人  码农工号9527

通过游戏大厅 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字段过滤掉。

上一篇 下一篇

猜你喜欢

热点阅读