JFinal使用技巧-小程序多账号

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();
    }
}

image.png

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 ,有需求的人可以自己扩展一下

   

骗赞来了, 觉得有用就点个赞~

评论区

山东小木

2019-05-16 13:52

来 让我亲你一口 及时雨 你真香

山东小木

2019-05-16 18:25

你这里最后setConfig得改成put

杜福忠

2019-05-16 20:20

@山东小木 好的木老师,保持ApiConfigKit 画风,putWxaConfig才是多账号的意思

JFinal

2019-05-17 11:05

@杜福忠 gitee 账号多少,邀请你加入 jfinal weixin 开发团队,这么优秀的人才加入多好

杜福忠

2019-05-17 11:11

@JFinal 老大,那我岂不是要走上人生巅峰的节奏~ gitee账号是 dfz1993@qq.com

JFinal

2019-05-17 11:36

@杜福忠 何止这些,jfinal 还要带你挣钱

falost

2019-05-20 11:11

@山东小木 小木老师 快教我写渣哇

不要香菜

2019-05-20 13:34

老铁6

sky浪翻云

2019-05-20 13:41

老铁666 给力

凉凉凉凉凉

2019-05-23 14:59

脑子里整天一些奇奇怪怪的东西

ToView

2020-01-07 15:49

WxaConfigKit.setThreadLocalAppId(appId)的用意,是让程序去区分用哪个小程序配置吗?

杜福忠

2020-01-07 18:03

@ToView 可以这样说,和公众号服务号模块的用法是一样方式

热门分享

扫码入社