<?php /** * Created by PhpStorm. * User: 86132 * Date: 2020/11/19 * Time: 22:23 */ namespace app\api\controller; use app\common\controller\Api; use think\Db; /** * 支付接口 */ class Pay extends Api { protected $noNeedLogin = ['*']; protected $noNeedRight = ['*']; /** * 订单接口 * @ApiTitle (押金支付) * @ApiSummary (押金支付) * @ApiMethod (POST) * @ApiRoute (/api/Pay/Wechat) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiParams (name="OrderSn", type="integer", required=true, description="订单号") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function Wechat() { $UserId = $this->is_token($this->request->header()); $OrderSn = input('OrderSn'); $Openid = Db::name('user')->where('id', $UserId)->value('openid'); //查询订单 $OrderArray = Db::name('order')->where('OrderSn', $OrderSn)->find(); //生成支付订单号 $PayOrder = $this->PayOrder(); //生成支付订单 $data = [ 'PayOrder' => $PayOrder, 'OrderSn' => $OrderSn, 'status' => 0, 'user_id' => $UserId, 'money' => $OrderArray['total'], 'createtime' => time(), 'updatetime' => time() ]; $InsertPayOrder = Db::name('pay_order')->insert($data); if (!$InsertPayOrder) { $this->error('支付订单生成失败', 0); die; } $domain = $this->request->domain(); $data = [ 'amount' => $OrderArray['total'], 'orderid' => $PayOrder, 'type' => "wechat", 'title' => "会员开通", 'notifyurl' => $domain . "/api/pay/WechatNotify/paytype/wechat", 'returnurl' => $domain . "/api/pay/baidu", 'method' => "miniapp", 'openid' => $Openid ]; $return = \addons\epay\library\Service::submitOrder($data); echo $return; } /** * 订单接口 * @ApiTitle (支付回调) * @ApiSummary (支付回调) * @ApiMethod (POST) * @ApiRoute (/api/Pay/WechatNotify) * @ApiParams (name="paytype", type="string", required=true, description="") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function WechatNotify() { $paytype = $this->request->param('paytype'); $pay = \addons\epay\library\Service::checkNotify($paytype); if (!$pay) { echo '签名错误'; die; } $data = $pay->verify(); try { $payamount = $paytype == 'alipay' ? $data['total_amount'] : $data['total_fee'] / 100; //$data['out_trade_no'] 支付单号 $order_sn = $data['out_trade_no']; $order = Db::name('pay_order')->where('PayOrder', $order_sn)->find(); if ($order['status'] == 1) { return $pay->success('支付成功'); die; } //在此编写订单逻辑 //修改支付订单状态 $UpdateStatus = Db::name('pay_order')->where('PayOrder', $data['out_trade_no'])->update( [ 'status' => 1, 'updatetime' => time(), 'WeChatOrder' => $data['transaction_id'], 'pay_time' => time() ] ); $PayOrderInfo = Db::name('pay_order')->where('PayOrder', $data['out_trade_no'])->find(); $OrderInfo = Db::name('order')->where('OrderSn', $PayOrderInfo['OrderSn'])->find(); $UnionID = Db::name('user')->where('id', $PayOrderInfo['user_id'])->value('UnionID'); if (!$UpdateStatus) { $this->error('修改支付订单状态失败', 0); die; } //修改订单状态 $UpdateOrder = Db::name('order')->where('OrderSn', $PayOrderInfo['OrderSn'])->update([ 'status' => 1, 'updatetime' => time() ]); if (!$UpdateOrder) { $this->error('修改订单状态失败', 0); die; } /*订单推送到管易*/ $GuanYiCloud = new GuanYiCloud(); $City = explode('/', $OrderInfo['city']); //查询订单详情 $GoodsArray = Db::name('order_con') ->alias('o') ->where('o.OrderSn', $PayOrderInfo['OrderSn']) ->join('goods g', 'g.id=o.Goods_id') ->field('g.goods_code,o.num,g.price') ->select(); foreach ($GoodsArray as $k => $v) { $details[$k]['item_code'] = $v['goods_code']; $details[$k]['qty'] = $v['num']; $details[$k]['price'] = $v['price']; $details[$k]['oid'] = $PayOrderInfo['OrderSn']; } $PayTime = $PayOrderInfo['pay_time'] * 1000; $GuanYiCloud->addOrder($PayOrderInfo['OrderSn'], date('Y-m-d H:i:s', $OrderInfo['createtime']), $PayTime, $UnionID, $OrderInfo['name'], $OrderInfo['mobile'], $OrderInfo['address'] . '/' . $OrderInfo['address_con'], $City[0], $City[1], $City[2], $details, $PayOrderInfo['money'], $PayOrderInfo['PayOrder']); //是否首次下单 $FirstPay = Db::name('order')->where('OrderSn', 'NEQ', $PayOrderInfo['OrderSn'])->where('status', 'IN', '1,2,3,4,5')->find(); if (empty($FirstPay)) { Db::name('pay_order')->where('PayOrder', $data['out_trade_no'])->update( [ 'is_new' => 1, ] ); //查询用户积分 $FirstPayUserinfo = Db::name('user')->where('id', $PayOrderInfo['user_id'])->find(); //更改用户积分 $UpdateFirstPay = Db::name('user')->where('id', $PayOrderInfo['user_id'])->update(['num' => $FirstPayUserinfo['num'] + ($OrderInfo['total'] * 2)]); if (!$UpdateFirstPay) { $this->error('更改用户积分失败失败', 0); die; } //添加用户积分记录 $InserNumSql = [ 'user_id' => $PayOrderInfo['user_id'], 'status' => 1, 'type' => 5, 'num' => $OrderInfo['total'] * 2, 'up_num' => $FirstPayUserinfo['num'] + ($OrderInfo['total'] * 2), 'createtime' => time() ]; Db::name('num')->insert($InserNumSql); } //是否升级 //已消费金额 $Consumed $Consumed = $this->YiXiaofeiMoney($PayOrderInfo['user_id']); $Level = Db::name('user')->where('id', $PayOrderInfo['user_id'])->value('level'); $LevelSql = Db::name('level')->where('type', $Level + 1)->find(); if ($Consumed > $LevelSql['price'] && $Consumed == $LevelSql['price']) { $LevelUserInfo = Db::name('user')->where('id', $PayOrderInfo['user_id'])->find(); //更改用户积分 $UpdateLevelUserInfo = Db::name('user')->where('id', $PayOrderInfo['user_id'])->update(['num' => $LevelUserInfo['num'] + $LevelSql['num']]); if (!$UpdateLevelUserInfo) { $this->error('更改用户积分失败失败2', 0); die; } //添加用户积分记录 $InserNumSql2 = [ 'user_id' => $PayOrderInfo['user_id'], 'status' => 1, 'type' => 6, 'num' => $LevelSql['num'], 'up_num' => $LevelUserInfo['num'] + $LevelSql['num'], 'createtime' => time() ]; Db::name('num')->insert($InserNumSql2); } //好友下单奖励 $Fuser_id = Db::name('group')->where('user_id', $PayOrderInfo['user_id'])->value('fuser_id'); if (!empty($Fuser_id)) { $FuserInfo = Db::name('user')->where('id', $Fuser_id)->find(); Db::name('user')->where('id', $Fuser_id)->update( [ 'num' => $FuserInfo['num'] + 300 ] ); //添加用户积分记录 $Fuser_idSql2 = [ 'user_id' => $PayOrderInfo['user_id'], 'status' => 1, 'type' => 9, 'num' => 300, 'up_num' => $FuserInfo['num'] + 300, 'createtime' => time() ]; Db::name('num')->insert($Fuser_idSql2); } //活动逻辑 单笔订单满100元,额外奖励5元。单笔订单满399,额外奖励50元,单笔订单满699元,额外奖励100元;(下级下单)奖励到活动收益表 $Part = Db::name('huodong')->find(); $i = 0; if ($Part['start_time'] < time() && time() < $Part['end_time']) { $i++; } if ($i != 0) { //活动开放 $Fuser_id = Db::name('group')->where('user_id', $PayOrderInfo['user_id'])->value('fuser_id'); if (!empty($Fuser_id)) { if ($OrderInfo['total'] > 99) { $RedBad = 5; } elseif ($OrderInfo['total'] > 398) { $RedBad = 50; } elseif ($OrderInfo['total'] > 698) { $RedBad = 100; } //给上级加收益到活动钱包 //查询上级钱包 $huodong_money = Db::name('huodong_money')->where('user_id', $Fuser_id)->find(); Db::name('huodong_money')->where('user_id', $Fuser_id)->update( [ 'count_money' => $huodong_money['count_money'] + $RedBad, 'befor_money' => $huodong_money['befor_money'] + $RedBad ] ); } } //自购返现 $ZiGou = Db::name('user')->where('id', $PayOrderInfo['user_id'])->find(); if ($ZiGou['level'] != 1) { //不是普通会员 产生自购返现 //自购折扣 $buycount = Db::name('level')->where('type', $ZiGou['level'])->value('buycount'); $ZigouMoney = (1 - $buycount) * $OrderInfo['total']; //扣除积分 Db::name('user')->where('id', $PayOrderInfo['user_id'])->update( [ 'num' => $ZiGou['num'] - $ZigouMoney, 'money' => $ZiGou['money'] + $ZigouMoney ] ); //积分表添加记录 //添加用户积分记录 $ZiGouSql = [ 'user_id' => $PayOrderInfo['user_id'], 'status' => 0, 'type' => 4, 'num' => $ZigouMoney, 'up_num' => $ZiGou['num'] - $ZigouMoney, 'createtime' => time() ]; Db::name('num')->insert($ZiGouSql); //添加收益记录 $ZiGouSqlMoney = [ 'user_id' => $PayOrderInfo['user_id'], 'money' => $ZigouMoney, 'touser_id' => $PayOrderInfo['user_id'], 'status' => 0, 'type' => 1, 'createtime' => time(), 'OrderSn' => $PayOrderInfo['OrderSn'] ]; Db::name('money')->insert($ZiGouSqlMoney); } //二级分佣 //查询用户上级和上级的上级 $FatherUserId = Db::name('group')->where('user_id', $PayOrderInfo['user_id'])->value('fuser_id'); if (!empty($FatherUserId)) { //一级分佣 //一级精品比例 $FirstBiliJingpin = Db::name('bili')->where('type', 1)->value('first'); //一级通品比例 $FirstBilitongpin = Db::name('bili')->where('type', 2)->value('first'); //查询订单详情 $FirstOrderConArray = Db::name('order_con')->where('OrderSn', $PayOrderInfo['OrderSn'])->select(); if (!empty($FirstOrderConArray)) { foreach ($FirstOrderConArray as $k => $v) { $GoodsType = Db::name('goods')->where('id', $v['Goods_id'])->find(); if (!empty($GoodsType)) { if ($GoodsType == 1) { //精品 $FirstMoney[] = $GoodsType['price'] * $FirstBiliJingpin; } else { //通品 $FirstMoney[] = $GoodsType['price'] * $FirstBilitongpin; } } } //总收益 $FirstMoney $RecordedFirstMoney = array_sum($FirstMoney); $FirstUserInfoArray = Db::name('user')->where('id', $FatherUserId)->find(); //扣除积分 增加余额 Db::name('user')->where('id', $FatherUserId)->update( [ 'num' => $FirstUserInfoArray['num'] - $RecordedFirstMoney, 'money' => $FirstUserInfoArray['money'] + $RecordedFirstMoney ] ); //添加用户积分记录 $FirstNumuSql = [ 'user_id' => $FatherUserId, 'status' => 0, 'type' => 3, 'num' => $RecordedFirstMoney, 'up_num' => $FirstUserInfoArray['num'] - $RecordedFirstMoney, 'createtime' => time() ]; Db::name('num')->insert($FirstNumuSql); //添加收益记录 $FirstSqlMoney = [ 'user_id' => $FatherUserId, 'money' => $RecordedFirstMoney, 'touser_id' => $PayOrderInfo['user_id'], 'status' => 0, 'type' => 2, 'createtime' => time(), 'OrderSn' => $PayOrderInfo['OrderSn'] ]; Db::name('money')->insert($FirstSqlMoney); } $GroundFatherUserId = Db::name('group')->where('user_id', $FatherUserId)->value('fuser_id'); if (!empty($GroundFatherUserId)) { //二级分佣 //二级精品比例 $SecondBiliJingpin = Db::name('bili')->where('type', 1)->value('first'); //二级通品比例 $SecondBilitongpin = Db::name('bili')->where('type', 2)->value('first'); //查询订单详情 $SecondOrderConArray = Db::name('order_con')->where('OrderSn', $PayOrderInfo['OrderSn'])->select(); if (!empty($SecondOrderConArray)) { foreach ($SecondOrderConArray as $k => $v) { $GoodsType = Db::name('goods')->where('id', $v['Goods_id'])->find(); if (!empty($GoodsType)) { if ($GoodsType == 1) { //精品 $SecondMoney[] = $GoodsType['price'] * $SecondBiliJingpin; } else { //通品 $SecondMoney[] = $GoodsType['price'] * $SecondBilitongpin; } } } //总收益 $FirstMoney $RecordedSecondMoney = array_sum($SecondMoney); $SecondUserInfoArray = Db::name('user')->where('id', $GroundFatherUserId)->find(); //扣除积分 增加余额 Db::name('user')->where('id', $GroundFatherUserId)->update( [ 'num' => $SecondUserInfoArray['num'] - $RecordedSecondMoney, 'money' => $SecondUserInfoArray['money'] + $RecordedSecondMoney ] ); //添加用户积分记录 $SecondNumuSql = [ 'user_id' => $GroundFatherUserId, 'status' => 0, 'type' => 3, 'num' => $RecordedSecondMoney, 'up_num' => $SecondUserInfoArray['num'] - $RecordedSecondMoney, 'createtime' => time() ]; Db::name('num')->insert($SecondNumuSql); //添加收益记录 $SecondSqlMoney = [ 'user_id' => $GroundFatherUserId, 'money' => $RecordedSecondMoney, 'touser_id' => $PayOrderInfo['user_id'], 'status' => 0, 'type' => 2, 'createtime' => time(), 'OrderSn' => $PayOrderInfo['OrderSn'] ]; Db::name('money')->insert($SecondSqlMoney); } } } } catch (Exception $e) { } echo $pay->success('支付成功'); } }