вот мой код подписи c #
using System; using System.Text; public class Test { public static void Main() { string str; string syskey = "123456789"; str = GenSignature(syskey,"foo","20170426001757"); Console.WriteLine(str); } public static string GenSignature(string syskey,params string[] paramValues) { string source = ""; for (int i = 0; i < paramValues.Length; i++) { if (!string.IsNullOrEmpty(paramValues[i])) { source += (string.IsNullOrEmpty(source) ? "" : "&") + paramValues[i]; } } if (string.IsNullOrEmpty(source)) { return ""; } source += "&" + syskey; // Debug.WriteLine(source); using (System.Security.Cryptography.MD5 m = System.Security.Cryptography.MD5.Create()) { byte[] hashData = m.ComputeHash(UTF8Encoding.UTF8.GetBytes(source)); return BitConverter.ToString(hashData).Replace("-", "").ToUpper(); } } }
и код подписи php ниже:
function getSignature() { $syskey = "123456789"; $sysCode = "foo"; $timeStamp = "20170426001757"; $str = "&".$sysCode."&".$timeStamp."&".$syskey; return strtoupper(md5($str)); } echo getSignature();
Я не знаю, c # очень хорошо, но результат, который я получаю, совершенно другой, знал ли кто-нибудь два языка и рассказывал мне что-то, спасибо.
В примере PHP вы добавляете каждую часть с амперсандом ( &
), однако в версии C # вы добавляете каждую часть, кроме первой:
source += (string.IsNullOrEmpty(source) ? "" : "&") + paramValues[i];
string.IsNullOrEmpty(source)
вернет true
с первого раза, поскольку вы первоначально установили source
в ""
, поэтому амперсанд не будет добавлен в самом начале строки.
Измените свой код на это, и он должен работать:
source += "&" + paramValues[i];
Онлайн-тест: https://dotnetfiddle.net/KhoFtL