回调接口

设置并校验回调地址;

回调消息格式说明;

测试回调功能的方法;

设置回调地址

功能说明

设置并校验回调地址

操作路径

Step1:登入控制台

Step2:进入应用模版

Step3:右侧菜单中选择[短信设置]

Step4:点击选择需要使用的回调接口

设置回调地址

在控制台填写回调地址,回调地址必须以 http:// 或 https:// 开头,不支持自定义端口。填写回调地址后需校验通过后才可以使用,校验规则:极光将给回调 URL 发起一个 GET 请求并附带一个 8 位随机字符串的参数 echostr,开发者需要在 Response Body 里原样输出 echostr 的值。

回调消息格式

回调方式说明

当有回调消息时,将采用 HTTP POST 的方式向开发者填写的回调 URL 提交通知消息。需要注意的是,如果回调失败,那么极光将会在一定的时间间隔后重试,最多重试三次。重试回调的时间间隔分别是 3 分钟、1 小时、12 小时。

回调的基础参数如下

KEY

REQUIRE

DESCRIPTION

nonce

Long

随机长整数

signature

String

签名,结合 appKey、appMasterSecret、nonce、timestamp 生成

timestamp

Long

当前时间戳,毫秒值

type

String

通知类型(SMS_REPORT/SMS_REPLY)

data

String

通知内容,json 字符串,开发者可以根据 type 反序列化 data

signature生成校验规则

将 appKey、appMasterSecret、nonce、timestamp 的值代入生成字符串 appKey={appKey}&appMasterSecret={appMasterSecret}&nonce={nonce}&timestamp={timestamp};

对生成的字符串进行 sha1 加密;

开发者把接收到的 signature 和自己本地代码按照同样规则生成的签名作对比,如果一致,则可以认定此回调来自极光。

下行消息送达状态回调参数

CODE

TYPE

DESCRIPTION

msgId

String

API 调用的时候返回的 msg_id

status

Integer

发送状态返回码

receiveTime

Timestamp

短信送达时间

phone

String

短信送达手机号

发送状态返回码

CODE

DESCRIPTION

4001

发送成功

4002

被叫手机号码为运营商黑名单,需联系运营商处理

4003

手机终端问题,手机关机、停机等,请确认手机状态是否正常

4004

被叫手机号码为空号,请核实手机号码是否合规

4005

可发送短信余量不足

4006

发送超频,发送频率超过运营商限制

4007

未应答,语音短信状态,语音短信呼叫成功,用户未接听或拒绝接听

4008

用户正忙,语音短信状态,被叫用户正忙

4009

无法接通,语音短信状态,不在服务区、手机无信号或电话被转入来电提醒等

4010

敏感词拦截,因短信内容存在敏感词导致运营商拦截

4100

其他错误

上行消息内容回调参数

CODE

TYPE

DESCRIPTION

phone

String

主叫号码(用户手机号码)

replyTime

Date

消息送达到极光平台的时间

content

String

用户回复的消息内容

模板审核结果回调参数

CODE

TYPE

DESCRIPTION

tempId

Integer

模板ID

status

Integer

模板状态,1代表审核通过,2代表审核不通过

refuseReason

String

审核不通过的原因

签名审核结果回调参数

CODE

TYPE

DESCRIPTION

signId

Integer

签名ID

status

Integer

签名状态,1代表审核通过,2代表审核不通过

refuseReason

String

审核不通过的原因

回调测试

功能说明

提供两种测试回调功能的方法:

控制台回调设置页面测试;

curl 模拟 POST 回调请求;

控制台回调设置页面测试

开发者点击回调设置页面中的测试按钮,极光将发起一次回调,将固定的测试数据回调到开发者提供的回调地址上。开发者可以通过检查是否收到回调请求,且接收到的数据是否与下面表格中一致以判断回调请求是否成功。

上行短信发送内容回调测试数据

KEY

VALUE

content

TD

phone

13000000000

replyTime

1492150740292

下行短信发送状态回调测试数据

KEY

VALUE

msgId

1857496

phone

13000000000

receiveTime

1492150740292

status

4001

模板审核结果回调测试数据

KEY

VALUE

tempId

57496

status

1

refuseReason

null

签名审核结果回调测试数据

KEY

VALUE

signId

123

status

1

refuseReason

null

curl 模拟 POST 回调请求

在 linux 上可以很方便的使用 curl 命令发起 HTTP POST 请求,在 windows 下需要安装 curl 工具软件。以下是 curl 模拟回调的示例

上行消息内容回调

curl -d "nonce=7659972084945889195&timestamp=1492150740274&signature=007eff6a105503211b472802eecc42465582ba70&type=SMS_REPLY&data={\"content\":\"TD\",\"phone\":\"13720481024\",\"replyTime\":1492150740292}" "http://localhost:8088/callback"

下行消息发送状态回调

curl -d "nonce=7659972084945889195&timestamp=1492150740274&signature=007eff6a105503211b472802eecc42465582ba70&type=SMS_REPORT&data={\"msgId\":\"1652496\",\"phone\":\"15822889320\",\"receiveTime\":1492150741392,\"status\":4001}" "http://localhost:8088/callback"

模板审核结果回调

curl -d "nonce=7659972084945889195&timestamp=1492150740274&signature=007eff6a105503211b472802eecc42465582ba70&type=SMS_TEMPLATE&data={\"tempId\":57496,\"status\":1,\"refuseReason\":null}" "http://localhost:8088/callback"

签名审核结果回调

curl -d "nonce=7659972084945889195&timestamp=1492150740274&signature=007eff6a105503211b472802eecc42465582ba70&type=SMS_SIGN&data={\"signId\":57496,\"status\":1,\"refuseReason\":null}" "http://localhost:8088/callback"

HttpClient 模拟 POST 回调请求

以下是 Java 语言使用 apache HttpClient 组件模拟回调的示例,使用前需引入以下 jar 包:

pom.xml

org.apache.httpcomponents

httpclient

4.5.2

com.alibaba

fastjson

1.2.31

CallbackTest.java

package cn.jiguang.sms.dev.sample;

import com.alibaba.fastjson.JSON;

import org.apache.http.HttpResponse;

import org.apache.http.NameValuePair;

import org.apache.http.client.HttpClient;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.message.BasicNameValuePair;

import java.io.IOException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.util.*;

/**

* Created by jiguang on 2017/4/14.

*/

public class CallbackTest {

private final static String URL = "http://localhost:8088/callback"; // 开发者将自己的回调URL写入

private final static String APPKEY = "dev_sample_appKey"; // 开发者将自己的appKey写入

private final static String APPMASTERSECRET = "dev_sample_appMasterSecret"; // 开发者将自己的appMasterSecret写入

public static void main(String[] args) throws IOException {

long nonce = new Random().nextLong();

long timestamp = System.currentTimeMillis();

String str = String.format("appKey=%s&appMasterSecret=%s&nonce=%s&timestamp=%s",

APPKEY, APPMASTERSECRET, nonce, timestamp);

String signature = encrypt(str);

Map params = new HashMap<>();

params.put("nonce", nonce);

params.put("timestamp", timestamp);

params.put("signature", signature);

// 测试用户回复消息回调

ReplyMessage replyMessage = new ReplyMessage();

replyMessage.setPhone("13720481024");

replyMessage.setReplyTime(new Date());

replyMessage.setContent("TD");

params.put("data", JSON.toJSONString(replyMessage));

params.put("type", "SMS_REPLY");

System.out.println("post params: " + JSON.toJSONString(params));

sendPost(URL, params);

// 测试短信送达状态回调

ReportMessage reportMessage = new ReportMessage();

reportMessage.setMsgId("1652496");

reportMessage.setStatus(4001);

reportMessage.setPhone("15822889320");

reportMessage.setReceiveTime(new Date());

params.put("data", JSON.toJSONString(reportMessage));

params.put("type", "SMS_REPORT");

System.out.println("post params: " + JSON.toJSONString(params));

sendPost(URL, params);

// 测试短信模板审核结果回调

TemplateMessage templateMessage = new TemplateMessage();

templateMessage.setTempId(57496);

templateMessage.setStatus(1);

templateMessage.setRefuseReason(null);

params.put("data", JSON.toJSONString(templateMessage));

params.put("type", "SMS_TEMPLATE");

System.out.println("post params: " + JSON.toJSONString(params));

sendPost(URL, params);

}

private static void sendPost(String url, Map params) throws IOException {

HttpClient httpClient = HttpClients.custom().build();

HttpPost httpPost = new HttpPost(url);

List formParams = new ArrayList<>();

for (Map.Entry entry : params.entrySet()) {

formParams.add(new BasicNameValuePair(entry.getKey(), entry.getValue().toString()));

}

UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(formParams, "UTF-8");

httpPost.setEntity(uefEntity);

HttpResponse response = httpClient.execute(httpPost);

System.out.println("response: " + JSON.toJSONString(response));

}

private static class ReplyMessage {

private String phone;

private Date replyTime;

private String content;

public String getPhone() {

return phone;

}

public void setPhone(String phone) {

this.phone = phone;

}

public String getContent() {

return content;

}

public void setContent(String content) {

this.content = content;

}

public Date getReplyTime() {

return replyTime;

}

public void setReplyTime(Date replayTime) {

this.replyTime = replayTime;

}

}

private static class ReportMessage {

private String msgId;

private Integer status;

private String phone;

private Date receiveTime;

public String getMsgId() {

return msgId;

}

public void setMsgId(String msgId) {

this.msgId = msgId;

}

public Integer getStatus() {

return status;

}

public void setStatus(Integer status) {

this.status = status;

}

public String getPhone() {

return phone;

}

public void setPhone(String phone) {

this.phone = phone;

}

public Date getReceiveTime() {

return receiveTime;

}

public void setReceiveTime(Date receiveTime) {

this.receiveTime = receiveTime;

}

}

private static class TemplateMessage {

private Integer tempId;

private Integer status;

private String refuseReason;

public Integer getTempId() {

return tempId;

}

public void setTempId(Integer tempId) {

this.tempId = tempId;

}

public Integer getStatus() {

return status;

}

public void setStatus(Integer status) {

this.status = status;

}

public String getRefuseReason() {

return refuseReason;

}

public void setRefuseReason(String refuseReason) {

this.refuseReason = refuseReason;

}

}

/**

* SHA1加密

*

* @param strSrc 明文

* @return 加密之后的密文

*/

public static String encrypt(String strSrc) {

MessageDigest md = null;

String strDes = null;

byte[] bt = strSrc.getBytes();

try {

md = MessageDigest.getInstance("SHA-1");// 将此换成SHA-1、SHA-512、SHA-384等参数

md.update(bt);

strDes = bytes2Hex(md.digest()); // to HexString

} catch (NoSuchAlgorithmException e) {

return null;

}

return strDes;

}

/**

* byte数组转换为16进制字符串

*

* @param bts 数据源

* @return 16进制字符串

*/

private static String bytes2Hex(byte[] bts) {

String des = "";

String tmp = null;

for (int i = 0; i < bts.length; i++) {

tmp = (Integer.toHexString(bts[i] & 0xFF));

if (tmp.length() == 1) {

des += "0";

}

des += tmp;

}

return des;

}

}

Java回调网址_极光短信- 回调接口 - 极光文档相关推荐

  1. JAVA怎么对接第三方短信平台?短信验证码完整API文档

    验证码短信平台的应用场景,一般包括用户注册.登陆账号.忘记密码.登录异常.支付确认等. 一.用户注册 通常我们会在注册时会用到短信验证码,即用户在网站或软件上注册账号时,企业需要通过验证码确认用户身份 ...

  2. 仙剑java单机游戏_仙剑游戏源码(含文档)

    [实例简介]java游戏 [实例截图] [核心代码] │  .gitattributes │  README.md │  运行方式.txt │  项目报告.doc │ └─WLGC16-2-XJQXZ ...

  3. 极光小课堂 | 极光短信与 Java 整合指南

    前言 今天大Boss给小优优说,你给咱们的注册系统增加一下短信验证吧.后来一it好友告诉小优优,说用极光短信吧,毕竟人家就是做消息推送出身的,技术以及实时性肯定没的说. 小优优觉得说的对,毕竟人家是专 ...

  4. Java常用工具类-发短信(集成阿里云短信服务)

    1.注册阿里账号并开通短信服务 注册阿里账号后,并进行个人或企业实名认证,实名认证后,才能开通短信服务. 界面如下: 2.获取AccessKey 参考获取AccessKey方法 创建成功后,如下图: ...

  5. Java常用工具类-发短信(集成云通信的企业信使短信平台)

    集成云通信的企业信使短信平台,实现发短信功能,具体代码如下: package com.zrsc.sendsms; import java.util.ArrayList; import java.uti ...

  6. Java 集成阿里大鱼平台短信服务发送验证码到手机

    点击前往:阿里大鱼 --- 短信接口调用错误码(错误原因及处理方式) 上一篇:阿里大鱼短信服务 --- 发送验证码.短信通知 下一篇:Java 集成阿里大鱼平台短信服务发送验证码 --- 补齐注册部分 ...

  7. Java 后端 - 腾讯云短信报错:AuthFailure.SecretIdNotFound message:The SecretId is not found, please ensure that

    完整报错: [TencentCloudSDKException]code: AuthFailure.SecretIdNotFound message:The SecretId is not found ...

  8. 国际短信平台接口调用的方法步骤,简单5步快速教程

    如果您需要使用国际短信平台来满足您的业务需求,那么您需要了解短信平台接口调用的方法步骤. 接口调用是指您的应用程序通过网络接口与短信平台进行通信,从而实现向全世界发送短信的功能. 下面是国际短信平台接 ...

  9. 极光短信推送-java使用

    首先介绍下这个 极光推送,就是一个平台.里面服务主打app推送.但是也有发送短信的功能.其实文档也还算可以.sdk可用性也很高.不过到底看文档需要时间的.所以我直接写一下用法(仅限于短信) 第一部分: ...

最新文章

  1. oracle批处理脚本学习总结
  2. 【攻防世界007】simple-check-100
  3. 独家!币安被盗原因找到了!7074 枚比特币竟是这样丢掉的
  4. html5 websocket与c,打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
  5. 数据--第50课 - 基础查找课后练习
  6. 悟空 mobile.php,悟空CRM无需任何权限的SQL注入漏洞2(ThinkPHP特性)
  7. 全球130多个国家的货币代码对照表
  8. word排版字体选用
  9. DAY16-T1342面试题 05.08 -2022-01-31-非自己作答
  10. C#源码刷新网页 最小化托盘http get和post请求配置保存版权时间限制定时调用 单实例运行,如果已经运行则激活窗口到最前显示
  11. JavaCV开发详解之1:调用本机摄像头并预览摄像头图像画面视频(建议使用javaCV最新版本)
  12. ESXi 8.0 Install
  13. 专题三 Problem X
  14. 中国定制家具市场营销态势与盈利前景预测报告(2022-2028年)
  15. java i=i++和j=i++的区别
  16. 云服务器存储文件,云服务器存储文件
  17. 如何做一名主程之Unity3D网络游戏服务器架构设计
  18. 人体部位检测:BodyHands
  19. 最近比较火的电影小程序是怎么搭建的?
  20. 推荐:产品经理都在用的交互软件

热门文章

  1. 相对寻址问题求解总结
  2. Caffe编写Python layer
  3. pytorch 如何将张量、类实例、函数放到GPU上
  4. iTOP-i.MX6Q开发板支持安卓Android6.0系统
  5. tensorflow 提示没有models库
  6. 用js实现图片的无缝滚动效果
  7. Linux格式化分区报错Could not start /dev/sda No such file or directory 解决办法
  8. 根据XPATH去查看修改xml文件节点的内容
  9. Android 组件系列-----Activity保存状态
  10. 不得不爱开源 Wijmo jQuery 插件集(13)-【Tooltip】(附页面展示和源码)