PC 二维码支付能否接入医保支付?
结论
普通的支付宝当面付二维码不能直接用于医保支付。
PC 端生成的支付宝收款二维码只能完成常规支付宝支付。医保支付还要核验参保身份、校验医保目录、上传费用明细,并处理统筹基金结算和个人账户支付,因此必须接入当地医保信息平台认可的支付渠道。
自助医药柜并非完全不能支持医保,但需要具备定点资质,并满足商品与处方合规、医保系统接入、终端认证等要求。能否实际落地,以设备投放地医保部门及相关平台的审核结果为准。
为什么普通支付二维码不能直接走医保
普通支付宝二维码对应商户收款订单,资金来自支付宝余额、银行卡或其他常规支付工具。医保支付使用另一套业务流程,通常包括:
- 核验定点医药机构身份;
- 核验参保人身份和医保电子凭证;
- 上传药品编码、数量、单价及费用明细;
- 校验医保目录和支付范围;
- 执行处方、门诊统筹及个人账户使用规则;
- 拆分医保基金支付金额和个人自费金额;
- 处理结算、退费、对账和监管数据上报。
即使二维码由支付宝生成,也不能靠修改付款金额或二维码内容,把普通支付宝订单变成医保订单。
还需区分”用户扫描商户收款码”和”终端扫描用户医保码”这两种模式。部分地区要求用户出示医保电子凭证,再由医药机构的认证终端读取;另一些地区可能提供医保移动支付或线上授权流程。具体采用哪种模式、开放哪些接口,由当地医保平台决定。
推荐的接入步骤
1. 先确认经营和医保资质
先向设备投放地的医保部门或医保信息平台服务商确认:
- 自助医药柜所属药店是否为医保定点零售药店;
- 自助设备能否作为定点药店的延伸终端;
- 哪些药品可以通过自助设备进行医保结算;
- 处方药、非处方药和门诊统筹分别适用哪些规则;
- 设备是否需要备案、实名认证、视频核验或药师审方;
- 是否允许使用医保个人账户,是否支持医保统筹基金;
- 是否支持支付宝内的医保电子凭证或医保移动支付。
“医保个人账户支付”与”医保统筹基金支付”是两项不同的能力,申请时需要分别确认。
2. 确定实际接入渠道
只申请支付宝当面付接口通常不够,还需要联系:
- 当地医保信息平台或医保部门指定的接入机构;
- 支付宝医保相关业务的服务渠道;
- 具备相应资质的医保系统服务商、HIS 或药店系统供应商;
- 自助终端硬件及安全认证服务商。
各地使用的接口、申请材料和验收流程可能不同,其他城市的方案不能直接照搬。
3. 设计双通道结算
自助医药柜可以把订单结算分为两个独立通道:
- 普通支付:生成支付宝、微信等普通收款二维码;
- 医保支付:依次完成医保身份核验、明细上传、待遇计算和医保结算。
医保结算完成后,如果仍有个人自费金额,再根据平台返回的结果发起普通支付。设备不能自行估算医保报销金额。
常见的业务流程如下:
选择商品
-> 校验商品销售条件
-> 判断是否申请医保结算
-> 核验医保身份
-> 上传费用明细
-> 获取医保试算结果
-> 用户确认
-> 发起医保结算
-> 支付个人自费部分
-> 出货
-> 保存结算与审计记录
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 展示的二维码可以作为交互入口,但普通支付宝二维码本身没有医保结算能力。正确的接入方式是先取得相关资质,接入当地医保结算体系,再按照获批流程生成医保授权或支付入口。
备注:内容仅供参考。
