在日常开发中,短信接口是用户验证、通知提醒、营销推广等关键流程的重要组成部分。相比传统的模板短信,个性化短信更强调“千人千面”的内容定制能力,能够显著提升用户体验与互动转化率。
然而,目前大多数开发者接触到的短信接口示例多为统一模板调用,缺乏针对多变量内容自动填充、多用户批量个性化发送等实际业务场景的支持。这里我将通过一个完整的个性化短信接口示例,帮助开发者了解如何对接。
个性化短信的特点
个性化短信接口在技术实现与使用上具有以下几个显著特点:
1.支持动态内容填充
可以根据用户的具体信息(如姓名、优惠码、账号状态等)在短信内容中插入变量,实现定制化文本生成。
2.支持批量差异化发送
一次接口调用可对多个接收者发送各自不同的短信内容,而非相同模板,提高发送效率与精确度。
3.内容结构可扩展
可通过模板 + 数据源分离的设计,使接口兼容多语言、多场景,便于维护与扩展。
4.灵活的接口参数设计
通常支持 JSON 或 CSV 数据批量上传,适配不同上游业务系统的数据格式。
真实场景个性化短信接口示例:
1.先登录平台注册账号,提交公司营业执照通过资质认证。
2.个性化短信接口
Options:
Url: https://vip.veesing.com/smsApi/custom
Method: post
Content-Type: application/x-www-form-urlencoded;charset=utf-8
3.参数命名与说明
#参数类型必填描述示例1appIdString是账户标识。平台分配给用户的接口调用账户标识,登录平台首页账号信息栏可查看。2RYN7CQHL1M*****2appKeyString是账户密钥。平台分配给用户的接口调用密钥,登录平台首页账号信息栏,校验身份后可查看。WVNA4A0*****3smsIdString是个性化短信模板id。 (平台申请审核通过后可用)1234contentString是号码及变量值。 (content字符串由手机号和变量值组成,手机号码为固定key,用于存储用户手机号;其余的key名称需要和平台个性化模板中的变量名称一一对应) (短信内容不支持插入表情符号)如模板为:【中昱维信】尊敬的${姓名}你好,您本月实发薪资为:${工资},请注意查收! 则提交content为: [{"手机号码":"15831471961","姓名":"张三","工资":"10000.00"},{"手机号码":"13076523432","姓名":"李四","工资":"20000.00"}]5sendTimeString是定时时间。留空则表示立即发送,时间格式为:yyyy-MM-dd HH:mm:ss2018-08-21 14:00:00
content补充说明:
扩展:可在content.item中添加ext变量作为扩展参数(string类型),扩展参数会在回执报告推送时原样返回例如:[{"手机号码":"15800000000","姓名":"张三","工资":"10000.00","ext":"扩展信息demo"}]该参数非必填
4.请求示例
import java.io.IOException;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import com.alibaba.fastjson.JSONObject;
import com.veesing.utils.Config;
public class SmsGroupTest {
public static void main(String[] args) {
// 获取连接
HttpClient client = new HttpClient();
// 定制短信群发API接口地址
PostMethod method = new PostMethod("https://vip.veesing.com/smsApi/custom");
// 设置编码
client.getParams().setContentCharset("UTF-8");
method.setRequestHeader("ContentType", "application/x-www-form-urlencoded;charset=utf-8");
// 发送内容
String content = "[{"手机号码":"15831471961","姓名":"张三","工资":"10000.00"},{"手机号码":"13076523432","姓名":"李四","工资":"20000.00"}]";
// 拼接参数
NameValuePair[] data = {
new NameValuePair("appId", "2RYN7CQHL1M*****"),
new NameValuePair("appKey", "WVNA4A0*****"),
new NameValuePair("smsId", "123"),
// 发送时间,时间请务必大于实际提交时间的30分钟, 立即发送则不填,
// new NameValuePair("sendTime", "2018-08-21 14:00:00") ,
new NameValuePair("content", content)};
method.setRequestBody(data);
try {
client.executeMethod(method);
String result = method.getResponseBodyAsString();
// 返回结果
System.out.println(result);
JSONObject jsonObject = JSONObject.parseObject(result);
// 返回1则发送成功(逻辑操作请根据接口文档返回参数自行判断)
if (jsonObject.get("returnStatus").equals("1")) {
System.out.println("成功!");
} else {
System.out.println("失败!");
}
// 释放连接
method.setRequestHeader("Connection", "close");
method.releaseConnection();
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
正常响应
{
"returnStatus": "1 ", //状态码
"message": "成功", //状态提示信息
"remainPoint": "241", //本次发送后,账户剩余条数
"taskId": "3313746", //下发批次ID(唯一)
"successCounts": "1" //成功条数
}
异常响应
{
"returnStatus": "0", //状态码
"message": "参数错误", //状态提示信息
"remainPoint": null, //本次发送后,账户剩余条数
"taskId": null, //下发批次ID(唯一)
"successCounts": null //成功条数
}
5.状态回执与用户回复推送接口
触发条件
用户回复短信后,触发回复数据推送,每回复一条,则推送一条;运营商产生短信回执后,触发回执数据推送,每产生一条回执,则推送一条。
使用说明
回执回复数据,由短信平台主动推送到用户设置的地址上,数据格式需遵循标准化数据格式。
协议说明
Options:
Url: 用户设置
Method: post
Content-Type: application/x-www-form-urlencoded;charset=utf-8
状态回执参数
#参数名称类型是否必填描述示例值1mobileString是用户手机号码1508092****2taskidString是发送批次ID1233statusString是回执状态 1.发送成功 0.发送失败14receivetimeString是回执产生时间 yyyy-MM-dd HH:mm:ss2019-07-23 17:00:005codeString否回执状态码DELIVRD6extString否批量群发时,用户自定义扩展参数(如有则原样推送)例如提交时:[{"手机号码":"15800000000","姓名":"张三","ext":"扩展信息demo"}]
则返回:扩展信息demo
用户接收推送成功,无需返回任何信息,彩信平台根据http_status=200自动判断
用户回复参数
#参数名称类型是否必填描述示例值1mobileString是用户手机号码1508092****2taskidString是发送批次ID1233contentString是回复内容 (用户回复的短信内容)收到4receivetimeString是回执产生时间 yyyy-MM-dd HH:mm:ss2019-07-23 17:00:00
用户接收推送成功,无需返回任何信息,彩信平台根据http_status=200自动判断
6.查询账户短信余额接口
Options:
url: https://vip.veesing.com/smsApi/custom/getBalance
method: get
请求参数
#参数类型必填描述示例1appIdString是账户标识。平台分配给用户的接口调用账户标识,登录平台首页账号信息栏可查看。2RYN7CQHL1M*****2appKeyString是账户密钥。平台分配给用户的接口调用密钥,登录平台首页账号信息栏,校验身份后可查看。WVNA4A0*****
请求示例
OkHttpClient client = new OkHttpClient().newBuilder()
.followRedirects(false)
.build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, "");
Request request = new Request.Builder()
.url("https://vip.veesing.com/smsApi/custom/getBalance?appId=2RYN7CQHL1M*****&appKey=WVNA4A0*****")
.method("POST", body)
.build();
Response response = client.newCall(request).execute();
正常响应示例
{
"returnStatus": "1 ", //状态码
"message": "成功", //状态提示信息
"remainPoint": "241", //账户剩余条数
"taskId": null,
"successCounts": null
}
异常响应示例
{
"returnStatus": "0", //状态码
"message": "参数错误", //状态提示信息
"remainPoint": null,
"taskId": null,
"successCounts": null
}
7.状态码说明
returnStatusmessage1提交成功0账号或密码错误0缺少参数0您的账户已被锁定,请联系您的专属客服0未知原因,请联系客服0IP受限0模板id格式不正确0当日发送量已超出最大发送限制
以上就是个性化短信接口的完整说明,包括请求参数定义、示例代码、返回结果解析以及回执与余额查询机制。希望这篇文档能为你在接入短信服务的过程中提供清晰参考和技术支持。