签名生成
相关信息
VMP 要求客户端对请求进行签名。VMP 会在收到请求后进行签名的验证。
开发人员可以按照下述步骤生成请求的签名。
准备
客户端需要准备一组 user_confirm_key
和 secret_code
,可以通过以下方式获取:
- 发送邮件到对接联系人邮箱
构造签名串
假设请求参数
{
"p0": "c",
"p2": "b",
"p1": "a"
}
假设 secret_code
testsignkey1234
第一步,按照参数名ASCII字典序排序。
{
"p0": "c",
"p1": "a",
"p2": "b"
}
第二步,对参数按照key=value的格式,使用 &
符号连接生成字符串。
p0=c&p1=a&p2=b
第三步,secret_code
不用 &
符号连接,拼接在上一步生成的字符串开头组成签名串。
testsignkey1234p0=c&p1=a&p2=b
计算签名值
对签名串进行sha-256签名得到签名值,编码格式UTF-8
。
sha256('testsignkey1234p0=c&p1=a&p2=b', 'UTF-8');
签名结果
ed473ec9e423747a40b87403aa9814030861932d514dab000ed1f8a741f1d6df
构造完整的请求参数
把签名值添加到请求参数中,组成完整的请求参数。
{
"p0": "c",
"p2": "b",
"p1": "a",
"sign": "ed473ec9e423747a40b87403aa9814030861932d514dab000ed1f8a741f1d6df"
}
演示代码
import net.sf.json.JSONObject;
import org.junit.Assert;
import org.junit.Test;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
public class SignTest {
@Test
public void doSign() throws Exception {
JSONObject requestParams = new JSONObject();
requestParams.put("p0", "c");
requestParams.put("p2", "b");
requestParams.put("p1", "a");
String secretCode = "testsignkey1234";
String asciiLinkString = createAsciiLinkString(requestParams);
System.out.println(asciiLinkString);
String signTempString = secretCode + asciiLinkString;
System.out.println(signTempString);
String signCode = sha256(signTempString, "UTF-8");
System.out.println(signCode);
requestParams.put("sign", signCode);
}
private String createAsciiLinkString(JSONObject params) {
List<String> keys = new ArrayList();
keys.addAll(params.keySet());
Collections.sort(keys);
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < keys.size(); i++) {
stringBuffer.append(keys.get(i)).append("=").append(params.get(keys.get(i)));
if (i != keys.size() - 1) {
stringBuffer.append("&");
}
}
return stringBuffer.toString();
}
private String sha256(String signTempString, String charset)
throws UnsupportedEncodingException, NoSuchAlgorithmException {
byte[] bt = signTempString.getBytes(charset);
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(bt);
byte[] r = md.digest();
return bytes2Hex(r);
}
private String bytes2Hex(byte[] bts) {
String des = "";
for (int i = 0; i < bts.length; i++) {
String tmp = (Integer.toHexString(bts[i] & 0xFF));
if (tmp.length() == 1) {
des += "0";
}
des += tmp;
}
return des;
}
}