PAYATHON 2026

支付宝小程序支付提示ISV权限不足,是否需审核上线?

支付小周

结论

调用支付宝正式环境的小程序支付,通常需要满足以下条件:

  • 小程序已通过审核并发布上线;
  • “小程序支付”等相关能力已签约并生效;
  • 请求使用的 app_id、商户账号和应用公钥配置属于同一套应用;
  • ISV 代商户调用时,商户已完成应用授权,并传入有效的 app_auth_token。

因此,小程序尚未上线时,即使自查工具显示产品已绑定,仍可能因为正式支付权限尚未生效而返回”ISV权限不足”。不过,审核上线并非唯一原因。如果上线后仍然报错,还需检查应用身份、接口权限和第三方授权关系。

为什么产品已绑定仍然提示权限不足

“产品已绑定”只表示控制台已建立产品或能力关联,不代表当前接口请求一定有调用权限。支付宝服务端还会检查:

  • 请求中的 app_id 是否属于当前小程序;
  • 调用的接口是否已添加到该应用;
  • 支付产品是否已签约并生效;
  • 小程序是否达到该能力要求的发布状态;
  • 签名私钥是否与该 app_id 配置的应用公钥匹配;
  • ISV 是否已获得商户对当前应用的授权;
  • app_auth_token 是否属于当前商户,以及是否有效或已被撤销;
  • 是否混用了正式环境和沙箱环境的网关、账号或密钥。

报错中的 code: 500 是业务系统封装后的 HTTP 或应用错误码。排查时应查看支付宝接口原始返回中的 code、sub_code、sub_msg 和 request_id,不能只根据 PHP 异常堆栈判断原因。

建议的处理步骤

1. 确认小程序状态

进入支付宝开放平台,确认当前小程序是否已经通过审核并发布。

如果尚未上线,先查看”小程序支付”能力页面是否明确要求应用上线后才能生效。如果有这项要求,需要等版本发布后再验证正式环境支付。开发阶段可以使用支付宝提供的沙箱或相应测试能力,但沙箱账号、网关和密钥必须配套使用。

2. 检查支付能力的实际状态

除了”已添加”或”已绑定”,还要确认:

  • 产品签约状态是否为已生效;
  • 商户主体是否完成必要认证;
  • 小程序与商户号是否正确关联;
  • 当前调用的具体 API 是否包含在已开通的能力中;
  • 相关能力是否仍处于审核中、待签约或待生效状态。

服务端创建交易时常用的 API 是:

alipay.trade.create

前端取得支付宝返回的交易号后,再调用:

my.tradePay({
  tradeNO: tradeNo,
  success: (result) => {
    console.log(result);
  },
  fail: (error) => {
    console.error(error);
  }
});

其中,tradeNO 应使用支付宝创建交易后返回的 trade_no,不能直接传入商户订单号 out_trade_no。

3. 核对请求使用的 app_id

服务端 SDK 配置的 app_id 必须是已经开通支付能力的小程序应用 ID。常见问题包括:

  • 使用了其他网页应用或生活号的 app_id;
  • 测试环境和正式环境读取了不同的配置;
  • 修改环境变量后,没有刷新 PHP-FPM 或配置缓存;
  • 多商户系统按租户切换配置时,读取了错误的应用。

可以在发起请求前记录脱敏后的关键配置:

Yii::info([
    'app_id' => $config['app_id'],
    'gateway' => $config['gateway_url'],
    'api' => 'alipay.trade.create',
    'has_app_auth_token' => !empty($appAuthToken),
    'out_trade_no' => $outTradeNo,
], 'alipay.payment');

不要将应用私钥、完整授权令牌或用户敏感信息写入日志。

4. ISV 模式下检查商户授权

错误信息中出现”ISV权限不足”时,需要先确认这次调用是商户自行调用,还是服务商代商户调用。

如果由 ISV 代商户发起支付,通常需要满足以下条件:

  1. 商户已授权当前 ISV 应用;
  2. 服务端已取得该商户对应的 app_auth_token;
  3. 调用支付接口时传入该令牌;
  4. 令牌对应的商户与收款主体一致;
  5. 授权范围包含当前调用的支付能力。

示意代码如下:

$request = new AlipayTradeCreateRequest();

$request->setBizContent(json_encode([
    'out_trade_no' => $outTradeNo,
    'total_amount' => number_format($amount, 2, '.', ''),
    'subject' => $subject,
    'buyer_id' => $buyerId,
], JSON_UNESCAPED_UNICODE));

// 不同版本 PHP SDK 的 execute() 参数定义可能不同,
// 应以当前 SDK 的方法签名为准。
$response = $aopClient->execute(
    $request,
    null,
    $appAuthToken
);

如果商户使用自己的小程序和支付宝应用直接收款,通常不应传入其他 ISV 应用的 app_auth_token。错误传入令牌后,支付宝可能会将请求视为代商户调用,并进行相应的权限校验。

5. 输出支付宝原始错误字段

建议在异常处理逻辑中保留支付宝的原始响应,至少记录以下字段:

$result = [
    'code' => $response->code ?? null,
    'msg' => $response->msg ?? null,
    'sub_code' => $response->sub_code ?? null,
    'sub_msg' => $response->sub_msg ?? null,
    'request_id' => $response->request_id ?? null,
];

对外接口可以返回简化后的提示,但服务端日志应保留 sub_code 和 request_id,方便后续定位:

if (($response->code ?? '') !== '10000') {
    Yii::error($result, 'alipay.payment');

    throw new \RuntimeException(
        $response->sub_msg
        ?? $response->msg
        ?? '支付宝支付请求失败'
    );
}

响应对象的字段访问方式可能随支付宝 PHP SDK 版本而异,应以实际返回结构为准。

上线后仍然报错怎么办

如果小程序已经发布,但错误仍然存在,可以按以下顺序排查:

  1. 确认线上服务读取的是正式应用配置;
  2. 确认 app_id 与已上线的小程序一致;
  3. 确认支付产品和具体 API 已经生效;
  4. 核对应用私钥与支付宝后台配置的应用公钥;
  5. ISV 模式下重新检查商户授权和 app_auth_token;
  6. 检查是否混用了沙箱环境和正式环境;
  7. 携带支付宝返回的 request_id、sub_code、调用时间和 app_id,联系支付宝开放平台技术支持。

注意事项

  • 小程序审核和支付产品签约是两套独立状态,需要分别确认。
  • 体验版、预览版能否调用真实支付,取决于当前能力的开放规则,不能仅凭”产品已绑定”判断。
  • 不要通过反复更换密钥来处理权限错误。签名错误和权限不足通常不是同一类问题,应先查看支付宝返回的原始 sub_code。
  • 页面中的异常堆栈暴露了服务器绝对路径。生产接口不应将 detail 原样返回给客户端,而应记录在受控日志中,对外只返回统一的错误信息。
  • 支付金额、商户订单号和收款主体必须由服务端生成并校验,不能直接信任小程序前端传入的数据。

备注:内容仅供参考。