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 )、orderNo
、timestamp
进行签名算法生成返回。签名规则,跟"统一下单接口"的签名规则一致。pkgName
在minPlatformVersion>=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
字段过滤掉。