TemplateService.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <?php
  2. namespace backend\modules\mall\services;
  3. use common\enums\AliPayPayTypeEnum;
  4. use common\enums\PayTypeEnum;
  5. use common\enums\WechatPayTypeEnum;
  6. use common\models\common\PaymentTrade;
  7. use common\models\diy\DiyMallTemplate;
  8. use common\models\diy\DiyTemplate;
  9. use common\models\diy\DiyTemplateOrder;
  10. use Yii;
  11. /**
  12. * 模板市场
  13. * @package backend\modules\mall\services
  14. */
  15. class TemplateService extends BaseService
  16. {
  17. /**
  18. * 创建购买模板订单
  19. *
  20. * @param integer $id
  21. * @param integer $index
  22. * @return int
  23. */
  24. public function createOrder(int $id, int $index)
  25. {
  26. $template = DiyTemplate::getTemplateById($id);
  27. if (empty($template)) return $this->error('模板不存在');
  28. /* 判断当前插件是否已经购买 */
  29. $mall_tamplate = DiyMallTemplate::getMallTemplateById($this->mall_id, $id);
  30. if ($mall_tamplate && $mall_tamplate->isPermanent()) return $this->error('您已经永久持有本模板');
  31. // 获取选择购买的
  32. $item = $template->getCurrentItem($index);
  33. if (empty($item)) return $this->error('所选购买规则不存在');
  34. $res = DiyTemplateOrder::createOrder($this->mall_id, $template, $item);
  35. if (!$res) return $this->error('创建订单失败');
  36. // 拆分
  37. list($order, $order_trade) = $res;
  38. $data['order'] = $order;
  39. if ($order->pay_money > 0) {
  40. // 获取交易订单信息
  41. $trade = Yii::$app->services->pay->getByTradeNo($order_trade['trade_no']);
  42. // 获取支付方式
  43. if (!empty($trade)) {
  44. $payment_arr = $this->getPaymentArr([1, 2], $trade);
  45. $data['payment_arr'] = $payment_arr;
  46. }
  47. }
  48. // 当前模板免费
  49. if ($order->pay_money == 0) {
  50. // 订单支付
  51. $order->paid();
  52. // 续费模板
  53. $service = new TemplateService(['mall_id' => $order->mall_id]);
  54. $service->renewTemplate($order->template_id, $order->duration);
  55. }
  56. $order->setPayData($order_trade['trade_no'] ?? '', json_encode(['payment_arr' => $payment_arr ?? []]));
  57. return $order->id;
  58. }
  59. /**
  60. * 获取支付数据
  61. *
  62. * @param integer $id
  63. * @return array|false
  64. */
  65. public function getPayData(int $id)
  66. {
  67. $data = DiyTemplateOrder::getOrderPayDataById($this->mall_id, $id);
  68. if (empty($data)) return $this->error('订单不存在');
  69. // template
  70. $template = $data->template->toArray();
  71. $data = $data->toArray();
  72. $data['template'] = $template;
  73. $data['extra_info'] = json_decode($data['extra_info']);
  74. return $data;
  75. }
  76. /**
  77. * @param array $payment_type
  78. * @param PaymentTrade $trade
  79. * @return array
  80. */
  81. protected function getPaymentArr($payment_type, $trade)
  82. {
  83. $payment_arr = [];
  84. $payment_map = PayTypeEnum::getMap();
  85. foreach ($payment_type as $type) {
  86. switch ($type) {
  87. case PayTypeEnum::WECHAT :
  88. // 生成微信支付二维码地址
  89. $payment_arr[] = [
  90. 'payment_url' => Yii::$app->services->pay->wechat($trade, WechatPayTypeEnum::NATIVE),
  91. 'payment_way' => 'scan',// 扫码支付
  92. 'payment_name' => $payment_map[$type],
  93. ];
  94. break;
  95. case PayTypeEnum::ALI :
  96. $backend_domain = \Yii::$app->services->setting->platform->get('system.backend_url');
  97. // 生成支付宝支付地址
  98. $alipay = Yii::$app->services->pay->alipay($trade, AliPayPayTypeEnum::PC, [
  99. 'return_url' => $backend_domain . '/index.php?r=mall/diy/paid',
  100. ]);
  101. if (empty($alipay['config'])) throw new \Exception('支付宝扫码地址获取失败');
  102. $payment_arr[] = [
  103. 'payment_url' => $alipay['config'],
  104. 'payment_way' => 'navigate',// 链接跳转
  105. 'payment_name' => $payment_map[$type],
  106. ];
  107. break;
  108. }
  109. }
  110. return $payment_arr;
  111. }
  112. /**
  113. * 续费自定义模板时长(不是续费情况下增加模板)
  114. *
  115. * @param integer $id 模板ID
  116. * @param integer $duration 续费时长(单位月 -1代表永久)
  117. * @return boolean
  118. */
  119. public function renewTemplate(int $id, int $duration)
  120. {
  121. $mall_tamplate = DiyMallTemplate::getMallTemplateById($this->mall_id, $id);
  122. if (empty($mall_tamplate)) {
  123. // 模板信息
  124. $template = DiyTemplate::getTemplateById($id);
  125. if (empty($template)) return $this->error('模板不存在');
  126. DiyMallTemplate::addTemplate($template, $this->mall_id, $duration);
  127. } else {
  128. $mall_tamplate->renewTemplate($duration);
  129. }
  130. }
  131. }