紫玉坏小子

导航

使用云片发送短信功能

使用云片发送单条短信

第一步
  • 注册并且登录云片管理控制台

  • 完成资质签名模板报备。信息提交后,一般半小时内客服会完成审核。 此步骤不涉及开发,如有需要,可让产品经理或者对应业务人员协助完成。

第二步
  • 下载SDK,选择合适的的短信发送接口

API 列表请求地址特性常用场景
单条发送 https://sms.yunpian.com/v2/sms/single_send.json 一次发送一条短信 此接口最为常用。常用于短信验证、找回密码、短信登录、监控报警。可循环调用
批量发送相同内容 https://sms.yunpian.com/v2/sms/batch_send.json 批量发送相同内容 批量发送内容完全一样的短信
  • 单条发送接口

    HTTP头信息

    Accept:application/json;charset=utf-8;
    Content-Type:application/x-www-form-urlencoded;charset=utf-8;

请求

URL:https://sms.yunpian.com/v2/sms/single_send.json
注意:海外服务器地址 us.yunpian.com
访问方式:POST
支持 https 与 http 两种访问,建议使用 https

请求参数

参数名类型是否必传是否默认开放描述示例
apikey string 用户唯一标识,在"账号设置"-"子帐号管理"中查看 9b11127a9701975c734b8aee81ee3526
mobile string 接收的手机号,仅支持单号码发送,不需要带+86 前缀 15205201314
text string 需要发送的短信内容,需要与已审核的短信模板相匹配。短信内容须在最前面携带签名,否则会使用子账号默认签名下发 【云片网】您的验证码是 1234
extend string 下发号码扩展号,纯数字 001
uid string 该条短信在您业务系统内的 ID,如订单号或者短信发送记录流水号。 10001
callback_url string 短信发送后将向这个地址推送(运营商返回的)发送报告。 如推送地址固定,建议在"数据推送与获取”做批量设置。 如后台已设置地址,且请求内也包含此参数,将以请求内地址为准 http://your_receive_url_address
register boolean 是否为注册验证码短信,如果传入 true,则该条短信作为注册验证码短信统计注册成功率,需联系客服开通。 true
mobile_stat boolean 若短信中包含云片短链接,此参数传入 true 将会把短链接替换为目标手机号的专属链接,用于统计哪些号码的机主点击了短信中的链接,可在云片后台查看。详情参考短信点击统计 true
  • 从里面可以看出 必要参数有 apikey(用户唯一标识,在"账号设置"-"子帐号管理"中查看)、mobile(接收的手机号,仅支持单号码发送,不需要带+86 前缀)、text(需要发送的短信内容,需要与已审核的短信模板相匹配。短信内容须在最前面携带签名,否则会使用子账号默认签名下发)

java请求方式
/**
* 单条短信发送,智能匹配短信模板
*
* @param apikey成功注册后登录云片官网,进入后台可查看
* @param text需要使用已审核通过的模板或者默认模板
* @param mobile接收的手机号,仅支持单号码发送
* @return json格式字符串
*/

public static String singleSend(String apikey, String text, String mobile) {
   Map<String, String> params = new HashMap<String, String>();
   params.put("apikey", apikey);
   params.put("text", text);
   params.put("mobile", mobile);
   return post("https://sms.yunpian.com/v2/sms/single_send.json", params);
}
返回参数
{
 "code": 0,
 "msg": "发送成功",
 "count": 1,
 "fee": 0.05,
 "unit": "RMB",
 "mobile": "13200000000",
 "sid": 3310228982
}
名称类型描述
code integer 0 代表发送成功,其他 code 代表出错,详细见"返回值说明"页面
msg text 例如""发送成功"",或者相应错误信息
count integer 发送成功短信的计费条数(计费条数:70 个字一条,超出 70 个字时按每 67 字一条计费)
fee double 扣费金额,单位:元,类型:双精度浮点型/double
unit string 计费单位;例如:“RMB”
mobile string 发送手机号
sid long(64 位) 短信 id,64 位整型, 对应 Java 和 C#的 long,不可用 int 解析

功能实现

  • Controller层

    /**
        * 功能描述:
        * 〈用户注册短信〉
        * @param mobile 1:用户登录账号
        * @return : com.sen.common.web.utils.JsonReturn
        * @author : hxz
        * @date : 2020/12/20 10:06
        */
       @GetMapping(value = "sendRegSms")
       public JsonReturn sendRegSms(String mobile){
           if(!CheckUtils.checkMobile(mobile)){
               throw new ServiceException("请输入正确的手机号");
          }
           smsService.sendRegSms(mobile);
           return new JsonReturn();
      }

     

  • Service层

/**
* 功能描述:
* 〈发送注册短信方法〉
* @param mobile 1: 手机登录账号
* @return : void
* @author : hxz
* @date : 2020/12/25 10:19
*/
void sendRegSms(String mobile);
  • ServiceImpl

/**
* 功能描述:
* 〈发送注册短信方法〉
* @param mobile 1: 手机登录账号
* @return : void
* @author : hxz
* @date : 2020/12/25 10:19
*/
   public void sendRegSms(String mobile) {
String suffix = "reg";
String code  = (String) redisService.get(suffix + ":" + mobile);
// 如果code 存在说明 发送过短信
if(!CheckUtils.checkNull(code)){
throw new ServiceException("请勿重复发送验证码");
}
// 6位数验证码
String smsCode = CommonUtils.generateNum(6);
// 判断用户是否重复注册
User user = userService.findByAccount(mobile);
if(null!=user){
throw new ServiceException("该用户已存在");
}
redisService.set(suffix + ":" + mobile,smsCode,300);
String content = "【*****】您的注册验证码:"+ smsCode + "。如非本人操作,请忽略本短信。";
       String result = SmsUtils.sendSms(mobile, content);
System.out.println("短信发送结果:" + result);
Map code = JsonUtils.toObject(result, Map.class);
if (null == code.get("code") && !code.get("code").toString().equals("0")) {
               throw new ServiceException("发送失败");
          }
  }
  • 其中SmsUtils.sendSms(mobile, content)

package com.shy.lhs.hsmy.common.utils;


import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Value;

import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SmsUtils {
 //查账户信息的http地址
   private static String URI_GET_USER_INFO =
       "https://sms.yunpian.com/v2/user/get.json";

   //智能匹配模板发送接口的http地址
   private static String URI_SEND_SMS =
       "https://sms.yunpian.com/v2/sms/single_send.json";

   //模板发送接口的http地址
   private static String URI_TPL_SEND_SMS =
       "https://sms.yunpian.com/v2/sms/tpl_single_send.json";

   //发送语音验证码接口的http地址
   private static String URI_SEND_VOICE =
       "https://voice.yunpian.com/v2/voice/send.json";

   //绑定主叫、被叫关系的接口http地址
   private static String URI_SEND_BIND =
       "https://call.yunpian.com/v2/call/bind.json";

   //解绑主叫、被叫关系的接口http地址
   private static String URI_SEND_UNBIND =
       "https://call.yunpian.com/v2/call/unbind.json";

   //编码格式。发送编码格式统一用UTF-8
   private static String ENCODING = "UTF-8";
   @Value(value="${APIKEY}")
   private static  String apikey="************";

   /**
    * 取账户信息
    *
    * @return json格式字符串
    * @throws java.io.IOException
    */

   public static String getUserInfo(String apikey) throws IOException,
           URISyntaxException {
           Map< String, String > params = new HashMap< String, String >();
           params.put("apikey", apikey);
           return post(URI_GET_USER_INFO, params);
      }

   /**
    * 智能匹配模板接口发短信
    *
    * @param content    短信内容
    * @param mobile  接受的手机号
    * @return json格式字符串
    * @throws IOException
    */
  /**
   * 功能描述:
   * 〈单条信息发送功能〉
   * @param mobile 1
   * @param content 2
   * @return : java.lang.String
   * @author : hxz
   * @date : 2020/12/25 10:41
   */
   public static String sendSms(String mobile,
       String content) throws IOException {
       Map < String, String > params = new HashMap < String, String > ();
       params.put("apikey", apikey);
       params.put("text", content);
       params.put("mobile", mobile);
       return post(URI_SEND_SMS, params);
  }


   /**
    * 通过模板发送短信(不推荐)
    *
    * @param apikey   apikey
    * @param tpl_id    模板id
    * @param tpl_value  模板变量值
    * @param mobile    接受的手机号
    * @return json格式字符串
    * @throws IOException
    */

   public static String tplSendSms(String apikey, long tpl_id, String tpl_value,
       String mobile) throws IOException {
       Map < String, String > params = new HashMap < String, String > ();
       params.put("apikey", apikey);
       params.put("tpl_id", String.valueOf(tpl_id));
       params.put("tpl_value", tpl_value);
       params.put("mobile", mobile);
       return post(URI_TPL_SEND_SMS, params);
  }

   /**
    * 通过接口发送语音验证码
    * @param mobile 接收的手机号
    * @param code   验证码
    * @return
    */

   public static String sendVoice(String mobile, String code) {
       Map < String, String > params = new HashMap < String, String > ();
       params.put("apikey", apikey);
       params.put("mobile", mobile);
       params.put("code", code);
       return post(URI_SEND_VOICE, params);
  }

   /**
    * 通过接口绑定主被叫号码
    * @param apikey apikey
    * @param from 主叫
    * @param to   被叫
    * @param duration 有效时长,单位:秒
    * @return
    */

   public static String bindCall(String apikey, String from, String to,
       Integer duration) {
       Map < String, String > params = new HashMap < String, String > ();
       params.put("apikey", apikey);
       params.put("from", from);
       params.put("to", to);
       params.put("duration", String.valueOf(duration));
       return post(URI_SEND_BIND, params);
  }

   /**
    * 通过接口解绑绑定主被叫号码
    * @param apikey apikey
    * @param from 主叫
    * @param to   被叫
    * @return
    */
   public static String unbindCall(String apikey, String from, String to) {
       Map < String, String > params = new HashMap < String, String > ();
       params.put("apikey", apikey);
       params.put("from", from);
       params.put("to", to);
       return post(URI_SEND_UNBIND, params);
  }

   /**
    * 基于HttpClient 4.3的通用POST方法
    *
    * @param url       提交的URL
    * @param paramsMap 提交<参数,值>Map
    * @return 提交响应
    */

   public static String post(String url, Map < String, String > paramsMap) {
       CloseableHttpClient client = HttpClients.createDefault();
       String responseText = "";
       CloseableHttpResponse response = null;
       try {
           HttpPost method = new HttpPost(url);
           if (paramsMap != null) {
               List<NameValuePair> paramList = new ArrayList<
                                   NameValuePair >();
               for (Map.Entry < String, String > param: paramsMap.entrySet()) {
                   NameValuePair pair = new BasicNameValuePair(param.getKey(),
                       param.getValue());
                   paramList.add(pair);
              }
               method.setEntity(new UrlEncodedFormEntity(paramList,
                   ENCODING));
          }
           response = client.execute(method);
           HttpEntity entity = response.getEntity();
           if (entity != null) {
               responseText = EntityUtils.toString(entity, ENCODING);
          }
      } catch (Exception e) {
           e.printStackTrace();
      } finally {
           try {
               response.close();
          } catch (Exception e) {
               e.printStackTrace();
          }
      }
       return responseText;
  }
}

 

posted on 2021-01-10 09:49  紫玉坏小子  阅读(180)  评论(0编辑  收藏  举报