社区活动通过Matters API PayTo发奖金实验
liker io一对多一次性投币,只有第一个被投币对象才能收到提示邮件,而且数据还是错的,害别人白开心一场,也挺囧的😳。。。。。
去https://api.like.co/tx/id/查区块链id,也只会显示投币对象和投币总数,不会显示每个对象分别被投了多少:
既然这样,就更别指望被投币对象还能收到正确的邮件提示了。。。。。。
基于以上原理只有考虑去用matters API生成付款链接,再付款了。
matters api投币支持作者大致原理如下:
- 通过PayTo API生成liker land付款完整链接,此时transaction状态为pending
- 在liker land付款链接付款完成,full链接自带的redirect_uri参数告知被投币文章,此时付款完成
- transaction完成后,投币文章下方显示投币人圆圈头像。
比如我要给这篇文章投币,流程如下:
1 Matters API Pay To
1.1 登录
想要使用Matters API PayTo需要验证登录才可进行,不同于query取出tag、article之类的。所以先用Matters userLogin API 登录。登录API代码如下:
mutation { userLogin(input: { email: "matters登录邮箱" password: "matter登录密码" }) { token } }
一旦邮箱和密码匹配,你将会得到一个token用于需要身份验证的API授权使用。
token就是一串看不懂的abcd。。。。。。不用管是什么意思。。。。。。当然了token会过期,所以不是每一次登录都返回相同的token值.。。。。。。
1.2 用payto生成付款链接
当你在登录状态,想给某个用户的某篇文章投币时,就会用到payto api。
假如我想给@雞毛的小事 的这篇文章雞毛的大事 (D-28)投币20 ,api代码如下:
mutation { payTo(input: { amount: 20 currency: LIKE purpose: donation recipientId: VXNlcjo1MzIyNw targetId: QXJ0aWNsZToxNjEyOTk }) { redirectUrl transaction { fee amount id state purpose createdAt sender { displayName } recipient { displayName } } } }
这一步除了需要Authorization。Authorization就是添加1.1做登录验证的token值到header里面。
1.2.1 recipientId是作者的id,id号获取代码如下:
query { user (input: { userName: "sabaahprin" }) { id displayName userName likerId } }
id 和 liker id是两个玩意,别搞错了
1.2.2 targetId是要投币文章的id号:
获取文章id号代码如下:
query { article ( input: { mediaHash: "bafyreieqsapvitr7xwrir6vqnvnpnnopwfljtai6v7uqceyubzjtye5m6a" }) { id title summary author { id displayName } wordCount readTime } }
当然了也可以通过文章media hash获取文章id的同时获取作者id:
需要payto的参数(文章id、作者id,验证token)搞好后,就可以生成liker land付款链接:
完成这一步只是创建了transaction,如果不进入下一步——去like co付款转账,transaction的状态永远都是pending。
参数说明:
- 文章id、作者id、作者likerId都可以通过Matters API公开获取
- 用户登录邮箱,登录密码不是API可以随意获取,要保管好,不要泄露天机
- 登录身份验证后得到的token更不能随意泄露,Matters API需要验证身份时必备,比如在PayTo时没有token就不能进行下一步
2 用payto api生成的付款链接付款
通过payto api获得的给@雞毛的小事 雞毛的大事 (D-28)投币20的付款链接长这样:
https://like.co/in/widget/pay?to=sabaahprin&amount=20&via=matterspool&fee=0&state=e578d2eb-ca3f-40d7-897c-613b31920dde&redirect_uri=https%3A%2F%2Fserver.matters.news%2Fpay%2Flikecoin&blocking=true
该链接把所有参数都用上了。。。。。。
- to:付款人的likerId
- amount:投币金额
- via:传说中的agent。。。。。默认是matterspool
- fee:给matterspool的中介费,默认为0,很良心
- state:付款状态参数
- redirect_uri:返回matters页面,告知投币者投币结果(成功、还是失败)
- blocking:当付款在区块链上确认生成后,激活redirect_uri的Boolean参数
把参数齐备的付款链接在浏览器打开,付款完成后会页面自动刷新到matters,并告诉你投币成功,即transaction状态由pending转为success。
同时收到matters邮件,告诉你最近有投币行为:
当然了被投币对象的文章下面也会显示投币者头像,因为调用payto api时指定了文章id:
一对一的投币实验,被投币者当然会收到邮件提示。。。。
3 PayTo一对一多发送实验
社区活动完结时,不会只给一个人投钱嘛。。。。。。所以为了完成给一串人发钱,还需要继续实验,顺便看看操作是否顺畅(比点按钮到底方便了多少)。
顺延之前的实验,还是选择python notebook弄吧。。。。。。
3.1 获取投币对象
假如某活动搞完了,有两篇投稿,我先去搜集算奖金需要的数据,整理成以上表格。
……
然后开始算奖金……此处省略很多步……根据自己的算奖金规则该咋算咋算……
……
算完奖金,“活动参加者”1号——小鸡得了28 likecoin;“活动参加者”2号——小码的了30 likecoin。
到此为止,奖金算到人头上后开始发……
3.2 在notebook里面,API略有变化
之前1对1给雞毛的大事 (D-28)发奖时,在postman里面测试,加上token直接过了。到了python notebook,按照常规加header貌似不行。。。。。。
按照常规加token不是加在header里面嘛,结果到了notebook不行了,一直说我在以游客身份请求付款。。。。。。
刚开始我以为这是matters api cors(Cross-Origin Resource Sharing)造成的,查了半天也没解决问题。后来对比header异同,发现可能是cookie造成的。。。。。。
login api验证密码登陆后,得到的request header长这样:
一般的普通request返回header长这样:
于是就把登陆后获取的cookie放在payto api里面请求:
获取cookies代码长这样:
把header auth换成cookie后,终于不是游客了,返回付款链接给我:
3.3 解决了cookie和header的玄学后,就可以模拟发奖了。。。
把链接弄成可点击的:
然后点击url打开浏览器,去liker land付款:
在liker land需要再次确认一次身份。。。。。。
然后输密码付钱。。。。。。
签署付款完成后,我就被redirect回了matters。。。。。。与此同时我也收到了matters邮件提示,我给小鸡支持了28个币。。。。。。
完成此操作步骤后,再循环去给小码付款。。。。。。
以上就是目前思考出来的可以稍微简单一点的发奖金方法,其实原理还是1对1
本次实验只有2个人,当有100个人等待排队收款时,需要生成100个付款链接,然后挨个签署100次。。。。。。虽然需要签100次,但是双方都会收到邮件提示。。。。。。。
上一期试验完成后,我收到两笔来自liker land的神秘打款。可能我幸运地当了投币对象的第一人,所以收到了邮件提示。如果我没有在投币列表第一个,我就默默地被投了也不知道。。。。。。。
所以发收据(邮件提示)相当重要。。。。。。
以上办法虽然没有解决一次性签署一对多发钱问题,但是解决了手动输数字投币的问题——再也不用担心手滑输错奖金了。
然后就是,token要几个月才过期,慢慢发。。。。。。