精华内容
下载资源
问答
  • 短信验证码收费方式方面,彼此各不相同,具体有按充值金额收费、按当月短信发送量收费、按购买短信条数收费等几种,而且基本上都是要求企业预付费才能使用;在短信验证码收费价格方面,它们基本上都集中在3.0-6.0...

    亿佰云、秒嘀科技、极光短信、华信云通信这四家短信验证码平台都是怎么收费的,一条短信验证码价格多少钱,企业应当如何进行选择。今天评测下 亿佰云、秒嘀科技、极光短信和华信云通信短信验证码平台的短信验验证码服务收费情况。

    ➤ 短信验证码平台收费价格对比

    目前市面上主流的短信验证码平台数量和类型都多种多样,就短信验证码收费方式而言,短信验证平台基本上都采取企业预付费的方式来提供短信验证码服务。企业预付费通常有两种方式,分别是购买短信条数和充值一定的金额,并且企业在一定时间期限内的短信验证码使用量越高,则单次短信验证码的使用价格就越低,即量大从优原则。

    就短信验证码的具体收费价格而言,现在市面上短信验证平台一条短信验证码的收费价格大多数都集中在3.0-6.0分/条左右,并且以4.0-5.0分/条这样的收费价格最为常见,而也有一些极少数的短信验证平台会提供2.0-3.0分/条的低价服务或者是6.0-7.0分/条的高价服务。

    关于 亿佰云、秒嘀科技、极光短信、华信云通信这四家短信验证码平台的具体收费方式,今天以企业需要一次性购买0.3-300万条的国内短信为例,为你说明这四家服务商的收费价格情况,具体如下所示(单位:分/条):

    在这里插入图片描述

    由上表可知的是, 亿佰云、秒嘀科技、极光短信和华信云通信这四家短信验证平台的收费价格各不一样。具体而言,在收费方式上,亿佰云和华信云通信均按照充值金额收费,秒嘀科技和极光短信均按照购买条数收费;在收费标准上,这四家服务商的收费价格基本上均介于3.0-6.0分/条之间,以上信息在企业选择时短信服务时仅提供参考。

    另外亿佰云和华信云通信这两家短信验证码平台除了国内短信验证码之外,还能够提供国际短信验证码服务, 提供价格具体如下:

    • 亿佰云: 宣称支持全球超过200多个国家和地区的短信发送业务,其收费价格依据充值金额而定,大致上介于0.04-0.052元/条。

    • 华信云通信: 并未说明支持的国家和地区,其收费价格依据购买条数而定,大致上介于0.04-0.055元/条。

    ➤ 各自的短信验证码的详细收费标准

    ▌亿佰云

    亿佰云根据企业充值金额收费,收费价格大致上介于4.0-5.2分/条之间;短信使用的有效期限为24个月。企业充值后,短信验证码的使用没有时间期限,什么时候使用完毕就什么时候再进行充值,收费更加灵活方便。

    关于 亿佰云的具体收费标准如下图所示:

    在这里插入图片描述

    ▌秒嘀科技

    秒嘀科技根据企业购买的短信验证码条数确定对应的收费价格,收费价格大致上介于3.5-4.5分/条之间。企业在充值后,短信验证码的使用有效期限有两种,分为6个月和12个月,若有效期使用完毕,则需要继续进行充值,否则就会因欠费导致短信验证码功能关闭。

    关于秒嘀科技的具体收费标准如下图所示:

    在这里插入图片描述

    ▌极光短信

    极光短信根据企业购买的短信验证码条数来确定对应的收费价格,收费价格大致上介于3.6-5.5分/条之间。企业充值后,短信验证码的使用没有时间期限,什么时候使用完毕就什么时候再进行充值,收费更加灵活方便。

    关于极光短信的具体收费标准如下图所示:

    在这里插入图片描述

    ▌华信云通信

    华信云通信根据企业的充值金额来确定对应的收费价格,收费价格大致上介于3.5-5.0分/条之间。企业充值后,短信验证码的使用没有时间期限,什么时候使用完毕就什么时候再进行充值,收费更加灵活方便。

    关于华信云通信的具体收费标准如下图所示:

    在这里插入图片描述

    ➤ 小结

    亿佰云、秒嘀科技、极光短信和华信云通信这四家主流的短信验证码平台,在短信验证码收费方式方面,彼此各不相同,具体有按充值金额收费、按当月短信发送量收费、按购买短信条数收费等几种,而且基本上都是要求企业预付费才能使用;在短信验证码收费价格方面,它们基本上都集中在3.0-6.0分/条之间。以上信息在企业选择时短信服务时仅提供参考。

    《短信验证码平台收费价格对比:亿佰云、秒嘀科技、极光短信、华信云通信.xlsx》

    >> 相关阅读

    短信验证码的安全防护策略
    短信接口被恶意调用怎么办?
    短信接口被恶意调用?
    我们公司的短信接口被刷了,怎么解决?
    如何防止恶意攻击短信验证码接口?
    如何预防短信验证码被别人盗用?
    避免短信接口被黑客调用的方式?
    如何防止短信验证码接口、登录注册入口被恶意调用攻击?
    2021全网最全短信服务商排名(100余家短信商户对照)
    百家企业短信网关(背景及核心代码)-1-开源项目短信接口征集

    展开全文
  • 手机接收短信验证码

    2018-01-06 16:45:57
    本人小白,无意做项目时想到怎样接收短信通知,于是上网查资料,了解了些许,做了一个大概的接收短信验证码的工具,勿喷。
  • 短信验证码收费方式方面,彼此各不相同,具体有按充值金额收费、按当月短信发送量收费、按购买短信条数收费等几种,而且基本上都是要求企业预付费才能使用;在短信验证码收费价格方面,它们基本上都集中在3.6-6.0...
  • “ 目前市面上主营短信验证码业务的平台有哪几家、手机验证码平台哪个好,它们提供哪些短信验证码服务,短信发送的速度、送达率和稳定性等技术性能如何,短信收费价格多少钱。今天通过评测阿里云、梦网云通讯、容联...

    「2021年」国内主流短信验证码平台综合评测

    目前市面上主营短信验证码业务的平台有哪几家、手机验证码平台哪个好,它们提供哪些短信验证码服务,短信发送的速度、送达率和稳定性等技术性能如何,短信收费价格多少钱。今天通过评测阿里云、梦网云通讯、容联云通讯、互亿无线、亿佰云、秒嘀科技、极光短信、华信云通信等8家手机验证码平台哪个好。

    在这里插入图片描述

    短信验证码与语音验证码、图片验证码、视频验证码等一样均属于一种身份验证的方式,它具有防止刷单作弊行为、保护账户资金安全、获取用户联系方式、提升用户使用体验等多项优点,目前在产品的注册登录、重要信息修改、支付转账等诸多操作环节中都有广泛的实际应用,用户的接受度也非常高。现在市面上有很多企业都发展了短信验证码业务,例如传统的通讯服务商、时下发展迅速的云通讯服务商等,企业在挑选时应当先免费试用,然后再结合企业资质、技术以及收费等信息进行综合选择。

    ➤ 主流短信验证码业务平台有哪些?

    在综合考察了企业的发展规模、验证码短信服务、技术性能以及收费价格等多项指标后,挑选了以下8家国内主流的短信验证码平台,并介绍主流的手机验证码平台哪个好。它们分别是阿里云、梦网云通讯、容联云通讯、互亿无线、亿佰云、秒嘀科技、极光短信、华信云通信。

    在这里插入图片描述

    ➤ 如何评测一家短信验证码平台?

    接下来就从上述这8家短信验证码业务平台的验证码短信服务与性能、短信验证码收费价格两个方面为你作出详细评测,帮助您综合对比决策手机验证码平台哪个好。

    (一)短信验证码服务与性能

    短信验证码业务的发展主要受服务与性能两部分的影响,具体如下:

    ▌短信验证码服务内容: 具体包括短信验证码的发送(如发送范围、发送类型、语音验证码辅助等)和数据统计(如数据统计方式、数据统计内容等)两项内容。

    ▌短信验证码技术性能: 具体包括SP证书、短信发送速度、短信送达率、短信接口并发数、短信运营商直连通道、三网合一短信通道、备份短信通道、典型合作企业等多项内容。

    在服务与性能方面,这8家手机验证码平台哪个好的详细对比可参见:

    《国内主流短信验证码平台服务与性能对比「一」: 阿里云、梦网云通讯、容联云通讯、互亿无线》

    《国内主流短信验证码平台服务与性能对比「二」:亿佰云、秒嘀科技、极光短信、华信云通信》

    (二)短信验证码收费价格

    目前市面上尽管有数量众多的短信验证码业务平台,但在收费方式方面,它们基本上都是采取企业预付费的方式提供短信验证码服务,并遵循“量大从优”的原则,企业预付费具体包括企业预先充值金额来获得对应的优惠价格和购买包含一定短信条数的短信包两种方式。而在收费标准方面,目前市面上绝大多数服务商的单次短信验证码收费价格一般在3.0-6.0分/条左右,并且以4.0-5.0分/条这样的收费价格最为常见。

    关于这8家短信验证码平台的收费价格方面的对比,具体可参见:

    《国内主流短信验证码平台收费价格对比「一」:阿里云、梦网云通讯、容联云通讯、互亿无线》

    《国内主流短信验证码平台收费价格对比「二」:亿佰云、秒嘀科技、极光短信、华信云通信》

    >> 相关阅读

    短信验证码的安全防护策略
    短信接口被恶意调用怎么办?
    短信接口被恶意调用?
    我们公司的短信接口被刷了,怎么解决?
    如何防止恶意攻击短信验证码接口?
    如何预防短信验证码被别人盗用?
    避免短信接口被黑客调用的方式?
    如何防止短信验证码接口、登录注册入口被恶意调用攻击?
    2021全网最全短信服务商排名(100余家短信商户对照)
    百家企业短信网关(背景及核心代码)-1-开源项目短信接口征集

    展开全文
  • 短信验证码收费方式方面,彼此各不相同,具体有按充值金额收费、按当月短信发送量收费、按购买短信条数收费等几种,而且基本上都是要求企业预付费才能使用;在短信验证码收费价格方面,它们基本上都集中在3.0-6.0...
  • 短信验证码收费方式方面,彼此各不相同,具体有按充值金额收费、按当月短信发送量收费、按购买短信条数收费等几种,而且基本上都是要求企业预付费才能使用;在短信验证码收费价格方面,它们基本上都集中在3.0-6.0...

    亿佰云、秒嘀科技、极光短信、华信云通信这四家短信验证码平台都是怎么收费的,一条短信验证码价格多少钱,企业应当如何进行选择。今天评测下 亿佰云、秒嘀科技、极光短信和华信云通信短信验证码平台的短信验验证码服务收费情况。

    ➤ 短信验证码平台收费价格对比

    目前市面上主流的短信验证码平台数量和类型都多种多样,就短信验证码收费方式而言,短信验证平台基本上都采取企业预付费的方式来提供短信验证码服务。企业预付费通常有两种方式,分别是购买短信条数和充值一定的金额,并且企业在一定时间期限内的短信验证码使用量越高,则单次短信验证码的使用价格就越低,即量大从优原则。

    就短信验证码的具体收费价格而言,现在市面上短信验证平台一条短信验证码的收费价格大多数都集中在3.0-6.0分/条左右,并且以4.0-5.0分/条这样的收费价格最为常见,而也有一些极少数的短信验证平台会提供2.0-3.0分/条的低价服务或者是6.0-7.0分/条的高价服务。

    关于 亿佰云、秒嘀科技、极光短信、华信云通信这四家短信验证码平台的具体收费方式,今天以企业需要一次性购买0.3-300万条的国内短信为例,为你说明这四家服务商的收费价格情况,具体如下所示(单位:分/条):

    在这里插入图片描述

    由上表可知的是, 亿佰云、秒嘀科技、极光短信和华信云通信这四家短信验证平台的收费价格各不一样。具体而言,在收费方式上,亿佰云和华信云通信均按照充值金额收费,秒嘀科技和极光短信均按照购买条数收费;在收费标准上,这四家服务商的收费价格基本上均介于3.0-6.0分/条之间,以上信息在企业选择时短信服务时仅提供参考。

    另外亿佰云和华信云通信这两家短信验证码平台除了国内短信验证码之外,还能够提供国际短信验证码服务, 提供价格具体如下:

    • 亿佰云: 宣称支持全球超过200多个国家和地区的短信发送业务,其收费价格依据充值金额而定,大致上介于0.04-0.052元/条。

    • 华信云通信: 并未说明支持的国家和地区,其收费价格依据购买条数而定,大致上介于0.04-0.055元/条。

    ➤ 各自的短信验证码的详细收费标准

    ▌亿佰云

    亿佰云根据企业充值金额收费,收费价格大致上介于4.0-5.2分/条之间;短信使用的有效期限为24个月。企业充值后,短信验证码的使用没有时间期限,什么时候使用完毕就什么时候再进行充值,收费更加灵活方便。

    关于 亿佰云的具体收费标准如下图所示:

    在这里插入图片描述

    ▌秒嘀科技

    秒嘀科技根据企业购买的短信验证码条数确定对应的收费价格,收费价格大致上介于3.5-4.5分/条之间。企业在充值后,短信验证码的使用有效期限有两种,分为6个月和12个月,若有效期使用完毕,则需要继续进行充值,否则就会因欠费导致短信验证码功能关闭。

    关于秒嘀科技的具体收费标准如下图所示:

    在这里插入图片描述

    ▌极光短信

    极光短信根据企业购买的短信验证码条数来确定对应的收费价格,收费价格大致上介于3.6-5.5分/条之间。企业充值后,短信验证码的使用没有时间期限,什么时候使用完毕就什么时候再进行充值,收费更加灵活方便。

    关于极光短信的具体收费标准如下图所示:

    在这里插入图片描述

    ▌华信云通信

    华信云通信根据企业的充值金额来确定对应的收费价格,收费价格大致上介于3.5-5.0分/条之间。企业充值后,短信验证码的使用没有时间期限,什么时候使用完毕就什么时候再进行充值,收费更加灵活方便。

    关于华信云通信的具体收费标准如下图所示:

    在这里插入图片描述

    ➤ 小结

    亿佰云、秒嘀科技、极光短信和华信云通信这四家主流的短信验证码平台,在短信验证码收费方式方面,彼此各不相同,具体有按充值金额收费、按当月短信发送量收费、按购买短信条数收费等几种,而且基本上都是要求企业预付费才能使用;在短信验证码收费价格方面,它们基本上都集中在3.0-6.0分/条之间。以上信息在企业选择时短信服务时仅提供参考。

    《短信验证码平台收费价格对比:亿佰云、秒嘀科技、极光短信、华信云通信.xlsx》

    >> 相关阅读

    短信验证码的安全防护策略
    短信接口被恶意调用怎么办?
    短信接口被恶意调用?
    我们公司的短信接口被刷了,怎么解决?
    如何防止恶意攻击短信验证码接口?
    如何预防短信验证码被别人盗用?
    避免短信接口被黑客调用的方式?
    如何防止短信验证码接口、登录注册入口被恶意调用攻击?
    2021全网最全短信服务商排名(100余家短信商户对照)
    百家企业短信网关(背景及核心代码)-1-开源项目短信接口征集

    展开全文
  • springboot整合redis实现发送短信验证码

    万次阅读 热门讨论 2018-06-11 14:17:15
    我用的短信平台是阿里云的,需要付费购买服务,购买地址:https://common-buy.aliyun.com/?spm=5176.8195934.907839.sms6.312c4183mzE9Yb&&commodityCode=newdysmsbag#/buy 付费完成后,首先申请短信签名...

        我用的短信平台是阿里云的,需要付费购买服务,购买地址:https://common-buy.aliyun.com/?spm=5176.8195934.907839.sms6.312c4183mzE9Yb&&commodityCode=newdysmsbag#/buy

        付费完成后,首先申请短信签名和短信模板:https://help.aliyun.com/document_detail/55327.html?spm=a2c4g.11186623.6.549.huzd56。

    短信签名:根据用户属性来创建符合自身属性的签名信息。企业用户需要上传相关企业资质证明,个人用户需要上传证明个人身份的证明。注意:短信签名需要审核通过后才可以使用。

    短信模板:短信模板,即具体发送的短信内容。短信模板可以支持验证码、短信通知、推广短信、国际/港澳台消息四种模式。验证码和短信通知,通过变量替换实现个性短信定制。推广短信不支持在模板中添加变量。短信模板需要审核通过后才可以使用。

    短信示例:【阿里云】 验证码${number},您正进行支付宝的身份验证,打死不告诉别人!这里的短信签名:阿里云,短信模板: 验证码${number},您正进行支付宝的身份验证,打死不告诉别人!

        最后获取 asscessKeyId 和 accessKeySecret 。结合阿里云提供的开发者文档即可进行接口开发,短信开发api文档:https://help.aliyun.com/product/44282.html?spm=a2c4g.750001.6.1.T84wBi

    一、安装redis

    下载地址:http://redis.io/download,下载最新稳定版本。

    在/usr/local创建redis文件夹上传下载的安装包到redis目录下:

    安装:

    $ tar -zxvf redis-4.0.9.tar.gz
    $ cd redis-4.0.9
    $ make

    安装完成后的目录:

    $ cd  src
    $ ./redis-server  ../redis.conf
    ./redis-server 这种方式启动redis 使用的是默认配置。可以通过启动参数告诉redis使用指定配置文件使用下面命令启动。

    二、创建maven工程,目录结构如下:

    三、pom.xml文件添加redis依赖

    <!--redis-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    四、application.properties添加redis配置

    五、随机生成验证码工具类

    public class IdentifyCodeUtil {
    
        public static String getRandom() {
            String num = "";
            for (int i = 0; i < 6; i++) {
                num = num + String.valueOf((int) Math.floor(Math.random() * 9 + 1));
            }
            return num;
        }
    }

    六、redis缓存配置类

         sprringboot启动类Application.java加入注解:@EnableCaching

       配置redis采用缓存,设置key和value的序列化方式

    package com.jp.tech.applet.ms.sms;
    
    import com.fasterxml.jackson.annotation.JsonAutoDetect;
    import com.fasterxml.jackson.annotation.PropertyAccessor;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.springframework.cache.CacheManager;
    import org.springframework.cache.annotation.CachingConfigurerSupport;
    import org.springframework.cache.annotation.EnableCaching;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.cache.RedisCacheManager;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
    
    
    /**
     * Redis缓存配置类
     *
     * @author yangfeng
     */
    @Configuration
    @EnableCaching
    public class RedisConfig extends CachingConfigurerSupport {
    
        //缓存管理器
        @Bean
        public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {
            RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
            //设置缓存过期时间
            //cacheManager.setDefaultExpiration(20);
            return cacheManager;
        }
    
        @Bean
        public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
            StringRedisTemplate template = new StringRedisTemplate(factory);
            setSerializer(template);//设置序列化工具
            template.afterPropertiesSet();
            return template;
        }
    
        private void setSerializer(StringRedisTemplate template) {
            @SuppressWarnings({"rawtypes", "unchecked"})
            Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
            ObjectMapper om = new ObjectMapper();
            om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
            jackson2JsonRedisSerializer.setObjectMapper(om);
            template.setValueSerializer(jackson2JsonRedisSerializer);
        }
    }

    七、redis接口类

          此接口用于连接redis操作生成的验证码,设置过期时间。

    public interface IRedisService {
    
        /**
         * 设置key-value
         * @param key
         * @param value
         */
        void setKey(String key, String value);
    
        /**
         * 获取key
         * @param key
         * @return
         */
        String getValue(String key);
    
        /**
         * 删除key
         * @param key
         */
        void delete(String key);
    }

    八、redis接口实现类

          保存、获取、删除验证码接口实现方法。

    import com.jp.tech.applet.ms.sms.service.IRedisService;
    import org.springframework.data.redis.core.*;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.Resource;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import java.util.concurrent.TimeUnit;
    
    @Service
    public class RedisService implements IRedisService {
    
        @Resource
        private RedisTemplate redisTemplate;
    
        @Override
        public void setKey(String key, String value) {
            ValueOperations<String, String> ops = redisTemplate.opsForValue();
            ops.set(key, value, 900, TimeUnit.SECONDS);//15分钟过期
        }
    
        @Override
        public String getValue(String key) {
            ValueOperations<String, String> ops = redisTemplate.opsForValue();
            return ops.get(key);
        }
    
        @Override
        public void delete(String key) {
            redisTemplate.delete(key);
        }
     
    }

    九、发送短信接口类

    package com.jp.zpzc.service;
    
    import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
    import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
    import com.aliyuncs.exceptions.ClientException;
    import com.jp.framework.common.model.ServiceResult;
    
    public interface ISmsService {
    
        /**
         * 发送短信接口
         *
         * @param phoneNums     手机号码
         * @param signName      模板签名
         * @param templeteCode  模板代码
         * @param templateParam 模板替换参数
         * @param outId         提供给业务方扩展字段
         * @return
         * @throws ClientException
         */
        SendSmsResponse sendSms(String phoneNums, String signName, String templeteCode,
                                String templateParam, String outId) throws ClientException;
    
        /**
         * 查询短信发送明细
         *
         * @param phoneNumber
         * @param bizId       业务流水号
         * @return
         * @throws ClientException
         */
        QuerySendDetailsResponse querySendDetails(String phoneNumber, String bizId) throws ClientException;
    
        /**
         * 发送短信服务
         *
         * @param mobile 手机号
         * @return
         */
        ServiceResult<Object> sendMessage(String mobile);
    
    
        /**
         * 判断验证码是否正确
         *
         * @param mobile
         * @param identifyCode
         * @return
         */
        ServiceResult<Boolean> checkIsCorrectCode(String mobile, String identifyCode);
    
    }
    

    十、短信接口实现类

    pom中引入阿里云短信SDK:

            <!--阿里云短信服务平台-->
            <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>aliyun-java-sdk-core</artifactId>
                <version>3.3.1</version>
            </dependency>
            <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
                <version>1.1.0</version>
            </dependency>

    application.properties加入调用接口的认证信息:

    aliyun.sms.accessKeyId=LTAIr0fPaMi66tCy111
    aliyun.sms.accessKeySecret=bQ9Re8uV14yRKKhWdWAbbUO15EM7w1​111

    这里我用的是阿里云短信平台,根据提供的demo自己整理后的接口实现。

    smsService.sendSms(phoneName, "XXXXXX", "XXXXXXX", JSON.toJSONString(codeMap), null)

    第一个XXXXX代表申请的短信签名名称,第二个代表申请的短信模板编码,改成自己申请的即可。

    package com.jp.zpzc.service.impl;
    
    import com.alibaba.fastjson.JSON;
    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.IAcsClient;
    import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
    import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
    import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
    import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.profile.DefaultProfile;
    import com.aliyuncs.profile.IClientProfile;
    import com.jp.framework.common.model.ServiceResult;
    import com.jp.framework.common.model.ServiceResultHelper;
    import com.jp.framework.common.util.Constant;
    import com.jp.framework.common.util.IdentifyCodeUtil;
    import com.jp.zpzc.service.IRedisService;
    import com.jp.zpzc.service.ISmsService;
    import org.apache.commons.lang3.StringUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.Resource;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    
    @Service
    public class SmsService implements ISmsService {
    
        private Logger logger = LoggerFactory.getLogger(this.getClass());
    
        //产品名称:云通信短信API产品,开发者无需替换
        static final String product = "Dysmsapi";
        //产品域名,开发者无需替换
        static final String domain = "dysmsapi.aliyuncs.com";
    
        @Value("${aliyun.sms.accessKeyId}")
        private String accessKeyId;
        @Value("${aliyun.sms.accessKeySecret}")
        private String accessKeySecret;
    
        @Resource
        private IRedisService redisService;
    
        /**
         * 发送短信服务
         *
         * @param mobile
         * @return
         */
        public ServiceResult<Object> sendMessage(String mobile) {
            if (StringUtils.isEmpty(mobile)) {
                return ServiceResultHelper.genResultWithFaild(Constant.ErrorCode.INVALID_PARAM_MSG, Constant.ErrorCode.INVALID_PARAM_CODE);
            }
            String identifyCode;
            //1. 判断是否缓存该账号验证码
            String returnCode = redisService.getValue(mobile + Constant.SMS_LOGIN_IDENTIFY_CODE);
            if (!StringUtils.isEmpty(returnCode)) {
                identifyCode = returnCode;
            } else {
                identifyCode = IdentifyCodeUtil.getRandom();
            }
            //2.发送短信
            Map<String, String> codeMap = new HashMap<>();
            codeMap.put("code", identifyCode);
            SendSmsResponse response;
            try {
                response = sendSms(mobile, XXXXX, XXXXX, JSON.toJSONString(codeMap), null);
                //短信发送成功后存入redis
                if (response != null && Constant.SMS_SEND_STATUS_OK.equalsIgnoreCase(response.getCode()) && StringUtils.isEmpty(returnCode)) {
                    redisService.setKey(mobile + Constant.SMS_LOGIN_IDENTIFY_CODE, identifyCode);
                }
                return ServiceResultHelper.genResultWithSuccess(response);
            } catch (Exception e) {
                logger.error("sendMessage method invoke error: {}", e.getMessage());
            }
            return ServiceResultHelper.genResultWithFaild("短信发送失败", null);
        }
    
        /**
         * 发送短信接口
         *
         * @param phoneNums
         * @param signName      模板签名
         * @param templeteCode  模板代码
         * @param templateParam 模板替换参数
         * @param outId         提供给业务方扩展字段
         * @return
         * @throws ClientException
         */
        @Override
        public SendSmsResponse sendSms(String phoneNums, String signName, String templeteCode, String templateParam, String outId) throws ClientException {
            //可自助调整超时时间
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");
    
            //初始化acsClient,暂不支持region化
            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);
    
            //组装请求对象-具体描述见控制台-文档部分内容
            SendSmsRequest request = new SendSmsRequest();
            //必填:待发送手机号
            request.setPhoneNumbers(phoneNums);
            //必填:短信签名-可在短信控制台中找到
            request.setSignName(signName);//众评众测
            //必填:短信模板-可在短信控制台中找到
            request.setTemplateCode(templeteCode);
            //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
            request.setTemplateParam(templateParam);//{"code":"152745"}
    
            //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
            //request.setSmsUpExtendCode("90997");
    
            //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
            request.setOutId(outId);//zpzc
    
            //hint 此处可能会抛出异常,注意catch
    
            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
            acsClient.getAcsResponse(request);
            return sendSmsResponse;
        }
    
        /**
         * 判断验证码是否正确
         *
         * @param mobile
         * @param identifyCode
         * @return
         */
        public ServiceResult<Boolean> checkIsCorrectCode(String mobile, String identifyCode) {
            if (StringUtils.isEmpty(mobile) || StringUtils.isEmpty(identifyCode)) {
                return ServiceResultHelper.genResultWithFaild(Constant.ErrorCode.INVALID_PARAM_MSG, Constant.ErrorCode.INVALID_PARAM_CODE);
            }
            String returnCode = redisService.getValue(mobile + Constant.SMS_LOGIN_IDENTIFY_CODE);
            if (!StringUtils.isEmpty(returnCode) && returnCode.equals(identifyCode)) {
                return ServiceResultHelper.genResultWithSuccess();
            }
            return ServiceResultHelper.genResultWithFaild();
        }
    
        /**
         * 查询短信发送明细
         *
         * @param phoneNumber
         * @param bizId
         * @return
         * @throws ClientException
         */
        @Override
        public QuerySendDetailsResponse querySendDetails(String phoneNumber, String bizId) throws ClientException {
            //可自助调整超时时间
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");
    
            //初始化acsClient,暂不支持region化
            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);
    
            //组装请求对象
            QuerySendDetailsRequest request = new QuerySendDetailsRequest();
            //必填-号码
            request.setPhoneNumber(phoneNumber);
            //可选-流水号
            request.setBizId(bizId);
            //必填-发送日期 支持30天内记录查询,格式yyyyMMdd
            SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");
            request.setSendDate(ft.format(new Date()));
            //必填-页大小
            request.setPageSize(10L);
            //必填-当前页码从1开始计数
            request.setCurrentPage(1L);
    
            //hint 此处可能会抛出异常,注意catch
            QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);
            return querySendDetailsResponse;
        }
    }
    

    十一、controller类

           调用redis存入随机生成的验证码,调用短信平台接口发送验证码。

    package com.jp.zpzc.controller.sms;
    
    import com.jp.zpzc.service.ISmsService;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.annotation.Resource;
    
    
    /**
     * 短信验证码接口
     *
     * @author yangfeng
     * @date 2018-06-09 16:02
     **/
    @RestController
    @RequestMapping("/smsVerifityCode")
    public class SmsVerifityCodeController {
    
        private Logger LOG = LoggerFactory.getLogger(this.getClass());
    
        @Resource
        private ISmsService smsService;
    
        /**
         * 发送短信验证码
         *
         * @param mobile
         * @return
         */
        @RequestMapping("/sendMessage")
        public Object sendMessage(@RequestParam String mobile) {
            return smsService.sendMessage(mobile);
        }
    
        /**
         * 判断验证码是否正确
         *
         * @param mobile
         * @param identifyCode
         * @return
         */
        @RequestMapping("/checkIsCorrectCode")
        public Object checkIsCorrectCode(@RequestParam String mobile, @RequestParam String identifyCode) {
            return smsService.checkIsCorrectCode(mobile, identifyCode);
        }
    }
    

    十二、短信发送测试


    短信发送成功。

    附:

    Constant类代码:

    package com.jp.tech.applet.common.constant;
    
    public class Constant {
        
    
        public static class ErrorCode {
    
            /**
             * 无效参数
             */
            public static Integer INVALID_PARAM_CODE = -101;
            public static String INVALID_PARAM_MSG = "无效参数";
    
            /**
             * 没有权限
             */
            public static Integer PERMISSION_DENIED_CODE = -102;
            public static String PERMISSION_DENIED_MSG = "没有权限";
    
            /**
             * 通用错误
             */
            public static Integer COMMON_ERROR_CODE = -103;
            public static String COMMON_ERROR_MSG = "服务器繁忙,请稍后再试";
    
            /**
             * 登录失效
             */
            public static Integer INVALID_LOGIN_CODE = -104;
            public static String INVALID_LOGIN_MSG = "登录失效";
    
            /**
             * 数据库操作失败
             */
            public static Integer DATABASE_OPERATION_ERROR_CODE = -105;
            public static String DATABASE_OPERATION_ERROR_MSG = "数据库操作失败";
    
            /**
             * token失效
             */
            public static Integer INVALID_TOKEN_CODE = -106;
            public static String INVALID_TOKEN_MSG = "用户未登录或登录信息已失效";
    
            /**
             * 服务器异常
             */
            public static Integer SERVER_ERROR_CODE = -200;
            public static String SERVER_ERROR_MSG = "服务器异常";
    
        }
           
    }
    
    

     ServiceResultHelper 类:

    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package com.jp.framework.common.model;
    
    import com.jp.framework.common.util.Constant;
    
    public class ServiceResultHelper {
        public ServiceResultHelper() {
        }
    
        public static <T> ServiceResult<T> genResult(boolean succeed, int retCode, String msg, T obj) {
            ServiceResult ret = new ServiceResult();
            ret.setData(obj);
            ret.setMsg(msg);
            ret.setCode(retCode);
            ret.setSucceed(succeed);
            return ret;
        }
    
        public static <T> boolean isSuccess(ServiceResult<T> result) {
            return result != null && result.isSucceed() && result.getCode() == 0;
        }
    
    
        public static <T> ServiceResult<T> genResultWithSuccess(T obj) {
            return genResult(true, Constant.SUCCESS, "成功", obj);
        }
    
        public static <T> ServiceResult<T> genResultWithSuccess() {
            return genResult(true, Constant.SUCCESS, "成功", (Object)null);
        }
    
        public static <T> ServiceResult<T> genResultWithFaild() {
            return genResult(false, Constant.FAILED, "失败", (Object)null);
        }
    
        public static <T> ServiceResult<T> genResultWithFaild(String msg, Integer code) {
            return genResult(false, code, msg, (Object)null);
        }
    
        public static <T> ServiceResult<T> genResultWithDataNull() {
            return genResult(false, Constant.SUCCESS, "数据为空", (Object)null);
        }
    
    }
    

    ServiceResult 类:

    
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonInclude.Include;
    import com.backstage.core.constant.Constant;
    import org.apache.commons.lang3.builder.ToStringBuilder;
    import org.apache.commons.lang3.builder.ToStringStyle;
    
    import java.util.HashMap;
    import java.util.Map;
    
    @JsonInclude(Include.ALWAYS)
    public final class ServiceResult<T> {
        private static final long serialVersionUID = 6977558218691386450L;
        private boolean succeed = true;
        private int code;
        private int subCode;
        private String msg;
        private T data;
        private Map<String, Object> additionalProperties;
    
        public ServiceResult() {
            this.code = Constant.SUCCESS;
            this.subCode = Constant.SUCCESS;
            this.additionalProperties = new HashMap();
        }
    
        public static ServiceResult<Boolean> error() {
            return error(500, "未知异常,请联系管理员");
        }
    
        public static ServiceResult<Boolean> error(String msg) {
            return error(500, msg);
        }
    
        public static ServiceResult<Boolean> error(int subCode, String msg) {
            ServiceResult result = new ServiceResult();
            result.setCode(Constant.FAILED);
            result.setSubCode(subCode);
            result.setSucceed(false);
            result.setMsg(msg);
            return result;
        }
    
        public static ServiceResult ok() {
            return ok(Constant.SUCCESS, "成功");
        }
    
        public static ServiceResult ok(int code, String msg) {
            ServiceResult result = new ServiceResult();
            result.setCode(code);
            result.setSucceed(true);
            result.setMsg(msg);
            return result;
        }
    
        public static ServiceResult ok(Object data) {
            ServiceResult d = new ServiceResult();
            d.setSucceed(true);
            d.setData(data);
            d.setCode(Constant.SUCCESS);
            d.setMsg("成功");
            return d;
        }
    
        public static ServiceResult ok(Object data, Map<String, Object> additionalProperties) {
            ServiceResult d = new ServiceResult();
            d.setSucceed(true);
            d.setData(data);
            d.setCode(Constant.SUCCESS);
            d.setMsg("成功");
            d.additionalProperties.putAll(additionalProperties);
            return d;
        }
    
        public ServiceResult(T data) {
            this.code = Constant.SUCCESS;
            this.subCode = Constant.SUCCESS;
            this.additionalProperties = new HashMap();
            this.data = data;
        }
    
        public ServiceResult(boolean succeed, int code, String msg) {
            this.code = Constant.SUCCESS;
            this.subCode = Constant.SUCCESS;
            this.additionalProperties = new HashMap();
            this.succeed = succeed;
            this.code = code;
            this.msg = msg;
        }
    
        public ServiceResult(boolean succeed, T data, String msg) {
            this.code = Constant.SUCCESS;
            this.subCode = Constant.SUCCESS;
            this.additionalProperties = new HashMap();
            this.succeed = succeed;
            this.data = data;
            this.msg = msg;
        }
    
        public ServiceResult(boolean succeed, T data, int code, String msg) {
            this.code = Constant.SUCCESS;
            this.subCode = Constant.SUCCESS;
            this.additionalProperties = new HashMap();
            this.succeed = succeed;
            this.data = data;
            this.code = code;
            this.msg = msg;
        }
    
        public ServiceResult(boolean succeed, String msg) {
            this.code = Constant.SUCCESS;
            this.subCode = Constant.SUCCESS;
            this.additionalProperties = new HashMap();
            this.succeed = succeed;
            this.msg = msg;
        }
    
        public boolean isSucceed() {
            return this.succeed;
        }
    
        public void setSucceed(boolean succeed) {
            this.succeed = succeed;
        }
    
        public T getData() {
            return this.data;
        }
    
        public void setData(T data) {
            this.data = data;
        }
    
        public String toString() {
            return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
        }
    
        public String getMsg() {
            return this.msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    
        public int getCode() {
            return this.code;
        }
    
        public void setCode(int code) {
            this.code = code;
        }
    
        public int getSubCode() {
            return this.subCode;
        }
    
        public void setSubCode(int subCode) {
            this.subCode = subCode;
        }
    
        public Map<String, Object> getAdditionalProperties() {
            return this.additionalProperties;
        }
    
        public void setAdditionalProperties(String name, Object value) {
            this.additionalProperties.put(name, value);
        }
    
        public Object getAdditionalProperties(String name) {
            return this.additionalProperties.get(name);
        }
    }
    

     

    展开全文
  • 新版阿里云发送短信验证码详解

    千次阅读 2020-08-14 12:12:02
    SpringBoot实现阿里云新版短信服务——验证码功能
  • “ 阿里云、梦网云通讯、容联云通讯、互亿无线这四家短信验证码平台都是怎么收费的,一条短信验证码价格多少钱,企业应当如何进行选择。今天评测下阿里云、梦网云通讯、容联云通讯和互亿无线短信验证码平台的短信验...
  • 用户登录短信验证码的实现

    千次阅读 2019-06-22 16:14:18
    目前比较流行的登录方式就是短信验证码登录,但是这种方式是需要借助第三方短信提供商(即为付费的官方接口),其实现流程如下: 具体实现如下 : //使用前需要先下载包 let md5 = require('blueimp-md5'); let ...
  • 阿里云短信验证码模板

    千次阅读 2020-04-02 15:40:52
    注意: 使用前务必开通阿里云付费短信功能获取必要的key和签名!!!!!! 工具类 public class SendCode { static final String product = "Dysmsapi"; //产品域名,开发者无需替换 static final String domain = ...
  • 这1000条短信足够咱们把小程序短信功能,和小程序短信验证码功能都学会了。 废话不多说了,咱们直接来撸代码 一,使用云开发短信的条件 这个前置条件很重要,条件不满足,你就没法使用云开发短信功能。 使用条件 1...
  • 当然短信接口肯定都是要付费的,而且是基于模板的,具体的使用说明可以看这个网址里面的使用说明。 前端界面 前端的界面,可能如下,点击获取验证码,然后按钮变为灰色并且倒计时。(手机号是我的~~) ...
  • 2014 年新上线的功能:面向移动开发者的开源运营数据统计系统、手游录像分享平台及免费的短信验证码接口。 我们曾经介绍过,ShareSDK 是一家致力于面向移动开发者打造社交登录及分享的开发者工具,为移动...
  • 前言:最近在做开发中因为需要用到短信验证,在进行选择后选择了阿里云的短信验证平台(付费:简短普通短信价格在0.04元一条)。由于官网的帮助文档过于详细无法快速找到重点内容,并且SDK新旧版有较大区别,自己走了...
  • 短信验证码发送

    2021-12-02 21:20:38
    发送验证码 短信发送是电信运营商提供的服务,需要访问对应的接口,不同运营商提供的接口地址肯定不一样,如果直接访问这些接口就需要判断收信息的手机号属于哪个运营商,关键在于这些接口不对个人开放,还要考虑...
  • spring-boot | 集成短信验证码服务

    千次阅读 2017-11-13 14:31:41
    所以短信验证码作为手机号的验证方式也显得尤为重要。因此,很多公司或网站用短信验证码来验证我们的身份信息。常见的使用场景有:登录注册、信息修改、异常登录、找回密码等操作。 今天给大家分享一下如何接入当前...
  • 而且再加上平台大多数属于“先充值后使用”付费模式,一些用户就担心,短信验证码发送成功率低怎么办?万一交了钱找不到怎么办?...... 短信验证码平台能支持免费测试吗?目前大多数短信验证码平台支持用户免费测试...
  • 短信验证码

    2019-09-26 13:42:26
    最近没什么事情,整理一下自己做过的东西。...这个短信验证用的是MOB的,由于源码里的包是旧的官方解释旧的包现在是需要付费的,把旧版本的换成新版本的就好了。 转载于:https://www.cnblogs.com/A...
  • 前言 最近课程项目做一个网站,需要实现...本来想弄一个免费的短信服务商,http://www.mob.com/product/sms这家就挺不错的,支持还挺全,有 IOS Android Unity3d Cocos2d flutter apicloud 而且都是免费的! 但是...
  • Mob第三方平台提供了很强大的服务,包括短信验证码服务、社会化分享、ShareREC、Analy、Push、Pay等服务,这里只做短信验码服务。 Mob第三方平台提供的免费短信验证码服务,主要是有两种情况:审核通过之后...
  • 进入到短信服务之后可以选择免费开通短信服务,开通过后可以进入到短信服务的后台 二、配置短信消息模板,生成秘钥 1.需要配置短信消息模板,签名管理,添加签名,名称是你的项目名称或者是公司名称 2.根据自己...
  • 阿里大于,是阿里通信旗下优质便捷的云通信服务平台,整合了三大运营商的通信能力,为开发者提供简洁易用的短信/语音API,三网合一通道,按需付费。 安装laravel阿里大于(鱼)服务 1 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,079
精华内容 431
关键字:

付费短信验证码