しばらく前に、その会社でSMS通知を使うプロジェクトがあり、そこでSMSインターフェース開発のためにAlibaba Cloud SMSを購入しました。 しかし、プロジェクトはXPシステム上で動いているので、プロジェクトは.NET3.5のフレームワークであるはずですが、Alibabaが提供するSMS DLLは.net 4.0以降でしか使えず、とても恥ずかしいです。幸いAlibabaはHTTP用のJavaの例を示してくれたので、Javaコードに従ってC#でAlibaba Cloud HTTPを呼び出すメソッドを書いてみました。 本題に戻りましょう、コードに行きましょう! (CSDNにも投稿しています。性格保証は海賊版投稿ではありません。ありがとうございます) パブリッククラス SendShort { /// <summary> SMSインターフェースC#呼び出しメソッド /// </summary> <param name="url"></param> /// <returns></returns> public static string GetHtmlFormUrl(string url) { stringstrRet = null; もし (URL == null || URL. Trim()。 ToString() == "") { リターンストレット; } 文字列 targeturl = URL です。 Trim()。 ToString(); やってみて { HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl); 人事部。 UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"; 人事部。 メソッド = "GET"; 人事部。 タイムアウト = 30 * 60 * 1000; WebResponse hs = 時間。 GetResponse(); ストリーム sr = hs。 GetResponseStream(); StreamReader ser = new StreamReader(sr, Encoding.Default); strRet = MessageHandle(ser. ReadToEnd()); } catch(例外例) { strRet = 「SMS送信失敗!」 +ex。 メッセージ; } リターンストレット; } /// <summary> 携帯電話番号が正当かどうか確認してください /// </summary> <param name="str_handset"></param> /// <returns></returns> パブリック静的ブール IsHandset(文字列str_handset) { return System.Text.RegularExpressions.Regex.IsMatch(str_handset, @"^1[3|4|5|7|8][0-9]\d{8}$"); } /// <summary> SMS認証コード /// </summary> <param name="mobile"></param> <param name="code"></param> /// <returns></returns> public static string SignDemo(string mobile, int code) { 文字列accessKeyId = "Your accessKeyId "; string accessSecret = 「あなたのaccessSecret」; string nowDate = DateTime.Now.ToUniversalTime(). ToString(「yyyy-MM-dd'T'HH:mm:ss'Z'); GTMタイム 辞書<文字列、文字列>keyValues = 新しい辞書<文字列、文字列>(); 辞書を宣言する 1. システムパラメータ keyValues.Add("SignatureMethod", "HMAC-SHA1"); keyValues.Add("SignatureNonce", Guid.NewGuid(). ToString()); keyValues.Add("AccessKeyId", accessKeyId); keyValues.Add("SignatureVersion", "1.0"); keyValues.Add("Timestamp"、nowDate); keyValues.Add("Format", "Json"); XMLに置き換えることができます
2. ビジネスAPIパラメータ keyValues.Add("Action", "SendSms"); keyValues.Add("Version", "2017-05-25"); keyValues.Add("RegionId", "cn-hangzhou"); keyValues.Add("PhoneNumbers"、モバイル); keyValues.Add("SignName", "Your Signature"); keyValues.Add("TemplateParam", "{\"code\":\"" + code + "\"}"); keyValues.Add("TemplateCode", "Your Template Number"); keyValues.Add("OutId", "123");
3. 署名キーワードの除去 if (keyValues.ContainsKey("Signature")) { keyValues.Remove("Signature"); }
4. パラメータキーソート Dictionary<string, string> ascDic = keyValues.OrderBy(o => o.Key)。 ToDictionary(o => o.Key, p => p.Value.ToString()); 5. 符号付けされる文字列を構成する StringBuilder ビルダー = 新しい StringBuilder(); foreach(ascDicのvar項目) { もし(項目)ならば。 キー == 「SignName」) {
} そうでなければ { ビルダー。 付録(「&」)。 Append(specialUrlEncode(item. キー))。 付録("=")。 Append(specialUrlEncode(item. 価値)); } もし(項目)ならば。 キー == "RegionId") { ビルダー。 付録(「&」)。 Append(specialUrlEncode("SignName"))。 付録("=")。 Append(specialUrlEncode(keyValues["SignName"])); } } 文字列 sorteQueryString = ビルダー。 ToString()。 サブストリング(1);
StringBuilder stringToSign = 新しいStringBuilder(); stringToSign.Append("GET")。 付録("&"); stringToSign.Append(specialUrlEncode("/"))。 付録("&"); stringToSign.Append(specialUrlEncode(sorteQueryString));
文字列符号 = MySign(accessSecret + "&", stringToSign.ToString()); 6. 署名には最後に特別なURLを付けて符号化する必要があります string signture = specialUrlEncode(Sign); 最後に、正当なGETリクエストのURLを印刷してください 文字列URL = "http://dysmsapi.aliyuncs.com/?Signature=" + signture + builder; string result = GetHtmlFormUrl(URL); リターン結果; } /// <summary> URLエンコーディング /// </summary> <param name="value"></param> /// <returns></returns> public static string specialUrlEncode(string temp) {
StringBuilder stringBuilder = 新しいStringBuilder(); (int i = 0; 私は<一時的なものでした。 長さ; i++) { 文字列 t = temp[i]。 ToString(); string k = HttpUtility.UrlEncode(t, Encoding.UTF8); もし (t == k) { stringBuilder.Append(t); } そうでなければ { stringBuilder.Append(k.ToUpper()); } } return stringBuilder.ToString()。 Replace("+", "%20")。 Replace("*", "%2A")。 Replace("%7E", "~"); } /// <summary> HMACSHA1署名 /// </summary> <param name="accessSecret"></param> <param name="stringToSign"></param> /// <returns></returns> public static string MySign(string accessSecret, string stringToSign) { やってみて { var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(accessSecret)); var dataBuffer = Encoding.UTF8.GetBytes(stringToSign); var hashBytes = hmacsha1. ComputeHash(dataBuffer); string stringbyte = BitConverter.ToString(hashBytes, 0)。 置換("-"、文字列。 空っぽです)。 ToLower(); byte[] bytes = strToToHexByte(stringbyte); return Convert.ToBase64String(bytes); } catch(例外例) {
Exを投げる; } } /// <summary> 文字列から16バイト配列への変換 /// </summary> <param name="hexString"></param> /// <returns></returns> private static byte[] strToToHexByte(文字列 hexString) { hexString = hexString。Replace(" ", ""); もし((hexString.Length % 2) != 0) hexString += " "; byte[] returnBytes = 新しいバイト[hexString.Length / 2]; (int i = 0; returnBytes.Length<; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); return returnBytes; } /// <summary> メッセージ処理機構 /// </summary> <param name="str"></param> /// <returns></returns> プライベート静的文字列 MessageHandle(string str) { MessageModel message = JsonConvert.DeserializeObject<MessageModel>(str); 文字列結果 = ""; スイッチ(メッセージ。 コード) { ケース「OK」: 結果 = 「SMS送信成功!」; 休憩; ケース「ISP」 RAM_PERMISSION_DENY」: 結果 = 「RAM Permission DENY」; 休憩; ケース「ISV」 OUT_OF_SERVICE」: 結果=「事業のダウンタイム」; 休憩; ケース「ISV」 PRODUCT_UN_SUBSCRIPT」: 結果 = 「クラウド通信製品を開いていないアリババクラウドの顧客」; 休憩; ケース「ISV」 PRODUCT_UNSUBSCRIBE」: 結果 = 「製品未開封」; 休憩; ケース「ISV」 ACCOUNT_NOT_EXISTS」: 結果=「アカウントは存在しない」; 休憩; ケース「ISV」 ACCOUNT_ABNORMAL」: 結果 = 「アカウント例外」; 休憩; ケース「isv.SMS_TEMPLATE_ILLEGAL」: 結果 = 「SMSテンプレートは合法ではない」; 休憩; ケース「isv.SMS_SIGNATURE_ILLEGAL」: 結果=「SMS署名は合法ではない」; 休憩; ケース「ISV」 INVALID_PARAMETERS」: 結果 = 「パラメータ例外」; 休憩; ケース「ISV」 MOBILE_NUMBER_ILLEGAL」: 結果=「違法携帯電話番号」; 休憩; ケース「ISV」 MOBILE_COUNT_OVER_LIMIT」: 結果 = 「携帯電話番号数が上限を超えている」; 休憩; ケース「ISV」 TEMPLATE_MISSING_PARAMETERS」: 結果 = 「テンプレート欠損変数」; 休憩; ケース「ISV」 BUSINESS_LIMIT_CONTROL」: 結果 = 「事業の流れ」; 休憩; ケース「ISV」 INVALID_JSON_PARAM」: result = 「JSON パラメータは正当ではなく、文字列値のみが受け入れられる」; 休憩; ケース「ISV」 PARAM_LENGTH_LIMIT」: 結果 = 「パラメータが長さ制限を超えている」; 休憩; ケース「ISV」 PARAM_NOT_SUPPORT_URL」: 結果 = 「URLはサポートされていません」; 休憩; ケース「ISV」 AMOUNT_NOT_ENOUGH」: 結果=「口座残高不足」; 休憩; ケース「ISV」 TEMPLATE_PARAMS_ILLEGAL」: 結果 = 「テンプレート変数には違法なキーワードが含まれている」; 休憩; } リターン結果; } }
|