CreditMergePayController.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. /**
  3. * 单订单余额支付
  4. * Created by PhpStorm.
  5. * Author: 芸众商城 www.yunzshop.com
  6. * Date: 2017/4/17
  7. * Time: 上午10:57
  8. */
  9. namespace app\frontend\modules\order\controllers;
  10. use app\common\events\order\AfterOrderPaidRedirectEvent;
  11. use app\common\events\payment\ChargeComplatedEvent;
  12. use app\common\exceptions\AppException;
  13. use app\common\services\password\PasswordService;
  14. use app\common\services\PayFactory;
  15. use app\frontend\models\OrderPay;
  16. use app\frontend\modules\coupon\services\ShareCouponService;
  17. use app\common\helpers\Url;
  18. use app\common\models\Order;
  19. class CreditMergePayController extends MergePayController
  20. {
  21. /**
  22. * @return \Illuminate\Http\JsonResponse
  23. * @throws AppException
  24. * @throws \app\common\exceptions\PaymentException
  25. * @throws \app\common\exceptions\ShopException
  26. */
  27. public function credit2()
  28. {
  29. if (\Setting::get('shop.pay.credit') == false) {
  30. throw new AppException('商城未开启余额支付');
  31. }
  32. $this->checkPassword(\YunShop::app()->getMemberId());
  33. /**
  34. * @var OrderPay $orderPay
  35. */
  36. $orderPay = OrderPay::find(request()->input('order_pay_id'));
  37. // \Log::info('--orderPay', $orderPay);
  38. $result = $orderPay->getPayResult(PayFactory::PAY_CREDIT);
  39. // \Log::info('--result', $result);
  40. if (!$result) {
  41. throw new AppException('余额扣除失败,请联系客服');
  42. }
  43. try {
  44. // \Log::info('---step2------');
  45. $orderPay->pay();
  46. // \Log::info('---step3------');
  47. event(new ChargeComplatedEvent([
  48. 'order_pay_id' => $orderPay->id
  49. ]));
  50. } catch (\Exception $e) {
  51. $msg = $e->getMessage();
  52. \Log::debug('订单余额支付失败:', $msg);
  53. throw new AppException($msg);
  54. }
  55. // \Log::info('---step4----');
  56. $trade = \Setting::get('shop.trade');
  57. // \Log::info('---trade-----', $trade);
  58. $redirect = $admin_set_redirect = '';
  59. if (!is_null($trade) && isset($trade['redirect_url']) && !empty($trade['redirect_url'])) {
  60. $redirect = $trade['redirect_url'];
  61. preg_match("/^(http:\/\/)?([^\/]+)/i", $trade['redirect_url'], $matches);
  62. $host = $matches[2];
  63. // 从主机名中取得后面两段
  64. preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
  65. if ($matches){//判断域名是否一致
  66. $redirect = $trade['redirect_url'].'&outtradeno='.request()->input('order_pay_id');
  67. }
  68. $admin_set_redirect = $trade['redirect_url'].'&outtradeno='.request()->input('order_pay_id');//后台设置跳转链接
  69. }
  70. $share_bool = ShareCouponService::showIndex($orderPay->order_ids, \YunShop::app()->getMemberId());
  71. if ($share_bool) {
  72. $ids = rtrim(implode('_', $orderPay->order_ids), '_');
  73. $redirect = Url::absoluteApp('coupon/share/'.$ids, ['i' => \YunShop::app()->uniacid, 'mid'=> \YunShop::app()->getMemberId()]);
  74. }
  75. $orders = Order::whereIn('id', $orderPay->order_ids)->get();
  76. event($event = new AfterOrderPaidRedirectEvent($orders,$orderPay->id));
  77. $redirect = $event->getData()['redirect']?:$redirect;
  78. return $this->successJson('成功', ['redirect' => $redirect]);
  79. }
  80. /**
  81. * @param int $uid
  82. * @return bool|void
  83. * @throws AppException
  84. * @throws \app\common\exceptions\PaymentException
  85. */
  86. protected function checkPassword($uid)
  87. {
  88. if (!$this->needPassword()) return true;
  89. $this->validate([
  90. 'payment_password' => 'required'
  91. ]);
  92. return (new PasswordService())->checkPayPassword($uid, request()->input('payment_password'));
  93. }
  94. protected function needPassword()
  95. {
  96. return (new PasswordService())->isNeed('balance', 'pay');
  97. }
  98. }