Commit f767583d by haojie

转账和退款

parent c355b1b8
<?php
namespace App\Admin\Controllers;
use App\Admin\Repositories\TransferRecord;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
class TransferRecordController extends AdminController
{
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new TransferRecord(), function (Grid $grid) {
$grid->column('id')->sortable();
$grid->column('to');
$grid->column('price');
$grid->column('hash');
$grid->column('status');
$grid->column('blind_box_id');
$grid->column('created_at');
$grid->column('updated_at')->sortable();
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('id');
});
});
}
/**
* Make a show builder.
*
* @param mixed $id
*
* @return Show
*/
protected function detail($id)
{
return Show::make($id, new TransferRecord(), function (Show $show) {
$show->field('id');
$show->field('to');
$show->field('price');
$show->field('hash');
$show->field('status');
$show->field('blind_box_id');
$show->field('created_at');
$show->field('updated_at');
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Form::make(new TransferRecord(), function (Form $form) {
$form->display('id');
$form->text('to');
$form->text('price');
$form->text('hash');
$form->text('status');
$form->text('blind_box_id');
$form->display('created_at');
$form->display('updated_at');
});
}
}
<?php
namespace App\Admin\Repositories;
use App\Models\TransferRecord as Model;
use Dcat\Admin\Repositories\EloquentRepository;
class TransferRecord extends EloquentRepository
{
/**
* Model.
*
* @var string
*/
protected $eloquentClass = Model::class;
}
...@@ -23,31 +23,36 @@ class BlindBoxController ...@@ -23,31 +23,36 @@ class BlindBoxController
*/ */
public function getProgressBoxList() public function getProgressBoxList()
{ {
$list = BlindBoxList::query()->where('status', '!=', 3)->get($this->Parameter); $list = BlindBoxList::query()->where('status', '!=', 3)->get($this->Parameter) ?? [];
# 计算购买倒计时 if ($list && count($list)) {
foreach ($list as $item) { # 计算购买倒计时
# 获取当前时间 foreach ($list as $item) {
$cur_time = ToTimestamp('now'); # 获取当前时间
$end_time = ToTimestamp($item->end_time); $cur_time = ToTimestamp('now');
# 购买倒计时 $end_time = ToTimestamp($item->end_time);
$countdown = $end_time - $cur_time; # 购买倒计时
# 购买人数list $countdown = $end_time - $cur_time;
$purchased = json_decode($item->purchased); # 购买人数list
$buy_num = 0; $purchased = json_decode($item->purchased);
if ($purchased && count($purchased)) { $buy_num = 0;
$buy_num = count($purchased); if ($purchased && count($purchased)) {
} $buy_num = count($purchased);
# 删除原始购买人数字段 }
unset($item->purchased); # 删除原始购买人数字段
# 修改购买人数展示形式 unset($item->purchased);
$item->buy_num = $buy_num; # 修改购买人数展示形式
if ($countdown > 0) { $item->buy_num = $buy_num;
$item->countdown = $countdown * 1000; if ($countdown > 0) {
} else { $item->countdown = $countdown * 1000;
$item->countdown = 0; } else {
$item->countdown = 0;
}
} }
return $list;
} else {
return [];
} }
return $list;
} }
/** /**
......
...@@ -105,6 +105,7 @@ public function CheckCallback($hash, $status) ...@@ -105,6 +105,7 @@ public function CheckCallback($hash, $status)
array_push($list, $obj); array_push($list, $obj);
BlindBoxList::query()->where('id', $item->blind_box_id)->update(['purchased' => json_encode($list)]); BlindBoxList::query()->where('id', $item->blind_box_id)->update(['purchased' => json_encode($list)]);
} }
#
} }
return ''; return '';
} }
......
...@@ -3,7 +3,9 @@ ...@@ -3,7 +3,9 @@
namespace App\Http\Controllers\API\BlindBox; namespace App\Http\Controllers\API\BlindBox;
use App\Http\Controllers\API\Redis\CheckArrivalCl;
use App\Models\BlindBoxList; use App\Models\BlindBoxList;
use App\Models\UserWallet;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
class OpenPrizeController class OpenPrizeController
...@@ -17,6 +19,8 @@ public function useOpenPrize($item) ...@@ -17,6 +19,8 @@ public function useOpenPrize($item)
$purchased = json_decode($item->purchased); $purchased = json_decode($item->purchased);
# 可中奖人数 # 可中奖人数
$winner_num = $item->winner_num; $winner_num = $item->winner_num;
# 获取盲盒价格
$price = BlindBoxList::find($item->id);
if ($purchased && count($purchased) && count($purchased) >= $item->min_participants_num) { if ($purchased && count($purchased) && count($purchased) >= $item->min_participants_num) {
# 计算购买者应有的中奖几率 # 计算购买者应有的中奖几率
#平均值 #平均值
...@@ -82,6 +86,19 @@ public function useOpenPrize($item) ...@@ -82,6 +86,19 @@ public function useOpenPrize($item)
# 更新数据 # 更新数据
BlindBoxList::query()->where('id', $item->id)->update(['winner_list' => json_encode($winner_list), BlindBoxList::query()->where('id', $item->id)->update(['winner_list' => json_encode($winner_list),
'purchased' => json_encode($purchased)]); 'purchased' => json_encode($purchased)]);
# 开奖完成--先更新订单状态
foreach ($winner_list as $winner) {
UserWallet::query()->where('blind_box_id', $item->id)->where('user_address', $winner)
->update(['winner_status' => 1]);
# 中奖转账
app(CheckArrivalCl::class)->WinnerTransfer($winner, $item->id, ($price->price * 3), 1);
}
} else if ($purchased && count($purchased) && count($purchased) < $item->min_participants_num) {
# 不能开奖的盲盒--退款
foreach ($purchased as $pur_item) {
app(CheckArrivalCl::class)->WinnerTransfer($pur_item->address, $item->id, $price->price, 2);
}
} }
} }
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
namespace App\Http\Controllers\API; namespace App\Http\Controllers\API;
use App\Http\Controllers\API\Redis\CheckArrivalCl;
use App\Http\Controllers\API\Test\TestController;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\API\BlindBox\BlindBoxController; use App\Http\Controllers\API\BlindBox\BlindBoxController;
...@@ -169,4 +171,29 @@ public function useCheckCallback(Request $request) ...@@ -169,4 +171,29 @@ public function useCheckCallback(Request $request)
$result = app(BuyBlindBoxController::class)->CheckCallback($hash, $status); $result = app(BuyBlindBoxController::class)->CheckCallback($hash, $status);
return $this->success('success', $result); return $this->success('success', $result);
} }
/**
* nodejs - 转账回调
*/
public function useNodeJsTransfer(Request $request)
{
$data = $request->input();
if (empty($data['to']) || empty($data['hash']) || empty($data['status'])
|| empty($data['amount']) || empty($data['box_id']) || empty($data['type'])) {
return $this->success('success', 'false');
}
$result = app(CheckArrivalCl::class)->TransferCallback($data);
return $this->success('success', $result);
}
/**
* 测试
*/
public function useMyTest(Request $request)
{
$result = app(TestController::class)->useTest();
return $this->success('success', $result);
}
} }
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
namespace App\Http\Controllers\API\Redis; namespace App\Http\Controllers\API\Redis;
use App\Models\SetAddress;
use App\Models\TransferRecord;
use App\Models\UserWallet; use App\Models\UserWallet;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis; use Illuminate\Support\Facades\Redis;
...@@ -46,4 +48,54 @@ public function IntervalCheck($hash, $price, $address, $to) ...@@ -46,4 +48,54 @@ public function IntervalCheck($hash, $price, $address, $to)
Redis::rpush('pay_notify', json_encode($obj)); Redis::rpush('pay_notify', json_encode($obj));
return false; return false;
} }
/**
* 中奖转账--只能发起一次
*/
public function WinnerTransfer($to, $box_id, $amount, $type)
{
if (empty($to) || empty($box_id) || empty($amount) || empty($type)) {
Log::info('缺少转账信息');
return false;
}
# 不能重复
$transter = TransferRecord::query()->where('blind_box_id', $box_id)->where('to', $to)->get();
if ($transter && count($transter)) {
Log::info('此账户购买的盒已转账或退款');
return false;
}
# 获取收款钱包和私钥
$items = SetAddress::query()->first(['address', 'key_word']);
$my_address = $items->address;
$key_word = $items->key_word;
$obj = [
'form' => $my_address,
'to' => $to,
'key_word' => $key_word,
'amount' => $amount,
'box_id' => $box_id,
'type' => $type
];
# 向redis插入数据
Redis::rpush('winner_transfer', json_encode($obj));
return true;
}
/**
* 转账回调
* item = {
* to:"",
* box_id:'',
* hash:'',
* status:',
* amount:'
* }
*/
public function TransferCallback($item)
{
# 无论成功与否,都添加记录
TransferRecord::query()->create(['to' => $item['to'], 'price' => $item['amount'],
'hash' => $item['hash'], 'status' => $item['status'], 'blind_box_id' => $item['box_id'], 'type' => $item['type']]);
return true;
}
} }
<?php
namespace App\Http\Controllers\API\Test;
use App\Http\Controllers\API\Redis\CheckArrivalCl;
class TestController
{
public function useTest()
{
$to = '0x51eF357cf7204DB2a6e31750817F709a10c86f37';
$res = app(CheckArrivalCl::class)->WinnerTransfer($to, 98, 0.01, 1);
return $res;
}
}
<?php
namespace App\Models;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\Model;
class TransferRecord extends Model
{
use HasDateTimeFormatter;
protected $fillable = [
'to',
'price',
'hash',
'status',
'blind_box_id',
'type'
];
protected $table = 'transfer_record';
}
...@@ -15,7 +15,9 @@ class UserWallet extends Model ...@@ -15,7 +15,9 @@ class UserWallet extends Model
'status', 'status',
'price', 'price',
'blind_box_id', 'blind_box_id',
'hash' 'hash',
'winner_status',
'transfer_status'
]; ];
protected $table = 'user_wallet'; protected $table = 'user_wallet';
......
...@@ -201,7 +201,7 @@ ...@@ -201,7 +201,7 @@
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
*/ */
'helpers' => [ 'helpers' => [
'enable' => false, 'enable' => true,
], ],
/* /*
......
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('user_wallet', function (Blueprint $table) {
$table->integer('winner_status')->default(0)->comment('是否中奖');
$table->integer('transfer_status')->default(0)->comment('中奖后是否转账');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('user_wallet', function (Blueprint $table) {
$table->dropColumn('winner_status');
$table->dropColumn('transfer_status');
});
}
};
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('set_address', function (Blueprint $table) {
$table->string('key_word')->nullable()->comment('私钥');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('set_address', function (Blueprint $table) {
$table->dropColumn('key_word');
});
}
};
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('transfer_record', function (Blueprint $table) {
$table->integer('type')->default(0)->comment('转账类型_开奖or_退款');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('transfer_record', function (Blueprint $table) {
$table->dropColumn('type');
});
}
};
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateTransferRecordTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('transfer_record', function (Blueprint $table) {
$table->increments('id');
$table->string('to')->default('')->comment('转账收款地址');
$table->double('price')->comment('resdao数量');
$table->string('hash')->default('')->comment('交易哈希');
$table->integer('status')->default('0')->comment('0是未转账,1是转账成功,2是转账失败');
$table->integer('blind_box_id')->comment('转账的盲盒id');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('transfer_record');
}
}
<?php
return [
'labels' => [
'TransferRecord' => 'TransferRecord',
'transfer-record' => 'TransferRecord',
],
'fields' => [
'to' => '收款地址',
'price' => '转账数量',
'hash' => '交易哈希',
'status' => '转账状态',
'blind_box_id' => '盲盒id',
],
'options' => [
],
];
...@@ -31,6 +31,8 @@ ...@@ -31,6 +31,8 @@
Route::post('/BlindBox/buy/check', 'IndexController@usePayCheck'); Route::post('/BlindBox/buy/check', 'IndexController@usePayCheck');
# python检查回调 # python检查回调
Route::post('/BlindBox/buy/CheckCallback', 'IndexController@useCheckCallback'); Route::post('/BlindBox/buy/CheckCallback', 'IndexController@useCheckCallback');
# nodejs转账回调
Route::post('/transfer/callback', 'IndexController@useNodeJsTransfer');
# 用户订单查询 # 用户订单查询
Route::get('/order', 'IndexController@useUserOrder'); Route::get('/order', 'IndexController@useUserOrder');
# 获取收款地址 # 获取收款地址
...@@ -38,4 +40,8 @@ ...@@ -38,4 +40,8 @@
// --------- // ---------
# 获取用户信息 # 获取用户信息
Route::get('/user/info', 'IndexController@getUserInfo'); Route::get('/user/info', 'IndexController@getUserInfo');
# 测试
# Route::get('/my/test', 'IndexController@useMyTest');
}); });
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment