Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
cms-ci-test
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
test-ci
cms-ci-test
Commits
06fd41aa
提交
06fd41aa
authored
5月 23, 2023
作者:
zhenjie
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
微信相关接口
上级
38960d02
显示空白字符变更
内嵌
并排
正在显示
14 个修改的文件
包含
473 行增加
和
30 行删除
+473
-30
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
+144
-10
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{
...
@@ -14,6 +14,10 @@ public enum ResultEnum implements BaseErrorInfoInterface{
COMPANY_NOT_AUTH_ERROR
(
"1001"
,
"未进行企业认证"
),
COMPANY_NOT_AUTH_ERROR
(
"1001"
,
"未进行企业认证"
),
BUSINESS_LICENSE_CHECK_PARAMETER_ERROR
(
"1002"
,
"企业信息与营业执照信息不一致,请重新上传"
),
BUSINESS_LICENSE_CHECK_PARAMETER_ERROR
(
"1002"
,
"企业信息与营业执照信息不一致,请重新上传"
),
//微信相关
WX_ACCESS_TOKEN_ERROR
(
"5027"
,
"获取微信AccessToken失败"
),
APPLET_QR_CODE_CREATE_ERROR
(
"5030"
,
"生成小程序码错误:"
),
APPLET_PORT_TYPE_ERROR
(
"7001"
,
"小程序端口类型错误"
),
APPLET_PORT_TYPE_ERROR
(
"7001"
,
"小程序端口类型错误"
),
APPLET_LOGIN_ERROR
(
"7002"
,
"获取小程序登录失败"
);
APPLET_LOGIN_ERROR
(
"7002"
,
"获取小程序登录失败"
);
...
...
csm-service/cms-service-user/pom.xml
浏览文件 @
06fd41aa
...
@@ -90,6 +90,13 @@
...
@@ -90,6 +90,13 @@
<!-- <version>4.0.0</version>-->
<!-- <version>4.0.0</version>-->
<!-- </dependency>-->
<!-- </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>
</dependencies>
<build>
<build>
...
...
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/constant/WxConstant.java
浏览文件 @
06fd41aa
...
@@ -15,5 +15,10 @@ public class WxConstant {
...
@@ -15,5 +15,10 @@ public class WxConstant {
public
static
final
String
OPEN_ID
=
"openid"
;
public
static
final
String
OPEN_ID
=
"openid"
;
public
static
final
String
UNION_ID
=
"unionid"
;
public
static
final
String
UNION_ID
=
"unionid"
;
public
static
final
String
SESSION_KEY
=
"session_key"
;
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;
...
@@ -2,16 +2,14 @@ package com.mmc.iuav.user.controller;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.user.service.WxService
;
import
com.mmc.iuav.user.service.WxService
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.*
;
import
io.swagger.annotations.ApiOperation
;
import
io.swagger.annotations.ApiResponse
;
import
io.swagger.annotations.ApiResponses
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.io.PrintWriter
;
/**
/**
* @author: zj
* @author: zj
...
@@ -29,8 +27,42 @@ public class WxController {
...
@@ -29,8 +27,42 @@ public class WxController {
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
String
.
class
)
})
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
String
.
class
)
})
@PostMapping
(
"getAppletRcdCode"
)
@PostMapping
(
"getAppletRcdCode"
)
public
ResultBody
getAppletRcdCode
(
HttpServletRequest
request
)
{
public
ResultBody
getAppletRcdCode
(
HttpServletRequest
request
)
{
return
ResultBody
.
success
();
return
null
;
// return wxService.getAppletCodeImgBase64(WxMsgDataConfig.USER_APPLET_PAGE_INDEX,
}
// WxHandler.createRcdScene(this.getCurrentUser(request).getId()));
@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
;
package
com
.
mmc
.
iuav
.
user
.
service
;
import
com.mmc.iuav.response.ResultBody
;
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.WxLoginVO
;
import
com.mmc.iuav.user.model.vo.WxMsgVO
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
javax.servlet.http.HttpServletResponse
;
...
@@ -40,25 +42,27 @@ public interface WxService {
...
@@ -40,25 +42,27 @@ public interface WxService {
/**
/**
* 监控微信公众号的事件变化通知
* 监控微信公众号的事件变化通知
* @param request
* @param request
* @param response
*/
*/
void
receiveSubAccountEvents
(
HttpServletRequest
request
,
HttpServletResponse
response
);
String
receiveSubAccountEvents
(
HttpServletRequest
request
);
/**
/**
*
推送订阅消息
*
公众号推送模板消息-不需要用户同意
* @return
* @return
*/
*/
ResultBody
sendSubMsg
();
ResultBody
sendSubTemplateMsg
(
WxMsgVO
ws
);
/**
/**
* 获取不限制的小程序码
* 获取不限制的小程序码
* @param path
* @param path
* @param scene
* @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
;
package
com
.
mmc
.
iuav
.
user
.
service
.
impl
;
import
com.alibaba.fastjson2.JSONObject
;
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.http.HttpsRequestUtil
;
import
com.mmc.iuav.response.ResultBody
;
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.UserSystemConstant
;
import
com.mmc.iuav.user.constant.WxConstant
;
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.WxLoginVO
;
import
com.mmc.iuav.user.model.vo.WxMsgVO
;
import
com.mmc.iuav.user.service.WxService
;
import
com.mmc.iuav.user.service.WxService
;
import
com.mmc.iuav.user.util.WxApiUtil
;
import
org.apache.commons.lang.StringUtils
;
import
org.apache.commons.lang.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.redis.core.StringRedisTemplate
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
javax.servlet.http.HttpServletRequest
;
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
* @author: zj
...
@@ -23,6 +33,9 @@ public class WxServiceImpl implements WxService {
...
@@ -23,6 +33,9 @@ public class WxServiceImpl implements WxService {
@Autowired
@Autowired
private
UserSystemConstant
userSystemConstant
;
private
UserSystemConstant
userSystemConstant
;
@Autowired
private
StringRedisTemplate
stringRedisTemplate
;
@Override
@Override
public
String
appLogin
(
WxLoginVO
wxLoginVO
)
{
public
String
appLogin
(
WxLoginVO
wxLoginVO
)
{
String
url
=
WxConstant
.
CODE2_SESSION_URL
+
"?appid="
+
userSystemConstant
.
getWxAppId
()
+
"&secret="
+
String
url
=
WxConstant
.
CODE2_SESSION_URL
+
"?appid="
+
userSystemConstant
.
getWxAppId
()
+
"&secret="
+
...
@@ -41,9 +54,8 @@ public class WxServiceImpl implements WxService {
...
@@ -41,9 +54,8 @@ public class WxServiceImpl implements WxService {
@Override
@Override
public
String
getAccessToken
()
{
public
String
getAccessToken
()
{
//token有效期为7200s,需要保存起来
//token有效期为7200s,需要保存起来,先从redis中获取accessToken,没有则请求获取
//先从redis中获取accessToken,没有则请求获取
String
accessToken
=
stringRedisTemplate
.
opsForValue
().
get
(
WxConstant
.
IUAV_MINI_PROGRAM_ACCESS_TOKEN
);
String
accessToken
=
null
;
if
(
StringUtils
.
isBlank
(
accessToken
)){
if
(
StringUtils
.
isBlank
(
accessToken
)){
String
getAccessTokenUrl
=
"https://api.weixin.qq.com/cgi-bin/token"
+
"?grant_type=client_credential"
+
"&appid="
+
String
getAccessTokenUrl
=
"https://api.weixin.qq.com/cgi-bin/token"
+
"?grant_type=client_credential"
+
"&appid="
+
userSystemConstant
.
getWxAppId
()
+
"&secret"
+
userSystemConstant
.
getWxAppSecret
();
userSystemConstant
.
getWxAppId
()
+
"&secret"
+
userSystemConstant
.
getWxAppSecret
();
...
@@ -56,29 +68,151 @@ public class WxServiceImpl implements WxService {
...
@@ -56,29 +68,151 @@ public class WxServiceImpl implements WxService {
accessToken
=
tokenResult
.
getString
(
"access_token"
);
accessToken
=
tokenResult
.
getString
(
"access_token"
);
long
expiresIn
=
tokenResult
.
getLong
(
"expires_in"
);
long
expiresIn
=
tokenResult
.
getLong
(
"expires_in"
);
//保存进redis
//保存进redis
return
accessToken
;
stringRedisTemplate
.
opsForValue
().
set
(
WxConstant
.
IUAV_MINI_PROGRAM_ACCESS_TOKEN
,
accessToken
,
expiresIn
,
TimeUnit
.
SECONDS
);
}
else
{
return
accessToken
;
return
accessToken
;
}
}
return
accessToken
;
}
}
@Override
@Override
public
String
getSubAccessToken
()
{
public
String
getSubAccessToken
()
{
//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
;
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
@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
@Override
public
ResultBody
sendSubMsg
()
{
public
ResultBody
sendSubTemplateMsg
(
WxMsgVO
ws
)
{
return
null
;
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
@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:
...
@@ -44,6 +44,11 @@ spring:
# login-password: druid
# login-password: druid
jackson
:
jackson
:
date-format
:
yyyy-MM-dd HH:mm:ss
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
mybatis
:
mybatis
:
...
...
csm-service/cms-service-user/src/main/resources/application-local.yml
浏览文件 @
06fd41aa
...
@@ -14,6 +14,11 @@ spring:
...
@@ -14,6 +14,11 @@ spring:
password
:
MMC@2022&MYSQL
password
:
MMC@2022&MYSQL
# Druid数据源配置
# Druid数据源配置
type
:
com.alibaba.druid.pool.DruidDataSource
type
:
com.alibaba.druid.pool.DruidDataSource
redis
:
database
:
1
host
:
r-wz9ke310fs684hacn1pd.redis.rds.aliyuncs.com
password
:
MMC@2022&REDIS
port
:
6379
jackson
:
jackson
:
date-format
:
yyyy-MM-dd HH:mm:ss
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:
...
@@ -44,6 +44,11 @@ spring:
# login-password: druid
# login-password: druid
jackson
:
jackson
:
date-format
:
yyyy-MM-dd HH:mm:ss
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
mybatis
:
mybatis
:
...
@@ -60,8 +65,8 @@ wx:
...
@@ -60,8 +65,8 @@ wx:
app
:
app
:
id
:
wx18b7883acd204278
id
:
wx18b7883acd204278
secret
:
28afe74ba373830237a8133a7431ee82
secret
:
28afe74ba373830237a8133a7431ee82
miniprogram-state
:
tri
al
miniprogram-state
:
form
al
env-version
:
tri
al
env-version
:
form
al
token-path
:
/userservlet/wechat/getAppletUserAccessToken
token-path
:
/userservlet/wechat/getAppletUserAccessToken
port
:
user
port
:
user
...
...
pom.xml
浏览文件 @
06fd41aa
...
@@ -98,6 +98,11 @@
...
@@ -98,6 +98,11 @@
<version>
5.3
</version>
<version>
5.3
</version>
</dependency>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-data-redis
</artifactId>
</dependency>
</dependencies>
</dependencies>
<!-- 标识 SpringCloud 的版本 -->
<!-- 标识 SpringCloud 的版本 -->
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论