# 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
参数 | 是否必填 | 描述 |
---|---|---|
是 | 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 与插卡时间间隔过短。 |