首先先附上微信电子发票报销方接口列表的官方链接,如果你是.NET开发,那么你可以通过Senparc.Weixin.MP来快速开发相应的微信电子发票功能,该功能在其16.4.0版本开始提供,16.4.9版本修复报销方的bug(修复PR代码由本人提供),16.4.10电子发票原作者又做了一些调整,重新定义了发票实体,所以电子发票部分16.4.916.4.10不兼容,然后目前16.4.10报销方部分已在实际生产环境进行过测试,目前尚未发现报销方相关的功能存在bug,商户和开票平台部分因为没实际业务需求,所以无法进行测试。

略去前端部分的内容,对于电子发票报销方,微信提供了以下两类API:

  • 查询发票
  • 更新状态

然后每类API都默认提供单个以及批量两种操作,所以总共是4个API接口。

Senparc.Weixin.MP中,电子发票相关代码均在Senparc.Weixin.MP.AdvancedAPIs.InvoiceApi静态类下,每个静态方法对应一个API接口,所有的方法均采用了同种代码方式,接下来就要说到开发中遇到的坑了,当然有些是SDK的坑,有些是微信API自身的坑。

先简单的列下接入示例代码

string appId="";
string appSecret="";
//接下来只需要简单的通过调用InvoiceApi.XXX方法就可以来完成调用某个API
//以获取指定单张电子发票为例
string card_id;//发票卡券的 card_id
string encrypt_code;//发票卡券的加密 code ,和 card_id 共同构成一张发票卡券的唯一标识
var inv = InvoiceApi.GetInvoiceInfo(appId,card_id,encrypt_code);
//当然每个API方法都有对应的异步方法,比如GetInvoiceInfoAsync

总的来说,接入还是相当简单的,所以接下来就要讲第一个坑了

1、微信报销方批量获取发票列表的坑
你可以通过InvoiceApi.GetInvoiceListInfo来批量获取发票列表,此时微信会返回你所请求的所有card_idencrypt_code所对应的发票信息,因为发票的报销涉及状态变更,所以card_idencrypt_code我们是需要在本地持久化存储的,那么我们也就需要将请求的card_idencrypt_code与返回的发票进行一一对应,然后关键点来了,返回的集合信息中,每张发票只有card_id,没有encrypt_code,如果你没注意到微信文档上描述的发票卡券的加密 code ,和 card_id 共同构成一张发票卡券的唯一标识,直接按card_id去与请求的card_id做对应的话,那么就有可能会导致错误,所以接下来就是关键点:微信返回的列表与请求参数是一一对应的,所以可以简单的按索引来匹配,但我没测试假如请求的数据中有一条是错误的,返回的结果会怎么样,有兴趣的可以试验下

List<InvoiceItem> itemList;
var invList = InvoiceApi.GetInvoiceListInfo(token, itemList);
if (invList.errcode == 0)
{for(var i=0;i<invList.item_list.Count;i++){//两者一一对应var item = itemList[i];var inv = invList.item_list[i];//当然如果你不放心这种写法,那么可以采用下一种var currentItem = itemList.First(m => m.card_id == inv.card_id);itemList.Remove(currentItem);//通过移除已经匹配到请求参数的来保证不会重复匹配}
}

2、发票状态更新的坑
因为按正常的流程,当你从微信卡包成功获取发票信息、并持久化在你本地进入报销流程时,你需要通过微信的API来更新发票状态为INVOICE_REIMBURSE_LOCK发票已锁定;相应的假如你在本地删除了该发票,你也需要告知微信目前该发票状态要更改为INVOICE_REIMBURSE_INIT发票初始状态,未锁定;如果报销完成了,则你需要更新状态INVOICE_REIMBURSE_CLOSURE发票已核销。而此处的坑就在于如果发票在微信那里状态本身为INVOICE_REIMBURSE_INIT,你再通过InvoiceApi.UpdateInvoiceStatus去更新发票为INVOICE_REIMBURSE_INIT状态时,即更新为同种状态,微信会返回更新失败……当然这也不能说微信错了,只能说这块响应不友好,但我们业务中为了保证发票能够解锁,如果解锁失败就不允许本地删除发票(因为在微信卡包中,锁定状态的发票是不能删除的,也无法再次被选择,所以假如你本地删除了card_id和encrypt_code,那么那几张灰色的发票信息就要在你的卡包里一辈子了,因为你再也没有正常途径可以取到card_id和encrypt_code!!!),所以此处如果你更新发票状态失败了,你可以再通过InvoiceApi.GetInvoiceInfo再获取一次发票信息,判断下发票目前状态实际为何种状态,如果发票状态已经为你想要更改的状态,那么就可以继续执行后续的业务逻辑。

3、微信公众号Token
因为微信公众号AccessToken有时间限制,所以为了贪图方便,我们可能会直接每次都通过AccessTokenContainer.TryGetAccessToken(appId,appSecret,true)强制刷新AccessToken,测试期间可能会发现一切正常,但AccessToken其实每天都有刷新次数上限(2000),所以如果上了生产环境还每次都强制刷新AccessToken的话,可能很快就会达到每日上限!!!另外如果你们有多个环境(假设A/B两个环境),而每个环境都用了同样的appId,那么恭喜你,只要你在A访问了一次微信相关的功能获取了一个AccessToken,然后在B又操作了一次微信相关的功能又获取了一个新的AccessToken,那么5分钟之后A的AccessToken就过期,而且因为expire_in还没到,框架也不会帮你自动刷新Token,然后A环境所有与微信相关的功能都game over……

4、Ip白名单
微信公众号在设置时需要配置Ip白名单,只有白名单内指定的Ip微信才会允许在Jsapi中访问相关功能,所以如果你的服务器是通过代理服务器上网,那么就很可能存在对外Ip地址发生变化的问题,而且最坑的是:Ip地址不在白名单时,提示是签名错误

【微信卡包发票导入】微信电子发票报销方服务端接入时遇到的那些坑相关推荐

  1. php开发电子发票接口,EasyAPI发票管理加油站电子发票解决方案

    原标题:EasyAPI发票管理加油站电子发票解决方案 时代抛弃你时,连一声再见都不会说.这不,前一秒是还纸质发票,这一秒各行各业就都推行了电子发票.不得不感叹:时代改变真快!当然,电子发票会更方便.更 ...

  2. 区块链电子发票与传统电子发票的区别

    背景资料:全国第一张区块链电子发票在深圳开出,技术底层来自于腾讯,背后的主导者是深圳市税务局,且区块链电子发票项目得到国家税务总局的批准与认可,只是目前还没有在全国铺开. **区块链电子发票与传统电子 ...

  3. 票总管APP,可一键导入在微信查看和开具的电子发票

    你知道微信电子发票在哪里可以找到吗? 微信发布了电子发票的新入口,消费者可以凭借消费支付凭证就可以直接开发票了,还有很多人不知道微信电子发票开具的流程.微信电子发票如何打印,以及如何使用票总管APP导 ...

  4. python提取电子发票_Python办公自动化—电子发票台账制作自动化(3)

    import fitz import os import urllib import base64 import json import urllib.parse import urllib.requ ...

  5. 加油站电子计算机发票管理办法,EasyAPI发票管理加油站电子发票解决方案

    时代抛弃你时,连一声再见都不会说.这不,前一秒是还纸质发票,这一秒各行各业就都推行了电子发票.不得不感叹:时代改变真快!当然,电子发票会更方便.更快捷.扫码即得!一劳永逸!我们一定要跟得上时代,不能落 ...

  6. python提取电子发票_Python办公自动化—电子发票台账制作自动化(1)

    近年来,税务局在大力推进增值税发票的电子化,目前增值税普通发票的电子版已经很常见了,长三角某些地区的增值税电子专票也在试点中,相信全面电子化的日子为期不远了. 由于报销凭证财务档案主要还是纸质形态,所 ...

  7. 电子发票服务器维护,电子发票来了!你关心的问题都在这里!

    原标题:电子发票来了!你关心的问题都在这里! 公共服务平台操作热点问题 1.使用税务Ukey开票时应该如何赋码? (1)进入到发票填开界面后,双击"货物或应税劳务名称",或者点击& ...

  8. python提取pdf发票信息_PDF电子发票内容提取

    网页版程序使用地址:[在线使用](https://www.yooongchun.com/apps) 摘要 本文介绍如何提取PDF版电子发票的内容. 1. 加载内容 首先使用Python的pdfplum ...

  9. java电子发票版式文件,电子发票ofd格式转pdf方法

    随着专票电子化的时代来临,国家税务总局表示,增值税电子普通发票采用符合国家统一标准的OFD版式.那ofd格式的电子发票怎么转换成pdf呢?下面让小编手把手教你转换方法. 一.ofd转pdf ofd文件 ...

最新文章

  1. 第五课:系统目录及ls·文件类型及alias命令介绍
  2. VK Cup 2017 - Round 2
  3. I/O多路转接之poll——基于TCP协议
  4. Linux下修改SSH登录端口
  5. 面试官:this和super有什么区别?this能调用到父类吗?
  6. bzoj 4196 树链剖分 模板
  7. 关于范数与正则化详解(转)
  8. jquery控制左右箭头滚动图片列表
  9. TextView 在java中使用Html设置字体大小颜色
  10. 超实用的shell脚本--一键获取进程所有信息
  11. Windows 2008 Domain Controller
  12. c语言爱心代码简单,利用c语言实现简单心形的代码分享
  13. java adt官网下载_android adt下载
  14. 多屏信号服务器,多屏拼接控制器及多屏拼接方案【图文】
  15. 不积小流,无以成江海;不积跬步,无以至千里
  16. 计算机毕业设计 SpringBoot+Vue作业帮课程管理系统 作业帮信息管理系统 作业帮试题管理系统
  17. 使用 freeradius 搭建 EAP PEAP MS-CHAPv2 验证环境
  18. HttpRunner
  19. 微信认证300元发票获取
  20. 在IT技术圈混,怎么能不知道这几个公众号?

热门文章

  1. 「硬见小百科」开关电源各种保护电路实例详细解剖
  2. python学习-->tkinter模块学习之Listbox(列表框学习)
  3. 2021年电工(高级)复审考试及电工(高级)模拟考试
  4. 电脑在线运行测试软件,装机必看 如何快速测试电脑性能?
  5. Elasticsearch 搜索引擎, 检索分词,组词(二)
  6. 支付宝:即时到账接口对接
  7. 计算机管理施工中的应用,计算机技术在施工管理中的应用
  8. C语言学习-原码、反码、补码(内含计算工具)
  9. June 11th 模拟赛C T4 Cleanup Solution
  10. java研发面经:滴滴、美团、网易、58赶集等