# 统一鉴权

# 设置请求头信息

开发者调用OPEN-API时,需要设置为设定指定的头信息,才能通过统一鉴权,请求头信息包括

字段名 描述 示例 备注
SAppId 小程序ID 1234567890abcdefg
time 当前时间戳(毫秒) 1608543261000 与生成签名(checkSum)中的time字段保持一致
nonce 长度为16位的随机字符串 Bv6euA3ftFcQ&$Up
checkSum 签名(需使用小程序秘钥生成签名,详情见下述) eceae35d9a3fb45660a9a103dea1783c

设置请求头信息示例

  1. 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();
  1. 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();

# 生成签名

  1. 签名生成规则:小程序ID+时间戳+随机字符串+url参数(没有则空)+请求体JSON字符串(没有则用空串)+小程序秘钥
  2. 将上述结果用MD5进行加密
  3. 将上述结果转成16进制字符串,得到最终的签名(传进checkSum字段)
  4. 生成签名示例(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
  1. 生成签名示例(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