PAYATHON 2026

PC 二维码支付能否接入医保支付?

支付阿杰

结论

普通的支付宝当面付二维码不能直接用于医保支付。

PC 端生成的支付宝收款二维码只能完成常规支付宝支付。医保支付还要核验参保身份、校验医保目录、上传费用明细,并处理统筹基金结算和个人账户支付,因此必须接入当地医保信息平台认可的支付渠道。

自助医药柜并非完全不能支持医保,但需要具备定点资质,并满足商品与处方合规、医保系统接入、终端认证等要求。能否实际落地,以设备投放地医保部门及相关平台的审核结果为准。

为什么普通支付二维码不能直接走医保

普通支付宝二维码对应商户收款订单,资金来自支付宝余额、银行卡或其他常规支付工具。医保支付使用另一套业务流程,通常包括:

  • 核验定点医药机构身份;
  • 核验参保人身份和医保电子凭证;
  • 上传药品编码、数量、单价及费用明细;
  • 校验医保目录和支付范围;
  • 执行处方、门诊统筹及个人账户使用规则;
  • 拆分医保基金支付金额和个人自费金额;
  • 处理结算、退费、对账和监管数据上报。

即使二维码由支付宝生成,也不能靠修改付款金额或二维码内容,把普通支付宝订单变成医保订单。

还需区分”用户扫描商户收款码”和”终端扫描用户医保码”这两种模式。部分地区要求用户出示医保电子凭证,再由医药机构的认证终端读取;另一些地区可能提供医保移动支付或线上授权流程。具体采用哪种模式、开放哪些接口,由当地医保平台决定。

推荐的接入步骤

1. 先确认经营和医保资质

先向设备投放地的医保部门或医保信息平台服务商确认:

  • 自助医药柜所属药店是否为医保定点零售药店;
  • 自助设备能否作为定点药店的延伸终端;
  • 哪些药品可以通过自助设备进行医保结算;
  • 处方药、非处方药和门诊统筹分别适用哪些规则;
  • 设备是否需要备案、实名认证、视频核验或药师审方;
  • 是否允许使用医保个人账户,是否支持医保统筹基金;
  • 是否支持支付宝内的医保电子凭证或医保移动支付。

“医保个人账户支付”与”医保统筹基金支付”是两项不同的能力,申请时需要分别确认。

2. 确定实际接入渠道

只申请支付宝当面付接口通常不够,还需要联系:

  • 当地医保信息平台或医保部门指定的接入机构;
  • 支付宝医保相关业务的服务渠道;
  • 具备相应资质的医保系统服务商、HIS 或药店系统供应商;
  • 自助终端硬件及安全认证服务商。

各地使用的接口、申请材料和验收流程可能不同,其他城市的方案不能直接照搬。

3. 设计双通道结算

自助医药柜可以把订单结算分为两个独立通道:

  1. 普通支付:生成支付宝、微信等普通收款二维码;
  2. 医保支付:依次完成医保身份核验、明细上传、待遇计算和医保结算。

医保结算完成后,如果仍有个人自费金额,再根据平台返回的结果发起普通支付。设备不能自行估算医保报销金额。

常见的业务流程如下:

选择商品
  -> 校验商品销售条件
  -> 判断是否申请医保结算
  -> 核验医保身份
  -> 上传费用明细
  -> 获取医保试算结果
  -> 用户确认
  -> 发起医保结算
  -> 支付个人自费部分
  -> 出货
  -> 保存结算与审计记录

4. 完成联调和验收

上线前至少要验证以下情况:

  • 医保目录内、目录外商品的处理;
  • 个人账户余额不足;
  • 统筹基金不可用或待遇受限;
  • 身份核验失败;
  • 重复结算和接口超时;
  • 医保成功但普通支付失败;
  • 支付成功但设备未出货;
  • 订单撤销、医保退费及部分退费;
  • 日终对账和异常订单补偿。

普通支付宝支付测试通过,只能说明常规支付链路可用,不能证明医保链路已经达到上线条件。

代码示例

下面的代码只用于说明系统如何区分普通支付和医保支付。接口路径和字段都是业务占位符,并非支付宝或医保平台的正式 API。实际开发时,必须替换为接入方提供的接口和参数。

async function createCheckout(order, paymentMode) {
  if (paymentMode === "ALIPAY_QR") {
    return createAlipayQrPayment({
      orderNo: order.orderNo,
      amount: order.totalAmount,
      subject: order.subject
    });
  }

  if (paymentMode === "MEDICAL_INSURANCE") {
    const eligibility = await medicalInsuranceClient.verifyEligibility({
      patientToken: order.patientToken,
      institutionCode: order.institutionCode
    });

    if (!eligibility.eligible) {
      throw new Error("当前订单不满足医保结算条件");
    }

    const estimate = await medicalInsuranceClient.estimate({
      institutionCode: order.institutionCode,
      orderNo: order.orderNo,
      items: order.items.map(item => ({
        medicalItemCode: item.medicalItemCode,
        quantity: item.quantity,
        unitPrice: item.unitPrice
      }))
    });

    return {
      channel: "MEDICAL_INSURANCE",
      insuranceAmount: estimate.insuranceAmount,
      personalAccountAmount: estimate.personalAccountAmount,
      cashAmount: estimate.cashAmount,
      settlementToken: estimate.settlementToken
    };
  }

  throw new Error("Unsupported payment mode");
}

正式结算还要使用唯一业务流水号,并做好幂等控制:

async function settleMedicalInsurance(order, settlementToken) {
  const result = await medicalInsuranceClient.settle({
    requestId: order.orderNo,
    settlementToken
  });

  if (result.status !== "SUCCESS") {
    throw new Error(`医保结算失败:${result.status}`);
  }

  if (result.cashAmount > 0) {
    return createAlipayQrPayment({
      orderNo: `${order.orderNo}-CASH`,
      amount: result.cashAmount,
      subject: "医保结算个人自费部分"
    });
  }

  return {
    status: "PAID",
    insuranceSettlementNo: result.settlementNo
  };
}

医保接口的请求和响应通常包含敏感信息。日志不得直接记录完整的医保凭证、身份证号、访问令牌或其他个人医疗数据。

注意事项

  • 不要把普通支付宝收款码宣传成”医保支付码”。
  • 不要按商品零售价自行计算医保支付金额,应使用医保平台返回的结算结果。
  • 药品在医保目录内,不代表在任何场景下都能报销。实际支付范围还可能受到处方、病种、定点关系和地区政策的影响。
  • 设备应根据最终结算状态决定是否出货,并妥善处理支付成功但出货失败后的退款或人工补偿。
  • 医保结算和普通支付需要分别对账。发生退款时,通常也要分别办理医保退费和普通支付退款。
  • 自助终端可能需要满足实名核验、密码键盘、扫码设备、网络安全、数据加密和终端备案等要求。
  • 各地的医保政策和技术接口存在差异。最终方案应以设备投放地医保部门、支付宝医保业务渠道及指定技术服务商提供的材料为准。

PC 展示的二维码可以作为交互入口,但普通支付宝二维码本身没有医保结算能力。正确的接入方式是先取得相关资质,接入当地医保结算体系,再按照获批流程生成医保授权或支付入口。

备注:内容仅供参考。