云之讯语音、短信验证码实现
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                云之讯语音、短信验证码实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                使用云之訊語音驗證碼功能,需要到云之訊開放平臺去注冊對應的賬號,才能使用。
這里http://www.ucpaas.com/doc/doc_rest3-2.jsp?是官方文檔 ,需要自己研究第一行文字,才能
明白業務功能的實現點。
下面是一個封裝好的類,針對使用該SDK的幫助類:
// // HYBUCSSDKHelper.h // UCSVoiceOrSMSVerifyCodeDemo // // Created by 黃儀標 on 15/2/2. //#import <Foundation/Foundation.h> #import "UCSEvent.h" #import "UCSService.h"/*!* 云之訊UCS SDK鋪助類,封裝對IM、智能驗證、VOIP網絡電話功能* @author huangyibiao*/ @interface HYBUCSSDKHelper : NSObject<UCSEventDelegate>/*!* 此處封裝為單例*/ + (HYBUCSSDKHelper *)shared;/*!*--------------------------------------------------------------------------* 下面的方法,是與云之訊平臺連接相關的API*--------------------------------------------------------------------------*/// 明文連接 - (NSInteger)connectWithClientNumber:(NSString *)clientNumberpassword:(NSString *)clientPassword;// 連接服務器(密文) - (NSInteger)connect:(NSString *)token;// 連接服務器(明文,指定IP,Port) - (NSInteger)connect:(NSString *)hostAddressport:(NSString *)hostPortclientNumber:(NSString *)clientNumberpassword:(NSString *)clientPassword;// 連接服務器(密文,指定IP,Port) - (NSInteger)connect:(NSString *)hostAddresswithPort:(NSString *)hostPortwithToken:(NSString *)token;// 獲取與云之訊平臺連接的狀態 - (BOOL)isConnected;/*!*--------------------------------------------------------------------------* 智能驗證API*--------------------------------------------------------------------------*/ /*** 獲取云驗證碼*/ - (void)ucsVerifyCodeWithPhone:(NSString *)phoneseconds:(int)seconds;/*** 驗證碼驗證*/ - (void)checkUcsVerifyCodeWithPhone:(NSString *)phoneverifycode:(NSString *)verifycode;/*!*--------------------------------------------------------------------------* 語音驗證碼、短信驗證碼相關API*--------------------------------------------------------------------------*/ /*** 調起語音驗證碼接口*/ - (void)voiceCodeTo:(NSString *)phone verifyCode:(NSString *)verifyCode;/*** 調起短信驗證碼接口* @param phone 短信接收端手機號碼集合,用英文逗號分開,每批發送的手機號數量不得超過100* 個(國內短信不要加前綴,國際短信號碼前須帶相應的國家區號,如日本:0081)* @param param 內容數據,用于替換模板中{數字},若有多個替換內容,用英文逗號隔開即可*/ - (void)smsCodeTo:(NSString *)phone param:(NSString *)param;@end下面是實現文件,這里的網絡庫使用的是AFN:
#define kAccountSid @"" // 替換為您的sid #define kAccountToken @"" #define kAppId @"" #define kAppName @""#define kUCSBaseURL @"https://api.ucpaas.com" #define kSoftVersion @"2014-06-30" // 云之訊REST API版本號。@interface HYBUCSSDKHelper ()@property (nonatomic, strong) UCSService *ucsService; @property (nonatomic, copy) NSString *callerPhoneNumber; // 主叫號碼 @property (nonatomic, copy) NSString *phoneNumber; // 被叫號碼@end@implementation HYBUCSSDKHelper+ (HYBUCSSDKHelper *)shared {static HYBUCSSDKHelper *s_helper = nil;static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{if (s_helper == nil) {s_helper = [[[self class] alloc] init];}});return s_helper; }- (instancetype)init {if (self = [super init]) {self.ucsService = [[UCSService alloc] initWithDelegate:self];}return self; }/*!*--------------------------------------------------------------------------* 下面的方法,是與云之訊平臺連接相關的API*--------------------------------------------------------------------------*/ // 明文連接 - (NSInteger)connectWithClientNumber:(NSString *)clientNumber password:(NSString *)clientPassword {return [self.ucsService connect:kAccountSidwithAccountToken:kAccountTokenwithClientNumber:clientNumberwithClientPwd:clientPassword]; }// 連接服務器(密文) - (NSInteger)connect:(NSString *)token {return [self.ucsService connect:token]; }// 連接服務器(明文,指定IP,Port) - (NSInteger)connect:(NSString *)hostAddressport:(NSString *)hostPortclientNumber:(NSString *)clientNumberpassword:(NSString *)clientPassword {return [self.ucsService connect:hostAddresswithPort:hostPortwithwithAccountSid:kAccountSidwithAccountToken:kAccountTokenwithClientNumber:clientNumberwithClientPwd:clientPassword]; }// 連接服務器(密文,指定IP,Port) - (NSInteger)connect:(NSString *)hostAddresswithPort:(NSString *)hostPortwithToken:(NSString *)token {return [self.ucsService connect:hostAddress withPort:hostPort withToken:token]; }// 查詢帳號與服務器連接狀態 - (BOOL)isConnected {return [self.ucsService isConnected]; }/*!*--------------------------------------------------------------------------* 智能驗證*--------------------------------------------------------------------------*/ /*** 獲取云驗證碼*/ - (void)ucsVerifyCodeWithPhone:(NSString *)phoneseconds:(int)seconds {[self.ucsService getVerificationCode:kAccountSidwithAppid:kAppIdwithAppName:kAppNamewithCodetype:1withPhone:phonewithSeconds:secondswithBusiness:1]; }/*** 驗證碼驗證*/ - (void)checkUcsVerifyCodeWithPhone:(NSString *)phoneverifycode:(NSString *)verifycode {[self.ucsService doVerificationCode:kAccountSidwithAppid:kAppIdwithPhone:phonewithVerifycode:verifycode]; }/*!*--------------------------------------------------------------------------* 語音驗證碼、短信驗證碼相關API*--------------------------------------------------------------------------*/ /*** 調起語音驗證碼接口*/ - (void)voiceCodeTo:(NSString *)phone verifyCode:(NSString *)verifyCode {AFHTTPRequestOperationManager *manager = [self operationManagerWithBaseUrl:kUCSBaseURL];// 獲取系統當前的時間戳NSString *timestamp = [self timestamp];[manager.requestSerializer setValue:[self authorization:timestamp] forHTTPHeaderField:@"Authorization"];NSString *url = [NSString stringWithFormat:@"/%@/Accounts/%@/Calls/voiceCode?sig=%@",kSoftVersion, kAccountSid, [self sig:timestamp]];NSDictionary *params = @{@"voiceCode" : @{@"appId" : kAppId,@"to" : phone,@"verifyCode" : verifyCode}};[manager POST:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {NSLog(@"url: %@\nparmas: %@\nresponseObject:%@\nerrorMessage: %@ errorCode=%@ headers:%@",operation.response.URL.absoluteString,params,responseObject,responseObject[@"errorMessage"],responseObject[@"errorCode"],operation.request.allHTTPHeaderFields);if ([responseObject isKindOfClass:[NSDictionary class]]) {NSLog(@"%@", responseObject);} else {}} failure:^(AFHTTPRequestOperation *operation, NSError *error) {NSLog(@"error: %@", [error description]);}]; }- (NSString *)timestamp {NSDateFormatter *formatter = [[NSDateFormatter alloc] init];[formatter setDateStyle:NSDateFormatterMediumStyle];[formatter setTimeStyle:NSDateFormatterShortStyle];[formatter setDateFormat:@"yyyyMMddHHmmss"];NSDate *datenow = [NSDate date];NSString *timestamp = [formatter stringFromDate:datenow];return timestamp; }- (NSString *)authorization:(NSString *)timestamp {// 使用Base64編碼(賬戶Id + 冒號 + 時間戳)NSString *authorization = [NSString stringWithFormat:@"%@:%@", kAccountSid, timestamp];authorization = [self base64Encoding:authorization];return authorization; }- (NSString *)sig:(NSString *)timestamp {// URL后必須帶有sig參數,sig= MD5(賬戶Id + 賬戶授權令牌 + 時間戳),共32位(注:轉成大寫)// 使用MD5加密(賬戶Id + 賬戶授權令牌 + 時間戳),共32位。NSString *sig = [NSString stringWithFormat:@"%@%@%@", kAccountSid, kAccountToken, timestamp];sig = [[self md5n:sig] uppercaseString];return sig; }/*** 調起短信驗證碼接口* @param phone 短信接收端手機號碼集合,用英文逗號分開,每批發送的手機號數量不得超過100* 個(國內短信不要加前綴,國際短信號碼前須帶相應的國家區號,如日本:0081)* @param param 內容數據,用于替換模板中{數字},若有多個替換內容,用英文逗號隔開即可*/ - (void)smsCodeTo:(NSString *)phone param:(NSString *)param {AFHTTPRequestOperationManager *manager = [self operationManagerWithBaseUrl:kUCSBaseURL];// 獲取系統當前的時間戳NSString *timestamp = [self timestamp];[manager.requestSerializer setValue:[self authorization:timestamp] forHTTPHeaderField:@"Authorization"];NSString *url = [NSString stringWithFormat:@"/%@/Accounts/%@/Messages/templateSMS?sig=%@",kSoftVersion, kAccountSid, [self sig:timestamp]];NSDictionary *params = @{@"templateSMS" : @{@"appId" : kAppId,@"to" : phone,@"templateId" : @(3177),@"param" : param}};[manager POST:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {NSLog(@"url: %@\nparmas: %@\nresponseObject:%@\nerrorMessage: %@ errorCode=%@ headers:%@",operation.response.URL.absoluteString,params,responseObject,responseObject[@"errorMessage"],responseObject[@"errorCode"],operation.request.allHTTPHeaderFields);if ([responseObject isKindOfClass:[NSDictionary class]]) {NSLog(@"%@", responseObject);} else {}} failure:^(AFHTTPRequestOperation *operation, NSError *error) {NSLog(@"error: %@", [error description]);}]; }/*!* @brief 將字符串轉換成二進制數據后,再進行base64編碼* @return 返回base64編碼后的字符串*/ - (NSString *)base64Encoding:(NSString *)str {NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];NSString *result = nil;// 判斷是否是ios7及其以上版本 #define kIsIOS7OrLater ([UIDevice currentDevice].systemVersion.integerValue >= 7 ? YES : NO)if (kIsIOS7OrLater) {result = [data base64EncodedStringWithOptions:0];} else {result = [data base64Encoding];}return result; }#pragma mark - md5加密 /*!* @brief 將字符串本身進行md5加密,并將加密后的字符串返回* @return 返回加密后的字符串*/ - (NSString *)md5n:(NSString *)str {const char *cStr = [str UTF8String];unsigned char result[16];CC_MD5(cStr, strlen(cStr), result);return [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",result[0], result[1], result[2], result[3],result[4], result[5], result[6], result[7],result[8], result[9], result[10], result[11],result[12], result[13], result[14], result[15]]; }#pragma mark - UCCEventDelegate // 與云通訊平臺連接成功 - (void)onConnectionSuccessful:(NSInteger)result {NSLog(@"與云通訊平臺連接成功 result=%ld", result); }// 與云通訊平臺連接失敗或連接斷開 - (void)onConnectionFailed:(NSInteger)reason {NSLog(@" 與云通訊平臺連接失敗或連接斷開 reason=%ld", reason); }/*!*--------------------------------------------------------------------------* 智能驗證:語音驗證碼、短信驗證碼相關API代理回調*--------------------------------------------------------------------------*/ // 云獲取驗證碼成功 0:已經驗證成功,1:已下發驗證碼到用戶 - (void) onGetValiateCodeSuccessful:(NSInteger)nResult {NSLog(@"%@", nResult ? @"已下發驗證碼到用戶" : @"已經驗證成功"); }// 云獲取驗證碼失敗 - (void) onGetValiateCodeFailed:(NSInteger)reason {NSLog(@"云獲取驗證碼失敗 reason=%ld", reason); }// 云驗證成功 - (void) onDoValiateCodeSuccessful:(NSInteger)nResult {NSLog(@"云驗證成功 result=%ld", nResult); }// 云驗證失敗 - (void) onDoValiateCodeFailed:(NSInteger)reason {NSLog(@"云驗證失敗 reason=%ld", reason); }- (AFHTTPRequestOperationManager *)operationManagerWithBaseUrl:(NSString *)url {// 開啟菊花轉[AFNetworkActivityIndicatorManager sharedManager].enabled = YES;AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc]initWithBaseURL:[NSURL URLWithString:url]];manager.requestSerializer = [AFJSONRequestSerializer serializer];manager.responseSerializer = [AFJSONResponseSerializer serializer];manager.requestSerializer.stringEncoding = NSUTF8StringEncoding;[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];[manager.requestSerializer setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"];[manager.requestSerializer setValue:@"256" forHTTPHeaderField:@"Content-Length"];manager.responseSerializer.acceptableContentTypes = [NSSet setWithArray:@[@"application/json",@"text/html",@"text/json",@"text/javascript"]];return manager; }@end上面部分源碼是無用的,因為這是為后面追加功能而添加的,這里只說明語音、短信驗證碼功能的實現。
說明:這里提供的部分源碼,不意味著是好的代碼,具體還請參考官方文檔說明。
總結
以上是生活随笔為你收集整理的云之讯语音、短信验证码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 计算机休眠需要重新开机,再确定; 以上的
 - 下一篇: mysql 80070057_0x800