【微信卡包发票导入】微信电子发票报销方服务端接入时遇到的那些坑
首先先附上微信电子发票报销方接口列表的官方链接,如果你是.NET
开发,那么你可以通过Senparc.Weixin.MP来快速开发相应的微信电子发票功能,该功能在其16.4.0
版本开始提供,16.4.9
版本修复报销方的bug(修复PR代码由本人提供),16.4.10
电子发票原作者又做了一些调整,重新定义了发票实体,所以电子发票部分16.4.9
和16.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_id
和encrypt_code
所对应的发票信息,因为发票的报销涉及状态变更,所以card_id
和encrypt_code
我们是需要在本地持久化存储的,那么我们也就需要将请求的card_id
和encrypt_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地址不在白名单时,提示是签名错误!
【微信卡包发票导入】微信电子发票报销方服务端接入时遇到的那些坑相关推荐
- php开发电子发票接口,EasyAPI发票管理加油站电子发票解决方案
原标题:EasyAPI发票管理加油站电子发票解决方案 时代抛弃你时,连一声再见都不会说.这不,前一秒是还纸质发票,这一秒各行各业就都推行了电子发票.不得不感叹:时代改变真快!当然,电子发票会更方便.更 ...
- 区块链电子发票与传统电子发票的区别
背景资料:全国第一张区块链电子发票在深圳开出,技术底层来自于腾讯,背后的主导者是深圳市税务局,且区块链电子发票项目得到国家税务总局的批准与认可,只是目前还没有在全国铺开. **区块链电子发票与传统电子 ...
- 票总管APP,可一键导入在微信查看和开具的电子发票
你知道微信电子发票在哪里可以找到吗? 微信发布了电子发票的新入口,消费者可以凭借消费支付凭证就可以直接开发票了,还有很多人不知道微信电子发票开具的流程.微信电子发票如何打印,以及如何使用票总管APP导 ...
- python提取电子发票_Python办公自动化—电子发票台账制作自动化(3)
import fitz import os import urllib import base64 import json import urllib.parse import urllib.requ ...
- 加油站电子计算机发票管理办法,EasyAPI发票管理加油站电子发票解决方案
时代抛弃你时,连一声再见都不会说.这不,前一秒是还纸质发票,这一秒各行各业就都推行了电子发票.不得不感叹:时代改变真快!当然,电子发票会更方便.更快捷.扫码即得!一劳永逸!我们一定要跟得上时代,不能落 ...
- python提取电子发票_Python办公自动化—电子发票台账制作自动化(1)
近年来,税务局在大力推进增值税发票的电子化,目前增值税普通发票的电子版已经很常见了,长三角某些地区的增值税电子专票也在试点中,相信全面电子化的日子为期不远了. 由于报销凭证财务档案主要还是纸质形态,所 ...
- 电子发票服务器维护,电子发票来了!你关心的问题都在这里!
原标题:电子发票来了!你关心的问题都在这里! 公共服务平台操作热点问题 1.使用税务Ukey开票时应该如何赋码? (1)进入到发票填开界面后,双击"货物或应税劳务名称",或者点击& ...
- python提取pdf发票信息_PDF电子发票内容提取
网页版程序使用地址:[在线使用](https://www.yooongchun.com/apps) 摘要 本文介绍如何提取PDF版电子发票的内容. 1. 加载内容 首先使用Python的pdfplum ...
- java电子发票版式文件,电子发票ofd格式转pdf方法
随着专票电子化的时代来临,国家税务总局表示,增值税电子普通发票采用符合国家统一标准的OFD版式.那ofd格式的电子发票怎么转换成pdf呢?下面让小编手把手教你转换方法. 一.ofd转pdf ofd文件 ...
最新文章
- 第五课:系统目录及ls·文件类型及alias命令介绍
- VK Cup 2017 - Round 2
- I/O多路转接之poll——基于TCP协议
- Linux下修改SSH登录端口
- 面试官:this和super有什么区别?this能调用到父类吗?
- bzoj 4196 树链剖分 模板
- 关于范数与正则化详解(转)
- jquery控制左右箭头滚动图片列表
- TextView 在java中使用Html设置字体大小颜色
- 超实用的shell脚本--一键获取进程所有信息
- Windows 2008 Domain Controller
- c语言爱心代码简单,利用c语言实现简单心形的代码分享
- java adt官网下载_android adt下载
- 多屏信号服务器,多屏拼接控制器及多屏拼接方案【图文】
- 不积小流,无以成江海;不积跬步,无以至千里
- 计算机毕业设计 SpringBoot+Vue作业帮课程管理系统 作业帮信息管理系统 作业帮试题管理系统
- 使用 freeradius 搭建 EAP PEAP MS-CHAPv2 验证环境
- HttpRunner
- 微信认证300元发票获取
- 在IT技术圈混,怎么能不知道这几个公众号?