# 统一鉴权
# 设置请求头信息
开发者调用OPEN-API时,需要设置为设定指定的头信息,才能通过统一鉴权,请求头信息包括
字段名 | 描述 | 示例 | 备注 |
---|---|---|---|
SAppId | 小程序ID | 1234567890abcdefg | |
time | 当前时间戳(毫秒) | 1608543261000 | 与生成签名(checkSum)中的time字段保持一致 |
nonce | 长度为16位的随机字符串 | Bv6euA3ftFcQ&$Up | |
checkSum | 签名(需使用小程序秘钥生成签名,详情见下述) | eceae35d9a3fb45660a9a103dea1783c |
设置请求头信息示例
- Java方式设置示例
URL url = new URL(OPEN_API_URL);
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("SAppId", "1234567890abcdefg");
urlConnection.setRequestProperty("time", "1588856462488");
urlConnection.setRequestProperty("nonce", "ChznWTauSiMAawfx");
urlConnection.setRequestProperty("checkSum", "eceae35d9a3fb45660a9a103dea1783c");
urlConnection.connect();
- NodeJS方式设置示例
var Crypto = require('CryptoJS').Crypto
var http = require('http');
var querystring = "key=value&key2=value2";
var body_values = {
"param_name1": "param_value1",
"param_name2": "param_value2",
};
var postBody = JSON.stringify(body_values);
var time = "1588856462488";
var nonce = "ChznWTauSiMAawfx";
var appId = "1234567890abcdefg";
var secretKey = "1234567890zxcvbnm";
var toSignStr = appId + time + nonce + querystring + postBody + secretKey;
var sign = Crypto.MD5(toSignStr, "UTF-8").toString();
var options = {
hostname: 'OPEN_API_DOMAIN', //域名
path: '/fxservice/miniprogram/open/xxxx' + '?' + querystring, //接口uri
method: 'POST', //post请求示例
headers: {
'SAppId': appId,
'time': time,
'nonce': nonce,
'checkSum': sign,
'Content-Type': "application/json" //post请求示例
},
};
var req = http.request(options, function (res) {
res.setEncoding('utf8');
res.on('data', function (data) {
console.log('BODY: ' + data);
});
});
req.write(postBody);
req.end();
# 生成签名
- 签名生成规则:
小程序ID+时间戳+随机字符串+url参数(没有则空)+请求体JSON字符串(没有则用空串)+小程序秘钥
- 将上述结果用MD5进行加密
- 将上述结果转成16进制字符串,得到最终的签名(传进checkSum字段)
- 生成签名示例(Java版)
//设置POST参数(非POST方式可留空)
JSONObject param = new JSONObject();
param.put("param_name1", "param_value1");
param.put("param_name2", "param_value2");
//请求参数(GET方式)
String queryString = "key=value&key2=value2";
//设置签名参数
String time = "1588856462488";
String nonce = "ChznWTauSiMAawfx";
String appId = "1234567890abcdefg";
String secretKey = "1234567890zxcvbnm";
String toSignString = appId + time + nonce + queryString + param.toString() + secretKey;
//使用MD5生成签名
MessageDigest digest = MessageDigest.getInstance("MD5");
byte[] signBytes = toSignString.getBytes("UTF-8");
digest.update(signBytes);
String sign = bytesToHexString(digest.digest()); //转成16进制字符串
//最终生成的签名:e9a4bf4ba3f8fa7f224c524f6cbf688c
- 生成签名示例(NodeJS版)
//nodejs生成签名方式
var Crypto = require('CryptoJS').Crypto
//设置POST参数(非POST方式可留空)
var body_values = {
"param_name1": "param_value1",
"param_name2": "param_value2",
};
//请求参数(GET方式)
var querystring = "key=value&key2=value2";
var postBody = JSON.stringify(body_values);
//设置签名参数
var time = "1588856462488";
var nonce = "ChznWTauSiMAawfx";
var appId = "1234567890abcdefg";
var secretKey = "1234567890zxcvbnm";
var toSignStr = appId + time + nonce + querystring + postBody + secretKey;
//使用MD5生成签名
var sign = Crypto.MD5(toSignStr, "UTF-8").toString();
//最终生成的签名:e9a4bf4ba3f8fa7f224c524f6cbf688c