• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

华为云短信发送验证码并判断是否成功

武飞扬头像
天下伟陈
帮助2

代码复制于华为云官方文档,基本拿来即用

需要准备

1、url,你的APP接入地址(在控制台"应用管理"页面获取) 接口访问URI

2、APP_Key

3、APP_Secret

4、国内短信签名通道号或国际/港澳台短信通道号

5、模板ID

6、签名名称

这些在华为云可获取,APP_Secret需要验证账号手机号来获取

其中

Authorization 的值默认为 
WSSE realm="SDP",profile="UsernameToken",type="Appkey"
WSSE_HEADER_FORMAT 的值默认为
UsernameToken Username="%s",PasswordDigest="%s",Nonce="%s",Created="%s"
  1.  
     
  2.  
    import com.alibaba.fastjson.JSONObject;
  3.  
    import com.systop.common.constant.Constants;
  4.  
     
  5.  
    import java.io.BufferedReader;
  6.  
    import java.io.InputStream;
  7.  
    import java.io.InputStreamReader;
  8.  
    import java.io.OutputStreamWriter;
  9.  
    import java.io.UnsupportedEncodingException;
  10.  
    import java.io.Writer;
  11.  
    import java.net.URL;
  12.  
    import java.net.URLEncoder;
  13.  
    import java.security.MessageDigest;
  14.  
    import java.security.NoSuchAlgorithmException;
  15.  
    import java.security.cert.CertificateException;
  16.  
    import java.security.cert.X509Certificate;
  17.  
    import java.text.SimpleDateFormat;
  18.  
    //如果JDK版本是1.8,可使用原生Base64类
  19.  
    import java.util.Base64;
  20.  
    import java.util.Date;
  21.  
    import java.util.HashMap;
  22.  
    import java.util.Map;
  23.  
    import java.util.UUID;
  24.  
    import java.util.stream.Collectors;
  25.  
     
  26.  
    import javax.net.ssl.HostnameVerifier;
  27.  
    import javax.net.ssl.HttpsURLConnection;
  28.  
    import javax.net.ssl.SSLContext;
  29.  
    import javax.net.ssl.SSLSession;
  30.  
    import javax.net.ssl.TrustManager;
  31.  
    import javax.net.ssl.X509TrustManager;
  32.  
    /**
  33.  
    * @auther 陈伟龙
  34.  
    * @date 2022/10/10 - 9:26
  35.  
    */
  36.  
    public class HuaweiSmsCode {
  37.  
     
  38.  
    public static void main(String[] args) throws Exception {
  39.  
     
  40.  
    //必填,请参考"开发准备"获取如下数据,替换为实际值
  41.  
    String url = Constants.HW_URL; //APP接入地址(在控制台"应用管理"页面获取) 接口访问URI
  42.  
    String appKey = Constants.HW_APPKEY; //APP_Key
  43.  
    String appSecret = Constants.HW_APPSECRET; //APP_Secret
  44.  
    String sender = Constants.HW_SENDER; //国内短信签名通道号或国际/港澳台短信通道号
  45.  
    String templateId = Constants.HW_TEMPLATEID; //模板ID
  46.  
     
  47.  
    //条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称
  48.  
    //国际/港澳台短信不用关注该参数
  49.  
    String signature = Constants.HW_TEMPLATESIGNATURE; //签名名称
  50.  
     
  51.  
    //必填,全局号码格式(包含国家码),示例: 8615123456789,多个号码之间用英文逗号分隔
  52.  
    String receiver = "155xxxx0910"; //短信接收人号码
  53.  
     
  54.  
    //选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告
  55.  
    String statusCallBack = "";
  56.  
     
  57.  
    /**
  58.  
    * 选填,使用无变量模板时请赋空值 String templateParas = "";
  59.  
    * 单变量模板示例:模板内容为"您的验证码是${1}"时,templateParas可填写为"[\"369751\"]"
  60.  
    * 双变量模板示例:模板内容为"您有${1}件快递请到${2}领取"时,templateParas可填写为"[\"3\",\"人民公园正门\"]"
  61.  
    * 模板中的每个变量都必须赋值,且取值不能为空
  62.  
    * 查看更多模板和变量规范:产品介绍>模板和变量规范
  63.  
    */
  64.  
    String templateParas = "[\"369751\"]"; //模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。
  65.  
     
  66.  
    //请求Body,不携带签名名称时,signature请填null
  67.  
    String body = buildRequestBody(sender, receiver, templateId, templateParas, statusCallBack, signature);
  68.  
    if (null == body || body.isEmpty()) {
  69.  
    System.out.println("body is null.");
  70.  
    return;
  71.  
    }
  72.  
     
  73.  
    //请求Headers中的X-WSSE参数值
  74.  
    String wsseHeader = buildWsseHeader(appKey, appSecret);
  75.  
    if (null == wsseHeader || wsseHeader.isEmpty()) {
  76.  
    System.out.println("wsse header is null.");
  77.  
    return;
  78.  
    }
  79.  
     
  80.  
    Writer out = null;
  81.  
    BufferedReader in = null;
  82.  
    StringBuffer result = new StringBuffer();
  83.  
    HttpsURLConnection connection = null;
  84.  
    InputStream is = null;
  85.  
     
  86.  
     
  87.  
    HostnameVerifier hv = new HostnameVerifier() {
  88.  
     
  89.  
    @Override
  90.  
    public boolean verify(String hostname, SSLSession session) {
  91.  
    return true;
  92.  
    }
  93.  
    };
  94.  
    trustAllHttpsCertificates();
  95.  
     
  96.  
    try {
  97.  
    URL realUrl = new URL(url);
  98.  
    connection = (HttpsURLConnection) realUrl.openConnection();
  99.  
     
  100.  
    connection.setHostnameVerifier(hv);
  101.  
    connection.setDoOutput(true);
  102.  
    connection.setDoInput(true);
  103.  
    connection.setUseCaches(true);
  104.  
    //请求方法
  105.  
    connection.setRequestMethod("POST");
  106.  
    //请求Headers参数
  107.  
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
  108.  
    connection.setRequestProperty("Authorization", Constants.HW_AUTH_HEADER_VALUE);
  109.  
    connection.setRequestProperty("X-WSSE", wsseHeader);
  110.  
     
  111.  
    connection.connect();
  112.  
    out = new OutputStreamWriter(connection.getOutputStream());
  113.  
    out.write(body); //发送请求Body参数
  114.  
    out.flush();
  115.  
    out.close();
  116.  
     
  117.  
    int status = connection.getResponseCode();
  118.  
    if (200 == status) { //200
  119.  
    is = connection.getInputStream();
  120.  
    } else { //400/401
  121.  
    is = connection.getErrorStream();
  122.  
    }
  123.  
    in = new BufferedReader(new InputStreamReader(is, "UTF-8"));
  124.  
    String line = "";
  125.  
    while ((line = in.readLine()) != null) {
  126.  
    result.append(line);
  127.  
    }
  128.  
    System.out.println(result.toString()); //打印响应消息实体
  129.  
    JSONObject rsJson = JSONObject.parseObject(String.valueOf(result));
  130.  
    System.out.println(rsJson.getString("code"));
  131.  
    System.out.println(rsJson.getJSONArray("result").getJSONObject(0).getString("status"));
  132.  
     
  133.  
    // JSONObject jsonresult = JSONObject.parseObject(rsJson.getString("result"));
  134.  
    // System.out.println(jsonresult);
  135.  
    } catch (Exception e) {
  136.  
    e.printStackTrace();
  137.  
    } finally {
  138.  
    try {
  139.  
    if (null != out) {
  140.  
    out.close();
  141.  
    }
  142.  
    if (null != is) {
  143.  
    is.close();
  144.  
    }
  145.  
    if (null != in) {
  146.  
    in.close();
  147.  
    }
  148.  
    } catch (Exception e) {
  149.  
    e.printStackTrace();
  150.  
    }
  151.  
    }
  152.  
    }
  153.  
     
  154.  
    /**
  155.  
    * 构造请求Body体
  156.  
    * @param sender
  157.  
    * @param receiver
  158.  
    * @param templateId
  159.  
    * @param templateParas
  160.  
    * @param statusCallBack
  161.  
    * @param signature | 签名名称,使用国内短信通用模板时填写
  162.  
    * @return
  163.  
    */
  164.  
    static String buildRequestBody(String sender, String receiver, String templateId, String templateParas,
  165.  
    String statusCallBack, String signature) {
  166.  
    if (null == sender || null == receiver || null == templateId || sender.isEmpty() || receiver.isEmpty()
  167.  
    || templateId.isEmpty()) {
  168.  
    System.out.println("buildRequestBody(): sender, receiver or templateId is null.");
  169.  
    return null;
  170.  
    }
  171.  
    Map<String, String> map = new HashMap<String, String>();
  172.  
     
  173.  
    map.put("from", sender);
  174.  
    map.put("to", receiver);
  175.  
    map.put("templateId", templateId);
  176.  
    if (null != templateParas && !templateParas.isEmpty()) {
  177.  
    map.put("templateParas", templateParas);
  178.  
    }
  179.  
    if (null != statusCallBack && !statusCallBack.isEmpty()) {
  180.  
    map.put("statusCallback", statusCallBack);
  181.  
    }
  182.  
    if (null != signature && !signature.isEmpty()) {
  183.  
    map.put("signature", signature);
  184.  
    }
  185.  
     
  186.  
    StringBuilder sb = new StringBuilder();
  187.  
    String temp = "";
  188.  
     
  189.  
    for (String s : map.keySet()) {
  190.  
    try {
  191.  
    temp = URLEncoder.encode(map.get(s), "UTF-8");
  192.  
    } catch (UnsupportedEncodingException e) {
  193.  
    e.printStackTrace();
  194.  
    }
  195.  
    sb.append(s).append("=").append(temp).append("&");
  196.  
    }
  197.  
     
  198.  
    return sb.deleteCharAt(sb.length()-1).toString();
  199.  
    }
  200.  
     
  201.  
    /**
  202.  
    * 构造X-WSSE参数值
  203.  
    * @param appKey
  204.  
    * @param appSecret
  205.  
    * @return
  206.  
    */
  207.  
    static String buildWsseHeader(String appKey, String appSecret) {
  208.  
    if (null == appKey || null == appSecret || appKey.isEmpty() || appSecret.isEmpty()) {
  209.  
    System.out.println("buildWsseHeader(): appKey or appSecret is null.");
  210.  
    return null;
  211.  
    }
  212.  
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
  213.  
    String time = sdf.format(new Date()); //Created
  214.  
    String nonce = UUID.randomUUID().toString().replace("-", ""); //Nonce
  215.  
     
  216.  
    MessageDigest md;
  217.  
    byte[] passwordDigest = null;
  218.  
     
  219.  
    try {
  220.  
    md = MessageDigest.getInstance("SHA-256");
  221.  
    md.update((nonce time appSecret).getBytes());
  222.  
    passwordDigest = md.digest();
  223.  
    } catch (NoSuchAlgorithmException e) {
  224.  
    e.printStackTrace();
  225.  
    }
  226.  
     
  227.  
    //如果JDK版本是1.8,请加载原生Base64类,并使用如下代码
  228.  
    String passwordDigestBase64Str = Base64.getEncoder().encodeToString(passwordDigest); //PasswordDigest
  229.  
    //如果JDK版本低于1.8,请加载三方库提供Base64类,并使用如下代码
  230.  
    //String passwordDigestBase64Str = Base64.encodeBase64String(passwordDigest); //PasswordDigest
  231.  
    //若passwordDigestBase64Str中包含换行符,请执行如下代码进行修正
  232.  
    //passwordDigestBase64Str = passwordDigestBase64Str.replaceAll("[\\s*\t\n\r]", "");
  233.  
    return String.format(Constants.HW_WSSE_HEADER_FORMAT, appKey, passwordDigestBase64Str, nonce, time);
  234.  
    }
  235.  
     
  236.  
    /*** @throws Exception
  237.  
    */
  238.  
    static void trustAllHttpsCertificates() throws Exception {
  239.  
    TrustManager[] trustAllCerts = new TrustManager[] {
  240.  
    new X509TrustManager() {
  241.  
    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  242.  
    return;
  243.  
    }
  244.  
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  245.  
    return;
  246.  
    }
  247.  
    public X509Certificate[] getAcceptedIssuers() {
  248.  
    return null;
  249.  
    }
  250.  
    }
  251.  
    };
  252.  
    SSLContext sc = SSLContext.getInstance("SSL");
  253.  
    sc.init(null, trustAllCerts, null);
  254.  
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
  255.  
    }
  256.  
    }
学新通

 1、注意url 一定是 

https://smsapi.cn-south-1.myhuaweicloud.com:443/sms/batchSendSms/v1

2、返回值的json样式为

{"result":[{"originTo":"155xxxx0910","createTime":"2022-10-10T03:05:14Z","from":"8822100825173","smsMsgId":"cf8290e2-30ee-4c34-8874-83c8de2e99b9_16142890744","status":"000000"}],"code":"000000","description":"Success"}

 3、获取code和status的值判断是否返回成功,000000应该就是发送成功了

rsJson.getString("code")
rsJson.getJSONArray("result").getJSONObject(0).getString("status")

如何判断短信发送成功

接收状态报告API

Constants字典类图片展示(部分数据不便展示)

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhibfcfg
系列文章
更多 icon
同类精品
更多 icon
继续加载