Skip to content
开发者工具
使用AI助手和工具加速开发

PM Dropin 错误码参考 ​

本文档面向对接商户,说明接入 PM Dropin 支付组件时,在各调用入口 / 时序阶段可能收到的code及其含义,以及应该如何处理。本文档不区分错误码是由 SDK 前端产生还是服务端返回

商户只需要关注:我在哪个入口、哪个阶段、收到什么 code、它意味着什么。

0. 总览 ​

0.1 如何阅读本文档 ​

组件 API 只有两类入口:

入口形式携带code对应章节
订阅事件instance.on('load' /'form-check' /'payButtonClick' / ...)仅 load 带 code, 其余为状态/通知§1、§2.2 等
触发动作instance.emit('canMakePayment' / ...),返回 Promise resolve = 成功; reject = 失败,err.code为错误码 §2.3、§3、
§4

四类支付组件统一按以下时序阶段展开描述:

初始化(ready → load)→ 用户交互(卡表单 form-check / 系统支付按钮 payButtonClick)→ 支付请求(emit('canMakePayment'))→ 商户下单收尾 (Apple Pay 需 paySuccess / payFail)。

0.2 统一约定 ​

约定说明
成功码 事件入口成功为 SUCCESS ; emit('canMakePayment') 成功为 APPLY_SUCCESS (二者含义相同,出现位置不同)
失败响应 统一为 { code, msg, displayMsg? } : code 见各章表格; msg 为英文机器文案(或服务端返回文案); displayMsg 为双语 { en, ar } 可直接展示的文案(目前主要在卡组件出现)
code 透传 服务端受理阶段返回的错误码会原样透传给商户,SDK 不做翻译;本文档无法穷举,通用处理见附录 B
组件 typeload 事件返回 type : card / applepay / googlepay / userinfocollect ,可用于区分组件

0.3 完整流程(以 Apple Pay 为例,最完整链路) ​

JavaScript
const applePay = PMdropin.create('applepay', options)

applePay.on('load', (res) => { res.code === 'SUCCESS' /* 才挂载/启用组件 */ })
applePay.on('payButtonClick', () => { /* 用户点击系统按钮 → 发起支付 */ })

// 阶段①:拉起 Apple Pay 系统弹层 → 用户授权 → SDK 完成商户验证与取 token
applePay.emit('canMakePayment', payload)
  .then(res => {
    // 阶段②:成功 —— res.code === 'APPLY_SUCCESS',拿 res.data.paymentToken
    const paymentToken = res.data.paymentToken
    // 阶段③:商户调用自己的下单/支付接口(demo 中的 orderAndPay)
    return postOrderAndPay({ paymentToken })        // 商户自有后端接口
  })
  .then(orderRes => {
    if (orderRes.code === 'APPLY_SUCCESS') applePay.emit('paySuccess')  // 通知组件支付成功,完成系统弹层
    else applePay.emit('payFail')
  })
  .catch(err => { /* err.code / err.msg 见 §3 */ applePay.emit('payFail') })

1. 通用:组件初始化加载 instance.on('load') ​

创建组件后 SDK 会拉取组件初始化配置,完成后通过 load 事件告知结果(四种组件同构,仅 type 不同):

JavaScript
const card = PMdropin.create('card', options)
card.on('load', (data) => {
  if (data.code === 'SUCCESS') {
    // 加载成功,可挂载并启用支付组件
  } else {
    // 加载失败,见下表
  }
})
codemsg(默认值)描述范围
SUCCESS空初始化成功。组件可正常使用全部
DROPIN_INIT_FAILFailed to initialize '{type}' Dropin!初始化阶段:组件创建后未能在规定时间内完成初始化(多为 create 配置、密钥/环境参数问题)。建议检查 create 参数后刷新重试全部
DROPIN_INIT_ACTIONS_FAILFailed to register '{type}' Dropin actions!初始化阶段:组件内部动作注册失败或等待初始化超时。建议刷新重试全部
DROPIN_INIT_GOOGLEPAY_FAILFailed to init 'googlePay' button!初始化阶段:Google Pay 按钮初始化失败——通常是 Google Pay JS 加载失败,或当前设备/浏览器不支持(HTTPS、系统版本、地区限制)。建议检查页面协议是否为 HTTPS、设备是否支持仅 googlepay
HTTP_ERRAn error occurred with the http request!初始化阶段:拉取初始化配置的请求发生网络层错误。建议检查网络后重试全部
<HTTP 状态码>statusText初始化阶段:服务端返回了错误 HTTP 状态(如 403 / 500)。code 即为状态码数字全部
<后端业务码>服务端 msg初始化阶段:初始化配置请求被服务端拒绝(如参数/密钥/商户状态异常)。按服务端 msg 处理,必要时联系技术支持全部

同一页面创建多个组件时,各组件会分别触发各自的 load,请分别监听。

2. Card(卡支付) ​

2.1 卡组件时序 ​

JavaScript
load(成功) → 用户填写卡信息 → on('form-check') 实时反馈校验状态
          → 点击支付 → emit('canMakePayment')
              ├─ 本地表单校验(见 2.2)
              ├─ 服务端受理(见 2.3)
              └─ 网络/超时(见 2.2)

2.2 表单校验阶段(on('form-check') 与 canMakePayment 本地校验) ​

form-check事件:用户输入过程中实时触发,负载为表单校验状态(不含 code),结构示例: { isFormValid, invalidReason, displayMsg, fieldStatus: { cardnum, expdate, cvv, name } }。

商户可监听它控制"支付"按钮的可点击状态:isFormValid === true 才允许发起支付。

emit('canMakePayment')被本地校验拦截时(表单无效直接 reject,不会请求服务端):

codemsg(默认值)描述范围
FORM_INVALID见描述提交支付时表单校验未通过:卡号/有效期/CVV/姓名缺失或格式错误(msg 给出具体原因,如 No selected card),或推荐卡模式下未选中卡。displayMsg 为字段双语文案。让用户修正后重试card
REQUEST_TIMEOUTerror.message 或 Unknown支付请求超时(默认 15 秒未收到回执)。可提示稍后重试card
UNKNOWN_ISSUEFailed to register '{type}' Dropin actions!未知/内部异常:请求网络错误或 SDK 内部未预期异常。建议重试,仍失败联系技术支持card

2.3 服务端受理阶段(emit('canMakePayment') 的 Promise 结果) ​

表单校验通过后,SDK 将卡信息提交服务端受理:

JavaScript
card.emit('canMakePayment', payload)
  .then(res  => { /* 成功 */ })
  .catch(err => { /* err.code / err.msg / err.displayMsg */ })
codemsg(默认值)描述范围
APPLY_SUCCESS服务端返回受理成功。 res 内含服务端返回的数据(如支付 token 等),可继续商户侧下单流程card
PARAMETER_INVALID服务端 msg服务端参数校验失败:提交的数据非法(卡信息不完整等)。按 msg 修正后重试card
SAVE_CARD_INFO_ERROR服务端 msg保存卡信息失败(服务端写入异常)。稍后重试,仍失败联系技术支持card
FORM_INVALID服务端 msg服务端判定表单字段非法(与 2.2 同名,但发生在服务端校验)。引导用户核对卡信息card
NO_SELECTED_CARD服务端 msg未选择要使用的卡(推荐卡场景)。请用户先选卡card
USER_INFO_NOT_COMPLETE服务端 msg附加的用户信息采集未完成:需要先引导用户在 userinfocollect 组件完成必填信息(如部分市场要求的收件人/证件信息),再重新支付card
REQUEST_TIMEOUT服务端 msg服务端处理超时。可提示稍后重试card
UNKNOWN_ISSUE服务端 msg服务端返回的未知错误card
其它后端码服务端 msg服务端自定义错误码: SDK 不识别时原样透传,同时 displayMsg 固定为通用兜底文案 ERROR ( Something went wrong, please try again. )。通用处理见附录 Bcard

关于displayMsg:卡组件的失败响应会附带 displayMsg({ en, ar }双语),可直接按用户语言展示;

其中 FORM_INVALID 场景的 displayMsg 是字段名映射结构,需要拼接提示(如 Field not valid: Card number)。

2.4 其它动作(无 code) ​

setDisabled / getFormValid / switchTheme / focus 等动作返回布尔值或表单状态,不含错误码;

switchTheme 等失败时其 Promise 会 reject 但无业务 code 含义。

3. Apple Pay ​

3.1 Apple Pay 时序(注意收尾动作) ​

JavaScript
load(成功) → 用户点击系统支付按钮 → on('payButtonClick') → 商户 emit('canMakePayment')
  → 弹出 Apple Pay 系统弹层 → 用户授权
      → SDK 内部:商户验证(applePaySession)→ 取 token(retrievePaymentToken)
  → resolve(res: APPLY_SUCCESS + data.paymentToken) 或 reject(err)
  → 商户拿 paymentToken 调自己的下单接口
  → 下单成功 emit('paySuccess')  / 下单失败 emit('payFail')   ← 决定系统弹层的完成/失败展示

重要:

Apple Pay 弹层的最终收尾由商户控制。canMakePayment resolve 后请务必先完成商户侧下单/支付,再调用 paySuccess;不要在下单成功前调用 paySuccess。

3.2 参数拦截 / 本地校验阶段 ​

以下 code 在调用 canMakePayment 后立即(弹层弹出前)返回:

codemsg(默认值)描述范围
REPEAT_REQUESTThe request is repeated重复请求:上一次支付流程尚未结束(弹层未关闭/未回执)时再次发起。请等待上次回调后再调用applepay
AMOUNT_INVALIDAmount is incorrect.金额格式非法:传入的 totalAmount 不是合法金额(需为整数或至多 2 位小数的数字)。修正参数后重试applepay
MIT_PARAMS_VALIDATION_ERROR聚合英文错误文本代扣(MIT/订阅)参数校验失败:支付参数携带订阅计划(subscriptionPlan)或 mitManagementUrl 时校验未通过。msg 为聚合的错误描述(如 subject is required),按附录 C 对照修正后重试applepay

3.3 用户授权 / 服务端受理阶段(弹层内) ​

codemsg(默认值)描述范围
APPLY_SUCCESS服务端返回授权受理成功。 res.data.paymentToken 为支付凭证,进入商户下单流程applepay
APPLE_PAY_SESSION_ERRORerror 信息商户验证失败: SDK 向服务端换取商户验证(applePaySession)时网络异常/失败,Apple Pay 弹层中断。可提示重试applepay
RETRIEVE_PAYMENT_TOKEN_ERRORerror 信息取 token 失败:获取支付凭证(retrievePaymentToken)时网络异常/失败。可提示重试applepay
其它后端码服务端 msg服务端在商户验证 / 取 token 阶段返回的业务错误码原样透传(如余额/额度/风控类拒绝)。通用处理见附录 Bapplepay

3.4 用户行为与内部异常 ​

codemsg(默认值)描述范围
APPLE_PAY_CANCELapplepay canceled用户主动取消:用户在系统弹层点了取消。不是错误,无需报错提示,重新引导支付即可applepay
APPLEPAY_INTERNAL_ERRORerror.messageSDK 内部异常:创建 Apple Pay 会话失败(多为环境不支持、配置缺失)。检查设备/环境与配置后重试applepay

4. Google Pay ​

4.1 时序 ​

JavaScript
load(成功) → 用户点击 Google Pay 系统按钮 → on('payButtonClick') → 商户 emit('canMakePayment')
  → 弹出 Google Pay 系统弹层 → 用户选卡授权
      → SDK 内部:取 token(retrievePaymentToken)→ 3DS/风控(apply3DS)
  → resolve(res: APPLY_SUCCESS + data.paymentToken) 或 reject(err)
  → 商户拿 paymentToken 调自己的下单接口(无系统弹层需要收尾)

4.2 参数拦截 / 本地校验阶段 ​

codemsg(默认值)描述范围
REPEAT_REQUESTThe request is repeated重复请求:上一次支付流程未结束时再次发起。等待上次回调后再调用googlepay
AMOUNT_INVALIDAmount is incorrect.金额格式非法: totalAmount 不是整数或至多 2 位小数的数字。修正参数后重试googlepay
MIT_PARAMS_VALIDATION_ERROR聚合英文错误文本代扣(MIT/订阅)参数校验失败。 msg 为聚合错误描述,按附录 C 修正后重试googlepay

4.3 用户授权 / 服务端受理阶段 ​

codemsg(默认值)描述范围
APPLY_SUCCESS服务端返回授权受理成功。 res.data.paymentToken 为支付凭证,进入商户下单流程googlepay
CANCELEDGoogle 返回用户主动取消: Google Pay 系统弹层被关闭(Google Pay 原生的 statusCode,SDK 原样透传)。非错误,重新引导支付即可googlepay
其它 Google 原生 statusCodeGoogle 返回Google Pay JS 返回的其它状态(如参数错误类,由 Google 定义),SDK 原样透传。可按 Google Pay 官方文档对照处理googlepay
其它后端码服务端 msg服务端在取 token / 3DS 阶段返回的业务错误码原样透传。通用处理见附录 Bgooglepay
no_paymentTokenno paymentTokenSDK 内部兜底: 服务端响应中缺少支付凭证。正常情况不应出现,出现请联系技术支持并附请求信息googlepay
异常缺少参数SDK 内部兜底: 内部调用参数缺失。正常情况不应出现googlepay

5. userinfocollect(用户信息采集) ​

  • 组件加载错误与 §1 完全一致(load 事件,type = 'userinfocollect')。

  • form-check 事件负载为采集表单状态({ isValid, invalidFields, needCollect, formData }),不含 code:商户可据此判断用户是否已填完必填信息、是否需要展示采集表单。

  • 该组件自身无支付业务错误码。若商户在卡支付时收到 USER_INFO_NOT_COMPLETE(见 §2.3),即表示采集信息未完成,请先引导用户完成采集后再支付。

6. 附录 ​

附录 A:code 速查索引表 ​

code出现入口阶段支付方式一句话含义
SUCCESSon('load')初始化全部组件加载成功
APPLY_SUCCESSemit('canMakePayment') resolve支付受理card / applepay / googlepay支付受理成功,拿到 paymentToken 可下单
DROPIN_INIT_FAIL / DROPIN_INIT_ACTIONS_FAILon('load')初始化全部组件初始化失败
DROPIN_INIT_GOOGLEPAY_FAILon('load')初始化googlepayGoogle Pay 按钮初始化失败/环境不支持
HTTP_ERR / HTTP 状态码on('load')初始化全部拉取初始化配置网络/服务端错误
REQUEST_TIMEOUTemit('canMakePayment') reject支付card(服务端亦可能返回)超时
FORM_INVALIDemit('canMakePayment') reject表单校验card卡表单无效(本地或服务端判定)
NO_SELECTED_CARDemit('canMakePayment') reject表单校验card推荐卡未选中
PARAMETER_INVALIDemit('canMakePayment') reject服务端受理card服务端参数校验失败
SAVE_CARD_INFO_ERRORemit('canMakePayment') reject服务端受理card保存卡信息失败
USER_INFO_NOT_COMPLETEemit('canMakePayment') reject服务端受理card用户附加信息采集未完成
UNKNOWN_ISSUEon('load') / canMakePayment reject各阶段card未知错误(本地或服务端)
AMOUNT_INVALIDemit('canMakePayment') reject参数校验applepay / googlepay金额格式非法
MIT_PARAMS_VALIDATION_ERRORemit('canMakePayment') reject参数校验applepay / googlepayMIT/订阅参数校验失败
REPEAT_REQUESTemit('canMakePayment') reject请求拦截applepay / googlepay上一次支付流程未结束时重复请求
APPLE_PAY_SESSION_ERRORemit('canMakePayment') reject弹层内商户验证applepay换取商户验证失败
RETRIEVE_PAYMENT_TOKEN_ERRORemit('canMakePayment') reject弹层内取 tokenapplepay取支付凭证失败
APPLE_PAY_CANCEL / CANCELEDemit('canMakePayment') reject用户交互applepay / googlepay用户取消(非错误)
APPLEPAY_INTERNAL_ERRORemit('canMakePayment') reject内部applepay创建支付会话内部异常

附录 B:未列出的服务端错误码,怎么处理? ​

收到不在本手册表格内的 code 时:

  1. 先看 msg:它是服务端返回的错误描述(多为英文),是最直接的定位信息;卡组件还可看 displayMsg(双语文案)直接展示给用户。

  2. 判断来源阶段:

  • 来自 on('load') → 初始化配置被拒绝(密钥/商户状态/参数问题);

  • 来自 emit('canMakePayment') reject → 支付受理被服务端拒绝(常见为余额不足、卡被拒、风控拦截、银行侧拒绝等)。

  1. 处理建议:
  • 把收到的 code + msg 原样透传/记录(不要自行改文案);

  • 向用户展示服务端文案或通用失败提示,不要对同一笔交易自动重试(可能造成重复扣款),引导用户重新发起;

  • 联系技术支持时请提供:商户号、时间、支付组件类型、收到的 code/msg、请求流水(requestId)。

附录 C:MIT / 订阅参数校验(MIT_PARAMS_VALIDATION_ERROR)错误文本解读 ​

失败时 msg 会返回一条或多条(; 连接)的英文描述,对照下表修正 canMakePayment 入参:

msg 片段含义正确取值示例
The mitManagementUrl is invalidmitManagementUrl 缺失或不是 http(s):// 开头的链接必须以 http(s):// 开头
subject is required订阅标题缺失subscriptionPlan.subject 为字符串
totalPeriods must be greater than or equal to 1总期数 < 1 或非整数subscriptionPlan.totalPeriods ≥ 1
periodUnit must be one of D, W, M, Y扣款周期单位非法subscriptionPlan.periodRule.periodUnit ∈ D/W/M/Y
periodCount must be greater than or equal to 1每期扣款间隔非法periodRule.periodCount ≥ 1
amount must be greater than or equal to 0每期金额非法periodAmount.amount ≥ 0
currency must be equal to XXX订阅币种与当前订单币种不一致periodAmount.currency 等须等于订单 currencyCode
currency must be a 3-character string币种不是 3 位字符串如 USD、SAR
firstPeriodStartDate must be in the future首期开始日期是过去时间需为未来的 RFC3339 时间(如 2026-10-01T00:00:00+08:00)
xxx must be of type xxx字段类型错误按提示传入对应类型
xxx is required / Invalid subscriptionPlan: ...嵌套对象(如 trialConfig)缺失或内部字段错误按提示补全嵌套字段

此页面的内容有帮助吗?

感谢您帮助改进 PayerMax 产品文档!

Released under the MIT License.