# 1 业务说明
# 1.1 概念介绍
非税收入:除税收以外,由各级政府、事业单位提供公共服务取得的财政性资金。例如:出入境、身份证等办证费用,交警、工商、物价等罚没收入,市政公园、国家景区旅游门票等。以广州为例,去年有1000万笔,超过1000亿的收入。2016年全国地方非税收入达到6万亿,中央非税收入达到4000亿。 收款模式:实行“收支双线”,一个单位原则上只能开立一个收入专户,一个支出专户。收入专户除财政划解外,只能收,不能支;支出专户除财政核拨支出外,只能支,不能收。单位不允许存在收入过渡户,应缴非税收入直接缴入相应的政府非税收入财政专户,在指定的代理银行开设财政专户,实行非税收入“单位开票、银行代收、实时入库(或专户)”。
# 1.2 现状难题
收款模式:现场办理完业务,要到另一个窗户去缴费,而且只接受刷卡,或者去银行缴费。线上绝大多数公共服务只能查询,无法缴费。或者即使实现办理,也要在办理完成后,去往其他公众号或者线下缴费。 信息交互:除了收款方式特殊外,由于需要业务信息交互,因此需要业务部门与银行对接,对于银行和业务部门而言成本非常高。 由于以上原因严重制约了公共服务领域服务办结能力的提升。
# 1.3 解决问题
我们将搭建一个非税平台,建立并简化各业务部门与财政、银行间非税支付的连接。将银行的非税账户接入微信支付后,建立灵活收入账户选择机制,建设标准化的信息传输API接口,便捷各业务部门的接入,解决限制公众平台服务闭环发展的核心问题。
# 2 角色说明
# 2.1 银行
银行,主要是作为缴费渠道。用户缴费后,费用会划到银行的商户号下,同时非税平台会调用银行提供的接口通知订单的缴费状态。微信支付会定期(T+1)将费用结算到对应的银行账户。
# 2.2 财政
财政角色的主要任务是记录缴费单的状态。用户缴费后,非税平台会调用财政提供的接口通知缴费单的支付状态。所有缴费单的状态,以财政记录的状态为准。
某些地区可能由银行代为实现财政角色的功能,如广东的部分地方财政,则是由建行代为收费和记录缴费单的状态。具体可以参考接入模式说明中的银行直连模式。
# 2.3 委办局
委办局(即业务方),可以调用非税平台提供的下单接口给用户下单。
# 3 接入模式说明
这一节简单介绍微信非税支付的三种接入模式,后面会对下面三种模式的信息流、接口内容做详细介绍(业务流程说明,其它场景特例说明,接口详细说明)。
# 3.1 银行直连模式
非税支付由银行过桥连接财政,打通信息流的模式。适用于当地财政不安排统筹接入,或当地财政开发资源不足的情况。
# 3.2 财政直连模式
非税支付与财政系统直连,打通信息流的模式。适用于当地财政统筹接入,且当地财政开发能力较强的情况。
# 3.3 业务直连模式
非税支付以业务单位的应收信息为准,过桥至财政系统,打通信息流。适用于本地业务单位与财政系统无直连的情况。
# 4 账号及相关配置
# 4.1 接入方需准备的信息
# 4.1.1 公众号的 APPID和 APPSECRET
- 公众号的 APPID 和APPSECRET主要用于获取 access_token。请开发者自行到公众平台查看,具体查看方法请参考此网页。
- 开发者需要提供公众号的APPID给微信非税支付的对接人配置接口权限。如果有测试环境和正式环境两个公众号,请分别提供。
# access_token 简介
获取方式:
https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。建议公众号开发者使用中控服务器统一获取和刷新access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务。
关于 access_token 的更多介绍,请参考公众号开发文档。
如何查看公众号的 APPID 和 APPSECRET,请参考此网页。
如何设置“获取access_token”的 IP白名单,请参考此网页。
# 4.1.2 微信网页授权
通过微信网页授权,公众号可以获取用户的openid。openid 是公众号下的用户唯一标识。
1.设置网页授权回调域名
1)在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页账号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;
2)授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com无法进行OAuth2.0鉴权。
2.网页授权的流程
1)引导用户进入授权页面同意授权,获取code
2)通过code换取网页授权access_token
(与基础支持中的access_token
不同)
3)如果需要,开发者可以刷新网页授权access_token
,避免过期
4)通过网页授权access_token
和openid获取用户基本信息(支持UnionID
机制)
关于微信网页授权的更多介绍,请见微信网页授权。
# 4.1.3 支付结果通知接口
支付结果通知接口用来接收缴费单的缴费状态。详细介绍请见支付结果通知
一节。
请开发者将测试环境和正式环境的支付通知接口分别提供给微信非税支付的对接人进行配置。
# 4.1.4 查询应收信息接口
承担银行/财政角色的开发需要提供一个应收信息的查询接口。详细介绍请见查询应收信息
一节。
请开发者将测试环境和正式环境的支付通知接口分别提供给微信非税支付的对接人进行配置。
# 4.1.5 调用退款接口的 IP 地址
微信非税支付提供的退款接口有IP限制,调用方需要提供自己的IP列表。
请开发者将测试环境和正式环境的退款IP分别提供给微信非税支付的对接人进行配置。
# 4.2 公共测试账号资源
# 4.2.1 测试商户号
微信非税支付公共的测试商户号是1900016021
。
测试的订单都是支付给这个商户号,可以通过此商户号下载对应的对账单。
# 4.2.2 测试银行ID
test_bank_id是微信非税支付的一个特殊测试银行ID。
可以通过这个银行ID测试下单支付的流程,而不受支付结果通知接口和应收信息查询接口的影响。
# 4.3 微信非税支付的出口IP
微信非税支付调用支付接口通知接口和应收信息查询接口的出口 IP为:
101.227.131.239
101.227.169.13
182.254.90.117
121.51.76.135
101.89.14.152
180.97.118.178
223.167.253.106
58.246.221.98
117.184.239.113
183.192.201.151
请将以上IP加入防火墙白名单。
# 5 业务流程说明
目前,微信非税支付支持多种业务场景,具体可以参考支付下单接口的说明。下面主要以最常用的支付场景进行说明。
# 5.1 整体模块架构
业务方的前端页面向业务方的后台发起缴费请求。 业务方后台从自己搭建的`access_token`中控服务获取`access_token`。 业务方后台按照要求拼装请求参数,并使用`access_token`调用微信非税支付的 api。 `access_token`中控服务定时刷新`access_token`(如:1小时刷新一次)。 ### 5.2 下单支付时序图 微信非税支付目前支持多种支付方式以满足不同的支付场景需求。下面以最常用的JSAPI支付为例,对下单支付的时序进行介绍。其它支付场景的交互时序总体相差不大,主要在下单请求参数和下单返回参数有细微差别。
用户在业务方的页面或缴费单上确认订单(点击按钮或扫描二维码),业务方获取用户`open_id`,并发起下单请求, 微信非税支付查询缴费单信息后,执行下单操作,返回订单号和支付链接。 业务方将支付链接返回给前端(或直接HTTP302),打开支付链接。 用户在支付页面发起支付。 用户支付后,微信非税支付调用财政、银行、委办局的支付通知接口通知缴费单的支付结果。 在支付页面刷新支付结果(以财政的记录为准)。 ### 5.3 其它特例场景说明 #### 5.3.1 小程序非税支付 小程序场景下,需要通过调用方小程序的appId下单,接口会返回拉起非税支付小程序所需的参数(appId和path)。具体见支付下单接口的返回结果说明。
小程序中调用wx.navigateToMiniProgram可以唤起非税支付小程序,具体文档可参见小程序API,其中appId和path为必传(支付下单接口会返回参数)
wx.navigateToMiniProgram({
appId: '',
path: 'pages/index/index?id=123',
success(res) {
// 打开成功
}
})
用户支付或其他操作返回到调用方小程序,调用方可以通过orderId(下单接口会返回)调用查询订单接口确认订单的支付情况
# 5.3.2 非微信浏览器上的 H5非税支付
在非微信浏览器上打开的 H5 无法获取用户 openid,下单时openid 不用传,trade_type 传 MWEB。
关于 H5 支付的几点问题:
用户IP:必须保证下单传入的用户IP和最终发起微信支付的用户IP是一致的,建议在用户页面上调用此接口获取用户IP。否则会报错(如下图所示)。部分浏览器,如华为浏览器、UC浏览器会通过代理服务器访问互联网,每次请求IP可能会改变。
Referer:发起微信支付的时候,会检查 Referer 参数,以确保请求是在合法的域名上发起的。正常浏览器一般会自动带上 Referer,如果出现这种错误,请自行抓包确认。 Referer的作用是,检查请求的来源。H5支付调用微信客户端时,会检查请求是否是从 https://mp.weixin.qq.com 这个域名发起的。所以,如果要在APP上使用H5支付,请针对域名为 https://mp.weixin.qq.com 的页面发起的请求设置 referer 为 https://mp.weixin.qq.com,同时设置一个可以标识 APP 的 User-Agent(用于支付完APP 回跳,下面会说明)。
iOS Webview 设置 Referer,请参考本文。
Android Webview 设置 Referer,请参考本文。
APP 的跳转:如果是从 APP 上发起 H5 支付,微信支付成功后,默认情况下可能不会跳回到原来的APP,而是回到默认浏览器。如果希望支付结束回到 APP,请在打开 Webview 设置一个能标识 APP 的 User-Agent,同时将 User-Agent 上能标识APP的关键字和 Url Scheme 提供给我们进行配置。支付结束后会根据 User-Agent 使用不同的 Url Scheme 进行跳转。
如果不清楚 Url Scheme,可以参考这篇文章。
Android Webview 设置 User-Agent,可以参考这篇文章。
webview加载网页出现找不到网页net:err_unknown_url_scheme
,解决方法请参考这篇文章。
# 6 接口详细说明
# 6.1 微信非税平台提供的接口
# 6.1.1 查询应收信息(提供给委办局)
https://api.weixin.qq.com/nontax/queryfee?access_token=$AccessToken
(所有接口的请求参数、返回结果都是json格式)
请求参数
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
appid | string | 是 | appid |
service_id | int | 是 | 服务id |
bank_id | string | 否 | 银行id(由微信非税平台分配的全局唯一id),不指定时在已配置的银行列表中随机选择 |
payment_notice_no | string | 是 | 缴费通知书编号 |
department_code | string | 是 | 执收单位编码 |
payment_notice_type | int | 否 | 通知书类型 1:普通通知书类型 2:处罚通知书类型 |
region_code | string | 是 | 行政区划代码 |
返回结果
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
errcode | int | 是 | 返回码 |
errmsg | string | 否 | 返回码描述 |
user_name | string | 否 | 用户姓名 |
fee | int | 是 | 总金额(单位是分) |
items | json | 是 | 缴费子项目详情 |
payment_notice_no | string | 是 | 缴费通知书编号 |
department_code | string | 否 | 执收单位编码 |
department_name | string | 是 | 执收单位名称 |
payment_notice_type | int | 否 | 通知书类型 |
region_code | string | 是 | 行政区划代码 |
payment_notice_create_time | int | 否 | 缴费通知书创建时间(时间戳,单位是秒) |
payment_expire_date | string | 否 | 限缴日期,格式YYYYMMDD |
其中items内部字段如下:
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
no | int | 是 | 项目号,如1,2,3 |
item_id | string | 是 | 项目编码 |
item_name | string | 是 | 项目名称 |
overdue | int | 否 | 滞纳金(单位是分) |
penalty | int | 否 | 加罚金额(单位是分) |
fee | int | 是 | 金额(包含滞纳金和加罚金额,单位是分) |
示例
请求参数
{
"appid":"wx5f6e43071809a9dd",
"service_id": 123,
"bank_id":"470690268",
"payment_notice_no":"440204190185356",
"department_code":"143605002004",
"payment_notice_type":1,
"region_code":"440000"
}
返回结果
{
"department_code":"143605002004",
"department_name":"韶关市公安局交警支队市区一大队",
"errcode":0,
"errmsg":"通知书未缴款",
"fee":20000,
"items":[
{
"fee":20000,
"item_id":"103050101200",
"item_name":"交通违法罚款",
"no":1,
"overdue":0
}
],
"payment_notice_create_time":1508806661,
"payment_notice_no":"440204190185356",
"payment_notice_type":1,
"region_code":"440000",
"user_name":"叶*梅"
}
# 6.1.2 支付下单(提供给委办局)
https://api.weixin.qq.com/nontax/unifiedorder?access_token=$AccessToken
请求参数
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
appid | string | 是 | appid |
service_id | int | 否 | 服务id |
bank_id | string | 否 | 银行id(由微信非税平台分配的全局唯一id),不指定时在已配置的银行列表中随机选择;不填时默认生产环境,测试环境需填上 |
bank_account | string | 否 | 清分银行账号(不使用清分机制的不用填) |
mch_id | string | 否 | 指定资金结算到mch_id。只能结算到 bank_id 下绑定的mch_id。不填时自动从 bank_id 下绑定的 mch_id 选择一个。 |
openid | string | 否 | 用户标识。当 trade_type 为 MWEB 时,不需要填;其它情况,必填。 |
desc | string | 是 | 描述(服务名称) |
fee | int | 是 | 总金额(单位是分) |
return_url | string | 否 | 支付中间页支付完成后跳转的页面(小程序下单非必填,其他必填) |
ip | string | 是 | 用户端ip |
order_no | string | 否 | 订单号。(缴费通知书编号和订单号必须二选一。如果没有缴费通知书编号,则填订单号) |
payment_notice_no | string | 否 | 缴费通知书编号(缴费通知书编号和订单号必须二选一。如果没有缴费通知书编号,则填订单号) |
department_code | string | 是 | 执收单位编码 |
department_name | string | 是 | 执收单位名称 |
payment_notice_type | int | 否 | 通知书类型 |
region_code | string | 是 | 行政区划代码 |
user_name | string | 否 | 用户姓名 |
items | json | 是 | 缴费子项目详情 |
payment_notice_create_time | int | 是 | 缴款通知书创建时间(时间戳,单位是秒) |
payment_expire_date | string | 否 | 限缴日期,格式YYYYMMDD |
scene | string | 是 | 场景。 "biz":微信公众号 "ctiyservice":城市服务 "miniprogram":小程序 |
app_appid | string | 否 | app的appid,app下单时必填 |
trade_type | string | 否 | 默认是JSAPI类型,非微信浏览器的H5下单请填MWEB。 |
auto_call_pay | bool | 否 | 支付中间页/小程序是否自动调起支付 |
返回结果
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
errcode | int | 是 | 返回码 |
errmsg | string | 否 | 返回码描述 |
order_id | string | 是 | 订单号 |
pay_url | string | 否 | 支付链接,公众号或app下单返回 |
miniprogram | string | 否 | 小程序唤起参数,小程序下单返回 |
其中miniprogram内部字段为
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
appid | string | 是 | 支付小程序appid |
pagepath | string | 是 | 支付小程序页面路径 |
business_type | string | 是 | 支付小程序业务类型 |
query_string | string | 是 | 支付小程序参数 |
示例
请求参数
{
"appid":"wx5f6e43071809a9dd",
"bank_account":"",
"bank_id":"test_bank_id",
"department_code":"1",
"department_name":"test",
"desc":"测试缴费",
"fee": 2,
"ip":"113.68.115.241",
"items":[
{
"fee":2,
"item_id":"103050101200",
"item_name":"测试缴费2",
"no":1,
"overdue":0
}
],
"openid": "ont-9vjAcIdSU-LgB7ubALAVJO9U",
"payment_expire_date":"",
"payment_notice_no":"08111639088",
"payment_notice_type": 1,
"region_code":"440000",
"return_url":"http://cockpouncher.55555.io/nontax-wxpay/pay_demand_result.html?type=showPayResult®ion_code=44000&unitNo=1&payNoticeNo=1",
"service_id":0,
"user_name":"张*丰"
}
返回结果
{
"errcode": 0,
"errmsg": "ok",
"order_id": "AQCAzieFp6-dC8EKDJ7fvb6x3dZt",
"pay_url": "https://mp.weixin.qq.com/intp/nontax/pay?action=page&order_id=AQCAzieFp6-dC8EKDJ7fvb6x3dZt#wechat_redirect"
}
# 6.1.3 查询订单(提供给委办局、银行、财政)
https://api.weixin.qq.com/nontax/getorder?access_token=$AccessToken
请求参数
字段名 | 必填 | 说明 |
---|---|---|
appid | string | 是 |
service_id | int | 否 |
order_id | string | 是 |
返回结果
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
errcode | int | 是 | 返回码 |
errmsg | string | 否 | 返回码描述 |
appid | string | 是 | appid |
openid | string | 是 | 用户标识 |
order_id | string | 是 | 订单号 |
create_time | int | 是 | 订单创建时间(时间戳,单位是秒) |
pay_finish_time | int | 是 | 订单支付成功时间(时间戳,单位是秒) |
desc | string | 是 | 描述(服务名称) |
fee | int | 是 | 总金额(单位是分) |
fee_type | int | 是 | 币种 1:人民币 2:美元 |
trans_id | string | 是 | 支付交易单号 |
status | int | 是 | 订单总状态 1:还没支付 3或4:支付成功 5:已退款 6:退款中 12:超时未支付订单自动关闭 (若部分退款只退了一部分金额,订单总状态不会变,只有全部退完总状态才会变成已退款) |
bank_id | string | 是 | 银行id(由微信非税平台分配的全局唯一id) |
bank_name | string | 是 | 银行名称 |
bank_account | string | 是 | 银行账号 |
refund_finish_time | int | 否 | 退款完成时间(时间戳,单位是秒) |
refund_reason | string | 否 | 退款原因 |
refund_order_id | string | 否 | 退款订单号 |
refund_out_id | string | 否 | 退款时传入的外部单号 |
payment_notice_no | string | 否 | 缴费通知书编号(根据下单请求的参数返回) |
order_no | string | 否 | 订单号。(根据下单请求的参数返回) |
department_code | string | 否 | 执收单位编码 |
department_name | string | 是 | 执收单位名称 |
payment_notice_type | int | 否 | 通知书类型 |
region_code | string | 是 | 行政区划代码 |
items | json | 是 | 缴费子项目详情 |
bill_type_code | string | 否 | 票据类型编码 |
bill_no | string | 否 | 票据号码 |
payment_info_source | int | 是 | 应收款信息来源, 1:财政 2:委办局 |
partial_refund_info | json | 否 | 部分退款信息 |
notify_history | json | 是 | 通知历史 |
scene | string | 是 | 场景。 "biz":微信公众号 "ctiyservice":城市服务 "miniprogram":小程序 "offline":线下二维码 "pc":pc机 "app":手机app "other":其它 |
其中partial_refund_info的内部字段如下
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
refund_order_id | string | 是 | 退款订单号 |
refund_reason | string | 是 | 退款原因 |
refund_fee | int | 是 | 退款金额(单位是分) |
refund_finish_time | int | 是 | 退款完成时间(时间戳,单位是秒) |
refund_out_id | string | 是 | 退款时传入的外部单号 |
refund_status | int | 是 | 退款状态 5:已退款 6:退款中 |
其中notify_history的内部字段如下
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
appid | string | 是 | 第三方appid |
name | string | 是 | 第三方名字 |
notify_detail | json | 否 | 通知详情(第一次和最后一次通知) |
notify_cnt | int | 是 | 通知次数 |
其中notify_detail的内部字段如下
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
notify_time | int | 是 | 通知时间(时间戳,单位是秒) |
ret | int | 是 | 微信后台通知总返回码 |
ret_errmsg | string | 微信后台通知总返回信息 | |
cost_time | int | 是 | 耗时(单位是毫秒) |
wxnontaxstr | string | 是 | 带在url参数上的一次请求的随机字符串 |
status | int | 是 | 订单状态 3或4:支付成功 5:已退款 |
url | string | 是 | 第三方接收通知的url |
errcode | int | 否 | 第三方返回码 0– 成功 210 – 数据格式错误 232 – 缴款通知书已缴费 236 – 不允许在该银行缴费 298 – 解密失败 299 – 系统错误 300 – 签名错误 |
errmsg | string | 否 | 第三方返回信息,如非空,为错误原因 |
third_resp | string | 否 | 第三方的返回 |
third_resp_data | string | 否 | 第三方的返回解密出的data |
示例
请求参数
{
"appid": "wx5f6e43071809a9dd",
"order_id": "AQCAGxwqp6-aBeIKDJ7fvb6x3dZt",
}
返回结果
{
"errcode": 0,
"errmsg": "ok",
"appid": "wx5f6e43071809a9dd",
"openid": "ont-9vjAcIdSU-LgB7ubALAVJO9U",
"order_id": "AQCAGxwqp6-aBeIKDJ7fvb6x3dZt",
"create_time": 1508847678,
"pay_finish_time": 0,
"desc": "测试办证缴费",
"fee": 1,
"fee_type": 1,
"trans_id": "",
"status": 12,
"bank_id": "test_bank_id",
"bank_name": "测试_银行",
"bank_account": "6215385809487657",
"refund_finish_time": 0,
"items": [
{
"no": 1,
"item_id": "000001",
"item_name": "测试办证缴费1",
"overdue": 0,
"fee": 1
},
{
"no": 2,
"item_id": "000002",
"item_name": "测试办证缴费2",
"overdue": 0,
"fee": 0
}
],
"bill_type_code": "",
"bill_no": "",
"payment_info_source": 2,
"payment_notice_no": "08111639088",
"department_code": "118610002",
"department_name": "测试执收单位",
"payment_notice_type": 1,
"region_code": "440000",
"notify_history": [
{
"appid": "wx5f6e43071809a9dd",
"name": "测试财政",
"notify_detail": [
{
"notify_time": 1524023367,
"ret": 0,
"cost_time": 39,
"wxnontaxstr": "2ba37f90d155d390",
"status": 3,
"errcode": 0,
"errmsg": ""
}
],
"notify_cnt": 1
},
{
"appid": "wxefd0818f53b9b82f",
"name": "测试委办局",
"notify_detail": [
{
"notify_time": 1524023367,
"ret": 0,
"cost_time": 20,
"wxnontaxstr": "f7ad824e08ac4bc5",
"status": 3,
"errcode": 0,
"errmsg": ""
}
],
"notify_cnt": 1
},
{
"appid": "wxf1bfa94c33668abf",
"name": "测试银行",
"notify_detail": [
{
"notify_time": 1524023367,
"ret": 0,
"cost_time": 18,
"wxnontaxstr": "2e628b6f1e3e9bf3",
"status": 3,
"errcode": 0,
"errmsg": ""
}
],
"notify_cnt": 1
}
]
}
6.1.4 申请退款(提供给银行) https://api.weixin.qq.com/nontax/refund?access_token=$AccessToken
请求参数
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
appid | string | 是 | appid |
order_id | string | 是 | 订单号 |
reason | string | 是 | 退款原因 |
refund_fee | int | 否 | 退款金额(单位是分),部分退款时必填 |
refund_out_id | string | 否 | 退款单号(每笔部分退款唯一),部分退款时必填 |
返回结果
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
errcode | int | 是 | 返回码 |
errmsg | string | 否 | 返回码描述 |
refund_order_id | string | 是 | 退款订单号 |
示例
请求参数
{
"appid":"wx6cc9648de104270d",
"order_id":"AQCAGxwqp6-aBeIKDJ7fvb6x3dZt",
"reason":"线上线下重复缴费,解档票据号为DA01651861"
}
返回结果
{
"errcode": 0,
"errmsg": "ok"
}
6.1.5 下载对帐单(提供给银行) https://api.weixin.qq.com/nontax/downloadbill?access_token=$AccessToken
说明:请每天早上6点后拉取。
请求参数
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
appid | string | 是 | appid |
mch_id | string | 是 | 商户号 |
bill_date | string | 是 | 对账单日期,格式:20170903 |
bill_type | string | 否 | ALL,返回当日所有订单信息,默认值 SUCCESS,返回当日成功支付的订单 REFUND,返回当日退款订单 |
失败时,返回以下字段
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
errcode | int | 是 | 返回码 |
errmsg | string | 否 | 返回码描述 |
成功时,数据以csv文本表格的方式返回,第一行为表头,后面各行为对应的字段内容 (具体字段可能有增删,以实际返回的为准)
第一行为表头,根据请求下载的对账单类型不同而不同(由bill_type决定),目前有:
当日所有订单
交易时间,公众账号ID,商户号,子商户号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,总金额,企业红包金额,微信退款单号,商户退款单号,退款金额,企业红包退款金额,退款类型,退款状态,商品名称,手续费,费率,行政区划代码,缴费通知书编号(或平台订单号),执收单位编码,通知书类型,银行ID
当日成功支付的订单
交易时间,公众账号ID,商户号,子商户号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,总金额,企业红包金额,微信退款单号,商户退款单号,退款金额,企业红包退款金额,退款类型,退款状态,商品名称,手续费,费率,行政区划代码,缴费通知书编号(或平台订单号),执收单位编码,通知书类型,银行ID
当日退款的订单
交易时间,公众账号ID,商户号,子商户号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,总金额,企业红包金额,微信退款单号,商户退款单号,退款金额,企业红包退款金额,退款类型,退款状态,商品名称,手续费,费率,行政区划代码,缴费通知书编号(或平台订单号),执收单位编码,通知书类型,银行ID
从第二行起,为数据记录,各参数以逗号分隔,参数前增加`符号,为标准键盘1左边键的字符,字段顺序与表头一致。
倒数第二行为订单统计标题,最后一行为统计数据
总交易单数,总交易额,总退款金额,总企业红包退款金额,手续费总金额
举例如下:
交易时间,公众账号ID,商户号,子商户号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,总金额,企业红包金额,微信退款单号,商户退款单号,退款金额,企业红包退款金额,退款类型,退款状态,商品名称,手续费,费率,行政区划代码,缴费通知书编号(或平台订单号),执收单位编码,通知书类型,银行ID
`2017-06-01 15:33:10,`wxc971985892358997,`1800004561,`1900016021,`4004332001201706013698057350,`AQCA6cNHMa5QlD4KDJ7fvb6x3dZt,`oFkLxtyJswfbex9crZWHGDYG5NIw,`JSAPI,`SUCCESS,`CMB_CREDIT,`CNY,`0.01,`0.00,`0,`0,`0.00,`0.00,`,`,`办证缴费,`0.00000,`0.00%,`440100,`17001122412,`000000,`1
`2017-06-01 15:44:30,`wxc971985892358997,`1800004561,`1900016021,`4004332001201706013704498976,`AQCAlxpOMa5QlD4KDJ7fvb6x3dZt,`oFkLxtyJswfbex9crZWHGDYG5NIw,`JSAPI,`SUCCESS,`CMB_CREDIT,`CNY,`0.01,`0.00,`0,`0,`0.00,`0.00,`,`,`办证缴费,`0.00000,`0.00%,`440100,`17001122413,`000000,`1
总交易单数,总交易额,总退款金额,手续费总金额
`2,`0.02,`0.0,`0
示例
请求参数:
{
"appid": "wx6cc9648de104270d",
"mch_id": "1900016021",
"bill_date": "20170925",
"bill_type": "ALL",
}
返回结果:
交易时间,公众账号ID,商户号,子商户号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,总金额,企业红包金额,微信退款单号,商户退款单号,退款金额,企业红包退款金额,退款类型,退款状态,商品名称,手续费,费率,行政区划代码,缴费通知书编号(或平台订单号),执收单位编码,通知书类型,银行ID
`2017-09-25 09:39:03,`wxc971985892358997,`1800004561,`1900016021,`4200000022201709254109017673,`AQAAc_FXW6_CCUtkDNP0Z7csEgVD,`,`JSAPI,`SUCCESS,`CFT,`CNY,`0.02,`0.00,`0,`0,`0.00,`0.00,`,`,`广东省非税微信缴费,`0.00000,`0.00%,`440000,`1713372142,`118610002,`1,`test_470690267
`2017-09-25 10:05:01,`wxc971985892358997,`1800004561,`1900016021,`4200000022201709254114686941,`AQCA7tdjW6-aAFhkDNP0Z7csEgVD,`,`JSAPI,`SUCCESS,`CFT,`CNY,`0.02,`0.00,`0,`0,`0.00,`0.00,`,`,`广东省非税微信缴费,`0.00000,`0.00%,`440000,`1713372144,`118610002,`1,`test_470690267
`2017-09-25 10:08:37,`wxc971985892358997,`1800004561,`1900016021,`4200000023201709254110290403,`AQCARHplW6-PTDcKDNP0Z7c4qUGm,`,`JSAPI,`SUCCESS,`CFT,`CNY,`0.02,`0.00,`0,`0,`0.00,`0.00,`,`,`广东省非税微信缴费,`0.00000,`0.00%,`440000,`1713372146,`118610002,`1,`test_470690267
`2017-09-25 10:22:18,`wxc971985892358997,`1800004561,`1900016021,`4200000010201709254114144003,`AQCAD8BrW68VlT4KDNP0Z7c4qUGm,`,`JSAPI,`SUCCESS,`CFT,`CNY,`0.02,`0.00,`0,`0,`0.00,`0.00,`,`,`广东省非税微信缴费,`0.00000,`0.00%,`440000,`1713372150,`118610002,`1,`test_470690267
`2017-09-25 11:58:35,`wxc971985892358997,`1800004561,`1900016021,`4200000012201709254136555152,`AQCAkL-XW69fTTcKDNP0Z7dYl29t,`,`JSAPI,`SUCCESS,`CFT,`CNY,`0.02,`0.00,`0,`0,`0.00,`0.00,`,`,`广东省非税微信缴费,`0.00000,`0.00%,`440000,`1713372148,`118610002,`1,`test_470690266
`2017-09-25 14:33:16,`wxc971985892358997,`1800004561,`1900016021,`4200000023201709254163519598,`AQCA9J_eW68VlT4KDNP0Z7c4qUGm,`,`JSAPI,`SUCCESS,`CFT,`CNY,`0.02,`0.00,`0,`0,`0.00,`0.00,`,`,`广东省非税微信缴费,`0.00000,`0.00%,`440000,`1713372154,`118610002,`1,`test_470690267
总交易单数,总交易额,总退款金额,总企业红包退款金额,手续费总金额
`6,`0.12,`0.00,`0.00,`0.00000
6.1.6 通知不一致订单(提供给财政) https://api.weixin.qq.com/nontax/notifyinconsistentorder?access_token=$AccessToken
说明:调用这个接口会触发微信后台调用支付通知接口(如果之前没有通知成功的话)。
一般使用场景:对账的时候,如果发现微信的对账单有某个订单,而你们那边没有记录到这个订单,就调用这个接口触发微信这边重新通知你们。
请求参数
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
appid | string | 是 | appid |
order_id | string | 是 | 订单号 |
返回结果
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
errcode | int | 是 | 返回码 |
errmsg | string | 否 | 返回码描述 |
示例
请求参数
{
"appid":"wx6cc9648de104270d",
"order_id":"AQCAGxwqp6-aBeIKDJ7fvb6x3dZt"
}
返回结果
{
"errcode": 0,
"errmsg": "ok"
}
6.1.7 测试支付结果通知 https://api.weixin.qq.com/nontax/mocknotification?access_token=$AccessToken
说明:此接口提供给接入方在联调前自己调试支付通知接口的加解密和其它基本逻辑。 若version为1,会通知两次,分别测试加解密是否正确和是否有验签。 调用此接口会触发微信后台向 url 发送支付结果通知的测试数据。
请求参数
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
appid | string | 是 | appid |
url | string | 是 | 接收通知的url |
version | int | 是 | 协议版本号,默认为1 |
返回结果
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
errcode | int | 是 | 返回码 |
errmsg | string | 否 | 返回码描述 |
6.1.8 测试查询应收信息 https://api.weixin.qq.com/nontax/mockqueryfee?access_token=$AccessToken
说明:此接口提供给接入方在联调前自己调试查询应收信息接口的加解密和其它基本逻辑。 若version为1,会通知两次,分别测试加解密是否正确和是否有验签。 调用此接口会触发微信后台向 url 发送查询应收信息的测试数据。
请求参数
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
appid | string | 是 | appid |
url | string | 是 | 接收通知的url |
version | int | 是 | 协议版本号,默认为1 |
返回结果
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
errcode | int | 是 | 返回码 |
errmsg | string | 否 | 返回码描述 |
6.1.9 提交刷卡支付 提交支付请求后微信会同步返回支付结果。 接口返回系统失败时,等待5秒重新调用看返回码。 当结果返回用户支付中需要输入密码时,可每间隔一段时间(建议10秒)重新调用该接口,直到有明确成功、失败,或者超时(建议30秒)
https://api.weixin.qq.com/nontax/micropay?access_token=$AccessToken
请求参数
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
appid | string | 是 | appid |
bank_id | string | 否 | 银行id(由微信非税平台分配的全局唯一id),不指定时在已配置的银行列表中随机选择;不填时默认生产环境,测试环境需填上 |
bank_account | string | 否 | 清分银行账号(不使用清分机制的不用填) |
mch_id | string | 否 | 指定资金结算到mch_id。只能结算到 bank_id 下绑定的mch_id。不填时自动从 bank_id 下绑定的 mch_id 选择一个。 |
desc | string | 是 | 描述(服务名称) |
fee | int | 是 | 总金额(单位是分) |
user_name | string | 否 | 用户姓名 |
items | json | 是 | 缴费子项目详情 |
payment_notice_create_time | int | 是 | 缴款通知书创建时间(时间戳,单位是秒) |
payment_expire_date | string | 否 | 限缴日期,格式YYYYMMDD |
payment_notice_no | string | 否 | 缴费通知书编号(缴费通知书编号和订单号必须二选一。如果没有缴费通知书编号,则填订单号) |
order_no | string | 否 | 订单号。(缴费通知书编号和订单号必须二选一。如果没有缴费通知书编号,则填订单号) |
department_code | string | 是 | 执收单位编码 |
department_name | string | 是 | 执收单位名称 |
payment_notice_type | int | 否 | 通知书类型 |
region_code | string | 是 | 行政区划代码 |
auth_code | string | 是 | 扫码支付授权码,设备读取用户微信中的条码或者二维码信息(注:用户刷卡条形码规则:18位纯数字,以10、11、12、13、14、15开头) |
order_id | string | 否 | 订单号(之前请求有返回订单号则填上) |
返回结果
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
errcode | int | 是 | 返回码 |
errmsg | string | 否 | 返回码描述 |
order_id | string | 是 | 订单号 |
示例
请求参数
{
"appid": "wx5f6e43071809a9dd",
"bank_id": "test_bank_id",
"bank_account": "",
"desc": "测试办证缴费",
"fee": 1,
"user_name": "*三强",
"items": [
{
"no": 1,
"item_id": "000001",
"item_name": "测试办证缴费1",
"overdue": 0,
"fee": 1
},
{
"no": 2,
"item_id": "000002",
"item_name": "测试办证缴费2",
"overdue": 0,
"fee": 0
}
],
"payment_notice_create_time": 1500967298,
"payment_expire_date": "20190102",
"payment_notice_no": " 08111639088",
"department_code": "118610002",
"department_name": "测试执收单位",
"region_code": "440000",
"auth_code": " 134971951305811268"
}
返回结果
{
"errcode": 0,
"errmsg": "ok",
"order_id": "AQAA_UjjdbLiUjMKDJ7fvb4AAAAA"
}
返回码说明
返回码 | 说明 |
---|---|
-1 | 系统失败 |
9201033 | 授权码为空 |
9207003 | 支付失败,需要重新下单支付 |
9207004 | 二维码已过期,请在微信上刷新后再试 |
9207005 | 用户余额不足.需要换卡支付 |
9207006 | 该卡不支持当前支付,需要换卡支付或绑新卡支付 |
9207007 | 当前订单状态为“订单已撤销”,请重新支付 |
9207008 | 用户支付中,需要输入密码 |
9207009 | 授权码参数错误,每个二维码仅限使用一次,请刷新再试 |
9207010 | 授权码检验错误,收银员扫描的不是微信支付的条码 |
# 6.1.10 查询订单列表
https://api.weixin.qq.com/nontax/getorderlist?access_token=$AccessToken
请求参数
|字段名|类型|必填|说明| | --- | --- || --- | --- | |appid|string|是|appid| |region_code|string|是|行政区划代码| |department_code|string|是|执收单位编码| |payment_notice_no|string|否|缴费通知书编号(缴费通知书编号和订单号必须二选一。如果没有缴费通知书编号,则填订单号)| |order_no|string|否|订单号。(缴费通知书编号和订单号必须二选一。如果没有缴费通知书编号,则填订单号)|
返回结果
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
errcode | int | 是 | 返回码 |
errmsg | string | 否 | 返回码描述 |
成功时返回以下字段
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
order_id_list | json | 否 | 已下单的订单id列表 |
paid_order_id | string | 否 | 已支付的订单id |
示例
请求参数
{
"appid": "wx5f6e43071809a9dd",
"payment_notice_no": "34000019081115065040",
"department_code": "065080906",
"region_code": "340000"
}
返回结果
{
"errcode": 0,
"errmsg": "ok",
"order_id_list": [
"AQCAxFJwcrQqI2BkDAqRH-UhDq2D",
"AQAAgrVxcrRuhXBkDAqRH-UhDq2D",
"AQCAFxFzcrQqI2BkDAqRH-UhDq2D",
"AQCA5_3kcrSQCxMJDAGMadMAAAAA",
"AQCA6ADlcrQqI2BkDAGMadMAAAAA",
"AQCA62hwdbQqI2BkDAqRH-U4tE4p"
],
"paid_order_id": "AQCA62hwdbQqI2BkDAqRH-U4tE4p"
}
# 6.2 财政/银行提供接口
# 6.2.1 查询应收信息
请求参数
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
appid | string | 是 | appid |
region_code | string | 是 | 行政区划代码 |
payment_notice_no | string | 是 | 缴费通知书编号 |
department_code | string | 否 | 执收单位编码 |
payment_notice_type | int | 否 | 通知书类型 |
bank_id | string | 是 | 银行id(由微信非税平台分配的全局唯一id) |
返回结果
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
errcode | int | 是 | 0– 通知书未缴款 210 – 数据格式错误 211 – 不允许缴费(单位或项目被禁用) 231 – 缴款通知书不存在 232 – 缴款通知书已缴费 233 – 缴款通知书已取消 235 – 不允许逾期缴费 236 – 不允许在该银行缴费 296 – 缴款通知书异常 297 – 当前时间暂停缴费 298 – 解密失败 299 – 系统错误 300 – 签名错误 |
errmsg | string | 否 | 返回信息 |
若errcode为0时返回以下字段
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
region_code | string | 是 | 行政区划代码 |
payment_notice_no | string | 是 | 缴费通知书编号 |
department_code | string | 否 | 执收单位编码 |
department_name | string | 是 | 执收单位名称 |
payment_notice_type | int | 是 | 通知书类型 |
user_name | string | 否 | 缴款人名称 |
payment_notice_create_time | int | 否 | 缴款通知书创建时间(时间戳,单位是秒) |
payment_expire_date | string | 否 | 限缴日期,格式YYYYMMDD |
fee | int | 是 | 金额,单位是分 |
items | json | 是 | 缴费子项目详情 |
若errcode为232 – 缴款通知书已缴费时返回以下字段
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
pay_channel | string | 否 | 缴费渠道,微信非税平台为"wx_nontax" |
order_id | string | 否 | 缴费渠道为微信非税平台时返回之前已缴费的订单号 |
示例
请求参数
{
“appid”: “wx_appid”,
"bank_id":"470690268",
"payment_notice_no":"440204190185356",
"department_code":"143605002004",
"payment_notice_type":1,
"region_code":"440000"
}
返回结果
{
"department_code":"143605002004",
"department_name":"韶关市公安局交警支队市区一大队",
"errcode":0,
"errmsg":"通知书未缴款",
"fee":20000,
"items":[
{
"fee":20000,
"item_id":"103050101200",
"item_name":"交通违法罚款",
"no":1,
"overdue":0
}
],
"payment_notice_create_time":1508806661,
"payment_notice_no":"440204190185356",
"payment_notice_type":1,
"region_code":"440000",
"user_name":"叶*梅"
}
6.2.2 结果通知 请求参数
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
order_id | string | 是 | 微信非税平台的订单号 |
status | int | 是 | 状态: 3或4:已支付 . 5:已退款 |
pay_channel | string | 是 | 缴费渠道,微信非税平台为"wx_nontax" |
pay_finish_time | int | 是 | 订单支付成功时间(时间戳,单位是秒) |
返回结果(微信非税平台直连财政情况下财政返回,非直连财政情况下银行返回)
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
errcode | int | 是 | 0– 成功 210 – 数据格式错误 211 – 不允许缴费(单位或项目被禁用) (会触发自动退款) 231 – 缴款通知书不存在 (会触发自动退款) 232 – 缴款通知书已缴费 (若返回的order_id和通知的order_id不一样会触发自动退款) 233 – 缴款通知书已取消 (会触发自动退款) 235 – 不允许逾期缴费 (会触发自动退款) 236 – 不允许在该银行缴费 (会触发自动退款) 296 – 缴款通知书异常 (会触发自动退款) 297 – 当前时间暂停缴费 298 – 解密失败 299 – 系统错误 300 – 签名错误 |
errmsg | string | 否 | 返回信息,如非空,为错误原因 |
返回结果(微信非税平台直连财政情况下银行返回)
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
errcode | int | 是 | 0– 成功 299 – 系统错误 |
errmsg | string | 否 | 返回信息,如非空,为错误原因 |
示例
请求参数
{
"order_id":"AQCADTPupa-aBeIKDD96k7MbdosN",
"status":3,
"pay_channel":"wx_nontax",
"pay_finish_time":1508806264
}
返回结果
{
"bill_no":"AB00002027",
"bill_type_code":"333333",
"errcode":0,
"errmsg":"成功",
}
6.3 委办局提供的接口 6.3.1 结果通知 请求参数
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
order_id | string | 是 | 微信非税平台的订单号 |
status | int | 是 | 状态: |
3或4:已支付 | |||
5:已退款 | |||
pay_channel | string | 是 | 缴费渠道,微信非税平台为"wx_nontax" |
pay_finish_time | int | 否 | 订单支付成功时间,status为已支付时才有此字段(时间戳,单位是秒) |
refund_finish_time | int | 否 | 发起退款指令时间,status为已退款时才有此字段(时间戳,单位是秒) |
refund_fee | int | 否 | 退款金额,部分退款时必填 |
refund_order_id | string | 否 | 退款单号,部分退款时必填 |
返回结果
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
errcode | int | 是 | 0– 成功 210 – 数据格式错误 298 – 解密失败 299 – 系统错误 300 – 签名错误 |
errmsg | string | 否 | 返回信息,如非空,为错误原因 |
示例
请求参数
{
"order_id":"AQCAXCfypa-dC8EKDD96k7NeiEFb",
"status":3,
"pay_channel":"wx_nontax",
"pay_finish_time":1508806792
}
返回结果
{
"errcode":0,
"errmsg":"成功"
}
# 7 数据加解密说明
为加强安全性,微信非税支付调用支付结果通知接口和应收信息查询接口时,会在应用层对数据进行加密传输。
# 7.1 密钥的管理
1.对称加密使用的静态密钥由第三方事先设置到非税支付后台,密钥长度为256位。(暂时人工配置,后面会在微信公众平台上提供配置密钥功能) 2.非对称加密的密钥对(公钥和私钥)由微信非税支付这边生成和分配。公钥分配给接入方,私钥由微信非税支付后台保管。 3. 具体加解密的方法和流程,请见下面的介绍。
# 7.2 加解密的方式和说明
请求参数
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
data | string | 是 | 使用对称加密算法加密后的数据,最后做base64编码。原文为json字符串。 |
base64( iv + AES(plaintext, key, iv) ) | |||
(base64 decode后的头16个字节就是iv) | |||
data_encrypt_type | string | 是 | data的对称加密算法:AES/CBC/PKCS7Padding |
sign | string | 是 | 签名(使用私钥加密的原始数据的摘要) |
sign_type | string | 是 | 签名类型"SHA256withRSA" |
version | int | 是 | 协议版本号 |
appid | string | 是 | 通知的公众号appid |
返回结果
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
data | string | 是 | 使用对称加密算法加密后的数据,最后做base64编码。原文为json字符串。 base64( iv + AES(plaintext, key, iv) ) |
data_encrypt_type | string | 是 | data的对称加密算法(和请求中的一样) |
示例
测试公钥
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu6gQV44C65NrdmeqJVAw
GPPd7+8JyE6brZlHsNtsbE+P9yJOaz68KbLcygmf67abtASEHWAGre1ju32t2+NY
rkaMu5DUyJ7ROJJpmUkv1D1y7GhuIfANvnTr8/a29AFwx2HZZvuoOi9mGq6iNi/H
+PoFTGbmTyatl+D10rFCCM2oHiS/8mC+2xfCGm6pmKaVocekVUOOQYHHGNO3OpeU
s+Cn0cukhuNt03iWsZ5KOx9qy7QbletNoriymi3NI9Gb/6mfx7k+d0sJMg8aLz/F
GSBOp0JSyAmjjSdO85Jhe1PCiOMwMBJgMi1711RFz09LrOZZxdEoyCVddWg/ynzP
mQIDAQAB
-----END PUBLIC KEY-----
测试对称密钥
UBmCt8sJzEXBJKpt0F5C0POrMMrbaCQx
请求参数:
{
"data":"apckvM3mqLEeFF9qGhXHR/1MPpI8gi58aZA+KpumHPRIAYSBaSuIGM6iWCagZSoPRi39aEFUPOoEI5WdQXmPSJ2KdiO8+h47CNn3n++fQrPYephr/pucl2PARtiOcDeoqHaolgzgwMCjnPYCSIGVlfE3yrSz8CNwMv0JuO4OmTvCwROlCH2LiDn9D6R2GFEovgapyzwLqp/za4SyF84Ulun0hkN8wSAJuZnpdkGcekQ=",
"data_encrypt_type":"AES/CBC/PKCS7Padding",
"appid":"wx5f6e43071809a9dd",
"sign":"kzh/xptOlrRlF5bkxt322JtQzeeTn3rHElyLf3IWCzUsa6m2Y7iBAGbuev+P/g6UJw7GUoZm1hiAoItRLlZMKUFB5sHIP9Th90fnX9scZMKZLjwwKNRMa3R/Q9OcuK623put30leW6KSF10m+9u00JNjpN/yKyABT6nGIQCK1qUmJHK5r4wenF3wo+ELvWsIhZytpfFs9ALt9JKFXYsrOgggN4lLt/omNB60H71OuR+6itMYqk8KTUNYrFA7dOvvhJouG6maHr9ShGZQegQN6fpQouDdz+hnD8WCqSPmS3gtrxGBfQ2+OpOvl4mwFMHmEkUVSplmPnP4lBJrcdDxXg==",
"sign_type":"SHA256withRSA",
"version":1
}
解密流程:
用AES对称密钥解密data字段的内容,解密算法为AES/CBC/PKCS7Padding,获得明文通知数据。这里的明文数据这是对应查询应收接口或支付结果通知接口的请求参数。
用data字段的解密结果和公钥校验sign。(微信非税平台会定期进行验签拨测)
联调前,请用上面列出的公钥、对称密钥和请求参数测试你们解密代码是否正确。
返回结果:
{
"data":"OX88ov0nRiEgjkV580XoE5V+lhXzb+8CAEu9jRIfQzat1NK6um+t6+NxL86DLMPH",
"data_encrypt_type":"AES/CBC/PKCS7Padding"
}
加密流程:
- 用AES对称密钥加密返回数据,加密算法为AES/CBC/PKCS7Padding,密文对应data字段。
支付通知结果接口和查询应收信息接口的处理逻辑如下:
# 8 获取用户IP
https://mp.weixin.qq.com/intp/getuserclientip
使用方法:直接在用户页面上调用此接口获取用户 IP,请求方式 GET。
返回结果:
{
"base_resp": {
"ret": 0,
"err_msg": "OK"
},
"client_ip": "14.17.22.37"
}
# 9 微信非税平台接口返回码说明
返回码 | 说明 |
---|---|
9200002 | 该订单属于其它appid |
9200211 | 缴费通知书已禁用 |
9200231 | 缴费通知书不存在 |
9200232 | 缴费通知书已缴费 |
9200233 | 缴款通知书已取消 |
9200235 | 不允许逾期缴费 |
9200236 | 不允许在该银行缴费 |
9200297 | 当前时间暂停缴费 |
9201000 | desc参数为空 |
9201001 | 总金额不等于各子项金额之和 |
9201003 | 总金额为0 |
9201004 | payment_expire_date参数错误 |
9201005 | appid参数错误 |
9201007 | useruin参数错误 |
9201008 | return_url参数错误 |
9201009 | ip参数错误 |
9201010 | order_id参数错误 |
9201011 | refund_reason参数错误 |
9201012 | mch_id参数错误 |
9201013 | bill_date参数错误 |
9201014 | bill_type参数错误 |
9201015 | trade_type参数错误 |
9201016 | bank_id参数错误 |
9201017 | bank_account参数错误 |
9201018 | payment_notice_no参数错误 |
9201019 | department_code参数错误 |
9201020 | payment_notice_type参数错误 |
9201021 | region_code参数错误 |
9201022 | department_name参数错误 |
9201023 | 总金额和从财政查询到的不一致 |
9201024 | refund_out_id参数错误 |
9202001 | 支付流程尚未结束不允许退款 |
9202002 | 该appid没有该订单退款权限 |
9202003 | ip限制 |
9202004 | 调用太频繁 |
9202005 | 退款失败,用户微信账号异常 |
9202006 | 退款失败,账户余额不足 |
9202011 | 已退款 |
9202012 | 退款失败,待退款金额加已退款金额超过总金额 |
9202013 | refund_busi_id重复但refund_fee不一样 |
9202016 | 没有校验签名 |
9203000 | 通知不一致订单失败,通知财政失败 |
9203001 | 测试结果通知失败,请求发送失败 |
9203002 | 测试结果通知失败,返回数据错误 |
9203004 | 测试结果通知失败,返回数据解密失败 |
9204000 | 获取实名信息失败,参数错误 |
9204002 | 获取实名信息失败,参数属于其它appid |
9205000 | 财政信息没有配置 |
9205001 | 银行信息没有配置 |
9205002 | 委办局信息没有配置 |
9205010 | 密钥没有配置 |
9205201 | 对帐单不存在 |
9210000 | 查询财政失败 |
9291000 | openid参数错误 |
9291001 | openid和appid不匹配 |
9291002 | app_appid不存在 |
9291003 | app_appid不是app类型 |
9291004 | appid为空 |
9291005 | appid和access_token不匹配 |
其它全局返回码见:全局返回码说明
# 11 常见问题
11.1 支付中间页支付后显示状态为处理中
回答:原因是支付结果通知财政还没有成功。
具体通知情况可以通过查询订单api查看(详见6.1.3)。
11.2 下单时出现以下情况:
回答:原因可能是下单openid与支付openid不一致。
11.3 非税支付下单返回的订单多少时间内有效? 回答:订单号10分钟有效期。
11.4 调用AccessToken时,如何添加IP白名单? 回答:登录微信公众平台,在页面的设置->安全中心->IP白名单 中添加。
11.5 在调用非税文档中的API时,出现access_token无效等问题? 回答:1、检查调用的access_token和获取时的access_token的appid是否一致。 2、检查调用的access_token是否过期,可参照缓存access_token的方法: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
11.6 下载对账单数据以什么文件格式返回? 回答:以csv格式的文本返回。
11.7 如何判断是否重复缴费? 回答:判断是否重复缴费:缴费通知书编号+执收单位编码+行政区划代码唯一。
11.8 退款周期多少日以内的交易可以退? 回答:目前最长一年。
11.9 pc场景调用支付接口的时候,openid应该怎么获取? 回答:业务方可以出示二维码,用户扫码之后,打开业务方的网页,在网页里做微信网页授权,然后就可以拿到了openid。
11.10 小程序场景下,支付成功为什么不通过前端API 返回订单状态? 回答:很多触发返回调用方小程序的操作,不会触发API wx.navigateBackMiniProgram,所以使用该接口传递参数不可靠。