MENU

我开源了一个Usdt支付中间件

April 4, 2022 • golang阅读设置

之前就有很多群友来咨询我,想让我给独角加上Usdt的支付方式。
开始我认为这个东西很小众,没有意义,毕竟我平时也不接触币圈的东西。

后面问得人多了,而且也看到网上有人开发出来此类交易技术做支付平台的,蛮有意思,去研究了一番~

其实就是同V免签一样的原理,通过监听钱包地址的区块交易信息来识别订单。最开始我还研究到智能合约去了,太过复杂o(╥﹏╥)o

本着用别人的不如我自己做一个的心态,开发出了Epusdt这个作品!

先来说一说实现原理吧~

原理

  • 我们理一下比较正常的支付逻辑,像支付宝:
  • 1.服务器创建预订单->2.服务器向支付宝服务器发起支付请求->3.支付宝记录服务器订单号->4.支付宝返回支付宝的支付号->5.服务器保存支付宝支付号,等待客户支付(此时我们和支付宝都有了对方的唯一订单标记)->6.客户支付成功->7.支付宝回调(会携带我们服务器生成的订单号)->8.服务器收到支付宝回调,通过订单号标记客户权益
  • 而虚拟币支付却没有订单号标记这个东西,也不存在支付成功后向你发起回调。(当然自己写智能合约的除外,但是针对每个币去上一套合约抛开难度和复杂度不说,这个方案直接pass)
  • 那么这种情况下我们如何去再不涉及开发智能合约的情况下实现一套支付逻辑呢?
  • 两个条件:
  • 金额细分区块公开,这里我们拿稳定币USDT举例!
  • 简单的原理:
  • 1.客户需要支付20.05usdt
  • 2.服务器有一个hash表存储钱包地址对应的待支付金额 例如:address_1 : 20.05
  • 3.发起支付的时候,我们可以判定钱包address_1的20.05金额是否被占用,如果没有被占用那么可以直接返回这个钱包地址和金额给客户,告知客户需按规定金额20.05准确支付,少一分都不行。且将钱包地址和金额 address_1:20.05锁起来,有效期10分钟。
  • 4.如果订单并发下,又有一个20.05元需要支付,但是在第3步的时候上一个客户已经锁定了该金额,还在等待支付中...,那么我们将待支付金额加上0.0001,再次尝试判断address_1:20.0501金额是否被占用?如果没有则重复第三步,如果还是被占用就继续累加尝试,直到加了100次后都失败
  • 5.新开一个线程去监听所有钱包的USDT入账事件,网上有公开的api或rpc节点。如果发现有入账金额与待支付的金额相等。则判断该笔订单支付成功!

流程图

usdt.jpg

项目的开源地址

https://github.com/assimon/epusdt

Archives QR Code
QR Code for this page
Tipping QR Code
Leave a Comment

4 Comments
  1. Light Light

    666

  2. bitbitpulse bitbitpulse

    你好,请问一下,自己的程序中集成epusdt,异步回调接口中拿不到请求参数可能是什么原因呢?

    上个评论被吞了。

    1. @bitbitpulse你接收参数的方式需要用application/json方式接收。或者请求被某些原因拦截了,例如cloudflare防火墙等。一步一步排查

    2. bitbitpulse bitbitpulse

      @ashang感谢。这个问题解决了,是因为我拿请求体数据的姿势不对。现在又有一个小问题,就是我在回调接口中处理完业务逻辑后,返回了 ok 给epusdt服务,但是它好像不生效,不管成功还是失败,回调接口每次都是被调用5次。