或许你已经发现,乌徒帮线上的所有付费部分都可以用比特币来支付了。对于很多个人博客,特别是依托在WordPress系统之上的,他们中不乏极其优秀的作品。在一年前我看到阮一峰试图在自己的博客上尝试付费阅读,然而一年的时间他只收到了几百元的阅读费用,最主要的原因是付费过程比较复杂,或者付费的机制太过随意,没有形成有效的付费模式。今天我们就来讲解一下BitCoin付费阅读插件的构造原理即使用方法,使用这款插件可以帮助那些和阮一峰遇到同样问题的博主,并通过自己的博客获取价值。
为什么用比特币来付费阅读更有利 ↑
比特币或许大家都已经非常熟悉了,起码对这个名字非常熟悉。不过当下的人把比特币当作投机品,就像黄金一样,和人民币进行兑换,从中赚取利润。但是,我们希望把比特币当作游戏币,类似论坛的会员金币、Q币、理发店积分卡等等类似的流通手段,不过和这些私人发行的卷证相比,比特币在全世界范围内流通,有一定上线,没有发行机构,没有机构能够通过多发行比特币来吸引更多顾客,或使顾客手里的卷不再那么稀奇。随着时间流逝,比特币会越来越少,也越来越稀奇,但这并不影响把它作为一种类似游戏币的东西作为对博主优质内容的奖励。
上面简单谈了我对用比特币来付费阅读的一种意识和看法,下面介绍下从技术上讲为什么用比特币更有利于付费阅读。
我们不从投资或投机的角度看问题。比特币网络是匿名的,所以读者可以做到匿名付费阅读。比特币没有中心发行机构,所以不需要向谁申请使用权限。比特币全世界范围通行,国外读者不需要paypal,也不会受到来自发行商(如支付宝还是财付通,是工商银行还是招商银行)的间隔。比特币带有娱乐性,0.1和0.00001都是可以出现的单位。通过比特币支付阅读可以让你体会比特币网络是怎么运作的,解除你对比特币骗局的误解。总之,比特币付费阅读会比支付宝、财付通等插件来实现的付费阅读更方便,不信你可以在乌徒帮产品列表中尝试一下。
比特币付费阅读插件和支付宝付费阅读插件的本质区别 ↑
比特币付费过程可以完全匿名,你不需要留下你的任何信息就可以完成付费并阅读内容。支付宝是实名的,博主可以从自己的支付宝账号查到你的姓名、联系方式等等。
比特币付费过程不需要复杂的过程,支付宝付费需要“登录本站->跳转到支付宝官方->登录自己的支付宝账号->付款,输密码等各种繁琐手段->跳会本站:你选择的付费方式是担保交易的话,后期还需要发货、收货、确认付款等”这样非常复杂的过程,所以阮一峰在自己的博客中总结,付费阅读的用户体验是其效果不明显的关键性问题。而比特币支付则是这样“看到文章内容需要付费阅读,点击获取比特币地址或二维码,进行付款->等待确认,乌徒帮设定为4个确认即可阅读->刷新本页直接阅读”虽然这里描述的字很多,但实际上就是两个步骤“付款->等待”,不需要登录、确认、输入密码、收货等等乱七八糟的手续。
所有比特币支付的手续费是0.0001B/笔,支付宝则是2%一笔。
比特币付费阅读插件的实现原理 ↑
虽然比特币P2P网络提供了可以直接接入的接口,但是我们不可能在自己的服务器上安装比特币节点客户端,因此,我们一般使用第三方的API。我使用了blockchain的receive_payment api,这个API接口非常简单,你调用它,它返回给你一个即时的地址,读者向这个地址打款,等时机成熟,这个地址的比特币转到你的钱包地址上。
虽然我不信第三方API,但是如果blockchain都坑人,那我们还怎么相信比特币?我对比过blockchain和币行(国内一家集交易所和比特币银行于一身的网站),币行也提供同样的API,但实际却不能使用。blockchain的接口也有问题,notify通知从来收不到,不过我们有其他方法进行解决,所以完全不用担心。
1. 挑选一个专门的比特币地址作为你的最终收款地址
你可以从你的QT客户端选一个地址,也可以是一个其他的在线钱包(币行要求在线钱包不能是币行的,blockchain好像没有这个规定),总之把这个地址作为你的最终收款地址,以后说不定每天你都会发现这个地址上的比特币在增加。
2. 熟悉blockchain?receive payment API
这个API不需要你登录、不需要你申请API KEY、不需要你专门进行Oauth授权,你可以直接使用它。
这个接口只需要两个参数:上面提到的最终收款地址、一个callback URL
$my_address = BITCOIN4READ_ADDRESS; $my_callback_url = plugins_url('notify_url.php',BITCOIN4READ_PLUGIN_NAME).'?trade_id='.$trade_id.'&secret='.$secret; $call_url = "https://blockchain.info/api/receive?method=create&address=$my_address&callback=".urlencode($my_callback_url);
?3. 获得由API产生的付款地址
用户将自己的比特币发送到这个付款地址。
$response = file_get_contents($call_url); $object = json_decode($response); $input_address = $object->input_address;
它是由blockchain产生的,因此我们可以这么想,如果blocakchain想骗你的钱,只要当用户把币发送到这个地址后,blockchain不从这个地址把比特币转到上面提到的,你自己的钱包中,那么这些比特币就是blockchain的了。
实际上我被骗过,blockchain规定,向这个地址的付款最小额度是0.0005个比特币,也就是0.5mB,而我刚开始做测试的时候都是0.1mB在测试,结果我的币就这样一去不回了。因此,记住,一定要提醒你的读者,打款的时候必须大于0.5mB,否则对于读者而言就是损失。
4. 通过notify或其他途径确认用户已经向你付款,并通过了一定数量的确认
但用户向前面那个付款地址打款后,相当于把钱发给blockchain作为中转(至于为什么必须要有一个中间地址中转,而不是直接打款到我自己的收款地址,我到现在没有想通,因为即使通过中间地址,我也是可以查到谁向这个地址打款,根本不存在通过这种方法来匿名隐藏的说法),而这个交易(虽然是读者把钱打到一个中转地址)如果通过了确认(confirmations),blockchain就会通知第1步中的callback url,并带上tx、confirmation等参数,你就可以通过一个PHP文件把接到的通知保存到数据库里面,而如果confirmations超过了6个,基本上可以确保你可以收到这笔钱了,你就可以给读者阅读他付费后应该有的权限。
但是问题是,blockchain的notify失效了,在国外的各类论坛和问答社区上大家都在反映这个问题,却没有官方出来解答,有些人说问题解决了,但实际上还是没有notify通知到我的网站。因此,我们另辟蹊径,使用更安全的方法来判断用户的打款是否已经生效。
我们可以使用另外一个API,即blockchain提供的unspent API,通过这个API,你可以了解一个比特币地址最近的交易情况,我们把第3步中产生的付款地址保存下来,并通过unspent API查询,如果确认数量超过了6个,说明付款没有问题了,给读者看他应该看到的内容吧。
$unspent = file_get_contents("https://blockchain.info/unspent?active=$input_address"); $unspent = json_decode($unspent);
5. 等待blockchain把比特币打给你
很遗憾的是,跟支付宝不一样,比特币需要很长时间的确认过程才能完成交易,如果读者等确认等的花儿谢了,或许下次就不愿意再用比特币付费阅读了,所以你等不到自己收到最终的币就要把内容给读者看。这完全建立在你、比特币、读者、blockchain之间的无条件互信基础上。人们之所以相信支付宝,因为他们已经习惯并且感受到支付宝不会把他们担保的钱私吞,而如果人们同样相信blockchain的话,也会乐于使用比特币。
实现比特币付费阅读插件中还要解决的问题 ↑
上述原理中我们仅仅介绍了两个API就把所有问题大致说清楚了,但是,还有一些问题我们也需要解答。
1. 如何保证用户不用登录你的博客就可以付费阅读?
我想了很久,选择了折中的办法,即通过永久有效的cookie来记录用户的真实唯一性,只要用户不清空浏览器的记录,就可以在付费内容解锁后进行阅读。
在用户第一次进入博客的时候,就记录一个复杂随机值到一个cookie id中,这个id可以认为是这个用户暂时的user id,当然了,我们也鼓励用户注册成为博客的会员,这样我们可以永久保存他的阅读权限。
2. 如何保证notify URL不被强刷?
在callback url中,我们增加一个非常随机且复杂的随机校验码,并在用户访问的时候保存到数据库中,用户自己根本不知道这个随机码是多少,只有你的博客和blockchain知道。
而且,我们现在有了unspent API后,notify基本上成了摆设。不过从传统的API流程来看,notify是API的惯用伎俩。
3. 如果产生二维码?
这个太简单了,很多人说通过谷歌 qcode API来获取,有些人更摆出了一个复杂的PHP类来生成二维码,实际上 blockchain提供了每个比特币地址的二维码,只要改一下URL里面的比特币地址就可以出现和这个地址匹配的二维码。
4. 读者付了费,结果把自己的账号给别人,别人也来读怎么办?
实际上,我们不可能让内容完全隐蔽,付费阅读完全是一种自觉行为,你能保证使用某种技术手段让读者无法传播你的内容吗?实际上,传播内容才是互联网的生命。所以,那些愿意付费的读者善待他们,那些不愿意付费的读者,不用理会他们。
5. 那如果我的内容真的有版权呢?
在我的博客中我通过这种方式来卖主题、插件,一个读者付费后可以看到主题的下载链接,他点击之后就可以直接下载主题,无需和我进行直接沟通。但是,如果他想把这个下载链接给别人下载,不好意思,链接对除了他之外的人无效。
我们这个功能受益于WP2PCS,我们利用WP2PCS做了新的开发,限制了用户把自己的下载链接发送给别人下载。
当然了,这也是建立在自觉的基础上。
通过本文,或许你仍然不清楚插件代码的具体内容是什么,不要紧,你可以通过下面的付费按钮来进行购买,体验整个插件的使用过程。
下载 ↑
我已经将该插件托管在GitHub,你可以通过下面的按钮下载,欢迎fork和提建议哦。