当前位置:项目开发->项目经验 ->项目开发中,我们总能遇到的那么些坑,不仅是代码上的,还有第三方接口的

原创版权标志项目开发中,我们总能遇到的那么些坑,不仅是代码上的,还有第三方接口的

作者:阿郎  发表时间:2017/12/28 8:45:41  阅读:
[摘要] 手动与自动写Json的问题以及项目开发中浏览器的选择
今天测试移动给的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 == ' ');
 }
 }
 要不然,我是不好下手。

    

文章来源:C++技术网原创文章版权为网站和作者共同所有,会员文章禁止转载。非会员文章转载做好本文超链接即表示授权转载。通过文章下面的分享按钮可以自由分享所有文章。

返回顶部

在线提问
问题标题:
问题描述:(简陋的描述会导致问题被最后回答、没有针对性回答甚至无法解答。请确保问题描述的足够清楚。)