上周接了阿里的短信服务,有2种方式,引入SDK和拼接URL。
1.SDK
项目框架要4.0以上的,如果时3.5的目标框架就只能用http拼URL了。
开始搜索导入包,报错:
我们项目框架用的4.0,所以不兼容,后面重新找了个4.0的sdk 单独引用到项目。
用阿里官方的DEMO 最后测试通过。
2.http
这个公开的demo是java版的,用C#写了一版,遇到很多问题。
(1) C#默认排序:
参数拼接后生成签名,顺序不能错,默认排序不分大小写,导致“SignName”参数位置错了,大写'N'字母ascii码表应该在小写'a'前面才对。
var list = keyValues.OrderBy(o => o.Key);
换了个规则,不用默认的排序,就对上了。
var list = keyValues.OrderBy(o => o.Key,StringComparer.Ordinal);
(2) C#URL编码:
url编码后,字母是小写的,其他的服务器可能是大写的,生成签名时也会不一致。
对需要编码的字符再转一次大写。
public static string UrlEncode1(string str) { StringBuilder builder = new StringBuilder(); foreach (char c in str) { if (HttpUtility.UrlEncode(c.ToString()).Length > 1) { builder.Append(HttpUtility.UrlEncode(c.ToString()).ToUpper()); } else { builder.Append(c); } } //Console.WriteLine(builder.ToString()); return builder.ToString().Replace("+", "%20").Replace("*", "%2A").Replace("%7E", "~"); }
公开的文档不友好,主要遇到这2个坑,折腾了很久最后也没弄好,放个实现好了的链接:
https://blog.csdn.net/wangyijie521/article/details/79030841
总结:由于各服务器的一些细微差别,对接3方API可能就会遇到各种问题,最好还是用SDK方式,简单快捷快速实现功能,缺点就是要引入很多包。