mirror of
https://github.com/GMWalletApp/epusdt.git
synced 2026-07-07 10:16:15 +00:00
update readme.md
This commit is contained in:
@@ -64,8 +64,6 @@ No matter what kind of platform you operate, Epusdt can fit into existing paymen
|
|||||||
| **Epay-Compatible Flow** | Works with platforms already using Epay-style payment interfaces |
|
| **Epay-Compatible Flow** | Works with platforms already using Epay-style payment interfaces |
|
||||||
| **More** | Simple HTTP API, often integrated within 10 minutes |
|
| **More** | Simple HTTP API, often integrated within 10 minutes |
|
||||||
|
|
||||||
See more integrations and plugins here: [plugins/](./plugins/)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Core Features
|
## Core Features
|
||||||
@@ -100,10 +98,7 @@ Quick-start links:
|
|||||||
|
|
||||||
```text
|
```text
|
||||||
Epusdt
|
Epusdt
|
||||||
├── plugins/ Integrated plugins and platform adapters
|
|
||||||
├── src/ Core project source code
|
├── src/ Core project source code
|
||||||
├── sdk/ Integration SDKs
|
|
||||||
├── sql/ Database install / upgrade scripts
|
|
||||||
└── wiki/ Documentation assets and knowledge base
|
└── wiki/ Documentation assets and knowledge base
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -25,5 +25,3 @@ Quick links:
|
|||||||
- [Official Docs](https://epusdt.com)
|
- [Official Docs](https://epusdt.com)
|
||||||
- [Telegram Channel](https://t.me/epusdt)
|
- [Telegram Channel](https://t.me/epusdt)
|
||||||
- [Telegram Group](https://t.me/epusdt_group)
|
- [Telegram Group](https://t.me/epusdt_group)
|
||||||
- [Plugins](./plugins/)
|
|
||||||
|
|
||||||
|
|||||||
@@ -64,8 +64,6 @@
|
|||||||
| **Epay 兼容** | 兼容各类支持 Epay 易支付接口的平台 |
|
| **Epay 兼容** | 兼容各类支持 Epay 易支付接口的平台 |
|
||||||
| **更多** | 简易 HTTP API,10 分钟内接入 |
|
| **更多** | 简易 HTTP API,10 分钟内接入 |
|
||||||
|
|
||||||
查看更多集成列表与插件:[plugins/](./plugins/)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 核心特性
|
## 核心特性
|
||||||
@@ -100,10 +98,7 @@
|
|||||||
|
|
||||||
```text
|
```text
|
||||||
Epusdt
|
Epusdt
|
||||||
├── plugins/ 已集成的系统插件(独角数卡等)
|
|
||||||
├── src/ 项目核心代码
|
├── src/ 项目核心代码
|
||||||
├── sdk/ 接入 SDK
|
|
||||||
├── sql/ 数据库安装 / 升级脚本
|
|
||||||
└── wiki/ 文档与知识库
|
└── wiki/ 文档与知识库
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -179,4 +174,3 @@ Good Morning Technology, LLC 为依据美国法律设立的主体,并将在适
|
|||||||
Epusdt · Easy Payment USDT · Open Source Payment Gateway · 多链收款
|
Epusdt · Easy Payment USDT · Open Source Payment Gateway · 多链收款
|
||||||
</sub>
|
</sub>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
## 使用方法
|
|
||||||
### 注意此插件仅适用于独角数卡2.0.4版本以下,2.0.4版本或以上的独角数卡已经内置此插件,无需配置
|
|
||||||
|
|
||||||
1.将`app`和`routes`目录覆盖到网站根目录。
|
|
||||||
2.在独角数卡后台添加一个支付方式。
|
|
||||||
|
|
||||||
| 支付选项 | 商户id | 商户key | 商户密钥 | 备注 |
|
|
||||||
| :-----| :----- | :----- | :----- |:-----|
|
|
||||||
| Epusdt | api接口认证token | 空 | epusdt收银台地址+/api/v1/order/create-transaction| 如果独角数卡和epusdt在同一服务器则填写`127.0.0.1`不要填域名,例如`http://127.0.0.1:8000/api/v1/order/create-transaction` |
|
|
||||||
|
|
||||||
示例:
|
|
||||||

|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* The file was created by Assimon.
|
|
||||||
*
|
|
||||||
* @author GMWalletApp<ashang@utf8.hk>
|
|
||||||
* @copyright GMWalletApp<ashang@utf8.hk>
|
|
||||||
* @link http://utf8.hk/
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace App\Http\Controllers\Pay;
|
|
||||||
|
|
||||||
|
|
||||||
use App\Exceptions\RuleValidationException;
|
|
||||||
use App\Http\Controllers\PayController;
|
|
||||||
use GuzzleHttp\Client;
|
|
||||||
use GuzzleHttp\Exception\GuzzleException;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
|
|
||||||
class EpusdtController extends PayController
|
|
||||||
{
|
|
||||||
public function gateway(string $payway, string $orderSN)
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
// 加载网关
|
|
||||||
$this->loadGateWay($orderSN, $payway);
|
|
||||||
//构造要请求的参数数组,无需改动
|
|
||||||
$parameter = [
|
|
||||||
"amount" => (float)$this->order->actual_price,//原价
|
|
||||||
"order_id" => $this->order->order_sn, //可以是用户ID,站内商户订单号,用户名
|
|
||||||
'redirect_url' => route('epusdt-return', ['order_id' => $this->order->order_sn]),
|
|
||||||
'notify_url' => url($this->payGateway->pay_handleroute . '/notify_url'),
|
|
||||||
];
|
|
||||||
$parameter['signature'] = $this->epusdtSign($parameter, $this->payGateway->merchant_id);
|
|
||||||
$client = new Client([
|
|
||||||
'headers' => [ 'Content-Type' => 'application/json' ]
|
|
||||||
]);
|
|
||||||
$response = $client->post($this->payGateway->merchant_pem, ['body' => json_encode($parameter)]);
|
|
||||||
$body = json_decode($response->getBody()->getContents(), true);
|
|
||||||
if (!isset($body['status_code']) || $body['status_code'] != 200) {
|
|
||||||
return $this->err(__('dujiaoka.prompt.abnormal_payment_channel') . $body['message']);
|
|
||||||
}
|
|
||||||
return redirect()->away($body['data']['payment_url']);
|
|
||||||
} catch (RuleValidationException $exception) {
|
|
||||||
} catch (GuzzleException $exception) {
|
|
||||||
return $this->err($exception->getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private function epusdtSign(array $parameter, string $signKey)
|
|
||||||
{
|
|
||||||
ksort($parameter);
|
|
||||||
reset($parameter); //内部指针指向数组中的第一个元素
|
|
||||||
$sign = '';
|
|
||||||
$urls = '';
|
|
||||||
foreach ($parameter as $key => $val) {
|
|
||||||
if ($val == '') continue;
|
|
||||||
if ($key != 'signature') {
|
|
||||||
if ($sign != '') {
|
|
||||||
$sign .= "&";
|
|
||||||
$urls .= "&";
|
|
||||||
}
|
|
||||||
$sign .= "$key=$val"; //拼接为url参数形式
|
|
||||||
$urls .= "$key=" . urlencode($val); //拼接为url参数形式
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$sign = md5($sign . $signKey);//密码追加进入开始MD5签名
|
|
||||||
return $sign;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function notifyUrl(Request $request)
|
|
||||||
{
|
|
||||||
$data = $request->all();
|
|
||||||
$order = $this->orderService->detailOrderSN($data['order_id']);
|
|
||||||
if (!$order) {
|
|
||||||
return 'fail';
|
|
||||||
}
|
|
||||||
$payGateway = $this->payService->detail($order->pay_id);
|
|
||||||
if (!$payGateway) {
|
|
||||||
return 'fail';
|
|
||||||
}
|
|
||||||
$signature = $this->epusdtSign($data, $payGateway->merchant_id);
|
|
||||||
if ($data['signature'] != $signature) { //不合法的数据
|
|
||||||
return 'fail'; //返回失败 继续补单
|
|
||||||
} else {
|
|
||||||
//合法的数据
|
|
||||||
//业务处理
|
|
||||||
$this->orderProcessService->completedOrder($data['order_id'], $data['amount'], $data['trade_id']);
|
|
||||||
return 'ok';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function returnUrl(Request $request)
|
|
||||||
{
|
|
||||||
$oid = $request->get('order_id');
|
|
||||||
// 异步通知还没到就跳转了,所以这里休眠2秒
|
|
||||||
sleep(2);
|
|
||||||
return redirect(url('detail-order-sn', ['orderSN' => $oid]));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* The file was created by Assimon.
|
|
||||||
*
|
|
||||||
* @author GMWalletApp<ashang@utf8.hk>
|
|
||||||
* @copyright GMWalletApp<ashang@utf8.hk>
|
|
||||||
* @link http://utf8.hk/
|
|
||||||
*/
|
|
||||||
use Illuminate\Support\Facades\Route;
|
|
||||||
|
|
||||||
Route::get('pay-gateway/{handle}/{payway}/{orderSN}', 'PayController@redirectGateway');
|
|
||||||
|
|
||||||
// 支付相关
|
|
||||||
Route::group(['prefix' => 'pay', 'namespace' => 'Pay', 'middleware' => ['dujiaoka.pay_gate_way']], function () {
|
|
||||||
// 支付宝
|
|
||||||
Route::get('alipay/{payway}/{orderSN}', 'AlipayController@gateway');
|
|
||||||
Route::post('alipay/notify_url', 'AlipayController@notifyUrl');
|
|
||||||
// 微信
|
|
||||||
Route::get('wepay/{payway}/{orderSN}', 'WepayController@gateway');
|
|
||||||
Route::post('wepay/notify_url', 'WepayController@notifyUrl');
|
|
||||||
// 码支付
|
|
||||||
Route::get('mapay/{payway}/{orderSN}', 'MapayController@gateway');
|
|
||||||
Route::post('mapay/notify_url', 'MapayController@notifyUrl');
|
|
||||||
// Paysapi
|
|
||||||
Route::get('paysapi/{payway}/{orderSN}', 'PaysapiController@gateway');
|
|
||||||
Route::post('paysapi/notify_url', 'PaysapiController@notifyUrl');
|
|
||||||
Route::get('paysapi/return_url', 'PaysapiController@returnUrl')->name('paysapi-return');
|
|
||||||
// payjs
|
|
||||||
Route::get('payjs/{payway}/{orderSN}', 'PayjsController@gateway');
|
|
||||||
Route::post('payjs/notify_url', 'PayjsController@notifyUrl');
|
|
||||||
// 易支付
|
|
||||||
Route::get('yipay/{payway}/{orderSN}', 'YipayController@gateway');
|
|
||||||
Route::get('yipay/notify_url', 'YipayController@notifyUrl');
|
|
||||||
Route::get('yipay/return_url', 'YipayController@returnUrl')->name('yipay-return');
|
|
||||||
// paypal
|
|
||||||
Route::get('paypal/{payway}/{orderSN}', 'PaypalPayController@gateway');
|
|
||||||
Route::get('paypal/return_url', 'PaypalPayController@returnUrl')->name('paypal-return');
|
|
||||||
Route::any('paypal/notify_url', 'PaypalPayController@notifyUrl');
|
|
||||||
// V免签
|
|
||||||
Route::get('vpay/{payway}/{orderSN}', 'VpayController@gateway');
|
|
||||||
Route::get('vpay/notify_url', 'VpayController@notifyUrl');
|
|
||||||
Route::get('vpay/return_url', 'VpayController@returnUrl')->name('vpay-return');
|
|
||||||
// stripe
|
|
||||||
Route::get('stripe/{payway}/{oid}','StripeController@gateway');
|
|
||||||
Route::get('stripe/return_url','StripeController@returnUrl');
|
|
||||||
Route::get('stripe/check','StripeController@check');
|
|
||||||
Route::get('stripe/charge','StripeController@charge');
|
|
||||||
// Coinbase
|
|
||||||
Route::get('coinbase/{payway}/{orderSN}', 'CoinbaseController@gateway');
|
|
||||||
Route::post('coinbase/notify_url', 'CoinbaseController@notifyUrl');
|
|
||||||
// epusdt
|
|
||||||
Route::get('epusdt/{payway}/{orderSN}', 'EpusdtController@gateway');
|
|
||||||
Route::post('epusdt/notify_url', 'EpusdtController@notifyUrl');
|
|
||||||
Route::get('epusdt/return_url', 'EpusdtController@returnUrl')->name('epusdt-return');
|
|
||||||
|
|
||||||
});
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
-- auto-generated definition
|
|
||||||
create table orders
|
|
||||||
(
|
|
||||||
id int auto_increment
|
|
||||||
primary key,
|
|
||||||
trade_id varchar(32) not null comment 'epusdt订单号',
|
|
||||||
order_id varchar(32) not null comment '客户交易id',
|
|
||||||
block_transaction_id varchar(128) null comment '区块唯一编号',
|
|
||||||
actual_amount decimal(19, 4) not null comment '订单实际需要支付的金额,保留4位小数',
|
|
||||||
amount decimal(19, 4) not null comment '订单金额,保留4位小数',
|
|
||||||
token varchar(50) not null comment '所属钱包地址',
|
|
||||||
status int default 1 not null comment '1:等待支付,2:支付成功,3:已过期',
|
|
||||||
notify_url varchar(128) not null comment '异步回调地址',
|
|
||||||
redirect_url varchar(128) null comment '同步回调地址',
|
|
||||||
callback_num int default 0 null comment '回调次数',
|
|
||||||
callback_confirm int default 2 null comment '回调是否已确认? 1是 2否',
|
|
||||||
created_at timestamp null,
|
|
||||||
updated_at timestamp null,
|
|
||||||
deleted_at timestamp null,
|
|
||||||
constraint orders_order_id_uindex
|
|
||||||
unique (order_id),
|
|
||||||
constraint orders_trade_id_uindex
|
|
||||||
unique (trade_id)
|
|
||||||
);
|
|
||||||
|
|
||||||
create index orders_block_transaction_id_index
|
|
||||||
on orders (block_transaction_id);
|
|
||||||
|
|
||||||
-- auto-generated definition
|
|
||||||
create table wallet_address
|
|
||||||
(
|
|
||||||
id int auto_increment
|
|
||||||
primary key,
|
|
||||||
token varchar(50) not null comment '钱包token',
|
|
||||||
status int default 1 not null comment '1:启用 2:禁用',
|
|
||||||
created_at timestamp null,
|
|
||||||
updated_at timestamp null,
|
|
||||||
deleted_at timestamp null
|
|
||||||
)
|
|
||||||
comment '钱包表';
|
|
||||||
|
|
||||||
create index wallet_address_token_index
|
|
||||||
on wallet_address (token);
|
|
||||||
|
|
||||||
+2
-59
@@ -12,65 +12,8 @@
|
|||||||
将提前解析好的收银台域名绑定。
|
将提前解析好的收银台域名绑定。
|
||||||

|

|
||||||
|
|
||||||
### 二、导入Sql
|
### 二、数据库说明
|
||||||
登录管理刚刚新增数据库,导入`Epusdt`所需的sql文件。
|
当前版本无需手动导入 SQL 文件。配置好数据库连接后,Epusdt 启动时会自动创建和升级所需表结构。
|
||||||
|
|
||||||
以下为示范0.01版本 最新数据库请以 https://github.com/GMWalletApp/epusdt/blob/master/sql/ 为准
|
|
||||||
|
|
||||||
#### 1.手动下载导入
|
|
||||||
|
|
||||||
数据库地址:https://github.com/GMWalletApp/epusdt/blob/master/sql/v0.0.1.sql
|
|
||||||

|
|
||||||
|
|
||||||
#### 2.使用phpMyAdmin导入
|
|
||||||
使用文本编辑器打开`.sql`文件,如下:
|
|
||||||
```sql
|
|
||||||
-- auto-generated definition
|
|
||||||
create table orders
|
|
||||||
(
|
|
||||||
id int auto_increment
|
|
||||||
primary key,
|
|
||||||
trade_id varchar(32) not null comment 'epusdt订单号',
|
|
||||||
order_id varchar(32) not null comment '客户交易id',
|
|
||||||
block_transaction_id varchar(128) null comment '区块唯一编号',
|
|
||||||
actual_amount decimal(19, 4) not null comment '订单实际需要支付的金额,保留4位小数',
|
|
||||||
amount decimal(19, 4) not null comment '订单金额,保留4位小数',
|
|
||||||
token varchar(50) not null comment '所属钱包地址',
|
|
||||||
status int default 1 not null comment '1:等待支付,2:支付成功,3:已过期',
|
|
||||||
notify_url varchar(128) not null comment '异步回调地址',
|
|
||||||
redirect_url varchar(128) null comment '同步回调地址',
|
|
||||||
callback_num int default 0 null comment '回调次数',
|
|
||||||
callback_confirm int default 2 null comment '回调是否已确认? 1是 2否',
|
|
||||||
created_at timestamp null,
|
|
||||||
updated_at timestamp null,
|
|
||||||
deleted_at timestamp null,
|
|
||||||
constraint orders_order_id_uindex
|
|
||||||
unique (order_id),
|
|
||||||
constraint orders_trade_id_uindex
|
|
||||||
unique (trade_id)
|
|
||||||
);
|
|
||||||
|
|
||||||
create index orders_block_transaction_id_index
|
|
||||||
on orders (block_transaction_id);
|
|
||||||
|
|
||||||
-- auto-generated definition
|
|
||||||
create table wallet_address
|
|
||||||
(
|
|
||||||
id int auto_increment
|
|
||||||
primary key,
|
|
||||||
token varchar(50) not null comment '钱包token',
|
|
||||||
status int default 1 not null comment '1:启用 2:禁用',
|
|
||||||
created_at timestamp null,
|
|
||||||
updated_at timestamp null,
|
|
||||||
deleted_at timestamp null
|
|
||||||
)
|
|
||||||
comment '钱包表';
|
|
||||||
|
|
||||||
create index wallet_address_token_index
|
|
||||||
on wallet_address (token);
|
|
||||||
```
|
|
||||||
复制-粘贴至`phpmyadmin`的SQL面板,然后执行
|
|
||||||

|
|
||||||
|
|
||||||
### 三、配置Epusdt
|
### 三、配置Epusdt
|
||||||
1.将编译好的`Epusdt`项目压缩包上传至刚刚新增的网站目录,随后解压。
|
1.将编译好的`Epusdt`项目压缩包上传至刚刚新增的网站目录,随后解压。
|
||||||
|
|||||||
+2
-56
@@ -12,59 +12,9 @@ wget https://github.com/GMWalletApp/epusdt/releases/download/v0.0.3/epusdt_0.0.3
|
|||||||
tar -xzf epusdt_0.0.3_Linux_x86_64.tar.gz
|
tar -xzf epusdt_0.0.3_Linux_x86_64.tar.gz
|
||||||
rm epusdt_0.0.3_Linux_x86_64.tar.gz
|
rm epusdt_0.0.3_Linux_x86_64.tar.gz
|
||||||
```
|
```
|
||||||
## 2.导入Sql
|
## 2.创建数据库
|
||||||
- 创建sql文件
|
当前版本无需手动导入 SQL 文件。创建数据库并配置连接后,Epusdt 启动时会自动创建和升级所需表结构。
|
||||||
```bash
|
|
||||||
nano epusdt.sql
|
|
||||||
```
|
|
||||||
然后复制下面的
|
|
||||||
```sql
|
|
||||||
-- auto-generated definition
|
|
||||||
use epusdt;
|
|
||||||
create table orders
|
|
||||||
(
|
|
||||||
id int auto_increment
|
|
||||||
primary key,
|
|
||||||
trade_id varchar(32) not null comment 'epusdt订单号',
|
|
||||||
order_id varchar(32) not null comment '客户交易id',
|
|
||||||
block_transaction_id varchar(128) null comment '区块唯一编号',
|
|
||||||
actual_amount decimal(19, 4) not null comment '订单实际需要支付的金额,保留4位小数',
|
|
||||||
amount decimal(19, 4) not null comment '订单金额,保留4位小数',
|
|
||||||
token varchar(50) not null comment '所属钱包地址',
|
|
||||||
status int default 1 not null comment '1:等待支付,2:支付成功,3:已过期',
|
|
||||||
notify_url varchar(128) not null comment '异步回调地址',
|
|
||||||
redirect_url varchar(128) null comment '同步回调地址',
|
|
||||||
callback_num int default 0 null comment '回调次数',
|
|
||||||
callback_confirm int default 2 null comment '回调是否已确认? 1是 2否',
|
|
||||||
created_at timestamp null,
|
|
||||||
updated_at timestamp null,
|
|
||||||
deleted_at timestamp null,
|
|
||||||
constraint orders_order_id_uindex
|
|
||||||
unique (order_id),
|
|
||||||
constraint orders_trade_id_uindex
|
|
||||||
unique (trade_id)
|
|
||||||
);
|
|
||||||
|
|
||||||
create index orders_block_transaction_id_index
|
|
||||||
on orders (block_transaction_id);
|
|
||||||
|
|
||||||
-- auto-generated definition
|
|
||||||
create table wallet_address
|
|
||||||
(
|
|
||||||
id int auto_increment
|
|
||||||
primary key,
|
|
||||||
token varchar(50) not null comment '钱包token',
|
|
||||||
status int default 1 not null comment '1:启用 2:禁用',
|
|
||||||
created_at timestamp null,
|
|
||||||
updated_at timestamp null,
|
|
||||||
deleted_at timestamp null
|
|
||||||
)
|
|
||||||
comment '钱包表';
|
|
||||||
|
|
||||||
create index wallet_address_token_index
|
|
||||||
on wallet_address (token);
|
|
||||||
```
|
|
||||||
`ctrl+x` 退出,按 `Y`保存 再按回车就好了
|
|
||||||
- 创建数据库
|
- 创建数据库
|
||||||
```bash
|
```bash
|
||||||
mysql
|
mysql
|
||||||
@@ -76,10 +26,6 @@ GRANT ALL ON [这里替换为数据库名].* TO '[这里替换为用户名]'@'lo
|
|||||||
FLUSH PRIVILEGES;
|
FLUSH PRIVILEGES;
|
||||||
EXIT
|
EXIT
|
||||||
```
|
```
|
||||||
- 导入sql文件
|
|
||||||
```bash
|
|
||||||
mysql -u[用户名] -p[密码] < epusdt.sql
|
|
||||||
```
|
|
||||||
## 3.配置反向代理
|
## 3.配置反向代理
|
||||||
```bash
|
```bash
|
||||||
nano /etc/nginx/sites-enabled/epusdt
|
nano /etc/nginx/sites-enabled/epusdt
|
||||||
|
|||||||
Reference in New Issue
Block a user