更新记录
1.0.1(2024-02-03)
下单后有使用问题联系客服 QQ:183654371
1.0.0(2024-02-03)
发布uniCloud版本
平台兼容性
阿里云 | 腾讯云 | 支付宝云 |
---|---|---|
√ | √ | √ |
云函数类插件通用教程
使用云函数类插件的前提是:使用HBuilderX 2.9+
下单后有使用问题联系客服 QQ:183654371
版本:ver 2.9.345
关于费用
- 插件市场售卖的是uniCloud版的对接源码
- 票帮手的API是付费才能使用的,本插件不包含API的费用。但是了解下来票帮手是最实惠的。
项目 | 某宝 | 其它平台 | 票帮手 |
---|---|---|---|
小规模企业 | ¥4500/年/税号 | ¥4000/年/税号 | ¥1680/年/税号 |
中大规模企业 | ¥4500/年/税号 | ¥4000/年/税号 | ¥2980/年/税号 |
服务商模式 | 无 | 10000-30000不等的通道费 | 5000元,税号服务费有折扣 |
API 列表
如果你的业务不部署在uniCloud,可以参考本插件源码和接口规范,用你的业务所用语言实现网络请求。
API | 描述 |
---|---|
pbs.addClient(data) | 添加新客户 |
pbs.clients(data) | 查询客户列表 |
pbs.loginEtax(data) | 登陆电子税务局 |
pbs.setEtaxSMS(data) | 设置电子税务局短信验证码,必须先以短信登陆模式调用pbs.loginEtax |
pbs.submitInvoices(data) | 开发票(蓝字和红字统一接口) |
pbs.resubmitInvoices(data) | 重新提交待开票的发票列表 |
pbs.invoices(data) | 获取销项发票列表,包含已开发票或未开发票或进行中的 |
pbs.backToDraft(data) | 将开票中的发票撤回到草稿箱 |
pbs.delFromDraft(data) | 将发票从草稿箱删除 |
pbs.getInvoiceStatus(data) | 获取开票结果,异步模式 |
pbs.getEtaxGoodsCates(data) | 获取税务局税种分类名称数据 |
pbs.searchEtaxGoodsCates(data) | 用关键字查询税务局税种分类名称数据 |
接入方式
如果在uniCloud
部署应用,您无需关心接口规范中的请求方式、headers
、以及签名处理,本插件已实现。
如果的应用没有部署在uniCloud
,您需要遵照下一节的接口规范实现接口通讯。
// 以下是nodejs代码示例
const appid = '您的AppID'
const secret = '您的AppSecret'
const url = 'https://api域名/pathname'
const time = Date.now()
const nonce = '随机字符串'
const params = {
// 请求入参
}
// 拼合字串
const query = JSON.stringify(params) + `&time=${time}&nonce=${nonce}&secret=${secret}`
// 创建md5签名
const sign = require('crypto').createHash('md5').update(query).digest('hex')
// 组装post data
data = {...params, time, nonce, sign}
// 非 uniCloud 环境用 axios 或其他网络请求库
// uniCloud环境用 uniCloud.httpclient 发起网络请求
const res = await uniCloud.httpclient.request(url, {
data,
headers:{appid},
method:'POST',
dataType:'json',
contentType:'json'
})
接口规范
- 请求方式:
POST
- 请求和返回参数类型均为
JSON
headers = { appid }
请求headers
必须为您的appid
- 请求数据需要做
md5
签名 - 返回值中有
code
和msg
节点,code = 0
表示请求成功,不等于0表示请求失败,msg
为请求失败的信息 - 所有参数字符采用
utf-8
字符集
手把手使用教程
1 下载HBuilderX
安装运行,并登录你的开发者账号,在uniCloud web控制台
创建好云空间备用;
2 下载插件导入HBuilderX
,在uniCloud
上点右键选择关联云服务空间或项目
,选择你创建的云空间,然后在uniCloud/database/db_init.json
点右键选择初始化云数据库
3 登陆 票帮手 注册并获取你的AppID
和AppSeccret
并填写到云数据库pbs-config
表的第一条记录中,可以采取以下任一方式:
1、可以手动登陆你的云空间修改pbs-config
的第一条记录中的appid
和secret
2、检查uniCloud/cloudfunctions/api/pbs/pbs.param.json
中设置"path":"/init"
,然后打开uniCloud/cloudfunctions/api/pbs/api/init.js
,将appid
和secret
的值填写好以后,在uniCloud/cloudfunctions/api/
上点右键“运行-本地云函数”,程序会将你的appid
和secret
更新到pbs-config
的第一条记录中
4 在uniCloud
部署项目
- 依次上传
uniCloud/cloudfunctions/common/
下所有公共模块 - 上传
uniCloud/cloudfunctions/api
云函数
对接流程:
-
在【票帮手】注册账号,获得你的AppID。
-
将
appid
和secret
设置到系统。 -
添加企业客户,调用
pbs.addClient()
直连模式只能添加一家企业,服务商模式可以添加多家不同的企业。 -
开票前调用
pbs.loginEtax()
登录电子税务(需要电子税务账号和密码)指定扫脸或者验证码登录模式-
选择验证码模式,等收到验证码,调用
pbs.setEtaxSMS()
设置验证码 -
选择扫脸模式,会返回
qrcode
,展示给用户扫码人脸验证(需要用当地税务局的APP扫码)
-
-
只有以上流程执行成功才能开票、获取发票等接口
-
登录成功调用开票接口
pbs.submitInvoices()
,开票如果返回以下code
-
如果code = NEED_LOGIN,需要重新调用
pbs.loginEtax()
登录电子税务 -
如果存储了账号密码,会自动调用登录,返回code = NEED_SMS_CODE,需要调用
pbs.setEtaxSMS()
回传短信验证码 -
如果code = NEED_FACE_VERIFY,同时会返回
qrcode
,需要用qrcode
生成二维码给用户扫码人脸验证(需要用当地税务局的APP扫码)
-
添加新客户
await pbs.addClient(data)
添加企业客户信息到你的账号下
入参data字段说明
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
qymc | string | 是 | 企业的名称 |
qysh | string | 是 | 企业的税号 |
dqdm | string | 是 | 所属省份代码,见下文 |
省份代码
对应的codes.js
在/uniCloud/cloudfunctions/api/config/codes.js
序号 | 省市代码 | 省市名称 |
---|---|---|
1 | 1100 | 北京 |
2 | 1200 | 天津 |
3 | 3100 | 上海 |
4 | 4403 | 深圳 |
5 | 5000 | 重庆 |
6 | 2102 | 大连 |
7 | 3702 | 青岛 |
8 | 3302 | 宁波 |
9 | 3502 | 厦门 |
10 | 3400 | 安徽 |
11 | 3500 | 福建 |
12 | 3600 | 江西 |
13 | 3700 | 山东 |
14 | 4100 | 河南 |
15 | 4200 | 湖北 |
16 | 4300 | 湖南 |
17 | 4400 | 广东 |
18 | 4500 | 广西 |
19 | 4600 | 海南 |
20 | 1400 | 山西 |
21 | 5100 | 四川 |
22 | 5200 | 贵州 |
23 | 5300 | 云南 |
24 | 5400 | 西藏 |
25 | 6100 | 陕西 |
26 | 6200 | 甘肃 |
27 | 6300 | 青海 |
28 | 6400 | 宁夏 |
29 | 6500 | 新疆 |
30 | 1500 | 内蒙 |
31 | 1300 | 河北 |
32 | 2100 | 辽宁 |
33 | 2200 | 吉林 |
34 | 2300 | 黑龙江 |
35 | 3200 | 江苏 |
36 | 3300 | 浙江 |
返回值说明
字段 | 类型 | 说明 |
---|---|---|
code | int | 0 表示添加成功 |
msg | string | 添加不成功原因 |
spid | string | 该企业税号对应的spid,后续接口不论登陆、开票等需要传入spid代表该企业 |
如果添加失败,msg
=企业已存在
,则表示该企业已经被其他服务商添加到系统,需要联系客户确定是否与原服务商存在合作关系。
插件使用示例
const pbs = require('yun2-pbs-unicloud')
const data = {
qymc:"企业名称",
qysh:"企业税号",
ssdq:"省份编号"
}
const{code,msg,spid} = await pbs.addClient(data)
API调用示例
const config = {
appid:"您的appid",
secret:"您的secret"
}
const params = {
qymc:"企业名称",
qysh:"企业税号",
ssdq:"省份编号"
}
const url = 'https://i.pbs.net.cn/api/addClient'
const time = Date.now()
// 拼合字串
const query = JSON.stringify(params) + `&time=${time}&secret=${config.secret}`
// 创建md5签名
const sign = require('crypto').createHash('md5').update(query).digest('hex')
// 组装post data
data = {...params, time, sign}
const{code,msg,spid} = await uniCloud.httpclient.request(url, {
data,
method:'POST',
dataType:'json',
contentType:'json'
})
查询客户列表
await pbs.clients(data)
获取您账号下的客户列表。
入参data字段说明
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
keywords | string | 否 | 关键字,匹配税号,公司名称 |
pageIndex | int | 是 | 页码 |
pageSize | int | 是 | 分页 |
返回值说明
字段 | 类型 | 说明 |
---|---|---|
code | int | 0 表示执行成功 |
msg | string | 错误信息 |
hasMore | boolean | 对于当前页码来说是否还有下一页 |
total | int | 总数 |
rows | Array | 客户信息 |
客户rows信息说明
字段 | 类型 | 说明 |
---|---|---|
qymc | string | 企业的名称 |
qysh | string | 企业的税号 |
ssdq | string | 所在地区名称 |
dqdm | string | 所在地区代码 |
kpr | string | 开票人 |
fhr | string | 复核人 |
skr | string | 收款人 |
dzdh | string | 地址电话 |
yhzh | string | 银行账号 |
spid | string | 企业spid |
object说明
字段 | 类型 | 说明 |
---|---|---|
HasBuyInv | string | 是否有购入发票信息,1有,0无 |
HasRepData | string | 汇总报送资料,1有,0无 |
HasRetInv | string | 退回发票信息,1有,0无 |
InvoiceLimit | string | 单张发票限额 |
IsLockTime | string | 是否到锁死期,1是,0未到期 |
LastRepDate | string | 上次汇总报送日期 |
LockedDate | string | 锁时日期 |
MonthAmoutTotal | string | 本月正数金额 |
NextRepDate | string | 下个汇总期 |
OffLineAmoutLeft | string | 离线剩余金额 |
OffLineAmoutLimit | string | 离线金额 |
插件使用示例
const pbs = require('yun2-pbs-unicloud')
const {pageIndex:1, pageSize:10}
const{code,msg,total,rows} = await pbs.clients(data)
if(code==0)
{
console.log(rows) // 客户信息
}
else
{
// console.log(msg) // 报错原因
}
API调用示例
const config = {
appid:"您的appid",
secret:"您的secret"
}
const params = {
pageIndex:"1",
pageSize:"20",
keywords:"关键字" //非必填,不填写表示查询所有
}
const url = 'https://i.pbs.net.cn/api/clients'
const time = Date.now()
// 拼合字串
const query = JSON.stringify(params) + `&time=${time}&secret=${config.secret}`
// 创建md5签名
const sign = require('crypto').createHash('md5').update(query).digest('hex')
// 组装post data
data = {...params, time, sign}
const res = await uniCloud.httpclient.request(url, {
data,
method:'POST',
dataType:'json',
contentType:'json'
})
以下接口不再列举API调用示例
登陆电子税务局
await pbs.loginEtax(data)
- 调用此接口会根据不同的登陆模式(短信登陆或扫脸登陆)返回不同的DATA内容;
- 如果验证码登陆时:调用这个接口时,如果data返回的解密后不是手机号,说明已经登陆成功,无需获以验证码(系统已经在登陆状态),同理,扫脸登陆时也是一样。
入参data字段说明
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
spid | string | 是 | 添加客户的时候获取的企业spid |
account | string | 是 | 电子税务局账号 |
password | string | 是 | 电子税务局密码 |
type | int | 是 | 1 手机卡托管模式(请咨询客服) 2,调用方式输入短信,3、二维码扫脸登陆 |
save | int | 否 | 1 表示将账号和密码保存,后期需要登陆的时候会自动登陆,返回code=NEED_SMS ,客户端要弹窗要求用户输入验证码 |
手机卡托管模式,是将手机卡托管在我公司,后期登陆无需人工输入验证码,实现自动登陆,无需再调用该登陆接口。
返回值说明
字段 | 类型 | 说明 |
---|---|---|
code | int | 0 表示执行成功 |
msg | string | 错误信息 |
qrcode | string | 仅仅在type=3使用人脸扫码时才返回,格式为图片的base64,直接设置为img.src = qrcode 即可显示 |
使用示例
const pbs = require('yun2-pbs-unicloud')
const data = {
qysh:"企业税号",
dzswjyh:"电子税务局账号",
dzswjmm:"电子税务局密码",
dlfs:"2",
}
const{code,msg} = await pbs.loginEtax(data)
设置电子税务局短信验证码
await pbs.setEtaxSMS(data)
调用登录以后,需要填写手机验证码才能登录,财务人员收到验证码后,在企业内部系统填写验证码,流程与登录电子税务局一致。调用此接口前,必须调用登录接口pbs.loginEtax()
我们提供托管手机卡模式,详情联系客服。
入参data字段说明
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
spid | string | 是 | 添加客户的时候获取的企业spid |
yzm | string | 是 | 验证码 |
返回值说明
字段 | 类型 | 说明 |
---|---|---|
code | int | 0 表示执行成功 |
msg | string | 错误信息 |
使用示例
const pbs = require('yun2-pbs-unicloud')
const data = {
qysh:"企业税号",
yzm:"验证码"
}
const{code,msg} = await pbs.setEtaxSMS(data)
返回值说明
字段 | 类型 | 说明 |
---|---|---|
code | int | 0 表示执行成功 |
msg | string | 错误信息 |
使用示例
const pbs = require('yun2-pbs-unicloud')
const data = {
qysh:"企业税号",
}
const{code,msg} = await pbs.waitEtaxQrcode(data)
以上登录接口成功以后调用以下票据相关接口
开发票(蓝字和红字统一接口)
await pbs.submitInvoices(data)
开红字发票和蓝字发票统一调用本接口,蓝色接口数量和金额为正数,红色数量和金额为负数
入参data字段说明
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
spid | string | 是 | 添加客户的时候获取的企业spid |
data | Array | 是 | 发票列表数据,见下文 |
发票列表数据数组示例
data = [
{
"XTLSH": "单据号",
"KHMC": "客户名称",
"KHSH": "税号",
"KHDZ": "地址",
"KHKHYHZH": "客户银行账号",
"FPZL": "发票种类",
"BZ": "备注",
"KPR": "开票人",
"SKR": "收款人",
"FHR": "复核人",
"QYKHYHZH": "企业开户银行账号",
"QYDZDH": "企业地址电话",
"YFPHM": "红冲原发票号",
"XXBBH": "信息表编号",
"QDBZ": "清单标志",
"KHYJ": "客户邮件",
"KHSJ": "客户手机号",
"JDC": "机动车标识",
"DBTS": "代办退税标识",
"ZSFS":"特定业务标识",
"ITEM": [
{
"CPMC": "产品名称1",
"CPXH": "产品型号",
"CPDW": "产品单位",
"SL": "税率",
"CPSL": "数量",
"BHSJE": "不含税金额",
"SE": "税额",
"FLBM": "分类编码",
"XSYH": "税率优惠",
"LSLBZ": "零税率标识",
"YHSM": "优惠说明",
"KCJE":"0"
},
{
"CPMC": "产品名称2",
"CPXH": "产品型号",
"CPDW": "产品单位",
"SL": "税率",
"CPSL": "数量",
"BHSJE": "不含税金额",
"SE": "税额",
"FLBM": "分类编码",
"XSYH": "税率优惠",
"LSLBZ": "零税率标识",
"YHSM": "优惠说明",
"KCJE":"0"
}
],
"FJXX":[
{
"MC":"名称",
"LY":"内容"
},
{
"MC":"名称",
"LY":"内容"}
],
"TDYW":[
{
"BDC_SF":"不动产租赁省份",
"BDC_XXDZ":"不动产租赁详细地址",
"BDC_QSRQ":"不动产租赁起始日期",
"BDC_JZRQ":"不动产租赁截止日期",
"BDC_KSBZ":"不动产租赁跨市标志",
"BDC_CQJH":"不动产租赁产权证号",
"BDC_PJDW":"不动产租赁面积单位",
"BDCXS_CQZH":"不动产销售产品证号",
"BDCXS_DQDZ":"不动产销售所在省份地区",
"BDCXS_XXDZ":"不动产销售详细地址",
"BDCXS_HTBH":"不动产销售合同编号",
"BDCXS_XMBH":"不动产销售项目编号",
"BDCXS_JSJG":"不动产销售计税价格",
"BDCXS_CJJE":"不动产销售成交价格",
"BDCXS_KQBZ":"不动产销售跨区标志",
"BDCXS_MJDW":"不动产销售面积单位",
"LKYS_CXR":"旅客运输出行人",
"LKYS_CXRZJLX":"旅客运输证件类型",
"LKYS_CXRZJHM":"旅客运输证件号码",
"LKYS_CXRQ":"旅客运输出行日期",
"LKYS_CFD":"旅客运输出发地",
"LKYS_DDD":"旅客运输到达地",
"LKYS_JTGJLX":"旅客运输交通工具类型",
"LKYS_DJ":"旅客运输等级",
"HWYS_QYD":"货物运输起运地",
"HWYS_DDD":"货物运输到达地",
"HWYS_YSGJ":"货物运输运输工具",
"HWYS_YSGJTH":"货物运输运输工具牌号",
"HWYS_YSHWMC":"货物运输货物名称",
"GZFW_FSD":"建筑服务发生地",
“GZFW_XXDZ”:"发生地详细地址",
"GZFW_XMMC":"建筑项目名称",
"GZFW_XMBH":"土地增值税项目编号",
"GZFW_KSBZ":"跨地市标志"
},
{
}
}
]
发票列表数据格式说明
列表数据为Array
,最大长度100
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
XTLSH | string | 是 | 单据号(相当于订单号),唯一字段,最大64字符 |
KHMC | string | 是 | 客户名称 |
KHSH | string | 是 | 客户税号, 专票(纸专、电专和全电专票)必传 |
KHDZ | string | 否 | 客户地址 |
KHKHYHZH | string | 否 | 开户银行账号 |
FPZL | string | 是 | 发票种类,004专票 007 普票 026 电票 028 电专 020 全电专票 021 全电普票 |
BZ | string | 否 | 备注 |
KPR | string | 否 | 开票人 |
SKR | string | 否 | 收款人 |
FHR | string | 否 | 复核人 |
QYKHYHZH | string | 否 | 销方银行账号 |
QYDZDH | string | 否 | 销方地址电话 |
YFPHM | string | 是 | 原发票号(原发票代码+原发票号码), 红字发票必传,普票和电票必有,注意:含(代码)总共18位或20位。 |
XXBBH | string | 否 | 信息表编号, 红字纸质专票(004)和电子专票(028)必传,普票电票和数电票不需要传。 |
QDBZ | string | 否 | 清单标志, 默认为0 |
KHYJ | string | 否 | 客户邮件, 自动发邮件 |
KHSJ | string | 否 | 客户手机 |
JDC | string | 否 | 机动车标识, 1为开具机动车专票 |
DBTS | string | 否 | 代办退税标识,1为开具代办退税发票 |
ZSFS | string | 否 | 特定业务标识,BDCZL 不动产租赁,BDCXS 不动产销售,FWYS 货物运输,LKYS 旅客运输,GZFW 建筑服务 |
ITEM信息 | |||
CPMC | string | 是 | 产品名称,如果是折扣行,必需与正数行一致的名称 |
CPXH | string | 否 | 产品型号,如果是折扣行,此值为空 |
CPDW | string | 否 | 产品单位,如果是折扣行,此值为空 |
SL | string | 是 | 税率 |
CPSL | string | 否 | 产品数量,红冲时必须为负 |
BHSJE | string | 是 | 不含税金额,红冲时必须为负 |
SE | string | 是 | 税额,红冲时必须为负 |
FLBM | string | 是 | 分类编码,必需到未级编码 |
XSYH | string | 否 | 税收优惠,有优惠1 无优惠0 |
LSLBZ | string | 否 | 零税率标识 , SL=0时需要设置,1:免税(同时XSYH需设置成1),2:不征税(同时XSYH需设置成1),3:其它或0税率,Sl<>0时,值为空 |
YHSM | string | 否 | 优惠政策说明 |
KCJE | string | 否 | 扣除金额,差额开票时有用 |
返回值说明
字段 | 类型 | 说明 |
---|---|---|
code | int/string | 0 表示执行成功,其它具体见下方说明 |
msg | string | 错误信息 |
qrcode | string | 人脸验证超时,返回了人脸验证的二维码文本数据,需要弹窗让用户扫脸认证 |
successList | Array | 成功的发票数据,见下文 |
errorList | Array | 失败的发票数据,见下文 |
code说明 详见以下描述和代码说明
注意:
code = 0
时,HaveSave = 0
时,说明数据异常,数据没有进行保存,无需调用后续的接口。code = 0
时,HaveSave = 1
时,说明数据正常,但可能是在开票过程中出现异常(例如税务局登陆失效),这时候可以主动调用接口登陆税务局,登陆后调用pbs.resubmitInvoices()
系统会重试进行开具。code
字符串(NEED_LOGIN、NEED_SMS_CODE、NEED_FACE_VERIFY)需要按下表做相应处理- 唯一能确定开票成功开票的情况:
code = 0
并且successList
列表中发票号不为空,如果code = 0
并且successList
列表中返回的发票号码是空的,需要用“获取开票结果”查询开票状态。
代码 | 对应处理 |
---|---|
NEED_LOGIN | 当前登陆失效,需要重新登陆,重新弹窗让用户输入电子税务局账号密码发起登陆 |
NEED_SMS_CODE | 当前登陆失效,用存储的账号密码自动登陆税务局,需要弹窗用户输入手机验证码 |
NEED_FACE_VERIFY | 人脸验证超时,同时返回qrcode ,将qrcode 的值生成二维码给用户用本地税务APP扫码完成人脸验证 |
成功的发票数据示例
successList
Array 字段说明
字段 | 类型 | 说明 |
---|---|---|
xtlsh | string | 单据号 |
fpdm | string | 发票代码 |
fphm | string | 发票号码 |
kprq | string | 开票日期 |
skm | string | 密文 |
jqbh | string | 机器编号 |
ewm | string | 二维码 |
kpjg | string | 开票结果1开票成功 0开票失败 |
kpfk | string | 开票反馈信息 |
jym | string | 校验码 |
sjurl_pdf | string | pdf发票税务下载url |
sjurl_pdf | string | ofd发票税务下载url |
sjurl_pdf | string | xml发票税务下载url |
time | string | 开票具体时间 |
skbhsje | string | 不含税金额 |
skse | string | 税额 |
失败的发票数据示例
errorList
Array 字段说明
字段 | 类型 | 说明 |
---|---|---|
XTLSH | string | 单据号 |
ErrMsg | string | 错误信息 |
HaveSave | string | 是否接收数据成功 |
数据错误示例:
{
"code": 0,
"msg": "折扣行的产品单位必需是空。",
"errorList": [
{
"XTLSH": "144115188078156755",
"ErrMsg": "折扣行的产品单位必需是空。 ",
"HaveSave": "0"
}
],
"successList": [
]
}
发票库存不足:
{
"code": 0,
"msg": "发票已经用完,请申领发票",
"errorList": [
{
"XTLSH": "144115188078708534",
"ErrMsg": "发票已经用完,请申领发票"
}
],
"successList": [
]
}
正常开具:
{
"code": 0,
"msg": "成功",
"errorList": [
],
"successList": [
{
"xtlsh": "144115188079268993",
"fpzl": "026",
"fpdm": "044002100411",
"fphm": "22338521",
"kprq": "20211026",
"skm": "007+1-75<0-42-+64847*2+5/+*11113*448/482-13>>+0173/9775922*4-<+89/28424/-<087/<8**/<183130*+1*130701+6<+1998<424",
"jym": "06441947523575629741",
"jqbh": "237001069144",
"ewm": "01,01,044002100411,22338521,111.63,20211026,06441947523575629741,2C4A,",
"url": "/KPGL/PDFXZ?XYM=06441947523575629741&FPZL=026",
"kpjg": "1",
"pdfxx": "PDF生成成功",
"kpfk": "开具成功"
}
]
}
重复提交:
{
"code": 0,
"msg": "此单据已经开过发票, FPHM = 03100210041182467316:KPRQ =2021-10-25 00:00:00.000。",
"errorList": [
{
"XTLSH": "144115188079291147",
"FPHM": "03100210041182467316",
"KPRQ": "2021-10-25 00:00:00.000",
"MW": "[MDAqOTM1LTUyPjM8PjI4KzI8LTM5KzQxLy8wODw1MS0qKjM0OTkyMjUzMjE2PCs5ODw+NjcwODAzMjgrKjc1Ny0rMTc1NTYyPDkyLzY5Ny80Kz4qLTkwPjMxKzc2OTwyNDcwMTg0MCoxOS0+MTg0Pg==]",
"XYM": "06182134178896463325",
"JQBH": "587005306549",
"FPZL": "026",
"ErrMsg": "此单据已经开过发票, FPHM = 03100210041182467316:KPRQ =2021-10-25 00:00:00.000。 ",
"xtlsh": "144115188079291147",
"fpzl": "026",
"fpdm": "031002100411",
"fphm": "82467316",
"kprq": "20211025",
"skm": " ",
"jym": "06182134178896463325",
"jqbh": "237001069144",
"ewm": "01,01,044002100411, 82467316,111.63,20211025, 06182134178896463325,2C4A,",
"url": "/KPGL/PDFXZ?XYM=06182134178896463325&FPZL=026",
"kpjg": "1",
"pdfxx": "PDF生成成功",
"kpfk": "开具成功"
}
],
"successList": [
]
}
使用示例
const pbs = require('yun2-pbs-unicloud')
const data = {
qysh:"企业税号",
data:[
{
//发票数据
}
]
}
const{code,msg,successList,errorList} = await pbs.submitInvoices(data)
重新提交待开票的发票列表
await pbs.resubmitInvoices(data)
包含蓝字和红字发票
入参data字段说明
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
spid | string | 是 | 添加客户的时候获取的企业spid |
data | Array | 是 | 发票列表数据,见下文 |
async | int | 否 | 1 表示异步开票,不提供或0表示同步开票 |
发票列表数据数组说明
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
FPZL | string | 是 | 发票种类 |
XTLSH | string | 是 | 单据号 |
返回值说明
字段 | 类型 | 说明 |
---|---|---|
code | int/string | 0 表示执行成功,其它具体见下方说明 |
msg | string | 错误信息 |
successList | Array | 成功的发票数据,同开票接口,见上文 |
errorList | Array | 失败的发票数据,同开票接口,见上文 |
code说明
同submitInvoices
代码 | 说明 |
---|---|
NEED_LOGIN | 当前登陆失效,需要重新登陆,需要重新弹窗输入电子税务局账号密码发起登陆,后端重新调用pbs.loginEtax() |
NEED_SMS_CODE | 当前登陆失效,已自动重新登陆,需要弹窗用户输入验证码,后端调用pbs.setEtaxSMS() |
NEED_FACE_VERIFY | 人脸验证超时,同时返回qrcode ,需要弹窗显示二维码;然后客户端每隔1-5秒轮询请求后端,后端执行pbs.waitEtaxQrcodeScan() ,等待扫脸完成。 |
如果返回的code
不是上面三种情况,具体看返回的msg
信息。
使用示例
const pbs = require('yun2-pbs-unicloud')
const data = {
qysh:"企业税号",
data : [
{
FPZL:"发票种类",
XTLSH:"单据号"
},
{
FPZL:"发票种类",
XTLSH:"单据号"
}
]
}
const{code,msg,successList,errorList} = await pbs.resubmitInvoices(data)
获取销项发票列表
await pbs.invoices(data)
分页请求发票列表,传入对应参数,0未开发票、1已开发票、2开票中的发票列表
入参data字段说明
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
qsrq | string | 条件必需 | 起始日期(xtlsh 和 fphm为空时必需输入) |
jzrq | string | 条件必需 | 截止日期(xtlsh 和 fphm为空时必需输入) |
spid | string | 条件是 | 添加客户的时候获取的企业spid |
mxbz | string | 是 | 1,需要获取明细 0不需要获取明细 |
fpzl | string | 否 | 发票种类 |
fpzt | string | 否 | 发票状态,0 草稿箱:待开票,1 已开票(不传时默认),2开票中 |
zfbz | string | 否 | 作废标志0 未作废 1已作废 |
gjz | string | 否 | 关键字,搜索内容为 客户名称,发票号,流水号 |
isupload | string | 否 | 是否上传税务局 0 未上传 1已上传 |
fphm | string | 否 | 发票号,查询某张发票号 |
xxbbh | string | 否 | 信息表编号 |
xtlsh | string | 否 | 单据号 |
iszsfp | string | 否 | 正数发票 |
isfsfp | string | 否 | 负数发票 |
pageIndex | int | 是 | 当前页 |
pageSize | int | 是 | 每页最大数 |
返回值说明
字段 | 类型 | 说明 |
---|---|---|
code | int | 0 表示执行成功 |
msg | string | 错误信息 |
rows | Array | 发票列表数据 |
total | int | 总数 |
发票列表数据说明
字段 | 类型 | 说明 |
---|---|---|
xtlsh | string | 单据号 |
qysh | string | 开票税号 |
xfyh | string | 销方银行和账号 |
xfdz | string | 销方地址电话 |
fplxdm | string | 发票类型代码 |
fpdm | string | 发票代码 |
fphm | string | 发票号码 |
kprq | string | 开票日期 |
ghdwsbh | string | 购货单位识别号 |
ghdwmc | string | 购货单位名称 |
ghdwdzdh | string | 购货单位地址和电话 |
ghdwyhzh | string | 购货单位银行账号 |
hjje | string | 整张发票的合计不含税金额 |
hjse | string | 整张发票的合计税额 |
jshj | string | 整张发票的价税合计 |
url | string | 电子发票的URL |
skr | string | 收款人 |
fhr | string | 复核人 |
kpr | string | 开票人 |
bz | string | 备注 |
yfpdm | string | 原发票代码 |
yfphm | string | 原发票号码 |
tzdbh | string | 信息表编号 |
chfpdm | string | 红冲发票代码 |
chfphm | string | 红冲发票号码 |
spr | string | 收件人(电子邮箱) |
fpdyzt | string | 发票打印状态 |
qdbz | string | 清单标志 |
xym | string | 校验码 |
jqbh | string | 机器编号 |
zfbz | string | 作废标志 |
zfrq | string | 作废日期 |
fpmx发票明细 | ||
spmc | string | 商品名称 |
dj | string | 单价 |
sl | string | 税率 |
spsl | string | 数量 |
je | string | 金额 |
se | string | 税额 |
ggxh | string | 规格型号 |
dw | string | 单位 |
flbm | string | 分类编码 |
xsyh | string | 税收优惠 |
lslbz | string | 零税率标识 |
yhsm | string | 优惠说明 |
使用示例
const pbs = require('yun2-pbs-unicloud')
const data = {
//...参数
}
const{code,msg,rows} = await pbs.invoices(data)
将开票中的发票撤回到草稿箱
await pbs.backToDraft(data)
,将开票中的发票撤回到草稿箱
入参data字段说明
同 pbs.backToDraft(data)
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
spid | string | 是 | 添加客户的时候获取的企业spid |
data | Array | 是 | 发票列表数据,见下文 |
发票列表数据数组说明
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
fpzl | string | 是 | 发票种类 |
xtlsh | string | 是 | 单据号 |
返回值说明
字段 | 类型 | 说明 |
---|---|---|
code | int | 0 表示执行成功 |
将发票从草稿箱删除
await pbs.delFromDraft(data)
,将发票从草稿箱删除
入参data字段说明
同 pbs.delFromDraft(data)
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
spid | string | 是 | 添加客户的时候获取的企业spid |
data | Array | 是 | 发票列表数据,见下文 |
发票列表数据数组说明
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
fpzl | string | 是 | 发票种类 |
xtlsh | string | 是 | 单据号 |
返回值说明
字段 | 类型 | 说明 |
---|---|---|
code | int | 0 表示执行成功 |
获取开票结果
await pbs.getInvoiceStatus(data)
入参data字段说明
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
fpzl | string | 是 | 发票种类 |
xtlsh | string | 是 | 单据号 |
spid | string | 是 | 添加客户的时候获取的企业spid |
返回值说明
字段 | 类型 | 说明 |
---|---|---|
code | int | 0 表示执行成功 |
msg | string | 错误信息 |
XTLSH | string | 单据号 |
FPHM | string | 发票号码(18位或20位)含代码 |
KPRQ | string | 开票日期 |
MW | string | 密文 |
XYM | string | 校验码 |
JQBH | string | 机器编号 |
URL | string | 电子发票下载网址 |
使用示例
const pbs = require('yun2-pbs-unicloud')
const data = {
qysh : '企业税号',
fpzl : '发票种类',
xtlsh : '单据号'
}
const{code,msg} = await pbs.getInvoiceStatus(data)
获取税务局税种分类名称
await pbs.getEtaxGoodsCates(data)
入参data字段说明
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
layer | string | 是 | 树形结构的层级 |
BM | string | 是 | 上级的分类编码 |
返回值说明
字段 | 类型 | 说明 |
---|---|---|
code | int | 0 表示执行成功 |
msg | string | 错误信息 |
rows | Array | 数据 |
rows数据示例:
{
"total": "6",
"rows": [{
"BM": "1000000000000000000",
"MC": "货物",
"SLV": "",
"ZZSTSGL": "",
"HZX": "Y",
"KYZT": "Y",
"BMJC": "货物",
"YPBZ": "0",
"LCOUNT": 1
}, {
"BM": "2000000000000000000",
"MC": "劳务",
"SLV": "",
"ZZSTSGL": "",
"HZX": "Y",
"KYZT": "Y",
"BMJC": "劳务",
"YPBZ": "0",
"LCOUNT": 1
}, {
"BM": "3000000000000000000",
"MC": "销售服务",
"SLV": "",
"ZZSTSGL": "",
"HZX": "Y",
"KYZT": "Y",
"BMJC": "销售服务",
"YPBZ": "0",
"LCOUNT": 1
}, {
"BM": "4000000000000000000",
"MC": "无形资产",
"SLV": "",
"ZZSTSGL": "",
"HZX": "Y",
"KYZT": "Y",
"BMJC": "无形资产",
"YPBZ": "0",
"LCOUNT": 1
}, {
"BM": "5000000000000000000",
"MC": "不动产",
"SLV": "",
"ZZSTSGL": "",
"HZX": "Y",
"KYZT": "Y",
"BMJC": "不动产",
"YPBZ": "0",
"LCOUNT": 1
}, {
"BM": "6000000000000000000",
"MC": "未发生销售行为的不征税项目",
"SLV": "",
"ZZSTSGL": "",
"HZX": "Y",
"KYZT": "Y",
"BMJC": "不征税项目",
"YPBZ": "0",
"LCOUNT": 1
}],
"code": 0,
"result": true,
"msg": "成功"
}
使用示例
// 查询等级分类
const pbs = require('yun2-pbs-unicloud')
const data = {
layer : '0',
BM : ''
}
await pbs.getEtaxGoodsCates(data)
// 查询第一级分类“货物”的子分类
const pbs = require('yun2-pbs-unicloud')
const data = {
layer : '1',
BM : '1000000000000000000'
}
await pbs.getEtaxGoodsCates(data)
查询税务局税种分类名称
允许用户输入关键字查询指定的税种分类 await pbs.searchEtaxGoodsCates(data)
入参data字段说明
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
cpmc | string | 是 | 搜索关键字:如白糖/拍摄 |
返回值说明
字段 | 类型 | 说明 |
---|---|---|
code | int | 0 表示执行成功 |
msg | string | 错误信息 |
rows | Array | 数据 |