華為:
被華為坑得最多,都是血與淚。
登錄支付的簽名:
官方文檔是這樣寫的

我按照文檔的方式生成的簽名一直報簽名錯誤,各種方法都試了,最后嘗試沒有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的沒踩什么坑,簽名方法也比較簡單。
