云之讯语音、短信验证码实现
生活随笔
收集整理的這篇文章主要介紹了
云之讯语音、短信验证码实现
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
使用云之訊語(yǔ)音驗(yàn)證碼功能,需要到云之訊開(kāi)放平臺(tái)去注冊(cè)對(duì)應(yīng)的賬號(hào),才能使用。
這里http://www.ucpaas.com/doc/doc_rest3-2.jsp?是官方文檔 ,需要自己研究第一行文字,才能
明白業(yè)務(wù)功能的實(shí)現(xiàn)點(diǎn)。
下面是一個(gè)封裝好的類,針對(duì)使用該SDK的幫助類:
// // HYBUCSSDKHelper.h // UCSVoiceOrSMSVerifyCodeDemo // // Created by 黃儀標(biāo) on 15/2/2. //#import <Foundation/Foundation.h> #import "UCSEvent.h" #import "UCSService.h"/*!* 云之訊UCS SDK鋪助類,封裝對(duì)IM、智能驗(yàn)證、VOIP網(wǎng)絡(luò)電話功能* @author huangyibiao*/ @interface HYBUCSSDKHelper : NSObject<UCSEventDelegate>/*!* 此處封裝為單例*/ + (HYBUCSSDKHelper *)shared;/*!*--------------------------------------------------------------------------* 下面的方法,是與云之訊平臺(tái)連接相關(guān)的API*--------------------------------------------------------------------------*/// 明文連接 - (NSInteger)connectWithClientNumber:(NSString *)clientNumberpassword:(NSString *)clientPassword;// 連接服務(wù)器(密文) - (NSInteger)connect:(NSString *)token;// 連接服務(wù)器(明文,指定IP,Port) - (NSInteger)connect:(NSString *)hostAddressport:(NSString *)hostPortclientNumber:(NSString *)clientNumberpassword:(NSString *)clientPassword;// 連接服務(wù)器(密文,指定IP,Port) - (NSInteger)connect:(NSString *)hostAddresswithPort:(NSString *)hostPortwithToken:(NSString *)token;// 獲取與云之訊平臺(tái)連接的狀態(tài) - (BOOL)isConnected;/*!*--------------------------------------------------------------------------* 智能驗(yàn)證API*--------------------------------------------------------------------------*/ /*** 獲取云驗(yàn)證碼*/ - (void)ucsVerifyCodeWithPhone:(NSString *)phoneseconds:(int)seconds;/*** 驗(yàn)證碼驗(yàn)證*/ - (void)checkUcsVerifyCodeWithPhone:(NSString *)phoneverifycode:(NSString *)verifycode;/*!*--------------------------------------------------------------------------* 語(yǔ)音驗(yàn)證碼、短信驗(yàn)證碼相關(guān)API*--------------------------------------------------------------------------*/ /*** 調(diào)起語(yǔ)音驗(yàn)證碼接口*/ - (void)voiceCodeTo:(NSString *)phone verifyCode:(NSString *)verifyCode;/*** 調(diào)起短信驗(yàn)證碼接口* @param phone 短信接收端手機(jī)號(hào)碼集合,用英文逗號(hào)分開(kāi),每批發(fā)送的手機(jī)號(hào)數(shù)量不得超過(guò)100* 個(gè)(國(guó)內(nèi)短信不要加前綴,國(guó)際短信號(hào)碼前須帶相應(yīng)的國(guó)家區(qū)號(hào),如日本:0081)* @param param 內(nèi)容數(shù)據(jù),用于替換模板中{數(shù)字},若有多個(gè)替換內(nèi)容,用英文逗號(hào)隔開(kāi)即可*/ - (void)smsCodeTo:(NSString *)phone param:(NSString *)param;@end下面是實(shí)現(xiàn)文件,這里的網(wǎng)絡(luò)庫(kù)使用的是AFN:
#define kAccountSid @"" // 替換為您的sid #define kAccountToken @"" #define kAppId @"" #define kAppName @""#define kUCSBaseURL @"https://api.ucpaas.com" #define kSoftVersion @"2014-06-30" // 云之訊REST API版本號(hào)。@interface HYBUCSSDKHelper ()@property (nonatomic, strong) UCSService *ucsService; @property (nonatomic, copy) NSString *callerPhoneNumber; // 主叫號(hào)碼 @property (nonatomic, copy) NSString *phoneNumber; // 被叫號(hào)碼@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; }/*!*--------------------------------------------------------------------------* 下面的方法,是與云之訊平臺(tái)連接相關(guān)的API*--------------------------------------------------------------------------*/ // 明文連接 - (NSInteger)connectWithClientNumber:(NSString *)clientNumber password:(NSString *)clientPassword {return [self.ucsService connect:kAccountSidwithAccountToken:kAccountTokenwithClientNumber:clientNumberwithClientPwd:clientPassword]; }// 連接服務(wù)器(密文) - (NSInteger)connect:(NSString *)token {return [self.ucsService connect:token]; }// 連接服務(wù)器(明文,指定IP,Port) - (NSInteger)connect:(NSString *)hostAddressport:(NSString *)hostPortclientNumber:(NSString *)clientNumberpassword:(NSString *)clientPassword {return [self.ucsService connect:hostAddresswithPort:hostPortwithwithAccountSid:kAccountSidwithAccountToken:kAccountTokenwithClientNumber:clientNumberwithClientPwd:clientPassword]; }// 連接服務(wù)器(密文,指定IP,Port) - (NSInteger)connect:(NSString *)hostAddresswithPort:(NSString *)hostPortwithToken:(NSString *)token {return [self.ucsService connect:hostAddress withPort:hostPort withToken:token]; }// 查詢帳號(hào)與服務(wù)器連接狀態(tài) - (BOOL)isConnected {return [self.ucsService isConnected]; }/*!*--------------------------------------------------------------------------* 智能驗(yàn)證*--------------------------------------------------------------------------*/ /*** 獲取云驗(yàn)證碼*/ - (void)ucsVerifyCodeWithPhone:(NSString *)phoneseconds:(int)seconds {[self.ucsService getVerificationCode:kAccountSidwithAppid:kAppIdwithAppName:kAppNamewithCodetype:1withPhone:phonewithSeconds:secondswithBusiness:1]; }/*** 驗(yàn)證碼驗(yàn)證*/ - (void)checkUcsVerifyCodeWithPhone:(NSString *)phoneverifycode:(NSString *)verifycode {[self.ucsService doVerificationCode:kAccountSidwithAppid:kAppIdwithPhone:phonewithVerifycode:verifycode]; }/*!*--------------------------------------------------------------------------* 語(yǔ)音驗(yàn)證碼、短信驗(yàn)證碼相關(guān)API*--------------------------------------------------------------------------*/ /*** 調(diào)起語(yǔ)音驗(yàn)證碼接口*/ - (void)voiceCodeTo:(NSString *)phone verifyCode:(NSString *)verifyCode {AFHTTPRequestOperationManager *manager = [self operationManagerWithBaseUrl:kUCSBaseURL];// 獲取系統(tǒng)當(dāng)前的時(shí)間戳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 + 冒號(hào) + 時(shí)間戳)NSString *authorization = [NSString stringWithFormat:@"%@:%@", kAccountSid, timestamp];authorization = [self base64Encoding:authorization];return authorization; }- (NSString *)sig:(NSString *)timestamp {// URL后必須帶有sig參數(shù),sig= MD5(賬戶Id + 賬戶授權(quán)令牌 + 時(shí)間戳),共32位(注:轉(zhuǎn)成大寫)// 使用MD5加密(賬戶Id + 賬戶授權(quán)令牌 + 時(shí)間戳),共32位。NSString *sig = [NSString stringWithFormat:@"%@%@%@", kAccountSid, kAccountToken, timestamp];sig = [[self md5n:sig] uppercaseString];return sig; }/*** 調(diào)起短信驗(yàn)證碼接口* @param phone 短信接收端手機(jī)號(hào)碼集合,用英文逗號(hào)分開(kāi),每批發(fā)送的手機(jī)號(hào)數(shù)量不得超過(guò)100* 個(gè)(國(guó)內(nèi)短信不要加前綴,國(guó)際短信號(hào)碼前須帶相應(yīng)的國(guó)家區(qū)號(hào),如日本:0081)* @param param 內(nèi)容數(shù)據(jù),用于替換模板中{數(shù)字},若有多個(gè)替換內(nèi)容,用英文逗號(hào)隔開(kāi)即可*/ - (void)smsCodeTo:(NSString *)phone param:(NSString *)param {AFHTTPRequestOperationManager *manager = [self operationManagerWithBaseUrl:kUCSBaseURL];// 獲取系統(tǒng)當(dāng)前的時(shí)間戳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 將字符串轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)后,再進(jìn)行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 將字符串本身進(jìn)行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 // 與云通訊平臺(tái)連接成功 - (void)onConnectionSuccessful:(NSInteger)result {NSLog(@"與云通訊平臺(tái)連接成功 result=%ld", result); }// 與云通訊平臺(tái)連接失敗或連接斷開(kāi) - (void)onConnectionFailed:(NSInteger)reason {NSLog(@" 與云通訊平臺(tái)連接失敗或連接斷開(kāi) reason=%ld", reason); }/*!*--------------------------------------------------------------------------* 智能驗(yàn)證:語(yǔ)音驗(yàn)證碼、短信驗(yàn)證碼相關(guān)API代理回調(diào)*--------------------------------------------------------------------------*/ // 云獲取驗(yàn)證碼成功 0:已經(jīng)驗(yàn)證成功,1:已下發(fā)驗(yàn)證碼到用戶 - (void) onGetValiateCodeSuccessful:(NSInteger)nResult {NSLog(@"%@", nResult ? @"已下發(fā)驗(yàn)證碼到用戶" : @"已經(jīng)驗(yàn)證成功"); }// 云獲取驗(yàn)證碼失敗 - (void) onGetValiateCodeFailed:(NSInteger)reason {NSLog(@"云獲取驗(yàn)證碼失敗 reason=%ld", reason); }// 云驗(yàn)證成功 - (void) onDoValiateCodeSuccessful:(NSInteger)nResult {NSLog(@"云驗(yàn)證成功 result=%ld", nResult); }// 云驗(yàn)證失敗 - (void) onDoValiateCodeFailed:(NSInteger)reason {NSLog(@"云驗(yàn)證失敗 reason=%ld", reason); }- (AFHTTPRequestOperationManager *)operationManagerWithBaseUrl:(NSString *)url {// 開(kāi)啟菊花轉(zhuǎn)[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上面部分源碼是無(wú)用的,因?yàn)檫@是為后面追加功能而添加的,這里只說(shuō)明語(yǔ)音、短信驗(yàn)證碼功能的實(shí)現(xiàn)。
說(shuō)明:這里提供的部分源碼,不意味著是好的代碼,具體還請(qǐng)參考官方文檔說(shuō)明。
總結(jié)
以上是生活随笔為你收集整理的云之讯语音、短信验证码实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机休眠需要重新开机,再确定; 以上的
- 下一篇: mysql 80070057_0x800