NotifyController.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <?php
  2. namespace addons\TinyShop\api\modules\v1\controllers;
  3. use Yii;
  4. use common\traits\PayNotify;
  5. use common\enums\PayTypeEnum;
  6. use common\helpers\ArrayHelper;
  7. use common\forms\CreditsLogForm;
  8. use common\models\extend\PayLog;
  9. use api\controllers\OnAuthController;
  10. use addons\TinyShop\common\enums\ShippingTypeEnum;
  11. use addons\TinyShop\common\models\order\Order;
  12. use addons\TinyShop\common\enums\PayGroupEnum;
  13. /**
  14. * Class NotifyController
  15. * @package addons\TinyShop\api\modules\v1\controllers
  16. * @author jianyan74 <751393839@qq.com>
  17. */
  18. class NotifyController extends OnAuthController
  19. {
  20. use PayNotify;
  21. public $modelClass = '';
  22. /**
  23. * 不用进行登录验证的方法
  24. *
  25. * 例如: ['index', 'update', 'create', 'view', 'delete']
  26. * 默认全部需要验证
  27. *
  28. * @var array
  29. */
  30. protected $authOptional = ['wechat', 'alipay', 'union', 'byte-dance', 'stripe'];
  31. /**
  32. * @param $action
  33. * @return bool
  34. * @throws \yii\base\InvalidConfigException
  35. * @throws \yii\web\BadRequestHttpException
  36. * @throws \yii\web\ForbiddenHttpException
  37. */
  38. public function beforeAction($action)
  39. {
  40. // 非格式化返回
  41. Yii::$app->params['triggerBeforeSend'] = false;
  42. return parent::beforeAction($action);
  43. }
  44. /**
  45. * 支付回调
  46. *
  47. * @param PayLog $log
  48. * @throws \yii\web\NotFoundHttpException
  49. * @throws \yii\web\UnprocessableEntityHttpException
  50. */
  51. public function notify(PayLog $log)
  52. {
  53. $log->pay_ip = Yii::$app->request->userIP;
  54. $log->save();
  55. switch ($log->order_group) {
  56. case PayGroupEnum::ORDER :
  57. $order = Yii::$app->tinyShopService->order->findByOrderSn($log->order_sn);
  58. Yii::$app->tinyShopService->order->pay($order, $log->pay_type, true);
  59. // 记录消费日志
  60. $member = Yii::$app->services->member->findById($log->member_id);
  61. Yii::$app->services->memberCreditsLog->consumeMoney(new CreditsLogForm([
  62. 'member' => $member,
  63. 'num' => $log->pay_fee,
  64. 'group' => 'orderPay',
  65. 'pay_type' => $log->pay_type,
  66. 'remark' => "订单支付-" . $order->order_sn,
  67. 'map_id' => $log->id,
  68. ]));
  69. // 订单收货
  70. if ($order->shipping_type == ShippingTypeEnum::TO_STORE) {
  71. Yii::$app->tinyShopService->order->virtualTakeDelivery($order);
  72. }
  73. break;
  74. case PayGroupEnum::ORDER_UNITE :
  75. $member = Yii::$app->services->member->get($log['member_id']);
  76. /** @var Order $order */
  77. $order = Yii::$app->tinyShopService->order->findByOrderSn($log->order_sn);
  78. // 充值
  79. $this->recharge($member, $log);
  80. // 扣除余额
  81. Yii::$app->services->memberCreditsLog->decrMoney(new CreditsLogForm([
  82. 'member' => Yii::$app->services->member->findById($log->member_id),
  83. 'num' => $order->pay_money,
  84. 'group' => 'orderPay',
  85. 'map_id' => $order->id,
  86. 'remark' => '订单支付-' . $order->order_sn,
  87. 'is_consume' => true
  88. ]));
  89. // 支付订单
  90. Yii::$app->tinyShopService->order->pay($order, PayTypeEnum::USER_MONEY, true);
  91. break;
  92. case PayGroupEnum::ORDER_BATCH :
  93. // 待支付列表
  94. $orders = Yii::$app->tinyShopService->order->findByUniteNo($log->order_sn);
  95. /** @var Order $order */
  96. foreach ($orders as $order) {
  97. // 建立新的关联
  98. $logModel = new PayLog();
  99. $logModel->attributes = ArrayHelper::toArray($log);
  100. $logModel->pay_fee = $order->pay_money;
  101. $logModel->total_fee = $order->pay_money;
  102. $logModel->order_sn = $order->order_sn;
  103. $logModel->save();
  104. // 记录消费日志
  105. Yii::$app->services->memberCreditsLog->consumeMoney(new CreditsLogForm([
  106. 'member' => Yii::$app->services->member->findById($logModel->member_id),
  107. 'num' => $logModel->pay_fee,
  108. 'group' => 'orderPay',
  109. 'pay_type' => $logModel->pay_type,
  110. 'remark' => "订单支付-" . $logModel->order_sn,
  111. 'map_id' => $logModel->id,
  112. ]));
  113. // 订单支付
  114. Yii::$app->tinyShopService->order->pay($order, $logModel->pay_type, true);
  115. // 批量支付交易单号
  116. Order::updateAll(['out_trade_no' => $log->order_sn], ['id' => $order->id]);
  117. }
  118. break;
  119. case PayGroupEnum::ORDER_UNITE_BATCH :
  120. $member = Yii::$app->services->member->get($log['member_id']);
  121. // 充值
  122. $this->recharge($member, $log);
  123. // 待支付列表
  124. $orders = Yii::$app->tinyShopService->order->findByUniteNo($log->order_sn);
  125. /** @var Order $order */
  126. foreach ($orders as $order) {
  127. // 建立新的关联
  128. $logModel = new PayLog();
  129. $logModel->attributes = ArrayHelper::toArray($log);
  130. $logModel->pay_fee = $order->pay_money;
  131. $logModel->total_fee = $order->pay_money;
  132. $logModel->order_sn = $order->order_sn;
  133. $logModel->save();
  134. // 扣除余额
  135. Yii::$app->services->memberCreditsLog->decrMoney(new CreditsLogForm([
  136. 'member' => Yii::$app->services->member->findById($log->member_id),
  137. 'num' => $logModel->pay_fee,
  138. 'group' => 'orderPay',
  139. 'map_id' => $logModel->id,
  140. 'remark' => '订单支付-' . $logModel->order_sn,
  141. 'is_consume' => true
  142. ]));
  143. // 订单支付
  144. Yii::$app->tinyShopService->order->pay($order, PayTypeEnum::USER_MONEY, true);
  145. // 批量支付交易单号
  146. Order::updateAll(['out_trade_no' => $log->order_sn], ['id' => $order['id']]);
  147. }
  148. break;
  149. case PayGroupEnum::RECHARGE :
  150. $member = Yii::$app->services->member->get($log['member_id']);
  151. $order = Yii::$app->tinyShopService->orderRecharge->findByOrderSn($log->order_sn);
  152. Yii::$app->tinyShopService->orderRecharge->pay($order, $member, $log->pay_type);
  153. // 充值
  154. $this->recharge($member, $log);
  155. break;
  156. }
  157. }
  158. /**
  159. * 充值
  160. *
  161. * @param $member
  162. * @param $log
  163. * @param $payFee
  164. * @throws \yii\web\NotFoundHttpException
  165. */
  166. public function recharge($member, $log)
  167. {
  168. // 充值
  169. Yii::$app->services->memberCreditsLog->incrMoney(new CreditsLogForm([
  170. 'member' => $member,
  171. 'pay_type' => $log['pay_type'],
  172. 'num' => $log['pay_fee'],
  173. 'group' => 'recharge',
  174. 'remark' => "在线充值-" . $log['out_trade_no'],
  175. 'map_id' => $log['id'],
  176. ]));
  177. }
  178. }
粤ICP备19079148号