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 ,有需求的人可以自己扩展一下
骗赞来了, 觉得有用就点个赞~