今天測試移動給的SIM卡介面,昨天就發現給的介面url有問題,說是用WebService,但我愣是沒有看到asmx的url介面路徑啊(我是用.net開發的),結果自己測試了一下,果然有問題,就開始聯繫移動的對接人,嗯,好吧,果然是介面文檔沒有給全。隨後給了介面文檔,但是!!!沒有demo,好不容易有 ...
今天測試移動給的SIM卡介面,昨天就發現給的介面url有問題,說是用WebService,但我愣是沒有看到asmx的url介面路徑啊(我是用.net開發的),結果自己測試了一下,果然有問題,就開始聯繫移動的對接人,嗯,好吧,果然是介面文檔沒有給全。隨後給了介面文檔,但是!!!沒有demo,好不容易有個代碼了是為了演示數字簽名如何生成的,演算法是HmacSHA256,還特麽是java寫的的,而且還是直接調用包來處理的!!!特麽坑死了,一開始自己上網找了C#的HmacSHA256實現,FCL裡面有這個類庫,但是沒有一開始自己沒有好好看生成數字簽名的過程,導致隨後的裝逼失敗。就找對接人要了一份C#的代碼,更坑!!!他給我的C#代碼是好幾個類組合的,直接一股腦給我了,而且裡面的函數都重定義了,一堆錯,還好我C#基礎可以,自己挨個分析,找錯。最後解決了。不過因為兩個小問題,卡了半天,其一就是json,我給移動的介面url post的參數是json格式的,我一開始覺得參數少,就沒有在意,直接就是手動寫了json,誰知道就出錯在這裡!拼接的json串中間有空格!導致,移動給我的response一直都是: 數字簽名有問題,給我氣的,我嫌用第三方json麻煩,還要自己弄個類,之後經理跟我說,匿名類啊,哎呀,對啊。忘了它,最後使用匿名類,傳入第三方json解決問題。其二就是瀏覽器了,我一開始直接把移動給的url用瀏覽器方法,誰知道彈出下載框,註意我用的是QQ瀏覽器,同事也試了,他可以接到返回值,他用的是谷歌,後來我換了瀏覽器就可以啦,因此,在這裡建議,開發的話,還是多用幾個瀏覽器,最好谷歌。
剩下的就是數字簽名了,但也沒有什麼,最終重要的就是: 密鑰appKey每兩位長度轉為10進位,然後再轉為位元組數組,整個數組為加密密鑰
其實,我看數字簽名的生成過程是崩潰的,還好這步,對接人給我的C#代碼裡面有,我就直接用了。給個代碼吧:
class DESEncrypt { public static int decode(String paramString, MemoryStream paramOutputStream) { byte[] encodingTable = { 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102 }; //byte[] decodingTable = new byte['?']; byte[] decodingTable = new byte[256]; for (int i = 0; i < encodingTable.Length; i++) { decodingTable[encodingTable[i]] = (byte)i; } decodingTable[65] = decodingTable[97]; decodingTable[66] = decodingTable[98]; decodingTable[67] = decodingTable[99]; decodingTable[68] = decodingTable[100]; decodingTable[69] = decodingTable[101]; decodingTable[70] = decodingTable[102]; int k = 0; int m = 0; for (m = paramString.Length; (m > 0) && (ignore(char.Parse(paramString.Substring(m - 1, 1)))); m--) ; int n = 0; while (n < m) { while ((n < m) && (ignore(char.Parse(paramString.Substring(n, 1))))) n++; int i = decodingTable[char.Parse(paramString.Substring(n++, 1))]; while ((n < m) && (ignore(char.Parse(paramString.Substring(n, 1))))) n++; int j = decodingTable[char.Parse(paramString.Substring(n++, 1))]; paramOutputStream.WriteByte((byte)(i << 4 | j)); k++; } return k; } public static bool ignore(char paramChar) { return (paramChar == '\n') || (paramChar == '\r') || (paramChar == '\t') || (paramChar == ' '); } }