前段時(shí)間項(xiàng)目H5 應(yīng)用要上架到第三方的小程序每庆,請(qǐng)求對(duì)方的接口實(shí)現(xiàn)用戶單點(diǎn)登入。接口要求參數(shù)鑒權(quán)自点,用摘要算法‘hmac-sha256’對(duì)參數(shù)進(jìn)行簽名韩脏,對(duì)方提供示例代碼用java 實(shí)現(xiàn)的,因此得用php 把對(duì)方程序翻譯一遍窒升。
簡(jiǎn)單描述一下參數(shù)的鑒權(quán)方式缀遍,首先第三方分配給
- ak,accessKey
- sk饱须,secretKey
- appid域醇,上架應(yīng)用的appid
請(qǐng)求接口時(shí)要求在header 里面帶上如下四個(gè)參數(shù),簡(jiǎn)化如下:
header name | desc |
---|---|
signature | 參數(shù)簽名得到的字符串蓉媳,hmax_sha256_hex(sk, signing_str) |
algorithm | 簽名摘要算法 hmac-sha256 |
access_key | ak |
date_time | 日期歹苦,服務(wù)端允許客戶端請(qǐng)求最大時(shí)間誤差為100s |
參與簽名的字符串signing_str 是由接口請(qǐng)求方式、請(qǐng)求uri督怜、date_time殴瘦、請(qǐng)求參數(shù)組合而成的。為了方便調(diào)試看翻譯后雙方得到簽名串是否相同号杠,運(yùn)行對(duì)方提供的java 程序蚪腋。還手動(dòng)導(dǎo)入了javax.xml.bind.jar 包
java
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
public class test {
public static void main(String[] args) {
try {
String secretKey = "sk";
String signatureStr = "POST\nuri\nparams\nak\ndate_time\n";
Mac hasher = Mac.getInstance("HmacSHA256");
hasher.init(new SecretKeySpec(secretKey.getBytes(), "HmacSHA256"));
byte[] hash = hasher.doFinal(signatureStr.getBytes());
// to lowercase hexits
DatatypeConverter.printHexBinary(hash);
// to base64
String sign = DatatypeConverter.printBase64Binary(hash);
System.out.println("signature:");
System.out.println(sign);
} catch (Exception e) {
}
}
}
輸出signature
sLsZpv5kzZ+NDxby0/mAJ5+EsV5rGG+dmSSHWXChOoE=
php 翻譯代碼
$sk = "sk";
$signingStr = "POST\nuri\nparams\nak\ndate_time\n";
$signature = base64_encode(
hash_hmac(
'sha256',
$signingStr,
$sk,
true
)
);
輸出signature
sLsZpv5kzZ+NDxby0/mAJ5+EsV5rGG+dmSSHWXChOoE=
說(shuō)明PHP翻譯簽名程序正確