​​​短信渠道接口详细设计总计

这两天就一直写设计文档,毕竟第一次开发短信的接口,一开始还是比较懵逼的,主要是不明白总体通讯的流程,所以设计起来比较花时间。

经过老大的提示了,也是明白了大概的接口通讯流程:前台接口通过调用接口发起短信通知接口,将信息组织为json 格式报文发往后台,后台处理报文数据,发往某短信提供方,厂商接收后实时返回短信发送状态。这是是厂商将短信内容发往相应的客户的手机,异步通知给我们平台,报告这次短信的发送最终状态。(划重点)

大致的通讯流程同支付接口一样。将我们需要给客户处理的信息发送给第三方厂商处理,厂商处理完成,异步通知我们处理结果,然后我们相应的处理最终的数据。嗯,一样的流程。之前公司调我一个人去民生银行去开发一致润联支付接口,终于把支付接口搞明白了。

话说回来短信接口的设计,需要根据平台系统本身出发,厂商提供三个接口:短信下发接口(没有参数,静态的短信文字内容)、变量短信接口(HTTPS请求方式,同时支持不同变量的短信内容)、回送状态报告接口(即异步通知接口)。

根据平台需要发送的短信内容,只需要选择变量短信接口和异步通知接口。

接口文档就不需要看了,其中有两个字段需要注意msg短信内容、params手机号码和变量参数。

"msg":" 欢迎您注册象聚金元,您的注册验证码为:{$val},如非本人操作,可忽略本短信。成功注册后您将获得{$val}元新手体验金! ";

"params":"155****6033,123456,1288;185****8669,654321,1288";

其中的两个字段参数内容如上所示,多个用户对象以";"分号隔开,内部的参数以","逗号隔开。

第一个是手机号,","逗号后的分别是{$val}的参数值。例如: 欢迎您注册象聚金元,您的注册验证码为:123456,如非本人操作,可忽略本短信。成功注册后您将获得1288元新手体验金!

嗯,厂商给我们文档的时候,没有说明params的内容是什么意思,还是自己测试出来明白的。蛋疼(印象减分),所以文档写好,还是有必要的(我写得很挫,文字太过口语化)。

变量短信接口请求报文

​平台需要,需要记录每一条发送的短信记录,提供和客户查阅(防止扯皮),由于客户提的需求中,有很多不同场景的不同模板短信内容:购买理财时发送短信给用户提示购买成功等一些信息,到了产品到期或者兑付日也发送短信提示用户相关信息。这些属于群发短信通知。

只需要开发一个公共的通讯接口提供上述不同场景调用即可。同时需要新建一个服务端的DTA,作为异步通知DTA供厂商调用,发送异步通知接口到平台,根据唯一标识符sms_id来更新表字段状态,成功或者失败,完成整个流程。

写了个类,仅仅用户接口测试。

//java代码测试短信接口连通性demo,仅测试用,敏感信息已屏蔽public class HttpUtil(){private static PoolingHttpClientConnectionManager connMgr;  private static RequestConfig requestConfig;  private static final int MAX_TIMEOUT = 7000;  static {  // 设置连接池  connMgr = new PoolingHttpClientConnectionManager();  // 设置连接池大小  connMgr.setMaxTotal(100);  connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());  RequestConfig.Builder configBuilder = RequestConfig.custom();  // 设置连接超时  configBuilder.setConnectTimeout(MAX_TIMEOUT);  // 设置读取超时  configBuilder.setSocketTimeout(MAX_TIMEOUT);  // 设置从连接池获取连接实例的超时  configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT);  // 在提交请求之前 测试连接是否可用  configBuilder.setStaleConnectionCheckEnabled(true);  requestConfig = configBuilder.build();  }  /** * 发送 GET 请求(HTTP),不带输入数据 * @param url * @return */  public static String doGet(String url) {  return doGet(url, new HashMap<String, Object>());  }  /** * 发送 GET 请求(HTTP),K-V形式 * @param url * @param params * @return */  public static String doGet(String url, Map<String, Object> params) {  String apiUrl = url;  StringBuffer param = new StringBuffer();  int i = 0;  for (String key : params.keySet()) {  if (i == 0)  param.append("?");  else  param.append("&");  param.append(key).append("=").append(params.get(key));  i++;  }  apiUrl += param;  String result = null;  HttpClient httpclient = new DefaultHttpClient();  try {  HttpGet httpPost = new HttpGet(apiUrl);  HttpResponse response = httpclient.execute(httpPost);  int statusCode = response.getStatusLine().getStatusCode();  System.out.println("执行状态码 : " + statusCode);  HttpEntity entity = response.getEntity();  if (entity != null) {  InputStream instream = entity.getContent();  result = IOUtils.toString(instream, "UTF-8");  }  } catch (IOException e) {  e.printStackTrace();  }  return result;  }  /** * 发送 POST 请求(HTTP),不带输入数据 * @param apiUrl * @return */  public static String doPost(String apiUrl) {  return doPost(apiUrl, new HashMap<String, Object>());  }  /** * 发送 POST 请求(HTTP),K-V形式 * @param apiUrl API接口URL * @param params 参数map * @return */  public static String doPost(String apiUrl, Map<String, Object> params) {  CloseableHttpClient httpClient = HttpClients.createDefault();  String httpStr = null;  HttpPost httpPost = new HttpPost(apiUrl);  CloseableHttpResponse response = null;  try {  httpPost.setConfig(requestConfig);  List<NameValuePair> pairList = new ArrayList<>(params.size());for (Map.Entry<String, Object> entry : params.entrySet()) {  NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry  .getValue().toString());  pairList.add(pair);  }  httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8")));  response = httpClient.execute(httpPost);  System.out.println(response.toString());  HttpEntity entity = response.getEntity();  httpStr = EntityUtils.toString(entity, "UTF-8");  } catch (IOException e) {  e.printStackTrace();  } finally {  if (response != null) {  try {  EntityUtils.consume(response.getEntity());  } catch (IOException e) {  e.printStackTrace();  }  }  }  return httpStr;  }  /** * 发送 POST 请求(HTTP),JSON形式 * @param apiUrl * @param json json对象 * @return */  public static String doPost(String apiUrl, Object json) {  CloseableHttpClient httpClient = HttpClients.createDefault();  String httpStr = null;  HttpPost httpPost = new HttpPost(apiUrl);  CloseableHttpResponse response = null;  try {  httpPost.setConfig(requestConfig);  StringEntity stringEntity = new StringEntity(json.toString(),"UTF-8");//解决中文乱码问题  stringEntity.setContentEncoding("UTF-8");  stringEntity.setContentType("application/json");  httpPost.setEntity(stringEntity);  response = httpClient.execute(httpPost);  HttpEntity entity = response.getEntity();  System.out.println(response.getStatusLine().getStatusCode());  httpStr = EntityUtils.toString(entity, "UTF-8");  } catch (IOException e) {  e.printStackTrace();  } finally {  if (response != null) {  try {  EntityUtils.consume(response.getEntity());  } catch (IOException e) {  e.printStackTrace();  }  }  }  return httpStr;  }  /** * 发送 SSL POST 请求(HTTPS),K-V形式 * @param apiUrl API接口URL * @param params 参数map * @return */  public static String doPostSSL(String apiUrl, Map<String, Object> params) {  CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();  HttpPost httpPost = new HttpPost(apiUrl);  CloseableHttpResponse response = null;  String httpStr = null;  try {  httpPost.setConfig(requestConfig);  List<NameValuePair> pairList = new ArrayList<NameValuePair>(params.size());  for (Map.Entry<String, Object> entry : params.entrySet()) {  NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry  .getValue().toString());  pairList.add(pair);  }  httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("utf-8")));  response = httpClient.execute(httpPost);  int statusCode = response.getStatusLine().getStatusCode();  if (statusCode != HttpStatus.SC_OK) {  return null;  }  HttpEntity entity = response.getEntity();  if (entity == null) {  return null;  }  httpStr = EntityUtils.toString(entity, "utf-8");  } catch (Exception e) {  e.printStackTrace();  } finally {  if (response != null) {  try {  EntityUtils.consume(response.getEntity());  } catch (IOException e) {  e.printStackTrace();  }  }  }  return httpStr;  }  /** * 发送 SSL POST 请求(HTTPS),JSON形式 * @param apiUrl API接口URL * @param json JSON对象 * @return */  public static String doPostSSL(String apiUrl, Object json) {  CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();  HttpPost httpPost = new HttpPost(apiUrl);  CloseableHttpResponse response = null;  String httpStr = null;  try {  httpPost.setConfig(requestConfig);  StringEntity stringEntity = new StringEntity(json.toString(),"UTF-8");//解决中文乱码问题  stringEntity.setContentEncoding("UTF-8");  stringEntity.setContentType("application/json");  httpPost.setEntity(stringEntity);  response = httpClient.execute(httpPost);  int statusCode = response.getStatusLine().getStatusCode();  if (statusCode != HttpStatus.SC_OK) {  return null;  }  HttpEntity entity = response.getEntity();  if (entity == null) {  return null;  }  httpStr = EntityUtils.toString(entity, "utf-8");  } catch (Exception e) {  e.printStackTrace();  } finally {  if (response != null) {  try {  EntityUtils.consume(response.getEntity());  } catch (IOException e) {  e.printStackTrace();  }  }  }  return httpStr;  }  /** * 创建SSL安全连接 * * @return */  private static SSLConnectionSocketFactory createSSLConnSocketFactory() {  SSLConnectionSocketFactory sslsf = null;  try {  SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {  public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {  return true;  }  }).build();  sslsf = new SSLConnectionSocketFactory(sslContext, new X509HostnameVerifier() {  @Override  public boolean verify(String arg0, SSLSession arg1) {  return true;  }  @Override  public void verify(String host, SSLSocket ssl) throws IOException {  }  @Override  public void verify(String host, X509Certificate cert) throws SSLException {  }  @Override  public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException {  }  });  } catch (GeneralSecurityException e) {  e.printStackTrace();  } return sslsf;  }  /** * 测试方法 * @param args */  public static void main(String[] args) throws Exception {String apiUrl = "请求URL";HashMap<String, Object> params = new HashMap<String, Object>();String sendtime = null;   /*new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a").format(new Date());*/String reqtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a").format(new Date());String sendMsg = "欢迎您注册象聚金元,您的注册验证码为:{$var},如非本人操作,可忽略本短信。成功注册后您将获得{$var}元新手体验金!";System.out.println(sendMsg);params.put("account", "敏感信息");params.put("password", " 敏感信息 ");params.put("msg", sendMsg);params.put("params","176****1716,233441,1288.00;155***6033,233442,1288.00");// 定时发送 时间格式 yyyyMMddHHmmif (sendtime == null) {params.put("sendtime",new SimpleDateFormat("yyyyMMddHHmm").format(new Date()));} else {params.put("sendtime", 请求报文中的请求日期时间);}params.put("report", "false");JSONObject json = new JSONObject(params);String send = json.toString();System.out.println(send);// 返回值String respon = HttpUtil.doPost(apiUrl, send);}  }

本测试demo仅用于接口调用测试用,敏感信息已屏蔽~~~

现在主要就是群发接口的记表,需要解析出params的内容数据,循环记表。得到异步通知结果更新表记录的状态。(重点)

大致的设计如次,下周开始实际的开发了,希望一切顺利!按照预期需求时间完成,不加班不加班不加班。。。

对了,自己参与开发的这个理财项目,也是开发了一年多的项目,欢迎注册(注册就可以了哈哈哈哈)。有钱的大佬可以去买理财,高收益,地址:https://www.xiangcapital.com/

安卓和IOS都已经上线:【象聚金元】

#################################################################

后期如有新的心得,持续更新中。。。

短信通知接口json报文开发设计总结相关推荐

  1. android 首页接口设计方案,Android开发最佳实践——1.接口设计

    Android开发最佳实践--1.接口设计 一个项目刚开始的时候,最需要确认的就是接口设计了:数据如何传递,使用什么格式什么协议乃至如何保证安全性.如果一个项目的接口设计不合理--比如没有考虑到安全性 ...

  2. [短彩信]C#短彩信模块开发设计(1)——架构

    准备从以下几个方面简单的谈谈短彩信模块的实现: [短彩信]C#短彩信模块开发设计(1)--架构(http://www.cnblogs.com/CopyPaster/archive/2012/12/07 ...

  3. 服务器开发设计之算法宝典

    作者:lynhlzou,腾讯 IEG 后台开发工程师 孙子云:"上兵伐谋,其次伐交,其次伐兵,其下攻城",最上乘行军打仗的方式是运用谋略,下乘的方式才是与敌人进行惨烈的厮杀.同样的 ...

  4. ae导出json_关于AE转json动画开发避坑指南

    本篇文章是给一定基础的UI设计写的 Lottie 是Airbnb开源的一个面向Android. iOS.React Native .Web的动画库,能分析 Adobe After Effects 导出 ...

  5. [短彩信]C#短彩信模块开发设计(2)——配置

    准备从以下几个方面简单的谈谈短彩信模块的实现: [短彩信]C#短彩信模块开发设计(1)--架构(http://www.cnblogs.com/CopyPaster/archive/2012/12/07 ...

  6. Java 用HTTP的方式发送JSON报文请求

    前言: 项目调用第三方接口时,通常是用socket或者http的通讯方式发送请求:http 为短连接,客户端发送请求都需要服务器端回送响应,请求结束后,主动释放链接.Socket为长连接:通常情况下S ...

  7. application/x-www-form-urlencoded接口响应报文中文乱码

    1.如何处理乱码 在进行接口测试时,在用httpclient post请求时,对于Content-Type:application/json来说,在写测试脚本时只需要为头信息和post请求指定相应编码 ...

  8. PS3/PS4游戏耳机方案|SSS1629|开发设计|台湾鑫创|USB耳机音频方案

    SSS1629适用于各种游戏耳机方案,比如:USB gaming耳机.PS3耳机.PS4耳机.XBOX360耳机.XBOXone耳机.多合一游戏耳机方案,其功能特点如下: 1.支持PS3\PS4.XB ...

  9. 基于AltiumDesigner的PCB及原理图项目设计经验分享 [硬件开发设计]

    文章目录 往期系列文章 一.市面上主流的三款低.中.高PCB画制软件(EDA) 二.PCB总体设计思路与原则 三.产品基本设计步骤 四.原理图设计注意事项 五.原理图操作 六.PCB设计 - 布局注意 ...

  10. 嵌入式系统开发设计---嵌入式系统开发设计

    嵌入式系统设计的主要任务是定义系统的功能.决定系统的架构,并将功能映射到系统实现架构上.这里,系统架构既包括软件系统架构也包括硬件系统架构.一种架构可以映射到各种不同的物理实现,每种实现表示不同的取舍 ...

最新文章

  1. 2021.4.7 美团买菜后端开发实习生(二面)(含总结)(已oc)
  2. oracle中各种函数,oracle中常用函数大全
  3. java servlet例子_Servlet学习教程(三)---- 一个简单的Servlet例子
  4. php显示表格,php – 显示所有表格行
  5. python 用if判断一个数是不是整数_五天学会Python基础02(下)
  6. 在Spring MVC Web应用程序中添加社交登录:单元测试
  7. java正则表达式 ascii_Java——正则表达式
  8. FZOJβ #31.字符串
  9. 一个会“说话”的油箱盖,告诉你每一滴油的去向
  10. 315曝光:老坛酸菜工人穿拖鞋、光脚踩 防腐剂超标10倍!多家电商平台下架老坛酸菜...
  11. 拆轮子系列--RxJava理解(一)--Map解析
  12. tcs标准编写软件_tcs2010(中国标准编写模板)免费版
  13. 免疫算法(Immune Algorithm)详解
  14. Python开发网站步骤
  15. 魔客吧php登录界面模板,精仿魔客吧网站模板discuz模板_带VIP购买等多个插件
  16. linux系统开机自动锁定键盘,设置linux开机启动小键盘的详细教程设置linux开机启动小键盘的图文教程...
  17. 基于嵌入式的室内静态场景实时重建系统
  18. php168整站系统官网,PHP168整站系统官方下载
  19. HUAWEI机试:最长的顺子
  20. 女人本性的47个心理阴暗面 承受力差的谨慎阅读

热门文章

  1. Tracking By Detecting的多目标跟踪
  2. 五笔字典86版wubi拆字图编码查询
  3. 笔记 |《软件测试技术经典教程》第4章 黑盒测试技术
  4. Android 应用集成友盟统计
  5. Learn OpenCV之Rotation Matrix To Euler Angles
  6. 雷军博客分享-日本的电饭煲到底好在哪?
  7. 当win10电脑,本地网络出现了一个意外的情况,不能完成所有你在设置中所要求的更改?
  8. android killer 反编译工具,androidkiller反编译软件使用与踩坑并解决的过程
  9. 【FFT】HDU4609-3 idiots
  10. 博文收藏夹(updating)