如何在您的应用程序中开始小额付款

上周,我花了很多钱开发了我的第一个公共程序-一个电报机器人,它充当比特币钱包,使您可以“向其他群聊成员投掷硬币”,还可以向自己或其他所谓的外部比特币付款 “闪电应用”。 我的意思是说,一般而言,读者熟悉比特币和电报,因为 我将尝试简短地写,而不必赘述。 该链接提供了有关比特币的多种资源 ,但是Telegram是用于移动设备和PC的即时消息工具,允许您在其平台上创建自己的小型应用程序(聊天机器人)。

该应用程序的主要功能是什么?


  • 允许您以真正的物质价值,而不只是“虚拟的”来感谢或奖励对话者,这将电子通信提升到一个全新的水平
  • 可以使用开放式支付协议与其他应用程序进行财务交互的应用程序的真实示例
  • 所有应用程序组件都是开源项目,可以修改它们并将其应用于您的任务。 尽管该应用程序适合电子商务的范围,但该应用程序并未使用封闭的和/或商业的解决方案,而今天很难称其为开放的。

以及如何将其应用于商业?


那样的东西...

图片

大概...

图片

这些数字是什么意思? 这些是比特币-中本聪的单位 。 按2019年中期的汇率计算,1000 Satoshi约为0.06美元。 Satoshi可以在线使用,也可以轻松兑换成本国货币。 出于这个原因(流动性),这不仅仅是另一个“进入数据库”“您可以在合作伙伴的商店中消费的积分”,而是真正的互联网资金
*我想马上指出,我故意不尝试用俄语写一些单词或短语-在某些情况下我可能不知道上下文翻译本身,或者我认为这样的翻译听起来比正确更令人困惑

如果没有比特币,可能会出现问题,如何使用这种应用程序。 可以很容易地在许多交易所或交换器之一中以少量购买它们,或者您可以从比特币朋友那里获得甚至从当前的bot用户那里获得硬币。 手机上的许多钱包都提供“不离开收银台”直接购买比特币的服务。

图片图片图片

当我们掌握了比特币(而是Satoshi(?))时-运行@atomic_tipbot并进行存款。

响应时,机器人会询问要向余额中添加多少satoshi,并发送一个付款帐户,该帐户可以通过扫描QR码或单击发票页面上的按钮( “在钱包中打开” )通过移动钱包进行付款。

图片图片图片

确认您钱包中的付款后,几乎立即将付款确认发送到机器人,并在帐户框架中直观显示。

在此之前,我们介绍了该应用程序的两个组件-后端电报机器人和加密货币支付处理系统(而不是其前端)。

为了创建Telegram机器人,我使用了Python Telegram Bot 。 当然,还有开源机器人本身。

作为用于处理付款和解决UX问题的系统,选择只能(实际上几乎没有选择)落在BTCPayServer上,该文档可从此链接获得

如果您寻找直接处理付款事件的解决方案,则应注意Electrum CLI手册页 ,即所谓的 链上支付,以及即时小额支付(Lightning)解决方案,例如Lightning-chargeSparko

那么它是自托管的吗?


是的,是的。 在我的应用程序中,我使用免费托管的BTCPayServer- BTCPayJungle ,但这是完全可能的,并且不需要太多时间来启动我自己的处理中心。 但是,值得记住的是,您将需要大约500GB的可用空间来存储比特币(和莱特币)区块链。 在同步期间,还需要计算和网络资源,并根据您的需要,为区块链提供必要的“包装”,以便与它们进行交互。 BTCPayServer不包含设计私钥或允许您控制钱包的任何其他信息。

对于链上(常规)付款,您需要添加所谓的 BTCPayServer中的xpub-wallet密钥,用于生成接收地址(公共密钥)。 这使得即使以“共享”形式使用BTCPayServer也是可能且安全的。 所有这些xpub密钥和地址都可以在像Electrum这样的优质钱包中轻松获得,以进行进一步的处理。

碰到比特币的每个人都听说比特币运行缓慢且交易昂贵,尤其是在炒作时,因此对于即时小额支付,您应该使用(链外)闪电网络交易。

这是什么闪电网络?


这是一个比特币插件,可以构建额外的抽象层,并允许您在比特币网络上进行即时和几乎免费的交易。 这一切都归功于具有多重签名的密码魔术,通常被称为智能合约 。 闪电网络协议有几种实现,我在C语言中使用c-lightning实现。

链上和链下(闪电)付款之间的主要区别在于它们的存储方式。 所有链上交易都会中继到所有网络节点,直到一个比特币节点宣布其中包含交易的新开采区块 。 ( 中心上还有BitFury ;它们只是生产用于采矿的铁)。 因此,我们将此类交易称为“ 链上交易 。 此类交易将记录在公共区块链中,并存储在其中,直到其存续。 此类交易也属于公共领域,可以进行监视,跟踪和分析。

对于链下 (闪电)交易,一切发生的方式都不同。 闪电网络的每个节点都有一个(或多个)链上地址-这些是一切开始的常用比特币地址。 当比特币出现在这样的地址时,可以打开所谓的。 通往另一个节点的闪电通道 ,这意味着在加密技术的帮助下,这两个节点就它们之间的资金可用性达成了共识。 以后,所有通过这种通道的交易(它们自己的交易和外来节点的交易)都只存储在交易参与者的节点(和中间节点)上。 记录在区块链上的唯一交易是有关打开或关闭渠道的交易。 在更全面的范围内,我们得到了这样一个相互连接的节点网络,该网络在参与者之间建立了数千种不同的方式,用于根据某些严格的规则将资金从一个节点“转移”到另一个节点。 几乎所有此类事务都仅存储在节点本身的数据库文件中。 出于这个原因,我们称它们为脱链

该图显示了所有应用程序组件的可视化


图片

简而言之:

1)用户向Telegram中的机器人发送命令

2)Telegram将python事件消息发送到bot 应用程序

3) python应用程序BTCPayServer发送请求

4)BTCPayServer生成传入的BTC和LTC地址,并将发票请求发送到lightning-charge ,后者又与c-lighting守护程序通信。 在输出中,我们获得了漂亮的HTML形式的付款处理

5)用户支付发票并看到确认

6) BTCPayServer发票付款通知 (IPN)发送到指定的callback_url,在我们的示例中为callbacks.py (另一个用于接收通知的python应用程序)

7)根据收到的数据,用户余额发生变化

...如果用户想提取资金(他从他人那里收到的硬币)...

8)机器人的Python应用程序正在等待QR代码的文本或图像,并且当接收到有效数据时,将执行paylightning.py *实用程序付款,该实用程序将使用c-lightning RPC初始化交易。

图片

*公平地说,值得注意的是,我的paylightning.py包装程序还没有完全完成,并且在特定情况下可以返回假阴性。 我建议在接近生产的情况下使用调试良好的包装器

我们有什么? 我们漫游器的用户可以进行群聊,也可以直接进行无限制的实质性转移。 而且还不止如此-多亏了Lightning Network协议,从某种意义上说,该协议是一个统一且简化的支付网络,可以将聊天中收到的相同金额的钱发送给完全第三方的应用程序。 例如,Telegram已经拥有第一个用于比特币支付的机器人-@lntxbot。 “一个平衡”功能使您可以根据特定群组聊天的喜好使用任何一种漫游器(是的,问题是完全人为的,解决方案是毫无用处的,但本质上是关键)。 将余额从一个机器人转移到另一个机器人无需花费任何时间,而且只需几秒钟! 重要的是要注意,这些机器人的创造者甚至从未相互联系。

图片图片

只需将存款请求消息从@lntxbot转发到@atomic_tipbot就可以了!

这不仅是“将数字传输到数据库”,而且是两个不同的,不相关的数据库之间的付款。 因此,已经有几个“ LApps”集成到了机器人中,其中包括sat2.iolnsms.world

LApp集成是什么意思

每个Lightning Network节点本质上都是一个比特币钱包。 她有两个平衡点:链上和链外。 链上余额对于开设新渠道和从封闭渠道存储资金是必要的。 但是链外平衡只是节点之间的平衡。 节点的主要要求是接收和发送付款,因此每个节点(作为软件)都具有付款发票功能。 我将演示这种情况:

user@ln-node:/ % lightning-cli invoice 1000000000 internal_description external_description { "payment_hash" : "64c0c8f5f8f708b08487ad1376f3d256f92ccb9606987ba395c2b4193efde5a0", "expires_at" : 1558709834, "bolt11" : "lnbc10m1pwdaj72pp5vnqv3a0c7uytppy845fhdu7j2mujejukq6v8hgu4c26pj0hauksqdpqv4u8getjdeskchmyv4ekxunfwp6xjmmwxqyjw5qcqp2rzjqw3qcrp2u3ggke56wrjlstcg76drmfw680cvjum88sl7ja7mpas7xzxz8sqqfecqqyqqqqlgqqqqqqgqjqn8e3ml733dkms2txxldnuwsllwhhkldss73268hdka3e7f083vjhjqurwqrndqd2rcd85pw7vkywnr4dq7yfd59r0g2mw4wzztwr6dcprxzej6" } 

在这种情况下,我们获得了BOLT11规范的“发票”,这是比特币网络上的付款格式(顺便说一下,还有莱特币)。 这是包含有关收款人,交易金额,请求到期时间等信息的行,可以通过对该行运行decodepay获得详细信息:

 user@ln-node:/ % lightning-cli decodepay lnbc10m1pwdaj72pp5vnqv3a0c7uytppy845fhdu7j2mujejukq6v8hgu4c26pj0hauksqdpqv4u8getjdeskchmyv4ekxunfwp6xjmmwxqyjw5qcqp2rzjqw3qcrp2u3ggke56wrjlstcg76drmfw680cvjum88sl7ja7mpas7xzxz8sqqfecqqyqqqqlgqqqqqqgqjqn8e3ml733dkms2txxldnuwsllwhhkldss73268hdka3e7f083vjhjqurwqrndqd2rcd85pw7vkywnr4dq7yfd59r0g2mw4wzztwr6dcprxzej6 { "currency" : "bc", "created_at" : 1558105034, "expiry" : 604800, "payee" : "025a14b8ed40583d67aec92da19453e0b2d1fbbf75f96f85d3dd0ff61a51ee0490", "msatoshi" : 1000000000, "amount_msat" : "1000000000msat", "description" : "external_description", "min_final_cltv_expiry" : 10, "routes" : [ [ { "pubkey" : "03a20c0c2ae4508b669a70e5f82f08f69a3da5da3bf0c973673c3fe977db0f61e3", "short_channel_id" : "574012x1255x1", "fee_base_msat" : 1000, "fee_proportional_millionths" : 1, "cltv_expiry_delta" : 144 } ] ], "payment_hash" : "64c0c8f5f8f708b08487ad1376f3d256f92ccb9606987ba395c2b4193efde5a0", "signature" : "304502210099f31dffd18b6db8296637db3e3a1ffbaf7b7db087a2ad1eedb7639f25e78b25022079038370073681aa1e1a7a05de6588e98ead078896d0a37a15b755c212dc3d37" } 闪电-CLI decodepay lnbc10m1pwdaj72pp5vnqv3a0c7uytppy845fhdu7j2mujejukq6v8hgu4c26pj0hauksqdpqv4u8getjdeskchmyv4ekxunfwp6xjmmwxqyjw5qcqp2rzjqw3qcrp2u3ggke56wrjlstcg76drmfw680cvjum88sl7ja7mpas7xzxz8sqqfecqqyqqqqlgqqqqqqgqjqn8e3ml733dkms2txxldnuwsllwhhkldss73268hdka3e7f083vjhjqurwqrndqd2rcd85pw7vkywnr4dq7yfd59r0g2mw4wzztwr6dcprxzej6 user@ln-node:/ % lightning-cli decodepay lnbc10m1pwdaj72pp5vnqv3a0c7uytppy845fhdu7j2mujejukq6v8hgu4c26pj0hauksqdpqv4u8getjdeskchmyv4ekxunfwp6xjmmwxqyjw5qcqp2rzjqw3qcrp2u3ggke56wrjlstcg76drmfw680cvjum88sl7ja7mpas7xzxz8sqqfecqqyqqqqlgqqqqqqgqjqn8e3ml733dkms2txxldnuwsllwhhkldss73268hdka3e7f083vjhjqurwqrndqd2rcd85pw7vkywnr4dq7yfd59r0g2mw4wzztwr6dcprxzej6 { "currency" : "bc", "created_at" : 1558105034, "expiry" : 604800, "payee" : "025a14b8ed40583d67aec92da19453e0b2d1fbbf75f96f85d3dd0ff61a51ee0490", "msatoshi" : 1000000000, "amount_msat" : "1000000000msat", "description" : "external_description", "min_final_cltv_expiry" : 10, "routes" : [ [ { "pubkey" : "03a20c0c2ae4508b669a70e5f82f08f69a3da5da3bf0c973673c3fe977db0f61e3", "short_channel_id" : "574012x1255x1", "fee_base_msat" : 1000, "fee_proportional_millionths" : 1, "cltv_expiry_delta" : 144 } ] ], "payment_hash" : "64c0c8f5f8f708b08487ad1376f3d256f92ccb9606987ba395c2b4193efde5a0", "signature" : "304502210099f31dffd18b6db8296637db3e3a1ffbaf7b7db087a2ad1eedb7639f25e78b25022079038370073681aa1e1a7a05de6588e98ead078896d0a37a15b755c212dc3d37" } 

但是,要为这种“发票”付款,我们需要使用c-lightning的付款功能:

 user@ln-node:/ % lightning-cli pay lnbc2u1pwdana3pp5c0nyfgq974hr8huflt9uutyalj4maaw3q5594xp89jkvw74jme3sdql2pshjgr5dus8q6r0dejjqampd3kx2aqcqzpgwjgn45gy80jwjhgm3tpsxg33j6h6pehdus0mnjerrad943cz3vs83g30lyhlhfjxtqvtl76vttkuhs5jekuxpsqmf98l8265pwmm76gp4e7z6j { "id" : 163, "payment_hash" : "c3e644a005f56e33df89facbce2c9dfcabbef5d105285a98272cacc77ab2de63", "destination" : "03021c5f5f57322740e4ee6936452add19dc7ea7ccf90635f95119ab82a62ae268", "msatoshi" : 200000, "amount_msat" : "200000msat", "msatoshi_sent" : 200003, "amount_sent_msat" : "200003msat", "created_at" : 1558106072, "status" : "complete", "payment_preimage" : "1a9552b9f4e9199e26839353f870b12cc85b7674a2fb134e78aa370032611019", "bolt11" : "lnbc2u1pwdana3pp5c0nyfgq974hr8huflt9uutyalj4maaw3q5594xp89jkvw74jme3sdql2pshjgr5dus8q6r0dejjqampd3kx2aqcqzpgwjgn45gy80jwjhgm3tpsxg33j6h6pehdus0mnjerrad943cz3vs83g30lyhlhfjxtqvtl76vttkuhs5jekuxpsqmf98l8265pwmm76gp4e7z6j" } 闪电CLI工资lnbc2u1pwdana3pp5c0nyfgq974hr8huflt9uutyalj4maaw3q5594xp89jkvw74jme3sdql2pshjgr5dus8q6r0dejjqampd3kx2aqcqzpgwjgn45gy80jwjhgm3tpsxg33j6h6pehdus0mnjerrad943cz3vs83g30lyhlhfjxtqvtl76vttkuhs5jekuxpsqmf98l8265pwmm76gp4e7z6j user@ln-node:/ % lightning-cli pay lnbc2u1pwdana3pp5c0nyfgq974hr8huflt9uutyalj4maaw3q5594xp89jkvw74jme3sdql2pshjgr5dus8q6r0dejjqampd3kx2aqcqzpgwjgn45gy80jwjhgm3tpsxg33j6h6pehdus0mnjerrad943cz3vs83g30lyhlhfjxtqvtl76vttkuhs5jekuxpsqmf98l8265pwmm76gp4e7z6j { "id" : 163, "payment_hash" : "c3e644a005f56e33df89facbce2c9dfcabbef5d105285a98272cacc77ab2de63", "destination" : "03021c5f5f57322740e4ee6936452add19dc7ea7ccf90635f95119ab82a62ae268", "msatoshi" : 200000, "amount_msat" : "200000msat", "msatoshi_sent" : 200003, "amount_sent_msat" : "200003msat", "created_at" : 1558106072, "status" : "complete", "payment_preimage" : "1a9552b9f4e9199e26839353f870b12cc85b7674a2fb134e78aa370032611019", "bolt11" : "lnbc2u1pwdana3pp5c0nyfgq974hr8huflt9uutyalj4maaw3q5594xp89jkvw74jme3sdql2pshjgr5dus8q6r0dejjqampd3kx2aqcqzpgwjgn45gy80jwjhgm3tpsxg33j6h6pehdus0mnjerrad943cz3vs83g30lyhlhfjxtqvtl76vttkuhs5jekuxpsqmf98l8265pwmm76gp4e7z6j" } 

所有事务状态都由整个网络(尤其是您自己的节点)处理。 无需(但有这样的机会)与收款人应用程序的作者或其任何API进行交互,以获得有关付款状态的信息。 无需在中间处理系统中检查付款状态。 无需指望银行或政府机构批准您的交易。 最后,没有任何退款或其他外部因素会影响您帐户的余额。 这是一种通过Internet转移价值的解决方案,无需外部仲裁者来决定交易是否符合规则(有时甚至是内部规则,并非所有参与者都事先得到通知)。 比特币中没有“内部规则”。 您需要遵循的唯一规则是网络规则-开放且众所周知。

这使人或程序之间的直接几乎免费的 即时交易成为现实。

如果您有机会从第三方应用程序接收付款数据,则可以与此应用程序进行财务交互。 例如,考虑lnsms.world服务,该服务允许您通过用比特币付款将SMS消息发送到任意号码。 要集成此应用程序,我们只需要将数据从Web表单直接传输到SMS发送脚本-模拟网站上的用户操作:

 payload = { 'number': phone_number, 'text': text, 'force_unicode': 0 } send_req = requests.post('https://lnsms.world/invoice', data=payload) if send_req.status_code == 201: plain_invoice = str(send_req.text) 

我不知道是什么原因,但是lnsms会以201 HTTP状态代码进行响应,并返回BOLT11格式的发票。 好吧,对于机器人用户来说,这足以支付他们在聊天室中收到的余额中发送短信的费用。 用户甚至不知道那里发生了什么,他只花了几美分就发送了短信。 而且,作为开发人员,我不讨论SMS服务的工作细节。 刚转帐付款并收到服务。 您可以在顶部进行标记,但是您不能这样做-这是我的自由选择。 没有帐户,协议或其他API来完成琐碎的任务,例如发送SMS。

现在,让我们暂时想象一下,我们的应用程序比聊天机器人更有用,并且不向另一个机器人付款,而是向连接到Internet的另一个应用程序或设备付款。 或是在设备,服务,商店或某种服务提供商之间每秒数十甚至数百次微不足道的付款。 这就是小额支付的力量,因此物联网应该看起来像。 我认为,像Althea这样的项目已经将这些想法付诸实践,在不久的将来,我们将看到现在称为电子商务的领域发生巨大变化。

如果您喜欢这篇文章,并且想尝试使用比特币, 请给我啤酒和柔软的法国面包

Source: https://habr.com/ru/post/zh-CN452696/


All Articles