java实现发送手机验证码功能

た 入场券 2023-10-06 12:00 156阅读 0赞
  1. 进入秒嘀科技(http://www.miaodiyun.com/),注册一个账号

  2. 注册好之后,点击 用户中心 -> 账户管理,就会进入如下界面 (顺便提一下,新注册的用户,平台会免费赠送你10元,足够大家学习和使用了,所以不用担心需要充钱) 你需要做的就是获取你自己的 ACCOUNT SID 和 AUTH TOKEN

70

  1. 点击 用户中心 -> 认证,进行企业认证,企业的资质证件就是企业的营业执照,网上百度一张带有红色的公章就行,公司电话填写自己的就行,最后点击提交

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MTM1Mjg3_size_16_color_FFFFFF_t_70

  1. 需要在秒嘀上新建一个发送手机验证码的模板,点击 配置管理 -> 验证码短信模板,就会进入如下界面

70 1

  1. 点击“新建模板”按钮, 填写好模板名称、短信签名 和 短信内容(短信内容可以选择 验证码通知短信模板 或者 自己编写短信内容),点击“提交审核”按钮即可,界面如下

70 2

  1. 然后等待 短信验证码模板 审核通过即可,点击 配置管理 -> 验证码短信模板,查看 短信验证码 是否审核通过

70 3

  1. 接下来就是代码了,把我圈住的地方改成自己的就行,其他的不用动,tamp值 一定要与自己创建短信模板的短信内容保持一致

70 4

  1. java短信发送验证码

导入阿里巴巴fastjson.jar包:

方式一:下载fastjson.jar包导入工程就行 链接:https://pan.baidu.com/s/1RH4-x82G8-sNmn7y5YhdjA

方式二:maven工程直接把 下面这段代码复制到 pom.xml 中就行

  1. <dependency>
  2. <groupId>com.alibaba
  3. </groupId>
  4. <artifactId>fastjson
  5. </artifactId>
  6. <version>1.2.47
  7. </version>
  8. </dependency>

源码如下 :

  1. package com.group.util;
  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;
  4. import java.io.OutputStreamWriter;
  5. import java.net.HttpURLConnection;
  6. import java.net.URL;
  7. import java.security.MessageDigest;
  8. import java.security.NoSuchAlgorithmException;
  9. import java.text.SimpleDateFormat;
  10. import java.util.Date;
  11. import com.alibaba.fastjson.JSONObject;
  12. /**
  13. *
  14. * @Title:GetMessageCode
  15. * @Description:发送验证码
  16. * @author:ヅ零碎de記憶ぷ
  17. * @Date 2018年7月4日 下午9:27:04
  18. */
  19. public
  20. class GetMessageCode {
  21. private
  22. static
  23. final String QUERY_PATH =
  24. "https://api.miaodiyun.com/20150822/industrySMS/sendSMS";
  25. private
  26. static
  27. final String ACCOUNT_SID =
  28. "";
  29. private
  30. static
  31. final String AUTH_TOKEN =
  32. "";
  33. // 根据相应的手机号发送验证码
  34. public static String getCode(String phone) {
  35. String rod = smsCode();
  36. String timestamp = getTimestamp();
  37. String sig = getMD5(ACCOUNT_SID, AUTH_TOKEN, timestamp);
  38. String tamp =
  39. "【联途旅游】尊敬的用户,您好,您的验证码为:" + rod +
  40. ",若非本人操作,请忽略此短信。";
  41. OutputStreamWriter out =
  42. null;
  43. BufferedReader br =
  44. null;
  45. StringBuilder result =
  46. new StringBuilder();
  47. try {
  48. URL url =
  49. new URL(QUERY_PATH);
  50. HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  51. connection.setRequestMethod(
  52. "POST");
  53. connection.setDoInput(
  54. true);
  55. // 设置是否允许数据写入
  56. connection.setDoOutput(
  57. true);
  58. // 设置是否允许参数数据输出
  59. connection.setConnectTimeout(
  60. 5000);
  61. // 设置链接响应时间
  62. connection.setReadTimeout(
  63. 10000);
  64. // 设置参数读取时间
  65. connection.setRequestProperty(
  66. "Content-type",
  67. "application/x-www-form-urlencoded");
  68. // 提交请求
  69. out =
  70. new OutputStreamWriter(connection.getOutputStream(),
  71. "UTF-8");
  72. String args = getQueryArgs(ACCOUNT_SID, tamp, phone, timestamp, sig,
  73. "JSON");
  74. out.write(args);
  75. out.flush();
  76. // 读取返回参数
  77. br =
  78. new BufferedReader(
  79. new InputStreamReader(connection.getInputStream(),
  80. "UTF-8"));
  81. String temp =
  82. "";
  83. while ((temp = br.readLine()) !=
  84. null) {
  85. result.append(temp);
  86. }
  87. }
  88. catch (Exception e) {
  89. // TODO Auto-generated catch block
  90. e.printStackTrace();
  91. }
  92. JSONObject json = JSONObject.parseObject(result.toString());
  93. String respCode = json.getString(
  94. "respCode");
  95. String defaultRespCode =
  96. "00000";
  97. if (defaultRespCode.equals(respCode)) {
  98. return rod;
  99. }
  100. else {
  101. return defaultRespCode;
  102. }
  103. }
  104. // 定义一个请求参数拼接方法
  105. public static String getQueryArgs(String accountSid, String smsContent, String to, String timestamp, String sig,
  106. String respDataType) {
  107. return
  108. "accountSid=" + accountSid +
  109. "&smsContent=" + smsContent +
  110. "&to=" + to +
  111. "&"+
  112. "timestamp=" + timestamp
  113. +
  114. "&sig=" + sig +
  115. "&respDataType=" + respDataType;
  116. }
  117. // 获取时间戳
  118. public static String getTimestamp() {
  119. return
  120. new SimpleDateFormat(
  121. "yyyyMMddHHmmss").format(
  122. new Date());
  123. }
  124. // sing签名
  125. public static String getMD5(String sid, String token, String timestamp) {
  126. StringBuilder result =
  127. new StringBuilder();
  128. String source = sid + token + timestamp;
  129. // 获取某个类的实例
  130. try {
  131. MessageDigest digest = MessageDigest.getInstance(
  132. "MD5");
  133. // 要进行加密的东西
  134. byte[] bytes = digest.digest(source.getBytes());
  135. for (
  136. byte b : bytes) {
  137. String hex = Integer.toHexString(b &
  138. 0xff);
  139. if (hex.length() ==
  140. 1) {
  141. result.append(
  142. "0" + hex);
  143. }
  144. else {
  145. result.append(hex);
  146. }
  147. }
  148. }
  149. catch (NoSuchAlgorithmException e) {
  150. // TODO Auto-generated catch block
  151. e.printStackTrace();
  152. }
  153. return result.toString();
  154. }
  155. // 创建验证码
  156. public static String smsCode() {
  157. String random = (
  158. int) ((Math.random() *
  159. 9 +
  160. 1) *
  161. 100000) +
  162. "";
  163. return random;
  164. }
  165. }
  1. 测试发送手机短信验证码 源码如下 (手机号码换成你想要发送到指定手机的手机号码即可)

    package com.message.test;

  1. public
  2. class Test {
  3. public static void main(String[] args) {
  4. String phone =
  5. "12345678910";
  6. GetMessageCode.getCode(phone);
  7. }
  8. }
  1. 常见的问题

(1)返回错误码 00104 “相同的应用当天给同一手机号发送短信的条数小于等于n” 如何处理?

答:此错误是同一手机号短信发送请求频率限制,请求失败也算次;
验证码短信下发次数限制为:1分钟2次、1小时4次、24小时内10次;
通知类短信下发次数限制为:24小时内20次;
营销类短信下发次数限制为:24小时内20次。
验证码短信24小时下发10次,不能修改
通知类短信有需要可调整下发次数
该类配置的修改需要在后台中修改设置,客户端不能设置
如果在测试时候遇到请求限制,可联系客服添加白名单

(2)返回错误码 00134 “没有和内容匹配的模板” 如何处理?

答:请检查是否在官网建立模板,smscontent=【短信签名】+内容,发送内容要与模板匹配。

(3)返回错误码 0005 “timestamp已过期” 如何处理?

答:把获取时间戳 getTimestamp()方法中的 return new SimpleDateFormat(“yyyyMMddHHmmss”).format(new Date());换成return System.currentTimeMillis()+””; 即可。

发表评论

表情:
评论列表 (有 0 条评论,156人围观)

还没有评论,来说两句吧...

相关阅读