RPC 调用

本文介绍的是 RPC 接口的使用方法。

说明

由于 JS 传入的 JSON 数据无法包含数据类型,在 Native 层转为字典时可能会由于数据类型问题导致误差,如果是数字类型的精确值,尽量使用字符串来进行传递。例如:{"value":9.45} 会被 native 转为 {"value":9.449999999999999} 然后上发到服务端。应该改为使用 {"value":"9.45"} 来传递。

RPC 接口的使用方法

AlipayJSBridge.call('rpc', {
  operationType: 'alipay.client.xxxx',
  requestData: [],
  headers: {}
}, function(result) {
  console.log(result);
});

代码示例

<h1>点击按钮发起 RPC 请求</h1>

<a href="javascript:void(0)" class="btn rpc">发起请求</a><br/>
<a href="javascript:void(0)" class="btn rpcHeader">发起有响应头返回的请求</a>

<script>
function ready(callback) {
  // 如果 jsbridge 已经注入则直接调用
  if (window.AlipayJSBridge) {
    callback && callback();
  } else {
    // 如果没有注入则监听注入的事件
    document.addEventListener('AlipayJSBridgeReady', callback, false);
  }
}
ready(function() {
  document.querySelector('.rpc').addEventListener('click', function() {
    AlipayJSBridge.call('rpc', {
      operationType: 'alipay.client.xxxx',
      requestData: [],
      headers: {}
    }, function(result) {
      alert(JSON.stringify(result));
    });
  });

  document.querySelector('.rpcHeader').addEventListener('click', function() {
    AlipayJSBridge.call('rpc', {
      operationType: 'alipay.client.xxxx',
      requestData: [],
      headers: {},
      getResponse: true
    }, function(result) {
      alert(JSON.stringify(result));
    });
  });
});
</script>

API 说明

AlipayJSBridge.call('rpc', {
  operationType:,
  requestData:,
  headers
}, fn);

入参

属性

类型

描述

必填

默认值

operationType

string

RPC 服务名称。

Y

-

requestData

array

RPC 请求的参数。需要开发者根据具体 RPC 接口自行构造。

N

-

headers

object

RPC 请求设置的 headers。

N

{}

gateway

string

网关地址。

N

alipay 网关

compress

boolean

是否支持 request gzip 压缩。

N

true

disableLimitView

boolean

RPC 网关被限流时是否禁止自动弹出统一限流弹窗。

N

false

timeout

int

RPC 超时时间,单位为秒。

框架统一设置,策略较复杂。

  • iOS 端 Wi-Fi 环境 20s,其它环境 30s。

  • Android 端 Wi-Fi/4G 环境 12s 到 42s 之间。其它环境 32s 到 60s 之间

N

-

getResponse

boolean

获取 RPC 响应头。

注意

设置为 true 时,响应数据会多一层嵌套,可用于数据回流上报获取 traceId、entityId。

N

false

fn

function

回调函数。

N

-

出参

回调函数带入的参数 result: {error }

属性

类型

描述

error

string

错误码

错误码

错误码

描述

10

网络错误。

11

请求超时。

其他

由 mobilegw 网关定义。

RPC 原生错误码

错误码

描述

1000

成功。

0

未知错误。

1

客户端找不到通讯对象。

2

客户端没有网络(JSAPI 做了转换,返回 10)。

3

客户端证书错误。

4

客户端网络连接超时。

5

客户端网络速度过慢。

6

客户端请求服务端未返回。

7

客户端网络 IO 错误。

8

客户端网络请求调度错误。

9

客户端处理错误。

10

客户端数据反序列化错误,服务端数据格式有误。

11

客户端登录失败。

12

客户端登录账号切换。

13

请求中断错误,例如线程中断时网络请求会被中断。

14

客户端网络缓存错误。

15

客户端网络授权错误。

16

DNS 解析错误。

17

operationType 不在白名单。

1001

拒绝访问。

1002

调用次数超过限制:“系统繁忙,请稍后再试。”

2000

登录超时,请重新登录。

3000

缺少操作类型或者此操作类型不支持。

3001

请求数据为空:系统繁忙,请稍后再试。

3002

数据格式有误。

4001

服务请求超时,请稍后再试。

4002

远程调用业务系统异常:网络繁忙,请稍后再试。

4003

创建远程调用代理失败:网络繁忙,请稍后再试。

5000

未知错误:“抱歉,暂时无法操作,请稍后再试。”

6000

RPC-服务找不到。

6001

RPC-目标方法找不到。

6002

RPC-参数数目不正确。

6003

RPC-目标方法不可访问。

6004

RPC-JSON 解析异常。

6005

RPC-调用目标方法时参数不合法。

6666

RPC-业务异常。

7000

没有设置公钥。

7001

验签的参数不够。

7002

验签失败。

7003

验签时间戳校验失败。

7004

验签 RPC 接口 operationType 参数为空。

7005

productId 参数为空。

7006

验签接口 did 参数为空。

7007

验签接口请求发送时间参数 t 为空。

7008

验签接口 IMEI(客户端设备标识)参数为空。

7009

验签接口 IMSI(客户端用户标识)为空。

7010

验签接口 API 版本号为空。

7011

验签接口用户没有权限。

7012

验签接口 RPC 没有对外开放。

7013

验签接口 productId 没有注册或者获取密钥为空。

7014

验签接口加签数据为空。

7015

验签接口签约无效。

7016

验签接口请求登录 RPC 传入 sid 为空。

7017

验签接口请求登录 RPC 传入 sid 无效。

7018

验签接口请求登录 RPC 传入 token 无效。

7019

验签接口请求登录 RPC 获取 alipayuserid 为空。

8001

etag:响应数据没有变化。

RPC 自定义 gateway

可在 RPC 调用中指定请求的网关地址。

RPC 限流逻辑

容器版本

disableLimitView

行为

回调参数

<=9.9.5

true

静默

1002

<=9.9.5

false

Alert

1002

>=9.9.6

true

静默

1002

>=9.9.6

false

网关处理

100201

行为类型

描述

静默

无。

Alert

弹出统一限流框,如下图。

Toast

弹出系统 Toast,如果用户关闭系统则没有。

网关处理

根据网关的 RPC 配置,静默 Alert Toast。

RPC 限流弹框

traffic limit

常见问题

Q:出现如下报错信息:ESLint: 'AlipayJSBridge' is not defined,如何解决?

A:AlipayJSBridge 未定义的问题有如下两种解决方案:

  • 方案一:window.AlipayJSBridge.call('rpc');

  • 方案二:

      const { AlipayJSBridge } = window;
      AlipayJSBridge.call('rpc');
阿里云首页 移动开发平台 mPaaS 相关技术圈