PS:JFinal-weixin 新版本已经支持多小程序了,这里不用研究了~~
前一段时间开发小程序,有多个端(多个小程序),如果启动好几个项目也不划算。 JF微信目前还没加入多个小程序支持。 波总最近又在搞重要的事情,项目也等不急工期,就自己覆盖了一下代码, 就是自己在项目中建一个同名包和类名。不多说,上石马:
package com.jfinal.wxaapp;
import com.jfinal.kit.StrKit;
import com.jfinal.wxaapp.msg.IMsgParser;
import com.jfinal.wxaapp.msg.JsonMsgParser;
import com.jfinal.wxaapp.msg.XmlMsgParser;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 小程序配置工具
*
* @author L.cm
* @author 杜福忠 2019-03-16 17:04:21重写, 支持多小程序
*/
public class WxaConfigKit {
private static final ThreadLocal<String> TL = new ThreadLocal<>();
private static final Map<String, WxaConfig> CFG_MAP = new ConcurrentHashMap<>();
private static final String DEFAULT_CFG_KEY = "_default_cfg_key_";
/**
* 小程序消息解析
*/
private static IMsgParser msgParser = new XmlMsgParser();
/**
* 获取小程序消息解析器
*
* @return {IMsgParser}
*/
public static IMsgParser getMsgParser() {
return msgParser;
}
/**
* 设置小程序消息解析器
*/
public static void useJsonMsgParser() {
WxaConfigKit.msgParser = new JsonMsgParser();
}
// 开发模式将输出消息交互 xml、json 到控制台
private static boolean devMode = false;
public static void setDevMode(boolean devMode) {
WxaConfigKit.devMode = devMode;
}
public static boolean isDevMode() {
return devMode;
}
/**
* 添加小程序号配置,每个appId只需添加一次,相同appId将被覆盖。
* 第一个添加的将作为默认公众号配置
*
* @param wxaConfig 公众号配置
* @return WxaConfig 公众号配置
*/
// public static WxaConfig setWxaConfig(WxaConfig wxaConfig) {
public static WxaConfig putWxaConfig(WxaConfig wxaConfig) {
if (CFG_MAP.size() == 0) {
CFG_MAP.put(DEFAULT_CFG_KEY, wxaConfig);
}
return CFG_MAP.put(wxaConfig.getAppId(), wxaConfig);
}
public static String getAppId() {
String appId = TL.get();
if (StrKit.isBlank(appId)) {
appId = CFG_MAP.get(DEFAULT_CFG_KEY).getAppId();
}
return appId;
}
public static WxaConfig getWxaConfig() {
String appId = getAppId();
return getWxaConfig(appId);
}
public static WxaConfig getWxaConfig(String appId) {
WxaConfig cfg = CFG_MAP.get(appId);
if (cfg == null)
throw new IllegalStateException("需事先调用 WxaConfigKit.setWxaConfig(apiConfig) 将 appId对应的 WxaConfig 对象存入," +
"如JFinalConfig.afterJFinalStart()中调用, 才可以使用 WxaConfigKit.getWxaConfig() 系列方法");
return cfg;
}
public static WxaConfig removeApiConfig(WxaConfig apiConfig) {
return removeApiConfig(apiConfig.getAppId());
}
public static WxaConfig removeApiConfig(String appId) {
return CFG_MAP.remove(appId);
}
public static void setThreadLocalAppId(String appId) {
if (StrKit.isBlank(appId)) {
appId = CFG_MAP.get(DEFAULT_CFG_KEY).getAppId();
}
TL.set(appId);
}
public static void removeThreadLocalAppId() {
TL.remove();
}
}
PS:如果项目全部打包为.jar 发布时,请注意删除掉jfinal-weixin-xx.jar里面的WxaConfigKit.class因为有时会报java.lang.NoSuchMethodError
这样紫就临时覆盖了, 等波总后面支持了,就把这个自建类撤掉。
配使用就正常用就可以了
WxaConfig wc = new WxaConfig();
wc.setAppId("appId-1");
wc.setAppSecret("appSecret-1");
WxaConfigKit.setWxaConfig(wc);
WxaConfig wc2 = new WxaConfig();
wc2.setAppId("appId-2");
wc2.setAppSecret("appSecret-2");
WxaConfigKit.setWxaConfig(wc2);
这样就OK第一个set进去的是默认值, 使用方式和微信公众号那个是一样的
请求参数和微信公众号一样, 自己把 url?appId=1234 挂过来。
用 WxaConfigKit.setThreadLocalAppId(appId); 存起来即可
//自动校验 必填参数 code,缺失时 报 400错误
String jsCode = kit.get(kv, "code");
String appId = kv.getString("appId");
WxaConfigKit.setThreadLocalAppId(appId);
// 获取SessionKey
ApiResult apiResult = wxaUserApi.getSessionKey(jsCode);
WxaConfigKit.removeThreadLocalAppId();
// 返回{"session_key":"nzoqhc3OnwHzeTxJs+inbQ==","expires_in":2592000,"openid":"oVBkZ0aYgDMDIywRdgPW8-joxXc4"}
jsonStr = apiResult.getJson();
if ( ! apiResult.isSucceed()) {
returnError("50500", "腾讯解码失败", jsonStr);
return null;
}我这里只用了一次, 就没有抽取为 Interceptor ,有需求的人可以自己扩展一下
骗赞来了, 觉得有用就点个赞~