この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 14739|答える: 3

[インターフェース] C#はAlibabaのSMS dllを呼び出しません。HTTPインターフェースを使ってSMSを送信する方法

[リンクをコピー]
掲載地 2018/12/01 18:37:34 | | |
  しばらく前に、その会社で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」:
                    結果 = 「テンプレート変数には違法なキーワードが含まれている」;
                    休憩;
            }
            リターン結果;
        }
    }

スコア

参加者数2MB+2 貢献する+2 倒れる 理由
クズども + 1 + 1 親指を立てて
管理者 + 1 + 1 とても強力です!

すべての評価を見る





先の:1000棟の建物が手描きで美しい
次に:旧日本海軍・陸軍資料、PDF
掲載地 2018/12/02 9:00:04 |
掲載地 2018/12/02 10:19:01 |
オーナーから提供されたコードのおかげで、HTTPシミュレーションリクエストインターフェースを通じてSMSを送信できます。大きなDLLを呼ぶ必要はなく、親指を立ててくれます。
掲載地 2018/12/14 16:03:21 |
彼らは皆達人です
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com