PayController.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <?php
  2. namespace addons\TinyShop\api\modules\v1\controllers\common;
  3. use Yii;
  4. use yii\web\UnprocessableEntityHttpException;
  5. use common\forms\PayForm;
  6. use common\helpers\Url;
  7. use common\helpers\ResultHelper;
  8. use common\enums\PayTypeEnum;
  9. use common\enums\StatusEnum;
  10. use common\forms\CreditsLogForm;
  11. use api\controllers\OnAuthController;
  12. use addons\TinyShop\common\forms\OrderBatchPayFrom;
  13. use addons\TinyShop\common\forms\OrderPayFrom;
  14. use addons\TinyShop\common\forms\OrderUnitePayFrom;
  15. use addons\TinyShop\common\forms\OrderUniteBatchPayFrom;
  16. use addons\TinyShop\common\forms\RechargePayFrom;
  17. use addons\TinyShop\common\enums\PayGroupEnum;
  18. use addons\TinyShop\common\models\order\Order;
  19. /**
  20. * Class PayController
  21. * @package addons\TinyShop\api\modules\v1\controllers\common
  22. */
  23. class PayController extends OnAuthController
  24. {
  25. /**
  26. * @var PayForm
  27. */
  28. public $modelClass = PayForm::class;
  29. /**
  30. * @return array|mixed|\yii\db\ActiveRecord
  31. */
  32. public function actionCreate()
  33. {
  34. /* @var $payForm PayForm */
  35. $payForm = new $this->modelClass();
  36. $payForm->attributes = Yii::$app->request->post();
  37. $payForm->member_id = Yii::$app->user->identity->member_id;
  38. $payForm->code = Yii::$app->request->get('code');
  39. if (!$payForm->validate()) {
  40. return ResultHelper::json(422, $this->getError($payForm));
  41. }
  42. // 非余额支付
  43. if ($payForm->pay_type != PayTypeEnum::USER_MONEY) {
  44. // 执行方法
  45. $payForm->setHandlers([
  46. // 订单
  47. 'order' => OrderPayFrom::class, // 订单
  48. 'orderUnite' => OrderUnitePayFrom::class, // 订单混合支付
  49. 'orderBatch' => OrderBatchPayFrom::class, // 订单批量支付
  50. 'orderUniteBatch' => OrderUniteBatchPayFrom::class, // 订单批量混合支付
  51. // 其他
  52. 'recharge' => RechargePayFrom::class, // 充值
  53. ]);
  54. // 回调方法
  55. $payForm->notify_url = Url::removeMerchantIdUrl('toApi', ['v1/notify/' . PayTypeEnum::action($payForm->pay_type)]);
  56. // $payForm->return_url = '支付宝PC/H5跳转地址';
  57. // 生成配置
  58. return ResultHelper::json(200, '待支付', [
  59. 'payStatus' => false,
  60. 'config' => $payForm->getConfig(),
  61. ]);
  62. }
  63. /*---------------------------------------------------------------------------*/
  64. /********************************** 余额支付 *********************************/
  65. /*---------------------------------------------------------------------------*/
  66. $config = Yii::$app->tinyShopService->config->setting();
  67. if ($config->order_balance_pay == StatusEnum::DISABLED) {
  68. throw new UnprocessableEntityHttpException('不支持余额支付');
  69. }
  70. // 开启事务
  71. $transaction = Yii::$app->db->beginTransaction();
  72. try {
  73. switch ($payForm->order_group) {
  74. // 订单支付
  75. case PayGroupEnum::ORDER ;
  76. /** @var Order $order */
  77. if (
  78. empty($payForm->data['order_id']) ||
  79. empty($order = Yii::$app->tinyShopService->order->findById($payForm->data['order_id']))
  80. ) {
  81. throw new UnprocessableEntityHttpException('找不到订单');
  82. }
  83. $this->balancePay($payForm, $order, $payForm->order_group);
  84. break;
  85. // 订单批量支付
  86. case PayGroupEnum::ORDER_BATCH ;
  87. if (empty($payForm->data['unite_no'])) {
  88. throw new UnprocessableEntityHttpException('找不到订单');
  89. }
  90. $orders = Yii::$app->tinyShopService->order->findByUniteNo($payForm->data['unite_no']);
  91. /** @var Order $order */
  92. foreach ($orders as $order) {
  93. Yii::$app->services->merchant->setId('');
  94. $this->balancePay($payForm, $order, $payForm->order_group);
  95. }
  96. break;
  97. default :
  98. throw new UnprocessableEntityHttpException('订单类型错误');
  99. }
  100. $transaction->commit();
  101. return ResultHelper::json(200, '支付成功', [
  102. 'payStatus' => true,
  103. ]);
  104. } catch (\Exception $e) {
  105. $transaction->rollBack();
  106. return ResultHelper::json(422, YII_DEBUG ? Yii::$app->services->base->getErrorInfo($e) : $e->getMessage());
  107. }
  108. }
  109. /**
  110. * @param PayForm $payForm
  111. * @param Order $order
  112. * @param $order_group
  113. * @throws UnprocessableEntityHttpException
  114. * @throws \yii\web\NotFoundHttpException
  115. */
  116. protected function balancePay(PayForm $payForm, Order $order, $order_group)
  117. {
  118. $pay_money = $order->pay_money;
  119. // 扣除余额
  120. $member = Yii::$app->services->member->findById($payForm->member_id);
  121. Yii::$app->services->memberCreditsLog->decrMoney(new CreditsLogForm([
  122. 'member' => $member,
  123. 'num' => $pay_money,
  124. 'group' => 'orderCreate',
  125. 'map_id' => $order->id,
  126. 'remark' => '订单支付-' . $order->order_sn,
  127. 'is_consume' => true,
  128. ]));
  129. Yii::$app->tinyShopService->order->pay($order, PayTypeEnum::USER_MONEY);
  130. }
  131. }
粤ICP备19079148号