bourse stock
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

316 lines
14 KiB

<?php
namespace app\home\service;
use app\model\AccountFrozenModel;
use app\model\PaymentListModel;
use app\model\RechargeApplyModel;
use app\model\StockMarketModel;
use app\model\UserModel;
use app\model\UserWithdrawalModel;
use app\model\WalletListModel;
use think\facade\Db;
use think\facade\Log;
/**
* 处理团队佣金业务
*/
class PayService extends BaseHomeService
{
public function getPaymentList(array $data)
{
$list = PaymentListModel::where([
'status' => 1,
'is_recharge' => 1,
'is_online' => $data['is_online']
])->order('id', 'desc')->select()->toArray();
return $this->toData(0, 'Request successful.', $list);
}
/**
* 用户充值申请入库1
* @param array $data
* @return array
*/
public function insertRechargeApply(array $data): array
{
//判断账号是否冻结
$isFrozen = AccountFrozenModel::where('user_id', $data['user_id'])->find();
if (!empty($isFrozen) && $isFrozen->frozen_recharge == 1) {
return $this->toData('100110', 'The current account has been frozen', []);
}
$channel = PaymentListModel::getPaymentInfo([
'id' => $data['recharge_channel']
]);
if (empty($channel)) {
return $this->toData('100110', 'The system is busy. Please try again later.1', []);
}
if (empty($data['country'])) {
return $this->toData('100120', 'The system is busy. Please try again later.2', []);
}
if (empty($data['recharge_num']) || $data['recharge_num'] <= 0) {
return $this->toData('100130', 'The system is busy. Please try again later.3', []);
}
if($channel['type']==9){
//1USD=1USDT
$currency_rate = 1;
if($data['product']=='TRC20Buy'){
switch ($data['extra']){
case 'GBP':
$gpx_rate=StockMarketModel::where('stock_market_type',14)->value('rate');
$currency_rate=$gpx_rate/100;
break;
case "EUR":
$eur_rate=StockMarketModel::where('stock_market_type',15)->value('rate');
$currency_rate=$eur_rate*1;
break;
}
}
}else{
$currency_rate = $channel['exchange_rate'];
}
//$currency_rate=(new StockMarketModel)->getRate(4);
if ($data['account_type'] > 2 && ($data['account_type'] != 8)) {
$market_rate = (new StockMarketModel)->getRate($data['account_type']);
} else {
$market_rate = 1;
}
$market_amount = $data['recharge_num'] * $market_rate;
$market_amount = round($market_amount, 2);
if ($channel['pay_type'] == 1) {
$fee = $data['recharge_num'] * $currency_rate * $channel['service_rate'];
$server_fee = $market_amount * $channel['service_rate'];
} else {
$fee = $currency_rate * $channel['service_rate'];
$server_fee = $market_rate * $channel['service_rate'];
}
$total_amount = $data['recharge_num'] * $currency_rate + $fee;
$total_amount = round($total_amount, 2);
if ($data['is_online'] == 1 && $total_amount > 100000) {
return $this->toData('101900', 'Online payment scope: 100 - 100000');
}
$data['service_fee'] = $server_fee;//手续费用
$data['market_amount'] = $market_amount; //换算的市场金额
$data['total_amount'] = $total_amount; //要支付的渠道货币金额
$data['currency_rate'] = $currency_rate;
if ($channel['channel_type'] == 'Bank') {
$data['recharge_type'] = 2;
} else {
$data['recharge_type'] = 1;
}
$data['order_no'] = $this->generateOrderNumber();
$order_id = RechargeApplyModel::InsertUserRecharge($data);
if ($order_id) {
switch ($channel['type']) {
case 2:
$result = (new IndPayService())->indPay($data['order_no'], $data['total_amount']);
if ($result['status'] == 'SUCCESS') {
RechargeApplyModel::where('order_no', $data['order_no'])->update([
'order_idx' => $result['order_no'],
'pay_url' => $result['order_data'],
]);
return $this->toData(0, 'Request successful.', [
'type' => 'bank_pay',
'pay_url' => $result['order_data'],
'order_no' => $result['mer_order_no'],
]);
} else {
return $this->toData('100900', 'The system is busy. Please try again later.4', [$result['err_msg'], $result['err_code']]);
}
break;
case 3:
$result = (new MoPayService())->create_order($data['order_no'], $data['total_amount']);
if ($result['status'] == 'SUCCESS') {
RechargeApplyModel::where('order_no', $data['order_no'])->update([
'pay_url' => $result['data']['pay_url'],
]);
return $this->toData(0, 'Request successful.', [
'type' => 'bank_pay',
'pay_url' => $result['data']['pay_url'],
'order_no' => $data['order_no'],
]);
} else {
return $this->toData('100600', 'The system is busy. Please try again later.5', [$result['err_msg'], $result['err_code']]);
}
break;
case 4:
// $result = (new HTPayService())->qrPay($data['order_no'], round($data['total_amount']));
// if ($result['status'] == 1) {
// RechargeApplyModel::where('order_no', $data['order_no'])->update([
// 'order_idx' => $result['orderNo'],
// 'pay_url' => $result['payUrl'],
// 'total_amount' => $result['oriAmount']
// ]);
// return $this->toData(0, 'Request successful.', [
// 'type' => 'bank_pay',
// 'pay_url' => $result['payUrl'],
// 'order_no' => $data['order_no'],
// ]);
// } else {
// return $this->toData('101900', 'The system is busy. Please try again later.6', [$result['status'], $result['message']]);
// }
// 20250110 跟负责人确认不要第三方验证,后台管理端手动审核订单信息
return $this->toData(0, 'Request successful.', [
'type' => 'bank_pay',
'pay_url' => '',
'order_no' => $data['order_no'],
]);
break;
case 5:
$result = (new XdPayService())->create_order($data['order_no'], $data['total_amount']);
if ($result['code'] == 200) {
RechargeApplyModel::where('order_no', $data['order_no'])->update([
'pay_url' => $result['data']['url'],
]);
return $this->toData(0, 'Request successful.', [
'type' => 'bank_pay',
'pay_url' => $result['data']['url'],
'order_no' => $data['order_no'],
]);
} else {
return $this->toData('101900', 'The system is busy. Please try again later.7', [$result['code'], $result['msg']]);
}
break;
case 6:
$result = (new QeaePayService())->create_order($data['order_no'], $data['total_amount']);
if ($result['respCode'] == 'SUCCESS') {
RechargeApplyModel::where('order_no', $data['order_no'])->update([
'pay_url' => $result['payInfo'],
]);
return $this->toData(0, 'Request successful.', [
'type' => 'bank_pay',
'pay_url' => $result['payInfo'],
'order_no' => $data['order_no'],
]);
} else {
return $this->toData('101900', 'The system is busy. Please try again later.8', [$result['respCode'], $result['tradeMsg']]);
}
break;
case 7:
$result = (new NicePayService())->create_order($data['order_no'], $data['total_amount']);
if ($result['err'] == 0 && !empty($result)) {
RechargeApplyModel::where('order_no', $data['order_no'])->update([
'pay_url' => $result['url'],
]);
return $this->toData(0, 'Request successful.', [
'type' => 'bank_pay',
'pay_url' => $result['url'],
'order_no' => $data['order_no'],
]);
} else {
return $this->toData('101900', 'The system is busy. Please try again later.9', [$result['err'], $result['err_msg']]);
}
break;
case 8:
$result = (new ClickPayService())->create_order($data['order_no'], $data['total_amount']);
if (strtoupper($result['platRespCode']) == 'SUCCESS') {
RechargeApplyModel::where('order_no', $data['order_no'])->update([
'order_idx' => $result['platOrderNum'],
]);
return $this->toData(0, 'Request successful.', [
'type' => 'bank_pay',
'pay_url' => $result['payData'],
'order_no' => $data['order_no'],
]);
} else {
return $this->toData('101900', 'The system is busy. Please try again later.10');
}
break;
case 9:
if(in_array(trim($data['product']),['TRC20H5','TRC20Buy'])){
$result = (new StarPayService())->create_order($data['order_no'], $data['total_amount'],$data['product'],$data['extra']);
if ($result['code'] == 200) {
$respon=json_decode($result['params'],true);
RechargeApplyModel::where('order_no', $data['order_no'])->update([
'pay_url' => $respon['payurl'],
]);
return $this->toData(0, 'Request successful.', [
'type' => 'bank_pay',
'pay_url' => $respon['payurl'],
'order_no' => $data['order_no'],
]);
} else {
return $this->toData('100600', 'The system is busy. Please try again later.5', $result);
}
}else{
return $this->toData('102000', 'The system is busy. Please try again later.20');
}
break;
default:
return $this->toData(0, 'Request successful.', []);
break;
}
} else {
return $this->toData(100140, 'The system is busy. Please try again later.10', []);
}
}
public function dealPayNotify($order_info)
{
$wallet = new WalletService();
// 启动事务
Db::startTrans();
try {
//查询划转资金账户信息
$account = $wallet->lockUserBalance($order_info['account_type'], $order_info['user_id']);
if (empty($account)) {
Db::rollback();
return [
'code' => 100,
'msg' => 'FAIL'
];
}
// 新增转入 特别需要注意的是,股票账户需要进行汇率转换 现货\合约\美股都是USD
$update_data['usable_num'] = $account['usable_num'] + $order_info['market_amount'];
$res = $wallet->updateUserBalance($order_info['account_type'], $update_data, $order_info['user_id']);
if (empty($res)) {
Db::rollback();
return [
'code' => 300,
'msg' => 'FAIL'
];
}
//插入资金变动日志
$logs['user_id'] = $order_info['user_id'];
$logs['change_type'] = 1;
$logs['change_num'] = $order_info['market_amount'];
$logs['before_num'] = $account['usable_num'];
$logs['order_id'] = $order_info['order_no'];
$log_res = $wallet->addUserBalanceLog($order_info['account_type'], $logs);
if (empty($log_res)) {
Db::rollback();
return [
'code' => 400,
'msg' => 'FAIL'
];
}
//修改订单状态
RechargeApplyModel::where('id', $order_info['id'])->update([
'status' => 1,
'deal_time' => date('Y-m-d H:i:s'),
]);
// 提交事务
Db::commit();
return [
'code' => 200,
'msg' => 'SUCCESS'
];
} catch (\Exception $e) {
// 出现异常,回滚事务
Db::rollback();
return [
'code' => 500,
'msg' => $e->getMessage()
];
}
}
}