Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
SiEn
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
hewei
SiEn
Commits
8f51bb00
Commit
8f51bb00
authored
Mar 08, 2021
by
giaogiao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
微信登陆相关.短信验证码
parent
25af0193
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
524 additions
and
110 deletions
+524
-110
common/pom.xml
+25
-0
common/src/main/java/com/sien/common/controller/AppSmsController.java
+10
-10
common/src/main/java/com/sien/common/controller/WechatUserController.java
+47
-0
common/src/main/java/com/sien/common/controller/WxConfigController.java
+54
-0
common/src/main/java/com/sien/common/service/AppSmsService.java
+1
-1
common/src/main/java/com/sien/common/service/impl/AppSmsServiceImpl.java
+9
-6
common/src/main/java/com/sien/common/service/impl/AppUserApiServiceImpl.java
+34
-33
common/src/main/java/com/sien/common/sms/SendSms.java
+265
-0
common/src/main/java/com/sien/common/sms/SignUtil.java
+65
-0
common/src/main/java/com/sien/common/sms/SmsUtil.java
+0
-57
config/src/main/resources/config/application-dev.yml
+10
-1
config/src/main/resources/config/application.yml
+4
-2
No files found.
common/pom.xml
View file @
8f51bb00
...
...
@@ -20,6 +20,31 @@
<groupId>
io.geekidea.springbootplus
</groupId>
<artifactId>
framework
</artifactId>
</dependency>
<!-- fastbootWeixin的核心依赖 -->
<dependency>
<groupId>
com.mxixm
</groupId>
<artifactId>
fastboot-weixin
</artifactId>
<version>
0.6.2
</version>
</dependency>
<!-- SpringBoot的web项目,必须 -->
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-web
</artifactId>
</dependency>
<!-- 暂时只能使用apache的http,后续可加入其它http支持 -->
<dependency>
<groupId>
org.apache.httpcomponents
</groupId>
<artifactId>
httpcore
</artifactId>
</dependency>
<dependency>
<groupId>
org.apache.httpcomponents
</groupId>
<artifactId>
httpclient
</artifactId>
</dependency>
<!-- 友盟 start -->
<dependency>
...
...
common/src/main/java/com/sien/common/controller/AppSmsController.java
View file @
8f51bb00
...
...
@@ -40,16 +40,16 @@ public class AppSmsController extends BaseController {
return
appSmsService
.
registerOrLoginCode
(
phoneArea
,
phone
);
}
//
/**
//
* 获取修改手机号的验证码
//
*/
//
@GetMapping("/updatePhoneCode")
//
@OperationLog(name = "获取修改手机号的验证码", type = OperationLogType.INFO)
//
@ApiOperation(value = "获取修改手机号的验证码", response = Object.class, notes = "本地环境默认666666")
//
public ApiResult<Object> updatePhoneCode() throws Exception {
//
//
return appSmsService.updatePhoneCode();
//
}
/**
* 获取修改手机号的验证码
*/
@GetMapping
(
"/updatePhoneCode"
)
@OperationLog
(
name
=
"获取修改手机号的验证码"
,
type
=
OperationLogType
.
INFO
)
@ApiOperation
(
value
=
"获取修改手机号的验证码"
,
response
=
Object
.
class
,
notes
=
"本地环境默认666666"
)
public
ApiResult
<
Object
>
updatePhoneCode
()
throws
Exception
{
return
appSmsService
.
updatePhoneCode
();
}
}
common/src/main/java/com/sien/common/controller/WechatUserController.java
0 → 100644
View file @
8f51bb00
package
com
.
sien
.
common
.
controller
;
import
com.sien.common.service.AppUserService
;
import
com.sien.common.vo.AppUserQueryVo
;
import
io.geekidea.springbootplus.framework.common.api.ApiResult
;
import
io.geekidea.springbootplus.framework.common.controller.BaseController
;
import
io.geekidea.springbootplus.framework.log.annotation.Module
;
import
io.geekidea.springbootplus.framework.log.annotation.OperationLog
;
import
io.geekidea.springbootplus.framework.log.enums.OperationLogType
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
/**
* APP用户 控制器
*
* @author wei
* @since 2020-09-23
*/
@Slf4j
@RestController
@Module
(
"api-app"
)
@Api
(
value
=
"微信登陆相关"
,
tags
=
{
"微信登陆相关"
})
@RequestMapping
(
"/wechatUser"
)
public
class
WechatUserController
extends
BaseController
{
@Autowired
private
AppUserService
appUserService
;
/**
* 根据微信重定向code查询用户是否绑定
*/
@GetMapping
(
"/check/"
)
@OperationLog
(
name
=
"根据微信重定向code查询用户是否绑定"
,
type
=
OperationLogType
.
INFO
)
@ApiOperation
(
value
=
"根据微信重定向code查询用户是否绑定"
,
response
=
AppUserQueryVo
.
class
)
public
ApiResult
<
AppUserQueryVo
>
getAppUser
()
throws
Exception
{
AppUserQueryVo
appUserQueryVo
=
appUserService
.
getMyInfo
();
return
ApiResult
.
ok
(
appUserQueryVo
);
}
}
common/src/main/java/com/sien/common/controller/WxConfigController.java
0 → 100644
View file @
8f51bb00
package
com
.
sien
.
common
.
controller
;
import
com.sien.common.sms.SignUtil
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
/**
*微信服务器配置 验证api
*/
@Slf4j
@RestController
@RequestMapping
(
"/wxapi"
)
public
class
WxConfigController
{
/**
* @return
* @description 微信公众号服务器配置校验token
* @author: liyinlong
* @date 2019-05-09 9:38
*/
@ApiOperation
(
"微信公众号服务器配置校验token"
)
@RequestMapping
(
"/checkToken"
)
public
void
checkToken
(
HttpServletRequest
request
,
HttpServletResponse
response
)
{
//token验证代码段
try
{
log
.
info
(
"请求已到达,开始校验token"
);
if
(
StringUtils
.
isNotBlank
(
request
.
getParameter
(
"signature"
)))
{
String
signature
=
request
.
getParameter
(
"signature"
);
String
timestamp
=
request
.
getParameter
(
"timestamp"
);
String
nonce
=
request
.
getParameter
(
"nonce"
);
String
echostr
=
request
.
getParameter
(
"echostr"
);
log
.
info
(
"signature[{}], timestamp[{}], nonce[{}], echostr[{}]"
,
signature
,
timestamp
,
nonce
,
echostr
);
if
(
SignUtil
.
checkSignature
(
signature
,
timestamp
,
nonce
))
{
log
.
info
(
"数据源为微信后台,将echostr[{}]返回!"
,
echostr
);
response
.
getOutputStream
().
println
(
echostr
);
}
}
}
catch
(
IOException
e
)
{
log
.
error
(
"校验出错"
);
e
.
printStackTrace
();
}
}
}
\ No newline at end of file
common/src/main/java/com/sien/common/service/AppSmsService.java
View file @
8f51bb00
...
...
@@ -12,7 +12,7 @@ public interface AppSmsService {
* 获取注册验证码
*/
ApiResult
<
Object
>
registerOrLoginCode
(
String
phoneArea
,
String
phone
);
//
ApiResult<Object> updatePhoneCode() throws Exception;
ApiResult
<
Object
>
updatePhoneCode
()
throws
Exception
;
/**
* 获取注册验证码
...
...
common/src/main/java/com/sien/common/service/impl/AppSmsServiceImpl.java
View file @
8f51bb00
...
...
@@ -3,9 +3,12 @@ package com.sien.common.service.impl;
import
cn.hutool.core.util.RandomUtil
;
import
com.sien.common.service.AppSmsService
;
import
com.sien.common.service.AppUserService
;
import
com.sien.common.vo.AppUserQueryVo
;
import
com.sien.common.vo.SmsCode
;
import
io.geekidea.springbootplus.framework.common.api.ApiResult
;
import
io.geekidea.springbootplus.framework.shiro.jwt.JwtToken
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.shiro.SecurityUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.data.redis.core.RedisTemplate
;
...
...
@@ -71,12 +74,12 @@ public class AppSmsServiceImpl implements AppSmsService {
return
getSmsCodeApiResult
(
String
.
format
(
SMS_REGIEST
,
area
,
number
),
area
,
number
);
}
//
@Override
//
public ApiResult<Object> updatePhoneCode() throws Exception {
//
JwtToken jwtToken = (JwtToken) SecurityUtils.getSubject().getPrincipal();
//
AppUserQueryVo appUserById = appUserService.getAppUserById(jwtToken.getUserId());
//
return getSmsCodeApiResult(String.format(SMS_UPDATE, appUserById.getPhoneArea(), appUserById.getPhone()), appUserById.getPhoneArea(), appUserById.getPhone());
//
}
@Override
public
ApiResult
<
Object
>
updatePhoneCode
()
throws
Exception
{
JwtToken
jwtToken
=
(
JwtToken
)
SecurityUtils
.
getSubject
().
getPrincipal
();
AppUserQueryVo
appUserById
=
appUserService
.
getAppUserById
(
jwtToken
.
getUserId
());
return
getSmsCodeApiResult
(
String
.
format
(
SMS_UPDATE
,
appUserById
.
getPhoneArea
(),
appUserById
.
getPhone
()),
appUserById
.
getPhoneArea
(),
appUserById
.
getPhone
());
}
/**
* 获取短信验证码
...
...
common/src/main/java/com/sien/common/service/impl/AppUserApiServiceImpl.java
View file @
8f51bb00
...
...
@@ -2,13 +2,14 @@ package com.sien.common.service.impl;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.sien.common.service.AppSmsService
;
import
com.sien.common.service.AppUserApiService
;
import
com.sien.common.entity.AppUser
;
import
com.sien.common.param.app.AppSmsRegisterParam
;
import
com.sien.common.param.app.AppUserInfoParam
;
import
com.sien.common.service.AppSmsService
;
import
com.sien.common.service.AppUserApiService
;
import
com.sien.common.service.AppUserService
;
import
com.sien.common.vo.AppUserQueryVo
;
import
com.sien.common.vo.app.LoginAppUserTokenVo
;
import
com.sien.common.entity.AppUser
;
import
io.geekidea.springbootplus.framework.common.api.ApiCode
;
import
io.geekidea.springbootplus.framework.common.api.ApiResult
;
import
io.geekidea.springbootplus.framework.shiro.jwt.JwtToken
;
...
...
@@ -31,36 +32,36 @@ public class AppUserApiServiceImpl implements AppUserApiService {
@Override
public
ApiResult
<
Boolean
>
updatePhone
(
String
phoneArea
,
String
phone
,
String
code
)
throws
Exception
{
//
JwtToken jwtToken = (JwtToken) SecurityUtils.getSubject().getPrincipal();
//
//
AppUserQueryVo appUserById = appUserService.getAppUserById(jwtToken.getUserId());
//
//
// 校验验证码
//
boolean equalsRegisterCode = appSmsService.equalsUpdatePhoneCode(appUserById.getPhoneArea(), appUserById.getPhone(), code);
//
if (!equalsRegisterCode) {
//
return ApiResult.fail(ApiCode.SMS_CODE_ERROR);
//
}
//
// 删除已使用的验证码
//
appSmsService.deleteUpdatePhoneCode(appUserById.getPhoneArea(), appUserById.getPhone());
//
//
// 判断手机号是否已经注册
//
AppUser one = appUserService.getOne(new QueryWrapper<AppUser>().lambda()
//
.eq(AppUser::getPhoneArea, phoneArea)
//
.eq(AppUser::getPhone, phone));
//
if (one != null) {
//
return ApiResult.fail(ApiCode.BUSINESS_EXCEPTION);
//
}
//
//
//
AppUser appUser = new AppUser();
//
appUser.setPhoneArea(phoneArea);
//
appUser.setPhone(phone);
//
appUser.setId(jwtToken.getUserId());
//
//
boolean b = appUserService.updateById(appUser);
//
if (b) {
//
return ApiResult.ok();
//
}
JwtToken
jwtToken
=
(
JwtToken
)
SecurityUtils
.
getSubject
().
getPrincipal
();
AppUserQueryVo
appUserById
=
appUserService
.
getAppUserById
(
jwtToken
.
getUserId
());
// 校验验证码
boolean
equalsRegisterCode
=
appSmsService
.
equalsUpdatePhoneCode
(
appUserById
.
getPhoneArea
(),
appUserById
.
getPhone
(),
code
);
if
(!
equalsRegisterCode
)
{
return
ApiResult
.
fail
(
ApiCode
.
SMS_CODE_ERROR
);
}
// 删除已使用的验证码
appSmsService
.
deleteUpdatePhoneCode
(
appUserById
.
getPhoneArea
(),
appUserById
.
getPhone
());
// 判断手机号是否已经注册
AppUser
one
=
appUserService
.
getOne
(
new
QueryWrapper
<
AppUser
>().
lambda
()
.
eq
(
AppUser:
:
getPhoneArea
,
phoneArea
)
.
eq
(
AppUser:
:
getPhone
,
phone
));
if
(
one
!=
null
)
{
return
ApiResult
.
fail
(
ApiCode
.
BUSINESS_EXCEPTION
);
}
AppUser
appUser
=
new
AppUser
();
appUser
.
setPhoneArea
(
phoneArea
);
appUser
.
setPhone
(
phone
);
appUser
.
setId
(
jwtToken
.
getUserId
());
boolean
b
=
appUserService
.
updateById
(
appUser
);
if
(
b
)
{
return
ApiResult
.
ok
();
}
return
ApiResult
.
fail
();
}
...
...
common/src/main/java/com/sien/common/sms/SendSms.java
0 → 100644
View file @
8f51bb00
package
com
.
sien
.
common
.
sms
;
import
javax.net.ssl.HostnameVerifier
;
import
javax.net.ssl.HttpsURLConnection
;
import
javax.net.ssl.SSLContext
;
import
javax.net.ssl.SSLSession
;
import
javax.net.ssl.TrustManager
;
import
javax.net.ssl.X509TrustManager
;
import
java.io.BufferedReader
;
import
java.io.InputStream
;
import
java.io.InputStreamReader
;
import
java.io.OutputStreamWriter
;
import
java.io.UnsupportedEncodingException
;
import
java.io.Writer
;
import
java.net.URL
;
import
java.net.URLEncoder
;
import
java.security.MessageDigest
;
import
java.security.NoSuchAlgorithmException
;
import
java.security.cert.CertificateException
;
import
java.security.cert.X509Certificate
;
import
java.text.SimpleDateFormat
;
import
java.util.Base64
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.UUID
;
//如果JDK版本是1.8,可使用原生Base64类
//如果JDK版本低于1.8,请使用三方库提供Base64类
//import org.apache.commons.codec.binary.Base64;
public
class
SendSms
{
//无需修改,用于格式化鉴权头域,给"X-WSSE"参数赋值
private
static
final
String
WSSE_HEADER_FORMAT
=
"UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\""
;
//无需修改,用于格式化鉴权头域,给"Authorization"参数赋值
private
static
final
String
AUTH_HEADER_VALUE
=
"WSSE realm=\"SDP\",profile=\"UsernameToken\",type=\"Appkey\""
;
public
static
void
main
(
String
[]
args
)
throws
Exception
{
String
ramdom
=
"369751"
;
send
(
"+8617621701106"
,
ramdom
);
}
private
static
void
send
(
String
receiver
,
String
ramdom
)
throws
Exception
{
//必填,请参考"开发准备"获取如下数据,替换为实际值
String
url
=
"https://rtcsms.cn-north-1.myhuaweicloud.com:10743/sms/batchSendSms/v1"
;
//APP接入地址+接口访问URI
String
appKey
=
"FKFPgk3X6VRYAMJ9r9CIJWG2709W"
;
//APP_Key
String
appSecret
=
"gvS2S8nD01vKCA1v45qi379gu1T5"
;
//APP_Secret
String
sender
=
"8821030205711"
;
//国内短信签名通道号或国际/港澳台短信通道号
String
templateId
=
"b55b51e3871947cebc65ca716e2e43a0"
;
//模板ID
//条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称
//国际/港澳台短信不用关注该参数
String
signature
=
"四恩慈善会"
;
//签名名称
//必填,全局号码格式(包含国家码),示例:+8615123456789,多个号码之间用英文逗号分隔
// String receiver = "+8615123456789,+8615234567890"; //短信接收人号码
// String receiver = "+8617621701106"; //短信接收人号码
//选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告
String
statusCallBack
=
""
;
/**
* 选填,使用无变量模板时请赋空值 String templateParas = "";
* 单变量模板示例:模板内容为"您的验证码是${1}"时,templateParas可填写为"[\"369751\"]"
* 双变量模板示例:模板内容为"您有${1}件快递请到${2}领取"时,templateParas可填写为"[\"3\",\"人民公园正门\"]"
* 模板中的每个变量都必须赋值,且取值不能为空
* 查看更多模板和变量规范:产品介绍>模板和变量规范
*/
String
templateParas
=
"[\""
+
ramdom
+
"\"]"
;
//模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。
//请求Body,不携带签名名称时,signature请填null
String
body
=
buildRequestBody
(
sender
,
receiver
,
templateId
,
templateParas
,
statusCallBack
,
signature
);
if
(
null
==
body
||
body
.
isEmpty
())
{
System
.
out
.
println
(
"body is null."
);
return
;
}
//请求Headers中的X-WSSE参数值
String
wsseHeader
=
buildWsseHeader
(
appKey
,
appSecret
);
if
(
null
==
wsseHeader
||
wsseHeader
.
isEmpty
())
{
System
.
out
.
println
(
"wsse header is null."
);
return
;
}
Writer
out
=
null
;
BufferedReader
in
=
null
;
StringBuffer
result
=
new
StringBuffer
();
HttpsURLConnection
connection
=
null
;
InputStream
is
=
null
;
HostnameVerifier
hv
=
new
HostnameVerifier
()
{
@Override
public
boolean
verify
(
String
hostname
,
SSLSession
session
)
{
return
true
;
}
};
trustAllHttpsCertificates
();
try
{
URL
realUrl
=
new
URL
(
url
);
connection
=
(
HttpsURLConnection
)
realUrl
.
openConnection
();
connection
.
setHostnameVerifier
(
hv
);
connection
.
setDoOutput
(
true
);
connection
.
setDoInput
(
true
);
connection
.
setUseCaches
(
true
);
//请求方法
connection
.
setRequestMethod
(
"POST"
);
//请求Headers参数
connection
.
setRequestProperty
(
"Content-Type"
,
"application/x-www-form-urlencoded"
);
connection
.
setRequestProperty
(
"Authorization"
,
AUTH_HEADER_VALUE
);
connection
.
setRequestProperty
(
"X-WSSE"
,
wsseHeader
);
connection
.
connect
();
out
=
new
OutputStreamWriter
(
connection
.
getOutputStream
());
out
.
write
(
body
);
//发送请求Body参数
out
.
flush
();
out
.
close
();
int
status
=
connection
.
getResponseCode
();
if
(
200
==
status
)
{
//200
is
=
connection
.
getInputStream
();
}
else
{
//400/401
is
=
connection
.
getErrorStream
();
}
in
=
new
BufferedReader
(
new
InputStreamReader
(
is
,
"UTF-8"
));
String
line
=
""
;
while
((
line
=
in
.
readLine
())
!=
null
)
{
result
.
append
(
line
);
}
System
.
out
.
println
(
result
.
toString
());
//打印响应消息实体
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
finally
{
try
{
if
(
null
!=
out
)
{
out
.
close
();
}
if
(
null
!=
is
)
{
is
.
close
();
}
if
(
null
!=
in
)
{
in
.
close
();
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
}
/**
* 构造请求Body体
*
* @param sender
* @param receiver
* @param templateId
* @param templateParas
* @param statusCallBack
* @param signature | 签名名称,使用国内短信通用模板时填写
* @return
*/
static
String
buildRequestBody
(
String
sender
,
String
receiver
,
String
templateId
,
String
templateParas
,
String
statusCallBack
,
String
signature
)
{
if
(
null
==
sender
||
null
==
receiver
||
null
==
templateId
||
sender
.
isEmpty
()
||
receiver
.
isEmpty
()
||
templateId
.
isEmpty
())
{
System
.
out
.
println
(
"buildRequestBody(): sender, receiver or templateId is null."
);
return
null
;
}
Map
<
String
,
String
>
map
=
new
HashMap
<
String
,
String
>();
map
.
put
(
"from"
,
sender
);
map
.
put
(
"to"
,
receiver
);
map
.
put
(
"templateId"
,
templateId
);
if
(
null
!=
templateParas
&&
!
templateParas
.
isEmpty
())
{
map
.
put
(
"templateParas"
,
templateParas
);
}
if
(
null
!=
statusCallBack
&&
!
statusCallBack
.
isEmpty
())
{
map
.
put
(
"statusCallback"
,
statusCallBack
);
}
if
(
null
!=
signature
&&
!
signature
.
isEmpty
())
{
map
.
put
(
"signature"
,
signature
);
}
StringBuilder
sb
=
new
StringBuilder
();
String
temp
=
""
;
for
(
String
s
:
map
.
keySet
())
{
try
{
temp
=
URLEncoder
.
encode
(
map
.
get
(
s
),
"UTF-8"
);
}
catch
(
UnsupportedEncodingException
e
)
{
e
.
printStackTrace
();
}
sb
.
append
(
s
).
append
(
"="
).
append
(
temp
).
append
(
"&"
);
}
return
sb
.
deleteCharAt
(
sb
.
length
()
-
1
).
toString
();
}
/**
* 构造X-WSSE参数值
*
* @param appKey
* @param appSecret
* @return
*/
static
String
buildWsseHeader
(
String
appKey
,
String
appSecret
)
{
if
(
null
==
appKey
||
null
==
appSecret
||
appKey
.
isEmpty
()
||
appSecret
.
isEmpty
())
{
System
.
out
.
println
(
"buildWsseHeader(): appKey or appSecret is null."
);
return
null
;
}
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyyy-MM-dd'T'HH:mm:ss'Z'"
);
String
time
=
sdf
.
format
(
new
Date
());
//Created
String
nonce
=
UUID
.
randomUUID
().
toString
().
replace
(
"-"
,
""
);
//Nonce
MessageDigest
md
;
byte
[]
passwordDigest
=
null
;
try
{
md
=
MessageDigest
.
getInstance
(
"SHA-256"
);
md
.
update
((
nonce
+
time
+
appSecret
).
getBytes
());
passwordDigest
=
md
.
digest
();
}
catch
(
NoSuchAlgorithmException
e
)
{
e
.
printStackTrace
();
}
//如果JDK版本是1.8,请加载原生Base64类,并使用如下代码
String
passwordDigestBase64Str
=
Base64
.
getEncoder
().
encodeToString
(
passwordDigest
);
//PasswordDigest
//如果JDK版本低于1.8,请加载三方库提供Base64类,并使用如下代码
//String passwordDigestBase64Str = Base64.encodeBase64String(passwordDigest); //PasswordDigest
//若passwordDigestBase64Str中包含换行符,请执行如下代码进行修正
//passwordDigestBase64Str = passwordDigestBase64Str.replaceAll("[\\s*\t\n\r]", "");
return
String
.
format
(
WSSE_HEADER_FORMAT
,
appKey
,
passwordDigestBase64Str
,
nonce
,
time
);
}
/**
* @throws Exception
*/
static
void
trustAllHttpsCertificates
()
throws
Exception
{
TrustManager
[]
trustAllCerts
=
new
TrustManager
[]{
new
X509TrustManager
()
{
public
void
checkClientTrusted
(
X509Certificate
[]
chain
,
String
authType
)
throws
CertificateException
{
return
;
}
public
void
checkServerTrusted
(
X509Certificate
[]
chain
,
String
authType
)
throws
CertificateException
{
return
;
}
public
X509Certificate
[]
getAcceptedIssuers
()
{
return
null
;
}
}
};
SSLContext
sc
=
SSLContext
.
getInstance
(
"SSL"
);
sc
.
init
(
null
,
trustAllCerts
,
null
);
HttpsURLConnection
.
setDefaultSSLSocketFactory
(
sc
.
getSocketFactory
());
}
}
common/src/main/java/com/sien/common/sms/SignUtil.java
0 → 100644
View file @
8f51bb00
package
com
.
sien
.
common
.
sms
;
import
java.security.MessageDigest
;
import
java.security.NoSuchAlgorithmException
;
import
java.util.Arrays
;
public
class
SignUtil
{
private
static
String
token
=
"sDsdaSDADad"
;
/**
* 校验签名
* @param signature 签名
* @param timestamp 时间戳
* @param nonce 随机数
* @return 布尔值
*/
public
static
boolean
checkSignature
(
String
signature
,
String
timestamp
,
String
nonce
){
String
checktext
=
null
;
if
(
null
!=
signature
)
{
//对ToKen,timestamp,nonce 按字典排序
String
[]
paramArr
=
new
String
[]{
token
,
timestamp
,
nonce
};
Arrays
.
sort
(
paramArr
);
//将排序后的结果拼成一个字符串
String
content
=
paramArr
[
0
].
concat
(
paramArr
[
1
]).
concat
(
paramArr
[
2
]);
try
{
MessageDigest
md
=
MessageDigest
.
getInstance
(
"SHA-1"
);
//对接后的字符串进行sha1加密
byte
[]
digest
=
md
.
digest
(
content
.
toString
().
getBytes
());
checktext
=
byteToStr
(
digest
);
}
catch
(
NoSuchAlgorithmException
e
){
e
.
printStackTrace
();
}
}
//将加密后的字符串与signature进行对比
return
checktext
!=
null
?
checktext
.
equals
(
signature
.
toUpperCase
())
:
false
;
}
/**
* 将字节数组转化我16进制字符串
* @param byteArrays 字符数组
* @return 字符串
*/
private
static
String
byteToStr
(
byte
[]
byteArrays
){
String
str
=
""
;
for
(
int
i
=
0
;
i
<
byteArrays
.
length
;
i
++)
{
str
+=
byteToHexStr
(
byteArrays
[
i
]);
}
return
str
;
}
/**
* 将字节转化为十六进制字符串
* @param myByte 字节
* @return 字符串
*/
private
static
String
byteToHexStr
(
byte
myByte
)
{
char
[]
Digit
=
{
'0'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
,
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'F'
};
char
[]
tampArr
=
new
char
[
2
];
tampArr
[
0
]
=
Digit
[(
myByte
>>>
4
)
&
0X0F
];
tampArr
[
1
]
=
Digit
[
myByte
&
0X0F
];
String
str
=
new
String
(
tampArr
);
return
str
;
}
}
common/src/main/java/com/sien/common/sms/SmsUtil.java
deleted
100644 → 0
View file @
25af0193
package
com
.
sien
.
common
.
sms
;
import
cn.wecloud.sdk.common.exception.WeCloudApiException
;
import
cn.wecloud.sdk.sms.client.WeCloudSmsClient
;
import
cn.wecloud.sdk.sms.data.WeCloudSmsSingleSendResult
;
import
cn.wecloud.sdk.sms.model.WeCloudSmsAbroadModel
;
import
cn.wecloud.sdk.sms.request.WeCloudSmsDomesticSingleSendRequest
;
import
cn.wecloud.sdk.sms.response.WeCloudSmsDomesticSingleSendResponse
;
//@Slf4j
public
class
SmsUtil
{
public
static
void
main
(
String
[]
args
)
throws
WeCloudApiException
{
// 创建连接对象
final
WeCloudSmsClient
client
=
new
WeCloudSmsClient
(
"9XPgCY9rAb1GG2yg"
);
// 创建请求信息对象
final
WeCloudSmsAbroadModel
model
=
new
WeCloudSmsAbroadModel
(
"855"
,
"081612642"
,
"1323474417736716290"
,
"888888"
);
// 创建请求对象
final
WeCloudSmsDomesticSingleSendRequest
request
=
new
WeCloudSmsDomesticSingleSendRequest
(
model
);
// 执行请求
final
WeCloudSmsDomesticSingleSendResponse
execute
=
client
.
execute
(
request
);
// 判断是否请求成功
if
(
execute
.
isSuccess
())
{
// 获取返回业务对象
final
WeCloudSmsSingleSendResult
result
=
execute
.
getData
();
}
else
{
// 输出请求失败信息
// log.error(execute.getMsg());
}
}
public
static
void
send
(
String
areaCode
,
String
phone
,
String
verificationCode
)
throws
WeCloudApiException
{
// 创建连接对象
final
WeCloudSmsClient
client
=
new
WeCloudSmsClient
(
"9XPgCY9rAb1GG2yg"
);
// 创建请求信息对象
String
templateId
=
"1323474417736716290"
;
final
WeCloudSmsAbroadModel
model
=
new
WeCloudSmsAbroadModel
(
areaCode
,
phone
,
templateId
,
verificationCode
);
// 创建请求对象
final
WeCloudSmsDomesticSingleSendRequest
request
=
new
WeCloudSmsDomesticSingleSendRequest
(
model
);
// 执行请求
final
WeCloudSmsDomesticSingleSendResponse
execute
=
client
.
execute
(
request
);
// 判断是否请求成功
if
(
execute
.
isSuccess
())
{
// 获取返回业务对象
final
WeCloudSmsSingleSendResult
result
=
execute
.
getData
();
}
else
{
// 输出请求失败信息
// log.error(execute.getMsg());
}
}
}
config/src/main/resources/config/application-dev.yml
View file @
8f51bb00
...
...
@@ -12,9 +12,18 @@ spring-boot-plus:
request-log-format
:
false
response-log-format
:
false
wx
:
token
:
sDsdaSDADad
# 测试号的appid,测试号管理界面有
appid
:
wx7aac805012428dc5
# 测试号的appsecret,测试号管理界面有
appsecret
:
# =服务调用的url地址,用于微信web的oauth2授权回调等,若没有可为空。
callback-url
:
wx7aac805012428dc5
spring
:
datasource
:
url
:
jdbc:mysql://47.99.47.225:3306/
SiE
n?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
url
:
jdbc:mysql://47.99.47.225:3306/
sie
n?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
username
:
root
password
:
temple123456
...
...
config/src/main/resources/config/application.yml
View file @
8f51bb00
...
...
@@ -2,7 +2,7 @@
############################# 访问路径、端口tomcat start #############################
server
:
port
:
8
889
port
:
8
0
servlet
:
context-path
:
/api
tomcat
:
...
...
@@ -185,6 +185,8 @@ spring-boot-plus:
# 排除登录 注册 登出
-
/user/registerOrLogin,/user/login
-
/sms/registerOrLoginCode
-
/wechatUser/check
-
/wxapi/checkToken
# 排除静态资源
-
/static/**,/templates/**
# 排除Swagger
...
...
@@ -303,7 +305,7 @@ spring-boot-plus:
enable
:
true
base
:
# 扫描的包,多个包使用逗号隔开
package
:
io.geekidea.springbootplus,com.sien
package
:
io.geekidea.springbootplus,com.sien
.com.sien.common
contact
:
email
:
sien
name
:
sien
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment