<?php
namespace app\api\controller;
use app\common\controller\Api;
use think\Db;
use think\Log;
use addons\epay\library\Service;
/**
* 支付回调
*/
class Notify extends Api
{
protected $noNeedLogin = ['*'];
protected $noNeedRight = ['*'];
/**
* 支付回调
*/
public function notify() {
$paytype = $this->request->param('paytype');
$pay = Service::checkNotify($paytype);
// Log::record("=======================", 'info');
// Log::record("pay:", 'info');
// Log::record($pay, 'info');
// Log::record("=======================", 'info');
if (!$pay) {
echo '签名错误';
return;
}
$data = $pay->verify();
$time = time();
try {
$payamount = $paytype == 'alipay' ? $data['total_amount'] : $data['total_fee'] / 100;
$out_trade_no = $data['out_trade_no'];
Db::startTrans();
try{
$orderModel = new \app\common\model\RecharOrder();
$userModel = new \app\common\model\User();
$orderInfo = $orderModel->where(["order_no"=>$out_trade_no])->find();
$userInfo = $userModel->where(["id"=>$orderInfo["user_id"]])->find();
$res1 = false;
$res2 = false;
$res3 = false;
if($orderInfo['status'] == 0) {
// 修改订单状态
$res1 = $orderModel->update(["status"=>1,"updatetime"=>$time],["order_no"=>$out_trade_no, 'status' => 0]);
// 充值后
switch($orderInfo['purpose']) {
case 1:
// 修改用户为已缴纳认证费
$userInfo->recharge_auth = 1;
$res2 = $userInfo->save();
$res3 = true;
break;
case 2:
// 添加有眼缘记录--单次付费
$data = [];
$data['user_id'] = $userInfo->id;
$data['fate_user_id'] = $orderInfo->fate_user_id;
if(!\app\common\model\UserFate::where($data)->find()) {
$data['createtime'] = $time;
$res2 = \app\common\model\UserFate::insert($data);
} else {
$res2 = true;
}
// 返利
$preuser_id = $userInfo->pre_user_id;
if($userInfo->vip_duetime < $time) {
$memo = '用户充值获得收益!';
$profit = $payamount * config('site.userProfitRate') * 0.01;
} else {
$memo = '会员充值获得收益!';
$profit = $payamount * config('site.vipProfitRate') * 0.01;
}
if($profit>=0.01 && $preuser_id > 0) {
$res3 = \app\common\model\User::profit($profit,$preuser_id,$memo);
} else {
$res3 = true;
}
break;
case 3:
// 获取vip配置信息
$vip_config_id = $orderInfo['vip_config_id'];
$vipConfigInfo = \app\admin\model\vip\Config::where(['id'=>$vip_config_id])->find();
// 计算vip到期时间
if($userInfo->vip_duetime < $time) {
$duetime = strtotime ( '+'.intval($vipConfigInfo['time']).' month' );
} else {
$duetime = strtotime ( '+'.intval($vipConfigInfo['time']).' month',$userInfo->vip_duetime);
}
// 修改用户为vip
if($userInfo->vip_duetime <= time()) {
$userInfo->view_count = $vipConfigInfo->give_times; // 今日剩余次数
$userInfo->view_date = date('Y-m-d'); // 次数最后更新日期
}
$userInfo->vip_duetime = $duetime;
$res2 = $userInfo->save();
// 添加查看次数
$data = [];
$data['user_id'] = $userInfo->id;
$data['end_date'] = date("Y-m-d",$duetime);
$data['times'] = $vipConfigInfo->give_times;
$data['createtime'] = time();
$res3 = \app\common\model\GiveFateLog::insert($data);
break;
case 4:
// 获取钻石配置信息
$vip_config_id = $orderInfo['vip_config_id'];
$vipConfigInfo = Db::name('diamond')->where(['id'=>$vip_config_id])->find();
//修改用户钻石余额
$diamond = $userInfo['diamond'] + $vipConfigInfo['number'];
$res2 = Db::name('user')->where(['id' => $userInfo['id'], 'diamond' => $userInfo['diamond']])->setField('diamond', $diamond);
// 添加钻石明细
$diamond_log = Db::name('user_diamond_log')->where(['user_id' => $userInfo['id']])->order('id', 'desc')->find();
if (!$diamond_log && $userInfo['diamond'] > 0) {
$res3 = false;
break;
}
if ($diamond_log && $diamond_log['after'] != $userInfo['diamond']) {
$res3 = false;
break;
}
$data = [];
$data['user_id'] = $userInfo['id'];
$data['diamond'] = $vipConfigInfo['number'];
$data['before'] = $userInfo['diamond'];
$data['after'] = $diamond;
$data['memo'] = '充值';
$data['createtime'] = time();
$res3 = Db::name('user_diamond_log')->insertGetId($data);
break;
}
}
if($res1 && $res2 !== false && $res3) {
Db::commit();
} else {
Db::rollback();
}
}catch (ValidateException $e) {
Db::rollback();
$this->error($e->getMessage());
} catch (PDOException $e) {
Db::rollback();
$this->error($e->getMessage());
} catch (Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
//你可以在此编写订单逻辑
} catch (Exception $e) {
}
echo $pay->success();
}
}