文章目录

  • 前言
  • 一、所需sdk
  • 二、util类
    • 1.demo
    • 2.登录调用
  • 总结

前言


华为云发送短信验证码

一、所需sdk

    <!--华为云手机获取短信验证码--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId><version>4.4.15</version></dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.15</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20211205</version></dependency>

二、util类

1.demo

代码如下(示例):

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.net.URL;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
//如果JDK版本是1.8,可使用原生Base64类
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;//如果JDK版本低于1.8,请使用三方库提供Base64类
//import org.apache.commons.codec.binary.Base64;public class SendSms {//无需修改,用于格式化鉴权头域,给"X-WSSE"参数赋值private static final String WSSE_HEADER_FORMAT = "UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"";//无需修改,用于格式化鉴权头域,给"Authorization"参数赋值private static final String AUTH_HEADER_VALUE = "WSSE realm=\"SDP\",profile=\"UsernameToken\",type=\"Appkey\"";public static boolean send(String phoneNumber,String msg,Integer type) throws Exception {//必填,请参考"开发准备"获取如下数据,替换为实际值String url = ""; //APP接入地址(在控制台"应用管理"页面获取)+接口访问URIString appKey = "xx"; //APP_KeyString appSecret = "xx"; //APP_SecretString sender = ""; //国内短信签名通道号或国际/港澳台短信通道号String templateId = ""; //模板IDif (type == 0){sender = "xx";templateId = "xx";}if (type == 1){sender = "";templateId = "";}//条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称//国际/港澳台短信不用关注该参数String signature = ""; //签名名称if (type == 0)signature = "xx";if (type == 1)signature = "";//必填,全局号码格式(包含国家码),示例:+8615123456789,多个号码之间用英文逗号分隔String receiver = "+86" + phoneNumber; //短信接收人号码//选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告String statusCallBack = "";/*** 选填,使用无变量模板时请赋空值 String templateParas = "";* 单变量模板示例:模板内容为"您的验证码是${1}"时,templateParas可填写为"[\"369751\"]"* 双变量模板示例:模板内容为"您有${1}件快递请到${2}领取"时,templateParas可填写为"[\"3\",\"人民公园正门\"]"* 模板中的每个变量都必须赋值,且取值不能为空* 查看更多模板和变量规范:产品介绍>模板和变量规范*/String templateParas = "[\""+msg+"\"]"; //模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。//请求Body,不携带签名名称时,signature请填nullString body = buildRequestBody(sender, receiver, templateId, templateParas, statusCallBack, signature);if (null == body || body.isEmpty()) {System.out.println("body is null.");return false;}//请求Headers中的X-WSSE参数值String wsseHeader = buildWsseHeader(appKey, appSecret);if (null == wsseHeader || wsseHeader.isEmpty()) {System.out.println("wsse header is null.");return false;}Writer out = null;BufferedReader in = null;StringBuffer result = new StringBuffer();HttpsURLConnection connection = null;InputStream is = null;HostnameVerifier hv = new HostnameVerifier() {@Overridepublic boolean verify(String hostname, SSLSession session) {return true;}};trustAllHttpsCertificates();try {URL realUrl = new URL(url);connection = (HttpsURLConnection) realUrl.openConnection();connection.setHostnameVerifier(hv);connection.setDoOutput(true);connection.setDoInput(true);connection.setUseCaches(true);//请求方法connection.setRequestMethod("POST");//请求Headers参数connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");connection.setRequestProperty("Authorization", AUTH_HEADER_VALUE);connection.setRequestProperty("X-WSSE", wsseHeader);connection.connect();out = new OutputStreamWriter(connection.getOutputStream());out.write(body); //发送请求Body参数out.flush();out.close();int status = connection.getResponseCode();if (200 == status) { //200is = connection.getInputStream();} else { //400/401is = connection.getErrorStream();}in = new BufferedReader(new InputStreamReader(is, "UTF-8"));String line = "";while ((line = in.readLine()) != null) {result.append(line);}System.out.println(result.toString()); //打印响应消息实体} catch (Exception e) {e.printStackTrace();} finally {try {if (null != out) {out.close();}if (null != is) {is.close();}if (null != in) {in.close();}} catch (Exception e) {e.printStackTrace();}}return true;}/*** 构造请求Body体* @param sender* @param receiver* @param templateId* @param templateParas* @param statusCallBack* @param signature | 签名名称,使用国内短信通用模板时填写* @return*/static String buildRequestBody(String sender, String receiver, String templateId, String templateParas,String statusCallBack, String signature) {if (null == sender || null == receiver || null == templateId || sender.isEmpty() || receiver.isEmpty()|| templateId.isEmpty()) {System.out.println("buildRequestBody(): sender, receiver or templateId is null.");return null;}Map<String, String> map = new HashMap<String, String>();map.put("from", sender);map.put("to", receiver);map.put("templateId", templateId);if (null != templateParas && !templateParas.isEmpty()) {map.put("templateParas", templateParas);}if (null != statusCallBack && !statusCallBack.isEmpty()) {map.put("statusCallback", statusCallBack);}if (null != signature && !signature.isEmpty()) {map.put("signature", signature);}StringBuilder sb = new StringBuilder();String temp = "";for (String s : map.keySet()) {try {temp = URLEncoder.encode(map.get(s), "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}sb.append(s).append("=").append(temp).append("&");}return sb.deleteCharAt(sb.length()-1).toString();}/*** 构造X-WSSE参数值* @param appKey* @param appSecret* @return*/static String buildWsseHeader(String appKey, String appSecret) {if (null == appKey || null == appSecret || appKey.isEmpty() || appSecret.isEmpty()) {System.out.println("buildWsseHeader(): appKey or appSecret is null.");return null;}SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");String time = sdf.format(new Date()); //CreatedString nonce = UUID.randomUUID().toString().replace("-", ""); //NonceMessageDigest md;byte[] passwordDigest = null;try {md = MessageDigest.getInstance("SHA-256");md.update((nonce + time + appSecret).getBytes());passwordDigest = md.digest();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}//如果JDK版本是1.8,请加载原生Base64类,并使用如下代码String passwordDigestBase64Str = Base64.getEncoder().encodeToString(passwordDigest); //PasswordDigest//如果JDK版本低于1.8,请加载三方库提供Base64类,并使用如下代码//String passwordDigestBase64Str = Base64.encodeBase64String(passwordDigest); //PasswordDigest//若passwordDigestBase64Str中包含换行符,请执行如下代码进行修正//passwordDigestBase64Str = passwordDigestBase64Str.replaceAll("[\\s*\t\n\r]", "");return String.format(WSSE_HEADER_FORMAT, appKey, passwordDigestBase64Str, nonce, time);}/*** @throws Exception*/static void trustAllHttpsCertificates() throws Exception {TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {return;}public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {return;}public X509Certificate[] getAcceptedIssuers() {return null;}}};SSLContext sc = SSLContext.getInstance("SSL");sc.init(null, trustAllCerts, null);HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());}
}

2.登录调用

代码如下(示例):

    //登录@PostMapping("/login")public R login(@RequestBody Map<String,String> rinformation){String phone = rinformation.get("phone");String code = rinformation.get("code");if(StrUtil.isBlank(phone))return R.error("请输入手机号");if (!Validator.isMobile(phone))return R.error("请输入格式正确的手机号");if (StrUtil.isBlank(code))return R.error("请输入验证码");String key = "smscode:"+phone;String cacheCode = redisCache.getCacheObject(key);if (StrUtil.isBlank(cacheCode))return R.error("验证码已失效,请重新获取");if (!code.equals(cacheCode))return R.error("验证码错误");redisCache.deleteObject(key);LambdaQueryWrapper<UserAccount> wrapper = Wrappers.lambdaQuery(new UserAccount()).eq(UserAccount::getPhone,phone).ne(UserAccount::getIsDelete,1);UserAccount StAc = userAccountService.getOne(wrapper);if(StAc == null)return R.error("该手机号还没有注册");StpUtil.login(StAc.getId(),"pc");return data(StpUtil.getTokenValue());}//手机获取验证码@GetMapping("/sendSms")public R sendSMS(String phoneNumber,Integer type) throws Exception {if (!Validator.isMobile(phoneNumber))return R.error("请输入正确的手机号!");String key = "smscode:" + phoneNumber;String code = RandomUtil.randomNumbers(6);//这里发送验证码if (!SendSms.send(phoneNumber,code,type))return R.error("验证码获取失败,请联系客服反馈");redisCache.setCacheObject(key,code,5, TimeUnit.MINUTES);return R.ok("验证码发送成功!请注意查收。").putkv("time",5);}

总结

华为云发送短信验证码。

记录开发内容demo-java华为云发送短信验证码相关推荐

  1. java 阿里云 发送短信功能实现

    1. 注册短信平台(以阿里云为例) 常用短信服务平台:阿里云.华为云.腾讯云.京东.梦网.乐信等 2. 注册成功后,开通短信服务 3. 设置短信签名.短信模板.AccessKey AccessKey ...

  2. 腾讯云发送短信验证码服务

    腾讯云发送短信验证码服务 1.注册腾讯云的账号 在腾讯云的官网:https://cloud.tencent.com/注册一个腾讯云的账号,就是日常的注册流程(这里就不贴图了),不过要实名认证啥的,认证 ...

  3. Django使用容联云发送短信验证码时提示:172001,网络错误

    尝试用django连接容联云发送短信验证码,运行时出现了以下提示:{'172001':'网络错误'}:在网上查阅资料后得知,是因为python升级到2.7.9之后引入了一个新特性,当打开一个https ...

  4. 使用阿里云发送短信验证码

    目录 一.用户注册登录流程 二.使用阿里云发送短信验证码 ⭐生成密钥 ⭐将密钥配置到项目中 ⚪新建properties文件并填入相应信息 ⚪pom配置 ​⚪ 测试代码 ⚪添加签名 ​⚪添加短信发送的模 ...

  5. Java阿里云发送短信

    文章目录 前言 准备工作 短信服务API介绍 阿里云api发送短信 传送门 前言 短信服务,是阿里云为客户提供的一种通信服务的能力. 准备工作 需要申请一个阿里云账号 开通短信服务 添加签名和模板(需 ...

  6. java + maven 实现发送短信验证码功能

    如何使用java + maven的项目环境发送短信验证码,本文使用的是榛子云短信 的接口. 1. 安装sdk 下载地址: http://smsow.zhenzikj.com/doc/sdk.html ...

  7. 荣联云发送短信验证码--python3接口

    前言 近期做网页注册需要用到发送验证码功能,于是用荣联云的发送短信验证码进行测试,官网上提供的demo是python2.7的,而目前都使用的python3了,而且demo中的代码太长了,我只取demo ...

  8. Java用户注册服务器发送短信验证码功能实现

    <–start–> 当客户端发送了http的请求给服务器之后,服务器获取手机号然后调用短信平台给该手机号发送短信验证码. 给服务器发送请求的js代码: <script type=&q ...

  9. 容联云发送短信验证码

    setting配置 # 配置jwt的全局认证 REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES':['rest_framework_jwt.authe ...

最新文章

  1. JMeter运行通过Chrome打开的website
  2. Mybatis:传输多个参数
  3. reactjs ref属性:字符串类型的ref和createRef
  4. 步步深入MySQL:架构-查询执行流程-SQL解析顺序
  5. python对象三个特性_百度资讯搜索_python对象三个特性
  6. Microsoft C 运行时库 (CRT) 参考
  7. An Add-in Bookmark for visual studio 2005
  8. Atitit.可视化与报表原理与概论
  9. java实战——照片编辑器
  10. html输入能自动计算器,HTML自制计算器
  11. hbase的协处理器
  12. notepad++ 免安装版,下载,汉化
  13. zabbix监控软件的安装,详细教程
  14. wsimport 的使用
  15. 利用canvas的getImageData()方法制作《在线取色器》
  16. 自然语言处理1—文本预测操作
  17. 学生信息系统课程设计java_Java课程设计——学生信息系统(团队)
  18. 白领十大职业病及对策
  19. JVM相关命令查看GC情况
  20. Q-Learning(强化学习)|机器学习

热门文章

  1. ajax跨域获取cookie,ajax跨域获取cookie信息(示例代码)
  2. python画蜡烛图_Python量化交易-绘制蜡烛图 !这个图不像你的钱哦!
  3. 无法初始化Qt平台插件
  4. display、visibility和opactity的区别
  5. Android Studio 模拟器联网设置
  6. 记者亲历最强太极推手:被大师轻拍徒弟跌倒
  7. Hive数据去重、多变一与一变多等实现
  8. python学习之路(3)turtle画奥运五环
  9. vue 项目 去哪儿
  10. 疯狂Java讲义(读书笔记)(第五章)