华为:
被华为坑得最多,都是血与泪。
登录支付的签名:
官方文档是这样写的
我按照文档的方式生成的签名一直报签名错误,各种方法都试了,最后尝试没有urlencode,结果验签通过了,文档坑人啊~
/** * 华为签名 */ public function huaweiSign($params, $secret) { $sign_str = ""; ksort($params); foreach ($params as $key => $value) { $value = urlencode($value); $sign_str = $sign_str . $key . "=" . $value . "&"; } $sign_str = substr($sign_str, 0, -1); $res = "-----BEGIN RSA PRIVATE KEY-----\n" . wordwrap($secret, 64, "\n", true) . "\n-----END RSA PRIVATE KEY-----"; $private_key = openssl_pkey_get_private($res); openssl_sign($sign_str, $sign, $private_key, OPENSSL_ALGO_SHA256); $sign = base64_encode($sign); openssl_free_key($private_key); return $sign; }
下单签名:
华为下单的时候也需要签名,这个地方又是一个坑,一开始按照上面的方法生成的签名还是有错,文档都看几遍,然后发现下单的参数里有一个urlVer参数,文档这样写
因为我一直没转换,所以签名总是不通过,这个地方不能怪文档,只能怪自己没看仔细。
小米:
登录签名,本来参数按字母顺序排序,但我刚好按照那个顺序排,就省略了这步:
$app_key = $union_config[‘app_secret‘]; //key $login_url = ‘http://mis.migc.xiaomi.com/api/biz/service/loginvalidate‘; $request_params = [ ‘appId‘ => $union_config[‘app_id‘], ‘session‘ => $open_key, ‘uid‘ => $open_id, ]; $sign_str = http_build_query($request_params); $request_params[‘signature‘] = hash_hmac(‘sha1‘,$sign_str, $app_key, false);
支付签名,发过来的参数是encode,所以这里要decode:
//验签 $app_secret = $union_config[‘app_secret‘]; $request_signature = $params[‘signature‘]; unset($params[‘signature‘]); ksort($params); $sign_str = urldecode(http_build_query($params)); $self_signature = hash_hmac(‘sha1‘,$sign_str, $app_secret, false); if ($request_signature != $self_signature){ $result[‘errcode‘]=‘1525 ‘; $result[‘errMsg‘]=‘签名错误‘; return $result; }
vivo的没踩什么坑,签名方法也比较简单。