| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- <?php
- namespace backend\modules\mall\services;
- use common\enums\AliPayPayTypeEnum;
- use common\enums\PayTypeEnum;
- use common\enums\WechatPayTypeEnum;
- use common\models\common\PaymentTrade;
- use common\models\diy\DiyMallTemplate;
- use common\models\diy\DiyTemplate;
- use common\models\diy\DiyTemplateOrder;
- use Yii;
- /**
- * 模板市场
- * @package backend\modules\mall\services
- */
- class TemplateService extends BaseService
- {
- /**
- * 创建购买模板订单
- *
- * @param integer $id
- * @param integer $index
- * @return int
- */
- public function createOrder(int $id, int $index)
- {
- $template = DiyTemplate::getTemplateById($id);
- if (empty($template)) return $this->error('模板不存在');
- /* 判断当前插件是否已经购买 */
- $mall_tamplate = DiyMallTemplate::getMallTemplateById($this->mall_id, $id);
- if ($mall_tamplate && $mall_tamplate->isPermanent()) return $this->error('您已经永久持有本模板');
- // 获取选择购买的
- $item = $template->getCurrentItem($index);
- if (empty($item)) return $this->error('所选购买规则不存在');
- $res = DiyTemplateOrder::createOrder($this->mall_id, $template, $item);
- if (!$res) return $this->error('创建订单失败');
- // 拆分
- list($order, $order_trade) = $res;
- $data['order'] = $order;
- if ($order->pay_money > 0) {
- // 获取交易订单信息
- $trade = Yii::$app->services->pay->getByTradeNo($order_trade['trade_no']);
- // 获取支付方式
- if (!empty($trade)) {
- $payment_arr = $this->getPaymentArr([1, 2], $trade);
- $data['payment_arr'] = $payment_arr;
- }
- }
- // 当前模板免费
- if ($order->pay_money == 0) {
- // 订单支付
- $order->paid();
- // 续费模板
- $service = new TemplateService(['mall_id' => $order->mall_id]);
- $service->renewTemplate($order->template_id, $order->duration);
- }
- $order->setPayData($order_trade['trade_no'] ?? '', json_encode(['payment_arr' => $payment_arr ?? []]));
- return $order->id;
- }
- /**
- * 获取支付数据
- *
- * @param integer $id
- * @return array|false
- */
- public function getPayData(int $id)
- {
- $data = DiyTemplateOrder::getOrderPayDataById($this->mall_id, $id);
- if (empty($data)) return $this->error('订单不存在');
- // template
- $template = $data->template->toArray();
- $data = $data->toArray();
- $data['template'] = $template;
- $data['extra_info'] = json_decode($data['extra_info']);
- return $data;
- }
- /**
- * @param array $payment_type
- * @param PaymentTrade $trade
- * @return array
- */
- protected function getPaymentArr($payment_type, $trade)
- {
- $payment_arr = [];
- $payment_map = PayTypeEnum::getMap();
- foreach ($payment_type as $type) {
- switch ($type) {
- case PayTypeEnum::WECHAT :
- // 生成微信支付二维码地址
- $payment_arr[] = [
- 'payment_url' => Yii::$app->services->pay->wechat($trade, WechatPayTypeEnum::NATIVE),
- 'payment_way' => 'scan',// 扫码支付
- 'payment_name' => $payment_map[$type],
- ];
- break;
- case PayTypeEnum::ALI :
- $backend_domain = \Yii::$app->services->setting->platform->get('system.backend_url');
- // 生成支付宝支付地址
- $alipay = Yii::$app->services->pay->alipay($trade, AliPayPayTypeEnum::PC, [
- 'return_url' => $backend_domain . '/index.php?r=mall/diy/paid',
- ]);
- if (empty($alipay['config'])) throw new \Exception('支付宝扫码地址获取失败');
- $payment_arr[] = [
- 'payment_url' => $alipay['config'],
- 'payment_way' => 'navigate',// 链接跳转
- 'payment_name' => $payment_map[$type],
- ];
- break;
- }
- }
- return $payment_arr;
- }
- /**
- * 续费自定义模板时长(不是续费情况下增加模板)
- *
- * @param integer $id 模板ID
- * @param integer $duration 续费时长(单位月 -1代表永久)
- * @return boolean
- */
- public function renewTemplate(int $id, int $duration)
- {
- $mall_tamplate = DiyMallTemplate::getMallTemplateById($this->mall_id, $id);
- if (empty($mall_tamplate)) {
- // 模板信息
- $template = DiyTemplate::getTemplateById($id);
- if (empty($template)) return $this->error('模板不存在');
- DiyMallTemplate::addTemplate($template, $this->mall_id, $duration);
- } else {
- $mall_tamplate->renewTemplate($duration);
- }
- }
- }
|