服务平台 API

2.9.4

API 均在 wx.serviceMarket 对象下。invokeService 方法可以通过兼容性配置,无需依赖 2.9.4 即可使用,配置方法见底部 兼容性配置 章节说明。

invokeService

调用服务提供商提供的 API

入参

接收一个对象,对象下有如下定义的字段:

字段名 类型 必填 默认值 说明
service string 服务提供商 ID
api string 服务 API 名
data Object 传递给服务 API 的 JSON 数据

返回值

返回一个 Promise,如调用失败,则 reject 一个 Error 对象,如调用成功,则 resolve 结果为如下定义的对象:

字段名 类型 必填 默认值 说明
data Object String

错误码

错误码 含义
-1 入参错误
-2 调用失败
-3 逻辑失败
-6 appid错误
-7 api信息错误
-8 api信息错误
-10 api扣费失败
-11 命中频率

示例代码 1: OCR

从手机选择图片后,调用 OCR 服务。OCR 服务要求调用方传图片,接收图片的方式是图片 URL。OCR 服务要求调用方的 data 结构如下:

字段名 类型 必填 默认值 说明
img_url string 图片 URL
data_type number 固定为 3,表示 URL 形式的图片
ocr_type number OCR 类型,1 为身份证识别

OCR 的接口需要传入图片 URL,如果需要将手机本地选择的图片上传转换成 URL,既可以用任意的存储服务和自建的存储服务,也可以使用云开发的云文件存储服务(有免费配额),以下分别给出对应的示例。

首先假设有自己的存储服务,示例代码如下:

// 选择图片
wx.chooseImage({
  count: 1,
  success: async function(res) {
    try {
      
      // 将选择到的图片上传到自己的存储空间,假设获取得到的链接为 http://aaa.bbb.ccc/xxx.jpg

      const invokeRes = await wx.serviceMarket.invokeService({
        service: 'wx79ac3de8be320b71',
        api: 'OcrAllInOne',
        data: {
          img_url: 'http://aaa.bbb.ccc/xxx.jpg',
          data_type: 3,
          ocr_type: 1
        },
      })

      console.log('invokeService success', invokeRes)
      wx.showModal({
        title: 'success',
        content: JSON.stringify(invokeRes),
      })
    } catch (err) {
      console.error('invokeService fail', err)
      wx.showModal({
        title: 'fail',
        content: err,
      })
    }
  },
  fail: function(res) {},
  complete: function(res) {},
})

接着以使用云开发为例:

首先需要开通云开发,完成后如下方式上传图片然后调用 OCR 服务:

wx.cloud.init({
  env: '你的云环境ID',
})

// 选择图片
wx.chooseImage({
  count: 1,
  success: async function(res) {
    try {
      const uploadResult = await wx.cloud.uploadFile({
        filePath: res.tempFilePaths[0],
        cloudPath: `tmp/${Date.now()}`,
      })

      const { fileList } = await wx.cloud.getTempFileURL({
        fileList: [uploadResult.fileID],
      })

      const invokeRes = await wx.serviceMarket.invokeService({
        service: 'wx79ac3de8be320b71',
        api: 'OcrAllInOne',
        data: {
          img_url: fileList[0].tempFileURL,
          data_type: 3,
          ocr_type: 1
        },
      })

      await wx.cloud.deleteFile({
        fileList: [fileID],
      })

      console.log('invokeService success', invokeRes)
      wx.showModal({
        title: 'success',
        content: JSON.stringify(invokeRes),
      })
    } catch (err) {
      console.error('invokeService fail', err)
      wx.showModal({
        title: 'fail',
        content: err,
      })
    }
  },
  fail: function(res) {},
  complete: function(res) {},
})

示例代码 2: 不需上传的情况

有些服务不需要传递 URL 或大数据,可以直接 JSON 调用,以下任意举例:

// 选择图片
wx.chooseImage({
  count: 1,
  success: function(res) {
    // 调用 OCR 服务
    wx.serviceMarket.invokeService({
      service: 'some_service_id',
      api: 'test',
      data: {
        type: 'x',
        name: 'y',
      },
    }).then(res => {
      console.log('invokeService success', res)
    }).catch(err => {
      console.error('invokeService fail', err)
    })
  },
  fail: function(err) {
    console.error(err)
  },
})

兼容性配置

可以通过兼容性配置让 wx.serviceMarket.invokeService API 的使用不受基础库版本约束,配置方式是:在 app.json / game.json 中指定顶层字段 "servicemarket": true,在预览发布时小程序代码包会自动包含此 API 的兼容代码,在 2.9.4 以下也可使用。仅在手机上使用,工具中调试请选择 2.9.4 基础库。