云之讯语音、短信验证码实现
使用云之讯语音验证码功能,需要到云之讯开放平台去注册对应的账号,才能使用。
这里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
上面部分源码是无用的,因为这是为后面追加功能而添加的,这里只说明语音、短信验证码功能的实现。
说明:这里提供的部分源码,不意味着是好的代码,具体还请参考官方文档说明。
云之讯语音、短信验证码实现相关推荐
- 云之讯java短信验证码真小白教程
准备:eclipse,浏览器 第一步:打开云之讯官网,先注册,注册后,如下图(可以看到送了些钱): 第二步:认证个人开发者/企业开发(认证后可以创建应用),如下图: 认证之后 第三步:创建应用,如图: ...
- 容联云通讯php短信接口,开发中使用 【容联 云通信】获取短信验证码的 Javascript 接口...
开发中使用 [容联 云通信]获取短信验证码的 Javascript 接口 在平台应用列表添加应用. 在测试号码中绑定测试手机号码,只有这个号码能接收验证短信. 在项目中绑定配置:将控制台首页的开发者主 ...
- 阿里云接口实现发送短信验证码
java 阿里云接口实现发送短信验证码 1. 阿里云后台配置短信相关 1.1 开通短信服务 1.2 添加模板签名 1.3 创建秘钥 1.4 短信需要后台授权--注意点 2 java--简单实现短信验证 ...
- 云之讯php短信接口,菏泽java云之讯短信接口价格如何计算? 新锐信息科技服务至上...
免费接码验证码接收平台 好用的接码平台有以下几个特征: 1.平台功能设置人性化:语音验证码+短信验证码一体化,方便用户使用.现在很多项目都慢慢开始了语音验证码的步伐. 2.平台稳定经营时间久:接码平台 ...
- 使用容联云Celery异步发送短信验证码
文章目录 Celery/容联云 安装与命令 安装 celery启动命令 一.Celery 1.配置Celery 2.创建任务文件 二.容联云 1. 配置容联云 settings.py 2. 使用Sms ...
- Dython 容联云的一个测试短信验证码
import random,redis from ronglian_sms_sdk import SmsSDK accId = '8a216da882f1f59401835463b6491132' ...
- java 阿里云接口实现发送短信验证码
1.先去阿里云开通短信服务: 2.添加模板及签名:需要审核,个人账户审核就几分钟就OK 先解释一下模板及签名: 标准参照:https://help.aliyun.com/document_detail ...
- 阿里云——Java实现手机短信验证码功能
目录 如何实现短信验证码功能 1.准备工作 1.1 注册 阿里云 账号,并完成实名认证.找到短信服务功能. 1.2 开通短信服务 1.3 签名与模板 1.4 获取AccessKey 1.5 打开短信控 ...
- 云之讯手机号短信验证
目录标题 1.下载相关服务sdk 2.解压 3.创建项目 4.导入依赖 5.修改配置 6.获取发送短信的工具包 7.使用 8.官网提供的例子 1.下载相关服务sdk 地址:http://docs.uc ...
- 阿里云服务 - Java实现短信验证码发送 --(完整教程)
我们在实现登录注册的时候,常常用到了短信验证码校验,下面给大家简单介绍阿里云的短信服务平台. 相关jar包: aliyun-java-sdk-core-3.2.2.jar(点此下载) aliyun-j ...
最新文章
- OVS DPDK vs OVS Deep Dive(十六)
- 【渝粤题库】广东开放大学 外贸会计 形成性考核
- mysql 连接池 100_mysql的最大连接数默认是100_MySQL
- python分布式框架_高性能分布式执行框架——Ray
- SoapSerialization——手机号码归属地
- Linux 下如何查找木马并处理
- 华为Mate X供货还没跟上,Mate Xs就要来了,余承东亲自确认
- Android:通过Intent传递对象、Parcelable
- java培训学费_太原java培训班价格表
- 64 ----平面与直线之间的位置关系、平面与直线之间的交角、两直线两平面的位置关系
- idea查找当前方法的实现_intellij idea快速查看当前类中的所有方法(推荐)
- react引入本地mp4视频
- java孢子进化_孢子的进化起源
- 智能中线保护装置-零线电流保护器-中性线保护装置
- 微信小程序项目设置并使用主题颜色
- Flex——项目item的属性(order、flex-grow、flex-shrink、flex-basis、flex、align-self)
- VBA怎样关闭工作簿和退出Excel
- 快来,票字版软件电子发票的设置方式(详细流程)
- 路由器linux版本升级,华为路由器升级全攻略
- 通过脚本将网址添加到客户的受信任站点