이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 14739|회답: 3

[인터페이스] C#은 Alibaba SMS dll을 호출하지 않습니다. HTTP 인터페이스를 사용해 SMS를 보내는 방법

[링크 복사]
게시됨 2018. 12. 1. 오후 6:37:34 | | |
  얼마 전, 회사에서 SMS 알림을 사용해야 하는 프로젝트가 있었고, 그 후 SMS 인터페이스 개발을 위해 알리바바 클라우드 SMS를 구입했습니다. 하지만 프로젝트가 XP 시스템에서 실행되고 있어서 .NET3.5 프레임워크여야 하는데, 알리바바에서 제공한 SMS DLL은 .net 4.0 이상에서만 사용할 수 있어서 매우 부끄러웠습니다. 다행히 알리바바에서 HTTP용 자바 예제를 제공해줘서, 자바 코드에 따라 C#으로 알리바바 클라우드 HTTP를 호출하는 메서드를 작성하려고 했습니다. 본론으로 돌아가서, 코드로 돌아가세요! (CSDN에도 글을 올렸습니다. 성격 보증은 불법 복제 게시물이 아닙니다, 감사합니다)  
공용 클래스 SendShort
    {
        /// <summary>
        SMS 인터페이스 C# 호출 메서드
        /// </summary>
        <param name="url"></param>
        /// <returns></returns>
        public static string GetHtmlFormUrl(string url)
        {
            string strRet = 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>
        공개 정적 문자열 SignDemo(문자열 모바일, 정규 코드)
        {
            string accessKeyId = "Your accessKeyId ";
            문자열 accessSecret = "당신의 accessSecret";
            string nowDate = DateTime.Now.ToUniversalTime(). ToString("yyyy-MM-dd'T'HH:mm:ss'Z'"); GTM 시간
            Dictionary<string, string> keyValues = new Dictionary<string, string>(); 사전 선언
            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("버전", "2017-05-25");
            keyValues.Add("RegionId", "cn-항저우");
            keyValues.Add("전화번호", 모바일);
            keyValues.Add("SignName", "Your Signature");
            keyValues.Add("TemplateParam", "{\"code\":\"" + code + "\"}");
            keyValues.Add("템플릿코드", "당신의 템플릿 번호");
            keyValues.Add("OutId", "123");

            3. 서명 키워드 제거
            if (keyValues.ContainsKey("Signature"))
            {
                keyValues.Remove("서명");
            }

            4. 매개변수 키 정렬
            Dictionary<string, string> ascDic = keyValues.OrderBy(o => o.Key). ToDictionary(o => o.Key, p => p.Value.ToString());
            5. 부호를 받을 문자열을 구성한다
            StringBuilder 빌더 = 새로운 StringBuilder();
            foreach (격격 변속 항목)
            {
                만약 (항목. 키 == "SignName")
                {

                }
                그렇지 않으면
                {
                    건축가. 덧붙이기("&") Append(specialUrlEncode(item. Key)). 덧붙이기("="). Append(specialUrlEncode(item. 가치));
                }
                만약 (항목. 키 == "RegionId")
                {
                    건축가. 덧붙이기("&") Append(specialUrlEncode("SignName")). 덧붙이기("="). Append(specialUrlEncode(keyValues["SignName"]));
                }
            }
            string sorteQueryString = 빌더. ToString(). 서브스트링(1);

            StringBuilder stringToSign = new StringBuilder();
            스트링토서명.첨부("GET"). 덧붙이기("&");
            stringToSign.Append(specialUrlEncode("/")). 덧붙이기("&");
            stringToSign.Append(specialUrlEncode(sorteQueryString));

            string Sign = 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();
            (정수: 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). Replace("-", 줄. 비어 있다). ToLower();
                byte[] bytes = strToToHexByte(stringbyte);
                return Convert.ToBase64String(bytes);
            }
            catch (예외 예)
            {

                전 애인을 던지고;
            }
        }
        /// <summary>
        문자열 16바이트 배열
        /// </summary>
        <param name="hexString"></param>
        /// <returns></returns>
        private static byte[] strToToHexByte(string hexString)
        {
            hexString = hexString.Replace(" ", "");
            만약 (((hexString.Length % 2) != 0)
                헥스스트링 += " ";
            byte[] returnBytes = 새 byte[hexString.Length / 2];
            (정수: 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(문자열 str)
        {
            MessageModel message = JsonConvert.DeserializeObject<MessageModel>(str);
            문자열 결과 = "";
            스위치 (메시지. 코드)
            {
                케이스 "OK":
                    결과 = "SMS 전송 성공!";
                    브레이크;
                사건 "ISP. RAM_PERMISSION_DENY":
                    결과 = "RAM 권한 거부";
                    브레이크;
                사건 "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":
                    결과 = "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. 2. 오전 9:00:04 |
게시됨 2018. 12. 2. 오전 10:19:01 |
소유자가 제공한 코드 덕분에 HTTP 시뮬레이션 요청 인터페이스를 통해 SMS를 보내면 큰 dll을 호출할 필요 없고 엄지척 표시를 해줍니다
게시됨 2018. 12. 14. 오후 4:03:21 |
모두 대가들이에요
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com