PAYATHON 2026

服务商商家支付失败并提示未开通移动支付(310103)

支付小周

结论

错误 未开通移动支付(310103) 通常说明:商家在本次支付使用的商户号、支付宝账号或支付通道下,当前没有可用的移动支付权限。

这不代表商家从未开户。即使客户早在 2019 年就已开户,并且长期正常使用,也可能因产品签约状态、商户资料、服务商授权关系、支付通道配置或风控状态发生变化,突然出现这个错误。

310103 的具体触发条件要根据实际支付平台和接口判断。仅凭错误文本无法确定唯一原因,重复提交支付请求通常也解决不了问题。

常见原因

1. 移动支付产品权限失效

商家可能开通过相关产品,但当前状态已变为关闭、暂停、冻结、过期或需要重新签约。常见原因包括:

  • 商户主体资料或证件过期;
  • 支付产品协议到期;
  • 平台调整了签约或准入要求;
  • 商户因风控被限制部分收款能力;
  • 产品长期未使用,权限被暂停;
  • 商家自行关闭产品或误操作解约。

开户时间只能说明账号曾经存在,无法证明当前支付产品仍然有效。

2. 服务商与商家的授权关系发生变化

在服务商模式下,支付能力既取决于商家账号,也取决于商家是否仍授权当前服务商代为调用。

商家重新授权、撤销授权、更换服务商或授权令牌失效后,系统可能无法取得正确的支付账户信息,进而返回产品未开通或无权限类错误。

3. 请求使用了错误的商户身份

检查本次失败请求中的身份参数,确认它们与之前成功请求使用的参数一致,例如:

  • 服务商应用 ID;
  • 商家应用 ID;
  • 商户号或子商户号;
  • 支付宝账号对应的商家主体;
  • 授权令牌;
  • 门店或渠道编号;
  • 正式环境与沙箱环境。

还要检查缓存数据、数据库中的历史商户号,以及重新签约后生成的新身份信息。参数格式正确,不代表它对应的就是正确商家。

4. 支付渠道配置被修改

如果系统接入了聚合支付平台、银行通道或第三方服务商,这条错误信息可能来自上游渠道,并由当前系统原样转发。此时,“移动支付”未必是支付宝开放平台中的标准产品名称,也可能是中间渠道对某项能力的内部命名。

先确认 310103 是支付宝直接返回的,还是来自服务商平台、银行或聚合支付渠道。即使错误文本相同,来源不同,处理方式也可能不同。

5. 商家账户受到限制

账户状态异常、结算信息需要补充、实名信息发生变更,或者经营范围不再符合当前产品要求,都可能使原有支付能力无法使用。

这类限制通常不能通过修改代码解决。商家或服务商需要在对应平台补充资料、提交申诉或重新开通产品。

排查步骤

第一步:确认错误来自哪一层

保存本次请求的完整调用链,至少包括:

  • 请求时间;
  • 商户号和应用 ID,敏感字段需脱敏;
  • 调用的接口名称;
  • HTTP 状态码;
  • 上游业务错误码;
  • 上游业务错误信息;
  • 请求流水号或 traceId;
  • 支付渠道名称;
  • 服务商平台内部订单号。

不要只记录最终展示的 "Msg"。如果请求经过多个网关,需要找到响应中第一次出现 310103 的位置。

第二步:对比最近一次成功请求

找到同一商家最近一次成功支付的记录,与失败请求逐项比较:

  • 调用接口是否相同;
  • 商户号、子商户号是否变化;
  • 应用 ID 是否变化;
  • 授权令牌是否更新;
  • 支付场景是否由网页支付切换为移动端支付;
  • 通道或路由规则是否改变;
  • 商户配置是否重新发布;
  • 请求是否切换到生产环境。

如果只有部分商家失败,应先检查这些商家的签约和授权状态。如果所有商家同时失败,应先检查服务商应用、通道配置和平台侧变更。

第三步:检查商家的产品签约状态

由商家或有权限的服务商管理员登录实际提供支付能力的平台,确认:

  • 对应移动支付产品是否已经开通;
  • 产品状态是否为有效或生效中;
  • 商户主体资料是否完整;
  • 营业执照、法人证件等资料是否过期;
  • 是否有待签署的协议;
  • 是否存在风险限制或整改通知;
  • 收款和结算能力是否正常。

不能仅凭账号可以登录,就判断支付权限正常。账号状态和具体产品权限是两回事。

第四步:检查服务商授权

确认商家仍然授权当前应用和服务商,同时检查授权范围是否包含实际调用所需的支付能力。

如果近期重新授权或换绑过,需要同步更新系统保存的授权信息,清除失效缓存,并确认支付请求没有继续使用旧令牌或旧商户关系。

第五步:检查通道侧配置

如果错误由第三方支付渠道返回,应向该渠道确认:

  • 310103 的准确含义;
  • 商户产品状态;
  • 通道路由状态;
  • 最近是否调整过准入规则;
  • 是否需要重新报备或开通;
  • 商户是否被迁移到新的商户号。

提交工单时,应附上商户标识、失败时间、接口名称、请求流水号和脱敏后的响应。只提供错误截图,渠道方通常无法定位到具体请求。

代码处理示例

业务系统应把该错误视为商户能力或配置异常,停止无意义的自动重试,并保留完整的上游响应。

public PaymentResult handleUpstreamResponse(
        String merchantId,
        String orderNo,
        String traceId,
        UpstreamResponse response) {

    String code = response.getCode();
    String message = response.getMessage();

    logger.warn(
        "Payment failed: merchantId={}, orderNo={}, traceId={}, code={}, message={}",
        maskMerchantId(merchantId),
        orderNo,
        traceId,
        code,
        message
    );

    if ("310103".equals(code)
            || (message != null && message.contains("未开通移动支付(310103)"))) {
        return PaymentResult.failed(
            "MERCHANT_PAYMENT_CAPABILITY_UNAVAILABLE",
            "商家当前无可用的移动支付权限,请检查产品签约、服务商授权及商户状态"
        );
    }

    return PaymentResult.failed(
        "UPSTREAM_PAYMENT_FAILED",
        "支付渠道返回失败,请根据上游错误码处理"
    );
}

如果上游将错误放在 JSON 的 Msg 字段中,应先解析响应,不要直接依赖字符串截取:

ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(responseBody);

String code = root.path("Code").asText("");
String message = root.path("Msg").asText("");

boolean mobilePaymentUnavailable =
        "310103".equals(code)
        || message.contains("未开通移动支付(310103)");

if (mobilePaymentUnavailable) {
    // 标记为商户配置或产品权限异常,不进行自动重试
    alertMerchantOperator(merchantId, orderNo, message);
}

字段名应以实际接口响应为准。如果真实响应只有 Msg,没有独立的 Code,可以在系统内部提取并保存 310103,但不要擅自改变上游错误的含义。

解决方式

查明原因后,按具体情况处理:

  • 产品未开通、已关闭或已失效:由商家在对应支付平台重新申请或开通;
  • 商户资料过期:补充资料,等待平台审核生效;
  • 服务商授权失效:由商家重新授权,并更新系统中的授权信息;
  • 商户号或应用配置错误:修正商户映射和渠道参数;
  • 通道迁移或路由错误:按渠道方要求重新报备,或切换到正确通道;
  • 风控限制:根据平台通知提交整改或申诉;
  • 平台状态显示正常但仍然报错:携带请求流水号,联系实际返回 310103 的平台核查后台产品状态。

权限恢复后,先用小额订单进行验证,再恢复正常交易。不要对原支付订单无限重试,以免造成重复下单或订单状态不一致。

注意事项

  • 客户以前支付成功,不代表现在可以排除签约、授权或风控问题。
  • 账号”已开户”不等于具体支付产品”当前已生效”。
  • 不要尝试通过更换支付金额、修改订单号或高频重试绕过该错误。
  • 日志中不要记录完整的授权令牌、私钥、身份证号、银行卡号等敏感信息。
  • 如果错误来自中间服务商,应以该服务商对 310103 的错误码说明为准。
  • 恢复支付前,还要同时确认收款权限和结算权限,避免支付成功后无法正常结算。

备注:内容仅供参考。