Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
gxpt_ht
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
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
pseer
gxpt_ht
Commits
55e93835
Commit
55e93835
authored
Nov 20, 2023
by
吕明尚
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
增加小程序消息推送类
parent
592ab3bd
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
306 additions
and
8 deletions
+306
-8
ReceiptRdeisEnum.java
...on/src/main/java/share/common/enums/ReceiptRdeisEnum.java
+2
-1
WxMsgPushController.java
...java/share/web/controller/common/WxMsgPushController.java
+26
-0
WxMaProperties.java
...t/src/main/java/share/web/core/config/WxMaProperties.java
+43
-0
WxMaConfiguration.java
...rc/main/java/share/web/interceptor/WxMaConfiguration.java
+129
-0
application-prod.yml
share-front/src/main/resources/application-prod.yml
+7
-0
RedisTask.java
share-quartz/src/main/java/share/quartz/task/RedisTask.java
+34
-0
pom.xml
share-system/pom.xml
+7
-7
commons-codec-1.9.jar
share-system/src/lib/commons-codec-1.9.jar
+0
-0
WxMsgPushConService.java
...c/main/java/share/system/service/WxMsgPushConService.java
+5
-0
WxMsgPushConServiceeImpl.java
...a/share/system/service/impl/WxMsgPushConServiceeImpl.java
+53
-0
No files found.
share-common/src/main/java/share/common/enums/ReceiptRdeisEnum.java
View file @
55e93835
...
...
@@ -5,7 +5,8 @@ public enum ReceiptRdeisEnum {
PREPARE
(
1
,
"TUANGOU.RECEIPT.PREPARE."
),
MT_SESSION_KEY
(
2
,
"MT_SESSION_KEY"
),
MT_SESSION_OBJECT_KEY
(
3
,
"MT_SESSION_OBJECT_KEY"
),
ORDER_NO_KEY
(
4
,
"ORDER_NO_KEY."
);
ORDER_NO_KEY
(
4
,
"ORDER_NO_KEY."
),
ACCESS_TOKEN_KEY
(
5
,
"ACCESS_TOKEN_KEY."
);
private
Integer
code
;
...
...
share-front/src/main/java/share/web/controller/common/WxMsgPushController.java
View file @
55e93835
package
share
.
web
.
controller
.
common
;
import
cn.binarywang.wx.miniapp.api.WxMaService
;
import
cn.binarywang.wx.miniapp.api.WxMaSubscribeService
;
import
cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage
;
import
cn.hutool.core.date.LocalDateTimeUtil
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.extern.slf4j.Slf4j
;
import
me.chanjar.weixin.common.bean.subscribemsg.TemplateInfo
;
import
me.chanjar.weixin.common.error.WxErrorException
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.RestController
;
import
share.common.core.domain.AjaxResult
;
import
share.system.service.WxMsgPushConService
;
import
share.system.util.WXMsgPushUtils
;
import
java.util.Map
;
/**
* 微信小程序 模板消息推送
**/
@RestController
@Slf4j
@RequestMapping
(
"/weixinpublic"
)
public
class
WxMsgPushController
{
@Value
(
"${wechat.token}"
)
private
String
token
;
@Autowired
private
WxMsgPushConService
wxMsgPushConService
;
/**
* 正确响应微信发送的Token验证,注意 这里是 get请求
**/
...
...
@@ -43,4 +61,12 @@ public class WxMsgPushController {
// 验证成功 将 echostr 原格式返回 ,即可完成验证
return
echostr
;
}
@GetMapping
(
"/api/zphs/sendZbhsMsg"
)
@ApiOperation
(
"传openId发送微信服务通知"
)
public
AjaxResult
<
Boolean
>
sendMsg
(
String
openID
)
throws
WxErrorException
{
wxMsgPushConService
.
sendSmallMsg
(
openID
);
return
AjaxResult
.
success
(
true
);
}
}
share-front/src/main/java/share/web/core/config/WxMaProperties.java
0 → 100644
View file @
55e93835
package
share
.
web
.
core
.
config
;
import
lombok.Data
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
java.util.List
;
@Data
@ConfigurationProperties
(
prefix
=
"wx.miniapp"
)
public
class
WxMaProperties
{
private
List
<
Config
>
configs
;
@Data
public
static
class
Config
{
/**
* 设置微信小程序的appid
*/
private
String
appid
;
/**
* 设置微信小程序的Secret
*/
private
String
secret
;
/**
* 设置微信小程序消息服务器配置的token
*/
private
String
token
;
/**
* 设置微信小程序消息服务器配置的EncodingAESKey
*/
private
String
aesKey
;
/**
* 消息格式,XML或者JSON
*/
private
String
msgDataFormat
;
}
}
share-front/src/main/java/share/web/interceptor/WxMaConfiguration.java
0 → 100644
View file @
55e93835
package
share
.
web
.
interceptor
;
import
cn.binarywang.wx.miniapp.api.WxMaService
;
import
cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl
;
import
cn.binarywang.wx.miniapp.bean.WxMaKefuMessage
;
import
cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage
;
import
cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl
;
import
cn.binarywang.wx.miniapp.message.WxMaMessageHandler
;
import
cn.binarywang.wx.miniapp.message.WxMaMessageRouter
;
import
com.google.common.collect.Lists
;
import
lombok.extern.slf4j.Slf4j
;
import
me.chanjar.weixin.common.bean.result.WxMediaUploadResult
;
import
me.chanjar.weixin.common.error.WxErrorException
;
import
me.chanjar.weixin.common.error.WxRuntimeException
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
share.web.core.config.WxMaProperties
;
import
java.io.File
;
import
java.util.List
;
import
java.util.stream.Collectors
;
@Slf4j
@Configuration
@EnableConfigurationProperties
(
WxMaProperties
.
class
)
public
class
WxMaConfiguration
{
private
final
WxMaProperties
properties
;
@Autowired
public
WxMaConfiguration
(
WxMaProperties
properties
)
{
this
.
properties
=
properties
;
}
@Bean
public
WxMaService
wxMaService
()
{
List
<
WxMaProperties
.
Config
>
configs
=
this
.
properties
.
getConfigs
();
if
(
configs
==
null
)
{
throw
new
WxRuntimeException
(
"大哥,拜托先看下项目首页的说明(readme文件),添加下相关配置,注意别配错了!"
);
}
WxMaService
maService
=
new
WxMaServiceImpl
();
maService
.
setMultiConfigs
(
configs
.
stream
()
.
map
(
a
->
{
WxMaDefaultConfigImpl
config
=
new
WxMaDefaultConfigImpl
();
// WxMaDefaultConfigImpl config = new WxMaRedisConfigImpl(new JedisPool());
// 使用上面的配置时,需要同时引入jedis-lock的依赖,否则会报类无法找到的异常
config
.
setAppid
(
a
.
getAppid
());
config
.
setSecret
(
a
.
getSecret
());
config
.
setToken
(
a
.
getToken
());
config
.
setAesKey
(
a
.
getAesKey
());
config
.
setMsgDataFormat
(
a
.
getMsgDataFormat
());
return
config
;
}).
collect
(
Collectors
.
toMap
(
WxMaDefaultConfigImpl:
:
getAppid
,
a
->
a
,
(
o
,
n
)
->
o
)));
return
maService
;
}
@Bean
public
WxMaMessageRouter
wxMaMessageRouter
(
WxMaService
wxMaService
)
{
final
WxMaMessageRouter
router
=
new
WxMaMessageRouter
(
wxMaService
);
router
.
rule
().
handler
(
logHandler
).
next
()
.
rule
().
async
(
false
).
content
(
"订阅消息"
).
handler
(
subscribeMsgHandler
).
end
()
.
rule
().
async
(
false
).
content
(
"文本"
).
handler
(
textHandler
).
end
()
.
rule
().
async
(
false
).
content
(
"图片"
).
handler
(
picHandler
).
end
()
.
rule
().
async
(
false
).
content
(
"二维码"
).
handler
(
qrcodeHandler
).
end
();
return
router
;
}
private
final
WxMaMessageHandler
subscribeMsgHandler
=
(
wxMessage
,
context
,
service
,
sessionManager
)
->
{
service
.
getMsgService
().
sendSubscribeMsg
(
WxMaSubscribeMessage
.
builder
()
.
templateId
(
"此处更换为自己的模板id"
)
.
data
(
Lists
.
newArrayList
(
new
WxMaSubscribeMessage
.
MsgData
(
"keyword1"
,
"339208499"
)))
.
toUser
(
wxMessage
.
getFromUser
())
.
build
());
return
null
;
};
private
final
WxMaMessageHandler
logHandler
=
(
wxMessage
,
context
,
service
,
sessionManager
)
->
{
log
.
info
(
"收到消息:"
+
wxMessage
.
toString
());
service
.
getMsgService
().
sendKefuMsg
(
WxMaKefuMessage
.
newTextBuilder
().
content
(
"收到信息为:"
+
wxMessage
.
toJson
())
.
toUser
(
wxMessage
.
getFromUser
()).
build
());
return
null
;
};
private
final
WxMaMessageHandler
textHandler
=
(
wxMessage
,
context
,
service
,
sessionManager
)
->
{
service
.
getMsgService
().
sendKefuMsg
(
WxMaKefuMessage
.
newTextBuilder
().
content
(
"回复文本消息"
)
.
toUser
(
wxMessage
.
getFromUser
()).
build
());
return
null
;
};
private
final
WxMaMessageHandler
picHandler
=
(
wxMessage
,
context
,
service
,
sessionManager
)
->
{
try
{
WxMediaUploadResult
uploadResult
=
service
.
getMediaService
()
.
uploadMedia
(
"image"
,
"png"
,
ClassLoader
.
getSystemResourceAsStream
(
"tmp.png"
));
service
.
getMsgService
().
sendKefuMsg
(
WxMaKefuMessage
.
newImageBuilder
()
.
mediaId
(
uploadResult
.
getMediaId
())
.
toUser
(
wxMessage
.
getFromUser
())
.
build
());
}
catch
(
WxErrorException
e
)
{
e
.
printStackTrace
();
}
return
null
;
};
private
final
WxMaMessageHandler
qrcodeHandler
=
(
wxMessage
,
context
,
service
,
sessionManager
)
->
{
try
{
final
File
file
=
service
.
getQrcodeService
().
createQrcode
(
"123"
,
430
);
WxMediaUploadResult
uploadResult
=
service
.
getMediaService
().
uploadMedia
(
"image"
,
file
);
service
.
getMsgService
().
sendKefuMsg
(
WxMaKefuMessage
.
newImageBuilder
()
.
mediaId
(
uploadResult
.
getMediaId
())
.
toUser
(
wxMessage
.
getFromUser
())
.
build
());
}
catch
(
WxErrorException
e
)
{
e
.
printStackTrace
();
}
return
null
;
};
}
share-front/src/main/resources/application-prod.yml
View file @
55e93835
...
...
@@ -21,7 +21,14 @@ wechat:
mchId
:
1658895429
signKey
:
ZEKu56XCezuESfNEdM4zVZEN3cz2PuHz
certPath
:
/Users/project/pseer/apiclient_cert.p12
wx
:
miniapp
:
configs
:
-
appid
:
wxdd170b8783edf7a0
secret
:
7339f117e85876a0dfe10ea1ed47340e
token
:
coujio
aesKey
:
zf8vTHbI0ZDPTkkCXHEuwh9EbtVtOn6n4vQjMb9OFrS
msgDataFormat
:
JSON
# 开发环境配置
server
:
# 服务器的HTTP端口,默认为8080
...
...
share-quartz/src/main/java/share/quartz/task/RedisTask.java
View file @
55e93835
package
share
.
quartz
.
task
;
import
cn.hutool.json.JSONObject
;
import
com.alibaba.fastjson2.JSON
;
import
com.dianping.openapi.sdk.api.oauth.entity.CustomerRefreshTokenResponse
;
import
org.apache.http.HttpEntity
;
import
org.apache.http.HttpResponse
;
import
org.apache.http.client.HttpClient
;
import
org.apache.http.client.methods.HttpGet
;
import
org.apache.http.impl.client.HttpClients
;
import
org.apache.http.util.EntityUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.CollectionUtils
;
...
...
@@ -17,6 +25,7 @@ import share.system.service.ISConsumerCouponService;
import
share.system.service.ISOrderService
;
import
share.system.service.QPService
;
import
java.io.IOException
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Set
;
...
...
@@ -26,17 +35,28 @@ import java.util.concurrent.TimeUnit;
public
class
RedisTask
{
@Autowired
private
ISConsumerCouponService
isConsumerCouponService
;
@Autowired
private
QPService
qpService
;
@Autowired
private
RedisTemplate
redisTemplate
;
@Autowired
private
RedisUtil
redisUtil
;
@Autowired
private
ISCleanRecordsService
isCleanRecordsService
;
@Autowired
private
ISOrderService
isOrderService
;
@Value
(
"${wechat.appid}"
)
private
String
appid
;
@Value
(
"${wechat.secret}"
)
private
String
secret
;
public
void
AuToReceiptCode
()
{
//获取redis中所有以tuangou.receipt.prepare开头的key
Set
<
String
>
keys
=
redisTemplate
.
keys
(
ReceiptRdeisEnum
.
PREPARE
.
getValue
()
+
"*"
);
...
...
@@ -73,6 +93,20 @@ public class RedisTask {
}
}
public
void
AutoWXAccessToken
()
throws
IOException
{
Boolean
b
=
redisTemplate
.
hasKey
(
ReceiptRdeisEnum
.
ACCESS_TOKEN_KEY
.
getValue
());
if
(!
b
)
{
String
url
=
"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
+
appid
+
"&secret="
+
secret
;
HttpClient
httpClient
=
HttpClients
.
createDefault
();
HttpGet
httpGet
=
new
HttpGet
(
url
);
HttpResponse
response
=
httpClient
.
execute
(
httpGet
);
HttpEntity
entity
=
response
.
getEntity
();
String
strEntity
=
EntityUtils
.
toString
(
entity
,
"UTF-8"
);
JSONObject
jsonObject
=
new
JSONObject
(
strEntity
);
redisUtil
.
set
(
ReceiptRdeisEnum
.
ACCESS_TOKEN_KEY
.
getValue
(),
jsonObject
.
getStr
(
"access_token"
),
Long
.
valueOf
(
jsonObject
.
getInt
(
"expires_in"
)
-
60
*
30
),
TimeUnit
.
SECONDS
);
}
}
//自动添加保洁记录
public
void
AutoAddSCleanRecords
()
{
Set
<
String
>
keys
=
redisTemplate
.
keys
(
ReceiptRdeisEnum
.
ORDER_NO_KEY
.
getValue
()
+
"*"
);
...
...
share-system/pom.xml
View file @
55e93835
...
...
@@ -99,13 +99,6 @@
<systemPath>
${project.basedir}/src/lib/dianping-openapi-java-sdk-qa-1.1.240-sources.jar
</systemPath>
</dependency>
<dependency>
<groupId>
commons-codec
</groupId>
<artifactId>
commons-codec
</artifactId>
<version>
1.0
</version>
<scope>
system
</scope>
<systemPath>
${project.basedir}/src/lib/commons-codec-1.9.jar
</systemPath>
</dependency>
<dependency>
<groupId>
com.google.guava
</groupId>
<artifactId>
guava
</artifactId>
<version>
28.2-android
</version>
...
...
@@ -144,6 +137,12 @@
<groupId>
junit
</groupId>
<artifactId>
junit
</artifactId>
</dependency>
<dependency>
<groupId>
cn.hutool
</groupId>
<artifactId>
hutool-all
</artifactId>
<version>
5.8.16
</version>
<scope>
compile
</scope>
</dependency>
</dependencies>
</project>
\ No newline at end of file
share-system/src/lib/commons-codec-1.9.jar
deleted
100644 → 0
View file @
592ab3bd
File deleted
share-system/src/main/java/share/system/service/WxMsgPushConService.java
0 → 100644
View file @
55e93835
package
share
.
system
.
service
;
public
interface
WxMsgPushConService
{
void
sendSmallMsg
(
String
openID
);
}
share-system/src/main/java/share/system/service/impl/WxMsgPushConServiceeImpl.java
0 → 100644
View file @
55e93835
package
share
.
system
.
service
.
impl
;
import
cn.binarywang.wx.miniapp.api.WxMaService
;
import
cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage
;
import
cn.hutool.core.date.LocalDateTimeUtil
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
me.chanjar.weixin.common.error.WxErrorException
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Repository
;
import
org.springframework.stereotype.Service
;
import
share.system.service.WxMsgPushConService
;
import
javax.annotation.Resource
;
import
java.time.LocalDateTime
;
import
java.util.HashMap
;
import
java.util.Map
;
@Slf4j
@Service
public
class
WxMsgPushConServiceeImpl
implements
WxMsgPushConService
{
@Autowired
private
WxMaService
wxMaService
;
/**
* 跳转的小程序页面
*/
private
static
final
String
PAGES_ZP
=
"pages/draft-review/list/list"
;
@Override
public
void
sendSmallMsg
(
String
openID
)
{
Map
<
String
,
String
>
map
=
new
HashMap
<>();
map
.
put
(
"thing4"
,
"预约门店"
);
map
.
put
(
"thing7"
,
"服务名称"
);
map
.
put
(
"date3"
,
LocalDateTimeUtil
.
format
(
LocalDateTime
.
now
(),
"yyyy-MM-dd HH:mm:ss"
));
map
.
put
(
"thing5"
,
"地址"
);
WxMaSubscribeMessage
wxMaSubscribeMessage
=
WxMaSubscribeMessage
.
builder
()
.
toUser
(
openID
)
.
templateId
(
"oTc000e4NHkoc7v9OLBZiwM6Q6SFzguemrx6d0iuVS8"
)
.
page
(
PAGES_ZP
)
.
build
();
// 设置将推送的消息
map
.
forEach
((
k
,
v
)
->
{
wxMaSubscribeMessage
.
addData
(
new
WxMaSubscribeMessage
.
MsgData
(
k
,
v
));
});
try
{
log
.
info
(
"开始发送消息!!!!"
);
wxMaService
.
getMsgService
().
sendSubscribeMsg
(
wxMaSubscribeMessage
);
log
.
info
(
"消息发送成功!!!!"
);
}
catch
(
WxErrorException
e
)
{
e
.
printStackTrace
();
}
}
}
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