博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
阿里云短信服务Java版
阅读量:5337 次
发布时间:2019-06-15

本文共 9412 字,大约阅读时间需要 31 分钟。

短信服务管理平台 https://dysms.console.aliyun.com/dysms.htm

java短信发送API    https://help.aliyun.com/document_detail/55284.html?spm=5176.10629532.106.1.614b1cbe9VbjhP

过程注册信息API都有

1.发送短信实现类

package com.xmg.p2p.base.service.impl;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import com.aliyuncs.DefaultAcsClient;import com.aliyuncs.IAcsClient;import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;import com.aliyuncs.http.MethodType;import com.aliyuncs.profile.DefaultProfile;import com.aliyuncs.profile.IClientProfile;import com.xmg.p2p.base.service.IPhoneService;@Servicepublic class PhoneServiceImpl implements IPhoneService {        @Value("${AccessKeyId}")    private String mYAccessKeyId;    @Value("${AccessKeySecret}")    private String mYAccessKeySecret;    @Value("${SignName}")    private String SignName;    @Value("${TemplateCode}")    private String TemplateCode;            @Override    public void sendPhone(String username,String PhoneNumbers,String code) {        try {            //2: 编写样例程序            //注:有备注无需修改的位置请勿改动。            //设置超时时间-可自行调整            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");            System.setProperty("sun.net.client.defaultReadTimeout", "10000");            //初始化ascClient需要的几个参数            final String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)            final String domain = "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)            //替换成你的AK            final String accessKeyId = mYAccessKeyId;//你的accessKeyId,参考本文档步骤2            final String accessKeySecret = mYAccessKeySecret;//你的accessKeySecret,参考本文档步骤2            //初始化ascClient,暂时不支持多region(请勿修改)            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId,            accessKeySecret);            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);            IAcsClient acsClient = new DefaultAcsClient(profile);             //组装请求对象             SendSmsRequest request = new SendSmsRequest();             //使用post提交             request.setMethod(MethodType.POST);             request.setEncoding("UTF-8");             //必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式             request.setPhoneNumbers(PhoneNumbers);             //必填:短信签名-可在短信控制台中找到             request.setSignName(SignName);             //必填:短信模板-可在短信控制台中找到             request.setTemplateCode(TemplateCode);                          //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为             //友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败             request.setTemplateParam("{\"name\":\"111\", \"code\":\""+code+"\"}");             //可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)             //request.setSmsUpExtendCode("90997");             //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者          //     request.setOutId("yourOutId");            //请求失败这里会抛ClientException异常            System.out.println("============");            try {                SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);                                System.out.println("Code:"+sendSmsResponse.getCode());                if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {                                        //请求成功                    System.out.println("请求成功");                }            } catch (Exception e) {                e.printStackTrace();            }                                } catch (Exception e) {                    }            }}

2.配置文件

#均为阿里云API注册信息AccessKeyId=***AccessKeySecret=***SignName=***TemplateCode=SMS_***

3.测试类

package com.xmg.test;import java.util.UUID;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.xmg.p2p.base.service.IMailService;import com.xmg.p2p.base.service.IPhoneService;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class SendMailTest {        @Autowired    private IPhoneService phoneService;            @Test    public void testSendPhone(){        //生成一个验证码        String verifyCode = UUID.randomUUID().toString().substring(0,4);        phoneService.sendPhone("zzz","130****6583",  verifyCode);    }}

但是采用测试类直接运行会报错

java.lang.RuntimeException: HMAC-SHA1 not supported.    at com.aliyuncs.auth.ShaHmac1.signString(ShaHmac1.java:44)    at com.aliyuncs.RpcAcsRequest.signRequest(RpcAcsRequest.java:138)    at com.aliyuncs.DefaultAcsClient.doAction(DefaultAcsClient.java:232)    at com.aliyuncs.DefaultAcsClient.doAction(DefaultAcsClient.java:175)    at com.aliyuncs.DefaultAcsClient.doAction(DefaultAcsClient.java:79)    at com.aliyuncs.DefaultAcsClient.getAcsResponse(DefaultAcsClient.java:124)    at com.xmg.p2p.base.service.impl.PhoneServiceImpl.sendPhone(PhoneServiceImpl.java:69)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)    at java.lang.reflect.Method.invoke(Unknown Source)    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)    at com.sun.proxy.$Proxy30.sendPhone(Unknown Source)    at com.xmg.test.SendMailTest.testSendPhone(SendMailTest.java:33)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)    at java.lang.reflect.Method.invoke(Unknown Source)    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:232)    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:175)    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

百度查找原因也说找不到jar包 不过工程jar包都在(不知道测试类直接运行为什么报错   望大神解释下)

然而 我在maven install把工程打成jar包时却能正常运行  并且能正常返回结果码并且正常发送短信

询问阿里云客服说是  jdk的jce.jar应包含HMAC-SHA1加密方法

通过结合百度  发现将运行环境的jdk/jre改为安装时的JRE能正常通过

将jdk中的jre替换掉能正常通过运行

转载于:https://www.cnblogs.com/jokerq/p/8601646.html

你可能感兴趣的文章
《当幸福来敲门》读后
查看>>
【转】系统无法进入睡眠模式解决办法
查看>>
省市县,循环组装,整合大数组
查看>>
stm32中字节对齐问题(__align(n),__packed用法)
查看>>
like tp
查看>>
posix多线程有感--线程高级编程(线程属性函数总结)(代码)
查看>>
DCDC(4.5V to 23V -3.3V)
查看>>
kettle导数到user_用于left join_20160928
查看>>
activity 保存数据
查看>>
typescript深copy和浅copy
查看>>
linux下的静态库与动态库详解
查看>>
hbuilder调底层运用,多张图片上传
查看>>
较快的maven的settings.xml文件
查看>>
Git之初体验 持续更新
查看>>
随手练——HDU 5015 矩阵快速幂
查看>>
Maven之setting.xml配置文件详解
查看>>
SDK目录结构
查看>>
malloc() & free()
查看>>
HDU 2063 过山车
查看>>
高精度1--加法
查看>>