You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PayPal订阅:跳过重复用户试用期及纯HTML表单调用订阅计划问询

解决方案:处理PayPal订阅试用期限制与纯HTML表单调用订阅计划

一、阻止已试用用户再次获取免费试用期

你当前使用的托管按钮(_s-xclick)的试用期设置是固定在PayPal后台的,无法直接通过前端HTML动态修改。要实现「判断用户是否用过试用期并禁用」的逻辑,需要结合后端状态记录和动态切换表单/参数来完成:

  1. 第一步:记录用户试用状态

    • 在你的服务器端数据库中,存储已使用过试用期的用户邮箱(可以通过PayPal的IPN即时付款通知,在用户首次完成试用订阅后触发记录;也可以在用户提交邮箱时先查询数据库做前置判断)。
    • 当用户再次访问订阅页面并输入邮箱时,后端先检查该邮箱是否存在于已试用列表中。
  2. 第二步:动态输出对应表单

    • 如果用户未试用过:直接输出你现有的带试用期的托管按钮表单即可。
    • 如果用户已试用过:需要在PayPal后台创建另一个不带试用期的托管按钮(去掉试用期相关设置),然后输出对应这个新按钮ID的表单;或者改用下面提到的非托管纯HTML表单方式,直接移除试用期参数。

    示例:后端判断后输出不带试用期的托管按钮表单(假设新按钮ID为NOPREVIEW12345):

    <form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" target="_top"> 
      <input type="hidden" name="cmd" value="_s-xclick"> 
      <input type="hidden" name="hosted_button_id" value="NOPREVIEW12345"> 
      <input type="hidden" name="on0" value="Your email"> 
      <label for="plan-email">Your email</label> 
      <input id="plan-email" type="email" name="os0" placeholder="joanne.doe@gmail.com" required maxlength="200"> 
      <button type="submit">Subscribe</button> 
    </form>
    

二、纯HTML表单调用PayPal Billing Plans创建的订阅计划(非托管按钮)

如果要直接调用你在PayPal Billing Plans中创建的订阅计划,且不依赖JS SDK,可以使用PayPal的传统订阅表单参数(cmd=_xclick-subscriptions),替代托管按钮的_s-xclick。以下是完整实现方案:

核心参数说明

  • cmd=_xclick-subscriptions:声明这是订阅请求
  • business:你的PayPal商家邮箱或商家ID(可在PayPal后台获取)
  • item_name:订阅计划名称
  • a3:订阅周期金额(例如10.00)
  • p3:订阅周期长度(例如1代表1个月)
  • t3:周期单位(M=月,W=周,D=日,Y=年)
  • src=1:开启自动续费
  • sra=1:付款失败时自动重试

试用期控制参数(可选)

仅当用户未试用过时添加以下参数,已试用用户则移除:

  • trial_a1=0.00:试用周期金额(0表示免费)
  • trial_p1=1:试用周期长度(1周)
  • trial_t1=W:试用周期单位(周)
  • trial_num=1:限制仅允许1次试用

传递用户邮箱及额外信息

  • 可以保留你原有的on0/os0字段收集用户邮箱,PayPal会将该值包含在IPN通知中,方便后端处理。
  • 也可通过custom字段传递用户邮箱或其他标识,后端可通过IPN接收该值。

完整示例代码

假设你的订阅计划为月度10美元,可根据用户状态动态添加/移除试用期参数:

<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" target="_top">
  <!-- 基础订阅参数 -->
  <input type="hidden" name="cmd" value="_xclick-subscriptions">
  <input type="hidden" name="business" value="your-merchant-email@example.com">
  <input type="hidden" name="item_name" value="Premium Monthly Subscription">
  <input type="hidden" name="currency_code" value="USD">
  <input type="hidden" name="a3" value="10.00">
  <input type="hidden" name="p3" value="1">
  <input type="hidden" name="t3" value="M">
  <input type="hidden" name="src" value="1">
  <input type="hidden" name="sra" value="1">

  <!-- 仅当用户未试用过时启用以下试用期参数 -->
  <!-- <input type="hidden" name="trial_a1" value="0.00">
  <input type="hidden" name="trial_p1" value="1">
  <input type="hidden" name="trial_t1" value="W">
  <input type="hidden" name="trial_num" value="1"> -->

  <!-- 用户邮箱输入及传递 -->
  <input type="hidden" name="on0" value="Your email">
  <label for="plan-email">Your email</label>
  <input id="plan-email" type="email" name="os0" placeholder="joanne.doe@gmail.com" required maxlength="200">
  <!-- 可选:将邮箱同步到custom字段,方便后端IPN接收 -->
  <input type="hidden" name="custom" value="" id="custom-email">

  <button type="submit">Subscribe</button>
</form>

<!-- 可选:用JS同步邮箱到custom字段 -->
<script>
  document.getElementById('plan-email').addEventListener('input', function(e) {
    document.getElementById('custom-email').value = e.target.value;
  });
</script>

关键注意点

  1. 商家信息准确性:business字段必须是你的PayPal商家邮箱或官方商家ID,不能使用托管按钮的hosted_button_id。
  2. 试用期动态控制:通过后端判断用户试用状态,决定是否输出trial_*系列参数——已试用用户不包含这些参数时,PayPal会直接按正式订阅流程收费。
  3. IPN通知配置:建议开启PayPal的IPN功能,这样后端可以实时接收订阅成功、试用开始/结束等事件,及时更新用户的试用状态记录。

内容的提问来源于stack exchange,提问作者Tigran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 17:52:58