where('uid', $uid)->value('rz_money'); $body = '实名认证费用'; break; case 3: // 开通会员 $vip_money = Env::get('app.VIP_MONEY', 38); if (!$vip_money > 0) { throw new Exception('会员配置不存在'); } $body = '开通会员'; $total_amount = $vip_money; $remarks = $data['order_id']; break; case 4: //购买商品 $order_sn = $data['order_id']; $checkingOrder = Order::checkingOrder($order_sn, 0, $uid); if (!$checkingOrder) { throw new Exception('校验订单失败'); } if ($checkingOrder['flag'] !== 200) { throw new Exception($checkingOrder['msg']); } $body = '购买商品'; $total_amount = $checkingOrder['orderPayment']; $remarks = $order_sn; //更改订单支付状态为线下支付待审核状态 if ($this->data['channel'] == 4 && $this->data['order_type'] == 4) { Order::where('order_sn', 'in', $order_sn)->save(['pay_type' => 4, 'status' => 4]); } break; } if (!$body || !$total_amount || $total_amount <= 0) throw new Exception('配置错误'); return [$body, $type == 1 ? $total_amount : bcmul($total_amount, 100, 2), $data['order_type'], $remarks, $data['trade_type'], $data['channel'], isset($data['voucher_img']) ? $data['voucher_img'] : '']; } /** * 保存订单信息 * @param array $param * @param int $pay_way */ public function setPaymentOrder(array $param, int $pay_way = 1) { $insert = [ 'total_fee' => $param['total_amount'], 'trade_type' => $param['trade_type'], 'body' => $param['body'], 'state' => 7, 'out_trade_no' => $param['out_trade_no'], 'pay_way' => $param['pay_way'], 'remarks' => $param['remarks'], 'order_type' => $param['order_type'], 'uid' => $param['uid'], 'voucher_img' => $param['voucher_img'], 'out_trade_no1' => (isset($param['out_trade_no1']) ? $param['out_trade_no1'] : (isset($param['']))) ]; // 信息 $payWayCode = PaymentService::make()->getPayCode($pay_way); RedisCache::set("caches:payment:{$payWayCode}:otn_{$param['out_trade_no']}:{$param['uid']}_{$param['remarks']}_payment", $insert, 7200); Db::name('payment')->insert($insert); } /** * 处理订单回调 * @param string $payType */ public function afterPay($payType = 2) { $date = date('Y-m-d H:i:s'); $outTradeNo = isset($this->notify_info['out_trade_no']) ? $this->notify_info['out_trade_no'] : ''; $payCode = PaymentService::make()->getPayCode($payType); $cacheKey = "caches:payNotify:{$payCode}:otn_{$outTradeNo}:"; RedisCache::set($cacheKey.'catch', ['notify' => $this->notify_info, 'date' => $date], 7200); if (!$this->pay_status || empty($outTradeNo)) { sr_throw('回调参数错误,处理失败'); } $payInfo = PaymentService::make()->getCacheInfo($outTradeNo, 7, '', false); $payId = isset($payInfo['id']) ? $payInfo['id'] : 0; $payUid = isset($payInfo['uid']) ? $payInfo['uid'] : 0; $orderSn = isset($payInfo['remarks']) ? $payInfo['remarks'] : ''; $orderType = isset($payInfo['order_type']) ? intval($payInfo['order_type']) : 0; if (empty($payInfo) || $payId <= 0 || $payUid <= 0) { $logData = ['notify' => $this->notify_info, 'payInfo' => $payInfo, 'error' => '支付信息不存在,或参数错误', 'date' => $date]; RedisCache::set($cacheKey . "error_{$orderSn}", $logData, 7200); sr_throw('支付信息不存在,或参数错误'); } // 更新支付状态 Db::startTrans(); if (!PaymentModel::where('id', $payId)->update(['state' => 6, 'pay_at' => date('Y-m-d H:i:s')])) { Db::rollback(); $logData = ['notify' => $this->notify_info, 'payInfo' => $payInfo, 'error' => '更新支付状态失败', 'date' => $date]; RedisCache::set($cacheKey . "error_{$orderSn}", $logData, 7200); sr_throw('更新支付状态失败'); } // 订单业务处理 switch ($orderType) { case 1: // 充值 break; case 3: // 充值会员 break; case 4: //购买商品 $orderInfo = ShopOrderService::make()->getInfoBySn($orderSn, $payUid, '', false); $orderId = isset($orderInfo['order_id']) ? $orderInfo['order_id'] : 0; $orderStatus = isset($orderInfo['status']) ? $orderInfo['status'] : 0; if (empty($orderInfo) || $orderId <= 0) { Db::rollback(); $logData = ['notify' => $this->notify_info, 'orderInfo' => $orderInfo, 'payInfo' => $payInfo, 'error' => "单号{$orderSn}商城订单不存在", 'date' => $date]; RedisCache::set($cacheKey . "error_{$orderSn}", $logData, 7200); sr_throw("单号{$orderSn}商城订单不存在"); } // 验证订单状态 if ($orderStatus != 0) { Db::rollback(); $logData = ['notify' => $this->notify_info, 'orderInfo' => $orderInfo, 'payInfo' => $payInfo, 'error' => "单号{$orderSn}商城订单已处理", 'date' => $date]; RedisCache::set($cacheKey . "error_{$orderSn}", $logData, 7200); sr_throw("单号{$orderSn}商城订单已处理"); } // 更新订单状态 if (!ShopOrderModel::where('order_id', $orderId)->update(['pay_type' => $payType, 'status' => 1, 'updated_time' => $date])) { Db::rollback(); $logData = ['notify' => $this->notify_info, 'orderInfo' => $orderInfo, 'payInfo' => $payInfo, 'error' => "单号{$orderSn}商城订单已处理", 'date' => $date]; RedisCache::set($cacheKey . "error_{$orderSn}", $logData, 7200); sr_throw("单号{$orderSn}商城订单已处理"); } // 增加订单商品销量 $updateSale = ShopOrderModel::alias('a') ->leftJoin('shop_order_goods og', 'og.order_id=a.order_id') ->leftJoin('shop_goods g', 'g.goods_id=og.goods_id') ->where(['a.order_id' => $orderId, 'a.user_id' => $payUid]) ->update([ 'g.sales_volume' => Db::raw('g.sales_volume + og.num'), 'g.real_sales_volume' => Db::raw('g.real_sales_volume + og.num'), ]); if (!$updateSale) { Db::rollback(); $logData = ['notify' => $this->notify_info, 'orderInfo' => $orderInfo, 'payInfo' => $payInfo, 'error' => "单号{$orderSn}商城订单更新商品销量失败", 'date' => $date]; RedisCache::set($cacheKey . "error_{$orderSn}", $logData, 7200); sr_throw("单号{$orderSn}商城订单更新商品销量失败"); } // 送积分/红包积分 $userInfo = UserService::make()->getCacheInfo($payUid, 'id,mobile,score,money', false); $rebateScore = isset($orderInfo['rebate_score']) ? floatval($orderInfo['rebate_score']) : 0; if ($rebateScore > 0 && $userInfo) { // 更新用户账户积分 if (!UserModel::where('id', $payUid)->inc('score', $rebateScore)->update()) { Db::rollback(); $logData = ['notify' => $this->notify_info, 'orderInfo' => $orderInfo, 'user' => $userInfo, 'payInfo' => $payInfo, 'error' => "更新用户赠送积分失败", 'date' => $date]; RedisCache::set($cacheKey . "error_{$orderSn}", $logData, 7200); sr_throw("更新用户赠送积分失败"); } // 处理积分流水明细 $userScore = isset($userInfo['score']) ? floatval($userInfo['score']) : 0; $data = [ 'uid' => $payUid, 'type' => 5, 'score' => $rebateScore, 'create_at' => sr_getcurtime(time()), 'state' => 12, 'before_score' => $userScore, 'after_score' => max(0, $userScore + $rebateScore), 'from_id' => $payId, 'uid2' => 0 ]; if (!ScoreLogModel::insertGetId($data)) { Db::rollback(); $logData = ['notify' => $this->notify_info, 'orderInfo' => $orderInfo, 'user' => $userInfo, 'score' => $data, 'payInfo' => $payInfo, 'error' => "赠送积分处理失败", 'date' => $date]; RedisCache::set($cacheKey . "error_{$orderSn}", $logData, 7200); sr_throw("赠送积分处理失败"); } } $logData = ['notify' => $this->notify_info, 'orderInfo' => $orderInfo, 'user' => $userInfo, 'score' => $data, 'payInfo' => $payInfo, 'error' => "赠送积分处理失败", 'date' => $date]; RedisCache::set($cacheKey."success_{$orderSn}", $logData, 7200); break; } Db::commit(); return 'success'; } }