1. maven依赖
<!--整合极光短信-->
<dependency>
<groupId>cn.jpush.api</groupId>
<artifactId>jsms-client</artifactId>
<version>1.2.9</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>cn.jpush.api</groupId>
<artifactId>jiguang-common</artifactId>
<version>1.0.8</version>
</dependency>
2. 发送短信工具类
package cn.cnbuilder.smallapp.utils;
import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jsms.api.SendSMSResult;
import cn.jsms.api.common.SMSClient;
import cn.jsms.api.common.model.SMSPayload;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@Component //交给spring管理
public class JGSmsUtil {
// masterSecret https://www.jiguang.cn/dev2/#/overview/appCardList 开发者服务--->应用设置--->应用信息--> Master Secret
public String masterSecret = "xxxx";
//appKey https://www.jiguang.cn/dev2/#/overview/appCardList 开发者服务--->应用设置--->应用信息--> Master Secret
public String appKey = "xxxxx";
//初始化发短信客户端
private SMSClient smsClient = new SMSClient(masterSecret, appKey);
/**
* 发送模板短信-验证码 示例1
*
* @param phoneNumber
* create 2019/12/26 by kingyifan
*/
public void sendSMSCode(String phoneNumber, String code) {
try {//构建发送短信
SMSPayload payload = SMSPayload.newBuilder()
.setMobileNumber(phoneNumber) // 手机号码
.setTempId(1) // 短信模板ID 需要自行申请 模板id为:1的则自带验证码模板id
.addTempPara("code", code) // key模板参数value:参数值 您的手机验证码:{{code}},有效期5分钟,请勿泄露。如非本人操作,请忽略此短信。谢谢!
.setSignId(xxxx)// 签名id 需要自行申请审核。个人也可以申请
.build();
//发送短信 会返回msg_id
SendSMSResult res = smsClient.sendTemplateSMS(payload);
//执行业务/
//指向保存短信发送记录业务逻辑 可以直接扔到MQ
/**
* 第一个参数极光返回的消息id
* 第二个发送的手机号
* 第三个发送内容
* 第四个发送时间
* 保存到DB
*/
//insertSendSmsLog(res.getMessageId(),phoneNumber,code,0,System.currentTimeMillis()/1000);
//执行业务/
} catch (APIConnectionException e) {
e.printStackTrace();
} catch (APIRequestException e) {
e.printStackTrace();
}
}
/**
* 发送模板短信-取快递 示例2
*
* @param phoneNumber 手机号
* @param name 名字
* @param address 地址
* <p>
* create 2019/12/26 by kingyifan
*/
public void sendSMSOther(String name, String address, String phoneNumber) {
try {
SMSPayload payload = SMSPayload.newBuilder()
.setMobileNumber(phoneNumber) // 手机号码
.setTempId(xxxx) // 短信模板ID 需要自行申请
.addTempPara("name", name) // key模板参数value:参数值 尊敬的{{name}},您的快递到{{address}},请速来取一下。
.addTempPara("address", address) // key模板参数value:参数值 尊敬的{{name}},您的快递到{{address}},请速来取一下。
.setSignId(xxxx)// 签名id 需要自行申请审核。个人也可以申请
.build();
//发送短信
SendSMSResult res = smsClient.sendTemplateSMS(payload);
//执行业务/
//指向保存短信发送记录业务逻辑 可以直接扔到MQ
/**
* 第一个参数极光返回的消息id
* 第二个发送的手机号
* 第三个发送内容
* 第四个发送时间
* 保存到DB
*/
//insertSendSmsLog(res.getMessageId(),phoneNumber,code,0,System.currentTimeMillis()/1000);
//执行业务/
} catch (APIConnectionException e) {
e.printStackTrace();
} catch (APIRequestException e) {
e.printStackTrace();
}
}
/**
* 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;
}
/**
* 延签判断是否是极光回调
*
* @param signature
* @param nonce
* @param timestamp
* @return create kingyifan by on 2019.12.26
*/
public Boolean checkSign(String signature, String nonce, String timestamp) {
//加密进行比对
String str = String.format("appKey=%s&appMasterSecret=%s&nonce=%s×tamp=%s",
appKey, masterSecret, nonce, timestamp);
String new_signature = encrypt(str);
if (signature.equals(new_signature)) {
return true;
}
return false;
}
}
3. 模拟接口测试发送
package cn.cnbuilder.smallapp.controller;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaTemplateData;
import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage;
import cn.cnbuilder.smallapp.config.WxMaConfiguration;
import cn.cnbuilder.smallapp.controller.base.BaseController;
import cn.cnbuilder.smallapp.utils.JGSmsUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import static cn.cnbuilder.smallapp.controller.CallBackTest.encrypt;
/**
* 极光短信发送测试以及回调
* create By KingYiFan on 2019/12/26
*/
@Api(description = "极光短信发送测试以及回调")
@RestController
@RequestMapping("/jiguang")
public class JiGuangController {
@Autowired //注入极光工具类
private JGSmsUtil jgSmsUtil;
/**
* 发送极光短信验证码 --测试API
* create By KingYiFan on 2019/12/26
*/
@ApiOperation(value = "发送极光短信验证码", notes = "发送极光短信验证码")
@ApiImplicitParams({
@ApiImplicitParam(name = "phoneNumber", value = "发送的手机号", dataType = "String", paramType = "query")})
@GetMapping(value = "/sms/sendCode")
public String sendCode(@RequestParam(value = "phoneNumber", required = true) String phoneNumber) {
try {
//发送验证码 也可以发送其他模板信息
jgSmsUtil.sendSMSCode(phoneNumber, "123456");
return "发送成功";
} catch (Exception e) {
e.printStackTrace();
}
return "发送失败";
}
/**
* 发送极光短信快递 --测试API
* create By KingYiFan on 2019/12/26
*/
@ApiOperation(value = "发送极光短信快递测试", notes = "发送极光短信快递测试")
@ApiImplicitParams({
@ApiImplicitParam(name = "phoneNumber", value = "发送的手机号", dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "address", value = "地址", dataType = "String", paramType = "query")
})
@GetMapping(value = "/sms/sendKDInfo")
public String sendKDInfo(@RequestParam(value = "phoneNumber", required = true) String phoneNumber, @RequestParam(value = "address", required = true) String address, @RequestParam(value = "name", required = true) String name) {
try {
//发送验证码 也可以发送其他模板信息
jgSmsUtil.sendSMSOther(name, address, phoneNumber);
return "发送成功";
} catch (Exception e) {
e.printStackTrace();
}
return "发送失败";
}
}
4. 发送结果回调API
/**
* 发送结果回调API --测试API
* create By KingYiFan on 2019/12/26
* {
* "data":"{"msgId":"1652496","phone":"15822889320","receiveTime":1577342316504,"status":4001}",
* "signature":"9bd88a6e110088a06faf3b2754eba341e34dd60f",
* "type":"SMS_REPORT",
* "nonce":-6573564950165804387,
* "timestamp":1577342316407
* }
*/
@ApiOperation(value = "发送结果回调API", notes = "发送极光短信验证码")
@ApiImplicitParams({
@ApiImplicitParam(name = "phoneNumber", value = "发送的手机号", dataType = "String", paramType = "query")})
@PostMapping(value = "/sms/callBack")
public String SmsCallBack(String data, String signature, String type, String nonce, String timestamp) {
try {
//验签查询是否是极光回调
Boolean isJiGuang = jgSmsUtil.checkSign(signature, nonce, timestamp);
if (!isJiGuang) {
return "验签失败,请求有误!";
}
JSONObject jsonObject = JSONUtil.parseObj(data);
String msgId = jsonObject.getStr("msgId");// API 调用的时候返回的 msg_id
String phone = jsonObject.getStr("phone");//短信送达手机号
String receiveTime = jsonObject.getStr("receiveTime");//短信送达时间
//https://docs.jiguang.cn/jsms/server/callback/ 具体发送状态码
String status = jsonObject.getStr("status");//发送状态返回码
//修改db发送状态
System.out.println(msgId);
System.out.println(phone);
System.out.println(receiveTime);
System.out.println(status);
System.out.println(type);
return "success";
} catch (Exception e) {
e.printStackTrace();
}
return "fail";
}
![](https://img.haomeiwen.com/i17979893/61dcbf787675da27.png)
image.png
网友评论