Day30 - 铁人付外挂部署与发行(三)- 贩售外挂

在完成特定客户的需求之後,也许会有其他商家也希望可以在他们的 WooCommerce 购物网站上增加铁人付的金流功能,这时候我们有以下几种选择:

  1. 上架 wordpress.org 让客户可以在後台直接使用搜寻功能找到铁人付外挂後安装
  2. 提供压缩好的档案传送给潜在客户请他们自行从後台安装
  3. 将外挂档案上传到 Github 并发行版本供客户下载

如果是要以免费外挂来增加曝光,上架 wordpress.org 是比较好的选择,对於客户来说操作上最直觉,上架的步骤也很简单,基本上就是把档案打包好之後使用表单提交出去即可,具体的步骤可以参考这篇文章

但有时候做好的外挂我们不一定选择上架,有可能是等待审核的时间过长,或是这是需要收费的商业外挂,这时候我们就需要用其他方法来提供给客户安装。让客户安装相对单纯,比较麻烦的是後续的更新维护,如果是上架 wordpress.org,只要把更新档透过 SVN 版本控管提交後,在客户的後台就会收到更新提醒,我们完全不用担心更新服务器是如何跟客户网站做通知的。

但如果我们今天要发行的是付费外挂,这个环节就需要我们自行处理,在 Github 里面有不少的存放库可以解决这问题,然後除了更新外,发行付费外挂还需要有序号机制、网域授权、帐号管理等流程,所以我们需要一套解决方案来开始贩售外挂。

在准备展开贩售外挂的事业之前,有件非常重要的事情我们必须要先了解,那就是 WordPress 的开源授权规范是采用很严格的 GPL,不只是核心程序,在 WordPress 里面使用的布景主题、外挂也直接套用 GPL 授权。这代表任何人都可以自由的修改并且散播程序码。

也因为这样的授权规范,贩售外挂根据「程序码」来进行收费就没意义了,因为所有 WordPress 的程序码都是开源的,而你客制过的程序也必须遵守开源的规范,必须以相同的授权进行免费散播,同时让人有自由修改的权利。

那麽贩售 WordPress 外挂真正卖的是什麽呢?

因为这样的授权方式,现在可以找到一堆 GPL Download 的服务,这些服务从各种管道取得付费外挂的原始码,然後用低於市价或是订阅制的方式销售这些程序,然後声称他们收的是「维护费」,并强调他们提供的程序 100% 正版,绝对没有後门,而且还会定期更新。

之前看过一篇访谈,受访者是几间知名外挂大厂的负责人,讨论对於 GPL 授权以及 GPL Download 的想法,多数老板对於 GPL Download 斥之以鼻,但也有老板不在意,因为他们卖的不是程序码,而是「服务」,协助使用者解决问题或是开发更多新功能才是他们的核心价值。

而「服务」就是我们贩售外挂的核心,纵使有人不知道从哪里拿到你写好的付费外挂,而这版本万一被埋了後门或是套件过旧有漏洞,以及他们在使用上有任何问题,都得不到更新与维护,因此卖的是这些後续服务费用。

所以要贩售外挂首先就不能在意有人「破解」你的外挂,毕竟全都是开放原始码,要拔掉序号使用限制对於懂一点 PHP 的人来说易如反掌,与其要去防范如何让有心人士无法破解,不如把时间放在提升产品的功能上。

但难道我们就这样做白工便宜那些有心人士吗?如果今天外挂已经卖翻天了我觉得再来担心这件事比较合理,对个人开发者来说要在 WordPress 生态圈里面找到还没有被满足的需求,这件事的难度绝对比防破解要高上个千万倍。

有了这样的心理准备之後,我们从以下几个环节来探讨该如何展开外挂贩售事业:

  1. 调查市场需求
  2. 申请 Appsero
  3. 整合 Appsero 套件
  4. 建立外挂贩售网站与定价

1. 调查市场需求

该如何知道这支外挂有没有付费的市场需求,我从两个角度下去切入,第一个是既有客户请我客制化开发的第三方串接功能,像金流就是一种,当我的客户需要,也许就会有其他客户需要,把这样的外挂将比较核心功能抽离出来,并把之前写死的参数变成可以从後台设定的功能,让客户可以在後台直接操作。

第二个是观察社群讨论内容、近期热门的服务,思考如果转换成 WordPress 外挂能满足谁的需求,同时也可以研究是否有同性质的外挂,有的话是否可以把介面改良或是增加潜在客户可能会需要的功能,多问多听多看自然就会有想法。

但不管是哪一种方式,没有真正放在市场上永远不会知道是否有人愿意购买,因此写一篇商品的介绍文就非常重要,介绍文描述这个商品可以解决什麽问题、提供哪些功能、该如何设定以及联系方式,就跟真正的外挂介绍页一样,只是还没有开发出来而已XD

这样做的好处是首先就能让有需求的客户透过关键字找到这篇介绍文,二来在写这篇介绍文的同时,自己会把开发规格详列出来,而这些规格都是要解决一个特定的问题,不然常常埋首下去开发的时候,很容易包山包海,东加西加的结果会让商品定位不够聚焦,自然就无法让客户理解这外挂可以解决他们的什麽问题。

透过介绍文可以聚焦开发规格,具体的想像要怎麽使用这个外挂,然後最好附上一些设定页面的截图,这些画面不需要真的实际写程序开发出来,我的作法是拿类似操作逻辑的外挂改图做出来的,或是用一些做自订栏位的外挂快速拉一下,只要记住一个原则,在还没有确定真的会有人付费之前,半行程序都不要写。

至於何时可以开始写呢?我习惯是收到数封以上的来信询问,询问价格以及授权方式时,我就会知道这东西有市场,还有不少人会三番两次来信催问,就能知道这个需求非常迫切,等到这个时候就能开始实作了。

2. 申请 Appsero

Appsero 是一套专门用来提供 WordPress 布景主题与外挂贩售的解决方案,它整合了上面提到的需求,像是更新、序号、授权控管,另外还有客户管理、图表分析以及自动部署的功能,同时也有 WooCommerce 外挂,基本上用了这个服务可以很快速的把销售环节都搭建起来,不用自己写半行程序码。

但既然是完整的解决方案就势必要付出一些成本,Appsero 虽然有免费方案,但那是提供给有上架 wordpress.org 的外挂使用的,如果不上架要自己托管,就必须年缴一定的金额,它的计费方案算满好入门的,一个月 25 镁可以提供 500 个序号,所以最好商品的定价可以负担这笔开销,等到真的卖到超出这个量,可以选择进阶方案或是建置自己的解决方案。

它的管理後台有许多实用的管理功能,首先是分析工具,透过图表可以看到已启用与停用的数量,并且还能看到有装该外挂的客户环境,像是 PHP、WordPress 版本,这样就能根据较多人使用的环境来进行测试:

其次是客户管理,可以看到该客户的总购买金额以及基本资料,由於这些资料都是从 WooCommerce 送过来的,可以省去前往网站後台查看的时间:

至於序号管理可以直接在 Appsero 做停用与启用,并且得知该序号使用在哪个网域上,或是根本没有被启用,同时也能知道序号到期的时间点,这样就能在到期前提早通知客户进行续约:

另外它还可以自订当客户停用外挂时的原因,方便得知客户在使用上遇到的问题:

在实际运作之後发现 Appsero 最大的问题就是没有中文语系,不管是他们提供的外挂或是整合套件都需要自己手动处理翻译,但还好目前没有遇过客户看不懂的问题,所以综合以上好处,我很推荐使用 Appsero 来进行事业初期的外挂贩售管理。

3.整合 Appsero 套件

要如何让 Appsero 认得我们的外挂并确认序号是正确可用的呢?很简单,直接使用 composer 安装他们的套件即可,然後用该套件提供的方法来判断序号是否正确启用,具体步骤如下:

新增外挂

申请好帐号後可以看到主画面,点选左侧选单的 Plugins,进入页面後再点选右上角的
Add Plugin:

选择新增付费外挂:

输入外挂基本资料:

将序号交由 Appero 管理:

Appsero 支援多种软件贩售平台,目前我们先选择最後一个即可:

下一步会问你想要用哪一种方式进行销售,可以使用 WooCommerce 或是另外一套在 WordPress 上面贩售虚拟商品的 Easy Digital Download 外挂,但以目前台湾的金流收款考量,选择 WooCommerce 能获得比较大的支援度,因此这边先选择 WooCommerce:

最後选择 Appsero 来管理序号:

以及在贩售的网站上面安装 Appsero 的外挂并将 Key 贴入後进行验证:

上述步骤都完成後,会提示套件的安装说明:

composer require appsero/client 复制下来,稍後会回到我们外挂的目录来进行安装,点选下一步,Appsero 提供了一个函式来初始化套件,包含建立实 例、资料蒐集、更新以及输入序号的选单注册,另外它还贴心了提供隐私权政策范本,告知本外挂会收集哪些资料。

套件安装

接下来开启编辑器,在我们的外挂资料夹里面执行安装:

iron-pay$ composer require appsero/client

安装好之後开启 iron-pay.php引入 appsero 的套件,

// 略
/**
 * Initialize the plugin tracker
 *
 * @return void
 */
if ( ! class_exists( 'Appsero\Client' ) ) {
		require_once __DIR__ . '/appsero/src/Client.php';
}

$client = new Appsero\Client( 'xxxx-xxx-xxx-xxxxxxx', '铁人付金流', __FILE__ );

// Active insights.
$client->insights()->init();

// Active automatic updater.
$client->updater();

if ( $client->license()->is_valid() ) {
	\A7\autoload( plugin_dir_path( __FILE__ ) . 'src' );
	// 略
}

关键是 $client->license()->is_valid() 这个判断式,这代表只有当客户的序号通过验证时才会执行的内容,我把载入核心档案的方法写在这里面,也就是序号通过才会载入主程序,所以要「破解」也非常容易,把载入程序移出判断式就好,因此要谨记,我们卖的是服务不是程序码。

外挂更新

Appero 是使用 Release 来控管更新的推播,版本更新有两种方式,一种是从 Appsero 後台直接上传压缩档,另外一种是用 Github 的 tag 来取得最新版本,使用後者会比较方便,因此本文以 Github 来示范如何做到自动部署新版本。

首先我们要先把我们的存放库跟 Appsero 做绑定,在 Appsero 後台找到 Intergration 的选单,进入後可以看到 Github 的区块,选择 iron-pay 的存放库即可完成绑定:

接下来回到编辑器,在外挂根目录新增一个 Readme.txt 文字档,里面纪录了外挂的更新资讯、相容版本以及已测试过的 WordPress 版本,范例如下:

=== Iron Pay ===
Requires at least: 4.9.8
Tested up to: 5.8
Requires PHP: 7.0
Stable Tag: 1.0.0
WC requires at least: 5.0
WC tested up to: 5.5.2
License: GPLv3
License URI: https://www.gnu.org/licenses/gpl-3.0.html

== Description ==

铁人付外挂为铁人赛的 WooCommerce 金流外挂

== Installation ==

请参考安装教学:https://oberonlai.blog/tw/wordpress-plugin-sell

== Changelog ==
<p>v1.0.0 - 新增版本资讯</p>

这个资讯会显在 WordPress 後台的外挂资讯内,需要注意的是 Stable Tag,这边的版本号是 Appsero 判断是否有新版本提供的资讯,如果今天版更为 1.0.1 的话,这边也记得要修改。

接下来当我们增加了新功能或是除完错之後,可以先使用前一篇提到的 Buddy 来做自动化测试,确认无误後就能用 git tag 来新增发行版本并推到主线上:

iron-pay$ git tag -a v1.0.1 -m '新增功能'
iron-pay$ git push origin v1.0.1

透过这个动作 Appsero 就能知道有新版本推送了,它就会主动去推播给有安装该外挂的 WordPress 网站,同时也能在 Appsero 後台的 Release 看到发行版本纪录:

4. 建立外挂贩售网站与定价

接下来我们就可以用 WooCommerce 建立一个购物网站来贩售这支外挂,记得要先安装 Appsero Helper,这样当订单付款完成後顾客会收到下载连结,以及可以在网站这边登入帐号让顾客查看序号以及购买纪录。

另外我还推荐以下几支卖虚拟商品会用到的免费外挂:

以上最麻烦的部分是收款,现在台湾第三方金流控管比较严格,要贩售虚拟商品需要进行审核,如果真的申请不过,那就只能先提供汇款帐号的方式来处理,但就必须要人工对帐以及手动开通外挂下载权限。

至於一套外挂该卖多少钱呢?我个人是觉得至少要能打平做这件事的後续服务成本,因此定价最好不要太低,常看到国外的付费外挂功能强大到不行但却只卖十几二十块美金,我是觉得不能用国外的付费外挂价格来当作对照组,而是要根据本地市场来测试合适的价格区间,现在台湾也有很多厂商专门在贩售 WordPress 付费外挂,以他们的价格当参考会比较准确。

万一想提高单价但又没有比其他厂商多出强大的功能,这时候我们可以从方案下手,像是授权一个网域是一个价格,授权十个或是无限制是另一个价,也可以把多个外挂做组合销售,都是可以提高销售额却又不会增加成本的作法,总之就是多方尝试,找到市场可以接受的价格区间。

结语

WordPress 除了提供给不会写程序的人架设功能丰富的网站外,也让开发者有了很多机会来拓展自己的事业,不管是靠它接案还是贩售付费外挂,甚至是最後被大厂商并购,这在 WordPress 生态圈都已经不是新闻了,因此重点是不停止学习就可以发现更多的机会,持续学习才能不被既有的知识所局限!

本文同步发表於:https://oberonlai.blog/tw/woocommerce-payment-sell/


<<:  .NET Core第29天_Model验证配置准备流程_各种验证资料注解使用方式

>>:  [Day 15] 阿嬷都看得懂的开始写第一支 .css 档案罗!

Day10 - 今天只先铺底座标轴,明天来画 BMO

var canvasBmo = document.getElementById('canvasBmo...

专案是实现使命、愿景,及战略的具体努力!

分享一些多年来专案管理及工作的心得: 专案是实现使命、愿景,及战略的具体努力。使命感、远见与作梦的能...

Day 09:今天又想不出标题了!tmux plugin 和 mouse mode

我把从第一天到现在每天的 Home 目录都放上 GitHub 了,README.md 里面有说明 ...

Day 28 - Clean Coder 时程与承诺

前言 今天会接续着昨天的主题,来聊聊 The Clean Coder 的另一个主题。 在我过去的工作...

2.4.6 Design System - Carousel

学习曲线这件事 有时候,起步的阶段最累最难 Carousel 轮播器其实也是各种专案常遇到的元件 ...