PAYATHON 2026

支付宝app端关闭周期/商家扣款后的挽留弹窗如何设置

支付阿杰

结论

用户在支付宝 App 中按“支付设置 → 自动续费/免密支付 → 关闭服务”的路径操作时,可能会看到挽留弹窗。这个页面通常不是商家在品牌 App 中通过支付宝支付 SDK 设置的,也无法通过普通签约或代扣接口直接控制。

解约挽留属于支付宝侧的运营能力。商家需要先联系支付宝对应的行业运营、商务或技术支持,确认该能力是否已开放,再通过支付宝提供的运营后台配置挽留方案。如果商家后台没有相关入口,通常说明当前账号或产品尚未开通,无法只靠客户端代码实现。

为什么不能在品牌 App 内设置

用户关闭服务时,操作页面位于支付宝 App 内。弹窗是否展示、向哪些用户展示,以及用户接受权益后是否保留签约关系,都由支付宝侧的流程控制。

品牌 App 通常只能处理以下事项:

  • 发起周期扣款或商家扣款签约;
  • 查询签约状态;
  • 接收签约、解约等异步通知;
  • 按照双方约定发放优惠券或会员权益。

品牌 App 无法直接在支付宝的系统页面中插入自定义弹窗,也不应通过遮挡或模拟页面等方式干预用户解约。

设置流程

1. 确认对应的签约产品

先整理需要配置挽留策略的签约信息:

  • 支付宝商户账号;
  • app_id;
  • 周期扣款或商家扣款产品类型;
  • 签约协议模板或产品标识;
  • 当前签约和解约链路;
  • 计划赠送的权益类型,例如优惠券、会员天数;
  • 权益库存、有效期及使用条件。

如果同一品牌使用多个 app_id、商户主体或协议模板,需要分别确认各自是否已开通该能力。

2. 向支付宝申请解约挽留能力

商家可以通过支付宝开放平台工单、对应商务或行业运营人员申请,并说明具体使用场景:

用户在支付宝 App 的自动续费/免密支付页面关闭指定服务时,希望展示优惠券或会员时长等挽留权益。

申请时需要确认:

  • 当前产品是否支持解约挽留;
  • 是否需要加入白名单或单独签约;
  • 配置入口位于哪个商家运营后台;
  • 支持哪些权益类型;
  • 权益由支付宝发放还是商家履约;
  • 是否会提供领取结果通知;
  • 用户领取权益后如何处理签约关系;
  • 是否有展示频次、库存和人群限制。

后台名称和菜单路径可能会因商户行业、产品权限及支付宝后台版本而异,应以支付宝为该商户开通后提供的入口为准。

3. 配置挽留方案

获得权限后,通常需要配置:

  • 适用的签约产品或协议;
  • 目标用户范围;
  • 弹窗文案;
  • 优惠券、会员天数等权益;
  • 权益有效期和使用门槛;
  • 单个用户可领取的次数;
  • 活动时间;
  • 总库存及每日库存;
  • 用户接受权益后的处理规则;
  • 权益领取失败时的降级方案。

如果规则涉及“领取权益后暂不解约”,必须在页面上明确告知用户,不能让用户误以为服务已经关闭。

4. 对接权益履约

如果权益由支付宝侧的券系统直接发放,商家通常只需完成活动和券模板配置。

如果会员天数或券包由商家系统发放,则需要根据支付宝实际提供的通知协议完成服务端履约。以下代码只用于说明处理结构,其中的字段名和签名方法均为占位示例,不能直接用于支付宝正式接口:

@PostMapping("/alipay/retention/benefit/notify")
public String handleBenefitNotify(HttpServletRequest request) {
    Map<String, String> parameters = extractParameters(request);

    // 必须使用支付宝正式文档规定的验签方法。
    boolean verified = verifyAlipaySignature(parameters);
    if (!verified) {
        return "failure";
    }

    String requestId = parameters.get("request_id");
    String agreementNo = parameters.get("agreement_no");
    String benefitType = parameters.get("benefit_type");

    // 使用支付宝通知中的唯一业务标识做幂等控制。
    if (benefitService.hasProcessed(requestId)) {
        return "success";
    }

    if ("MEMBER_DAYS".equals(benefitType)) {
        int days = Integer.parseInt(parameters.get("benefit_value"));
        benefitService.grantMemberDays(agreementNo, days, requestId);
    } else if ("COUPON".equals(benefitType)) {
        benefitService.grantCoupon(
            agreementNo,
            parameters.get("benefit_template_id"),
            requestId
        );
    }

    return "success";
}

正式开发时,通知地址、字段、验签算法、响应格式和重试机制都必须以支付宝为该能力提供的接入文档为准。在取得正式文档前,不建议自行预设接口名称或请求参数。

验收重点

上线前,应通过支付宝提供的测试方式或灰度环境验证以下内容:

  1. 目标签约产品能否命中挽留方案;
  2. 非目标产品是否不会误展示;
  3. 权益库存不足时能否正确降级;
  4. 重复通知是否会造成重复发券或重复增加会员天数;
  5. 用户拒绝权益后能否继续完成解约;
  6. 用户接受权益后,签约状态是否符合配置;
  7. 商家系统与支付宝侧的签约状态最终是否一致;
  8. 解约通知和权益通知乱序到达时,系统能否正确处理。

注意事项

  • 不要混淆品牌 App 内的“取消订阅弹窗”和支付宝 App 内的解约挽留弹窗,两者属于不同的处理链路。
  • 挽留活动不能阻止用户正常关闭服务,也不能设置不必要的操作障碍。
  • 优惠券使用门槛、会员有效期及是否自动续费等信息需要明确展示。
  • 权益发放接口必须验签,并使用唯一业务流水号实现幂等。
  • 不要只根据前端结果更新签约状态,应以支付宝正式查询接口或异步通知为准。
  • 如果商家后台找不到配置入口,应提交支付宝开放平台工单,并提供 app_id、商户主体和协议产品信息,请支付宝确认当前是否具备该能力。

备注:内容仅供参考。