美文网首页
极光短信以及通知回调整合 java

极光短信以及通知回调整合 java

作者: Mark_ZSQ | 来源:发表于2021-07-16 09:05 被阅读0次

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";
    }
image.png

相关文章

网友评论

      本文标题:极光短信以及通知回调整合 java

      本文链接:https://www.haomeiwen.com/subject/ktvvpltx.html