CashTradeOrderPayment.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <?php
  2. namespace app\models\trade;
  3. use app\models\user\User;
  4. use app\models\user\UserBill;
  5. use app\models\user\UserMoney;
  6. use app\models\user\UserMoneyOrder;
  7. use crmeb\repositories\PaymentRepositories;
  8. use crmeb\traits\ModelTrait;
  9. use crmeb\basic\BaseModel;
  10. use think\db\exception\DataNotFoundException;
  11. use think\db\exception\DbException;
  12. use think\db\exception\ModelNotFoundException;
  13. use think\Exception;
  14. use think\Model;
  15. class CashTradeOrderPayment extends BaseModel
  16. {
  17. /**
  18. * 数据表主键
  19. * @var string
  20. */
  21. protected $pk = 'id';
  22. /**
  23. * 模型名称
  24. * @var string
  25. */
  26. protected $name = 'cash_trade_order_payment';
  27. use ModelTrait;
  28. public static function jsPayPrice($order_id, $uid)
  29. {
  30. $orderInfo = self::where('uid', $uid)->where('order_id', $order_id)->find();
  31. if (!$orderInfo) return self::setErrorInfo('订单不存在!');
  32. if ($orderInfo['paid']) return self::setErrorInfo('该订单已支付!');
  33. $userInfo = User::getUserInfo($uid);
  34. self::beginTrans();
  35. $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 ? '挂买币' : '购买币');
  36. $res2 = self::paySuccess($order_id, 'weixin');//微信支付为0时
  37. $res = $res1 && $res2;
  38. self::checkTrans($res);
  39. return $res;
  40. }
  41. /**
  42. * 余额支付
  43. * @param $order_id
  44. * @param $uid
  45. * @param string $formId
  46. * @return bool
  47. * @throws DataNotFoundException
  48. * @throws ModelNotFoundException
  49. * @throws DbException
  50. */
  51. public static function yuePay($order_id, $uid, $formId = '')
  52. {
  53. $orderInfo = self::where('uid', $uid)->where('order_id', $order_id)->find();
  54. if (!$orderInfo) return self::setErrorInfo('订单不存在!');
  55. if ($orderInfo['paid']) return self::setErrorInfo('该订单已支付!');
  56. $userInfo = User::getUserInfo($uid);
  57. if ($userInfo['now_money'] < $orderInfo['pay_money'])
  58. return self::setErrorInfo(['status' => 'pay_deficiency', 'msg' => '余额不足' . floatval($orderInfo['pay_money'])]);
  59. self::beginTrans();
  60. $res1 = false !== User::bcDec($uid, 'now_money', $orderInfo['pay_money'], 'uid');
  61. $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 ? '挂买币' : '购买币');
  62. $res3 = self::paySuccess($order_id, 'yue');//余额支付成功
  63. $res = $res1 && $res2 && $res3;
  64. self::checkTrans($res);
  65. return $res;
  66. }
  67. public static function getOrderId()
  68. {
  69. list($msec, $sec) = explode(' ', microtime());
  70. $msectime = number_format((floatval($msec) + floatval($sec)) * 1000, 0, '', '');
  71. do {
  72. $str = 'cp' . $msectime . mt_rand(10000, 99999);
  73. } while (self::be(['order_id' => $str]));
  74. return $str;
  75. }
  76. public static function paySuccess($orderId, $paytype = 'weixin')
  77. {
  78. $order = self::where('order_id', $orderId)->find();
  79. $res = self::where('order_id', $orderId)->update(['paid' => 1, 'pay_type' => $paytype, 'pay_time' => time()]);//订单改为支付
  80. $now_money = User::where('uid', $order['uid'])->value('now_money');
  81. $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 ? '挂买币' : '购买币');
  82. if ($order['order_type'] == 1) {
  83. //生成挂买订单
  84. $order_info = json_decode($order['order_info'], true);
  85. $res2 = CashTradeOrder::create(array_merge(
  86. [
  87. 'order_id' => CashTradeOrder::getOrderId(),
  88. 'add_time' => time(),
  89. 'end_time' => bcadd(time(), bcmul($order_info['hang_time'], 3600)),
  90. ],
  91. $order_info));
  92. $res = $res && $res2 && self::where('order_id', $orderId)->update(['status' => 1, 'bind_order' => $res2['id']]);
  93. } else {
  94. //购买
  95. $userInfo = User::getUserInfo($order['uid']);
  96. if (self::where('bind_order', $order['bind_order'])->where('pay_time', '<', time())->where('id', '<>', $orderId)->find()) {
  97. //失败
  98. $res = false !== User::bcInc($userInfo['uid'], 'now_money', $order['pay_money'], 'uid');
  99. $res = $res && UserBill::income('购币失败', $userInfo['uid'], 'now_money', 'buy_fail', $order['pay_money'], $order['id'], $userInfo['now_money'] + $order['pay_money'], '购币失败(已有更早的完成订单),支付金额转入余额,可购买其他人的挂卖或提现。');
  100. } else {
  101. //成功
  102. $info = CashTradeOrder::where('id', $order['bind_order'])->find();
  103. if (!$info) {
  104. return self::setErrorInfo('未找到订单');
  105. }
  106. if ($info['status'] == 1) {
  107. $res = false !== User::bcInc($userInfo['uid'], 'now_money', $order['pay_money'], 'uid');
  108. $res = $res && UserBill::income('购币失败', $userInfo['uid'], 'now_money', 'buy_fail', $order['pay_money'], $order['id'], $userInfo['now_money'] + $order['pay_money'], '购币失败(已有更早的完成订单),支付金额转入余额,可购买其他人的挂卖或提现。');
  109. } else {
  110. $res = CashTradeOrder::where('id', $order['bind_order'])->update([
  111. 'status' => 1,
  112. 'trade_uid' => $order['uid'],
  113. 'trade_way' => $order['pay_type'],
  114. 'trade_time' => time(),
  115. ]);
  116. $userInfo = User::getUserInfo($info['uid']);
  117. $res = $res && UserMoney::incomeMoney($order['uid'], $order['money_type'], $order['money_num'], '购币成功', 'buy_success', '购币成功,出售方' . $info['uid']);
  118. $res = $res && (false !== User::bcInc($userInfo['uid'], 'now_money', $order['pay_money'], 'uid'));
  119. $res = $res && UserBill::income('售币成功', $userInfo['uid'], 'now_money', 'sale_success', $order['pay_money'], $order['id'], $userInfo['now_money'] + $order['pay_money'], '售币成功,购买方:' . $order['uid']);
  120. $res = $res && self::where('order_id', $orderId)->update(['status' => 1]);
  121. }
  122. }
  123. }
  124. return false !== $res;
  125. }
  126. }