PAYATHON 2026

支付宝是否支持C扫B后由商家向个人付款的非转账产品?

支付老李

结论

支付宝通常没有一款通用支付产品,可以让个人扫描商家的付款码后,由商家直接向该个人付款。

C 扫 B一般是个人向商家付款的收单模式,资金方向为 C → B。当资金改为 B → C时,业务通常属于退款、转账、资金发放、现金红包或佣金结算,不再是普通的支付收单。二维码只能承载收款人或业务凭证等信息,不会改变资金业务的性质。

如果明确排除“转账”,能否实现主要取决于业务是否属于以下场景:

  • 原支付订单退款;
  • 营销奖励或现金红包;
  • 平台向入驻用户结算;
  • 保险理赔、公益发放等特定行业的资金发放;
  • 支付宝为特定行业提供的定制资金解决方案。

这些能力通常需要单独签约,并经过业务准入和风控审核,不代表商家可以向任意扫码者直接付款。

为什么不能直接使用付款码实现

付款码或二维码只是业务入口,不能决定资金流向。支付宝会结合交易目的、付款方、收款方、资金来源以及是否存在原始订单,判断应当使用哪一类产品。

常见的资金模式如下:

场景资金方向通常对应的产品类型
个人扫描商家码消费C → B当面付、扫码支付
商家退还原订单款项B → C交易退款
商家向个人发放资金B → C转账、资金发放或行业解决方案
商家发放营销奖励B → C现金红包等营销产品
平台向入驻方结算B → C分账、结算或资金账户产品

即使流程设计成“商家展示二维码,个人扫码”,实际的资金接口仍须使用退款、转账或特定的资金发放产品,不能通过收单支付接口反向付款。

可行的解决方案

有原始支付订单:使用退款

如果个人此前已向商家付款,商家可以基于原交易发起退款。退款资金原则上会退回原支付渠道,扫码者不能临时指定其他退款接收人。

常见接口为:

alipay.trade.refund

请求结构示例:

{
  "out_trade_no": "ORDER_202609090001",
  "refund_amount": "10.00",
  "out_request_no": "REFUND_202609090001",
  "refund_reason": "订单退款"
}

二维码可以用来识别订单,例如存放商户订单号或一次性业务凭证,但不能仅根据扫码者的支付宝身份向其付款。

没有原始订单:申请资金发放类产品

如果款项属于奖励、补贴、佣金或活动奖金,需要向支付宝确认是否有适合该行业的资金发放、现金红包或结算产品。申请时一般需要准备:

  1. 商户主体和行业资质;
  2. 完整的业务流程及资金流说明;
  3. 付款对象的来源和身份验证方式;
  4. 资金发放原因及对应凭证;
  5. 单笔金额、日交易量和退款机制;
  6. 防刷、防套现和异常交易处理方案。

具体产品名称、开放范围和准入条件可能会随商户类型及政策变化。应以支付宝开放平台中当前账号可申请的产品,以及支付宝商务或技术支持给出的审核结果为准。

二维码只负责领取,不直接承载付款

如果支付宝批准了相应的资金发放能力,可以采用以下流程:

商家生成一次性领取码
        ↓
个人扫码并完成支付宝身份授权
        ↓
商家服务端校验领取资格
        ↓
服务端调用已签约的资金发放接口
        ↓
记录结果并将领取码置为已使用

二维码中建议只存放一次性令牌:

{
  "claim_token": "a4f98d3e7c...",
  "expires_at": 1788944400
}

服务端必须校验令牌,不能直接信任客户端提交的用户标识:

async function claimReward(claimToken, authorizedUserId) {
  const claim = await loadClaim(claimToken);

  if (!claim || claim.status !== "PENDING") {
    throw new Error("领取码无效或已使用");
  }

  if (claim.expiresAt < Date.now()) {
    throw new Error("领取码已过期");
  }

  await verifyClaimEligibility(claim, authorizedUserId);

  // 此处只能调用商户已经签约并获准使用的资金发放接口。
  const result = await payoutProvider.send({
    requestId: claim.requestId,
    userId: authorizedUserId,
    amount: claim.amount
  });

  await markClaimCompleted(claim.id, result);
  return result;
}

payoutProvider.send只是业务层的占位方法,并非支付宝官方 API 名称。实际接口必须按照支付宝为该商户开通的产品文档实现,不能据此自行拼接接口地址或参数。

注意事项

  • alipay.trade.refund只能用于真实的原交易退款,不能用来向任意扫码用户付款。
  • 不要通过虚构交易后再退款的方式发放资金。这种做法可能触发风控,也会带来合规和账务问题。
  • 二维码中不能直接包含可重复使用的付款凭证、私钥、完整用户信息或敏感业务参数。
  • 领取码应设置有效期、使用次数和幂等请求号,避免截图转发、重复领取和并发支付。
  • 向个人发放佣金、奖励或补贴,可能涉及实名校验、税务处理、反洗钱和营销合规要求。
  • 如果产品要求排除“普通转账”,应先向支付宝说明实际业务目的,不要只将其描述为“反向扫码支付”。支付宝会根据业务实质判断可以接入的产品类型。

如果需求只是“谁扫商家的码,商家就向谁付款”,同时又没有原交易或经过审批的资金发放场景,通常不能作为标准支付产品接入。商家需要先明确款项性质,再申请退款、营销资金发放、平台结算或相应的行业解决方案。

备注:内容仅供参考。