極光短信以及通知回調(diào)整合 java

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. 發(fā)送短信工具類

 
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 開發(fā)者服務--->應用設置--->應用信息--> Master Secret
    public String masterSecret = "xxxx";
 
    //appKey https://www.jiguang.cn/dev2/#/overview/appCardList 開發(fā)者服務--->應用設置--->應用信息--> Master Secret
    public String appKey = "xxxxx";
 
    //初始化發(fā)短信客戶端
    private SMSClient smsClient = new SMSClient(masterSecret, appKey);
 
    /**
     * 發(fā)送模板短信-驗證碼 示例1
     *
     * @param phoneNumber
     * create 2019/12/26 by kingyifan
     */
    public void sendSMSCode(String phoneNumber, String code) {
        try {//構建發(fā)送短信
            SMSPayload payload = SMSPayload.newBuilder()
                    .setMobileNumber(phoneNumber) // 手機號碼
                    .setTempId(1)            // 短信模板ID 需要自行申請 模板id為:1的則自帶驗證碼模板id
                    .addTempPara("code", code)  // key模板參數(shù)value:參數(shù)值  您的手機驗證碼:{{code}},有效期5分鐘,請勿泄露。如非本人操作,請忽略此短信。謝謝!
                    .setSignId(xxxx)// 簽名id 需要自行申請審核。個人也可以申請
                    .build();
 
            //發(fā)送短信 會返回msg_id
            SendSMSResult res = smsClient.sendTemplateSMS(payload);
            //執(zhí)行業(yè)務/
            //指向保存短信發(fā)送記錄業(yè)務邏輯 可以直接扔到MQ
            /**
             * 第一個參數(shù)極光返回的消息id
             * 第二個發(fā)送的手機號
             * 第三個發(fā)送內(nèi)容
             * 第四個發(fā)送時間
             * 保存到DB
             */
            //insertSendSmsLog(res.getMessageId(),phoneNumber,code,0,System.currentTimeMillis()/1000);
            //執(zhí)行業(yè)務/
 
        } catch (APIConnectionException e) {
            e.printStackTrace();
        } catch (APIRequestException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 發(fā)送模板短信-取快遞 示例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模板參數(shù)value:參數(shù)值  尊敬的{{name}},您的快遞到{{address}},請速來取一下。
                    .addTempPara("address", address)  // key模板參數(shù)value:參數(shù)值  尊敬的{{name}},您的快遞到{{address}},請速來取一下。
                    .setSignId(xxxx)// 簽名id 需要自行申請審核。個人也可以申請
                    .build();
 
            //發(fā)送短信
            SendSMSResult res = smsClient.sendTemplateSMS(payload);
            //執(zhí)行業(yè)務/
            //指向保存短信發(fā)送記錄業(yè)務邏輯 可以直接扔到MQ
            /**
             * 第一個參數(shù)極光返回的消息id
             * 第二個發(fā)送的手機號
             * 第三個發(fā)送內(nèi)容
             * 第四個發(fā)送時間
             * 保存到DB
             */
            //insertSendSmsLog(res.getMessageId(),phoneNumber,code,0,System.currentTimeMillis()/1000);
            //執(zhí)行業(yè)務/
        } 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等參數(shù)
            md.update(bt);
            strDes = bytes2Hex(md.digest()); // to HexString
        } catch (NoSuchAlgorithmException e) {
            return null;
        }
        return strDes;
    }
 
    /**
     * byte數(shù)組轉(zhuǎn)換為16進制字符串
     *
     * @param bts 數(shù)據(jù)源
     * @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;
    }
 
    /**
     * 延簽判斷是否是極光回調(diào)
     *
     * @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. 模擬接口測試發(fā)送

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;
 
/**
 * 極光短信發(fā)送測試以及回調(diào)
 * create By KingYiFan on 2019/12/26
 */
@Api(description = "極光短信發(fā)送測試以及回調(diào)")
@RestController
@RequestMapping("/jiguang")
public class JiGuangController {
 
    @Autowired //注入極光工具類
    private JGSmsUtil jgSmsUtil;
 
    /**
     * 發(fā)送極光短信驗證碼 --測試API
     * create By KingYiFan on 2019/12/26
     */
    @ApiOperation(value = "發(fā)送極光短信驗證碼", notes = "發(fā)送極光短信驗證碼")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "phoneNumber", value = "發(fā)送的手機號", dataType = "String", paramType = "query")})
    @GetMapping(value = "/sms/sendCode")
    public String sendCode(@RequestParam(value = "phoneNumber", required = true) String phoneNumber) {
 
        try {
            //發(fā)送驗證碼 也可以發(fā)送其他模板信息
            jgSmsUtil.sendSMSCode(phoneNumber, "123456");
            return "發(fā)送成功";
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "發(fā)送失敗";
    }
 
    /**
     * 發(fā)送極光短信快遞 --測試API
     * create By KingYiFan on 2019/12/26
     */
    @ApiOperation(value = "發(fā)送極光短信快遞測試", notes = "發(fā)送極光短信快遞測試")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "phoneNumber", value = "發(fā)送的手機號", 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 {
            //發(fā)送驗證碼 也可以發(fā)送其他模板信息
            jgSmsUtil.sendSMSOther(name, address, phoneNumber);
            return "發(fā)送成功";
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "發(fā)送失敗";
    }
}

4. 發(fā)送結果回調(diào)API

 /**
     * 發(fā)送結果回調(diào)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 = "發(fā)送結果回調(diào)API", notes = "發(fā)送極光短信驗證碼")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "phoneNumber", value = "發(fā)送的手機號", dataType = "String", paramType = "query")})
    @PostMapping(value = "/sms/callBack")
    public String SmsCallBack(String data, String signature, String type, String nonce, String timestamp) {
 
        try {
 
            //驗簽查詢是否是極光回調(diào)
            Boolean isJiGuang = jgSmsUtil.checkSign(signature, nonce, timestamp);
            if (!isJiGuang) {
                return "驗簽失敗,請求有誤!";
            }
            JSONObject jsonObject = JSONUtil.parseObj(data);
 
            String msgId = jsonObject.getStr("msgId");//    API 調(diào)用的時候返回的 msg_id
            String phone = jsonObject.getStr("phone");//短信送達手機號
            String receiveTime = jsonObject.getStr("receiveTime");//短信送達時間
            //https://docs.jiguang.cn/jsms/server/callback/ 具體發(fā)送狀態(tài)碼
            String status = jsonObject.getStr("status");//發(fā)送狀態(tài)返回碼
 
             //修改db發(fā)送狀態(tài)
 
            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
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容