这个题目看上去有点绕,但我实际想表达的意思是:

  • 我有一个产品,叫做纽扣词云,是一个生成词云图的产品
  • 这个产品非常简单,没有注册登录功能
  • 这个产品是免费的
  • 我想为这个产品添加一些付费功能,但希望能够以很低的开发量去完成,同时保持无需注册登录

目前为止,这个产品已经稳定运行了 2 年多了,每天都有几百人访问这个服务,几乎所有用户都给了很高的评价。

怎么说呢,有一个大家会用的产品的确很好,但这毕竟是一笔支出,如果能实现部分收费,从而让它自己赚到服务器的成本,甚至还能补贴一些零食可乐,那就再好不过了。

但是,我不太想破坏这个产品的基本调性,我也懒的去为了实现这个功能去开发注册登录支付等一大堆功能,大家喜欢它正是因为简单(无需注册登录),方便,好用,如果为了要增加付费功能,把产品变得和那些「平平无奇」的产品一样臃肿,那么就得不偿失了。

以下是我的改造计划。


为了保持不注册登录,同时拥有支付功能,我决定使用面包多来完成这个改造。是的,就是你现在看到的这个面包多,它可以干这个事儿。

确定收费策略

我肯定不会对所有用户收费,考虑到大多数用户的使用场景和对服务器的压力,我确定的收费策略如下:

  • 用户提交 1 万字以下的词云,免费
  • 1 万字以上的文本,需要付费使用,使用费为 19.9 元 ,长期有效

事实上,也可以指定一个年费,让用户按年付费,但为了减少开发量,也为了尽量不让用户觉得我在恰烂钱,我觉得 19.9 元的费用是比较合理的,这既是设立了一个门槛,减轻了服务器的负担,也实现了收入模式。

在面包多创建一篇付费内容

面包多是一个虚拟物品交易平台,一般用于付费阅读,出售软件,电子书等,但因为提供了比较全的 API,因此也可以用于序列号的出售,此处就是利用了这一点

在面包多新建一个内容,设置好价格,描述和付费后可见内容,设置如下

因为

1.用户购买后会自动生成并展示唯一的订单号

2.面包多提供了「根据订单号查询订单状态」的接口

所以我可以把订单号作为类似于「序列号」的东西,让用户输入,如果能根据这个订单号查询到订单状态,那么就认为这个用户买了高级版,并输出词云图结果,如果没有,则不通过。

开发验证接口

为了不暴露调用接口所使用的 token,我们需要单独开发一个验证接口,去验证用户提交的 key (也就是订单号)是否有效,这个接口非常简单,拿到传过来的 key 之后,再请求面包多的订单信息接口即可,PHP 代码示例如下(用 postman 直接生成的,其他语言也可以用 postman 直接生成):

<!--?php
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Credentials:true');
header('Access-Control-Allow-Methods:*');
header('Access-Control-Allow-Headers:x-requested-with,content-type'); 

//获得key
$key = $_GET['key'];


$token = '你的面包多token';



$curl = curl_init();
curl_setopt_array($curl, array(
  CURLOPT_URL =--> "https://x.mianbaoduo.com/api/order-detail?order_id=".$key,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_POSTFIELDS => "",
  CURLOPT_HTTPHEADER => array(
    "Postman-Token: 29d6871b-54d9-40bb-aded-653fa8e76dab",
    "cache-control: no-cache",
    "x-token: ".$token
  ),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
  echo "cURL Error #:" . $err;
} else {
  $response = json_decode($response,true);
  if($response['code']!=200){
      $return['code'] = $response['code'];
      $return['result'] = 'fail';
      echo json_encode($return);
      exit;
  }else{
      if($response['result']['urlkey']&&$response['result']['urlkey']=='面包多创建的内容的urlkey'){
        //此处也可以添加更多逻辑,例如频率限制等等
        $return['code'] = 200;
        $return['result'] = 'ok';
        echo json_encode($return);
        exit;
      }else{
        $return['code'] = 111;
        $return['result'] = 'no_pay';
        echo json_encode($return);
        exit;
      }
  }
}

拿到结果之后直接输出即可,这个接口会在后面用到。

改造产品

在用户提交生成词云请求后,判断字数是否超过 10000

如果超过 10000 字,那么尝试从 cookie 中拿 key,如果拿不到,则让用户填写 key

无论是从 cookie 中拿到的 key,或者是从用户输入中拿到的 key,都调用上面提到的接口去验证是否有效,如果有效,则继续执行词云图生成的逻辑,并把 key 存在 cookie 中,如果无效,则提示错误。

同时在输入 key 的弹框中放入购买的入口,这就算产品的改造工作基本完成了。

用户的使用流程如下:

之所以存到 cookie 是减少用户的输入次数,但凡输入一次 key,那么在 cookie 被清除之前都不需要再次输入。

为了避免混淆,我这里再提示一下:key = 订单号

至此,整个项目的「付费化改造」工作就基本完成了,整个改造工作约耗时 30 分钟,共计修改代码在 100 行以内,同时保持了「无注册登录」的特性,绝大部分用户依然是无感知使用,仅有部分用户在提交复杂操作时被提示收费。

改造效果如何呢?在我提交代码的 30 分钟内,就有人付费了:


我的微信公众号~