当前位置: 首页 > news >正文

短信平台(电信)

通信方式

       采用http1.1通信方式,数据以post方式提交

       http 头设置:application/json

签名

       采用MD5加密方式, 源字符串采用字段拼接方式

       签名中appSecret是平台分配密码

       签名方法:

       如:String sign=md5(param1param2param3…paramN)

发送接口

地址: http://ip:port/api/sms/air/send

描述:   客户平台==>大业务平台

1. 请求方式post; http头设置application/json; 字符集UTF-8

       2. http响应数据为json格式

请求参数:

字段

名称

类型

说明

appKey

账户名

String(32)

统一分配

timestamp

时间戳

long

毫秒值

自UTC时间1970-1-1起的毫秒值

mobile

用户号码

String(11,11999)

多个提交逗号分隔;

一次最多1000个号码

content

内容长度

String(402)

短消息内容长度,67*6条

spNumber

扩展号码

String(10)

扩展长号码

sendTime

定时时间

String(0,14)

yyyyMMddHHmmss

定时发送时间,

默认为空值

reportUrl

报告回调地址

String(100)

状态报告回调的URL地址

默认为空

若使用查询接口(接口6)方式,为空值

moUrl

上行地址

String(100)

用户上行URL地址

默认空

attach

附加值字段

String(100)

附加数据,

客户根据自身业务逻辑添加

默认为空值

sign

数字签名

String(32)

sign=MD5(appKey+timestamp+mobile+content+spNumber+sendTime+appSecret)

顺序以此为准

其中appSecret为平台分配账户时提供

响应参数:

字段

名称

类型

说明

status

状态码

int(4)

 见附表

  1. 成功;

其他失败

message

消息描述

String(32)

taskId

任务ID

long(8)

数据样例:

请求json:

{

    "appKey": "10001",

    "timestamp": "1546589422955",

    "mobile": "13800138001",

    "content": "【签名测试】这是一条测试短信",

    "spNumber": "234",

    "sendTime": "",

"reportUrl": "",

“moUrl”:””,

    "attach": "",

    "sign": "4b38b34fb70fcc4c49e180fbd5a9854b"

}

响应Json:

{

    "message": "提交成功",

    "taskId": 6468846578735812608,

    "status": 1

}

或失败

{

    "message": "提交数据错误",

    "status": 2

}

  /*** 发送短信** @param smsModule   模块名称* @param phone       手机号* @param receiveName 接收人姓名* @param message     发送内容* @return*/public ActionResult sendSms(String smsModule, String phone, String receiveName, String message) {Request request = null;ActionResult actionResult = ActionResult.fail("发送短信失败");LogSmsMessageVo logSmsMessageVo = new LogSmsMessageVo();String status = "1";try {//平台提供的appKey appKey = x.getDictValue();//平台提供的appSecret appSecret = x.getDictValue();//平台提供的发送短信urlsendUrl = x.getDictValue();} catch (Exception e) {log.error("查询发送短信参数异常,异常信息" + e);}Response resp = null;String taskId = "";String sendStat = "";try {request = Request.newHttpRequestBuilder().uri(sendUrl).timeout(5000).charset("utf-8").method(Request.POST).contentType(Request.ContentType.JSON).build();//1. 构建数据包对象SendSmsEntity sendEntity = this.buildSendEntity(phone, message);//2. 转化对象为json字符串数据String data = JSONObject.toJSONString(sendEntity);//3. 字符串url编码,防止特殊字符被客户端强行改变,譬如+会被浏览器或者其他客户端变更为空格String encodeData = URLEncoder.encode(data, "UTF-8");//4. 发送resp = request.send(sendUrl, encodeData);log.info("发送短信,手机号:" + phone + ",发送内容:" + message + ",返回结果:" + resp.content());JSONObject jsonObject = JSONObject.parseObject(resp.content());if (ObjectUtils.isNotEmpty(jsonObject)) {actionResult.setMsg(jsonObject.get("message") + "");actionResult.setData(jsonObject.get("message") + "");}//解析发送结果if (200 == resp.status()) {if ("1".equals(jsonObject.get("status") + "")) {log.info("发送短信成功");status = "0";sendStat = "2";taskId = jsonObject.get("taskId") + "";actionResult.setCode(200);} else {//数据提交失败,发送必然失败sendStat = "0";log.info("发送短信失败,失败原因" + jsonObject.get("message"));}} else {if (resp.content() != null) {taskId = jsonObject.get("taskId") + "";log.info("发送短信返回失败,返回内容" + resp.content());} else {log.info("发送短信失败,返回响应内容为空");}sendStat = "0";}} catch (Exception e) {log.error("发送短信异常,异常信息" + e.getMessage());} finally {request.release();}return actionResult;}

查询报告接口

地址: http://ip:port/api/sms/air/report

描述:客户平台 ==> 大业务平台

  1. 查询当前账户套餐余量
  2. 客户通过接口调用主动查询方式,获取数据,
  3. 如实现【回调报告接口2】可不实现该接口。
  4. 请求数据 JSONObject
  5. 响应数据 JSONObject
  6. 每次接口调用都是获得最新的数据,旧数据不再缓存。
  7. 请求:

    字段

    名称

    类型

    说明

    appKey

    接入账户

    String(32)

    平台分配

    sign

    签名

    String(32)

    md5(appKey+ appSecret)

    appSecret为平台分配接入账户的密钥

    数据响应:

    字段

    名称

    类型

    说明

    status

    状态码

    int(4)

     1 – 提交成功;其他-失败

    message

    错误描述

    String(32)

     错误描述

    data

    数据字段

    JSONArray

     报告数据放入此字段中

    data内容描述:

    字段

    名称

    类型

    说明

    id

    数据包标识

    String(20)

    固定值:report

    taskId

    任务ID

    long(8)

    任务ID+用户号码=唯一性

    batchNo

    批次序号

    int

    默认1,

    当提交的为长短信时,该字段匹配内容序号;如一条短信分隔为3条,该字段范围1,2,3

    mobile

    用户号码

    String(20)

     用户号码

    stat

    状态码

    int(4)

     1 – 成功;其他-失败

    statMsg

    状态描述

    String(32)

     状态描述

    attach

    附加值字段

    数据样例:

    请求:

    {

        "appKey": "90001",

        "sign": "2cff25eaa14b0f5c54a4f56e26e7c517"

    }

    响应:

    {

        "data": [

        {

            "batchNo": 1,

            "stat": 1,

            "statMsg": "成功",

            "mobile": "13800138000",

            "id": "report",

            "attach": "",

            "taskId": 6479258452121862144

        },

        {

            "batchNo": 1,

            "stat": 1,

            "statMsg": "成功",

            "mobile": "13800138000",

            "id": "report",

            "attach": "",

            "taskId": 6479266612358397952

        }],

        "message": "提交成功",

        "status": 1

    }

回调报告接口

描述:大业务平台 ==> 客户平台

  1. 平台根据send接口reportUrl字段设定的URL地址,提交报告数据给客户
  2. 请求数据JSONArray
  3. 响应数据 JSONObject

请求接口:

字段

名称

类型

说明

id

数据包标识

String(20)

固定值:report

taskId

任务ID

long(8)

任务ID+用户号码=唯一性

batchNo

批次序号

int

默认1,

当提交的为长短信时,该字段匹配内容序号;如一条短信分隔为3条,该字段范围1,2,3

mobile

用户号码

String(20)

 用户号码

stat

状态码

int(4)

 1 – 成功;其他-失败

statMsg

状态描述

String(32)

 状态描述

attach

附加值字段

String(100)

 请求时携带客户数据字段

响应:

字段

名称

类型

说明

status

状态码

int(4)

 1 – 成功接收;其他-失败

失败尝试3次发送,超过3次放弃

数据样例:

请求:

[

    {

        "batchNo": 1,

        "stat": 1,

        "statMsg": "成功",

        "mobile": "13800138000",

        "id": "report",

        "attach": "",

        "taskId": 6479258452121862144

    },

    {

        "batchNo": 1,

        "stat": 1,

        "statMsg": "成功",

        "mobile": "13800138000",

        "id": "report",

        "attach": "",

        "taskId": 6479266612358397952

    }]

响应:

{

       "status": 1, //状态成功

}

相关文章:

短信平台(电信)

通信方式 采用http1.1通信方式,数据以post方式提交 http 头设置:application/json 签名 采用MD5加密方式, 源字符串采用字段拼接方式 签名中appSecret是平台分配密码 签名方法: 如:String signmd5(param1param2param3…paramN) …...

11.STM32F4 输入捕获

一、输入捕获概念 输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量脉宽为例,用一个简图来说明输入捕获的原理,如图1所示: 图1:输入捕获脉宽测量原理图 STM32F4的输入捕获,简单的说就是通过检测TIMx_CHx上的…...

opencv#30 线性滤波

均值滤波原理 均值滤波步骤 Step1:求和。 Step2:计算平均值。 所谓均值滤波,就是求平均值的意思。我们假设在一个3*3的范围内有一个图像,其中这个图像每一个像素可能含有噪声,也可能不含噪声,我们是不知道的,因此通…...

如何使用iPhone或iPad上的二维码共享Wi-Fi密码?这里有详细步骤

你有没有想过在不泄露网络密码的情况下与客人共享你的家庭或工作Wi-Fi?你肯定不是第一个这样想的人,我们很高兴地通知你,多亏了以下这个的变通方法,你现在可以使用iPhone或iPad做到这一点。 通常,如果你想让其他人访问网络,你需要共享你的Wi-Fi密码。苹果通过引入与任何…...

在游戏里开公司!基于ERNIE SDK的多智能体游戏应用

在虚拟世界有一座神奇的办公室,当你输入你的创业方向,办公室的智慧打工人们将团结合作,为你的项目勤劳奔走,并在过程中,把日报周报都写好,让你随时掌握项目进度和最终成果!该项目基于ERNIE SDK开…...

【SpringCloud Nacos】 微服务治理介绍及Nacos引入初体验

文章目录 前言服务治理介绍什么是服务治理1、服务发现2、服务配置3、服务健康检测 常见的注册中心ZookeeperEurekaConsulNacos Nacos 简介Nacos 实战入门搭建nacos环境1、安装nacos2、配置nacos3、访问nacos 将商品微服务注册到 nacos1、在 pom. xml 中添加 nacos 的依赖2、在主…...

JavaEE进阶(6)SpringBoot 配置文件(作用、格式、properties配置文件说明、yml配置文件说明、验证码案例)

接上次博客:JavaEE进阶(5)Spring IoC&DI:入门、IoC介绍、IoC详解(两种主要IoC容器实现、IoC和DI对对象的管理、Bean存储、方法注解 Bean)、DI详解:注入方式、总结-CSDN博客 目录 配置文件作用 Sprin…...

面包屑是什么

面包屑是网站导航中的一种可视化路径提示,通常以层次结构显示用户当前页面的位置,帮助用户了解他们在网站上的位置和浏览历史。这个术语来源于童话故事《汉赛尔与格莱特》中的面包屑小径,代表着一种追踪轨迹的方法。 假设你在一个电子商务网站…...

C++ 设计模式之责任链模式

【声明】本题目来源于卡码网(卡码网KamaCoder) 【提示:如果不想看文字介绍,可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 --什么是责任链模式(第21种设计模式) 责任链模式是⼀种行为型设计模式&am…...

HTML5与App封装技术将网站一键打包成App

HTML5:跨平台的利器HTML5作为一种先进的网页标记语言,其最大的优势在于跨平台性。开发者仅需编写一次代码,即可在各种操作系统和设备上运行,无需为每个平台单独开发App。这种“编写一次,运行处处”的模式,大…...

openssl3.2/test/certs - 060 - any.bad.com is excluded by CA2.

文章目录 openssl3.2/test/certs - 060 - any.bad.com is excluded by CA2.概述笔记END openssl3.2/test/certs - 060 - any.bad.com is excluded by CA2. 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 /*! * \file D:\my_dev\my_local_git_prj\study\openSSL\test…...

SpringBoot整理-数据库操作

在 Spring Boot 中进行数据库操作是一项常见的任务。Spring Boot 提供了多种方式来集成和操作数据库,使得与数据库的交互更为简便和高效。以下是在 Spring Boot 中进行数据库操作的几种主要方式: 1. Spring Data JPA 介绍: Spring Data JPA 是 Spring Data 的一部分,它简化了…...

IP被封怎么办?访问网站时IP被阻止?解决IP禁令全方法

相信很多人遇到过IP禁令:比如你在访问社交媒体、搜索引擎或电子商务网站时会被限制访问,又或者你的的账号莫名被封,这些由于网络上的种种限制我们经常会遭遇IP被封的情况,导致无法使用继续进行网络行动。在本文中,我们…...

利用aiohttp异步爬虫实现网站数据高效抓取

前言 大数据时代,网站数据的高效抓取对于众多应用程序和服务来说至关重要。传统的同步爬虫技术在面对大规模数据抓取时往往效率低下,而异步爬虫技术的出现为解决这一问题提供了新的思路。本文将介绍如何利用aiohttp异步爬虫技术实现网站数据抓取&#x…...

navicat连接postgresql、人大金仓等数据库报错

navicat连接postgresql、人大金仓数据库报错问题是一个偶现的问题,需要我们特别关注: 1、客户端连接人大金仓数据库 这里注意:navicat连接postgresql、人大金仓数据库时均选择postgresql类型,因为人大金仓数据库底层和psql数据库…...

AUTOSAR看门狗篇 -看门狗驱动(Wdg)

文章目录 功能介绍通用设计规则外部看门狗驱动内部看门狗驱动支持窗口看门狗的触发概念模块API介绍类型定义Wdg_ConfigType函数定义Wdg_InitWdg_SetModeWdg_SetTriggerConditionWdg_GetVersionInfo时序图看门狗初始化、设置触发条件...

数字图像处理:图像内插

图像内插 内插通常在图像放大、缩小旋转和几何校正等任务中使用。内插是用已知数据来估计未知位置的值的过程下面用—个简单的例子开始这—主题的探讨。假设大小为500500像素的—幅图像要放大1.5倍即放大到750750像素。一种简单的放大方法是,创建—个大小为750750像…...

Cantor表(刷题)(C语言)

个人博客主页:https://blog.csdn.net/2301_79293429?typeblog 专栏:https://blog.csdn.net/2301_79293429/category_12545690.html 题目描述 现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的&…...

linux install nvm

官网地址:https://github.com/nvm-sh/nvm 1、wget https://codeload.github.com/nvm-sh/nvm/tar.gz/refs/tags/v0.39.7 tar -zxvf v0.39.7 2、vim ~/.bashrc $HOMEroot export NVM_DIR"$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \…...

HTML 炫酷进度条

下面是代码 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>Light Loader - CodePen</title><style> html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...