# 会员订阅

# 一、产品介绍

# 1.  核心能力

一次订阅,多次扣费:仅需和用户完成一次签约,后续可持续按周期发起扣费,完成周期会员续费。

会员订阅消息:对于有订阅关系的用户,微信开放平台会新增「会员专属」长期订阅消息;详见:会员订阅消息接入指引

仅支持安卓设备调用

# 2.  用户交互示意

# 3.  接入模式说明

  1. 用户首次签约、即扣费

    用户签约后,可在签约开始的12个小时内直接发起扣费,首次扣费无需向用户发起预扣费通知

  2. 用户首次签约时,不扣款

    用户先免费试用,后续再发起扣费,每次扣款、均需在t-2日向用户发送预扣费通知

# 4.  扣费说明

扣费 - 首次(用户签约12小时内):

校验项 业务规则
扣费权限 用户与小程序有签约 & 扣费时签约关系生效
扣费时间 用户签约起12小时内
扣费金额 最低1元,最高为道具价格

扣费 - 非首次(用户签约12小时以外)

校验项 业务规则
扣费权限 用户与小程序有签约 & 扣费时签约关系生效
扣费日期 商户在t-2日向用户发送了预扣费通知,t日可扣费
扣费时间 07:10~21:50
扣费金额 需和当次预扣费金额保持一致

预扣费:

校验项 业务规则
扣费权限 用户与商户有签约 & 扣费时签约关系生效
扣费日期 「首次」发送预扣费通知:无日期限制「非首次」预扣费通知:当前日期 >= 上一个会员周期结束日 - 3日
预扣费时间 07:10~21:50
扣费金额 最低1元,最高为道具价格

# 5.  结算周期、费率

当前开放五种周期的会员:

支付方式 会员周期 结算周期
主动支付 / T+3
会员订阅 单周会员 T+7
/ 双周会员 T+14
/ 月会员(31天) T+31
/ 季会员(93天) T+31
/ 年会员(372天) T+31

虚拟支付,技术服务费率:

支付方式 小程序类目 技术服务费率 说明
单次型支付 短剧、小说 5% 政策激励
/ 其他虚拟类目 1% 政策激励
订阅型支付 / 10% /

# 6.  准入标准

  • 已接入小程序虚拟支付
  • 小程序首次发布时间至今 >= 90天
  • 小程序完成认证备案
  • 近30天日均dau >= 1万

# 二、对接开发

# 1. 接入流程

步骤 流程 对接方式 api接口名称
初始化配置 开通权限授权 邮件 /
配置订阅道具 mp页面 虚拟支付 - 基础配置 - 道具配置 - 添加道具
签约、解约 用户签约 api wx.requestSubscribeSign
签约、解约结果通知 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

流程 对接方式 前置流程 邮件主题 邮件正文 邮件说明
开通权限授权
(小程序维度)
邮件 已和小程序产品团队确认接入意愿 申请开通小程序会员订阅 - 小程序昵称 - 申请日期 小程序昵称:
小程序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和现网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 商家解约 cancel_subscribe_contract

地址:https://api.weixin.qq.com/xpay/cancel_subscribe_contract?access_token=xxx&pay_sig=xxx

参数 类型 备注
openid String 用户的openid
termination_reason String 解约原因
product_id String 道具 id,需为订阅制道具
out_contract_code string 签约时传入的协议号

返回值:

参数 类型 备注
errcode Number 错误码
errmsg String 错误信息

# 4.4 查询签约关系 query_subscribe_contract

详情查看 查询签约关系

# 4.5 预通知扣款 send_subscribe_pre_payment

详情查看 预通知扣款

# 4.6 发起订阅扣款 submit_subscribe_pay_order

详情查看 发起订阅扣款

# 4.7 查询扣款订单 query_order

详情查看 查询创建的订单

# 4.8 申请退款 refund_order

详情查看 启动订单退款任务

# 4.9 签约、解约结果通知 xpay_subscribe_signing_result_notify

说明:

1.  建议通过 query_subscribe_contract 接口查询订单兜底

2.  按正确格式回复该通知

请求参数

基础字段

字段 类型 备注
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.10 扣款失败结果通知 xpay_subscribe_pay_fail_notify

注:

1.  建议通过 query_order 接口查询订单兜底,状态为 13 则为扣款失败

2.  按正确格式回复该通知

请求参数

基础字段

字段 类型 备注
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:沙箱环境
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.11 扣款成功通知 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 道具参数信息
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-支付全部,拼成退款
TeamAction Number。 0-创团 1-参团

返回参数

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

# 三、运营规范

为响应工业和信息化部相关通知,增强用户在签约流程中的感知及交易保障,保障用户账户权益,维护良好的信息消费环境,现微信开放平台针对小程序自动续费订阅会员能力的使用,推进以下的运营相关规范:

# 1. 用户签约前

1.  开发者申请自动续费订阅会员能力时,必须明确在服务详情中说明优惠结束后,每个周期扣款的原始金额为多少元,不得用小字、不得做模糊描述处理,须用户明确感知。

2.  自动续费订阅会员能力为开发者提供自定义扣款金额能力,但是扣款金额不得超过申请委托代扣模板的上限,不得低于平台规定的最低下限。

3.  申请自动续费订阅会员能力时,为保障用户权益,开发者需缴纳相应金额的交易保证金,保证金按照《小程序交易保证金管理规定》进行管理

4.  开发者申请自动续费订阅会员能力时,必须提供《会员自动续费服务协议》供平台审核,平台将合理判断是否有滥用能力、侵犯消费者合法权益等行为,审核通过后方可开放自动续费订阅会员能力。

a.  须在《会员自动续费服务协议》中明确展示订阅会员服务所包含的内容、服务周期、计费周期以及其他法律要求的等内容。

b.  须在《会员自动续费服务协议》中明确展示自动续费服务的退订方式。明确指引iOS用户、安卓用户在不同的支付平台的退订路径,该流程不得只在常见问题等类似界面展示。

c.  建议在《会员自动续费服务协议》中明确展示关于补扣款的条款内容,因为在扣费日期有可能因为网络、用户账户问题或余额不足导致不能正常扣费续费,在用户未主动明确取消服务前,平台将根据此前开发者与用户达成的委托在扣费日期继续发出续费代扣指令,一旦扣款成功,小程序将继续为用户开通下一个计费周期的连续服务。但由于用户对于补充扣费过程无感知,通常会带来用户投诉问题。因此建议开发者在用户服务协议中明确补扣款的条款内容,确保用户在阅读和签署协议时有接收到醒目的提示。

# 2. 用户签约中

1.  在用户支付场景时,小程序需要提供单次付费的商品,不得只提供自动续费商品,并强制用户绑定使用。

2.  用户在发起自动续费订阅会员能力签约时,须明确感知到当前的订阅优惠金额、未来续费金额、订阅周期以及订阅包含的服务

3.  在用户首次支付时醒目展示下一次周期的扣款时间。建议开发者在会员产品相关页面,加粗或高亮展示下一次服务周期的扣款时间。尤其在首次会员价格有设置营销策略时,通常第一个服务周期非常规周期。不可使用“到期前”“次月”等模糊字眼,不建议用灰色小字体表达。建议明确展示下个周期履约的第一天的具体日期,使小程序用户清晰接收到下一个扣款时间信息

4.  用户在发起自动续费订阅会员能力签约时,小程序需要提供《会员自动续费服务协议》勾选操作,且不得做默认勾选。醒目展示《会员自动续费服务协议》,并强化提醒用户主动勾选。建议开发者高亮展示《会员自动续费服务协议》文案,更好的做法是二次弹窗强化展示,让用户做二次确认。可以降低用户对于“被动签署协议、不明所以就签署了协议”的负向体验和解约诉求。

5.  小程序内的委托代扣商品前端展示时必须有自动续费订阅会员扣款模式的明显描述,如连续包周、连续包月等。

# 3. 用户签约后

1.  开发者针对用户的营销策略必须在用户签约时确认,用户确认后商家不得在签约后擅自修改已签约的优惠以及原本金额。服务内容变更需提前7日公示,重要变更需用户再次确认

2.  根据法律法规要求,自动续费服务在发起正式周期扣款之前必须通过有效手段提前 5 日提醒用户,包括不限于短信、邮件、消息推送等方式。基于用户体验,平台提供了预扣费通知能力,在小程序自动续费前2天将通知用户,且服务通知中说明的扣费金额必须与实际扣款金额相符。

3.  小程序内需要为用户提供客服服务如微信客服、在线IM客服,400电话等,以便用户能够直接联系到小程序开发者并进行相关的使用问题咨询与处理。

4.  如因开发者经营原因,出现周期代扣能力相关的客诉和资金风险等问题,或平台合理判断有滥用能力、侵犯消费者合法权益等情形,平台将进行相应治理处罚,包括但不限于限制小程序发版、回收周期代扣能力、限制结算和限制支付能力、下架小程序等。

5.  开发者须要支持在小程序内的订阅会员退款,应存在简洁清晰的用户退款界面和退款路径

6.  开发者收到投诉后须在24小时内处理投诉以及协商退款事宜,若在24小时内未处理,平台将主动介入处理客诉

7.  开发者应做好未成年消费引导,避免出现未成年人冲动/大额消费等问题,未成年人交易退款依照未成年人退款流程处理

8.  需在小程序内展示自动续费服务的退订解约方式。明确指引iOS用户、安卓用户在不同的支付平台的退订路径,该流程不得只在常见问题等类似界面展示;安卓端微信内退订路径:打开微信 - 我 - 服务 - 钱包 - 支付设置 - 自动续费 - 关闭相关小程序自动续费