如何在您的应用中进行小额付款

本周,我花了我的第一个基于Telegram聊天机器人的公共宠物应用程序的编码,该机器人充当了比特币钱包,并允许在Telegram用户和其他所谓的“ Lightning Apps”之间发送和接收提示。 我认为您通常对比特币和电报很熟悉,我会尽量简短而又不深入地介绍细节。 关于比特币的更多资源可以在这里找到 ,Telegram只是一个即时通讯工具,使您可以使用其平台创建自定义应用程序(聊天机器人)。


这种应用程序的重点是什么?


  • 允许给其他用户的想法和答案打分,而不是实际价值
    “虚拟喜欢”。 这使在线对话达到了一个全新的水平
  • 可以与其他实体合作的小额支付应用程序的实际示例
    通过互联网使用开放协议
  • 所有模块都是开源项目,可以轻松重用和调整
    为您自己的项目。 应用程序不会中继第三方商业服务。
    该应用程序甚至属于电子商务领域(目前几乎已关闭)
    基于开放式解决方案。

用例是什么?


像这样的东西...

图片

或那样
图片

数字是什么意思? 这些是比特币单位-satoshis 。 至于2019年中期,1000 satoshis的价值为$ 0.06。 您可以在线使用它,也可以使用许多可用服务将其兑换成当地货币。 因此,这不仅是另一个“数据库中的号码”“您可以在我们的合作伙伴商店中使用的优惠券” ,而且是一笔真正的互联网资金


如果您在应用程序中没有要使用的比特币,您可能会问该怎么办。 您只需从现有应用程序用户处获得小费,或者在各种交易所或手机或PC上的比特币钱包中购买少量的比特币。


图片图片图片


收到比特币后,您可以启动@atomic_tipbot并进行存款。


您会看到一张发票​​,您可以选择首选的付款方式并仅扫描QR码或按发票上的按钮( “在钱包中打开” )就可以汇款。


图片图片图片


在您的手机钱包中确认付款,您几乎会立即在Telegram中看到一个确认屏幕。


到目前为止,我们接触了应用程序的两个独立部分:电报bot后端和付款处理系统(实际上更像是前端)。


为了创建这个Telegram机器人,我使用了Python Telegram Bot 。 当然,该机器人是开源的


作为生成发票,检查状态,发送通知和处理UX的付款处理系统,使用了BTCPayServer可以在此处找到相关文档


如果您正在查看如何直接处理付款事件,则可以查看Electrum CLI手册页上的链上付款,并查看链下(Lightning)付款(如Lightning-chargeSparko )的解决方案。


您说“没有第三方”和“没有云服务”!


是的,是的。 在我的应用程序中,我正在使用BTCPayServer实例的免费共享托管-BTCPayJungle ,但是甚至可以在自己的专用服务器上启动。 只需记住您当时需要大约500GB的空间来存储比特币和Litecoin区块链。 BTCPayServer不持有任何可能使黑客控制您钱包中资金的私钥或敏感信息。 对于链上(标准)付款,您需要提供从钱包到BTCPayServer的xpub密钥,以便它能够生成公共地址。 这样,BTCPay体系结构甚至可以在共享环境上以不信任的方式处理付款。 如果使用经过验证的钱包(例如Electrum) ,则配置非常简单。


什么是闪电网络?


这就像是比特币的附件,它增加了额外的抽象层,并允许进行即时和几乎免费的比特币交易。 所有这些东西都可以归功于密码多重签名魔术,这通常被称为智能合约 。 LN协议有多种实现。 我正在使用c-lightning C实现。


链上和链外(闪电)付款之间的主要区别在于交易的存储方式。 所有链上交易都会广播到整个网络,因此,如果将挖掘包含该交易的区块,则每个运行中的比特币节点会将该交易记录到区块链中。 嘿, BitFury ,对吗? ;)这就是为什么我们称此类交易为链上交易的原因。 此类交易将存储在区块链中,直到其存亡。 可以通过网络公开跟踪,分析和监视任何此类交易。


下交易(闪电)的情况下,事情会以其他方式发生。 每个闪电节点都有(可能很多)链上地址,所有地址都从此开始。 当在这样的地址上收到资金时,使用加密技术的节点可以打开通往另一个节点的所谓的闪电通道 ,这意味着这两个节点就它们之间的资金可用性达成了协议。 后来,所有通过通道进行的事务(自己的事务,或者可能是来自另一个节点的路由事务)都仅存储在这两个节点上(如果存在,则存储在中间节点上)。 存储在网络区块链中的唯一交易是渠道开放和关闭交易。 这就是为什么我们将闪电交易称为脱链交易的原因。 通常,它们仅存在于节点数据库文件中。


整个图都可视化


图片

短篇小说:


1)用户发送消息并要求在电报上向机器人存入资金


2)Telegram触发bot的python应用


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


4)BTCPayServer生成BTC和LTC的传入地址,并与lightning-charge联系 ,后者从c-lightning守护程序获取数据。 结果,我们得到了处理良好的HTML框架用于付款处理


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


6) BTCPayServer发票 付款通知 (IPN)发送到指定的回调URL,在本例中为
将转到callbacks.py (另一个用于监听回调的python应用)


7)根据完整的付款明细,更改用户余额并获得通知


...如果用户决定提取资金(收到的小费)...


8) Bot的python应用程序侦听QR的文本或图像,当它获取发票数据(长字符串)时,它向另一个python应用程序paylightning.py *发送付款请求,该应用程序使用c-lightning初始化付款RPC


图片

*公平地说,我需要提到我的付款包装人paylightning.py不完整,在某些特定情况下可能返回假阴性。 如果用于生产用途,则应使用经过良好测试的付款包装纸进行c-lightning


用户可以在群聊中相互发送提示,并可以不受限制地发送/接收 。 但这还不是全部。 借助Lightning Network协议(在某种统一和简化的支付网络中),您可以将相同的余额硬币发送到完全不同的应用程序。 电报上还有另一个比特币小费机器人-@lntxbot。 用户可以向该机器人请求存款


图片图片


只需将数据从@lntxbot转发到@atomic_tipbot即可!


这不再是“数据库中的号码交换”,而是两个独立的,不相关的“数据库”之间的付款。 Bot已经集成了很少的“ LApps”: sat2.iolnsms.world


您可能会问, LApp集成到底意味着什么?


每个闪电网络节点都充当比特币钱包。 它具有链上和链下的平衡。 在短节点维护任务中,链上余额通常用于打开渠道并从关闭的渠道存储资金。 链外余额恰好用于在节点之间交换资金。 每个节点的核心功能是发送或接收资金的能力,因此节点作为一种软件提供付款发票方式。 我将简短说明它是如何发生的:


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

在这种情况下,将生成BOLT11发票 ,这是针对比特币(以及Litecoin)网络中的付款请求的统一格式。 此字符串包括有关发票收件人,金额,时间戳,到期时间等的数据。 要解码此字符串,c-lightning提供了definepay方法:


 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是一个网络应用程序,可让您将短信发送至任意数量并用比特币付款。 要将此类选项集成到我们的应用中,我们只需要将所需数据从Web表单传递到lnsms.world:


 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发票。 好了,足够支付这张发票,我们的用户将在收到付款后不久发送短信。 我们可以免费收取一些费用,这是我们的免费选择。


现在,想象一下,您的机器人实际上是一个更有用的应用程序,并且无需支付给另一个机器人,而要支付连接到Internet的其他实体。 或者,这些可能是软件,机器,商店,服务提供商之间的付款,每隔几秒钟定期重复一次? 您觉得小额付款的力量吗? 这就是物联网的样子。 现在已经有了https://althea.org/这样的项目,并且在不久的将来,我们将在所谓的电子商务领域面临巨大的变化。


如果您喜欢这篇文章,并且自己尝试使用比特币付款,可以在我的小费页面上给我一些小费

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


All Articles