En un proyecto para utilizar la firma algoritmo, la interfaz se escribe así:
5.1.1 Parámetros de entrada Método = openapi.stockout.create marca de tiempo = 2015 - 04 - 26 es 00 : 00 : 07 el formato = XML app_key = testerp_appkey V = 2,0 sign_method = MD5 la customerId = Prueba 5.1.2 ascendente alfabético. app_key = testerp_appkey la customerId = cust- Stub- código de formato = XML Método = openapi.stockout.create sign_method = MD5 marca de tiempo = 2015 - 04 - 26 es 00 : 00 : 07 V = 2.0 5.1.3 Cadena de conexión. nombres de los parámetros de conexión y valores de parámetros, y incluido más secretas, supone aquí Secret = Test, como sigue: testapp_keytesterp_appkeycustomerIdstub - cust- codeformatxmlmethod openapi.stockout.createsign_methodmd5timestamp2015 - 04 - 26 es 00 : 00 .: 07v2 0 organismo de prueba en el que: el cuerpo con los datos de cuerpo de solicitud lugar . 5.1.4 generar la firma sesión 32 mayúsculas valor MD5 ->D06D88CB34B2EC0E5C9BAB396C9542B6 5.1.5 . Montaje de la petición de URL para convertir todos los valores de parámetros UTF -8 codifican , a continuación, montado, y la codificación URL de la siguiente manera: HTTP: // sandbox.vwms.cn/open/service?method= opeanapi.stockout.create y marca de tiempo = el año 2015 - 04 - 26 de % 2000 : 00 : 07 y = formato XML y app_key = testerp_appkey & v = 2.0 & Sign = D06D88CB34B2EC0E5C9B AB396C9542B6 y sign_method = MD5 y customerId Trozo-Cust-código =
La práctica es la siguiente:
// timestamp cadena de marca de tiempo = DateTime.Now.ToString (); Jobject O = nueva jobject ( nueva JProperty ( " app_key " , _Setting.Value.app_key.ToString ()), nueva JProperty ( " customerId " , _Setting.Value.customerId.ToString ()), nueva JProperty ( " formato " , " xml " ), nuevo JProperty ( " método ", " Openapi.singleitem.synchronize " ), nueva nuevo JProperty ( " sign_method " , " MD5 " ), nueva nuevo JProperty ( " marca de tiempo " , marca de tiempo), nueva nuevo JProperty ( " V " , " 2.0 " ) ); // put anteriormente ordenar cadena S = JsonConvert.SerializeObject (O); el Diccionario <cuerda, String > valores = JsonConvert.DeserializeObject <Dictionary < string , string >> (s); cadena Sort_Ret = CommonData.GetSignature (valores, "" ); // 拼接URL链接 cadena secreta = _Setting.Value.secret; cadena de sesión = CommonData.StrToMD5 (+ secreta Sort_Ret + + IN0 secreta); string url = "" + _Setting.Value.UrlApi.ToString () + " ? " + " method = "openapi.singleitem.synchronize " + " y timestamp = " + timestamp + "" + " y format = xml " + " y app_key = " + _Setting.Value.app_key.ToString () + "" + " & v = 2,0 " + " y signo = " signo + + "" + " y sign_method = MD5 " + "Y customerId = "_Setting.Value.customerId.ToString + () + "" ; // enviar solicitud HTTP HttpClient Cliente = httpClientFactory.CreateClient (); HttpContent contenido = new nuevo objeto StringContent, (IN0, Encoding.UTF8 , "archivo application / JSON"); // El propiedad de UTF-8 codificada var RET = la await client.PostAsync (URL, contenido); var RR = la await ret.Content.ReadAsStringAsync ();
El método utilizado, es una especie de un valor de signo se obtiene
pública estática Cadena GetSignature (el IDictionary < Cadena , Cadena > Parámetros, Cadena Secreto) { // primer parámetro tipo lexicográfico ascendente su nombre del parámetro del IDictionary < Cadena , Cuerda > = sortedParams nueva nueva del SortedDictionary < cadena , cadena > (parámetros) ; el IEnumerator <KeyValuePair < cuerdas , cuerdas >> iterador = sortedParams.GetEnumerator (); // atravesar el diccionario ordenadas, todos los parámetros como los formatos "keyvaluekeyvalue" se empalman juntos StringBuilder basestring =nuevo StringBuilder (); mientras que (iterator.MoveNext ()) { string clave = iterator.Current.Key; cadena de valor = iterator.Current.Value.ToString (); si (! cadena .IsNullOrEmpty (clave) && valor =! nula ) { basestring.Append (clave) .Append (valor); } } // 使用MD5对待签名串求签 // cadena upperCaseStr = StrToMD5 (basestring.ToString ()); // cadena resultado = StrToMD5 (+ secreta upperCaseStr); volver basestring.ToString (); } Pública estática cadena StrToMD5 ( string str) { byte [] = datos Encoding.UTF8.GetBytes (str); MD5 md5 = nuevo MD5CryptoServiceProvider (); byte [] OutBytes = md5.ComputeHash (datos); cadena OutString = "" ; para ( int i = 0 ; i <OutBytes.Length; i ++ ) { OutString + = OutBytes [i] .ToString ( " x2" ); } Volver OutString.ToUpper (); } pública estática DateTime GetLocalTime ( cadena StandardTime) { var ChTimeZone = TimeZoneInfo.FindSystemTimeZoneById (StandardTime); DateTime ChTime = TimeZoneInfo.ConvertTime (DateTime.Now, TimeZoneInfo.Local, ChTimeZone); regreso ChTime; }