商品额度核销接口

更新时间:

接口说明

接口名称:alipay.aipay.nowpay.quota.verify

按平台提供的消费请求号直接核销指定数量的次数或积分。核销成功即正式扣减;平台需结合服务交付时点调用,并保存消费请求与核销结果的对应关系。

支持已获授权的第三方代理调用。所有接口由平台服务端调用。

适用场景

  • 一次服务需要正式消耗次数或积分。
  • 同一消费请求因网络异常需要重试。

注意事项

  • amount 必须显式传入正整数;一次扣 1 次时传 1,不依赖服务端默认补值。积分按平台服务规则计算后传入。
  • 平台在调用前持久化 out_request_no、商品、受益人、amount 和 consume_reason。重试保持这些字段一致;不同消费使用不同请求号。
  • consume_reason 使用不超过 256 字符的简洁业务文本,用于说明本次消费。平台自行保存审计记录,不依赖结果查询接口回传此字段来恢复原始业务上下文。
  • 先检查 code,再读取 consume_status。只有 SUCCEEDED 表示扣减成功;PROCESSING、网络超时或系统错误都不能直接当作失败换号重扣。
  • 余额不足可能通过业务错误码 NOW_PAY_QUOTA_INSUFFICIENT 返回;也需兼容 FAILEDreason_code 的结果表达。额度不足整笔失败,不按部分扣减处理。
  • 核销成功后不提供核销撤销、预占释放或服务失败自动返还。平台应事先确定服务交付与核销的时点,并对服务执行本身做好幂等。

公共请求参数

参数类型是否必选最大长度描述示例值
app_idString必选32支付宝分配给开发者的应用IDYOUR_APP_ID
methodString必选128接口名称alipay.aipay.nowpay.quota.verify
formatString可选40仅支持JSONJSON
charsetString必选10请求使用的编码格式,如utf-8,gbk,gb2312等utf-8
sign_typeString必选10请求签名算法,推荐 RSA2RSA2
signString必选344商户请求参数的签名串,详见签名详见示例
timestampString必选19发送请求的时间,格式”yyyy-MM-dd HH:mm
2026-09-07 10:00:00
versionString必选3调用的接口版本,固定为:1.01.0
app_auth_tokenString可选40已获授权的第三方代调用场景使用的应用授权令牌,详见应用授权概述-
biz_contentString必选-业务请求参数的 JSON 字符串,字段使用 snake_case;详见下表-

业务请求参数

业务字段统一放入 biz_content。下表数组子字段使用 [] 表示元素路径。

参数类型是否必选最大长度描述注意事项/枚举值示例值
out_request_noString必选128平台生成的幂等请求号重试保持原值与原业务参数;不同请求使用不同值consume_20260907_000001
out_product_idString必选128平台内稳定的商品或应用标识-app_writing_001
external_owner_idString可选128平台内稳定的创作者或商品所有者标识与配置时使用的标识一致;不是必须填写支付宝账号creator_001
external_buyer_idString必选128平台内稳定的权益受益人标识与平台登录用户绑定;不等同于付款账号user_001
amountNumber必选-本次核销数量,单位次数或积分显式传入正整数;COUNT 单次扣减传 1;当前预览“长度/取值”为 999999991
consume_reasonString必选256本次业务消费的简洁原因文本必传普通文本,最长 256 字符;不传 JSON、用户隐私或提示词生成一篇文章

常见请求示例

示例商品、用户、域名及请求号均为演示值。Java 使用包含该接口请求类的支付宝服务端 SDK;示例按公钥模式初始化,私钥仅保存在平台服务端。cURL 中的签名需在发送前按全部实际参数生成;如增加 app_auth_token,应一起参与签名。

import com.alipay.api.AlipayConfig;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayAipayNowpayQuotaVerifyRequest;
import com.alipay.api.response.AlipayAipayNowpayQuotaVerifyResponse;

public class NowpayExample {
    public static void main(String[] args) throws Exception {
        AlipayConfig config = new AlipayConfig();
        config.setServerUrl("https://openapi.alipay.com/gateway.do");
        config.setAppId(System.getenv("ALIPAY_APP_ID"));
        config.setPrivateKey(System.getenv("ALIPAY_PRIVATE_KEY"));
        config.setAlipayPublicKey(System.getenv("ALIPAY_PUBLIC_KEY"));
        config.setFormat("json");
        config.setCharset("UTF-8");
        config.setSignType("RSA2");
        AlipayClient client = new DefaultAlipayClient(config);

        AlipayAipayNowpayQuotaVerifyRequest request = new AlipayAipayNowpayQuotaVerifyRequest();
        request.setBizContent("{\"out_request_no\":\"consume_20260907_000001\",\"out_product_id\":\"app_writing_001\",\"external_owner_id\":\"creator_001\",\"external_buyer_id\":\"user_001\",\"amount\":1,\"consume_reason\":\"生成一篇文章\"}");
        // 仅在已获授权的第三方代调用场景设置 app_auth_token。
        String appAuthToken = System.getenv("ALIPAY_APP_AUTH_TOKEN");
        if (appAuthToken != null && !appAuthToken.isEmpty()) {
            request.putOtherTextParam("app_auth_token", appAuthToken);
        }
        AlipayAipayNowpayQuotaVerifyResponse response = client.execute(request);
        if (!response.isSuccess()) {
            // 按 code/sub_code 处理;结果未知时保留原业务请求号。
            System.out.println(response.getCode() + ":" + response.getSubCode());
            return;
        }
        // 网关成功后,按本页“结果处理”读取业务字段。
        System.out.println(response.getBody());
    }
}
biz_content='{
  "out_request_no": "consume_20260907_000001",
  "out_product_id": "app_writing_001",
  "external_owner_id": "creator_001",
  "external_buyer_id": "user_001",
  "amount": 1,
  "consume_reason": "生成一篇文章"
}'

# app_id、timestamp、sign 由平台准备;sign 必须基于本次完整参数生成。
curl --request POST 'https://openapi.alipay.com/gateway.do' \
  --data-urlencode "app_id=${app_id}" \
  --data-urlencode 'method=alipay.aipay.nowpay.quota.verify' \
  --data-urlencode 'format=json' \
  --data-urlencode 'charset=UTF-8' \
  --data-urlencode 'sign_type=RSA2' \
  --data-urlencode "timestamp=${timestamp}" \
  --data-urlencode 'version=1.0' \
  --data-urlencode "biz_content=${biz_content}" \
  --data-urlencode "sign=${sign}"

公共响应参数

参数类型是否必选最大长度描述示例值
codeString必选-网关返回码;10000 表示接口调用成功10000
msgString必选-网关返回码说明Success
sub_codeString可选-业务错误码;仅用于接口失败处理-
sub_msgString可选-业务错误说明;不用于编写固定业务分支-
signString必选-响应签名,位于响应根对象;由 SDK 按配置验签-

响应业务对象名为 alipay_aipay_nowpay_quota_verify_response。先完成验签并判断 code,再读取业务结果。

业务响应参数

参数类型是否必选最大长度描述注意事项/枚举值示例值
consume_statusString必选32SUCCEEDED/FAILED/PROCESSING成功:SUCCEEDED;失败:FAILED;进行中:PROCESSINGSUCCEEDED
consume_order_idString可选128消费流水标识-202609071000000001
consume_reasonString必选256消费原因平台应持久化原始原因;查询结果可能不返回生成一篇文章
quota_unitString必选32次数或积分,COUNT/POINTCOUNT:次数;POINT:积分COUNT
consumedNumber必选32本次实际扣减量,单位次数或积分非成功状态按 0 处理,不据此确认成功1
remainingNumber特殊可选32本次核销成功时,原子扣减后的可消费余额SUCCEEDED 时使用;不是当前实时余额19
reason_codeString可选128业务结果原因码结合 decision 或 consume_status 使用;不要按原因文案编写业务分支-
update_timeString必选32更新时间;格式 yyyy-MM-dd HH:mm:ss,时区 Asia/Shanghai-2026-09-07 10:05:00

结果处理

情况平台处理
code=10000consume_status=SUCCEEDED确认本次扣减,保存 consumed、remaining、consume_order_id;避免重复交付
code=10000consume_status=FAILED按 reason_code 处理,不标记核销成功
code=10000consume_status=PROCESSING保留原请求号,调用 quota.refresh 查询
余额不足业务错误提示购买或补充额度,不标记消费成功
超时、系统错误、未知状态标记本地待确认,使用原请求查询或重试,不换号

code=10000 不能单独作为扣减成功依据;同样不能只处理 consume_status 而忽略网关失败。

响应示例

以下为按单一业务场景整理的示例。签名、链接令牌和二维码均为占位值,不可直接使用。

{
  "alipay_aipay_nowpay_quota_verify_response": {
    "code": "10000",
    "msg": "Success",
    "consume_status": "SUCCEEDED",
    "consume_order_id": "202609071000000001",
    "quota_unit": "COUNT",
    "consumed": 1,
    "remaining": 19,
    "update_time": "2026-09-07 10:05:00",
    "consume_reason": "生成一篇文章"
  },
  "sign": "RESPONSE_SIGNATURE_PLACEHOLDER"
}
{
  "alipay_aipay_nowpay_quota_verify_response": {
    "code": "20000",
    "msg": "Service Currently Unavailable",
    "sub_code": "isp.unknow-error",
    "sub_msg": "系统繁忙"
  },
  "sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"
}

余额不足错误示例

{
  "alipay_aipay_nowpay_quota_verify_response": {
    "code": "40004",
    "msg": "Business Failed",
    "sub_code": "NOW_PAY_QUOTA_INSUFFICIENT",
    "sub_msg": "额度不足"
  },
  "sign": "RESPONSE_SIGNATURE_PLACEHOLDER"
}

公共错误码

参见支付宝公共错误码。网关或系统异常时,按原请求查询或重试;写操作不能在结果未确认时更换幂等号。

业务错误码

以下保留当前开放平台预览已列出的错误码,并补充平台处理建议。错误码列表可能扩展,平台应保留未知错误的待确认处理。

错误码错误描述解决方案
SYSTEM_ERROR系统繁忙稍后使用原参数重试;消费结果未知时先查询原请求
INVALID_PARAMETER参数有误请根据接口返回的参数非法的具体错误信息,修改参数后进行重试
BILLING_MODE_NOT_SUPPORTED商品不是额度包模式请核对入参参数相关的商品配置信息
CONSUME_REQUEST_NOT_FOUND未找到匹配的幂等请求记录,请确认幂等号和请求状态核对原请求号与商品;继续查询或原参数重试核销,不因未找到记录直接换号
NOW_PAY_QUOTA_INSUFFICIENT额度不足提示购买或补充额度;本次不记为核销成功