FinClip为企业提供小程序生态圈技术产品,开发者可在FinClip小程序开发帮助中心找到相关FinClip小程序指引

# API/组件自定义

如果小程序里需要调用一些宿主 App 提供的能力,而 FinClip 小程序 SDK 未实现或无法实现时,就可以通过注册自定义 API 来实现,使得小程序里也能够调用 App 中注册的 API 了。

注册自定义 API 分两个场景:

  1. 注册给原生小程序使用的自定义 API;
  2. 注册给小程序中 WebView 组件加载的 H5 使用的自定义 API。(暂不支持)

# 1. 自定义小程序 API

注册自定义小程序 api 以及使用自定义小程序 api 有四步:

  1. 实现自定义 api
  2. 注册自定义 api
  3. 在小程序配置中声明自定义 api
  4. 小程序中调用自定义 api

# 1.1 注册自定义小程序异步 API

# 1.1.1 实现自定义异步 api

实现自定义小程序异步 api 示例

import { IApiManager } from "@finclip/sdk";
function finclipLogin(args: IApiManager.IInvokeArgs) {
  /**
   * params 小程序发送的参数
   * callback 用于执行成功或失败的回调
   */
  const params = args.params;
  const callback = args.callback;
  const extInfo = args.extInfo;
  console.log("finclipLogin params", JSON.stringify(params));
  // do something
  const res = true;
  // do something end
  if (res) {
    callback.onSuccess({ message: "finclipLogin success !!" });
  } else {
    callback.onFail({ errMsg: "finclipLogin fail !!" });
  }
}

# 1.1.2 注册自定义异步 api

# 1.1.2.1 全局注册
const instance = FinAppClient.getInsance();
instance?.registerCustomApi("finclipLogin", finclipLogin);
# 1.1.2.2 单独注册
async function startApplet() {
  const appletClient = await client.startApplet({
    appId: "小程序的 appId",
    apiServer: "服务器的地址",
  });
  appletClient.registerCustomApi("finclipLogin", finclipLogin);
}

单独注册的优先级最高,即存在同名 api 的时候,单独注册的 api 会覆盖全局注册的 api

# 1.1.3 在小程序配置文件中声明自定义 api

在小程序根目录创建 FinClipConf.js 并进行相应的自定义 api 配置,或通过 loadExtApi 传入配置参数

module.exports = {
  extApi: [
    {
      //普通交互API
      name: "finclipLogin", //扩展api名 该api必须Native方实现了
      sync: false, //是否为同步api
      params: {
        //扩展api 的参数格式,可以只列必须的属性
        url: "",
      },
    },
  ],
};

小程序端更多配置信息可参考 ft.loadExtApi (opens new window)

# 1.1.4 小程序里调用自定义小程序异步 api

ft.finclipLogin({
  url: "https://www.baidu.com",
  success: function (res) {
    console.log("调用customEvent success");
    console.log(res);
  },
  fail: function (res) {
    console.log("调用customEvent fail");
    console.log(res);
  },
});

# 1.2 注册自定义小程序同步 API

# 1.2.1 实现自定义同步 api

实现自定义小程序同步 api 示例

import { IApiManager } from "@finclip/sdk";

interface ILoginApIRes extends IApiManager.IInvokeBaseResponse {} // 定义返回类型

function finclipLoginSync(args: IApiManager.IInvokeArgs): ILoginApIRes {
  /**
   * params 小程序发送的参数
   */
  const params = args.params;
  const extInfo = args.extInfo;
  console.log("finclipLoginSync params", JSON.stringify(params));
  // do something
  const res = true;
  // do something end
  // 同步 API 需要同步返回结果
  return {
    errMsg: "finclipLoginSync:ok", // 调用信息,如果有则会拼接到 callback 的 errMsg 字段中
    data: "finclipLoginSync success !!", // 返回给小程序的数据
  };
}

# 1.2.2 注册自定义同步 api

# 1.2.2.1 全局注册
const instance = FinAppClient.getInsance();
instance?.registerCustomApi("finclipLogin", finclipLogin);
# 1.2.2.2 单独注册
async function startApplet() {
  const appletClient = await client.startApplet({
    appId: "小程序的 appId",
    apiServer: "服务器的地址",
  });
  appletClient.registerCustomApi("finclipLogin", finclipLogin);
}

单独注册的优先级最高,即存在同名 api 的时候,单独注册的 api 会覆盖全局注册的 api

# 1.2.3 在小程序配置文件中声明自定义 api

在小程序根目录创建 FinClipConf.js 并进行相应的自定义 api 配置,或通过 loadExtApi 传入配置参数

module.exports = {
  extApi: [
    {
      //普通交互API
      name: "finclipLogin", //扩展api名 该api必须Native方实现了
      sync: true, //是否为同步api
      params: {
        //扩展api 的参数格式,可以只列必须的属性
        url: "",
      },
    },
  ],
};

小程序端更多配置信息可参考 ft.loadExtApi (opens new window)

# 1.2.4 小程序里调用自定义小程序同步步 api

const res = ft.finclipLoginSync();
console.log("res:", res); // { errMsg: 'finclipLoginSync:ok',  data: 'customApiSync success !!'        }

# 2. 原生向小程序发送全局消息

可以通过以下 api 给小程序发送全局消息。

client.sendCustomEvent(appId: string, apiServer: string, params: IFinApplet.Serializable)

示例代码:

// 宿主 App
client.sendCustomEvent("appId", "apiServer", { prop1: "app" });

client.sendCustomEvent("appId", "apiServer", {
  name: "customEventName",
  prop2: "app",
});
// 小程序
ft.onCustomEvent((params) => {
  console.log("ft.onCustomEvent", params); // { prop1: "app" }
});

ft.addCustomEventListener("customEventName", (params) => {
  console.log("ft.addCustomEventListener", params); // { name:"customEventName", prop2: "app" }
});
© FinClip with ❤ , Since 2017