一、商户视角:支付即开票,销售完成同步完成开票全流程
未来之窗完成微信支付电子发票系统对接后,商户可真正实现销售完成即开票、支付即开票的数字化经营模式,从根源解决传统线下经营开票的各类痛点。从经营端来看,消费者完成微信支付结算后,支付账单页会自带官方开票入口,顾客可自主填写个人或企业抬头信息提交申请,无需商户前台人工登记、录入信息;同时支持收银小票二维码扫码开票、小程序订单开票等补充渠道,适配到店消费、线上外卖、线下缴费等全场景。对商户而言,整套流程全程无需人工介入,省去纸质打印机、热敏耗材采购与设备维护成本,高峰时段不用单独安排人员专职处理开票,大幅释放门店人力;订单、支付流水、发票数据自动关联,财务对账不用逐笔人工匹配,结算效率显著提升。消费者开具的电子发票直接存入微信卡包,不易丢失、便于报销追溯,商户服务体验同步升级,同时无纸化开票契合低碳绿色经营要求。
支付页开票操作流程
二、电子发票相关政策基础
当前全国全面推行发票电子化改革,依据《中华人民共和国发票管理办法》及实施细则、中办国办《关于进一步深化税收征管改革的意见》相关要求,目标实现发票全领域、全环节、全要素电子化,降低市场主体制度性交易成本
。政策明确电子发票、全面数字化电子发票(数电发票)与纸质发票具备同等法律效力,任何单位不得拒收,可正常用于报销、财务入账、维权凭证
。国家税务总局在全国范围推广数电发票,统一发票编码、标准化防伪,支持数字化流转存储;财会相关配套文件同步规范电子凭证归档标准,企业可直接留存电子发票版式文件完成财务存档,无需打印纸质归档。同时税务端依托数字化发票体系实现交易数据可追溯,引导商户规范开票经营,简化企业财税管理流程,鼓励商户接入支付 + 自动开票一体化数字化方案。
三、开发者接入流程说明
服务商、技术开发人员可依托微信支付开放接口,完成未来之窗与电子发票系统对接,整体分为四大阶段:
- 商户开通授权
调用 获取开通服务商电子发票能力邀请链接接口,生成邀请二维码 / 小程序跳转链接,提供给商户法人、超管扫码授权开通;支持两种开票模式:腾讯数电发票模式、商户自建 / 第三方发票系统模式,按需选择餐饮、不动产租赁、成品油对应行业开票能力;可通过商户号或税号精准匹配受邀商户,生成唯一邀请编码跟踪开通状态。 - 基础配置初始化
商户授权完成后,调用接口创建电子发票卡券模板,同步配置系统回调地址,用于接收开票、插卡、抬头填写、作废冲红等各类消息通知;可自主开启支付账单开票入口、专用发票开具权限等功能开关。 - 用户开票申请受理
用户通过支付页、扫码渠道提交开票申请后,系统接收抬头填写完成通知,调用接口获取用户提交的抬头、税号等完整开票信息,关联商户销售订单数据。 - 开票与后续管理
-
腾讯数电模式:直接调用对应行业开票接口自动生成发票,支持冲红作废、发票信息查询、版式文件下载;发票开具完成后自动推送至用户微信卡包,同步接收插卡成功通知。 -
自建 / 第三方开票模式:商户自有系统完成开票后,上传发票文件并调用插卡接口,将电子发票推送至消费者卡包,全流程数据互通可追溯。整套接口遵循微信支付 APIv3 统一签名、加密规范,提供 Java、Go 多语言开发示例,配套状态码、异常处理规则,降低开发调试门槛。
卡包发票查看、作废通知界面
四、系统适配覆盖多行业经营场景
该自动开票系统适配绝大多数线下实体与线上经营业态,高频消费场景落地优势尤为突出:
- 通用高频服务业
:餐饮、酒店住宿、连锁零售、商超、便利店等,顾客消费频次高、开票需求零散,支付即开票可大幅缓解前台收银压力,适配到店、外卖多渠道订单; - 不动产租赁类
:停车场、公寓商铺租赁、写字楼物业等,支持不动产专项开票能力,停车缴费、租金支付完成后即时开票,无需留存纸质小票; - 成品油行业
:加油站可启用成品油专属开票模块,适配油品销售特殊开票规范; - 其他拓展场景
:出租车、文旅景区、健身房、水电气缴费、培训机构、线下门店缴费等,均可接入使用。不同行业仅需在商户开通阶段选择对应行业开票能力,无需单独改造底层对接逻辑,一套系统即可覆盖多业态商户开票需求,连锁多门店、多子商户主体也可通过服务商统一管控全部开票权限与数据 -
开发代码 -
package com.java.partner;import com.java.demo.CheckSubMchStatus;import com.java.demo.CheckSubMchStatus.CheckSubMchStatusRequest;import com.java.demo.CheckSubMchStatus.CheckSubMchStatusResponse;import com.java.demo.CheckSubMchStatus.DigitalTaxAbilityInfo;import com.java.demo.CheckSubMchStatus.DigitalTaxApplyStatus;import com.java.demo.CheckSubMchStatus.DigitalTaxBillingPersonInfo;import com.java.demo.CheckSubMchStatus.DigitalTaxMode;import com.java.demo.CheckSubMchStatus.ThirdMode;import com.java.demo.CheckSubMchStatus.ThirdModeStatus;import com.java.demo.GetSpInviteUrl; //import com.java.demo.GetSpInviteUrl.FapiaoAbilityType;import com.java.demo.GetSpInviteUrl.GetSpInviteUrlRequest;import com.java.demo.GetSpInviteUrl.GetSpInviteUrlResp;import com.java.demo.GetSpInviteUrl.InviteOperationType;import com.java.demo.GetSpInviteUrl.InvoiceMode;import com.java.demo.ListSpInviteMchInfo; //import com.java.demo.ListSpInviteMchInfo.ListSpInviteMchInfoRequest;import com.java.demo.ListSpInviteMchInfo.ListSpInviteMchInfoResp;import com.java.demo.ListSpInviteMchInfo.MchInviteResultInfo;import com.java.demo.ListSpInviteMchInfo.MchInviteStatus;import com.java.utils.WXPayUtility;import java.time.LocalDateTime;import java.time.ZoneId;import java.time.format.DateTimeFormatter;import java.util.ArrayList;import java.util.List;import java.util.Objects;public class InviteMerchantDemo {public static void main(String[] args) {// TODO: 请准备商户开发必要参数,参考:GetSpInviteUrl getInvite = new GetSpInviteUrl("19xxxxxxxx",// 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考"1DDE55AD98Exxxxxxxxxx", // 商户API证书序列号"/path/to/apiclient_key.pem", // 商户API证书私钥文件路径,本地文件路径"PUB_KEY_ID_xxxxxxxxxxxxx", // 微信支付公钥ID,"/path/to/wxp_pub.pem" // 微信支付公钥文件路径,本地文件路径);ListSpInviteMchInfo listSpInviteMchInfo = new ListSpInviteMchInfo("19xxxxxxxx",// 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考"1DDE55AD98Exxxxxxxxxx", // 商户API证书序列号,"/path/to/apiclient_key.pem", // 商户API证书私钥文件路径,本地文件路径"PUB_KEY_ID_xxxxxxxxxxxxx", // 微信支付公钥ID,如何获取请参考"/path/to/wxp_pub.pem" // 微信支付公钥文件路径,本地文件路径);CheckSubMchStatus checkSubMchStatus = new CheckSubMchStatus("19xxxxxxxx",// 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考"1DDE55AD98Exxxxxxxxxx", // 商户API证书序列号,如何获取请参考"/path/to/apiclient_key.pem", // 商户API证书私钥文件路径,本地文件路径"PUB_KEY_ID_xxxxxxxxxxxxx", // 微信支付公钥ID,如何获取请参考"/path/to/wxp_pub.pem" // 微信支付公钥文件路径,本地文件路径);GetSpInviteUrlRequest inviteRequest = new GetSpInviteUrlRequest();inviteRequest.operationType = InviteOperationType.AUTH_BINDING;inviteRequest.fapiaoMode = new ArrayList<>();{inviteRequest.fapiaoMode.add(InvoiceMode.THIRD_OR_SELF_FAPIAO);}inviteRequest.fapiaoAbilityTypeList = new ArrayList<>();{inviteRequest.fapiaoAbilityTypeList.add(FapiaoAbilityType.BASE_ABILITY);}// 服务商设置标识此次邀请链接生成的渠道inviteRequest.inviteChannel = "miniprogram";// 服务商设置标识此次邀请链接生成的操作人员inviteRequest.operateUser = "mI7HGEJ4Q2B91IGjHZu/Gthm87Szv0MK2AoC0/3ZMDgltMtdoY6O0qZ4F1iXiwCuqkkBe+9M4ggvdzRVVVB9s+zLEQ8" +"nv74vsgl77MZx14nd5obtCcfAvPfDJob3oG7FqlThmYKJqjiOwBvvQse7p9R8onj/POzSrbM8re8ZYGp4LcehXopTLdk2ZVWRv8bnJgKZeY4vpMmq4xuRTYk6xNXvowBBKLu4oaNFNdBO3fip1a1rFW0vRw==";inviteRequest.inviteCode = "code_20200101_123";// 子商户号非必填,如果填入表示这个链接只能邀请这个商户号,如果未填表示商户扫码后,需要手动输入商户号或者微信支付订单号来进行开通inviteRequest.subMchid = "19998278783";ListSpInviteMchInfoRequest listSpInviteMchInfoRequest = new ListSpInviteMchInfoRequest();final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(ZoneId.of("Asia/Shanghai"));LocalDateTime now = LocalDateTime.now();// 定时查询当前时间过去10分钟之内邀请的商户信息listSpInviteMchInfoRequest.queryTimeStart = dateTimeFormatter.format(now.minusMinutes(10).atOffset(ZoneOffset.ofHours(8)));// 查询时间间隔不能查过7天listSpInviteMchInfoRequest.queryTimeEnd = dateTimeFormatter.format(now.atOffset(ZoneOffset.ofHours(8)));// 查询开始的起始位置listSpInviteMchInfoRequest.offset = 0L;listSpInviteMchInfoRequest.limit = 10L;// 与获取邀请链接时传入的inviteCode保持一致listSpInviteMchInfoRequest.inviteCode = "code_20200101_123";// 只有邀请成功的商户信息,才会同步返回商户号listSpInviteMchInfoRequest.mchInviteStatus = MchInviteStatus.MCH_INVITE_SUCC;try {GetSpInviteUrlResp response = getInvite.run(inviteRequest);//将inviteUrl转换为二维码,商户通过微信扫码后,//可以跳转到微信支付服务商电子发票能力开通页面,引导用户完成授权开通服务商电子发票能力。System.out.println("inviteUrl: " + response.inviteUrl);//通过指引,使用miniprogramAppid,miniprogramPath//引导商户跳转到微信支付服务商电子发票能力开通页面,完成授权开通服务商电子发票能力。System.out.println("miniprogramAppid: " + response.miniprogramAppid);System.out.println("miniprogramPath: " + response.miniprogramPath);// 等待商户操作完成开通// 如果服务商不知晓邀请商户的商户号,可以通过定时任务获取邀请确认授权成功的商户的商户号信息ListSpInviteMchInfoResp listSpInviteMchInfoResp = listSpInviteMchInfo.run(listSpInviteMchInfoRequest);List<MchInviteResultInfo> mchInviteResultList = listSpInviteMchInfoResp.mchInviteResultList;for (MchInviteResultInfo mchInviteResultInfo : mchInviteResultList) {if (mchInviteResultInfo.mchInviteStatus == MchInviteStatus.MCH_INVITE_SUCC) {// 如果是邀请成功状态的商户,可以获取到商户的商户号,用于检查商户的开通授权状态String subMchid = mchInviteResultInfo.subMchid;CheckSubMchStatusRequest checkSubMchStatusRequest = new CheckSubMchStatusRequest();checkSubMchStatusRequest.subMchid = subMchid;// 服务商获取商户的商户号信息后,请求【检查子商户开票功能状态】(接口获取商户开通状态CheckSubMchStatusResponse checkSubMchStatusResponse = checkSubMchStatus.run(checkSubMchStatusRequest);if (subMchid.equals(checkSubMchStatusResponse.subMchid)) {ThirdMode thirdMode = checkSubMchStatusResponse.thirdMode;DigitalTaxMode digitalTaxMode = checkSubMchStatusResponse.digitalTaxMode;// 【获取邀请开通的商户信息】邀请开通 【THIRD_OR_SELF_FAPIAO:第三方/自建发票】。检查该模式开通状态if (Objects.nonNull(thirdMode)) {ThirdModeStatus status = thirdMode.status;}// 获取邀请开通的商户信息】邀请开通 【TENCENT_DIGITAL_TAX:腾讯数电发票】。检查该模式开通状态if (Objects.nonNull(digitalTaxMode)) {// 数电发票接入状态,根据【检查子商户开票功能状态】状态描述判断用户开通的情况DigitalTaxApplyStatus digitalTaxApplyStatus = digitalTaxMode.status;List<DigitalTaxBillingPersonInfo> billingPersonInfoList = digitalTaxMode.billingPersonInfo;for (DigitalTaxBillingPersonInfo digitalTaxBillingPersonInfo : billingPersonInfoList) {// 商户在乐企平台上设置了开票员信息,才会返回对应开票员的开票员ID,用于开具数电发票接口,请求入参String billingPersonId = digitalTaxBillingPersonInfo.id;}// 商户完成所有操作后,完成接入腾讯数电后的时间String accessTime = digitalTaxMode.accessTime;String expiredTime = digitalTaxMode.expiredTime;String accessFailReason = digitalTaxMode.accessFailReason;List<DigitalTaxAbilityInfo> abilityInfo = digitalTaxMode.abilityInfo;}}} else {// 如果是邀请失败状态的商户,获取商户的商户名称,以及邀请开通失败的原因。// 根据开通小程序页面下的帮助指引,指导商户解决问题重试开通授权流程String epName = mchInviteResultInfo.epName;String inviteFailedReason = mchInviteResultInfo.inviteFailedReason;}}} catch (WXPayUtility.ApiException e) {// 处理异常处理逻辑if (e.getErrorCode().equals("SYSTEM_ERROR")) {// 错误:系统错误// 解决方式:稍后重试// 描述:微信支付系统失败,建议等1分钟后再重试} else if (e.getErrorCode().equals("FREQUENCY_LIMITED")) {// 错误:限频报错// 解决方式:稍后重试// 描述: 接口频率限制,一定要原单重试,建议等1分钟后再重试} else if (e.getErrorCode().equals("ERROR")) {// 错误:系统错误// 解决方式:系统繁忙,请稍后重试// 描述:微信支付系统失败,建议等1分钟后再重试} else if (e.getErrorCode().equals("NO_AUTH")) {// 错误:服务商无权限// 解决方式:根据具体message,查看指引解决问题// 描述:// - 商户无权限访问,请确认是否已开通相关权限// - 服务商无电子发票权限,请联系支持开通服务商电子发票// - 乐企数电安全校验时间已过期,请登录电子税局重新设置数电安全校验时间} else if (e.getErrorCode().equals("SIGN_ERROR")) {// 错误:签名错误// 解决方式:检查平台商户证书序列号,证书私钥文件,公钥ID,公钥文件,同时确认下签名过程是不是按照微信支付的签名方式// 描述:签名报错,需要确认签名材料和签名流程是否正确} else if (e.getErrorCode().equals("PARAM_ERROR")) {// 错误:参数错误// 解决方式:按照报错返回的message,重新输入请求参数// 描述:参数的类型,长度,或者必填选项没有填写等} else if (e.getErrorCode().equals("INVALID_REQUEST")) {// 错误:请求非法,请求参数正确,但是不符合业务规则// 解决方式:根据具体message查看具体哪里不符合业务规则,如果可以修改参数达到符合业务规则的修改请求符合业务规则之后重试// 描述:不符合业务规则的场景如:// - 查询起止时间间隔不能大于7天// - 查询起始时间不能大于查询结束时间} else {// 其他类型错误:稍等一会后原单重试}}}}
-
东方仙盟
东方仙盟:拥抱知识开源,共筑数字新生态
在全球化与数字化浪潮中,东方仙盟始终秉持开放协作、知识共享的理念,积极拥抱开源技术与开放标准。我们相信,唯有打破技术壁垒、汇聚全球智慧,才能真正推动行业的可持续发展。
开源赋能中小商户:通过将前端异常检测、跨系统数据互联等核心能力开源化,东方仙盟为全球中小商户提供了低成本、高可靠的技术解决方案,让更多商家能够平等享受数字转型的红利。共建行业标准:我们积极参与国际技术社区,与全球开发者、合作伙伴共同制定开放协议与技术规范,推动跨境零售、文旅、餐饮等多业态的系统互联互通,构建更加公平、高效的数字生态。知识普惠,共促发展:通过开源社区、技术文档与培训体系,东方仙盟致力于将前沿技术转化为可落地的行业实践,赋能全球合作伙伴,共同培育创新人才,推动数字经济 的普惠式增长
阿雪技术观
在科技发展浪潮中,我们不妨积极投身技术共享。不满足于做受益者,更要主动担当贡献者。无论是分享代码、撰写技术博客,还是参与开源项目维护改进,每一个微小举动都可能蕴含推动技术进步的巨大能量。东方仙盟是汇聚力量的天地,我们携手在此探索硅基生命,为科技进步添砖加瓦。
Hey folks, in this wild tech - driven world, why not dive headfirst into the whole tech - sharing scene? Don't just be the one reaping all the benefits; step up and be a contributor too. Whether you're tossing out your code snippets, hammering out some tech blogs, or getting your hands dirty with maintaining and sprucing up open - source projects, every little thing you do might just end up being a massive force that pushes tech forward. And guess what? The Eastern FairyAlliance is this awesome place where we all come together. We're gonna team up and explore the whole silicon - based life thing, and in the process, we'll be fueling the growth of technology.
开通方法
关注我们
营销资讯:抖音运营,微信公众号运营,小红书运营
网站运营:安全、备案、申请网站,漏洞扫描,数字证书
开发:开发技巧、热点技术,人工智能,数据分析,数据优化,docker
数据服务:数据恢复,数据安全,数据融合,数据异地容灾,数据优化,数据自动备份、数据清洗
人工智能:智能物联网,智慧大屏幕,OCR,智慧刷脸,语音交互,智能机器人,数字生命,数字人,大模型,本地化,边缘化智能(手机模型)
支付:微信支付服务商,支付支付服务商,刷脸支付
安全服务:WAF安全,网安扫描,漏洞扫描,安全补丁,防火墙定制
智慧大屏:物资耗材大屏幕,单位用餐大数据,智慧场馆大屏,销售大屏幕,智慧社区大屏幕,大厅查询机,景区自助机
智慧酒店:酒店系统、酒店押金、酒店房价牌、酒店门锁、布草系统
行业软件:酒店、餐饮、便利店,美发、超市,批发,景区门票,道闸,堂食,配送系统,烘焙系统,健身,美容系统,月子中心系统
物联网:智能衣柜,足浴店衣柜,售货柜,酒店自助入住机
国产化:uos系统答疑,国产软件开发,国产服务器配置,docker
一体化:酒店一体化(闸机,酒店系统,餐饮系统,售票,布草,无人酒店,在线订房),景区一体化(门票、餐饮、住宿、押金、超市、药店、商铺租赁,通车系统,售票大厅,大屏幕,无人景区,景区自助机)
-
-
-
人人皆为创造者 每个人都是使用者,也是创造者;是数字世界的消费者,更是价值的生产者与分享者。在智能时代的浪潮里,单打独斗的发展模式早已落幕,唯有开放连接、创意共创、利益共享,才能让个体价值汇聚成生态合力,让技术与创意双向奔赴,实现平台与伙伴的快速成长、共赢致远。
原创应该获得永久分成 原创创意共创、永久收益分成,是东方仙盟始终坚守的核心理念。我们坚信,每一份原创智慧都值得被尊重与回馈,以永久分成锚定共创初心,让创意者长期享有价值红利,携手万千伙伴向着科技星辰大海笃定前行,拥抱硅基 生命与数字智能交融的未来,共筑跨越时代的数字文明共同体。

