Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wecloud_im_server
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
wecloud_im_server
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