1.1 获取access_token

1.2 接收callback推送

2.1 获取ticket

2.2 获取授权页链接

2.3 接收授权完成事件

2.4 查询授权信息

2.5 拒绝领取票据接口

3.1 获取财政局s_pappid

3.2 创建财政电子票据接口

3.3 上传PDF

3.4 获取PDF

3.5 将财政电子票据添加到用户微信卡包

3.6 状态更新事件推动

3.7 更新电子票据状态

4.1 订单授权状态

4.2 错误码

# 1 通用接口

# 1.1 获取access_token

接口说明
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。建议公众号开发者使用中控服务器统一获取和刷新access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务。关于 access_token 的更多介绍,请参考公众号开发文档。 请求方式
请求URL:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
请求方法:GET

请求参数

参数 类型 是否必填 描述
grant_type String 获取access_token填写client_credential
appid String 第三方用户唯一凭证
secret String 第三方用户唯一凭证密钥,即appsecret

返回结果 数据格式:JSON

参数 类型 是否必填 描述
access_token String 获取到的凭证
expires_in Int 凭证有效时间。单位:秒

示例代码

返回:
{
	"access_token":"ACCESS_TOKEN",
	"expires_in":7200
}

# 1.2 接收callback推送

登录公众平台进入【开发者中心设置】,设置接收callback的URL。用户授权领取票、财政电子票据状态更新时,微信服务器会通过这个URL通知开发者。
微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。

# 2 执收单位接口

# 2.1 获取ticket

接口说明
ticket用于加强安全性。ticket的有效期目前为2个小时,需定时刷新。建议公众号开发者使用中控服务器统一获取和刷新ticket。 请求方式
请求URL:https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=wx_card
请求方法:GET
返回结果
数据格式:JSON

参数 类型 是否必填 描述
errcode Int 错误码
errmsg String 错误信息
ticket String 临时票据,用于url中signature的签名
expires_in Int 有效时长,一般是7200s

示例代码

{   
	"errcode": 0,   
	"errmsg": "ok",   
	"ticket": "m7RQzjA_ljjEkt-JCoklRM5zrzYr-6PI09QydZmNXXz-opTqMv53aFj1ykRt_AOtvqidqZZsLhCDgwGC6nBDiA",   
	"expires_in": 7200 
}

注意事项
1 ticket有效期为7200s,7200s内重复请求ticket不变。
2 执收单位后台须对ticket进行缓存,保证正常调用。

# 2.2 获取授权页链接

接口说明
通过此接口,获取授权页链接,让用户跳转到授权页。 请求方式
请求URL:https://api.weixin.qq.com/nontax/getbillauthurl?access_token={access_token}
请求方法:POST 请求参数

参数 类型 是否必填 描述
s_pappid String 财政局id,需要找财政局提供
order_id String 订单id
money Int 订单金额,以分为单位
timestamp Int 时间戳
source String 开票来源,web:公众号开票,app:app开票
redirect_url String 授权成功后跳转页面
ticket String Api_ticket,参考获取api_ticket接口获取

返回结果 数据格式:JSON

参数 类型 是否必填 描述
errcode Int 错误码
errmsg String 错误信息

当错误码为0时,有以下信息

参数 类型 是否必填 描述
auth_url String 授权链接
expire_time Int 过期时间,单位为秒,授权链接会在一段时间之后过期

示例代码

请求:
{
    "s_pappid": "wxabcd",
    "order_id": "1234",
    "money": 11,
    "timestamp": 1474875876,
    "source": "web",
    "redirect_url": "https://mp.weixin.qq.com",
    "ticket": "tttt"
}
返回:
{
    "errcode": 0, 
    "errmsg": "ok", 
    "auth_url": "http://auth_url",
    "expire_time": 7200
}

# 2.3 接收授权完成事件

接口说明
用户授权完成后,执收单位的公众号会收到授权完成的事件,关于事件推送请参考接受callback推送
返回结果
数据格式:xml

参数 类型 描述
ToUserName String 公众号标识
FromUserName String 用户 openID
CreateTime Int 事件时间
MsgType String 固定为event
Event String 固定为user_authorize_invoice
SuccOrderId String 授权成功的订单号
FailOrderId String 授权失败的订单号
AuthorizeAppId String 用于接收事件推送的公众号的AppId
Source String 授权来源,web表示来自微信内H5

示例代码

<xml>
	<ToUserName><![CDATA[gh_fc0a06a20993]]></ToUserName>
	<FromUserName><![CDATA[oZI8Fj040-be6rlDohc6gkoPOQTQ]]></FromUserName>
	<CreateTime>1475134700</CreateTime>
	<MsgType><![CDATA[event]]></MsgType>
	<Event><![CDATA[user_authorize_invoice]]></Event>
	<SuccOrderId><![CDATA[1202933957956]]></SuccOrderId>
	<FailOrderId><![CDATA[]]></FailOrderId>
	<AuthorizeAppId><![CDATA[]]></AuthorizeAppId>
	<Source><![CDATA[]]></Source>
</xml>

# 2.4 查询授权信息

接口说明
执收单位可以调用该接口查询订单是否有被用户授权。
请求方式
请求URL:https://api.weixin.qq.com/card/invoice/getauthdata?access_token={access_token}
请求方法:POST
请求参数

参数 类型 是否必填 描述
order_id String 订单order_id
s_pappid String 财政局id

返回结果 数据格式:JSON

参数 类型 是否必填 描述
errcode Int 错误码
errmsg String 错误信息

示例代码

请求参数
{
    "s_pappid": "{s_pappid}",
    "order_id": "{order_id}"
}
返回数据:
{
  "errcode": 0,
  "errmsg": "ok",
  "invoice_status": "auth success",
  "auth_time": 1480342498
}

# 2.5 拒绝领取票据接口

接口说明
用户完成授权后,执收单位若发现用户提交信息错误、或者发生了退款时,可以调用该接口拒绝领取票并告知用户。
请求方式
请求URL:https://api.weixin.qq.com/card/invoice/rejectinsert?access_token={access_token}
请求方法:POST
请求参数

参数 类型 是否必填 描述
s_pappid String 财政局id
order_id String 订单id
reason String 撤销原因
url String 跳转链接

返回结果

参数 类型 是否必填 描述
errcode Int 错误码
errmsg String 错误信息

示例代码

请求:
{
    "s_pappid": "d3JCEfhGLW+q0iGP+o9",
    "order_id": "111229",
    "reason": "1234",
    "url": "avb"
}
返回:
{
    "errcode": 0, 
    "errmsg": "ok"
}

# 3 财政局接口

# 3.1 获取财政局s_pappid

接口说明
可以通过此接口获取财政局的s_pappid,并透传给执收单位,执收单位可以通过该s_pappid参数指定提供开票服务的财政局。同一个财政局的s_pappid是一样的,所以只需要调用一次接口,并保存起来。
请求方式
请求URL:https://api.weixin.qq.com/card/invoice/seturl?access_token={access_token}
请求方法:POST

请求参数
请求参数格式为JSON,传入数据为空,即传入{}
返回结果

参数 类型 是否必填 描述
errcode Int 错误码
errmsg String 错误信息
invoice_url String 财政局须将url内的s_pappid给到服务的执收单位,执收单位在请求授权链接时会向微信传入该参数

示例代码

请求
{}
返回
{
  "errcode": 0,
  "errmsg": "ok",
 "invoice_url": "https://mp.weixin.qq.com/bizmall/authinvoice?action=list&s_pappid=d3xxxxxxxxxxxxxGLSS0wrL14No8c1"
}

# 3.2 创建财政电子票据接口

接口说明
财政局可以通过这个接口帮助执收单位创建一张财政电子票据模板。同一个财政局可以对应多个执收单位,同一个执收单位,使用同一个card_id,不同的执收单位,使用不同的card_id。
请求方式
请求URL:https://api.weixin.qq.com/nontax/createbillcard?access_token={access_token}
请求方法:POST
请求参数
数据格式:JSON
财政电子票据invoice_info字段

参数 类型 是否必填 描述
base_info Object 财政电子票据信息
payee string 收款方(开票方)全称,显示在财政电子票据详情内

base_info字段

参数 类型 是否必填 描述
logo_url String 财政局LOGO,请参考上传图片接口

返回结果

参数 类型 是否必填 描述
errcode Int 错误码
errmsg String 错误信息

当错误码为0是,有以下信息:

参数 类型 是否必填 描述
card_id String 票据card_id

示例代码

请求:
{
    "invoice_info" : {
        "payee" : "测试非税票据",
        "base_info" : {
            "logo_url": : "http://mmbiz.qpic.cn/mmbiz/iaL1LJM1mF9aRKPZJkmG8xXhiaHqkKSVMMWeN3hLut7X7hicFNjakmxibMLGWpXrEXB33367o7zHN0CwngnQY7zb7g/0"
        }
    }
}
返回:
{
    "errcode": 0, 
    "errmsg": "ok", 
    "card_id": "pjZ8Yt9WoOePThU0NfUKz5-tBEWU"
}

# 3.3 上传pdf

接口说明
财政局可以将票据pdf上传到微信财政电子票据平台,用于开票使用。上传的pdf有三天的有效期限制,需要在过期之前调用插卡接口。
请求方式
请求URL:https://api.weixin.qq.com/card/invoice/platform/setpdf?access_token={access_token}
请求方法:POST
请求参数
数据格式:multipart/form-data

参数 是否必填 描述
pdf form-data中媒体文件标识,有filename、filelength、content-type等信息

返回结果 数据格式:JSON

参数 类型 是否必填 描述
errcode Int 错误码
errmsg String 错误信息
s_media_id String 获取pdf和插卡使用,s_media_id有效期有3天

示例代码

请求:
------WebKitFormBoundary2exwM16BY25kVBgf
Content-Disposition: form-data; name="pdf"; filename="1133090578170938.pdf"
Content-Type: application/pdf
Pdf content
------WebKitFormBoundary2exwM16BY25kVBgf--
返回:
{
  "errcode": 0,
  "errmsg": "ok",
  "s_media_id": “3015806758683707”
}

# 3.4 获取pdf

接口说明
获取财政电子票据pdf。 请求方式
请求URL:https://api.weixin.qq.com/card/invoice/platform/getpdf?access_token={access_token}
请求方法:POST
请求参数
数据格式:JSON

参数 类型 是否必填 描述
s_media_id string 财政电子票据s_media_id
actin String 填“get_url”

返回结果
数据格式:JSON

参数 类型 是否必填 描述
errcode Int 错误码
errmsg String 错误信息
pdf_url String pdf的url
pdf_url_expire_time Int pdf_url过期时间,7200秒

示例代码

请求:
{
         "action": "get_url",
         "s_media_id": "75195574948725301"
}
返回:
{
    "errcode": 0,
    "errmsg": "ok",
    "pdf_url": "https://mp.weixin.qq.com/intp/invoice/getpdf?action=media_pdf&media_key=dFRnTkV6WCswNjB1V1czZ0tVU3MhaX4yb2pxeEVSY0teSCtuflY6UXAifD5rL09kTjFpOFVWKyJGNCgxTCtkJER6VjFlRCtVU2JKcS5FZw",
    "pdf_url_expire_time": 7200
}

# 3.5 将财政电子票据添加到用户微信卡包

接口说明
执收单位完成用户插卡授权后,向财政局请求给某一个订单号进行领取财政电子票据,财政局须调用该接口对用户进行开票。
请求方式
请求URL:https://api.weixin.qq.com/nontax/insertbill?access_token={access_token}
请求方法:POST
请求参数
数据格式:JSON

参数 类型 是否必填 描述
order_id string 财政电子票据order_id
card_id String 财政电子票据card_id
appid String 该订单号授权时使用的appid,一般为执收单位appid
card_ext Object 财政电子票据具体内容

card_ext包含以下内容:

参数 类型 是否必填 描述
user_card Object 用户信息结构体

user_card中包含一个invoice_user_data对象,invoice_user_data包含以下字段:

参数 类型 是否必填 描述
fee Int 财政电子票据的金额,以分为单位
title String 财政电子票据的缴费单位
billing_time Int 财政电子票据的开票时间,为10位时间戳(utc+8)
billing_no String 财政电子票据代码
billing_code String 财政电子票据号码
s_pdf_media_id String 财政电子票据pdf文件上传到微信财政电子票据平台后,会生成一个财政电子票据s_media_id,该s_media_id可以直接用于开财政电子票据,上传参考“5、上传pdf”

返回结果 数据格式:JSON

参数 类型 是否必填 描述
errcode Int 错误码
errmsg String 错误信息

当错误码为0是,有以下信息:

参数 类型 是否必填 描述
code String 财政电子票据code
openid String 用户标识,即领取到财政电子票据的openid

示例代码

请求:
{
    "order_id" : "1511169724",
    "card_ext" : {
        "user_card" : {
            "invoice_user_data" : {
                "billing_time" : "1511169724",
                "billing_code" : "aabbccdd",
                "billing_no" : "1511169724",
                "s_pdf_media_id" : "s_pdf_media_id",
                "fee" : 123,
                "title" : "灌哥发票"
            }
        }
    },
    "card_id" : "pjZ8Yt7xiy3b9UfffRIA4Tm2xTnw",
    "appid" : "wxc0b84a53ed8e8d29"
}
返回:
{
    "errcode": 0, 
    "errmsg": "ok", 
    "code": "682xxxx661927", 
    "openid": "ojZ8Ytz4lESxxxx_R1TvB2Kds"
}

# 3.6 状态更新事件推送

接口说明
当报销方更新财政电子票据状态的时候,公众平台会推送一条消息公众号消息通知财政局设置的接收事件回调的url,关于事件推送参考接口6.1.2
返回结果
数据格式:XML

参数 类型 是否必填 描述
ToUserName String 公众号标识
FromUserName String 用户openid
CreateTime Int 事件时间
MsgType String 固定为"event"
Event String 固定为"update_invoice_status"
Status String 财政电子票据报销状态
CardId String 财政电子票据id
Code String 财政电子票据code

示例代码

<xml>
<ToUserName><![CDATA[gh_9e1765b5568e]]></ToUserName>
<FromUserName><![CDATA[ojZ8Ytz4lESgdWZ34L_R1TvB2Kds]]></FromUserName>
<CreateTime>1478068440</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[update_invoice_status]]></Event>
<Status><![CDATA[INVOICE_REIMBURSE_INIT]]></Status>
<CardId><![CDATA[pjZ8Yt7Um2jYxzneP8GomnxoVFWo]]></CardId>
<Code><![CDATA[186921658591]]></Code>
</xml>

# 3.7 更新电子票据状态

接口说明
如果财政局的财政电子票据状态发生改变,需要调用该接口,将状态同步给公众平台,确保双方财政电子票据的状态一致。
请求方式
请求URL:https://api.weixin.qq.com/card/invoice/platform/updatestatus?access_token={access_token}
请求方法:POST
请求参数
数据格式:JSON

参数 类型 是否必填 描述
card_id String 财政电子票据id
code String 财政电子票据code
reimburse_status String 财政电子票据报销状态

返回结果

参数 类型 是否必填 描述
errcode Int 错误码
errmsg String 错误信息

示例代码

请求:
{
    "card_id": "pjZ8Yt7Um2jYxzneP8GomnxoVFWo",
    "code": "186921658591",
    "reimburse_status": "INVOICE_REIMBURSE_INIT"
}
返回:
{
    "errcode": 0, 
    "errmsg": "ok"
}

# 4 备注

# 4.1 订单授权状态

状态 描述
never auth 用户未授权
auth success 用户已授权
auth time out 用户授权后,领取票据超时
invoice send 用户授权后,领取票成功
reject insert 撤销领取票据
invoice sending 用户授权后,领取中

<a name="4.2>

# 4.2 错误码

状态 描述 备注
0 OK 成功
72015 unauthorized create invoice 没有操作权限,请检查是否已开通相应权限。
72031 invalid params 参数错误。可能为请求中包括无效的参数名称或包含不通过后台校验的参数值
72035 biz reject insert 财政电子票据已经被拒绝领取。若 order_id 被用作参数调用过拒绝领取接口,再使用此 order_id 插卡机会报此错误
72036 invoice is busy 财政电子票据正在被修改状态,请稍后再试
72038 invoice order never auth 订单没有授权,可能是财政局的s_pappid 、执收单位 appid 、订单 order_id 不匹配
72040 invoice pdf error Pdf 无效,请提供真实有效的 pdf
72042 billing_code and billing_no repeated 票据号码和票据代码重复
72043 billing_code or billing_no size error 票据号码和票据代码错误
40078 invalid card status card_id 未授权。 若开发者使用沙箱环境报此错误,主要因为未将调用接口的微信添加到测试把名单; 若开发者使用正式环境报此错误,主要原因可能为:调用接口公众号未开通卡券权限,或创建 card_id 与插卡时间间隔过短。