# 1.产品介绍

为保障用户权益,提高交易安全,平台将向”微短剧“类小程序提供虚拟支付能力,开发者可通过小程序管理后台--虚拟支付模块,开通一个新的微信支付商户号,使用账单查询、资金提现等服务。平台将以通过该支付能力产生的支付金额为结算基数,按一定费率收取技术服务费。

本功能暂不开放苹果iOS系统App内购买(In-App Purchase)方式,仅向安卓及其他手机系统提供,如有疑问可联系客服进行沟通.

若测试请先使用沙箱环境,若使用现网环境,平台将收取相关技术服务费

注意事项:开发者请在2.19.2 或以上版本基础库中调用

# 1.1.开通条件

●主体类型为已认证小程序

●小程序类型为企业小程序

●小程序运营资质为“文娱-微短剧“类目

●小程序主体信息完备(若有缺陷请使用平台提供的修改链接修正)

# 1.2.开通入口

当小程序完成资质申请并且通过获得“微短剧”类目后,点击mp左边栏【虚拟支付】即可前往开通页面进行开通。

若当前账户满足开通条件后,点击【开通】按钮进行协议签署及资料上传,开通新的商户号。

# 1.3.开通流程

# 第一步:阅读协议

进行协议阅读虚拟支付协议,勾选【我已阅读并同意上述条款】后进入下一步

# 第二步:提交商户相关资料开通商户号

填写企业的营业执照,提现账户及支付管理员

# 第三步:账户状态查询及资料审核

完成商户资料提交,此时可在界面等待查询账户状态,审核一般需要1-7个工作日,审核状态下次进入时即可查看。

# 第四步:进行账户验证

进行账户验证(若支付管理员配置为公司法人则跳过该步骤)

# 第五步:扫码签约

扫码完成签约 签约完成后,资料将提交进行审核,开发者可离开当前页面。

注意由于“账户验证”,“签约”不一定会即时完成,开发者可退出页面,后续再次进入将继续延续之前的配置。

等待约1-2个工作日后回到虚拟支付模块,可以看到状态为已签约,或直接进入了商户管理的模块则表示已完成了签约,成功开通了二级商户号。

# 第六步:进入商户管理后台进行账单/订单查询,代币/道具配置及资金管理

当完成了前续动作后,虚拟支付栏目将呈现为全新的商户管理模块,我们搭建了开发者的商户后台,允许开发者在后台进行基础信息配置,代币及道具配置和管理(开发者可以自行选择使用道具或者代币来管理自己的商品)

详细的功能解释如下

# 基本配置:包含三个模块

# 基础配置:开发者可在该界面查看自身基础配置信息(包括appid/offerid/appkey,发货订阅等)

# 代币配置:开发者可在该界面配置代币,输入代币名称并且设置代币兑换比例进行保存 (请注意一旦发布无法修改!请注意代币名称符合相关法律法规要求)
# 道具管理:开发者可在该界面上传道具至开发版本及发布至现网版本,可支持编辑保存后发布,并且可以查看发货推送配置 (输入的道具名称需符合相关法律法规要求)

# 资金管理:

可在此界面进行账户余额查询和提现,查看每日账单具体情况,包括订单号,开发者收益等,也可以查看账单明细(后期将支持下载功能)

注:待结算金额指的系尚未进行分账的金额,未扣除技术服务费

结算周期:T+3,即开发者完成一笔订单后,资金将会冻结,3日后进行分帐

# 交易订单:

可在此界面查询订单状况,包括代币/道具订单的交易及发货情况,可进行退款操作(后期将支持下载功能)

# 广告金:

平台将设置广告金政策以支持开发者的广告投放,商户可在虚拟支付--广告金管理界面查看平台向商户赠送的广告金。

# 2.开发流程

# 2.1.时序图

# 道具直购流程图

道具直购流程图

# 道具直购注意事项

  • 【7. 用户支付成功】: 由wx.requestVirtualPayment的success回调触发,可能会丢失,比如微信异常退出
  • 【发货推送分支】和【发货轮训分支】至少实现一个,两个结合的方式,可提供更可靠的道具直购体验

# 代币充值流程图

代币充值流程图

# 代币充值注意事项

  • 【10. 用户支付成功】 : 由wx.requestVirtualPayment的success回调触发,可能会丢失,比如微信异常退出
  • 【支付推送分支】和【支付轮训分支】至少实现一个,两个结合起来会更可靠

# 2.2.wx API

基础库接口wx.requestVirtualPayment用于发起米大师虚拟支付,内部会包含下单,拉起支付逻辑

# 2.3.服务器API

# 用户态签名

签名参数为signature,加在query后面,例如接口地址是:https://api.weixin.qq.com/xpay/query_user_balance?access_token=xxxx,加上签名后则需要传https://api.weixin.qq.com/xpay/query_user_balance?access_token=xxxx&signature=xxx

# 支付签名

签名参数为pay_sig,加在query后面,例如接口地址是:https://api.weixin.qq.com/xpay/query_user_balance?access_token=xxxx,加上签名后则需要传https://api.weixin.qq.com/xpay/query_user_balance?access_token=xxxx&pay_sig=xxx

# 错误码

错误码 描述
-1 系统错误
268490001 openid错误
268490002 请求参数字段错误,具体看errmsg
268490003 签名错误
268490004 重复操作(赠送和代币支付和充值广告金相关接口会返回,表示之前的操作已经成功)
268490005 订单已经通过cancel_currency_pay接口退款,不支持再退款
268490006 代币的退款/支付操作金额不足
268490007 图片或文字存在敏感内容,禁止使用
268490008 代币未发布,不允许进行代币操作
268490009 用户session_key不存在或已过期,请重新登录
268490011 数据生成中,请稍后调用本接口获取
268490012 批量任务运行中,请等待完成后才能再次运行
268490013 禁止对核销状态的单进行退款
268490014 退款操作进行中,稍后可以使用相同参数重试
268490015 频率限制
268490016 退款的left_fee字段与实际不符,请通过query_order接口查询确认
268490018 广告金充值帐户行业 id 不匹配
268490019 广告金充值帐户 id已绑定其他 appid
268490020 广告金充值帐户主体名称错误
268490021 账户未完成进件
268490022 广告金充值账户无效
268490023 广告金余额不足
268490024 广告金充值金额必须大于 0

# query_user_balance

# 地址

https://api.weixin.qq.com/xpay/query_user_balance?access_token=xxx&pay_sig=xxx

# 描述

查询用户代币余额

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
openid string 用户的openid
env int 0-正式环境 1-沙箱环境
user_ip string 用户ip,例如:1.1.1.1

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息
balance int 代币总余额,包括有价和赠送部分
present_balance int 赠送账户的代币余额
sum_save int 累计有价货币充值数量
sum_present int 累计赠送无价货币数量
sum_balance int 历史总增加的代币金额
sum_cost int 历史总消耗代币金额
first_save_flag bool 是否满足首充活动标记。0:不满足。1:满足

# 备注

1. 需要用户态签名与支付签名

# currency_pay

# 地址

https://api.weixin.qq.com/xpay/currency_pay?access_token=xxx&pay_sig=xxx&signature=xxx

# 描述

扣减代币(一般用于代币支付)

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
openid string 用户的openid
env int 0-正式环境 1-沙箱环境
user_ip string 用户ip,例如:1.1.1.1
amount int 支付的代币数量
order_id string 订单号
payitem string 物品信息。记录到账户流水中。如:[{"productid":"物品id", "unit_price": 单价, "quantity": 数量}]
remark string 备注
device_type int 平台类型1-安卓 2-苹果

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息
order_id string 订单号
balance int 总余额,包括有价和赠送部分
used_present_amount int 使用赠送部分的代币数量

# 备注

1. 使用用户态签名与支付签名

# query_order

# 地址

https://api.weixin.qq.com/xpay/query_order?access_token=xxx&pay_sig=xxx

# 描述

查询创建的订单(现金单,非代币单)

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
openid string 用户的openid
env int 0-正式环境 1-沙箱环境
order_id string 创建的订单号
wx_order_id string 微信内部单号(与order_id二选一)

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息
order object 订单信息

其中order的内容如下:

字段 类型 说明
order_id string 订单号
create_time int 创建时间
update_time int 更新时间
status int 当前状态 0-订单初始化(未创建成功,不可用于支付)1-订单创建成功 2-订单已经支付,待发货 3-订单发货中 4-订单已发货 5-订单已经退款 6-订单已经关闭(不可再使用) 7-订单退款失败 8-用户退款完成 9-回收广告金完成 10-分账回退完成
biz_type int 业务类型0-短剧
order_fee int 订单金额,单位分
coupon_fee int 订单优惠金额,单位分(暂无此字段)
paid_fee int 用户支付金额
order_type int 订单类型0-支付单 1-退款单
refund_fee int 当类型为退款单时表示退款金额,单位分
paid_time int 支付/退款时间,unix秒级时间戳
provide_time int 发货时间
biz_meta string 订单创建时传的信息
env_type int 环境类型1-现网 2-沙箱
token string 下单时米大师返回的token
left_fee int 支付单类型时表示此单经过退款还剩余的金额,单位分
wx_order_id string 微信内部单号
channel_order_id string 渠道单号,为用户微信支付详情页面上的商户单号
wxpay_order_id string 微信支付交易单号,为用户微信支付详情页面上的交易单号
sett_time int 结算时间的秒级时间戳,大于0表示结算成功
sett_state int 结算状态0-未开始结算 1-结算中 2-结算成功

# 备注

1. 使用支付签名

# cancel_currency_pay

# 地址

https://api.weixin.qq.com/xpay/cancel_currency_pay?access_token=xxx&pay_sig=xxx

# 描述

代币支付退款(currency_pay接口的逆操作)

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
openid string 用户的openid
env int 0-正式环境 1-沙箱环境
user_ip string 用户ip,例如1.1.1.1
pay_order_id string 代币支付(调用currency_pay接口时)时传的order_id
order_id string 本次退款单的单号
amount int 退款金额
device_type int 1-安卓 2-苹果

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息
order_id string 退款订单号

# 备注

1. 需要支付签名与用户态签名

# notify_provide_goods

# 地址

https://api.weixin.qq.com/xpay/notify_provide_goods?access_token=xxx&pay_sig=xxx

# 描述

通知已经发货完成(只能通知现金单),正常通过xpay_goods_deliver_notify消息推送返回成功就不需要调用这个api接口。这个接口用于异常情况推送不成功时手动将单改成已发货状态

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
order_id string 下单时传的单号
wx_order_id string 微信内部单号(与order_id二选一)
env int 0-正式环境 1-沙箱环境

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息

# present_currency

# 地址

https://api.weixin.qq.com/xpay/present_currency?access_token=xxx&pay_sig=xxx

# 描述

代币赠送接口,由于目前不支付按单号查赠送单的功能,所以当需要赠送的时候可以一直重试到返回0或者返回268490004(重复操作)为止

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
openid string 用户的openid
env int 0-正式环境 1-沙箱环境
order_id string 赠送单号
amount int 赠送金额
device_type int 1-安卓 2-苹果

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息
balance int 赠送后用户的代币余额
order_id string 赠送单号
present_balance int 用户收到的总赠送金额

# download_bill

# 地址

https://api.weixin.qq.com/xpay/download_bill?access_token=xxx&pay_sig=xxx

# 描述

用于下载小程序账单,第一次调用触发生成下载url,可以间隔轮训来获取最终生成的下载url。

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
begin_ds int 起始时间(如20230801)
end_ds int 截止时间(如20230810)

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息
url string 下载地址

# 备注

1. 使用支付签名

# refund_order

# 地址

https://api.weixin.qq.com/xpay/refund_order?access_token=xxx&pay_sig=xxx

# 描述

对使用jsapi接口下的单进行退款,此接口只是启动退款任务成功,启动后需要调用query_order接口来查询退款单状态,等状态变成退款完成后即为最终成功

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
openid string 下单时的用户openid
order_id string 下单时的单号,即jsapi接口传入的OutTradeNo,与wx_order_id字段二选一
wx_order_id string 支付单对应的微信侧单号,与order_id字段二选一
refund_order_id string 本次退款时需要传的单号,长度为[8,32],字符只允许使用字母、数字、'_'、'-'
left_fee int 当前单剩余可退金额,单位分,可以通过调用query_order接口查到
refund_fee int 本次退款金额,单位分,需要(0,left_fee]
biz_meta string 商家自定义数据,传入后可在query_order接口查询时原样返回,长度需要[0,1024]
refund_reason string 退款原因,当前仅支持以下值 0-暂无描述 1-产品问题,影响使用或效果不佳 2-售后问题,无法满足需求 3-意愿问题,用户主动退款 4-价格问题 5:其他原因
req_from string 退款来源,当前仅支持以下值 1-人工客服退款,即用户电话给客服,由客服发起退款流程 2-用户自己发起退款流程 3-其它
env int 0-正式环境 1-沙箱环境

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息
refund_order_id string 退款单号
refund_wx_order_id string 退款单的微信侧单号
pay_order_id string 该退款单对应的支付单单号
pay_wx_order_id string 该退款单对应的支付单微信侧单号

# 备注

1. 使用支付签名

# create_withdraw_order

# 地址

https://api.weixin.qq.com/xpay/create_withdraw_order?access_token=xxx&pay_sig=xxx

# 描述

创建提现单

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
withdraw_no string 提现单单号,长度为[8,32],字符只允许使用字母、数字、'_'、'-'
withdraw_amount string 提现的金额,单位元,例如提现1分钱请使用0.01,允许不传,不传的情况下表示全额提现
env int 0-正式环境 1-沙箱环境

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息
withdraw_no string 提现单号
wx_withdraw_no string 提现单的微信侧单号

# 备注

1. 使用支付签名

# query_withdraw_order

# 地址

https://api.weixin.qq.com/xpay/query_withdraw_order?access_token=xxx&pay_sig=xxx

# 描述

创建提现单

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
withdraw_no string 提现单单号
env int 0-正式环境 1-沙箱环境

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息
withdraw_no string 提现单号
status int 提现单的微信侧单号1-创建成功,提现中 2-提现成功 3-提现失败
withdraw_amount string 提现金额
wx_withdraw_no string 提现单的微信侧单号
withdraw_success_timestamp string 提现单成功的秒级时间戳
create_time string 提现单创建时间
fail_reason string 提现失败的原因

# 备注

1. 使用支付签名

# start_upload_goods

# 地址

https://api.weixin.qq.com/xpay/start_upload_goods?access_token=xxx&pay_sig=xxx

# 描述

启动批量上传道具任务

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
upload_item array 上传的商品列表
env int 0-正式环境 1-沙箱环境

upload_item的每一项内容如下:

字段 类型 说明
id string 道具id,长度(0,64],字符只允许使用字母、数字、'_'、'-'
name string 道具名称,长度(0,1024]
price int 道具单价,单位分,需要大于0
remark string 道具备注,长度(0,1024]
item_url string 道具图片的url地址,当前仅支持jpg,png等格式

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息

# 备注

1. 使用支付签名

# query_upload_goods

# 地址

https://api.weixin.qq.com/xpay/query_upload_goods?access_token=xxx&pay_sig=xxx

# 描述

查询批量上传道具任务

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
env int 0-正式环境 1-沙箱环境

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息
upload_item array 上传的道具列表
status int 0-无任务在运行 1-任务运行中 2-上传失败或部分失败(上传任务已经完成) 3-上传成功

upload_item的每一项内容如下:

字段 类型 说明
id string 道具id
name string 道具名称
price int 道具单价,单位分
remark string 道具备注
item_url string 道具图片的url地址(微信转存后)
upload_status int 0-上传中 1-id已经存在 2-上传成功 3-上传失败
errmsg string 上传失败的原因

# 备注

1. 使用支付签名

# start_publish_goods

# 地址

https://api.weixin.qq.com/xpay/start_publish_goods?access_token=xxx&pay_sig=xxx

# 描述

启动批量发布道具任务

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
publish_item array 发布的商品列表
env int 0-正式环境 1-沙箱环境

publish_item的每一项内容如下:

字段 类型 说明
id string 道具id,添加到开发环境时传的道具id

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息

# 备注

1. 使用支付签名

# query_publish_goods

# 地址

https://api.weixin.qq.com/xpay/query_publish_goods?access_token=xxx&pay_sig=xxx

# 描述

查询批量发布道具任务

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
env int 0-正式环境 1-沙箱环境

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息
publish_item array 发布的道具列表
status int 0-无任务在运行 1-任务运行中 2-上传失败或部分失败(上传任务已经完成) 3-上传成功

upload_item的每一项内容如下:

字段 类型 说明
id string 道具id
publish_status int 0-上传中 1-id已经存在 2-发布成功 3-发布失败
errmsg string 发布失败的原因

# 备注

1. 使用支付签名

# query_biz_balance

# 地址

https://api.weixin.qq.com/xpay/query_biz_balance?access_token=xxx&pay_sig=xxx

# 描述

查询商家账户里的可提现余额

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
env int 0-正式环境 1-沙箱环境(仅作为签名校验,查询的结果都是正式环境的)

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息
balance_available object 可提现余额

其中balance_available内容如下:

字段 类型 说明
amount string 可提现余额,单位元
currency_code string 币种(一般为CNY)

# 备注

1. 使用支付签名

# query_transfer_account

# 地址

https://api.weixin.qq.com/xpay/query_transfer_account?access_token=xxx&pay_sig=xxx

# 描述

查询广告金充值账户

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
env Number 0-正式环境 1-沙箱环境(仅作为签名校验,查询的结果都是正式环境的)

# 返回参数

字段 类型 说明
acct_list Array 广告金充值账户列表
errcode Number 错误码
errmsg String 错误信息

acct_list的每一项内容如下:

字段 类型 说明
transfer_account_name String 充值账户名称
transfer_account_uid Number 充值账户 uid
transfer_account_agency_id Number 充值账户服务商账号 id
transfer_account_agency_name String 充值账户服务商账号名称
state Number 0-待审核,1-审核通过,2-审核驳回
bind_result Number 1-绑定成功,2-绑定失败
error_msg String 错误信息

# query_adver_funds

# 地址

https://api.weixin.qq.com/xpay/query_adver_funds?access_token=xxx&pay_sig=xxx

# 描述

查询广告金发放记录

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
page Number 查询页码,不小于 1
page_size Number 每页记录数量
filter Object 查询过滤条件
env Number 0-正式环境 1-沙箱环境(仅作为签名校验,查询的结果都是正式环境的)

filter的每一项内容如下:

字段 类型 说明
settle_begin Number 查询结算周期开始时间,unix秒级时间戳
settle_end Number 查询结算周期结束时间,unix秒级时间戳
fund_type Number (可选)广告金发放原因, 0:通用赠送,1:广告激励,2:定向激励

# 返回参数

字段 类型 说明
adver_funds_list Array 广告金发放记录列表
total_page Number 查询命中总的页数
errcode Number 错误码
errmsg String 错误信息

adver_funds_list的每一项内容如下:

字段 类型 说明
settle_begin Number 结算周期开始时间,unix秒级时间戳
settle_end Number 查算周期结束时间,unix秒级时间戳
total_amount Number 发放广告金金额,单位分
remain_amount Number 剩余可用广告金金额,单位分
expire_time Number 广告金过期时间,unix秒级时间戳
fund_type Number 广告金发放原因, 0:通用赠送,1:广告激励,2:定向激励
fund_id String 广告金发放ID

# create_funds_bill

# 地址

https://api.weixin.qq.com/xpay/create_funds_bill?access_token=xxx&pay_sig=xxx

# 描述

充值广告金

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
transfer_amount Number 充值金额,单位分
transfer_account_uid Number 充值账户 uid
transfer_account_name String 充值账户名称
transfer_account_agency_id Number 充值账户服务商账号 id
request_id String 用户定义每一次请求的唯一 id,相同 id 的不同请求视为重复请求(不超过 1024 个字符)
settle_begin Number 充值所使用的广告金对应的结算周期开始时间,unix秒级时间戳
settle_end Number 充值所使用的广告金对应的结算周期结束时间,unix秒级时间戳
env Number 0-正式环境 1-沙箱环境(仅作为签名校验,查询的结果都是正式环境的)
authorize_advertise Number 是否授权广告数据, 0:否,1:是
fund_type Number 广告金发放原因, 0:通用赠送,1:广告激励,2:定向激励

# 返回参数

字段 类型 说明
errcode Number 错误码
errmsg String 错误信息
bill_id String 充值单 id

# bind_transfer_accout

# 地址

https://api.weixin.qq.com/xpay/bind_transfer_accout?access_token=xxx&pay_sig=xxx

# 描述

绑定广告金充值账户

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
transfer_account_uid Number 充值账户 uid
transfer_account_org_name String 充值账户主体名称
env Number 0-正式环境 1-沙箱环境(仅作为签名校验,查询的结果都是正式环境的)

# 返回参数

字段 类型 说明
errcode Number 错误码
errmsg String 错误信息

# query_funds_bill

# 地址

https://api.weixin.qq.com/xpay/query_funds_bill?access_token=xxx&pay_sig=xxx

# 描述

查询广告金充值记录

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
page Number 查询页码,不小于 1
page_size Number 每页记录数量
filter Object 查询过滤条件
env Number 0-正式环境 1-沙箱环境(仅作为签名校验,查询的结果都是正式环境的)

filter的每一项内容如下:

字段 类型 说明
oper_time_begin Number 查询充值开始时间,unix秒级时间戳
oper_time_end Number 查询充值结束时间,unix秒级时间戳
bill_id String (可选)广告金充值单 ID

# 返回参数

字段 类型 说明
bill_list Array 广告金充值记录列表
total_page Number 查询命中总的页数
errcode Number 错误码
errmsg String 错误信息

bill_list的每一项内容如下:

字段 类型 说明
bill_id String 充值单 ID
oper_time Number 充值时间,unix秒级时间戳
settle_begin Number 对应广告金结算周期开始时间,unix秒级时间戳
settle_end Number 对应广告金结算周期结束时间,unix秒级时间戳
fund_id String 对应广告金ID
transfer_account_name String 充值账户
transfer_account_uid Number 充值账户UID
transfer_amount Number 充值金额,单位:分
status Number 广告金充值状态:0-充值中,1-充值成功,2-充值失败

# query_recover_bill

# 地址

https://api.weixin.qq.com/xpay/query_recover_bill?access_token=xxx&pay_sig=xxx

# 描述

查询广告金回收记录

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
page Number 查询页码,不小于 1
page_size Number 每页记录数量
filter Object 查询过滤条件
env Number 0-正式环境 1-沙箱环境(仅作为签名校验,查询的结果都是正式环境的)

filter的每一项内容如下:

字段 类型 说明
recover_time_begin Number 查询回收开始时间,unix秒级时间戳
recover_time_end Number 查询回收结束时间,unix秒级时间戳
bill_id String (可选)广告金回收单 ID

# 返回参数

字段 类型 说明
bill_list Array 广告金回收记录列表
total_page Number 查询命中总的页数
errcode Number 错误码
errmsg String 错误信息

bill_list的每一项内容如下:

字段 类型 说明
bill_id String 回收单 ID
recover_time Number 回收时间,unix秒级时间戳
settle_begin Number 结算周期开始时间,unix秒级时间戳
settle_end Number 查算周期结束时间,unix秒级时间戳
fund_id String 对应的发放广告金ID
recover_account_name String 回收广告金账户
recover_amount Number 回收金额,单位:分
refund_order_list Array 对应的退款订单 id

# get_complaint_list

# 地址

https://api.weixin.qq.com/xpay/get_complaint_list?access_token=xxx&pay_sig=xxx

# 描述

获取投诉列表

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
env int 0-正式环境 1-沙箱环境(仅作为签名校验,查询的结果都是正式环境的)
begin_date string 筛选开始时间,格式为yyyy-mm-dd,如“2023-01-01”
end_date string 筛选结束时间,格式为yyyy-mm-dd,如“2023-01-01”
offset int 筛选偏移,从0开始
limit int 筛选最多返回条数

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息
total int 总条数
complaints array 投诉列表

其中complaints内容如下:

字段 类型 说明
complaint_id string 投诉id
complaint_time string 投诉时间 格式为yyyy-mm-dd'T'HH:MM:ssXXX,其中XXX为时区偏移,例如:2023-11-28T11:11:49+08:00
complaint_detail string 投诉内容
complaint_state string 投诉状态 PENDING-待处理;PROCESSING-处理中;PROCESSED-已处理完成
payer_phone string 投诉人联系方式
payer_openid string 投诉人在商户AppID下的唯一标识
complaint_order_info array 投诉单关联订单信息
complaint_full_refunded bool 投诉单下所有订单是否已全部全额退款
incoming_user_response bool 投诉单是否有待回复的用户留言
user_complaint_times int 用户投诉次数。用户首次发起投诉记为1次,用户每有一次继续投诉就加1
complaint_media_list array 户上传的投诉相关资料,包括图片凭证等
problem_description string 用户发起投诉前选择的faq标题
problem_type string 问题类型为申请退款的单据是需要最高优先处理的单据。REFUND: 申请退款;SERVICE_NOT_WORK: 服务权益未生效;OTHERS: 其他类型
apply_refund_amount int 当问题类型为申请退款时, 有值, (单位:分)
user_tag_list array 用户标签列表,每一项内容为string。TRUSTED: 此类用户满足极速退款条件;HIGH_RISK: 高风险投诉,请按照运营要求优先妥善处理
service_order_info array 投诉单关联服务单信息

其中complaint_order_info的每一期内容为:

字段 类型 说明
transaction_id string 投诉单关联的微信支付交易单号
out_trade_no string 渠道单号,query_order接口返回的channel_order_id
amount int 订单金额,单位(分)
wxa_out_trade_no string 商户单号,商家在拉走支付时传的单号
wx_order_id string 小程序侧单号

其中complaint_media_list每一项内容为:

字段 类型 说明
media_type string 体文件对应的业务类型,USER_COMPLAINT_IMAGE: 用户提交投诉时上传的图片凭证;OPERATION_IMAGE: 用户、商户、微信支付客服在协商解决投诉时,上传的图片凭证
media_url array 每一项的内容为string,媒体文件请求url

其中service_order_info每一项内容为:

字段 类型 说明
order_id string 微信支付服务订单号,每个微信支付服务订单号与商户号下对应的商户服务订单号一一对应
out_order_no string 商户系统内部服务订单号(不是交易单号),与创建订单时一致
state string 此处上传的是用户发起投诉时的服务单状态,不会实时更新。DOING: 服务订单进行中;REVOKED: 服务订单已取消;WAITPAY: 服务订单待支付;DONE: 服务订单已完成

# 备注

1. 使用支付签名

# get_complaint_detail

# 地址

https://api.weixin.qq.com/xpay/get_complaint_detail?access_token=xxx&pay_sig=xxx

# 描述

获取投诉详情

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
env int 0-正式环境 1-沙箱环境(仅作为签名校验,查询的结果都是正式环境的)
complaint_id string 投诉id,get_complaint_list接口返回

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息
complaint object 与get_complaint_list接口的complaints一致

# 备注

1. 使用支付签名

# get_negotiation_history

# 地址

https://api.weixin.qq.com/xpay/get_negotiation_history?access_token=xxx&pay_sig=xxx

# 描述

获取协商历史

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
env int 0-正式环境 1-沙箱环境(仅作为签名校验,查询的结果都是正式环境的)
complaint_id string 投诉id,get_complaint_list接口返回
offset int 筛选偏移,从0开始
limit int 筛选最多返回条数

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息
total int 总条数
history array 协商历史

其中history的每一项内容为:

字段 类型 说明
log_id string 操作流水号
operator string 当前投诉协商记录的操作人
operate_time string 当前操作时间,格式为yyyy-mm-dd'T'HH:MM:ssXXX,其中XXX为时区偏移,例如:2023-11-28T11:11:49+08:00
operate_type string 当前投诉协商记录的操作类型,对应枚举: USER_CREATE_COMPLAINT: 用户提交投诉 USER_CONTINUE_COMPLAINT: 用户继续投诉 USER_RESPONSE: 用户留言 PLATFORM_RESPONSE: 平台留言 MERCHANT_RESPONSE: 商户留言 MERCHANT_CONFIRM_COMPLETE: 商户申请结单 USER_CREATE_COMPLAINT_SYSTEM_MESSAGE: 用户提交投诉系统通知 COMPLAINT_FULL_REFUNDED_SYSTEM_MESSAGE: 投诉单发起全额退款系统通知 USER_CONTINUE_COMPLAINT_SYSTEM_MESSAGE: 用户继续投诉系统通知 USER_REVOKE_COMPLAINT: 用户主动撤诉(只存在于历史投诉单的协商历史中) USER_COMFIRM_COMPLAINT: 用户确认投诉解决(只存在于历史投诉单的协商历史中) PLATFORM_HELP_APPLICATION: 平台催办 USER_APPLY_PLATFORM_HELP: 用户申请平台协助 MERCHANT_APPROVE_REFUND: 商户同意退款申请 MERCHANT_REFUSE_RERUND: 商户拒绝退款申请, 此时操作内容里展示拒绝原因 USER_SUBMIT_SATISFACTION: 用户提交满意度调查结果,此时操作内容里会展示满意度分数 SERVICE_ORDER_CANCEL: 服务订单已取消 SERVICE_ORDER_COMPLETE: 服务订单已完成 COMPLAINT_PARTIAL_REFUNDED_SYSTEM_MESSAGE: 投诉单发起部分退款系统通知 COMPLAINT_REFUND_RECEIVED_SYSTEM_MESSAGE: 投诉单退款到账系统通知 COMPLAINT_ENTRUSTED_REFUND_SYSTEM_MESSAGE: 投诉单受托退款系统通知
operate_details string 当前投诉协商记录的具体内容
complaint_media_list array 投诉单执行操作时上传的资料凭证,包含用户、商户、微信支付客服等角色操作

其中complaint_media_list每一项的内容如下:

字段 类型 说明
media_type string 媒体文件对应的业务类型,USER_COMPLAINT_IMAGE: 用户提交投诉时上传的图片凭证;OPERATION_IMAGE: 用户、商户、微信支付客服在协商解决投诉时,上传的图片凭证
media_url array 每一项的内容为string,媒体文件请求url

# 备注

1. 使用支付签名

# response_complaint

# 地址

https://api.weixin.qq.com/xpay/response_complaint?access_token=xxx&pay_sig=xxx

# 描述

回复用户

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
env int 0-正式环境 1-沙箱环境(仅作为签名校验,查询的结果都是正式环境的)
complaint_id string 投诉id,get_complaint_list接口返回
response_content string 回复内容
response_images array 每一项的内容为string,传upload_vp_file接口返回的file_id

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息

# 备注

1. 使用支付签名

# complete_complaint

# 地址

https://api.weixin.qq.com/xpay/complete_complaint?access_token=xxx&pay_sig=xxx

# 描述

完成投诉处理

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
env int 0-正式环境 1-沙箱环境(仅作为签名校验,查询的结果都是正式环境的)
complaint_id string 投诉id,get_complaint_list接口返回

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息

# 备注

1. 使用支付签名

# upload_vp_file

# 地址

https://api.weixin.qq.com/xpay/upload_vp_file?access_token=xxx&pay_sig=xxx

# 描述

上传媒体文件(如图片,凭证等)

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
env int 0-正式环境 1-沙箱环境(仅作为签名校验,查询的结果都是正式环境的)
base64_img string 经base64编码后的图片内容,使用这个字段最多只能传1m的图片,超过1m请使用img_url字段
img_url string 图片url,需要能直接下载,不能是返回302等返回码的地址,最高允许传2m图片(优先使用img_url)
file_name string 图片名称

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息
file_id string 返回文件id

# 备注

1. 使用支付签名

# get_upload_file_sign

# 地址

https://api.weixin.qq.com/xpay/get_upload_file_sign?access_token=xxx&pay_sig=xxx

# 描述

获取微信支付反馈投诉图片的签名头部

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
env int 0-正式环境 1-沙箱环境(仅作为签名校验,查询的结果都是正式环境的)
wxpay_url string 微信支付的图片地址格式为"https://api.mch.weixin.qq.com/v3/merchant-service/images/{xxxxxx}"
convert_cos bool 是否转存到cos,转存后可以获得图片的临时下载地址,30分钟有效
complaint_id string 对应的反馈投诉id

# 返回参数

字段 类型 说明
errcode int 错误码
errmsg string 错误信息
sign string 返回微信支付图片请求的Authorization头部值,具体使用方法可查看备注
cos_url string 当convert_cos为true时才有意义,返回转存后的url地址,30分钟有效

# 备注

1.使用支付签名

2.微信支付的图片资源下载需要在http请求的时候必填以下3个头部信息,否则会报错

  • Authorization,签名验证,由本接口的sign返回
  • Accept,值需要是"application/json"
  • User-Agent,UA不能为空

# download_adverfunds_order

# 地址

https://api.weixin.qq.com/xpay/download_adverfunds_order?access_token=xxx&pay_sig=xxx

# 描述

下载广告金对应的商户订单信息

# 请求方法

POST , 请求参数为json字符串,Content-Type为application/json

# 请求参数

字段 类型 说明
fund_id String 广告金发放ID
env Number 0-正式环境 1-沙箱环境(仅作为签名校验,查询的结果都是正式环境的)

# 返回参数

字段 类型 说明
errcode Number 错误码
errmsg String 错误信息
url String 订单下载链接

# 备注

  1. 当前仅支持通用赠送广告金对应订单下载
  2. 第一次调用触发生成下载url,可以间隔轮训来获取最终生成的下载url。

# 消息推送

# 推送响应格式说明

注:如果推送响应格式不对,微信会重新推送,最多试15次

目前支持三种方式:

  1. 【推荐】文档中列的ErrCode方式

推送内容为xml格式时,响应内容需要是xml格式

<xml><Errcode>0</ErrCode><ErrMsg><![CDATA[success]]></ErrMsg></xml>

同理推送内容为json格式时,响应内容需要是json格式

{"ErrCode":0,"ErrMsg":"success"}
  1. 相应内容为空 或者success,表示成功(等价于第一种的ErrCode = 0)

# 道具发货推送xpay_goods_deliver_notify

# 请求参数

字段 类型 说明
ToUserName String 小程序原始ID
FromUserName String 该事件消息的openid,道具发货场景固定为微信官方的openid
CreateTime Number 消息发送时间
MsgType String 消息类型,固定为:event
Event String 事件类型
 xpay_goods_deliver_notify
OpenId String 用户openid
OutTradeNo String 业务订单号
Env Number 环境配置
 0:现网环境(也叫正式环境)
 1:沙箱环境
WeChatPayInfo Object 微信支付信息 非微信支付渠道可能没有
GoodsInfo Object 道具参数信息

WeChatPayInfo内容如下:

字段 类型 说明
MchOrderNo String 微信支付商户单号
TransactionId String 交易单号(微信支付订单号)
PaidTime Number 用户支付时间,Linux秒级时间戳

GoodsInfo内容如下:

字段 类型 说明
ProductId String 道具ID
Quantity Number 数量
OrigPrice Number 物品原始价格 (单位:分)
ActualPrice Number 物品实际支付价格(单位:分)
Attach String 透传信息

# 返回参数

字段 类型 是否必填 说明
ErrCode Number 发送状态。0:成功,其他:失败 todo
ErrMsg String 错误原因,用于调试。在errcode非0 的情况下可以返回

# 代币支付推送xpay_coin_pay_notify

# 请求参数

字段 类型 说明
ToUserName String 小程序原始ID
FromUserName String 该事件消息的openid,道具发货场景固定为微信官方的openid
CreateTime Number 消息发送时间
MsgType String 消息类型,固定为:event
Event String 事件类型
xpay_coin_pay_notify
OpenId String 用户openid
OutTradeNo String 业务订单号
Env Number 环境配置0:现网环境(也叫正式环境) 1:沙箱环境
WeChatPayInfo Object 微信支付信息 非微信支付渠道可能没有
CoinInfo Object 代币参数信息

WeChatPayInfo内容如下:

字段 类型 说明
MchOrderNo String 微信支付商户单号
TransactionId String 交易单号(微信支付订单号)
PaidTime Number 用户支付时间,Linux秒级时间戳

CoinInfo内容如下:

字段 类型 说明
Quantity Number 数量
OrigPrice Number 物品原始价格 (单位:分)
ActualPrice Number 物品实际支付价格(单位:分)
Attach String 透传信息

# 返回参数

字段 类型 是否必填 说明
ErrCode Number 发送状态。0:成功,其他:失败 todo
ErrMsg String 错误原因,用于调试。在errcode非0 的情况下可以返回

# 退款推送xpay_refund_notify

# 请求参数

字段 类型 说明
ToUserName String 小程序原始ID
FromUserName String 该事件消息的openid,道具发货场景固定为微信官方的openid
CreateTime Number 消息发送时间
MsgType String 消息类型,固定为:event
Event String 事件类型
xpay_refund_notify
OpenId String 用户openid
WxRefundId String 微信退款单号
MchRefundId String 商户退款单号
WxOrderId String 退款单对应支付单的微信单号
MchOrderId String 退款单对应支付单的商户单号
RefundFee Number 退款金额,单位分
RetCode Number 退款结果,0为成功,非0为失败
RetMsg String 退款结果详情,失败时为退款失败的原因
RefundStartTimestamp Number 开始退款时间,秒级时间戳
RefundSuccTimestamp Number 结束退款时间,秒级时间戳
WxpayRefundTransactionId String 退款单的微信支付单号
RetryTimes Number 重试次数,从0开始。重试间隔为2 4 8 16...最多15次

# 返回参数

字段 类型 是否必填 说明
ErrCode Number 发送状态。0:成功,其他:失败 todo
ErrMsg String 错误原因,用于调试。在errcode非0 的情况下可以返回

# 2.4.签名详解

用户态签名和支付签名在基础库wx.requestVirtualPayment和服务器API中都会涉及

# 支付签名

签名算法伪代码为:

paySig = to_hex(hmac_sha256(appKey,uri + '&' + signData))
参数 wx API 服务器API
appKey 可通过小程序MP查看:虚拟支付 -> 基本配置 -> 基础配置中的沙箱AppKey和现网AppKey。注意:记得根据env值选择不同AppKey,env = 0对应现网AppKey,env = 1对应沙箱AppKey 同理
signData 基础库的signData字段 api的post body
uri 固定填requestVirtualPayment 举例:对于https://api.weixin.qq.com/xpay/query_user_balance来说,uri = /xpay/query_user_balance

可参考下面的calc_pay_sig函数

# 用户态签名

签名算法伪代码为:

signature = to_hex(hmac_sha256(sessionKey,signData))
参数 wx API 服务器API
sessionKey session_key 同理
signData 基础库的signData字段 api的post body

# 参考的python脚本

以调用query_user_balance接口为例,签名计算如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-
""" pay_sig签名算法计算示例 """

import hmac
import hashlib
import json
import time

def calc_pay_sig(uri, post_body, appkey):
    """ pay_sig签名算法
      Args:
     uri - 当前请求的API的uri部分,不带query_string 例如:/xpay/query_user_balance
          post_body - http POST的数据包体
          appkey    - 对应环境的AppKey
      Returns:
          支付请求签名pay_sig
    """
    need_sign_msg = uri + '&' + post_body
    pay_sig = hmac.new(key = appkey.encode('utf-8'), msg = need_sign_msg.encode('utf-8'),
                       digestmod=hashlib.sha256).hexdigest()
    return pay_sig

def calc_signature(post_body, session_key):
    """ 用户登录态signature签名算法
      Args:
          post_body   - http POST的数据包体
          session_key - 当前用户有效的session_key,参考auth.code2Session接口
      Returns:
          用户登录态签名signature
    """
    need_sign_msg = post_body
    signature = hmac.new(key = session_key.encode('utf-8'), msg = need_sign_msg.encode('utf-8'),
                       digestmod=hashlib.sha256).hexdigest()
    return signature

# uri,切记不可带参数,即去掉"?"及后面的部分
# 如果是基础库的wx.requestVirtualPayment,uri固定为requestVirtualPayment
uri = '/xpay/query_user_balance'

# 此处appkey为假设值,实际使用应根据支付环境(env参数)替换为对应的AppKey
appkey = "12345"

# 注意:JSON数据序列化结果,不同语言/版本结果可能不同
# 所以示例为了保证稳定性,直接用其中一个序列化的版本
# 实际使用时只需要保证,参与签名的post_body和真正发起http请求的一致即可
"""
# 不同接口要求的Post Body参数不一样,此处以query_user_balance接口为例(和uri对应)
post_body = json.dumps({
    "openid": "xxx",
    "user_ip": "127.0.0.1",
    "env": 0
})
"""
post_body = '{"openid": "xxx", "user_ip": "127.0.0.1", "env": 0}'

# step1. pay_sig签名计算(支付请求签名算法)
pay_sig = calc_pay_sig(uri, post_body, appkey)
print("pay_sig:", pay_sig)

# 若实际请求返回pay_sig签名不对,根据以下步骤排查:
# 1. 确认算法:uri、post_body、appkey写死以上参数,确保你的签名算法和示例calc_pay_sig结果完全一致
# 2. 确认参数:
#    - uri不可带参数(即"?"及后续部分全部舍去)
#    - post_body必须和真正发起HTTP请求的post body完全一致
#    - appkey必须是与请求中对应的环境匹配(env参数决定)
assert pay_sig == "c37809f27c6d7fd1837ad2500a04512b66b34fd793a39a385fade56dca89a4b5"

# step2. signature签名计算(用户登录态签名算法)
# session_key需要为当前用户有效session_key(参考auth.code2Session接口获取)
# 此处写死方便复现算法
session_key = "9hAb/NEYUlkaMBEsmFgzig=="
signature = calc_signature(post_body, session_key)
print("signature:", signature)

# 若实际请求返回signature签名不对,参考随后的“90010-signature签名错误问题排查思路”进行排查
assert signature == "089d9e8dc5d308977360c4b79ec600a93d736802802a807d634192328032f6c7"

# 3.版本更新日志

1.0.13

  1. 广告金类型fund_type增加定向激励类型

1.0.12

  1. 新增下载广告金对应商户订单信息api: download_adverfunds_order

1.0.11

  1. query_transfer_account返回结构里新增账户审核、绑定状态和错误信息字段:state、bind_result、error_msg

1.0.10

  1. get_complaint_list返回结构里的payer_phone改为明文
  2. get_complaint_list返回结构里新增wxa_out_trade_no , wx_order_id字段

1.0.9

  1. 新增投诉图片签名获取接口get_upload_file_sign
  2. 修改get_complaint_detail接口的返回字段为complaint,与接口实际返回一致

1.0.8

  1. 新增广告金充值和回收查询 api:query_funds_bill,query_recover_bill

1.0.7

  1. query_adver_funds返回增加 fund_id 字段

1.0.6

  1. 新增投诉相关api,get_complaint_list、get_complaint_detail、get_negotiation_history、response_complaint、complete_complaint、upload_vp_file

1.0.5

  1. 新增广告金发放原因字段筛选和充值,支持通用赠送广告金查询和充值

1.0.4

  1. 新增query_order里的查单状态
  2. refund_order接口改成异步逻辑并支持t+3以上的单进行退款(需要在180天内),调用成功只是启动退款成功,最终结果需要查询
  3. 新增退款通知

1.0.3

  1. 新增广告金充值能力
  2. 新增广告金api能力,包括:查询广告金充值帐户、查询广告金发放记录、充值广告金、绑定广告金充值帐户。

1.0.2

  1. query_order新增结算状态字段
  2. 新增query_biz_balance接口查询提现余额

1.0.1

  1. 新增《推送响应格式说明》
  2. 新增全额提现能力
  3. 基础库版本支持到2.19.2

1.0.0

  1. 新增虚拟支付能力