加密步骤:
签名说明及实例
1 假设用户apisecret为78FBB3D68B40A347644619ACF902CED3,请求入参如下:
{
"apiKey" : "test1",
"timestamp" : '20171211103331',
"data" :
{
"lineId" : "10194",
"entityId" : "329620"
}
}
2 首先,我们要按照key值首字母排序,并去掉value为空的,得到以下参数:
{
"apiKey" : "test1",
"data" :
{
"lineId" : "10194",
"entityId" : "329620"
},
"timestamp" : "20171211103331",
}
3 将参数名、参数值依次拼接在一起:
apiKey=test1&data={"lineId":"10194","entityId":"329620"}×tamp=20171211103331
4 在开头加上apisecret:
78FBB3D68B40A347644619ACF902CED3&apiKey=test1&data={"lineId":"10194","entityId":"329620"}×tamp=20171211103331
5 进行MD5加密,并将结果全部转为大写,获得签名值:
A07176FF3A27658457444708C0CE59DF
6 签名生成结束,请求入参变为:
{
"apiKey" : "test1",
"apisecret" : "78FBB3D68B40A347644619ACF902CED3",
"currentTimeStamp" : "20171211103331",
"sign" : "A07176FF3A27658457444708C0CE59DF",
"uri" : "http://xxx.com/tours/productdetail",
"data" :
{
"lineId" : "10194",
"entityId" : "329620"
}
}
C# Demo:
.net版生成签名工具类
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
namespace ConsoleApplication1
{
public class Signature
{
public string GetSign(IDictionary<string, string> parameters, string secret)
{
// 第一步:把字典按Key的字母顺序排序
IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters);
IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator();
// 第二步:把所有参数名和参数值串在一起
StringBuilder query = new StringBuilder(secret);
while (dem.MoveNext())
{
string key = dem.Current.Key;
string value = dem.Current.Value;
if (!string.IsNullOrEmpty(key))// && !string.IsNullOrEmpty(value) 空值也加入计算!!
{
query.Append(key).Append(value);
}
}
// 第三步:使用MD5加密
MD5 md5 = MD5.Create();
byte[] bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(query.ToString()));
// 第四步:把二进制转化为大写的十六进制
StringBuilder result = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
result.Append(bytes[i].ToString("X2"));
}
return result.ToString();
}
}
}
class Program
{
public static void Main(string[] args)
{
string apiKey = "test1";
string timestamp = DateTime.Now.ToString("yyyyMMddHHmmss");
string data = "\"lineId\":\"10194\",\"entityId\":\"329620\"";
string version = "1";
string secret = "78FBB3D68B40A347644619ACF902CED3";
IDictionary<string, string> parameters = new Dictionary<string, string>();
parameters.Add("apiKey", apiKey);
parameters.Add("timestamp", timestamp);
parameters.Add("version", version);
parameters.Add("data", data);
Signature sign = new Signature();
string resultSign = sign.GetSign(parameters, secret);
Console.WriteLine(resultSign);
}
}
PHP Demo:
/**
* 创建签名
*/
function create_sign($data,$timestamp){
$sign['apiKey']="you apiKey";
$sign['version']="v1";
$sign['data']=json_encode($data);
$sign['timestamp']=$timestamp;
ksort($sign);
$signstr="you secreet";
foreach($sign as $k=>$v){
$signstr.=$k.$v;
}
return mb_strtoupper(md5($signstr));
}
/**
* 通用请求方法
*/
function query($postdata,$url){
// 时间戳
$t=date('YmdHis');
// 调用签名方法
$sign=$this->create_sign($postdata,$t);
$pd=[
'apiKey'=>"you apiKey",
'version'=>"v1",
'data'=>json_encode($postdata),
'timestamp'=>$t,
'sign'=>$sign
];
// curl方法请求。具体方法请自行撰写
$curldata =curl($url,json_encode($pd));
}