服务商商家支付失败并提示未开通移动支付(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的错误码说明为准。 - 恢复支付前,还要同时确认收款权限和结算权限,避免支付成功后无法正常结算。
备注:内容仅供参考。
