# 1 获取授权页ticket
接口说明
商户在调用授权页前需要先获取一个7200s过期的授权页ticket,在获取授权页接口中,该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 | 是 | 临时票据,用于在获取授权链接时作为参数传入 |
expires_in | Int | 是 | ticket 的有效期,一般为 7200 秒 |
示例代码
返回:
{
"errcode": 0,
"errmsg":"ok",
"ticket":"m7RQzjA_ljjEkt-JCoklRM5zrzYr-6PI09QydZmNXXz-opTqMv53aFj1ykRt_AOtvqidqZZsLhCDgwGC6nBDiA",
"expires_in": 7200
}
# 2 获取授权页链接
接口说明
本接口供商户调用。商户通过本接口传入订单号、开票平台标识等参数,获取授权页的链接。在微信中向用户展示授权页,当用户点击了授权页上的“领取发票”/“申请开票”按钮后,即完成了订单号与该用户的授权关系绑定,后续开票平台可凭此订单号发起将发票卡券插入用户卡包的请求,微信也将据此授权关系校验是否放行插卡请求。
授权页包括三种样式,商户可以通过传入不同type的值进行调用。各样式授权页如下图所示:
不同样式授权页作用如下:
type=0(申请开票类型):用于商户已从其它渠道获得用户抬头,拉起授权页发起开票,开票成功后保存到用户卡包;
type=1(填写抬头申请开票类型):调用该类型时,页面会显示微信存储的用户常用抬头。用于商户未收集用户抬头,希望为用户减少填写步骤。需要留意的是,当使用支付后开票业务时,只能调用type=1类型。
type=2(领取发票类型):用于商户发票已开具成功,拉起授权页后让用户将发票归集保存到卡包。
请求方式
请求URL:https://api.weixin.qq.com/card/invoice/getauthurl?access_token={access_token}
请求方法:POST
请求参数
请求参数使用JSON格式,字段如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
s_pappid | String | 是 | 开票平台在微信的标识号,商户需要找开票平台提供 |
order_id | String | 是 | 订单id,在商户内单笔开票请求的唯一识别号, |
money | Int | 是 | 订单金额,以分为单位 |
timestamp | Int | 是 | 时间戳 |
source | String | 是 | 开票来源,app:app开票,web:微信h5开票,wxa:小程序开发票,wap:普通网页开票 |
redirect_url | String | 否 | 授权成功后跳转页面。本字段只有在source为H5的时候需要填写,引导用户在微信中进行下一步流程。app开票因为从外部app拉起微信授权页,授权完成后自动回到原来的app,故无需填写。 |
ticket | String | 是 | 从上一环节中获取 |
type | Int | 是 | 授权类型,0:开票授权,1:填写字段开票授权,2:领票授权 |
返回结果
返回结果使用JSON格式,字段如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
errcode | Int | 是 | 错误码 |
errmsg | String | 是 | 错误信息 |
当错误码为0时,有以下信息:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
auth_url | String | 是 | 授权链接 |
appid | String | 否 | source为wxa时才有 |
示例代码
请求:
{
"s_pappid": "wxabcd",
"order_id": "1234",
"money": 11,
"timestamp": 1474875876,
"source": "web",
"redirect_url": "https://mp.weixin.qq.com",
"ticket": "tttt",
"type": 1
}
返回:
{
"errcode": 0,
"errmsg": "ok",
"auth_url": "http://auth_url"
}
如果是小程序,返回:
{
"errcode": 0,
"errmsg": "ok",
"auth_url": "auth_url"
"appid": "appid"
}
# 3 小程序打开授权页
接口说明
小程序需要先使用小程序账号调用获取授权页链接接口,获取到授权连接,才能打开授权页。
请求方式
在小程序中调用wx.navigateToMiniProgram方法。
请求参数
请求参数使用JSON格式,字段如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
appid | string | 是 | 获取授权页链接返回的appid |
path | string | 是 | 获取授权页链接返回的auth_url |
返回结果
用户授权的结果,将通过小程序的callback通知商户。
示例代码
wx.navigateToMiniProgram({
appId: '{appid}',
path: '{auth_url}',
success(res) {
console.log('navigateToMiniProgram success:', res)
},
fail(error){
console.log('navigateToMiniProgram fail:', error)
},
complete(res){
console.log('navigateToMiniProgram complete:', res)
}
})
# 4 ios客户端打开授权页
接口说明
ios客户端需要先使用open账号调用获取授权页链接接口,获取到授权连接,才能打开授权页。
请求方式
调用sendReq接口
请求参数
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
urlString | string | 是 | 获取授权页链接返回的auth_url |
返回结果
客户端接收微信发票授权返回接口,需要实现onResp方法。返回结果字段如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
errCode | int | 是 | 错误码 |
wxOrderId | string | 是 | 授权订单号 |
示例代码
发送请求
WXInvoiceAuthInsertReq *req = [[WXInvoiceAuthInsertReq alloc] init];
req.urlString = self.authUrl;
[WXApi sendReq:req];
接收返回
- (void) onResp:(BaseResp *)resp
{
if ([resp isKindOfClass:[WXInvoiceAuthInsertResp class]]) {
WXInvoiceAuthInsertResp *wxResp = (WXInvoiceAuthInsertResp *) resp;
NSString *strTitle = @"微信回跳";
NSString *strMsg = [NSString stringWithFormat:@"errcode: %d orderid:%@", wxResp.errCode, wxResp.wxOrderId];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
[alert show];
}
}
备注
用户从商户客户端跳到微信客户端进行发票开票授权之后,有可能不返回商户客户端(比如用户直接杀死微信进程),所以商户不能依赖微信客户端的返回来判断用户是否有授权。微信电子发票平台提供了公众号callback机制,当用户进行发票开票授权时,微信电子发票平台会通过callback通知商户。另外,微信电子发票平台还提供了查询是否授权接口。
正确的使用方法:
1 商户使用open账号调用接口获取授权连接
2 用户在商户客户端进入开发票页面,通过微信sdk跳转到微信客户端,进行发票插卡授权
3 商户公众号接收callback,确定用户是否有授权
4 商户客户端接收到微信客户端发票插卡授权的回跳时,使用open账号调用接口查询用户是否有授权
5 用户在商户客户端再次进入开发票页面时,使用open账号调用接口查询用户是否有授权
6 如果用户有授权,就通知开票平台开发票
# 5 android客户端打开授权页
接口说明
android客户端需要先调用获取授权页链接接口,获取到授权连接,才能打开授权页。
请求方式
调用sendReq接口
请求参数
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
urlString | string | 是 | 获取授权页链接返回的auth_url |
返回结果
客户端接收微信发票授权返回接口,需要实现onResp方法。返回结果字段如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
errCode | int | 是 | 错误码 |
wxOrderId | string | 是 | 授权订单号 |
示例代码
发送请求
WXInvoiceAuthInsert.Req oReq = new WXInvoiceAuthInsert.Req();
oReq.url = sJumpUrl;
api.sendReq(oReq);
接收返回
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String APP_ID = "wxxxxxxxxxxx";
private IWXAPI api;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, APP_ID, true);
api.handleIntent(getIntent(), this);
}
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp baseResp) {
Toast.makeText(getApplicationContext(), "onResp", Toast.LENGTH_LONG).show();
if (baseResp.getClass().equals(WXInvoiceAuthInsert.Resp.class)) {
WXInvoiceAuthInsert.Resp oResp = (WXInvoiceAuthInsert.Resp) baseResp;
String sLog = "errcode:" + oResp.errCode + " wxorderid:" + oResp.wxOrderId;
System.out.print(sLog);
}
}
}
备注
用户从商户客户端跳到微信客户端进行发票开票授权之后,有可能不返回商户客户端(比如用户直接杀死微信进程),所以商户不能依赖微信客户端的返回来判断用户是否有授权。微信电子发票平台提供了公众号callback机制,当用户进行发票开票授权时,微信电子发票平台会通过callback通知商户。另外,微信电子发票平台还提供了查询是否授权接口。
正确的使用方法:
1 商户使用open账号调用接口获取授权连接
2 用户在商户客户端进入开发票页面,通过微信sdk跳转到微信客户端,进行发票插卡授权
3 商户公众号接收callback,确定用户是否有授权
4 商户客户端接收到微信客户端发票插卡授权的回跳时,使用open账号调用接口查询用户是否有授权
5 用户在商户客户端再次进入开发票页面时,使用open账号调用接口查询用户是否有授权
6 如果用户有授权,就通知开票平台开发票
# 6 收取授权完成事件推送
接口说明
在用户授权同意发票存入自己微信账户后,商户可以收到授权完成的状态推送。收到推送后,可以将order_id连同开票信息一并发送给开票平台,以便开票平台在开票成功后将电子发票插入用户卡包。
该事件将发送至开发者填写的URL(登录公众平台进入【开发者中心设置】,如果是open账号,也得用公众号账号来接,参考下图)。
微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。关于重试的消息排重,推荐使用FromUserName + CreateTime 排重。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。
返回结果
返回结果为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:公众号开票,app:app开票,wxa:小程序开票,wap:h5开票 |
示例代码
<?xml version="1.0" encoding="utf-8"?>
<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>
# 7 查询授权完成状态
接口说明
本接口的调用场景包括两个:
一、若商户在某次向用户展示授权页后经过较长时间仍未收到授权完成状态推送,可以使用本接口主动查询用户是否实际上已完成授权,只是由于网络等原因未收到授权完成事件;
二、若商户向用户展示的授权页为type=1类型,商户在收到授权完成事件推送后需要进一步获取用户的开票信息,也可以调用本接口。
请求方式
请求URL:https://api.weixin.qq.com/card/invoice/getauthdata?access_token={access_token}
请求方法:POST
请求参数
请求参数使用JSON格式,字段如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
order_id | string | 是 | 发票order_id |
s_pappid | String | 是 | 开票平台在微信的标识,由开票平台告知商户 |
返回结果
返回结果使用JSON格式,字段如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
errcode | Int | 是 | 错误码 |
errmsg | String | 是 | 错误信息 |
invoice_status | String | 否 | 订单授权状态,当errcode为0时会出现 |
auth_time | Int | 否 | 授权时间,为十位时间戳(utc+8),当errcode为0时会出现 |
user_auth_info | Object | 否 | 用户授权信息结构体,仅在授权页为type=1时出现 |
示例代码
请求:
{
"s_pappid": "{s_pappid}",
"order_id": "{order_id}"
}
返回:
若用户填入的是个人抬头:
{
"errcode": 0,
"errmsg": "ok",
"invoice_status": "auth success",
"auth_time": 1480342498,
"user_auth_info": {
"user_field": {
"title": "Dhxhhx ",
"phone": "5554545",
"email": "dhxhxhhx@qq.cind",
"custom_field": [
{
"key": "field1",
"value": "管理理论"
}
]
}
}
}
若用户填入的是单位抬头:
{
"errcode": 0,
"errmsg": "ok",
"invoice_status": "auth success",
"auth_time": 1480342897,
"user_auth_info": {
"biz_field": {
"title": "xx公司",
"tax_no": "6464646766",
"addr": "xx大厦",
"phone": "1557548768",
"bank_type": "xx银行",
"bank_no": "545454646",
"custom_field": [
{
"key": "field2",
"value": "哈哈哈啊"
}
]
}
}
}
# 8 拒绝开票
接口说明
用户完成授权后,商户若发现用户提交信息错误、或者发生了退款时,可以调用该接口拒绝开票并告知用户。拒绝开票后,该订单无法向用户再次开票。已经拒绝开票的订单,无法再次使用,如果要重新开票,需使用新的order_id,获取授权链接,让用户再次授权。 调用接口后用户侧收到的通知消息如下图所示:
请求方式
请求URL:https://api.weixin.qq.com/card/invoice/rejectinsert?access_token={access_token}
请求方法:POST
请求参数
请求参数使用JSON格式,字段如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
s_pappid | string | 是 | 开票平台在微信上的标识,由开票平台告知商户 |
order_id | string | 是 | 订单 id |
reason | string | 是 | 商家解释拒绝开票的原因,如重复开票,抬头无效、已退货无法开票等 |
url | string | 否 | 跳转链接,引导用户进行下一步处理,如重新发起开票、重新填写抬头、展示订单情况等 |
返回结果
返回结果使用JSON格式,字段如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
errcode | int | 是 | 错误码 |
errmsg | string | 是 | 错误信息 |
示例代码
请求:
{
"s_pappid": "d3JCEfhGLW+q0iGP+o9",
"order_id": "111229",
"reason": "1234",
url": "http://xxx.com"
}
返回:
{
"errcode": 0,
"errmsg": "ok"
}
# 9 设置授权页字段信息
接口说明
当用户使用type=1的类型的授权页时,可以使用本接口设置授权页上需要用户填写的信息。若使用type=0或type=2类型的授权页,无需调用本接口。本接口为一次性设置,后续除非在需要调整页面字段时才需要再次调用。
注意,设置为显示状态的字段均为必填字段,用户若不填写将无法进入后续流程
请求方式
请求URL:https://api.weixin.qq.com/card/invoice/setbizattr?action=set_auth_field&access_token={access_token}
请求方法:POST
请求参数
请求参数使用JSON格式,字段如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
auth_field | Object | 是 | 授权页字段 |
auth_field为Object,包含以下字段:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
user_field | Object | 是 | 授权页个人发票字段 |
biz_field | Object | 是 | 授权页单位发票字段 |
user_field为Object,包含以下字段:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
show_title | Int | 否 | 是否填写抬头,0为否,1为是 |
show_phone | Int | 否 | 是否填写电话号码,0为否,1为是 |
show_email | Int | 否 | 是否填写邮箱,0为否,1为是 |
require_phone | Int | 否 | 电话号码是否必填,0为否,1为是 |
require_email | Int | 否 | 邮箱是否必填,0位否,1为是 |
custom_field | Object | 否 | 自定义字段 |
biz_field为Object,包含以下字段:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
show_title | Int | 否 | 是否填写抬头,0为否,1为是 |
show_tax_no | Int | 否 | 是否填写税号,0为否,1为是 |
show_addr | Int | 否 | 是否填写单位地址,0为否,1为是 |
show_phone | Int | 否 | 是否填写电话号码,0为否,1为是 |
show_bank_type | Int | 否 | 是否填写开户银行,0为否,1为是 |
show_bank_no | Int | 否 | 是否填写银行账号,0为否,1为是 |
require_tax_no | Int | 否 | 税号是否必填,0为否,1为是 |
require_addr | Int | 否 | 单位地址是否必填,0为否,1为是 |
require_phone | Int | 否 | 电话号码是否必填,0为否,1为是 |
require_bank_type | Int | 否 | 开户类型是否必填,0为否,1为是 |
require_bank_no | Int | 否 | 税号是否必填,0为否,1为是 |
custom_field | Object | 否 | 自定义字段 |
custom_field为List,每个对象包含以下字段:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
key | String | 是 | 字段名 |
is_require | Int | 否 | 0:否,1:是, 默认为0 |
notice | String | 否 | 提示文案 |
返回结果
返回结果使用JSON格式,字段如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
errcode | Int | 是 | 错误码 |
errmsg | String | 是 | 错误信息 |
示例代码
请求:
{
"auth_field" : {
"user_field" : {
"require_phone" : 1,
"custom_field" : [
{
"is_require" : 1,
"key" : "field1"
}
],
"show_email" : 1,
"show_title" : 1,
"show_phone" : 1,
"require_email" : 1
},
"biz_field" : {
"require_phone" : 0,
"custom_field" : [
{
"is_require" : 0,
"key" : "field2"
}
],
"require_bank_type" : 0,
"require_tax_no" : 0,
"show_addr" : 1,
"require_addr" : 0,
"show_title" : 1,
"show_tax_no" : 1,
"show_phone" : 1,
"show_bank_type" : 1,
"show_bank_no" : 1,
"require_bank_no" : 0
}
}
}
返回:
{
"errcode": 0,
"errmsg": "ok"
}
# 10 查询授权页字段信息
接口说明
商户可以通过本接口查询到授权页的字段设置情况。
请求方式
请求URL:https://api.weixin.qq.com/card/invoice/setbizattr?action=get_auth_field&access_token={access_token}
请求方法:POST
请求参数
请求参数使用JSON格式,传入空值,即{}
返回结果
返回结果使用JSON格式,字段如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
errcode | Int | 是 | 错误码 |
errmsg | String | 是 | 错误信息 |
auth_field | Object | 否 | 当错误码为0时非空,为查询所得的授权页字段设置情况 |
auth_field为Object,包含以下字段:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
user_field | Object | 否 | 授权页个人发票字段 |
biz_field | Object | 否 | 授权页单位发票字段 |
user_filed为Object,包含以下字段:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
show_title | Int | 否 | 是否填写抬头,0为否,1为是 |
show_phone | Int | 否 | 是否填写电话号码,0为否,1为是 |
show_email | Int | 否 | 是否填写邮箱,0为否,1为是 |
require_phone | Int | 否 | 电话是否必填,0为否,1为是 |
require_email | Int | 否 | 邮箱是否必填,0为 |
custom_field | Object | 否 | 自定义字段 |
biz_field为Object,包含以下字段:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
show_title | Int | 否 | 是否填写抬头,0为否,1为是 |
show_tax_no | Int | 否 | 是否填写税号,0为否,1为是 |
show_addr | Int | 否 | 是否填写单位地址,0为否,1为是 |
show_phone | Int | 否 | 是否填写电话号码,0为否,1为是 |
show_bank_type | Int | 否 | 是否填写开户银行,0为否,1为是 |
show_bank_no | Int | 否 | 是否填写银行账号,0为否,1为是 |
require_tax_no | Int | 否 | 税号是否必填,0为否,1为是 |
require_addr | Int | 否 | 单位地址是否必填,0为否,1为是 |
require_phone | Int | 否 | 电话号码是否必填,0为否,1为是 |
require_bank_type | Int | 否 | 开户类型是否必填,0为否,1为是 |
require_bank_no | Int | 否 | 税号是否必填,0为否,1为是 |
require_tax_no | Int | 否 | 税号是否必填,0为否,1为是 |
custom_field | Object | 否 | 自定义字段 |
custom_field为list每个对象包括以下字段:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
key | String | 是 | 自定义字段名称,最长5个字 |
Is_require | Int | 否 | 自定义字段是否必填,0位否,1为是 |
示例代码
请求: {}
返回:
{
"errcode": 0,
"errmsg": "ok",
"auth_field": {
"user_field": {
"show_title": 1,
"show_phone": 1,
"show_email": 1,
"custom_field": [{"key": "field1"}]
},
"biz_field": {
"show_title": 1,
"show_tax_no": 1,
"show_addr": 1,
"show_phone": 1,
"show_bank_type": 1,
"show_bank_no": 1,
"custom_field": [{"key": "field2"}]
}
}
}
# 11 关联商户号与开票平台
接口说明
商户使用支付后开票,需要先将自身的商户号和开票平台的识别号进行关联,开票平台识别号由开票平台根据微信规则生成后告知商户。本接口为一次性设置,后续一般在遇到开票平台识别号变更,或者商户更换开票平台时才需要调用本接口重设对应关系。
若商户已经实现电子发票的微信卡包送达方案,调用本接口前,建议在微信支付商户平台中确认商户号所绑定的公众号和拉起授权页的公众号是同一个。若不是同一个,仍需重新使用商户号所绑定公众号去调通拉取授权页的接口。
请求方式
请求URL:https://api.weixin.qq.com/card/invoice/setbizattr?action=set_pay_mch&access_token={access_token}
请求方法:POST
请求参数
请求参数使用JSON格式,字段如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
paymch_info | Object | 是 | 微信商户号与开票平台关系信息 |
paymch_info是Object,里面包括以下字段:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
mchid | string | 是 | 微信支付商户号 |
s_pappid | string | 是 | 为该商户提供开票服务的开票平台 id ,由开票平台提供给商户 |
返回结果
返回结果使用JSON格式,字段如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
errcode | int | 是 | 错误码 |
errmsg | string | 是 | 错误信息 |
示例代码
请求:
{
"paymch_info":
{
"mchid": "1234",
"s_pappid": "wxabcd"
}
}
返回:
{
"errcode": 0,
"errmsg": "ok"
}
# 12 查询商户号与开票平台关联情况
接口说明
商户可以通过本接口查询到与开票平台的绑定情况。
请求方式
请求URL:https://api.weixin.qq.com/card/invoice/setbizattr?action=get_pay_mch&access_token={access_token}
请求方法:POST
请求参数
请求参数使用JSON格式,传入空值{}
返回结果
返回结果数据使用JSON格式,结果字段清单如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
errcode | int | 是 | 错误码 |
errmsg | string | 是 | 错误信息 |
paymch_info | object | 否 | 当 errcode 为 0 时出现,为商户号与开票平台的关联情况 |
当errcode为0时,返回数据中还有paymch_info对象,paymch_info包括以下字段:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
mchid | string | 是 | 微信支付商户号 |
s_pappid | string | 是 | 绑定的开票平台识别码 |
示例代码
请求: {}
返回:
{
"errcode": 0,
"errmsg": "ok",
"paymch_info":
{
"mchid": "1234",
"s_pappid": "wxabcd"
}
}
# 13 指定单笔交易支持支付后开票
接口说明
对于可以开具电子发票的商户,完成了微信商户号与开票平台的关联设置后,可以以单笔支付为单位,指定在支付成功消息上是否出现开发票的入口。让用户可以通过该入口发起开票。
请求方式
指定单笔交易支持支付后开票使用的接口协议、调用方式与线上 支付文档一致,本功能是在原支付接口上新增字段。
请求参数
用户确认下单后,商户在支付接口(统一下单/提交刷卡支付/委托代扣)中新增提交receipt字段作为标识需要开电子发票。字段参数说明如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
receipt | string | 否 | Y ,传入 Y 时,支付成功消息和支付详情页将出现开票入口 |
返回结果
与原支付接口返回结果相一致。
示例代码
<xml>
<appid>wx2421b1c4370ec43b </appid>
<attach>支付测试</attach>
<body>JSAPI支付测试</body>
<mch_id>10000100</mch_id>
<receipt>Y</receipt>
<nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str>
<notify_url>http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php</notify_url>
<openid>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid>
<out_trade_no>1415659990</out_trade_no>
<spbill_create_ip>14.23.150.211</spbill_create_ip>
<total_fee>1</total_fee>
<trade_type>JSAPI</trade_type>
<sign>0CB01533B8C1EF103065174F50BCA001</sign>
</xml>
# 14 设置商户联系方式
接口说明 商户获取授权链接之前,需要先设置商户的联系方式
请求方式 请求URL:https://api.weixin.qq.com/card/invoice/setbizattr?action=set_contact&access_token={access_token}
请求方法:POST
请求参数使用JSON格式,字段如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
contact | Object | 是 | 联系方式信息 |
contact是Object,里面包括以下字段:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
time_out | int | 是 | 开票超时时间 |
phone | string | 是 | 联系电话 |
返回结果 返回结果使用JSON格式,字段如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
errcode | int | 是 | 错误码 |
errmsg | string | 是 | 错误信息 |
示例代码
请求:
{
"contact" :
{
"phone" : "88888888",
"time_out" : 12345
}
}
返回:
{
"errcode": 0,
"errmsg": "ok"
}
# 15 查询商户联系方式
接口说明 商户获取授权链接之前,需要先设置商户的联系方式
请求方式 请求URL:https://api.weixin.qq.com/card/invoice/setbizattr?action=get_contact&access_token={access_token}
请求方法:POST
请求参数使用JSON格式,传入空值{}
返回结果 返回结果使用JSON格式,字段如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
errcode | int | 是 | 错误码 |
errmsg | string | 是 | 错误信息 |
contact | Object | 是 | 联系方式信息 |
contact是Object,里面包括以下字段:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
time_out | int | 是 | 开票超时时间 |
phone | string | 是 | 联系电话 |
示例代码
请求:
{}
返回:
{
"contact" : {
"phone" : "88888888",
"time_out" : 12345
},
"errcode" : 0,
"errmsg" : "ok"
}
# 99 错误码
错误码 | 错误信息 | 备注 |
---|---|---|
0 | OK | 成功 |
40097 | invalid args size | type参数值不符预期 |
72015 | unauthorized create invoice | 没有开票平台的权限,请检查是否已开通相应权限。 |
72023 | invoice has been lock | 发票已被其他公众号锁定。一般为发票已进入后续报销流程,报销企业公众号/企业号/App锁定了发票。 |
72024 | invoice status error | 发票状态错误 |
72025 | invoice token error | wx_invoice_token 无效 |
72028 | invoice never set pay mch info | 未设置微信支付商户信息 |
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 | 发票抬头二维码超时 |
72063 | biz contact is empty | 商户联系方式未空,请先调用接口设置商户联系方式 |
73000 | sys error make out invoice failed | 开票平台逻辑错误 |
73001 | wxopenid error | OpenId错误 |
73002 | ddh orderid empty | 订单号为空 |
73003 | fpqqlsh empty | 发票流水号为空 |
73004 | kplx empty | 发票流水号为空 |
73007 | nsrmc empty | 纳税人名称为空 |
73008 | nsrdz empty | 纳税人地址为空 |
73009 | nsrdh empty | 纳税人电话为空 |
73010 | ghfmc empty | 购货方名称为空 |
73011 | kpr empty | 开票人为空 |
73012 | jshj empty | 计税合计为空 |
73013 | hjje empty | 合计金额为空 |
73014 | hjse empty | 合计税额为空 |
73015 | hylx empty | 行业类型为空 |
73016 | nsrsbh empty | 纳税人识别号为空 |
73100 | ka plat error | 开票平台错误 |
73101 | nsrsbh not cmp | 纳税人识别号不匹配,请求中的纳税人识别号和创建工单填写的纳税人识别号不一致 |
73102 | sys error | 微信开票平台系统错误 |
73105 | Kp plat make invoice timeout, please try again with the same fpqqlsh | 开票平台开票中,请使用相同的发票请求流水号重试开票 |
73106 | Fpqqlsh exist with different ddh | 发票请求流水号已存在,并被其他订单号占用 |
73107 | Fpqqlsh is processing, please wait and query later | 发票请求流水正在被处理,请通过查询接口获取结果 |
73108 | This ddh with other fpqqlsh already exist | 该订单已被其他发票请求流水处理 |
73110 | fpqqlsh first 6 byte not cmp | 发票请求流水号前6位不正确 |
40078 | invalid card status | card_id未授权。 若开发者使用沙箱环境报此错误,主要因为未将调用接口的微信添加到测试把名单; 若开发者使用正式环境报此错误,主要原因可能为:调用接口公众号未开通卡券权限,或创建card_id与插卡时间间隔过短。 |