|
|
게시됨 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": 결과 = "템플릿 변수에 불법 키워드가 포함되어 있다"; 브레이크; } 반환 결과; } }
|
점수
-
모든 평점 보기
이전의:1000개의 건물이 손으로 그린 아름답습니다다음:구 일본 해군 및 육군 자료, PDF
|