AliyunService.java 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package com.llisoft.sms.service;
  2. import java.util.Objects;
  3. import javax.annotation.PostConstruct;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.beans.factory.annotation.Value;
  7. import org.springframework.scheduling.annotation.Async;
  8. import org.springframework.stereotype.Service;
  9. import com.aliyuncs.CommonRequest;
  10. import com.aliyuncs.CommonResponse;
  11. import com.aliyuncs.DefaultAcsClient;
  12. import com.aliyuncs.IAcsClient;
  13. import com.aliyuncs.afs.model.v20180112.AuthenticateSigRequest;
  14. import com.aliyuncs.afs.model.v20180112.AuthenticateSigResponse;
  15. import com.aliyuncs.exceptions.ClientException;
  16. import com.aliyuncs.http.MethodType;
  17. import com.aliyuncs.profile.DefaultProfile;
  18. import com.llisoft.sms.util.JsonUtil;
  19. /**
  20. * 阿里云SMS接口调用
  21. * https://help.aliyun.com/document_detail/101414.html
  22. * https://api.aliyun.com/?product=Dysmsapi&lang=JAVA#/
  23. * @author YangJie [2019年2月18日]
  24. */
  25. @Service
  26. public class AliyunService {
  27. private Logger logger = LoggerFactory.getLogger(AliyunService.class);
  28. @Value("${sms.accessKeyId}")
  29. private String accessKeyId;
  30. @Value("${sms.accessKeySecret}")
  31. private String accessKeySecret;
  32. // API客户端
  33. private IAcsClient smsClient;
  34. private IAcsClient afsClient;
  35. @PostConstruct
  36. public void init() { // 初始化
  37. smsClient = new DefaultAcsClient(DefaultProfile.getProfile("default", accessKeyId, accessKeySecret));
  38. String regionId = "cn-hangzhou"; // 验证码官方文档写死
  39. DefaultProfile.addEndpoint(regionId, "afs", "afs.aliyuncs.com");
  40. afsClient = new DefaultAcsClient(DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret));
  41. }
  42. /**
  43. * 发送短信
  44. * @param phone
  45. * @param code
  46. * @param type 类型(0麦塔、1青谷)
  47. */
  48. @Async
  49. public void sms(String sign, String phone, String code) {
  50. logger.info("阿里云发送验证码: {} : {}", phone, code);
  51. CommonRequest request = new CommonRequest();
  52. // request.setSysProtocol(ProtocolType.HTTPS);
  53. request.setSysMethod(MethodType.POST);
  54. request.setSysAction("SendSms");
  55. request.setSysDomain("dysmsapi.aliyuncs.com");
  56. request.setSysVersion("2017-05-25"); // 固定字符串
  57. request.putQueryParameter("PhoneNumbers", phone);
  58. request.putQueryParameter("SignName", sign); // 签名
  59. request.putQueryParameter("TemplateCode", "SMS_216836530"); // 模板ID
  60. request.putQueryParameter("TemplateParam", "{\"code\":\""+code+"\"}");
  61. try {
  62. CommonResponse response = smsClient.getCommonResponse(request);
  63. logger.info("阿里云短信API返回: {}", JsonUtil.toJson(response));
  64. } catch (Exception e) {
  65. logger.error("阿里云短信API异常", e);
  66. }
  67. }
  68. /**
  69. * 验证码
  70. * @param sessionId
  71. * @param sig
  72. * @param token
  73. * @param ip
  74. * @return
  75. * @throws ClientException
  76. */
  77. public boolean afs(String appkey, String scene, String token, String sessionId, String sig, String ip) {
  78. AuthenticateSigRequest request = new AuthenticateSigRequest();
  79. request.setAppKey(appkey);// 应用类型标识。必填参数,后端填写。
  80. request.setScene(scene);// 场景标识。必填参数,后端填写。
  81. request.setToken(token);// 请求唯一标识。必填参数,从前端获取,不可更改。
  82. request.setSessionId(sessionId);// 会话ID。必填参数,从前端获取,不可更改,android和ios只传这个参数即可
  83. request.setSig(sig);// 签名串。必填参数,从前端获取,不可更改。
  84. request.setRemoteIp(ip);// 客户端IP。必填参数,后端填写。
  85. try { // response的code枚举:100验签通过,900验签失败
  86. AuthenticateSigResponse response = afsClient.getAcsResponse(request);
  87. logger.info("阿里云验证码API返回: {}", JsonUtil.toJson(response));
  88. return Objects.nonNull(response) && response.getCode()==100;
  89. } catch (Exception e) {
  90. logger.error("阿里云验证码API异常", e);
  91. }
  92. return false;
  93. }
  94. }