微信小程序发送订阅消息

pull/11/head
reminis 2 years ago
parent 874c1a66e6
commit 4dd3b84ad6

@ -45,6 +45,12 @@ public class SendAccountConstant {
public static final String WECHAT_OFFICIAL_ACCOUNT_KEY = "officialAccount";
public static final String WECHAT_OFFICIAL__PREFIX = "official_";
/**
*
*/
public static final String WECHAT_MINI_PROGRAM_ACCOUNT_KEY = "miniProgramAccount";
public static final String WECHAT_MINI_PROGRAM_PREFIX = "mini_program_";
/**
*
*/

@ -0,0 +1,44 @@
package com.java3y.austin.common.dto.account;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
*
*
* <p>
*
* https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
* * @author sunql
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class WeChatMiniProgramAccount {
/**
* ID
*/
private String templateId;
/**
* developertrialformal
*/
private String miniProgramState;
/**
* ,index?foo=bar
*/
private String page;
/**
*
*/
private String appId;
private String appSecret;
private String grantType;
}

@ -1,8 +1,22 @@
package com.java3y.austin.common.dto.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
/**
* @author 3y
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MiniProgramContentModel extends ContentModel {
/**
*
*/
Map<String, String> map;
}

@ -46,6 +46,11 @@
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
</dependency>
<!--微信小程序第三方SDK-->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
</dependency>
<!--企业微信发送消息-->
<dependency>

@ -0,0 +1,38 @@
package com.java3y.austin.handler.domain.wechat;
import lombok.Builder;
import lombok.Data;
import java.util.Map;
import java.util.Set;
/**
* @author sunql
* @date 20220506 15:56
*
*
*/
@Data
@Builder
public class WeChatMiniProgramParam {
/**
* Id
*/
private Long messageTemplateId;
/**
*
*/
private Integer sendAccount;
/**
* openid
*/
private Set<String> openIds;
/**
* { "key1": { "value": any }, "key2": { "value": any } }
*/
private Map<String, String> data;
}

@ -0,0 +1,67 @@
package com.java3y.austin.handler.handler.impl;
import com.alibaba.fastjson.JSON;
import com.google.common.base.Throwables;
import com.java3y.austin.common.domain.TaskInfo;
import com.java3y.austin.common.dto.model.MiniProgramContentModel;
import com.java3y.austin.common.dto.model.OfficialAccountsContentModel;
import com.java3y.austin.common.enums.ChannelType;
import com.java3y.austin.handler.domain.wechat.WeChatMiniProgramParam;
import com.java3y.austin.handler.domain.wechat.WeChatOfficialParam;
import com.java3y.austin.handler.handler.BaseHandler;
import com.java3y.austin.handler.handler.Handler;
import com.java3y.austin.handler.script.MiniProgramAccountService;
import com.java3y.austin.handler.script.OfficialAccountService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @author sunql
*
*/
@Component
@Slf4j
public class MiniProgramAccountHandler extends BaseHandler implements Handler {
@Autowired
private MiniProgramAccountService miniProgramAccountService;
public MiniProgramAccountHandler() {
channelCode = ChannelType.MINI_PROGRAM.getCode();
}
@Override
public boolean handler(TaskInfo taskInfo) {
WeChatMiniProgramParam miniProgramParam = buildMiniProgramParam(taskInfo);
try {
miniProgramAccountService.send(miniProgramParam);
} catch (Exception e) {
log.error("MiniProgramAccountHandler#handler fail:{},params:{}",
Throwables.getStackTraceAsString(e), JSON.toJSONString(taskInfo));
return false;
}
return true;
}
/**
* taskInfo
*
* @param taskInfo
* @return
*/
private WeChatMiniProgramParam buildMiniProgramParam(TaskInfo taskInfo) {
// 小程序订阅消息可以关联到系统业务,通过接口查询。
WeChatMiniProgramParam miniProgramParam = WeChatMiniProgramParam.builder()
.openIds(taskInfo.getReceiver())
.messageTemplateId(taskInfo.getMessageTemplateId())
.sendAccount(taskInfo.getSendAccount())
.build();
MiniProgramContentModel contentModel = (MiniProgramContentModel) taskInfo.getContentModel();
miniProgramParam.setData(contentModel.getMap());
return miniProgramParam;
}
}

@ -0,0 +1,19 @@
package com.java3y.austin.handler.script;
import com.java3y.austin.handler.domain.wechat.WeChatMiniProgramParam;
/**
* @author sunql
*/
public interface MiniProgramAccountService {
/**
*
*
* @param miniProgramParam
* @return
* @throws Exception
*/
void send(WeChatMiniProgramParam miniProgramParam) throws Exception;
}

@ -0,0 +1,93 @@
package com.java3y.austin.handler.script.impl;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.WxMaSubscribeService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import cn.binarywang.wx.miniapp.api.impl.WxMaSubscribeServiceImpl;
import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import com.java3y.austin.common.constant.SendAccountConstant;
import com.java3y.austin.common.dto.account.WeChatMiniProgramAccount;
import com.java3y.austin.handler.domain.wechat.WeChatMiniProgramParam;
import com.java3y.austin.handler.script.MiniProgramAccountService;
import com.java3y.austin.support.utils.AccountUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author sunql
* @date 20220506 16:41
*/
@Service
@Slf4j
public class MiniProgramAccountServiceImpl implements MiniProgramAccountService {
@Autowired
private AccountUtils accountUtils;
@Override
public void send(WeChatMiniProgramParam miniProgramParam) throws Exception {
WeChatMiniProgramAccount miniProgramAccount = accountUtils.getAccount(miniProgramParam.getSendAccount(),
SendAccountConstant.WECHAT_MINI_PROGRAM_ACCOUNT_KEY,
SendAccountConstant.WECHAT_MINI_PROGRAM_PREFIX,
WeChatMiniProgramAccount.builder().build());
WxMaSubscribeService wxMaSubscribeService = initService(miniProgramAccount);
List<WxMaSubscribeMessage> subscribeMessageList = assembleReq(miniProgramParam, miniProgramAccount);
for (WxMaSubscribeMessage subscribeMessage : subscribeMessageList) {
wxMaSubscribeService.sendSubscribeMsg(subscribeMessage);
}
}
/**
*
*/
private List<WxMaSubscribeMessage> assembleReq(WeChatMiniProgramParam miniProgramParam, WeChatMiniProgramAccount miniProgramAccount) {
Set<String> receiver = miniProgramParam.getOpenIds();
List<WxMaSubscribeMessage> messageList = new ArrayList<>(receiver.size());
// 构建微信小程序订阅消息
for (String openId : receiver) {
WxMaSubscribeMessage subscribeMessage = WxMaSubscribeMessage.builder()
.toUser(openId)
.data(getWxMTemplateData(miniProgramParam.getData()))
.miniprogramState(miniProgramAccount.getMiniProgramState())
.templateId(miniProgramAccount.getTemplateId())
.page(miniProgramAccount.getPage())
.build();
messageList.add(subscribeMessage);
}
return messageList;
}
/**
*
*
* @returnp
*/
private List<WxMaSubscribeMessage.MsgData> getWxMTemplateData(Map<String, String> data) {
List<WxMaSubscribeMessage.MsgData> templateDataList = new ArrayList<>(data.size());
data.forEach((k, v) -> templateDataList.add(new WxMaSubscribeMessage.MsgData(k, v)));
return templateDataList;
}
/**
*
*
* @return
*/
private WxMaSubscribeServiceImpl initService(WeChatMiniProgramAccount miniProgramAccount) {
WxMaService wxMaService = new WxMaServiceImpl();
WxMaDefaultConfigImpl wxMaConfig = new WxMaDefaultConfigImpl();
wxMaConfig.setAppid(miniProgramAccount.getAppId());
wxMaConfig.setSecret(miniProgramAccount.getAppSecret());
wxMaService.setWxMaConfig(wxMaConfig);
return new WxMaSubscribeServiceImpl(wxMaService);
}
}

@ -27,6 +27,7 @@ public class AccountUtils {
* (key:dingDingRobotAccount) [{"ding_ding_robot_10":{"secret":"SEC996d8d9d4768aded74114faae924f229229de444475a1c295d64fedf","webhook":"https://oapi.dingtalk.com/robot/send?access_token=8d03b644ffb6534b203d87333367328b0c3003d164715d2c6c6e56"}}]
* (key:dingDingWorkNoticeAccount) [{"ding_ding_work_notice_10":{"appKey":"dingh6yyyyyyycrlbx","appSecret":"tQpvmkR863333yyyyyHP3QHyyyymy9Ao1yoL1oQX5Nlx_fYLLLlpPJWHvWKbTu","agentId":"152333383622"}}]
* (key:officialAccount) [{"official_10":{"appId":"wxecb4693d2eef1ea7","secret":"6240870f4d91701640d769ba20120821","templateId":"JHUk6eE9T5Ts7a5JO3ZQqkBBrZBGn5C9iIiKNDQsk-Q","url":"http://weixin.qq.com/download","miniProgramId":"xiaochengxuappid12345","path":"index?foo=bar"}}]
* (key:miniProgramAccount) [{"mini_program_10":{"appId":"wxecb4693d2eef1ea7","appSecret":"6240870f4d91701640d769ba20120821","templateId":"JHUk6eE9T5Ts7a5JO3ZQqkBBrZBGn5C9iIiKNDQsk-Q","grantType":"client_credential","miniProgramState":"trial","page":"index?foo=bar"}}]
*/
public <T> T getAccount(Integer sendAccount, String apolloKey, String prefix, T t) {
String accountValues = config.getProperty(apolloKey, AustinConstant.APOLLO_DEFAULT_VALUE_JSON_ARRAY);

@ -87,10 +87,3 @@ management.endpoint.metrics.enabled=true
management.endpoint.prometheus.enabled=true
management.endpoints.web.exposure.include=*
management.metrics.export.prometheus.enabled=true
##################### wx mp config #####################
##################### TODO not test by 3y,wait to apply for OfficialAccount #####################
wx.mp.account.appid="appid"
wx.mp.account.secret="secret"
wx.mp.account.token="token"
wx.mp.account.aesKey="aesKey"

@ -160,6 +160,13 @@
<version>${weixin-java}</version>
</dependency>
<!--微信小程序第三方SDK-->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>${weixin-java}</version>
</dependency>
<!--动态线程池引入-->
<dependency>
<groupId>io.github.lyh200</groupId>

Loading…
Cancel
Save