目录

1. 在微信服务号/小程序提交电子发票报销
2. 在企业微信/企业号提交电子发票报销
3. 在外部App提交电子发票报销
4. 扫码提交电子发票报销

# 导读

本节文档介绍了企业支持用户提交电子发票,实现无纸化报销的不同业务场景。包括了场景的描述,基本的交互体验介绍和分步骤开发指引。企业可根据自身应用实际,选择对应的业务场景,根据文档进行分步骤开发。文档中的每一个步骤需要调用的接口都添加了接口文档链接,企业及报销软件开发者可以直接跳转查看对应的接口文档。 已完成认证的微信公众平台账号、微信开放平台账号、企业微信和企业号,均可直接调用微信电子发票报销接口。

下方步骤中涉及的接口信息,可查看文中末尾的接口列表。

# 1. 在微信服务号/小程序提交电子发票报销

# 1.1 场景描述

微信内提交电子发票报销通常指,具有服务号或小程序的企业或报销应用提供商,让企业员工或用户在微信内拉起保存在微信中的发票列表,勾选需要报销的发票后向企业或报销应用提交,企业收到员工提交的发票后完成后续的报销流程。
该场景适用于:
1 在微信服务号/小程序中有完整报销系统的报销企业或者报销服务提供商,或者
2 现有报销系统有独立的用户账号体系。员工在微信服务号/小程序内绑定现有报销系统账号后,可以在微信中向报销企业或报销服务商提交发票

在微信服务号/小程序中提交电子发票,无需安装额外的App,便于企业和报销应用提供商以最低门槛实现移动端快速提交电子发票。

# 1.2 交互介绍

微信内提交电子发票报销交互图如下
微信内报销交互

# 1.3 接口调用流程

微信内提交电子发票报销的时序图如下 微信内报销时序

# 服务号场景下开具电子发票的步骤如下:

1 获取公众平台账号 access_token,调用方法见获取access_token

2 拉起发票列表页,详情可查看:6.1 微信服务号拉起发票列表 或 6.2 微信小程序拉起发票列表

3 待用户在发票列表页勾选发票,所选发票的 card_id 和 encrypt_code 会以 js 回调的形式返回;

4 根据 card_id 和 encrypt_code 查询发票信息,调用的接口名称为:查询报销发票信息

5 根据企业自身报销流程将发票信息转换成报销单,本步骤不需要调用微信接口;

6 提交报销单,将发票状态更新为“已锁定”,避免发票被重复报销,调用的接口名称为:更新报销发票状态;如果报销多张发票,可以调用批量更新发票报销状态接口进行更新;

7 完成报销流程后,将发票状态更新为“已报销”。调用的接口名称为:更新报销发票状态;如果报销多张发票,可以调用批量更新报销发票状态接口进行更新

# 2. 在企业微信/企业号提交电子发票报销

# 2.1 场景描述

在企业微信提交电子发票是指应用企业微信/企业号并完成了认证的企业,可以从企业微信/企业号中拉起保存在微信卡包中的发票列表,勾选需要报销的发票后向企业或报销应用提交发票,企业收到员工提交的发票后完成后续的报销流程。应用企业微信的接口实现电子发票报销,可以结合企业微信的审批接口能力,在企业微信中实现一体化的报销提单审批功能。

# 2.2 交互介绍

在企业微信提交电子发票交互图如下
企业微信报销交互

# 2.3 接口调用流程

企业微信/企业号提交电子发票报销时序图如下 企业微信报销时序图

# 在企业微信提交电子发票的步骤如下:

1 获取企业微信/企业号账号的 access_token,调用方法见获取access_token

2 拉起发票列表页。企业微信2.1新增了选择电子发票的js-api接口,使用企业微信的企业将企业微信更新至2.1以上版本后,可快速实现在企业微信中选中电子发票的功能。调用方法见企业微信拉起发票列表 ;或查看:6.3 企业微信拉起发票列表

3 待用户在发票列表页勾选发票,所选发票的 card_id 和 encrypt_code 会以 js 回调的形式返回;

4 根据 card_id 和 encrypt_code 查询发票信息,调用的接口名称为:查询报销发票信息

5 根据企业自身报销流程将发票信息转换成报销单,本步骤不需要调用微信接口;

6 提交报销单,将发票状态更新为“已锁定”,避免发票被重复报销,调用的接口名称为:更新报销发票状态;如果报销多张发票,可以调用批量更新发票报销状态接口进行更新;

7 完成报销流程后,将发票状态更新为“已报销”。调用的接口名称为:更新报销发票状态;如果报销多张发票,可以调用批量更新报销发票状态接口进行更新

# 3. 在外部App提交电子发票报销

# 3.1 场景描述

在App提交电子发票是指,报销企业或报销服务商从自建的移动办公App中拉起保存在微信卡包中的发票列表,勾选需要报销的发票后向企业或报销应用提交发票,企业收到员工提交的发票后完成后续的报销流程。从App中发起电子发票报销,可以进一步丰富企业移动办公App的应用场景。

# 3.2 交互介绍

外部App提交电子发票报销交互图如下
App报销交互

# 3.3 接口调用流程

在外部App提交电子发票报销时序图如下 App报销时序

# 在外部App提交电子发票报销的步骤如下:

1 获取开放平台账号的 access_token,调用方法见获取Access token

2 拉起发票列表页,详情可查看:6.4 外部App拉起发票列表

3 待用户在发票列表页勾选发票,所选发票的 card_id和 encrypt_code 会以 js 回调的形式返回;

4 根据 card_id 和 encrypt_code 查询发票信息,调用的接口名称为:查询报销发票信息;

5 根据企业自身报销流程将发票信息转换成报销单,本步骤不需要调用微信接口;

6 提交报销单,将发票状态更新为“已锁定”,避免发票被重复报销,调用的接口名称为:更新报销发票状态;如果报销多张发票,可以调用批量更新发票报销状态接口进行更新;

7 完成报销流程后,将发票状态更新为“已报销”。调用的接口名称为:更新报销发票状态;如果报销多张发票,可以调用批量更新报销发票状态接口进行更新

# 4. 扫码提交电子发票报销

# 4.1 场景描述

扫码提交电子发票是指通过扫描PC上的二维码,让企业员工或用户在微信内H5页面上拉起保存在微信卡包中的发票列表,勾选需要报销的发票后向企业或报销应用提交发票,企业收到员工提交的发票后完成后续的报销流程。
该场景适用于员工报销行为主要从PC端发票的报销企业或者报销服务商。要求报销企业或者报销服务商获取移动端拉起微信电子发票的能力(微信内、企业微信或者独立报销APP) 该场景充分兼顾了员工的报销行为大多在PC上发起,可以无缝的和现有报销系统进行对接,不需要大幅改变员工的报销习惯,便于在企业内快速推广应用。

# 4.2 交互介绍

扫码开票交互图如下
扫码报销交互1
扫码报销交互2

# 4.3 接口调用流程

扫码提交电子发票报销的时序图如下 扫码报销时序

# 扫码开票场景下开具电子发票的步骤如下:

1 维护二维码,展示在报销系统PC端页面上,供用户使用使用微信、企业微信或独立报销APP扫码后,打开相应报销页面,向报销系统提交微信电子发票。报销系统获取到发票信息后,员工继续在PC端完成后续报销流程;

2 获取公众平台账号/企业微信账号的access_token,调用方法见获取Access token

3 拉起发票列表页

4 待用户在发票列表页勾选发票,所选发票的 card_id和 encrypt_code 会以 js 回调的形式返回;

5 根据 card_id 和 encrypt_code 查询发票信息,调用的接口名称为:查询报销发票信息;

6 根据企业自身报销流程将发票信息转换成报销单,本步骤不需要调用微信接口;

7 提交报销单,将发票状态更新为“已锁定”,避免发票被重复报销,调用的接口名称为:更新报销发票状态;如果报销多张发票,可以调用批量更新发票报销状态接口进行更新;

8 完成报销流程后,将发票状态更新为“已报销”。调用的接口名称为:更新报销发票状态;如果报销多张发票,可以调用批量更新报销发票状态接口进行更新

# 5. 涉及的接口清单

接口名称英文名请求路径
查询报销发票信息invoicebxgetinvoice/card/invoice/reimburse/getinvoiceinfo
更新报销发票状态invoicebxupdatainvoicestatus/card/invoice/reimburse/updateinvoicestatus
批量更新报销发票状态invoicereimburseupdatestatusbatch/card/invoice/reimburse/updatestatusbatch
批量获取报销发票信息invoicereimbursegetinvoicebatch/card/invoice/reimburse/getinvoicebatch

# 6. 如何拉起发票列表

# 6.1 微信服务号拉起发票列表

接口说明

本接口功能为在微信服务号拉起发票卡券列表,用户勾选需要提交报销的发票后,开发者获得所选发票的标识信息。

本接口的调用须遵循JS-SDK的调用方法,请在开发前阅读[微信JS-SDK接口文档](http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN" target="_blank)以熟悉开发术语和基本接口的调用。

请求方式

调用chooseInvoice接口

请求参数

参数 类型 是否必填 描述
timestamp string(32) 时间戳,采用 unix 十位时间戳
nonceStr string(32) 随机字符串

返回结果

用户点击确认或取消后,将按下表所列字段格式及含义返回结果。

参数 类型 是否必填 描述
err_msg string ok:选取发票成功,fail:选取发票失败,cancel:选取发票取消
choose_invoice_info object 用户选中的发票列表

choose_invoice_info的对象包括以下字段

参数 类型 是否必填 描述
card_id string 所选发票卡券的 card_id
encrypt_code string 所选发票卡券的加密 code ,报销方可以通过 card_id 和 encrypt_code 获得报销发票的信息
app_id string 开票方的 appid

示例代码

wx.config({
    beta: true,
    debug: false,
    appId: "wx00000000000000",
    timestamp: 1489030247,
    nonceStr: "(9J4YRV[#@",
    signature: "f027317f8910000000000000000000",
    jsApiList: ['chooseInvoice']
});
wx.ready(function () {
    wx.invoke('chooseInvoice', {
        'timestamp': 1489030247, 
        'nonceStr': "p(6N&7WOAF", 
        }, function(res) {
            alert(JSON.stringify(res));
        }
    });
});

# 6.2 微信小程序拉起发票列表

接口说明

支持在微信小程序中直接拉起电子发票列表

详细接口文档请参见小程序API发票部分

# 6.3 企业微信拉起发票列表

接口说明

企业微信2.1新增了选择电子发票的js-API接口,使用企业微信的企业将企业微信更新至2.1以上版本后,可快速实现在企业微信中选中电子发票的功能。

详细接口文档请参见企业微信API电子发票部分

# 6.4 外部App拉起发票列表

接口说明

对于自建移动办公应用的企业及为企业提供独立报销App的报销服务商,微信提供了外部App拉起发票列表的接口。与微信内拉起发票列表接口相似,外部App开发者在用户勾选并点击确认后,可以获得发票的标识数据。

该接口须遵循JS-SDK的调用方法,请在开发前务必检查自己是否满足以下条件:

1 获得一个已认证的 微信开放平台 账号;

2 在微信开放平台上创建一个应用并提交应用通过审核。未注册应用的开发者可在开发者应用登记页面进行登记;

请求方式

iOS应用

参考压缩包内的OpenSDK1.7.7文件,使用时调用WXChooseInvoice类。其中需要签名的部分,参考JS-SDK的调用方式。 示例代码

—(void)getlnvoiceWithTicket: (NSString*)ticket whenComptetion: (void(^)(NSString* result, NSString*errorDesc) )comptetion{
BOOL isWXApplnstalled = [WXApi isWXApplnstalled]; 
if (!isWXApplnstalled) { // 用户没装微信,直接返回。
completion(nil.,@”Wechat Not installed”);
return;
}
_completion = completion;
WXChooselnvoiceReq *cardReq = [[WXChooselnvoiceReq alloc]initl; 
cardReq. applD = WechatlnvoiceAppld;
cardReq.timeStamp = [[NSDate date]timelntervalSince1970]; 
NSString* timeStamp = [NSString stringWithFormat:@”%d”,cardReq.timeStamp]; 
cardReq. nonceStr = @“sfim_invoice”;

NSString *cardSign = [self genCardSignWithNonceStr: cardReq.nonceStr andTimeStr:
timeStamp andApiTicket:ticket];
cardReq.cardSign = cardSign;
[WXApi sendReq:cardReq];//发送

Android应用

下载并参考压缩包内,进入jar文件,使用时调用ChooseCardFromWXCardPackage类,并传入CardType为“INVOICE”。其中需要签名的部分,参考JS-SDK的调用方式。

返回结果

用户点击确认或取消后,将按下表所列字段格式及含义返回结果。

参数 类型 是否必填 描述
err_msg string ok:选取发票成功,fail:选取发票失败,cancel:选取发票取消
choose_invoice_info object 用户选中的发票列表

choose_invoice_info的对象包括以下字段

参数 类型 是否必填 描述
card_id string 所选发票卡券的 card_id
encrypt_code string 所选发票卡券的加密 code ,报销方可以通过 card_id 和 encrypt_code 获得报销发票的信息
app_id string 开票方的 appid

# 7 发票报销状态一览表

状态 描述
INVOICE_REIMBURSE_INIT 发票初始状态,未锁定
INVOICE_REIMBURSE_LOCK 发票已锁定
INVOICE_REIMBURSE_CLOSURE 发票已核销
INVOICE_REIMBURSE_CANCEL 发票被冲红

# 8 错误码

错误码 错误信息 备注
0 OK 成功
72015 unauthorized create invoice 没有操作发票的权限,请检查是否已开通相应权限。
72017 invalid invoice title 发票抬头不一致
72023 invoice has been lock 发票已被其他服务号锁定。一般为发票已进入后续报销流程,报销企业服务号/企业号/App锁定了发票。
72024 invoice status error 发票状态错误
72025 invoice token error wx_invoice_token 无效
72028 invoice never set pay mch info 未设置微信支付商户信息
72029 invoice never set auth field 未设置授权字段
72030 invalid mchid mchid 无效
72031 invalid params 参数错误。可能为请求中包括无效的参数名称或包含不通过后台校验的参数值
72035 biz reject insert 发票已经被拒绝开票。若order_id被用作参数调用过拒绝开票接口,再使用此order_id插卡机会报此错误
72036 invoice is busy 发票正在被修改状态,请稍后再试
72038 invoice order never auth 订单没有授权,可能是开票平台 appid 、商户 appid 、订单 order_id 不匹配
72039 invoice must be lock first 订单未被锁定
72040 invoice pdf error Pdf 无效,请提供真实有效的 pdf
72042 billing_code   and billing_no repeated 发票号码和发票代码重复
72043 billing_code   or billing_no size error 发票号码和发票代码错误
72044 scan   text out of time 发票抬头二维码超时
40078 invalid   card status card_id未授权。 若开发者使用沙箱环境报此错误,主要因为未将调用接口的微信添加到测试把名单; 若开发者使用正式环境报此错误,主要原因可能为:调用接口服务号未开通卡券权限,或创建card_id与插卡时间间隔过短。