Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
cms
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
iuav
cms
Commits
06fd41aa
提交
06fd41aa
authored
5月 23, 2023
作者:
zhenjie
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
微信相关接口
上级
38960d02
隐藏空白字符变更
内嵌
并排
正在显示
14 个修改的文件
包含
474 行增加
和
31 行删除
+474
-31
AppletMsgVO.java
...src/main/java/com/mmc/iuav/user/model/vo/AppletMsgVO.java
+37
-0
MsgData.java
...del/src/main/java/com/mmc/iuav/user/model/vo/MsgData.java
+21
-0
WxMsgVO.java
...del/src/main/java/com/mmc/iuav/user/model/vo/WxMsgVO.java
+85
-0
ResultEnum.java
...-util/src/main/java/com/mmc/iuav/response/ResultEnum.java
+4
-0
pom.xml
csm-service/cms-service-user/pom.xml
+7
-0
WxConstant.java
.../src/main/java/com/mmc/iuav/user/constant/WxConstant.java
+5
-0
WxController.java
.../main/java/com/mmc/iuav/user/controller/WxController.java
+42
-10
WxService.java
...er/src/main/java/com/mmc/iuav/user/service/WxService.java
+12
-8
WxServiceImpl.java
...in/java/com/mmc/iuav/user/service/impl/WxServiceImpl.java
+145
-11
WxApiUtil.java
...-user/src/main/java/com/mmc/iuav/user/util/WxApiUtil.java
+94
-0
application-dev.yml
...e/cms-service-user/src/main/resources/application-dev.yml
+5
-0
application-local.yml
...cms-service-user/src/main/resources/application-local.yml
+5
-0
application-prod.yml
.../cms-service-user/src/main/resources/application-prod.yml
+7
-2
pom.xml
pom.xml
+5
-0
没有找到文件。
cms-common/cms-common-model/src/main/java/com/mmc/iuav/user/model/vo/AppletMsgVO.java
0 → 100644
浏览文件 @
06fd41aa
package
com
.
mmc
.
iuav
.
user
.
model
.
vo
;
import
com.alibaba.fastjson2.JSONObject
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
javax.validation.constraints.NotBlank
;
import
java.io.Serializable
;
/**
* @author: zj
* @Date: 2023/5/23 17:18
*/
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public
class
AppletMsgVO
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
8496071009977568319L
;
@ApiModelProperty
(
value
=
"openid"
)
@NotBlank
private
String
touser
;
@ApiModelProperty
(
value
=
"模板ID"
)
@NotBlank
private
String
template_id
;
@ApiModelProperty
(
value
=
"点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。"
)
private
String
page
;
@ApiModelProperty
(
value
=
"模板内容"
)
private
JSONObject
data
;
@ApiModelProperty
(
value
=
"跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版"
)
private
String
miniprogram_state
;
@ApiModelProperty
(
value
=
"默认为zh_CN"
)
private
String
lang
;
}
cms-common/cms-common-model/src/main/java/com/mmc/iuav/user/model/vo/MsgData.java
0 → 100644
浏览文件 @
06fd41aa
package
com
.
mmc
.
iuav
.
user
.
model
.
vo
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serializable
;
/**
* @author: zj
* @Date: 2023/5/23 19:25
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
MsgData
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1479503488297727536L
;
private
String
value
;
private
String
color
=
"#173177"
;
// 字体颜色
}
\ No newline at end of file
cms-common/cms-common-model/src/main/java/com/mmc/iuav/user/model/vo/WxMsgVO.java
0 → 100644
浏览文件 @
06fd41aa
package
com
.
mmc
.
iuav
.
user
.
model
.
vo
;
import
com.alibaba.fastjson2.JSONObject
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
org.apache.commons.lang.StringUtils
;
import
org.springframework.util.CollectionUtils
;
import
javax.validation.constraints.NotNull
;
import
java.io.Serializable
;
import
java.util.List
;
/**
* @author: zj
* @Date: 2023/5/23 19:24
*/
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public
class
WxMsgVO
implements
Serializable
{
private
static
final
long
serialVersionUID
=
107288179600606045L
;
@ApiModelProperty
(
value
=
"用户id-仅适用云享飞客户端"
)
private
Integer
userAccountId
;
@ApiModelProperty
(
value
=
"公众号的openId"
)
private
String
openId
;
@ApiModelProperty
(
value
=
"unionId-全局通用"
)
private
String
unionId
;
@ApiModelProperty
(
value
=
"模板id"
)
@NotNull
(
message
=
"模板id不能为空"
)
private
String
templemteId
;
@ApiModelProperty
(
value
=
"网页跳转连接"
)
private
String
url
;
@ApiModelProperty
(
value
=
"小程序APPID"
)
private
String
wxAppltAppId
;
@ApiModelProperty
(
value
=
"小程序跳转连接"
)
private
String
appletPath
;
@ApiModelProperty
(
value
=
"标题"
)
private
MsgData
title
;
@ApiModelProperty
(
value
=
"消息数组"
)
private
List
<
MsgData
>
data
;
@ApiModelProperty
(
value
=
"消息备注"
)
private
MsgData
remark
;
public
String
buildMsgJson
()
{
JSONObject
obj
=
new
JSONObject
();
obj
.
put
(
"touser"
,
this
.
openId
);
obj
.
put
(
"template_id"
,
this
.
templemteId
);
if
(!
StringUtils
.
isBlank
(
this
.
url
))
{
obj
.
put
(
"url"
,
this
.
url
);
}
if
(!
StringUtils
.
isBlank
(
this
.
wxAppltAppId
)
&&
!
StringUtils
.
isBlank
(
this
.
appletPath
))
{
JSONObject
mini
=
new
JSONObject
();
mini
.
put
(
"appid"
,
this
.
wxAppltAppId
);
mini
.
put
(
"pagepath"
,
this
.
appletPath
);
obj
.
put
(
"miniprogram"
,
mini
);
}
JSONObject
jd
=
new
JSONObject
();
jd
.
put
(
"first"
,
this
.
convertMsg
(
title
));
if
(!
CollectionUtils
.
isEmpty
(
this
.
data
))
{
for
(
int
i
=
0
;
i
<
data
.
size
();
i
++)
{
String
key
=
"keyword"
+
(
i
+
1
);
jd
.
put
(
key
,
this
.
convertMsg
(
data
.
get
(
i
)));
}
}
if
(
this
.
remark
!=
null
&&
!
StringUtils
.
isBlank
(
this
.
remark
.
getValue
()))
{
jd
.
put
(
"remark"
,
this
.
convertMsg
(
this
.
remark
));
}
obj
.
put
(
"data"
,
jd
);
return
obj
.
toJSONString
();
}
public
JSONObject
convertMsg
(
MsgData
msg
)
{
JSONObject
jb
=
new
JSONObject
();
jb
.
put
(
"value"
,
msg
.
getValue
());
jb
.
put
(
"color"
,
msg
.
getColor
());
return
jb
;
}
}
cms-common/cms-common-util/src/main/java/com/mmc/iuav/response/ResultEnum.java
浏览文件 @
06fd41aa
...
...
@@ -14,6 +14,10 @@ public enum ResultEnum implements BaseErrorInfoInterface{
COMPANY_NOT_AUTH_ERROR
(
"1001"
,
"未进行企业认证"
),
BUSINESS_LICENSE_CHECK_PARAMETER_ERROR
(
"1002"
,
"企业信息与营业执照信息不一致,请重新上传"
),
//微信相关
WX_ACCESS_TOKEN_ERROR
(
"5027"
,
"获取微信AccessToken失败"
),
APPLET_QR_CODE_CREATE_ERROR
(
"5030"
,
"生成小程序码错误:"
),
APPLET_PORT_TYPE_ERROR
(
"7001"
,
"小程序端口类型错误"
),
APPLET_LOGIN_ERROR
(
"7002"
,
"获取小程序登录失败"
);
...
...
csm-service/cms-service-user/pom.xml
浏览文件 @
06fd41aa
...
...
@@ -90,6 +90,13 @@
<!-- <version>4.0.0</version>-->
<!-- </dependency>-->
<!-- https://mvnrepository.com/artifact/com.github.wxpay/wxpay-sdk -->
<dependency>
<groupId>
com.github.wxpay
</groupId>
<artifactId>
wxpay-sdk
</artifactId>
<version>
0.0.3
</version>
</dependency>
</dependencies>
<build>
...
...
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/constant/WxConstant.java
浏览文件 @
06fd41aa
...
...
@@ -15,5 +15,10 @@ public class WxConstant {
public
static
final
String
OPEN_ID
=
"openid"
;
public
static
final
String
UNION_ID
=
"unionid"
;
public
static
final
String
SESSION_KEY
=
"session_key"
;
public
final
static
String
subscribe
=
"subscribe"
;
public
final
static
String
unsubscribe
=
"unsubscribe"
;
public
static
final
String
IUAV_MINI_PROGRAM_ACCESS_TOKEN
=
"IUAV_MINI_PROGRAM_ACCESS_TOKEN"
;
public
static
final
String
SHARE_FLY_SUB_ACCESS_TOKEN
=
"SHARE_FLY_SUB_ACCESS_TOKEN"
;
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/controller/WxController.java
浏览文件 @
06fd41aa
...
...
@@ -2,16 +2,14 @@ package com.mmc.iuav.user.controller;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.user.service.WxService
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
io.swagger.annotations.ApiResponse
;
import
io.swagger.annotations.ApiResponses
;
import
io.swagger.annotations.*
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.bind.annotation.*
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.io.PrintWriter
;
/**
* @author: zj
...
...
@@ -29,8 +27,42 @@ public class WxController {
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
String
.
class
)
})
@PostMapping
(
"getAppletRcdCode"
)
public
ResultBody
getAppletRcdCode
(
HttpServletRequest
request
)
{
return
ResultBody
.
success
();
// return wxService.getAppletCodeImgBase64(WxMsgDataConfig.USER_APPLET_PAGE_INDEX,
// WxHandler.createRcdScene(this.getCurrentUser(request).getId()));
return
null
;
}
@ApiOperation
(
value
=
"小程序-测试专用"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)
})
@PostMapping
(
"testDemo"
)
public
ResultBody
testDemo
()
{
return
ResultBody
.
success
(
"app:"
+
wxService
.
getAccessToken
()
+
"sub: "
+
wxService
.
getSubAccessToken
());
}
/**
* https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-link/urllink.generate.html#method-http
* (有效期最长不超过30天)
*
* @param path
* smsCode=SMS00003&scene=7 scene:表示用户用户来源渠道
* @return
*/
@ApiOperation
(
value
=
"URL_Link"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
Integer
.
class
)
})
@GetMapping
(
"createUrlLink"
)
public
ResultBody
createUrlLink
(
@ApiParam
(
value
=
"小程序路径"
,
required
=
false
)
@RequestParam
(
required
=
false
)
String
path
,
@ApiParam
(
value
=
"路径携带参数"
,
required
=
false
)
@RequestParam
(
required
=
false
)
String
query
)
{
return
ResultBody
.
success
(
wxService
.
createUrlLink
(
path
,
query
));
}
@ApiOperation
(
value
=
"监控微信公众号的事件变化通知"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
String
.
class
)
})
@PostMapping
(
"wxSendMessage"
)
public
void
wxSendMessage
(
HttpServletRequest
req
,
HttpServletResponse
resp
)
throws
IOException
{
req
.
setCharacterEncoding
(
"UTF-8"
);
resp
.
setCharacterEncoding
(
"UTF-8"
);
PrintWriter
out
=
resp
.
getWriter
();
System
.
out
.
println
(
"##########接收到微信事件推送############"
);
String
msg
=
wxService
.
receiveSubAccountEvents
(
req
);
out
.
println
(
msg
);
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/service/WxService.java
浏览文件 @
06fd41aa
package
com
.
mmc
.
iuav
.
user
.
service
;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.user.model.vo.AppletMsgVO
;
import
com.mmc.iuav.user.model.vo.WxLoginVO
;
import
com.mmc.iuav.user.model.vo.WxMsgVO
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
...
...
@@ -40,25 +42,27 @@ public interface WxService {
/**
* 监控微信公众号的事件变化通知
* @param request
* @param response
*/
void
receiveSubAccountEvents
(
HttpServletRequest
request
,
HttpServletResponse
response
);
String
receiveSubAccountEvents
(
HttpServletRequest
request
);
/**
*
推送订阅消息
*
公众号推送模板消息-不需要用户同意
* @return
*/
ResultBody
sendSubMsg
();
ResultBody
sendSubTemplateMsg
(
WxMsgVO
ws
);
/**
* 获取不限制的小程序码
* @param path
* @param scene
*/
void
getUnLimitedQRCode
(
String
path
,
String
scene
);
ResultBody
getUnLimitedQRCode
(
String
path
,
String
scene
);
/**
* 小程序推送订阅号消息-需用户同意订阅
* @param appletMsgVO
*/
ResultBody
sendAppletMsg
(
AppletMsgVO
appletMsgVO
);
String
createUrlLink
(
String
path
,
String
query
);
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/service/impl/WxServiceImpl.java
浏览文件 @
06fd41aa
package
com
.
mmc
.
iuav
.
user
.
service
.
impl
;
import
com.alibaba.fastjson2.JSONObject
;
import
com.github.wxpay.sdk.WXPayUtil
;
import
com.mmc.iuav.http.HttpHelper
;
import
com.mmc.iuav.http.HttpsRequestUtil
;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.response.ResultEnum
;
import
com.mmc.iuav.user.constant.UserSystemConstant
;
import
com.mmc.iuav.user.constant.WxConstant
;
import
com.mmc.iuav.user.model.vo.AppletMsgVO
;
import
com.mmc.iuav.user.model.vo.WxLoginVO
;
import
com.mmc.iuav.user.model.vo.WxMsgVO
;
import
com.mmc.iuav.user.service.WxService
;
import
com.mmc.iuav.user.util.WxApiUtil
;
import
org.apache.commons.lang.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.redis.core.StringRedisTemplate
;
import
org.springframework.stereotype.Service
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.BufferedReader
;
import
java.io.InputStreamReader
;
import
java.util.Map
;
import
java.util.concurrent.TimeUnit
;
/**
* @author: zj
...
...
@@ -23,6 +33,9 @@ public class WxServiceImpl implements WxService {
@Autowired
private
UserSystemConstant
userSystemConstant
;
@Autowired
private
StringRedisTemplate
stringRedisTemplate
;
@Override
public
String
appLogin
(
WxLoginVO
wxLoginVO
)
{
String
url
=
WxConstant
.
CODE2_SESSION_URL
+
"?appid="
+
userSystemConstant
.
getWxAppId
()
+
"&secret="
+
...
...
@@ -41,9 +54,8 @@ public class WxServiceImpl implements WxService {
@Override
public
String
getAccessToken
()
{
//token有效期为7200s,需要保存起来
//先从redis中获取accessToken,没有则请求获取
String
accessToken
=
null
;
//token有效期为7200s,需要保存起来,先从redis中获取accessToken,没有则请求获取
String
accessToken
=
stringRedisTemplate
.
opsForValue
().
get
(
WxConstant
.
IUAV_MINI_PROGRAM_ACCESS_TOKEN
);
if
(
StringUtils
.
isBlank
(
accessToken
)){
String
getAccessTokenUrl
=
"https://api.weixin.qq.com/cgi-bin/token"
+
"?grant_type=client_credential"
+
"&appid="
+
userSystemConstant
.
getWxAppId
()
+
"&secret"
+
userSystemConstant
.
getWxAppSecret
();
...
...
@@ -56,29 +68,151 @@ public class WxServiceImpl implements WxService {
accessToken
=
tokenResult
.
getString
(
"access_token"
);
long
expiresIn
=
tokenResult
.
getLong
(
"expires_in"
);
//保存进redis
return
accessToken
;
}
else
{
stringRedisTemplate
.
opsForValue
().
set
(
WxConstant
.
IUAV_MINI_PROGRAM_ACCESS_TOKEN
,
accessToken
,
expiresIn
,
TimeUnit
.
SECONDS
);
return
accessToken
;
}
return
accessToken
;
}
@Override
public
String
getSubAccessToken
()
{
return
null
;
//token有效期为7200s,需要保存起来,先从redis中获取accessToken,没有则请求获取
String
accessToken
=
stringRedisTemplate
.
opsForValue
().
get
(
WxConstant
.
SHARE_FLY_SUB_ACCESS_TOKEN
);
if
(
StringUtils
.
isBlank
(
accessToken
)){
String
getAccessTokenUrl
=
"https://api.weixin.qq.com/cgi-bin/token"
+
"?grant_type=client_credential"
+
"&appid="
+
userSystemConstant
.
getWxSubAppId
()
+
"&secret"
+
userSystemConstant
.
getWxSubSecret
();
String
accessTokenMsg
=
HttpsRequestUtil
.
httpsGet
(
getAccessTokenUrl
,
null
);
JSONObject
tokenResult
=
JSONObject
.
parseObject
(
accessTokenMsg
);
if
(
accessTokenMsg
.
indexOf
(
"access_token"
)
==
-
1
)
{
System
.
out
.
println
(
"获取用户信息有误:access_token请求失败:"
+
tokenResult
);
return
null
;
}
accessToken
=
tokenResult
.
getString
(
"access_token"
);
long
expiresIn
=
tokenResult
.
getLong
(
"expires_in"
);
//保存进redis
stringRedisTemplate
.
opsForValue
().
set
(
WxConstant
.
SHARE_FLY_SUB_ACCESS_TOKEN
,
accessToken
,
expiresIn
,
TimeUnit
.
SECONDS
);
return
accessToken
;
}
return
accessToken
;
}
@Override
public
void
receiveSubAccountEvents
(
HttpServletRequest
request
,
HttpServletResponse
response
)
{
public
String
receiveSubAccountEvents
(
HttpServletRequest
request
)
{
try
{
Map
<
String
,
String
>
map
=
this
.
convertRequestToMap
(
request
);
String
event
=
map
.
get
(
"Event"
);
if
(
WxConstant
.
subscribe
.
equals
(
event
))
{
// 关注事件
this
.
subScribeUser
(
map
);
}
else
if
(
WxConstant
.
unsubscribe
.
equals
(
event
))
{
// 取消关注事件
System
.
out
.
println
(
"############################"
);
System
.
out
.
println
(
"###########取消关注############"
);
System
.
out
.
println
(
"############################"
);
String
openId
=
map
.
get
(
"FromUserName"
);
//userSubInfoDao.removeUserSubInfo(openId);
}
}
catch
(
Exception
e
)
{
System
.
out
.
println
(
"接收消息异常"
+
e
.
getMessage
());
return
"error"
;
}
return
"success"
;
}
private
void
subScribeUser
(
Map
<
String
,
String
>
map
)
{
}
private
Map
<
String
,
String
>
convertRequestToMap
(
HttpServletRequest
request
)
throws
Exception
{
BufferedReader
br
=
new
BufferedReader
(
new
InputStreamReader
(
request
.
getInputStream
(),
"UTF-8"
));
String
line
=
""
;
StringBuffer
buffer
=
new
StringBuffer
();
while
((
line
=
br
.
readLine
())
!=
null
)
{
buffer
.
append
(
line
);
}
String
notifyXml
=
buffer
.
toString
();
return
WXPayUtil
.
xmlToMap
(
notifyXml
);
}
@Override
public
ResultBody
sendSubMsg
()
{
return
null
;
public
ResultBody
sendSubTemplateMsg
(
WxMsgVO
ws
)
{
System
.
out
.
println
(
"###########开始发送公众号消息##########"
);
String
accessToken
=
null
;
try
{
accessToken
=
this
.
getSubAccessToken
();
System
.
out
.
println
(
"accesstoken:"
+
accessToken
);
String
url
=
"https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="
+
accessToken
;
String
param
=
ws
.
buildMsgJson
();
System
.
out
.
println
(
"参数:"
+
param
);
String
result
=
HttpHelper
.
httpPost
(
url
,
param
);
System
.
out
.
println
(
"###########结束发送公众号消息##########"
);
System
.
out
.
println
(
result
);
}
catch
(
Exception
e
)
{
System
.
out
.
println
(
"accessToken获取失败:"
+
e
.
getMessage
());
return
ResultBody
.
error
(
ResultEnum
.
WX_ACCESS_TOKEN_ERROR
.
getResultCode
(),
ResultEnum
.
WX_ACCESS_TOKEN_ERROR
.
getResultMsg
()
+
e
.
getMessage
());
}
return
ResultBody
.
success
();
}
@Override
public
ResultBody
getUnLimitedQRCode
(
String
path
,
String
scene
)
{
String
base64
=
""
;
try
{
String
accessToken
=
this
.
getAccessToken
();
JSONObject
param
=
new
JSONObject
();
param
.
put
(
"scene"
,
scene
);
param
.
put
(
"page"
,
path
);
param
.
put
(
"width"
,
430
);
param
.
put
(
"env_version"
,
userSystemConstant
.
getEnvVersion
());
String
url
=
"https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="
+
accessToken
;
base64
=
HttpHelper
.
httpPost
(
url
,
param
.
toJSONString
());
return
ResultBody
.
success
(
base64
);
}
catch
(
Exception
e
)
{
return
ResultBody
.
error
(
ResultEnum
.
APPLET_QR_CODE_CREATE_ERROR
);
}
}
@Override
public
void
getUnLimitedQRCode
(
String
path
,
String
scene
)
{
public
ResultBody
sendAppletMsg
(
AppletMsgVO
appletMsgVO
)
{
System
.
out
.
println
(
"###########开始发送-小程序-用户端消息##########"
);
String
accessToken
=
this
.
getAccessToken
();
if
(
StringUtils
.
isBlank
(
accessToken
)){
return
ResultBody
.
error
(
ResultEnum
.
WX_ACCESS_TOKEN_ERROR
.
getResultCode
(),
ResultEnum
.
WX_ACCESS_TOKEN_ERROR
.
getResultMsg
());
}
try
{
String
url
=
"https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="
+
accessToken
;
appletMsgVO
.
setData
(
WxApiUtil
.
buildMsgJson
(
appletMsgVO
.
getData
()));
String
param
=
JSONObject
.
toJSONString
(
appletMsgVO
);
System
.
out
.
println
(
"参数:"
+
param
);
HttpHelper
.
httpPost
(
url
,
param
);
}
catch
(
Exception
e
){
System
.
out
.
println
(
"系统异常:"
+
e
.
getMessage
());
}
System
.
out
.
println
(
"###########结束发送-小程序-消息##########"
);
return
ResultBody
.
success
();
}
@Override
public
String
createUrlLink
(
String
path
,
String
query
)
{
try
{
String
accessToken
=
this
.
getAccessToken
();
JSONObject
param
=
new
JSONObject
();
param
.
put
(
"path"
,
path
);
param
.
put
(
"env_version"
,
userSystemConstant
.
getEnvVersion
());
param
.
put
(
"query"
,
query
);
String
url
=
"https://api.weixin.qq.com/wxa/generate_urllink?access_token="
+
accessToken
;
String
res
=
HttpHelper
.
httpPost
(
url
,
param
.
toString
());
JSONObject
result
=
JSONObject
.
parseObject
(
res
);
if
(
result
.
getString
(
"errcode"
).
equals
(
"0"
))
{
return
result
.
getString
(
"url_link"
);
}
return
res
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
null
;
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/util/WxApiUtil.java
0 → 100644
浏览文件 @
06fd41aa
package
com
.
mmc
.
iuav
.
user
.
util
;
/**
* @author 作者 geDuo
* @version 创建时间:2021年10月15日 下午6:43:11
* @explain 类说明
*/
import
com.alibaba.fastjson2.JSONObject
;
import
java.security.MessageDigest
;
import
java.util.Arrays
;
import
java.util.Map
;
public
class
WxApiUtil
{
// 与接口配置信息中的Token要一致
private
static
final
String
token
=
"MMCDingYueHaoToken2020"
;
public
static
boolean
checkSignature
(
String
signature
,
String
timestrap
,
String
nonce
)
{
String
[]
arr
=
new
String
[]
{
token
,
timestrap
,
nonce
};
// 将token、timestamp、nonce三个参数进行字典序排序
Arrays
.
sort
(
arr
);
StringBuffer
buf
=
new
StringBuffer
();
for
(
int
i
=
0
;
i
<
arr
.
length
;
i
++)
{
buf
.
append
(
arr
[
i
]);
}
String
temp
=
getSha1
(
buf
.
toString
());
return
temp
.
equals
(
signature
);
}
public
static
String
getSha1
(
String
str
)
{
if
(
null
==
str
||
str
.
length
()
==
0
)
{
return
null
;
}
char
hexDigits
[]
=
{
'0'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
,
'a'
,
'b'
,
'c'
,
'd'
,
'e'
,
'f'
};
try
{
MessageDigest
mdTemp
=
MessageDigest
.
getInstance
(
"SHA1"
);
mdTemp
.
update
(
str
.
getBytes
(
"UTF-8"
));
byte
[]
md
=
mdTemp
.
digest
();
int
j
=
md
.
length
;
char
[]
buf
=
new
char
[
j
*
2
];
int
k
=
0
;
for
(
int
i
=
0
;
i
<
j
;
i
++)
{
byte
byTemp
=
md
[
i
];
buf
[
k
++]
=
hexDigits
[
byTemp
>>>
4
&
0xf
];
buf
[
k
++]
=
hexDigits
[
byTemp
&
0xf
];
}
return
new
String
(
buf
);
}
catch
(
Exception
e
)
{
return
null
;
}
}
/**
* 截取模板长度
*/
public
static
JSONObject
buildMsgJson
(
JSONObject
jsonObject
)
{
for
(
Map
.
Entry
<
String
,
Object
>
entry
:
jsonObject
.
entrySet
())
{
if
(
entry
.
getKey
().
startsWith
(
"thing"
)
&&
entry
.
getValue
()
!=
null
)
{
String
json
=
JSONObject
.
toJSONString
(
entry
.
getValue
());
JSONObject
obj
=
JSONObject
.
parseObject
(
json
);
String
str
=
obj
.
getString
(
"value"
);
if
(
str
.
length
()
>
20
)
{
obj
.
put
(
"value"
,
str
.
substring
(
0
,
17
)
+
"..."
);
entry
.
setValue
(
obj
);
}
}
if
(
entry
.
getKey
().
startsWith
(
"phrase"
)
&&
entry
.
getValue
()
!=
null
)
{
String
json
=
JSONObject
.
toJSONString
(
entry
.
getValue
());
JSONObject
obj
=
JSONObject
.
parseObject
(
json
);
String
str
=
obj
.
getString
(
"value"
);
if
(
str
.
length
()
>
5
)
{
obj
.
put
(
"value"
,
str
.
substring
(
0
,
5
));
entry
.
setValue
(
obj
);
}
}
if
(
entry
.
getKey
().
startsWith
(
"character_string"
)
&&
entry
.
getValue
()
!=
null
)
{
String
json
=
JSONObject
.
toJSONString
(
entry
.
getValue
());
JSONObject
obj
=
JSONObject
.
parseObject
(
json
);
String
str
=
obj
.
getString
(
"value"
);
if
(
str
.
length
()
>
32
)
{
obj
.
put
(
"value"
,
str
.
substring
(
0
,
29
)
+
"..."
);
entry
.
setValue
(
obj
);
}
}
}
return
jsonObject
;
}
}
csm-service/cms-service-user/src/main/resources/application-dev.yml
浏览文件 @
06fd41aa
...
...
@@ -44,6 +44,11 @@ spring:
# login-password: druid
jackson
:
date-format
:
yyyy-MM-dd HH:mm:ss
redis
:
database
:
1
host
:
r-wz9ke310fs684hacn1pd.redis.rds.aliyuncs.com
password
:
MMC@2022&REDIS
port
:
6379
#mybatis
mybatis
:
...
...
csm-service/cms-service-user/src/main/resources/application-local.yml
浏览文件 @
06fd41aa
...
...
@@ -14,6 +14,11 @@ spring:
password
:
MMC@2022&MYSQL
# Druid数据源配置
type
:
com.alibaba.druid.pool.DruidDataSource
redis
:
database
:
1
host
:
r-wz9ke310fs684hacn1pd.redis.rds.aliyuncs.com
password
:
MMC@2022&REDIS
port
:
6379
jackson
:
date-format
:
yyyy-MM-dd HH:mm:ss
...
...
csm-service/cms-service-user/src/main/resources/application-prod.yml
浏览文件 @
06fd41aa
...
...
@@ -44,6 +44,11 @@ spring:
# login-password: druid
jackson
:
date-format
:
yyyy-MM-dd HH:mm:ss
redis
:
database
:
1
host
:
r-wz9ke310fs684hacn1pd.redis.rds.aliyuncs.com
password
:
MMC@2022&REDIS
port
:
6379
#mybatis
mybatis
:
...
...
@@ -60,8 +65,8 @@ wx:
app
:
id
:
wx18b7883acd204278
secret
:
28afe74ba373830237a8133a7431ee82
miniprogram-state
:
tri
al
env-version
:
tri
al
miniprogram-state
:
form
al
env-version
:
form
al
token-path
:
/userservlet/wechat/getAppletUserAccessToken
port
:
user
...
...
pom.xml
浏览文件 @
06fd41aa
...
...
@@ -98,6 +98,11 @@
<version>
5.3
</version>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-data-redis
</artifactId>
</dependency>
</dependencies>
<!-- 标识 SpringCloud 的版本 -->
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论