加密步骤:

签名说明及实例
1 假设用户apisecret为78FBB3D68B40A347644619ACF902CED3,请求入参如下:

  1. {
  2. "apiKey" : "test1",
  3. "timestamp" : '20171211103331',
  4. "data" :
  5. {
  6. "lineId" : "10194",
  7. "entityId" : "329620"
  8. }
  9. }

2 首先,我们要按照key值首字母排序,并去掉value为空的,得到以下参数:

  1. {
  2. "apiKey" : "test1",
  3. "data" :
  4. {
  5. "lineId" : "10194",
  6. "entityId" : "329620"
  7. },
  8. "timestamp" : "20171211103331",
  9. }

3 将参数名、参数值依次拼接在一起:

  1. apiKey=test1&data={"lineId":"10194","entityId":"329620"}&timestamp=20171211103331

4 在开头加上apisecret:

  1. 78FBB3D68B40A347644619ACF902CED3&apiKey=test1&data={"lineId":"10194","entityId":"329620"}&timestamp=20171211103331

5 进行MD5加密,并将结果全部转为大写,获得签名值:

  1. A07176FF3A27658457444708C0CE59DF

6 签名生成结束,请求入参变为:

  1. {
  2. "apiKey" : "test1",
  3. "apisecret" : "78FBB3D68B40A347644619ACF902CED3",
  4. "currentTimeStamp" : "20171211103331",
  5. "sign" : "A07176FF3A27658457444708C0CE59DF",
  6. "uri" : "http://xxx.com/tours/productdetail",
  7. "data" :
  8. {
  9. "lineId" : "10194",
  10. "entityId" : "329620"
  11. }
  12. }

C# Demo:

.net版生成签名工具类

  1. using System.Collections.Generic;
  2. using System.Security.Cryptography;
  3. using System.Text;
  4. namespace ConsoleApplication1
  5. {
  6. public class Signature
  7. {
  8. public string GetSign(IDictionary<string, string> parameters, string secret)
  9. {
  10. // 第一步:把字典按Key的字母顺序排序
  11. IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters);
  12. IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator();
  13. // 第二步:把所有参数名和参数值串在一起
  14. StringBuilder query = new StringBuilder(secret);
  15. while (dem.MoveNext())
  16. {
  17. string key = dem.Current.Key;
  18. string value = dem.Current.Value;
  19. if (!string.IsNullOrEmpty(key))// && !string.IsNullOrEmpty(value) 空值也加入计算!!
  20. {
  21. query.Append(key).Append(value);
  22. }
  23. }
  24. // 第三步:使用MD5加密
  25. MD5 md5 = MD5.Create();
  26. byte[] bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(query.ToString()));
  27. // 第四步:把二进制转化为大写的十六进制
  28. StringBuilder result = new StringBuilder();
  29. for (int i = 0; i < bytes.Length; i++)
  30. {
  31. result.Append(bytes[i].ToString("X2"));
  32. }
  33. return result.ToString();
  34. }
  35. }
  36. }
  37. class Program
  38. {
  39. public static void Main(string[] args)
  40. {
  41. string apiKey = "test1";
  42. string timestamp = DateTime.Now.ToString("yyyyMMddHHmmss");
  43. string data = "\"lineId\":\"10194\",\"entityId\":\"329620\"";
  44. string version = "1";
  45. string secret = "78FBB3D68B40A347644619ACF902CED3";
  46. IDictionary<string, string> parameters = new Dictionary<string, string>();
  47. parameters.Add("apiKey", apiKey);
  48. parameters.Add("timestamp", timestamp);
  49. parameters.Add("version", version);
  50. parameters.Add("data", data);
  51. Signature sign = new Signature();
  52. string resultSign = sign.GetSign(parameters, secret);
  53. Console.WriteLine(resultSign);
  54. }
  55. }

PHP Demo:

  1. /**
  2. * 创建签名
  3. */
  4. function create_sign($data,$timestamp){
  5. $sign['apiKey']="you apiKey";
  6. $sign['version']="v1";
  7. $sign['data']=json_encode($data);
  8. $sign['timestamp']=$timestamp;
  9. ksort($sign);
  10. $signstr="you secreet";
  11. foreach($sign as $k=>$v){
  12. $signstr.=$k.$v;
  13. }
  14. return mb_strtoupper(md5($signstr));
  15. }
  16. /**
  17. * 通用请求方法
  18. */
  19. function query($postdata,$url){
  20. // 时间戳
  21. $t=date('YmdHis');
  22. // 调用签名方法
  23. $sign=$this->create_sign($postdata,$t);
  24. $pd=[
  25. 'apiKey'=>"you apiKey",
  26. 'version'=>"v1",
  27. 'data'=>json_encode($postdata),
  28. 'timestamp'=>$t,
  29. 'sign'=>$sign
  30. ];
  31. // curl方法请求。具体方法请自行撰写
  32. $curldata =curl($url,json_encode($pd));
  33. }