本文介绍的是 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 超时时间,单位为秒。 框架统一设置,策略较复杂。
| 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 限流弹框
常见问题
Q:出现如下报错信息:ESLint: 'AlipayJSBridge' is not defined
,如何解决?
A:AlipayJSBridge 未定义的问题有如下两种解决方案:
方案一:
window.AlipayJSBridge.call('rpc');
方案二:
const { AlipayJSBridge } = window; AlipayJSBridge.call('rpc');