1
0

PaymentController.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Components\Yzy;
  4. use App\Http\Models\Coupon;
  5. use App\Http\Models\Goods;
  6. use App\Http\Models\Order;
  7. use App\Http\Models\Payment;
  8. use App\Http\Models\PaymentCallback;
  9. use Illuminate\Http\Request;
  10. use Response;
  11. use Redirect;
  12. use Session;
  13. use Log;
  14. use DB;
  15. class PaymentController extends Controller
  16. {
  17. // 创建支付单
  18. public function create(Request $request)
  19. {
  20. $goods_id = intval($request->get('goods_id'));
  21. $coupon_sn = $request->get('coupon_sn');
  22. $user = Session::get('user');
  23. $goods = Goods::query()->where('id', $goods_id)->where('status', 1)->first();
  24. if (!$goods) {
  25. return Response::json(['status' => 'fail', 'data' => '', 'message' => '创建支付单失败:商品或服务已下架']);
  26. }
  27. // 判断是否开启有赞云支付
  28. if (!$this->systemConfig['is_youzan']) {
  29. return Response::json(['status' => 'fail', 'data' => '', 'message' => '创建支付单失败:系统并未开启在线支付功能']);
  30. }
  31. // 判断是否存在同个商品的未支付订单
  32. $existsOrder = Order::query()->where('goods_id', $goods_id)->where('status', 0)->where('user_id', $user['id'])->first();
  33. if ($existsOrder) {
  34. return Response::json(['status' => 'fail', 'data' => '', 'message' => '创建支付单失败:尚有未支付的订单,请先去支付']);
  35. }
  36. // 限购控制
  37. $strategy = $this->systemConfig['goods_purchase_limit_strategy'];
  38. if ($strategy == 'all' || ($strategy == 'free' && $goods->price == 0)) {
  39. // 判断是否已经购买过该商品
  40. $none_expire_good_exist = Order::query()->where('user_id', $user['id'])->where('goods_id', $goods_id)->where('is_expire', 0)->exists();
  41. if ($none_expire_good_exist) {
  42. return Response::json(['status' => 'fail', 'data' => '', 'message' => '创建支付单失败:商品不可重复购买']);
  43. }
  44. }
  45. // 使用优惠券
  46. if ($coupon_sn) {
  47. $coupon = Coupon::query()->where('sn', $coupon_sn)->whereIn('type', [1, 2])->where('is_del', 0)->where('status', 0)->first();
  48. if (!$coupon) {
  49. return Response::json(['status' => 'fail', 'data' => '', 'message' => '创建支付单失败:优惠券不存在']);
  50. }
  51. // 计算实际应支付总价
  52. $amount = $coupon->type == 2 ? $goods->price * $coupon->discount / 10 : $goods->price - $coupon->amount;
  53. $amount = $amount > 0 ? $amount : 0;
  54. } else {
  55. $amount = $goods->price;
  56. }
  57. // 如果最后总价格为0,则不允许创建支付单
  58. if ($amount <= 0) {
  59. return Response::json(['status' => 'fail', 'data' => '', 'message' => '创建支付单失败:合计价格为0,无需使用在线支付']);
  60. }
  61. DB::beginTransaction();
  62. try {
  63. $user = Session::get('user');
  64. $orderSn = date('ymdHis') . mt_rand(100000, 999999);
  65. $sn = makeRandStr(12);
  66. // 生成订单
  67. $order = new Order();
  68. $order->order_sn = $orderSn;
  69. $order->user_id = $user['id'];
  70. $order->goods_id = $goods_id;
  71. $order->coupon_id = !empty($coupon) ? $coupon->id : 0;
  72. $order->origin_amount = $goods->price;
  73. $order->amount = $amount;
  74. $order->expire_at = date("Y-m-d H:i:s", strtotime("+" . $goods->days . " days"));
  75. $order->is_expire = 0;
  76. $order->pay_way = 2;
  77. $order->status = 0;
  78. $order->save();
  79. // 生成支付单
  80. $yzy = new Yzy();
  81. $result = $yzy->createQrCode($goods->name, $amount * 100, $orderSn);
  82. if (isset($result['error_response'])) {
  83. Log::error('【有赞云】创建二维码失败:' . $result['error_response']['msg']);
  84. throw new \Exception($result['error_response']['msg']);
  85. }
  86. $payment = new Payment();
  87. $payment->sn = $sn;
  88. $payment->user_id = $user['id'];
  89. $payment->oid = $order->oid;
  90. $payment->order_sn = $orderSn;
  91. $payment->pay_way = 1;
  92. $payment->amount = $amount;
  93. $payment->qr_id = $result['response']['qr_id'];
  94. $payment->qr_url = $result['response']['qr_url'];
  95. $payment->qr_code = $result['response']['qr_code'];
  96. $payment->qr_local_url = $this->base64ImageSaver($result['response']['qr_code']);
  97. $payment->status = 0;
  98. $payment->save();
  99. // 优惠券置为已使用
  100. if (!empty($coupon)) {
  101. Coupon::query()->where('id', $coupon->id)->update(['status' => 1]);
  102. }
  103. DB::commit();
  104. return Response::json(['status' => 'success', 'data' => $sn, 'message' => '创建支付单成功,正在转到付款页面,请稍后']);
  105. } catch (\Exception $e) {
  106. DB::rollBack();
  107. Log::error('创建支付订单失败:' . $e->getMessage());
  108. return Response::json(['status' => 'fail', 'data' => '', 'message' => '创建支付单失败:' . $e->getMessage()]);
  109. }
  110. }
  111. // 支付单详情
  112. public function detail(Request $request, $sn)
  113. {
  114. if (empty($sn)) {
  115. return Redirect::to('user/goodsList');
  116. }
  117. $user = Session::get('user');
  118. $payment = Payment::query()->with(['order', 'order.goods'])->where('sn', $sn)->where('user_id', $user['id'])->first();
  119. if (!$payment) {
  120. return Redirect::to('user/goodsList');
  121. }
  122. $order = Order::query()->where('oid', $payment->oid)->first();
  123. if (!$order) {
  124. Session::flash('errorMsg', '订单不存在');
  125. return Response::view('payment/' . $sn);
  126. }
  127. $view['payment'] = $payment;
  128. $view['website_logo'] = $this->systemConfig['website_logo'];
  129. $view['website_analytics'] = $this->systemConfig['website_analytics'];
  130. $view['website_customer_service'] = $this->systemConfig['website_customer_service'];
  131. return Response::view('payment/detail', $view);
  132. }
  133. // 获取订单支付状态
  134. public function getStatus(Request $request)
  135. {
  136. $sn = $request->get('sn');
  137. if (empty($sn)) {
  138. return Response::json(['status' => 'fail', 'data' => '', 'message' => '请求失败']);
  139. }
  140. $user = Session::get('user');
  141. $payment = Payment::query()->where('sn', $sn)->where('user_id', $user['id'])->first();
  142. if (!$payment) {
  143. return Response::json(['status' => 'fail', 'data' => '', 'message' => '支付失败']);
  144. }
  145. if ($payment->status) {
  146. return Response::json(['status' => 'success', 'data' => '', 'message' => '支付成功']);
  147. } else if ($payment->status < 0) {
  148. return Response::json(['status' => 'fail', 'data' => '', 'message' => '支付失败']);
  149. } else {
  150. return Response::json(['status' => 'fail', 'data' => '', 'message' => '等待支付']);
  151. }
  152. }
  153. // 有赞云回调日志
  154. public function callbackList(Request $request)
  155. {
  156. $status = $request->get('status', 0);
  157. $query = PaymentCallback::query();
  158. if ($status) {
  159. $query->where('status', $status);
  160. }
  161. $view['list'] = $query->orderBy('id', 'desc')->paginate(10);
  162. return Response::view('payment/callbackList', $view);
  163. }
  164. }