mirror of
https://gitee.com/binary/weixin-java-tools.git
synced 2025-10-14 18:25:10 +08:00
规范化小程序模块的部分代码
This commit is contained in:
@@ -4,6 +4,7 @@ import cn.binarywang.wx.miniapp.api.WxMaMsgService;
|
||||
import cn.binarywang.wx.miniapp.api.WxMaService;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage;
|
||||
import cn.binarywang.wx.miniapp.constant.WxMaConstants;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import me.chanjar.weixin.common.bean.result.WxError;
|
||||
@@ -30,7 +31,7 @@ public class WxMaMsgServiceImpl implements WxMaMsgService {
|
||||
public void sendTemplateMsg(WxMaTemplateMessage templateMessage) throws WxErrorException {
|
||||
String responseContent = this.wxMaService.post(TEMPLATE_MSG_SEND_URL, templateMessage.toJson());
|
||||
JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
|
||||
if (jsonObject.get("errcode").getAsInt() != 0) {
|
||||
if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) {
|
||||
throw new WxErrorException(WxError.fromJson(responseContent));
|
||||
}
|
||||
}
|
||||
|
@@ -2,6 +2,7 @@ package cn.binarywang.wx.miniapp.api.impl;
|
||||
|
||||
import cn.binarywang.wx.miniapp.api.*;
|
||||
import cn.binarywang.wx.miniapp.config.WxMaConfig;
|
||||
import cn.binarywang.wx.miniapp.constant.WxMaConstants;
|
||||
import com.google.gson.JsonParser;
|
||||
import me.chanjar.weixin.common.bean.WxAccessToken;
|
||||
import me.chanjar.weixin.common.bean.result.WxError;
|
||||
@@ -147,6 +148,7 @@ public class WxMaServiceImpl implements WxMaService, RequestHttp<CloseableHttpCl
|
||||
/**
|
||||
* 向微信端发送请求,在这里执行的策略是当发生access_token过期时才去刷新,然后重新执行请求,而不是全局定时请求
|
||||
*/
|
||||
@Override
|
||||
public <T, E> T execute(RequestExecutor<T, E> executor, String uri, E data) throws WxErrorException {
|
||||
int retryTimes = 0;
|
||||
do {
|
||||
@@ -195,11 +197,10 @@ public class WxMaServiceImpl implements WxMaService, RequestHttp<CloseableHttpCl
|
||||
WxError error = e.getError();
|
||||
/*
|
||||
* 发生以下情况时尝试刷新access_token
|
||||
* 40001 获取access_token时AppSecret错误,或者access_token无效
|
||||
* 42001 access_token超时
|
||||
* 40014 不合法的access_token,请开发者认真比对access_token的有效性(如是否过期)
|
||||
*/
|
||||
if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001 || error.getErrorCode() == 40014) {
|
||||
if (error.getErrorCode() == WxMaConstants.ErrorCode.ERR_40001
|
||||
|| error.getErrorCode() == WxMaConstants.ErrorCode.ERR_42001
|
||||
|| error.getErrorCode() == WxMaConstants.ErrorCode.ERR_40014) {
|
||||
// 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token
|
||||
this.getWxMaConfig().expireAccessToken();
|
||||
if (this.getWxMaConfig().autoRefreshToken()) {
|
||||
|
@@ -19,14 +19,14 @@ import java.util.Map;
|
||||
public class WxMaUserServiceImpl implements WxMaUserService {
|
||||
private WxMaService service;
|
||||
|
||||
WxMaUserServiceImpl(WxMaService service) {
|
||||
public WxMaUserServiceImpl(WxMaService service) {
|
||||
this.service = service;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WxMaJscode2SessionResult getSessionInfo(String jsCode) throws WxErrorException {
|
||||
final WxMaConfig config = service.getWxMaConfig();
|
||||
Map<String, String> params = new HashMap<>();
|
||||
Map<String, String> params = new HashMap<>(8);
|
||||
params.put("appid", config.getAppid());
|
||||
params.put("secret", config.getSecret());
|
||||
params.put("js_code", jsCode);
|
||||
|
@@ -4,9 +4,10 @@ import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
|
||||
|
||||
/**
|
||||
* 微信二维码(小程序码)包装器
|
||||
* Created by Element on 2017/7/27.
|
||||
*
|
||||
* @author Element
|
||||
*/
|
||||
public abstract class WxMaQrcodeWrapper {
|
||||
public abstract class AbstractWxMaQrcodeWrapper {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
@@ -6,6 +6,7 @@ package cn.binarywang.wx.miniapp.bean;
|
||||
* 用于描述二维码(小程序码)颜色(RGB参数值),
|
||||
* 详情请查看文档 https://mp.weixin.qq.com/debug/wxadoc/dev/api/qrcode.html
|
||||
* </pre>
|
||||
* @author Element
|
||||
*/
|
||||
public class WxMaCodeLineColor {
|
||||
private String r = "0", g = "0", b = "0";
|
||||
|
@@ -25,14 +25,14 @@ public class WxMaKefuMessage implements Serializable {
|
||||
/**
|
||||
* 获得文本消息builder
|
||||
*/
|
||||
public static TextBuilder TEXT() {
|
||||
public static TextBuilder newTextBuilder() {
|
||||
return new TextBuilder();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得图片消息builder
|
||||
*/
|
||||
public static ImageBuilder IMAGE() {
|
||||
public static ImageBuilder newImageBuilder() {
|
||||
return new ImageBuilder();
|
||||
}
|
||||
|
||||
|
@@ -7,7 +7,7 @@ import java.io.Serializable;
|
||||
/**
|
||||
* @author <a href="https://github.com/binarywang">Binary Wang</a>
|
||||
*/
|
||||
public class WxMaQrcode extends WxMaQrcodeWrapper implements Serializable {
|
||||
public class WxMaQrcode extends AbstractWxMaQrcodeWrapper implements Serializable {
|
||||
private static final long serialVersionUID = 5777119669111011584L;
|
||||
private String path;
|
||||
private int width = 430;
|
||||
|
@@ -6,9 +6,11 @@ import com.google.gson.annotations.SerializedName;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* Created by Element on 2017/7/27.
|
||||
*
|
||||
* @author Element
|
||||
* @date 2017/7/27
|
||||
*/
|
||||
public class WxMaWxcode extends WxMaQrcodeWrapper implements Serializable {
|
||||
public class WxMaWxcode extends AbstractWxMaQrcodeWrapper implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1287399621649210322L;
|
||||
private String path;
|
||||
|
@@ -6,9 +6,11 @@ import com.google.gson.annotations.SerializedName;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* Created by Element on 2017/7/27.
|
||||
*
|
||||
* @author Element
|
||||
* @date 2017/7/27
|
||||
*/
|
||||
public class WxMaWxcodeLimit extends WxMaQrcodeWrapper implements Serializable {
|
||||
public class WxMaWxcodeLimit extends AbstractWxMaQrcodeWrapper implements Serializable {
|
||||
private static final long serialVersionUID = 4782193774524960401L;
|
||||
private String scene;
|
||||
private String page;
|
||||
|
@@ -13,8 +13,8 @@ public final class ImageBuilder extends BaseBuilder<ImageBuilder> {
|
||||
this.msgType = WxMaConstants.KefuMsgType.IMAGE;
|
||||
}
|
||||
|
||||
public ImageBuilder mediaId(String media_id) {
|
||||
this.mediaId = media_id;
|
||||
public ImageBuilder mediaId(String mediaId) {
|
||||
this.mediaId = mediaId;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@@ -175,6 +175,7 @@ public class WxMaInMemoryConfig implements WxMaConfig {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAppid() {
|
||||
return appid;
|
||||
}
|
||||
|
@@ -8,11 +8,19 @@ package cn.binarywang.wx.miniapp.constant;
|
||||
* @author <a href="https://github.com/binarywang">Binary Wang</a>
|
||||
*/
|
||||
public class WxMaConstants {
|
||||
/**
|
||||
* 微信接口返回的参数errcode
|
||||
*/
|
||||
public static final String ERRCODE = "errcode";
|
||||
|
||||
/**
|
||||
* 素材类型
|
||||
*/
|
||||
public static class MediaType {
|
||||
public static final String IMAGE = "image";//图片
|
||||
/**
|
||||
* 图片
|
||||
*/
|
||||
public static final String IMAGE = "image";
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -27,7 +35,30 @@ public class WxMaConstants {
|
||||
* 客服消息的消息类型
|
||||
*/
|
||||
public static class KefuMsgType {
|
||||
public static final String TEXT = "text";//文本消息
|
||||
public static final String IMAGE = "image";//图片消息
|
||||
/**
|
||||
* 文本消息
|
||||
*/
|
||||
public static final String TEXT = "text";
|
||||
/**
|
||||
* 图片消息
|
||||
*/
|
||||
public static final String IMAGE = "image";
|
||||
}
|
||||
|
||||
public static final class ErrorCode {
|
||||
/**
|
||||
* 40001 获取access_token时AppSecret错误,或者access_token无效
|
||||
*/
|
||||
public static final int ERR_40001 = 40001;
|
||||
|
||||
/**
|
||||
* 42001 access_token超时
|
||||
*/
|
||||
public static final int ERR_42001 = 42001;
|
||||
|
||||
/**
|
||||
* 40014 不合法的access_token,请开发者认真比对access_token的有效性(如是否过期)
|
||||
*/
|
||||
public static final int ERR_40014 = 40014;
|
||||
}
|
||||
}
|
||||
|
@@ -2,6 +2,7 @@ package cn.binarywang.wx.miniapp.message;
|
||||
|
||||
import cn.binarywang.wx.miniapp.api.WxMaService;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaMessage;
|
||||
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
||||
import me.chanjar.weixin.common.api.WxErrorExceptionHandler;
|
||||
import me.chanjar.weixin.common.api.WxMessageDuplicateChecker;
|
||||
import me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker;
|
||||
@@ -17,10 +18,7 @@ import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.*;
|
||||
|
||||
/**
|
||||
* @author <a href="https://github.com/binarywang">Binary Wang</a>
|
||||
@@ -42,7 +40,9 @@ public class WxMaMessageRouter {
|
||||
|
||||
public WxMaMessageRouter(WxMaService wxMaService) {
|
||||
this.wxMaService = wxMaService;
|
||||
this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE);
|
||||
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("WxMaMessageRouter-pool-%d").build();
|
||||
this.executorService = new ThreadPoolExecutor(DEFAULT_THREAD_POOL_SIZE, DEFAULT_THREAD_POOL_SIZE,
|
||||
0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), namedThreadFactory);
|
||||
this.messageDuplicateChecker = new WxMessageInMemoryDuplicateChecker();
|
||||
this.sessionManager = new StandardSessionManager();
|
||||
this.exceptionHandler = new LogExceptionHandler();
|
||||
@@ -159,7 +159,7 @@ public class WxMaMessageRouter {
|
||||
}
|
||||
|
||||
public void route(final WxMaMessage wxMessage) {
|
||||
this.route(wxMessage, new HashMap<String, Object>());
|
||||
this.route(wxMessage, new HashMap<String, Object>(2));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -196,7 +196,7 @@ public class WxMaMessageRouterRule {
|
||||
WxSessionManager sessionManager,
|
||||
WxErrorExceptionHandler exceptionHandler) {
|
||||
if (context == null) {
|
||||
context = new HashMap<>();
|
||||
context = new HashMap<>(16);
|
||||
}
|
||||
|
||||
try {
|
||||
|
@@ -1,6 +1,6 @@
|
||||
package cn.binarywang.wx.miniapp.util.http;
|
||||
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaQrcodeWrapper;
|
||||
import cn.binarywang.wx.miniapp.bean.AbstractWxMaQrcodeWrapper;
|
||||
import me.chanjar.weixin.common.bean.result.WxError;
|
||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||
import me.chanjar.weixin.common.util.fs.FileUtils;
|
||||
@@ -25,7 +25,7 @@ import java.util.UUID;
|
||||
/**
|
||||
* @author <a href="https://github.com/binarywang">Binary Wang</a>
|
||||
*/
|
||||
public class QrCodeRequestExecutor implements RequestExecutor<File, WxMaQrcodeWrapper> {
|
||||
public class QrCodeRequestExecutor implements RequestExecutor<File, AbstractWxMaQrcodeWrapper> {
|
||||
protected RequestHttp<CloseableHttpClient, HttpHost> requestHttp;
|
||||
|
||||
public QrCodeRequestExecutor(RequestHttp requestHttp) {
|
||||
@@ -33,7 +33,7 @@ public class QrCodeRequestExecutor implements RequestExecutor<File, WxMaQrcodeWr
|
||||
}
|
||||
|
||||
@Override
|
||||
public File execute(String uri, WxMaQrcodeWrapper ticket) throws WxErrorException, IOException {
|
||||
public File execute(String uri, AbstractWxMaQrcodeWrapper ticket) throws WxErrorException, IOException {
|
||||
HttpPost httpPost = new HttpPost(uri);
|
||||
if (requestHttp.getRequestHttpProxy() != null) {
|
||||
httpPost
|
||||
|
@@ -19,7 +19,7 @@ public class WxMaKefuMessageTest {
|
||||
}
|
||||
|
||||
public void testTextBuild() {
|
||||
WxMaKefuMessage reply = WxMaKefuMessage.TEXT().toUser("OPENID").content("sfsfdsdf").build();
|
||||
WxMaKefuMessage reply = WxMaKefuMessage.newTextBuilder().toUser("OPENID").content("sfsfdsdf").build();
|
||||
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"text\",\"text\":{\"content\":\"sfsfdsdf\"}}");
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ public class WxMaKefuMessageTest {
|
||||
}
|
||||
|
||||
public void testImageBuild() {
|
||||
WxMaKefuMessage reply = WxMaKefuMessage.IMAGE().toUser("OPENID").mediaId("MEDIA_ID").build();
|
||||
WxMaKefuMessage reply = WxMaKefuMessage.newImageBuilder().toUser("OPENID").mediaId("MEDIA_ID").build();
|
||||
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"MEDIA_ID\"}}");
|
||||
}
|
||||
|
||||
|
@@ -34,7 +34,7 @@ public class WxMaDemoServer {
|
||||
public void handle(WxMaMessage wxMessage, Map<String, Object> context,
|
||||
WxMaService service, WxSessionManager sessionManager) throws WxErrorException {
|
||||
System.out.println("收到消息:" + wxMessage.toString());
|
||||
service.getMsgService().sendKefuMsg(WxMaKefuMessage.TEXT().content("收到信息为:" + wxMessage.toJson())
|
||||
service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("收到信息为:" + wxMessage.toJson())
|
||||
.toUser(wxMessage.getFromUser()).build());
|
||||
}
|
||||
};
|
||||
@@ -44,7 +44,7 @@ public class WxMaDemoServer {
|
||||
public void handle(WxMaMessage wxMessage, Map<String, Object> context,
|
||||
WxMaService service, WxSessionManager sessionManager)
|
||||
throws WxErrorException {
|
||||
service.getMsgService().sendKefuMsg(WxMaKefuMessage.TEXT().content("回复文本消息")
|
||||
service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("回复文本消息")
|
||||
.toUser(wxMessage.getFromUser()).build());
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ public class WxMaDemoServer {
|
||||
ClassLoader.getSystemResourceAsStream("tmp.png"));
|
||||
service.getMsgService().sendKefuMsg(
|
||||
WxMaKefuMessage
|
||||
.IMAGE()
|
||||
.newImageBuilder()
|
||||
.mediaId(uploadResult.getMediaId())
|
||||
.toUser(wxMessage.getFromUser())
|
||||
.build());
|
||||
@@ -79,7 +79,7 @@ public class WxMaDemoServer {
|
||||
WxMediaUploadResult uploadResult = service.getMediaService().uploadMedia(WxMaConstants.MediaType.IMAGE, file);
|
||||
service.getMsgService().sendKefuMsg(
|
||||
WxMaKefuMessage
|
||||
.IMAGE()
|
||||
.newImageBuilder()
|
||||
.mediaId(uploadResult.getMediaId())
|
||||
.toUser(wxMessage.getFromUser())
|
||||
.build());
|
||||
|
Reference in New Issue
Block a user