# 会员订阅
# 一、产品介绍
# 1. 核心能力
一次订阅,多次扣费:仅需和用户完成一次签约,后续可持续按周期发起扣费,完成周期会员续费。
会员订阅消息:对于有订阅关系的用户,微信开放平台会新增「会员专属」长期订阅消息;详见:会员订阅消息接入指引
仅支持安卓设备调用
会员订阅不支持沙箱环境,所有接口的 env 参数只能为 0
# 2. 接入模式说明
# 3. 用户交互示意
# 4. 扣费说明
# 4.1 首次扣费(用户签约 12 小时内)
| 校验项 | 业务规则 |
|---|---|
| 扣费权限 | 用户与小程序有签约 & 扣费时签约关系生效 |
| 扣费时间 | 用户签约起 12 小时内 |
| 扣费金额 | 最低 1 元,最高为道具价格(不超过 5000 元) |
# 4.2 非首次扣费(用户签约 12 小时以外)
| 校验项 | 业务规则 |
|---|---|
| 扣费权限 | 用户与小程序有签约 & 扣费时签约关系生效 |
| 扣费日期 | 商户在 t-2 日向用户发送了预扣费通知,t 日可扣费 |
| 扣费时间 | 07:10 ~ 21:50 |
| 扣费金额 | 需和当次预扣费金额保持一致 |
# 4.3 预扣费
| 校验项 | 业务规则 |
|---|---|
| 扣费权限 | 用户与商户有签约 & 扣费时签约关系生效 |
| 扣费日期 | 「首次」发送预扣费通知:无日期限制;「非首次」预扣费通知:当前日期 >= 上一个会员周期结束日 - 3 日 |
| 预扣费时间 | 07:10 ~ 21:50 |
| 扣费金额 | 最低 1 元,最高为道具价格(不超过 5000 元) |
# 5. 结算周期
当前开放四种周期的会员订阅:
| 支付方式 | 会员周期 | 结算周期 |
|---|---|---|
| 主动支付 | / | T+3 |
| 会员订阅 | 周会员(7 天) | T+7 |
| 会员订阅 | 月会员(31 天) | T+31 |
| 会员订阅 | 季会员(93 天) | T+31 |
| 会员订阅 | 年会员(372 天) | T+31 |
# 6. 费率说明
订阅型支付的标准费率及优惠政策如下:
| 签约模式 | 行业 | 首笔扣费费率 | 第二笔及之后费率 |
|---|---|---|---|
| 纯签约 | 工具、社交等 | 1%(优惠费率) | 10% |
| 纯签约 | 短剧、小说 | 10% | 10% |
| 支付中签约 | 所有行业 | 当次支付走主动支付费率 | 10% |
# 7. 准入标准
- 已接入小程序虚拟支付
- 小程序首次发布时间至今 >= 90 天
- 小程序完成认证备案
- 近 30 天日均 DAU >= 1 万
# 二、对接开发
# 1. 接入流程
| 步骤 | 流程 | 对接方式 | api接口名称 |
|---|---|---|---|
| 初始化配置 | 开通权限授权 | 邮件 | / |
| 配置订阅道具 | mp页面 | 虚拟支付 - 基础配置 - 道具配置 - 添加道具 | |
| 签约、解约 | 纯签约 | api | wx.requestSubscribeSign |
| 支付中签约 | api | wx.requestVirtualPayment(signContractInfo) | |
| 签约、解约结果通知 | api | xpay_subscribe_signing_result_notify | |
| 商家解约 | api | cancel_subscribe_contract | |
| 查询签约状态 | api | query_subscribe_contract | |
| 发起扣款 | 预通知扣款 | api | send_subscribe_pre_payment |
| 发起订阅扣款 | api | submit_subscribe_pay_order | |
| 扣款失败通知 | api | 事件类型:xpay_subscribe_pay_fail_notify | |
| 扣款成功通知 | api | 事件类型:xpay_goods_deliver_notify | |
| 查询扣款订单 | api | query_order | |
| 退款 | 申请退款 | api | refund_order |
| 查询退款 | api | query_order |
# 2. 申请开通
收件人:wx_virtualpayment@tencent.com
| 流程 | 对接方式 | 前置流程 | 邮件主题 | 邮件正文 | 邮件说明 |
|---|---|---|---|---|---|
| 开通权限授权 (小程序维度) | 邮件 | - 已接入小程序虚拟支付 - 小程序首次发布时间至今 >= 90 天 - 小程序完成认证备案 - 近 30 天日均 DAU >= 1 万 | 申请开通小程序会员订阅 - 小程序昵称 - 申请日期 | 小程序昵称: 小程序appid: 虚拟支付商户号: 小程序主体: 小程序类目: 业务模式:主营业务,小程序dau,交易金额 申请用途: 会员相关产品页面交互:(开通、续费、管理流程,图片jpg、png格式,文件大小不超过2MB) | 注意事项: 1. 不允许使用拍照图片 2. 需把完整的交互都放在一张图片里 3. 购买记录页面需要出现客服电话,且客服电话需要完成认证 认证方式 交互示意: ![]() |
# 3. 配置订阅道具
当前支持进入小程序后台 - 虚拟支付 - 基本配置 - 道具配置 - 开发版本 - 添加道具 选择会员订阅道具进行配置

提交订阅道具审核后,1~3天审核完成,审核完成将以站内信形式通知,审核通过后重新进入道具配置界面点击发布即可
注意:会员订阅道具不可编辑、删除等操作,当前仅支持手动单独添加,无法批量添加道具
# 4. 接口调用
# 4.1 支付签名
签名算法伪代码为:
paySig = to_hex(hmac_sha256(appKey,uri + '&' + signData))
| 参数 | wx API | 服务器API |
|---|---|---|
| appKey | 可通过小程序MP查看:虚拟支付 -> 基本配置 -> 基础配置中的现网AppKey。注意:会员订阅不支持沙箱环境,env 只能为 0,请使用现网AppKey | 同理 |
| signData | 基础库的signData字段 | api的post body |
| uri | 签约接口填:requestSubscribeSign | 举例:对于https://api.weixin.qq.com/xpay/query_user_balance来说,uri = /xpay/query_user_balance |
# 4.2 纯签约 wx.requestSubscribeSign
注:该接口返回值不能作为签约成功的判定标准,需以签约结果通知/签约查询为准
| 字段 | 类型 | 说明 |
|---|---|---|
| signData | string | json字符串 |
| paySig | string | 支付签名, 详见签名详解 uri:requestSubscribeSign |
| signature | string | 用户态签名, 详见签名详解 |
| success | function | 接口调用成功的回调函数 |
| fail | function | 接口调用失败的回调函数 |
| complete | function | 接口调用完成的回调函数(调用成功、失败都会执行) |
signData 参数
| 字段 | 类型 | 说明 |
|---|---|---|
| productId | string | 订阅道具的id |
| outContractCode | string | 签约协议号,由商户生成,只能是数字、大小写字母的描述,长度不超过32。如重新发起签约,需更换单号重试,同一用户也需要换单。示例值:100001256(建议以用户维度生成,避免重复) |
| contractAccountName | string | 签约用户的名称,用于页面展示不允许传入以下字符:()'"<> |
| openid | string | 用户 openid |
返回参数
| 字段 | 类型 | 说明 |
|---|---|---|
| errcode | int | 错误码 |
| errmsg | string | "ERR_SUBSCRIBE_DEVICE_NOT_ALLOWED"(苹果设备暂未开放订阅制)"USER_DATA_ILLEGAL""OPENID_ILLEGAL""OPENID_NOT_MATCH""SIGNATURE_INVALID""EC_PAY_SIG_INVALID""ERR_SUBSCRIBE_OUT_CONTRACT_CODE_ILLEGAL""PRODUCT_ID_NOT_PUBLISH""ERR_CODE_SUBSCRIBE_PRODUCT_NOT_BIND""ERR_SUBSCRIBE_CONTRACT_CODE_REPEAT" "EC_SYS" - (系统错误,联系开发人员排查) |
# 4.3 支付中签约 wx.requestVirtualPayment
在调用 wx.requestVirtualPayment 发起支付时,可通过 signData.signContractInfo 附带签约信息,实现支付与签约同步完成的能力。用户在支付页确认后,完成扣款的同时自动建立签约关系。
- 用户支付成功后,会通过发货通知(
xpay_goods_deliver_notify)回调商户 - 用户签约成功后,会通过签约成功通知(
xpay_subscribe_signing_result_notify)回调商户 - 支付中签约模式不支持在签约成功后 12 小时内发起扣款、或发送预通知,可在签约12小时及以后、发起第一次预扣费通知
接口入参
| 层级 | 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| 顶层 | mode | string | 是 | 支付类型:short_series_goods(道具直购)/ short_series_coin(代币充值) |
| signData | string | 是 | 支付参数,需 JSON.stringify() 转为字符串 | |
| paySig | string | 是 | 支付签名, 详见签名详解 uri:requestSubscribeSign | |
| signature | string | 是 | 用户态签名, 详见签名详解 | |
| success | function | 否 | 成功回调 | |
| fail | function | 否 | 失败回调 | |
| complete | function | 否 | 结束回调 | |
| signData | offerId | string | 是 | 支付侧申请的应用 ID |
| buyQuantity | number | 是 | 购买数量 | |
| currencyType | string | 是 | 币种,目前仅支持 CNY | |
| outTradeNo | string | 是 | 业务订单号,8-32 字符,只能包含数字、大小写字母、_-\|*@,不能以 _ 开头 | |
| attach | string | 是 | 透传数据,发货通知时透传给开发者 | |
| env | number | 否 | 环境:0 正式(默认)/ 1 沙箱。会员订阅不支持沙箱,携带 signContractInfo 时 env 只能为 0 | |
| productId | string | 条件必填 | 道具 ID,mode=short_series_goods 时必填 | |
| goodsPrice | number | 条件必填 | 道具单价(分),mode=short_series_goods 时必填 | |
| activitySellingPrice | number | 否 | 道具优惠价(分),最低为原价的 40% | |
| signContractInfo | object | 否 | 签约信息,不传则走普通支付流程,不触发签约 | |
| signContractInfo | sign_contract_product_id | string | 否 | 订阅道具的 ID |
| out_contract_code | string | 否 | 签约协议号,由商户生成,只能是数字、大小写字母,长度不超过 32。如重新发起签约,需更换单号重试,同一用户也需要换单。示例值:100001256(建议以用户维度生成,避免重复) | |
| contract_account_name | string | 否 | 签约用户的名称,用于页面展示。不允许传入以下字符:( ) ' " < > |
success 回调参数
| 属性 | 类型 | 说明 |
|---|---|---|
| errMsg | string | 调用成功信息 |
fail 回调参数
| 属性 | 类型 | 说明 |
|---|---|---|
| errMsg | string | 错误信息 |
| errCode | number | 错误码 |
错误码
| 错误码 | 说明 |
|---|---|
| 1001 | 参数错误 |
| -1 | 支付失败 |
| -2 | 支付取消 |
| -4 | 风控拦截 |
| -5 | 开通签约结果未知 |
| -15001 | 参数错误,具体原因见 errMsg |
| -15001 | 签约相关:用户已对该道具签约,无需重复签约(ERR_USER_ALREADY_SIGNED_FOR_THIS_PRODUCT) |
| -15001 | 签约相关:缺少签约协议号 out_contract_code(ERR_SIGN_CONTRACT_OUT_CONTRACT_CODE_REQUIRED) |
| -15001 | 签约相关:iOS 不支持支付中签约(ERR_IOS_NOT_ALLOWED_PAY_AND_SIGN) |
| -15002 | outTradeNo 重复使用,请换新单号重试 |
| -15003 | 系统错误 |
| -15004 | currencyType 错误,目前只能填 CNY |
| -15005 | 用户态签名 signature 错误 |
| -15006 | 支付签名 paySig 错误 |
| -15007 | session_key 过期 |
| -15008 | 二级商户进件未完成 |
| -15009 | 代币未发布 |
| -15010 | 道具 productId 未发布 |
| -15011 | 现网版本的 env 只能是 0,不能填 1(沙箱环境) |
| -15012 | 调用支付服务失败导致关单,请换新单号重试 |
| -15013 | goodsPrice 道具价格错误 |
| -15014 | 道具/代币发布未生效,禁止下单,约 10 分钟后生效 |
| -15016 | signData 格式有问题 |
| -15017 | 此商家涉嫌违规,收款功能已被限制,暂无法支付 |
| -15018 | 代币或道具 productId 审核不通过 |
| -15019 | 商户受限 |
| -15020 | 操作过快,请稍后再试 |
| -15021 | 小程序被限频交易 |
# 4.4 商家解约 cancel_subscribe_contract
详情查看 商家解约
# 4.5 查询签约关系 query_subscribe_contract
详情查看 查询签约关系
# 4.6 预通知扣款 send_subscribe_pre_payment
详情查看 预通知扣款
# 4.7 发起订阅扣款 submit_subscribe_pay_order
详情查看 发起订阅扣款
# 4.8 查询扣款订单 query_order
详情查看 查询创建的订单
# 4.9 申请退款 refund_order
详情查看 启动订单退款任务
# 4.10 签约、解约结果通知 xpay_subscribe_signing_result_notify
说明:
建议通过 query_subscribe_contract 接口查询订单兜底
按正确格式回复该通知
请求参数
基础字段
| 字段 | 类型 | 备注 |
|---|---|---|
| ToUserName | String | 小程序原始ID |
| FromUserName | String | 该事件消息的openid,道具发货场景固定为微信官方的openid |
| CreateTime | Number | 消息发送时间 |
| MsgType | String | 消息类型,固定为:event |
| Event | String | 事件类型xpay_subscribe_signing_result_notify |
特殊字段
| 字段 | 类型 | 备注 |
|---|---|---|
| Action | String | contract_notify(签约通知)/cancel_contract_notify(解约通知) |
| UserOpenid | String | 发起签约时的 openid |
| OpenorcloseTime | Number | 时间戳,签约/解约时间 |
| ProductId | String | 道具 id |
| OutContractCode | String | 商户签约协议号 |
| ContractWxAppid | String | 签约 appid |
返回参数
| 字段 | 类型 | 备注 |
|---|---|---|
| ErrCode | Number | 发送状态。0:成功,其他:失败 |
| ErrMsg | String | (非必填)错误原因,用于调试。在errcode非0 的情况下返回 |
返回格式参考消息推送文档:消息推送 | 微信开放文档
XML 示例:
<xml>
<ErrCode>0</ErrCode>
<ErrMsg>success</ErrMsg>
</xml>
# 4.11 扣款失败结果通知 xpay_subscribe_pay_fail_notify
注:
建议通过 query_order 接口查询订单兜底,状态为 13 则为扣款失败
按正确格式回复该通知
请求参数
基础字段
| 字段 | 类型 | 备注 |
|---|---|---|
| ToUserName | String | 小程序原始ID |
| FromUserName | String | 该事件消息的openid,道具发货场景固定为微信官方的openid |
| CreateTime | Number | 消息发送时间 |
| MsgType | String | 消息类型,固定为:event |
| Event | String | 事件类型xpay_subscribe_pay_fail_notify |
特殊字段
| 字段 | 类型 | 备注 |
|---|---|---|
| OpenId | String | 用户openid |
| OutTradeNo | String | 业务订单号 |
| Env | Number | 环境配置 0:现网环境(也叫正式环境) 1:沙箱环境。会员订阅场景下 Env 只为 0 |
| WeChatPayInfo | Object | 微信支付信息 非微信支付渠道可能没有 |
| GoodsInfo | Object | 道具参数信息 |
| ContractWxAppid | String | 签约 appid |
WeChatPayInfo内容
| 字段 | 类型 | 备注 |
|---|---|---|
| MchOrderNo | String | 微信支付商户单号 |
| TransactionId | String | 交易单号(微信支付订单号) |
| PaidTime | Number | 用户支付时间,Unix秒级时间戳 |
GoodsInfo内容
| 字段 | 类型 | 备注 |
|---|---|---|
| ProductId | String | 道具ID |
| Quantity | Number | 数量 |
| OrigPrice | Number | 物品原始价格 (单位:分) |
| ActualPrice | Number | 物品实际支付价格(单位:分) |
| Attach | String | 透传信息 |
| SubscribePeriodDays | Number | 订阅周期 |
返回参数
| 字段 | 类型 | 备注 |
|---|---|---|
| ErrCode | Number | 发送状态。0:成功 |
| ErrMsg | String | (非必填)错误原因,用于调试。在errcode非0 的情况下可以返回 |
返回格式参考消息推送文档:消息推送 | 微信开放文档
XML 示例:
<xml>
<ErrCode>0</ErrCode>
<ErrMsg>success</ErrMsg>
</xml>
# 4.12 扣款成功通知 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:沙箱环境。会员订阅场景下 Env 只为 0 |
| WeChatPayInfo | Object | 微信支付信息 非微信支付渠道可能没有 |
| GoodsInfo | Object | 道具参数信息 |
| TeamInfo | Object | 拼团信息 |
WeChatPayInfo内容如下:
| 字段 | 类型 | 说明 |
|---|---|---|
| MchOrderNo | String | 微信支付商户单号 |
| TransactionId | String | 交易单号(微信支付订单号) |
| PaidTime | Number | 用户支付时间,Unix秒级时间戳 |
GoodsInfo内容如下:
| 字段 | 类型 | 说明 |
|---|---|---|
| ProductId | String | 道具ID |
| Quantity | Number | 数量 |
| OrigPrice | Number | 物品原始价格 (单位:分) |
| ActualPrice | Number | 物品实际支付价格(单位:分) |
| Attach | String | 透传信息 |
TeamInfo内容如下:
| 字段 | 类型 | 说明 |
|---|---|---|
| ActivityId | String | 活动id |
| TeamId | String | 团id |
| TeamType | Number | 团类型 1-支付全部,2-拼团失败退款 |
| TeamAction | Number | 0-创团 1-参团 |
返回参数
| 字段 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| ErrCode | Number | 是 | 发送状态。0:成功,其他:失败 |
| ErrMsg | String | 否 | 错误原因,用于调试。在errcode非0 的情况下可以返回 |
# 三、运营规范
为响应工业和信息化部相关通知,增强用户在签约流程中的感知及交易保障,保障用户账户权益,维护良好的信息消费环境,现微信开放平台针对小程序自动续费订阅会员能力的使用,推进以下的运营相关规范:
# 1. 用户签约前
开发者申请自动续费订阅会员能力时,必须明确在服务详情中说明优惠结束后,每个周期扣款的原始金额为多少元,不得用小字、不得做模糊描述处理,须用户明确感知。
自动续费订阅会员能力为开发者提供自定义扣款金额能力,但是扣款金额不得超过申请委托代扣模板的上限,不得低于平台规定的最低下限。
申请自动续费订阅会员能力时,为保障用户权益,开发者需缴纳相应金额的交易保证金,保证金按照《小程序交易保证金管理规定》进行管理
开发者申请自动续费订阅会员能力时,必须提供《会员自动续费服务协议》供平台审核,平台将合理判断是否有滥用能力、侵犯消费者合法权益等行为,审核通过后方可开放自动续费订阅会员能力。
a. 须在《会员自动续费服务协议》中明确展示订阅会员服务所包含的内容、服务周期、计费周期以及其他法律要求的等内容。
b. 须在《会员自动续费服务协议》中明确展示自动续费服务的退订方式。明确指引iOS用户、安卓用户在不同的支付平台的退订路径,该流程不得只在常见问题等类似界面展示。
c. 建议在《会员自动续费服务协议》中明确展示关于补扣款的条款内容,因为在扣费日期有可能因为网络、用户账户问题或余额不足导致不能正常扣费续费,在用户未主动明确取消服务前,平台将根据此前开发者与用户达成的委托在扣费日期继续发出续费代扣指令,一旦扣款成功,小程序将继续为用户开通下一个计费周期的连续服务。但由于用户对于补充扣费过程无感知,通常会带来用户投诉问题。因此建议开发者在用户服务协议中明确补扣款的条款内容,确保用户在阅读和签署协议时有接收到醒目的提示。
# 2. 用户签约中
在用户支付场景时,小程序需要提供单次付费的商品,不得只提供自动续费商品,并强制用户绑定使用。
用户在发起自动续费订阅会员能力签约时,须明确感知到当前的订阅优惠金额、未来续费金额、订阅周期以及订阅包含的服务
在用户首次支付时醒目展示下一次周期的扣款时间。建议开发者在会员产品相关页面,加粗或高亮展示下一次服务周期的扣款时间。尤其在首次会员价格有设置营销策略时,通常第一个服务周期非常规周期。不可使用"到期前""次月"等模糊字眼,不建议用灰色小字体表达。建议明确展示下个周期履约的第一天的具体日期,使小程序用户清晰接收到下一个扣款时间信息
用户在发起自动续费订阅会员能力签约时,小程序需要提供《会员自动续费服务协议》勾选操作,且不得做默认勾选。醒目展示《会员自动续费服务协议》,并强化提醒用户主动勾选。建议开发者高亮展示《会员自动续费服务协议》文案,更好的做法是二次弹窗强化展示,让用户做二次确认。可以降低用户对于"被动签署协议、不明所以就签署了协议"的负向体验和解约诉求。
小程序内的委托代扣商品前端展示时必须有自动续费订阅会员扣款模式的明显描述,如连续包周、连续包月等。
# 3. 用户签约后
开发者针对用户的营销策略必须在用户签约时确认,用户确认后商家不得在签约后擅自修改已签约的优惠以及原本金额。服务内容变更需提前7日公示,重要变更需用户再次确认
根据法律法规要求,自动续费服务在发起正式周期扣款之前必须通过有效手段提前 5 日提醒用户,包括不限于短信、邮件、消息推送等方式。基于用户体验,平台提供了预扣费通知能力,在小程序自动续费前2天将通知用户,且服务通知中说明的扣款金额必须与实际扣款金额相符。
小程序内需要为用户提供客服服务如微信客服、在线IM客服,400电话等,以便用户能够直接联系到小程序开发者并进行相关的使用问题咨询与处理。
如因开发者经营原因,出现周期代扣能力相关的客诉和资金风险等问题,或平台合理判断有滥用能力、侵犯消费者合法权益等情形,平台将进行相应治理处罚,包括但不限于限制小程序发版、回收周期代扣能力、限制结算和限制支付能力、下架小程序等。
开发者须要支持在小程序内的订阅会员退款,应存在简洁清晰的用户退款界面和退款路径
开发者收到投诉后须在24小时内处理投诉以及协商退款事宜,若在24小时内未处理,平台将主动介入处理客诉
开发者应做好未成年消费引导,避免出现未成年人冲动/大额消费等问题,未成年人交易退款依照未成年人退款流程处理
需在小程序内展示自动续费服务的退订解约方式。明确指引iOS用户、安卓用户在不同的支付平台的退订路径,该流程不得只在常见问题等类似界面展示;安卓端微信内退订路径:打开微信 - 我 - 服务 - 钱包 - 支付设置 - 自动续费 - 关闭相关小程序自动续费
