HttpClient 的具体用法以及SMS短信发送的源码分析

1 篇文章 0 订阅
1 篇文章 0 订阅

SMS短信发送的源码分析

其中包含了使用 HttpClient 发送POST请求的方法:
第一步: HTTPClient httpclient = new DefaultHTTPClient()
第二步: HTTPRequest request = new HTTPRequest(HTTPMethod.POST, url)
第三步: request.addHeader("Conetent-Type", "application/json")
第四步: request.addQueryParameter("key",value)
第五步: request.setConnectionTimeout(毫秒)  //设置http连接的超时时间
第六步: request.setRequestTimeout(毫秒)   //设置http请求的超时时间
第七步: request.setBody(JSONObject body)
后续:  获取结果:
    try {
        HTTPResponse res = this.httpclient.fetch(req);
        this.handleError(res);
        return (new SmsSingleSenderResult()).parseFromHTTPResponse(res);
    } catch (URISyntaxException var14) {
        throw new RuntimeException("API url has been modified, current url: " + this.url);
    }

源码分析

public class SmsSingleSender extends SmsBase {
private String url = "https://yun.tim.qq.com/v5/tlssmssvr/sendsms";

public SmsSingleSender(int appid, String appkey) {
    super(appid, appkey, new DefaultHTTPClient());
}

public SmsSingleSender(int appid, String appkey, HTTPClient httpclient) {
    super(appid, appkey, httpclient);
}

public SmsSingleSenderResult send(int type, String nationCode, String phoneNumber, String msg, String extend, String ext) throws HTTPException, JSONException, IOException {
    long random = SmsSenderUtil.getRandom();
    long now = SmsSenderUtil.getCurrentTime();
    JSONObject body = (new JSONObject()).put("tel", (new JSONObject()).put("nationcode", nationCode).put("mobile", phoneNumber)).put("type", type).put("msg", msg).put("sig", SmsSenderUtil.calculateSignature(this.appkey, random, now, phoneNumber)).put("time", now).put("extend", SmsSenderUtil.isNotEmpty(extend) ? extend : "").put("ext", SmsSenderUtil.isNotEmpty(ext) ? ext : "");
    HTTPRequest req = (new HTTPRequest(HTTPMethod.POST, this.url)).addHeader("Conetent-Type", "application/json").addQueryParameter("sdkappid", this.appid).addQueryParameter("random", random).setConnectionTimeout(60000).setRequestTimeout(60000).setBody(body.toString());

    try {
        HTTPResponse res = this.httpclient.fetch(req);
        this.handleError(res);
        return (new SmsSingleSenderResult()).parseFromHTTPResponse(res);
    } catch (URISyntaxException var14) {
        throw new RuntimeException("API url has been modified, current url: " + this.url);
    }
}

public SmsSingleSenderResult sendWithParam(String nationCode, String phoneNumber, int templateId, ArrayList<String> params, String sign, String extend, String ext) throws HTTPException, JSONException, IOException {
    long random = SmsSenderUtil.getRandom();
    long now = SmsSenderUtil.getCurrentTime();
    JSONObject body = (new JSONObject()).put("tel", (new JSONObject()).put("nationcode", nationCode).put("mobile", phoneNumber)).put("sig", SmsSenderUtil.calculateSignature(this.appkey, random, now, phoneNumber)).put("tpl_id", templateId).put("params", params).put("sign", sign).put("time", now).put("extend", SmsSenderUtil.isNotEmpty(extend) ? extend : "").put("ext", SmsSenderUtil.isNotEmpty(ext) ? ext : "");
    HTTPRequest req = (new HTTPRequest(HTTPMethod.POST, this.url)).addHeader("Conetent-Type", "application/json").addQueryParameter("sdkappid", this.appid).addQueryParameter("random", random).setConnectionTimeout(60000).setRequestTimeout(60000).setBody(body.toString());

    try {
        HTTPResponse res = this.httpclient.fetch(req);
        this.handleError(res);
        return (new SmsSingleSenderResult()).parseFromHTTPResponse(res);
    } catch (URISyntaxException var15) {
        throw new RuntimeException("API url has been modified, current url: " + this.url);
    }
}

public SmsSingleSenderResult sendWithParam(String nationCode, String phoneNumber, int templateId, String[] params, String sign, String extend, String ext) throws HTTPException, JSONException, IOException {
    return this.sendWithParam(nationCode, phoneNumber, templateId, new ArrayList(Arrays.asList(params)), sign, extend, ext);
}

}

1 协议说明 协议 HTTP POST 编码格式 UTF8 URL 举例:https://yun.tim.qq.com/v5/tlssmssvr/sendsms?sdkappid=xxxxx&random=xxxx 接口说明 给用户发短信验证码、短信通知,营销短信(内容长度不超过450字)。 注:sdkappid请填写您在腾讯云上申请到的,random请填成随机数。 2 请求包体 包体为json字符串,参数如下: { "tel": { //如需使用国际电话号码通用格式,如:"+8613788888888" ,请使用sendisms接口见下注 "nationcode": "86", //国家码 "mobile": "13788888888" //手机号码 }, "type": 0, //0:普通短信;1:营销短信(强调:要按需填值,不然会影响到业务的正常使用) "msg": "你的验证码是1234", //utf8编码,需要匹配审核通过的模板内容 "sig": "ecab4881ee80ad3d76bb1da68387428ca752eb885e52621a3129dcf4d9bc4fd4", //app凭证,具体计算方式见下注 "time": 1457336869, //unix时间戳,请求发起时间,如果和系统时间相差超过10分钟则会返回失败 "extend": "", //通道扩展码,可选字段,默认没有开通(需要填空)。 //在短信回复场景中,腾讯server会原样返回,开发者可依此区分是哪种类型的回复 "ext": "" //用户的session内容,腾讯server回包中会原样返回,可选字段,不需要就填空。 } 注: 1、"msg"字段需要匹配审核通过的模板内容 如果您的模板是"你的验证码是{1}",则"msg"字段可赋值为:"你的验证码是xxxx"。(其中"xxxx"为下发的验证码) 如果您有多个短信签名,请将需要的短信签名放在短信内容前面 例如您有"【腾讯科技】","【腾讯云】"两个签名,但是想以"【腾讯云】"签名发送短信, 则"msg"字段可赋值为:"【腾讯云】你的验证码是xxxx"。(其中"xxxx"为下发的验证码) 2、"extend"字段的配置请联系腾讯云短信技术支持 3、sendisms接口,"tel"字段为国际电话号码通用格式,如:"+8613788888888" 4、"sig"字段根据公式sha256(appkey=$appkey&random=$random&time=$time&mobile=$mobile)生成 伪代码如下: string strMobile = "13788888888"; //tel的mobile字段的内容 string strAppKey = "5f03a35d00ee52a21327ab048186a2c4"; //sdkappid对应的appkey,需要业务方高度保密 string strRand = "7226249334"; //url中的random字段的值 string strTime = "1457336869"; //unix时间戳 string sig = sha256(appkey=5f03a35d00ee52a21327ab048186a2c4&random=7226249334&time=1457336869&mobile=13788888888) = ecab4881ee80ad3d76bb1da68387428ca752eb885e52621a3129dcf4d9bc4fd4; 3 应答包体 { "result": 0, //0表示成功(计费依据),非0表示失败 "errmsg": "OK", //result非0时的具体错误信息 "ext": "", //用户的session内容,腾讯server回包中会原样返回 "sid": "xxxxxxx", //标识本次发送id,标识一次短信下发记录 "fee": 1 //短信计费的条数 } 1.需要申请腾讯云短信的 appid 和 appkey  (详见 https://console.cloud.tencent.com/sms) 2.需要申请一个 短信签名+ 短信模版
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值