yangys
2024-04-18 b3cbbc1b1bf540359ac22f8733f6c322d845b38f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package com.qianwen.core.notify.provider.wechat.mini;
 
import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
import cn.binarywang.wx.miniapp.bean.device.WxMaDeviceSubscribeMessageRequest;
import com.alibaba.fastjson.JSONObject;
import java.time.Duration;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.qianwen.core.http.HttpRequest;
import com.qianwen.core.log.exception.BizServiceException;
import com.qianwen.core.notify.DefaultNotifyType;
import com.qianwen.core.notify.NotifyType;
import com.qianwen.core.notify.Provider;
import com.qianwen.core.notify.notifier.AbstractNotifier;
import com.qianwen.core.notify.notifier.NotifierProperties;
import com.qianwen.core.notify.provider.wechat.WechatMiniProvider;
import com.qianwen.core.notify.provider.wechat.mini.WechatMiniMessageTemplate;
import com.qianwen.core.notify.template.Template;
import com.qianwen.core.notify.template.TemplateManager;
import com.qianwen.core.tool.api.BizMessage;
import com.qianwen.core.tool.metadata.Values;
import com.qianwen.core.tool.utils.Func;
import com.qianwen.core.tool.utils.StringFormatUtil;
import com.qianwen.core.tool.utils.StringUtil;
 
/* loaded from: blade-starter-notify-9.3.0.0-SNAPSHOT.jar:org/springblade/core/notify/provider/wechat/mini/WeixinMiniDeviceNotifier.class */
public class WeixinMiniDeviceNotifier extends AbstractNotifier<WechatMiniMessageTemplate> {
    private static final Logger log = LoggerFactory.getLogger(WeixinMiniDeviceNotifier.class);
    private final AtomicReference<String> accessToken;
    private long refreshTokenTime;
    private final long tokenTimeOut;
    private static final String tokenApi = "https://api.weixin.qq.com/cgi-bin/token";
    private static final String notify = "https://api.weixin.qq.com/cgi-bin/message/device/subscribe/send?access_token=";
    private final WechatMiniProperties properties;
    private final String notifierId;
    private NotifierProperties notifierProperties;
 
 
    @Override // com.qianwen.core.notify.notifier.Notifier
    public String getNotifierId() {
        return this.notifierId;
    }
 
    @Override // com.qianwen.core.notify.notifier.Notifier
    public NotifierProperties getNotifierProperties() {
        return this.notifierProperties;
    }
 
    public WeixinMiniDeviceNotifier(NotifierProperties properties, TemplateManager templateManager) {
        super(templateManager);
        this.accessToken = new AtomicReference<>();
        this.tokenTimeOut = Duration.ofSeconds(7000L).toMillis();
        WechatMiniProperties wechatMpProperties = (WechatMiniProperties) new JSONObject(properties.getConfiguration()).toJavaObject(WechatMiniProperties.class);
        this.properties = wechatMpProperties;
        this.notifierProperties = properties;
        this.notifierId = properties.getId();
    }
 
    @Override // com.qianwen.core.notify.notifier.Notifier
    public NotifyType getType() {
        return DefaultNotifyType.weiXinMini;
    }
 
    @Override // com.qianwen.core.notify.notifier.Notifier
    public Provider getProvider() {
        return WechatMiniProvider.miniDeviceSubMessage;
    }
 
    public void send(WechatMiniMessageTemplate template, String traceId, Values context, List<String> notifiedParty) {
        String access_token = getToken();
        Map<String, Object> maps = context.getAllValues();
        List<WxMaSubscribeMessage.MsgData> templateDataList = new ArrayList<>();
        List<WechatMiniMessageTemplate.ConfigProperty> templateMapping = template.getProperties();
        if (Func.isNotEmpty(maps)) {
            maps.forEach((k, v) -> {
                WxMaSubscribeMessage.MsgData temp = new WxMaSubscribeMessage.MsgData();
                if (Func.isNotEmpty(v)) {
                    temp.setValue(v.toString());
                }
                if (Func.isNotEmpty(templateMapping)) {
                    temp.setName((String) templateMapping.stream().filter(x -> {
                        return x.getName().equals(k);
                    }).map(x2 -> {
                        return x2.getValue();
                    }).findFirst().orElse(k));
                } else {
                    temp.setName(k);
                }
                templateDataList.add(temp);
            });
        }
        HttpRequest httpRequest = HttpRequest.post(notify.concat(access_token));
        WxMaDeviceSubscribeMessageRequest deviceSubscribeMessageRequest = new WxMaDeviceSubscribeMessageRequest();
        deviceSubscribeMessageRequest.setTemplateId(template.getTemplateId());
        deviceSubscribeMessageRequest.setToOpenidList(notifiedParty);
        if (Func.isNotBlank(template.getPage())) {
            deviceSubscribeMessageRequest.setPage(StringFormatUtil.format(template.getPage(), maps));
        }
        if (Func.isNotBlank(template.getMiniprogramState())) {
            deviceSubscribeMessageRequest.setMiniprogramState(template.getMiniprogramState());
        }
        deviceSubscribeMessageRequest.setData(templateDataList);
        Map<String, Object> result = httpRequest.bodyString(deviceSubscribeMessageRequest.toJson()).execute().onFailed((k2, v2) -> {
            log.info(StringUtil.format("发送小程序设备订阅消息{}失败,原因{}", new Object[]{k2.url(), v2.getMessage()}));
        }).asMap(Object.class);
        if (result.containsKey("errcode") && !result.get("errcode").equals(0)) {
            BizMessage bizMessage = new BizMessage();
            bizMessage.setMessage(result.get("errcode").toString());
            bizMessage.setMessage(result.get("errmsg").toString());
            throw new BizServiceException(bizMessage);
        }
 
    }
 
    private String getToken() {
        if (System.currentTimeMillis() - this.refreshTokenTime > this.tokenTimeOut || this.accessToken.get() == null) {
            return requestToken();
        }
        return this.accessToken.get();
    }
 
    private String requestToken() {
        HttpRequest httpRequest = HttpRequest.get("https://api.weixin.qq.com/cgi-bin/token");
        Map<String, Object> queries = new HashMap<>();
        queries.put("grant_type", "client_credential");
        queries.put("appid", this.properties.getAppid());
        queries.put("secret", this.properties.getSecret());
        httpRequest.queryMap(queries);
        Map<String, Object> result = httpRequest.execute().onFailed((k, v) -> log.info(StringUtil.format("发送小程序设备订阅消息{}失败,原因{}", new Object[] { k.url(), v.getMessage() }))).asMap(String.class);
        if (result.containsKey("access_token")) {
          this.refreshTokenTime = System.currentTimeMillis();
          this.accessToken.set(result.get("access_token").toString());
          return result.get("access_token").toString();
        } 
        BizMessage bizMessage = new BizMessage();
        bizMessage.setMessage(result.get("errcode").toString());
        bizMessage.setMessage(result.get("errmsg").toString());
        throw new BizServiceException(bizMessage);
    }
 
    @Override // com.qianwen.core.notify.notifier.Notifier
    public void close() {
        this.accessToken.set(null);
        this.refreshTokenTime = 0L;
    }
}