手机短信验证码怎么是接收短信语音验证码码

3095人阅读
IOS开发笔记(248)
使用云之讯语音验证码功能,需要到云之讯开放平台去注册对应的账号,才能使用。
这里&是官方文档 ,需要自己研究第一行文字,才能
明白业务功能的实现点。
下面是一个封装好的类,针对使用该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 *)
*--------------------------------------------------------------------------
* 下面的方法,是与云之讯平台连接相关的API
*--------------------------------------------------------------------------*/
// 明文连接
- (NSInteger)connectWithClientNumber:(NSString *)clientNumber
password:(NSString *)clientP
// 连接服务器(密文)
- (NSInteger)connect:(NSString *)
// 连接服务器(明文,指定IP,Port)
- (NSInteger)connect:(NSString *)hostAddress
port:(NSString *)hostPort
clientNumber:(NSString *)clientNumber
password:(NSString *)clientP
// 连接服务器(密文,指定IP,Port)
- (NSInteger)connect:(NSString *)hostAddress
withPort:(NSString *)hostPort
withToken:(NSString *)
// 获取与云之讯平台连接的状态
- (BOOL)isC
*--------------------------------------------------------------------------
智能验证API
*--------------------------------------------------------------------------*/
* 获取云验证码
- (void)ucsVerifyCodeWithPhone:(NSString *)phone
seconds:(int)
* 验证码验证
- (void)checkUcsVerifyCodeWithPhone:(NSString *)phone
verifycode:(NSString *)
*--------------------------------------------------------------------------
语音验证码、短信验证码相关API
*--------------------------------------------------------------------------*/
* 调起语音验证码接口
- (void)voiceCodeTo:(NSString *)phone verifyCode:(NSString *)verifyC
* 调起短信验证码接口
* @param phone 短信接收端手机号码集合,用英文逗号分开,每批发送的手机号数量不得超过100
个(国内短信不要加前缀,国际短信号码前须带相应的国家区号,如日本:0081)
* @param param 内容数据,用于替换模板中{数字},若有多个替换内容,用英文逗号隔开即可
- (void)smsCodeTo:(NSString *)phone param:(NSString *)
下面是实现文件,这里的网络库使用的是AFN:
#define kAccountSid @&& // 替换为您的sid
#define kAccountToken @&&
#define kAppId @&&
#define kAppName @&&
#define kUCSBaseURL @&&
#define kSoftVersion @&& // 云之讯REST API版本号。
@interface HYBUCSSDKHelper ()
@property (nonatomic, strong) UCSService *ucsS
@property (nonatomic, copy)
*callerPhoneN // 主叫号码
@property (nonatomic, copy)
// 被叫号码
@implementation HYBUCSSDKHelper
+ (HYBUCSSDKHelper *)shared {
static HYBUCSSDKHelper *s_helper =
static dispatch_once_t onceT
dispatch_once(&onceToken, ^{
if (s_helper == nil) {
s_helper = [[[self class] alloc] init];
- (instancetype)init {
if (self = [super init]) {
self.ucsService = [[UCSService alloc] initWithDelegate:self];
*--------------------------------------------------------------------------
* 下面的方法,是与云之讯平台连接相关的API
*--------------------------------------------------------------------------*/
// 明文连接
- (NSInteger)connectWithClientNumber:(NSString *)clientNumber password:(NSString *)clientPassword {
return [self.ucsService connect:kAccountSid
withAccountToken:kAccountToken
withClientNumber:clientNumber
withClientPwd:clientPassword];
// 连接服务器(密文)
- (NSInteger)connect:(NSString *)token {
return [self.ucsService connect:token];
// 连接服务器(明文,指定IP,Port)
- (NSInteger)connect:(NSString *)hostAddress
port:(NSString *)hostPort
clientNumber:(NSString *)clientNumber
password:(NSString *)clientPassword {
return [self.ucsService connect:hostAddress
withPort:hostPort
withwithAccountSid:kAccountSid
withAccountToken:kAccountToken
withClientNumber:clientNumber
withClientPwd:clientPassword];
// 连接服务器(密文,指定IP,Port)
- (NSInteger)connect:(NSString *)hostAddress
withPort:(NSString *)hostPort
withToken:(NSString *)token {
return [self.ucsService connect:hostAddress withPort:hostPort withToken:token];
// 查询帐号与服务器连接状态
- (BOOL)isConnected {
return [self.ucsService isConnected];
*--------------------------------------------------------------------------
*--------------------------------------------------------------------------*/
* 获取云验证码
- (void)ucsVerifyCodeWithPhone:(NSString *)phone
seconds:(int)seconds {
[self.ucsService getVerificationCode:kAccountSid
withAppid:kAppId
withAppName:kAppName
withCodetype:1
withPhone:phone
withSeconds:seconds
withBusiness:1];
* 验证码验证
- (void)checkUcsVerifyCodeWithPhone:(NSString *)phone
verifycode:(NSString *)verifycode {
[self.ucsService doVerificationCode:kAccountSid
withAppid:kAppId
withPhone:phone
withVerifycode: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&
@&verifyCode& : verifyCode}};
[manager POST:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@&url: %@\nparmas: %@\nresponseObject:%@\nerrorMessage: %@ errorCode=%@ headers:%@&,
operation.response.URL.absoluteString,
responseObject,
responseObject[@&errorMessage&],
responseObject[@&errorCode&],
operation.request.allHTTPHeaderFields);
if ([responseObject isKindOfClass:[NSDictionary class]]) {
NSLog(@&%@&, responseObject);
} 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];
- (NSString *)authorization:(NSString *)timestamp {
// 使用Base64编码(账户Id + 冒号 + 时间戳)
NSString *authorization = [NSString stringWithFormat:@&%@:%@&, kAccountSid, timestamp];
authorization = [self base64Encoding: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];
* 调起短信验证码接口
* @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&
@&templateId& : @(3177),
: param}};
[manager POST:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@&url: %@\nparmas: %@\nresponseObject:%@\nerrorMessage: %@ errorCode=%@ headers:%@&,
operation.response.URL.absoluteString,
responseObject,
responseObject[@&errorMessage&],
responseObject[@&errorCode&],
operation.request.allHTTPHeaderFields);
if ([responseObject isKindOfClass:[NSDictionary class]]) {
NSLog(@&%@&, responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@&error: %@&, [error description]);
* @brief 将字符串转换成二进制数据后,再进行base64编码
* @return 返回base64编码后的字符串
- (NSString *)base64Encoding:(NSString *)str {
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSString *result =
// 判断是否是ios7及其以上版本
#define kIsIOS7OrLater ([UIDevice currentDevice].systemVersion.integerValue &= 7 ? YES : NO)
if (kIsIOS7OrLater) {
result = [data base64EncodedStringWithOptions:0];
result = [data base64Encoding];
#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 = NSUTF8StringE
[manager.requestSerializer setValue:@&application/json& forHTTPHeaderField:@&Accept&];
[manager.requestSerializer setValue:@&application/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&]];
上面部分源码是无用的,因为这是为后面追加功能而添加的,这里只说明语音、短信验证码功能的实现。
说明:这里提供的部分源码,不意味着是好的代码,具体还请参考官方文档说明。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1398216次
积分:16138
积分:16138
排名:第417名
原创:489篇
转载:61篇
评论:272条
阅读:19997
文章:17篇
阅读:10329
(1)(28)(1)(1)(2)(16)(2)(13)(30)(17)(12)(6)(1)(2)(44)(6)(14)(17)(29)(18)(3)(33)(30)(10)(16)(4)(5)(2)(19)(1)(1)(26)(25)(116)(2)(8)(1)(1)语音验证码:让注册流程顺畅起来--新闻资讯--新闻列表 -- CCTIME飞象网
<meta name="description" content="顺畅起来,上面的这个场景,正是终端用户使用语音验证码的过程。我们熟悉的短信验证码被大量使用在用户注册或付款的环节,当用户进行注册或网购付款时,,为确保安全,,后台都会通过对用户事先绑定手机号的手机发送验证码,,以确认是否为机主本人,,这是一种安全策略,,只能输入发送到指定手机号上的短信验证码才能完成认证,,完成后续的操作。">
语音验证码:让注册流程顺畅起来
Tina刚刚在她的智能手机上下载了一款App,注册时的验证环节让她觉得很有意思:刚刚输入了手机号码,提交之后,自己的手机立刻接到一个电话,电话里有一个声音清楚播报了Tina在这款应用注册所需的几位数字验证码。挂断之后,Tina轻松的将听见的几个数字输入验证框,App的验证环节就完成了。前后费时不到一分钟。
上面的这个场景,正是终端用户使用语音验证码的过程。我们熟悉的短信验证码被大量使用在用户注册或付款的环节,当用户进行注册或网购付款时, 为确保安全, 后台都会通过对用户事先绑定手机号的手机发送验证码, 以确认是否为机主本人, 这是一种安全策略, 只能输入发送到指定手机号上的短信验证码才能完成认证, 完成后续的操作。
目前在App开发中,比较主流的验证方法是短信验证码。但是这种验证也有一定的问题:验证短信的延迟性导致用户流失及用户体验下降,更有验证短信因为一部分用户手机上的某些安全软件而直接被误认为垃圾短信进入黑名单。开发者为此必须到处寻找优质而价格合理的短信通道,在寻找通道资源的过程中,往往会耗费大量的时间精力和试错成本。国内垃圾短信泛滥的背景下,导致短信通道时不时成为监管部门的重点整治对象,让各类应用开发者背负着不能承受的痛。
由此,一些开发者开始使用语音验证码来代替短信验证码。跟短信验证码相对,语音验证码是通过语音电话直接呼到用户手机,实现电话语音播报的方式。解决了网站用户或会员用户经常因各种问题不能接收到产品端发出的短信验证码的问题。给管理者带来更轻松更高效的运营,也为用户带来更好的使用体验。
目前能够提供优质语音验证码能力的厂商为数很少,笔者经过测试体验,发现云通讯平台提供这项服务可圈可点,尤其以下几点是短信验证码缺失的:下发及时稳定、到达率高、不被拦截,更值得一提的是资费和短信基本一致。
从整体上来说,云通讯平台面向企业及开发者提供基于传统电信网与互联网结合的通话、多方语音、视频通话等通讯能力,合作伙伴通过嵌入云通讯API能够在应用中轻松实现短信、语音对讲、网络通话、web呼叫、双向回拨、语音验证码、语音会议、视频通话等功能。语音验证码是云通讯平台提供的一种基础能力,开发者可以直接登录云通讯官网()进行注册,简单调用API接口,在短时间内完成对接,使用云通讯平台赠送的资费礼包基本就可以跑完整个开发流程。
编 辑:王鹏
CCTIME飞象网
CopyRight &
京ICP备号&&
公司名称: 北京飞象互动文化传媒有限公司 &法律顾问:万国法源律师事务所律师 王海疆
未经书面许可,禁止转载、摘编、复制、镜像短信验证码和语音验证码的差别
  在这个互联网大数据时代,相信已经没有人不了解互联网,然而在这个科技依旧急速发展的今天,有一个话题始终是人们关注的重点。那就是个人信息安全问题。为了保证个人的信息安全,很多企业在自己的网站上或者项目中都加上了信息验证的功能。如今最为流行的就是短信验证方式和语音验证方式。这两种验证方式都是为了做身份认证的鉴权,本质上都是触发验证,完成验证即可。那么这两种验证方式,哪种更加适用呢,那么广大的互联网商家该如何选择呢?以下内容可以给大家一个参考。
  语音验证码大致有以下几种实现页面播放方式:1、通过网站添加播放器将验证码以语音方式播放出来。2、通过通讯方式直接呼叫预留电话获取验证码。3、通过网站功能直接通过绑定电话接听验证码。但是语音验证码的语音辨识不够清晰,且操作的时间流程长,便捷度不高,用户体验度不高。
  现在移动互联网商家在反复探讨的重点是在用户体验度,则是从用户体验的角度出发,主要体现在速度和到达率上,特别在用户注册、用户支付时的校验短信和快递物流通知、票务信息通知时,短信验证码的到达率、速度和可见性显得尤为重要。市面上任何一家通道服务商都无法承诺可以做到100%发达到率,当然这有受到手机信号、号码黑名单等因素的影响。短信验证码的用户体验度和便捷度都是语音验证码所无法比拟的,但在短信验证码无法接收的情况下,电话验证可以保证整个流程顺利进行下去。
  在信息安全方面:短信验证和语音验证的信息与民众生活息息相关,随着不法分子的干扰,信息安全变成商家愈发重视的问题。手机木马、电话窃听,随着智能手机的普及,很多私密信息的保护变得脆弱如纸。由于手机验证码短信要求核实方必须是个真实的用户,甚至产生了专门做短信验证码服务的卡商和网站应用刷单的赚客。短信验证码和语音验证码两者都具备不同方向的入侵风险,这个与通道服务商后台监控有关。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 语音验证码转短信 的文章

 

随机推荐