where('order_id', $order_id)->find(); if (!$orderInfo) return self::setErrorInfo('订单不存在!'); if ($orderInfo['paid']) return self::setErrorInfo('该订单已支付!'); $userInfo = User::getUserInfo($uid); self::beginTrans(); $res1 = UserBill::expend($orderInfo['order_type'] == 1 ? '挂买' : '购买', $uid, 'now_money', $orderInfo['order_type'] == 1 ? 'hang_buy' : 'buy', $orderInfo['pay_money'], $orderInfo['id'], $userInfo['now_money'], '微信支付' . floatval($orderInfo['pay_price']) . '元' . $orderInfo['order_type'] == 1 ? '挂买币' : '购买币'); $res2 = self::paySuccess($order_id, 'weixin');//微信支付为0时 $res = $res1 && $res2; self::checkTrans($res); return $res; } /** * 余额支付 * @param $order_id * @param $uid * @param string $formId * @return bool * @throws DataNotFoundException * @throws ModelNotFoundException * @throws DbException */ public static function yuePay($order_id, $uid, $formId = '') { $orderInfo = self::where('uid', $uid)->where('order_id', $order_id)->find(); if (!$orderInfo) return self::setErrorInfo('订单不存在!'); if ($orderInfo['paid']) return self::setErrorInfo('该订单已支付!'); $userInfo = User::getUserInfo($uid); if ($userInfo['now_money'] < $orderInfo['pay_money']) return self::setErrorInfo(['status' => 'pay_deficiency', 'msg' => '余额不足' . floatval($orderInfo['pay_money'])]); self::beginTrans(); $res1 = false !== User::bcDec($uid, 'now_money', $orderInfo['pay_money'], 'uid'); $res2 = UserBill::expend($orderInfo['order_type'] == 1 ? '挂买' : '购买', $uid, 'now_money', $orderInfo['order_type'] == 1 ? 'hang_buy' : 'buy', $orderInfo['pay_money'], $orderInfo['id'], $userInfo['now_money'], '余额支付' . floatval($orderInfo['pay_price']) . '元' . $orderInfo['order_type'] == 1 ? '挂买币' : '购买币'); $res3 = self::paySuccess($order_id, 'yue');//余额支付成功 $res = $res1 && $res2 && $res3; self::checkTrans($res); return $res; } public static function getOrderId() { list($msec, $sec) = explode(' ', microtime()); $msectime = number_format((floatval($msec) + floatval($sec)) * 1000, 0, '', ''); do { $str = 'cp' . $msectime . mt_rand(10000, 99999); } while (self::be(['order_id' => $str])); return $str; } public static function paySuccess($orderId, $paytype = 'weixin') { $order = self::where('order_id', $orderId)->find(); $res = self::where('order_id', $orderId)->update(['paid' => 1, 'pay_type' => $paytype, 'pay_time' => time()]);//订单改为支付 $now_money = User::where('uid', $order['uid'])->value('now_money'); $res = $res && UserBill::expend($order['order_type'] == 1 ? '挂买' : '购买', $order['uid'], 'now_money', 'trade_pay_success', $order['pay_money'], $order['id'], $now_money, '支付' . floatval($order['pay_money']) . '元' . $order['order_type'] == 1 ? '挂买币' : '购买币'); if ($order['order_type'] == 1) { //生成挂买订单 $order_info = json_decode($order['order_info'], true); $res2 = CashTradeOrder::create(array_merge( [ 'order_id' => CashTradeOrder::getOrderId(), 'add_time' => time(), 'end_time' => bcadd(time(), bcmul($order_info['hang_time'], 3600)), ], $order_info)); $res = $res && $res2 && self::where('order_id', $orderId)->update(['status' => 1, 'bind_order' => $res2['id']]); } else { //购买 $userInfo = User::getUserInfo($order['uid']); if (self::where('bind_order', $order['bind_order'])->where('pay_time', '<', time())->where('id', '<>', $orderId)->find()) { //失败 $res = false !== User::bcInc($userInfo['uid'], 'now_money', $order['pay_money'], 'uid'); $res = $res && UserBill::income('购币失败', $userInfo['uid'], 'now_money', 'buy_fail', $order['pay_money'], $order['id'], $userInfo['now_money'] + $order['pay_money'], '购币失败(已有更早的完成订单),支付金额转入余额,可购买其他人的挂卖或提现。'); } else { //成功 $info = CashTradeOrder::where('id', $order['bind_order'])->find(); if (!$info) { return self::setErrorInfo('未找到订单'); } if ($info['status'] == 1) { $res = false !== User::bcInc($userInfo['uid'], 'now_money', $order['pay_money'], 'uid'); $res = $res && UserBill::income('购币失败', $userInfo['uid'], 'now_money', 'buy_fail', $order['pay_money'], $order['id'], $userInfo['now_money'] + $order['pay_money'], '购币失败(已有更早的完成订单),支付金额转入余额,可购买其他人的挂卖或提现。'); } else { $res = CashTradeOrder::where('id', $order['bind_order'])->update([ 'status' => 1, 'trade_uid' => $order['uid'], 'trade_way' => $order['pay_type'], 'trade_time' => time(), ]); $userInfo = User::getUserInfo($info['uid']); $res = $res && UserMoney::incomeMoney($order['uid'], $order['money_type'], $order['money_num'], '购币成功', 'buy_success', '购币成功,出售方' . $info['uid']); $res = $res && (false !== User::bcInc($userInfo['uid'], 'now_money', $order['pay_money'], 'uid')); $res = $res && UserBill::income('售币成功', $userInfo['uid'], 'now_money', 'sale_success', $order['pay_money'], $order['id'], $userInfo['now_money'] + $order['pay_money'], '售币成功,购买方:' . $order['uid']); $res = $res && self::where('order_id', $orderId)->update(['status' => 1]); } } } return false !== $res; } }