AddonsOrder.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. <?php
  2. namespace common\models\addons;
  3. use common\enums\addons\AddonsOrderEnum;
  4. use common\enums\AliPayPayTypeEnum;
  5. use common\enums\PayTypeEnum;
  6. use common\enums\platform\PlatformEnum;
  7. use common\enums\WechatPayTypeEnum;
  8. use common\models\common\Addons;
  9. use common\models\mall\Mall;
  10. use common\models\order\Order;
  11. use common\models\platform\PlatformOrder;
  12. use common\models\platform\PlatformOrderStatisticsDay;
  13. use Yii;
  14. use yii\db\Exception;
  15. use yii\helpers\Json;
  16. /**
  17. * This is the model class for table "{{%addons_order}}".
  18. *
  19. * @property int $id 订单id
  20. * @property int $mall_id 商城ID
  21. * @property string $order_no 订单编号
  22. * @property string|null $out_trade_no 系统支付流水号
  23. * @property string $addons_name 应用名或标识
  24. * @property int $unit 周期单位[0=永久,1=月,2=年]
  25. * @property int $duration 周期时长
  26. * @property int $version 版本号
  27. * @property float|null $pay_money 订单实付金额
  28. * @property float|null $order_price 订单价格
  29. * @property int|null $order_status 订单状态
  30. * @property int|null $pay_status 订单付款状态[0=未支付,1=已支付]
  31. * @property int|null $payment_type 支付方式[1=微信,2=支付宝]
  32. * @property int|null $pay_time 订单付款时间
  33. * @property int|null $expire_time 订单过期时间
  34. * @property int|null $recommend_uid 推荐代理uid
  35. * @property int|null $operator_id 操作人ID
  36. * @property int|null $operator_username 操作人用户名称
  37. * @property string|null $extra_info 额外信息
  38. * @property int|null $status 状态[-1:删除;0:禁用;1启用]
  39. * @property int|null $created_at 创建时间
  40. * @property int|null $updated_at 更新时间
  41. * @property int|null $close_time 关闭时间
  42. */
  43. class AddonsOrder extends \common\models\base\BaseActiveRecord
  44. {
  45. /**
  46. * {@inheritdoc}
  47. */
  48. public static function tableName()
  49. {
  50. return '{{%addons_order}}';
  51. }
  52. /**
  53. * 无前缀表
  54. * @Author: lun
  55. * @DateTime: 2022/3/21 0021 10:23
  56. * @Copyright: copyright (c) 2021 广东七件事集团
  57. * @return string
  58. */
  59. public static function briefTableName()
  60. {
  61. return 'addons_order';
  62. }
  63. /**
  64. * {@inheritdoc}
  65. */
  66. public function rules()
  67. {
  68. return [
  69. [['mall_id', 'unit', 'duration','close_time', 'order_status', 'pay_status', 'payment_type', 'pay_time', 'expire_time', 'operator_id', 'recommend_uid', 'status', 'created_at', 'updated_at'], 'integer'],
  70. [['pay_money', 'order_price'], 'number'],
  71. [['extra_info', 'version', 'operator_username'], 'string'],
  72. [['order_no', 'out_trade_no', 'addons_name'], 'string', 'max' => 100],
  73. ];
  74. }
  75. /**
  76. * {@inheritdoc}
  77. */
  78. public function attributeLabels()
  79. {
  80. return [
  81. 'id' => '订单id',
  82. 'mall_id' => '商城ID',
  83. 'order_no' => '订单编号',
  84. 'out_trade_no' => '系统支付流水号',
  85. 'addons_name' => '插件名或标识',
  86. 'unit' => '周期单位[0=永久,1=月,2=年]',
  87. 'duration' => '周期时长',
  88. 'version' => '版本号',
  89. 'pay_money' => '订单实付金额',
  90. 'order_price' => '订单价格',
  91. 'order_status' => '订单状态',
  92. 'pay_status' => '订单付款状态[0=未支付,1=已支付]',
  93. 'payment_type' => '支付方式[1=微信,2=支付宝]',
  94. 'pay_time' => '订单付款时间',
  95. 'expire_time' => '订单过期时间',
  96. 'operator_id' => '操作人ID',
  97. 'operator_username' => '操作人用户名称',
  98. 'recommend_uid' => '推荐代理uid',
  99. 'extra_info' => '额外信息',
  100. 'status' => '状态[-1:删除;0:禁用;1启用]',
  101. 'created_at' => '创建时间',
  102. 'updated_at' => '更新时间',
  103. 'close_time' => '关闭时间',
  104. ];
  105. }
  106. /**关联模型 */
  107. public function getAddons()
  108. {
  109. return $this->hasOne(Addons::class, ['name' => 'addons_name']);
  110. }
  111. public function getMall()
  112. {
  113. return $this->hasOne(Mall::class, ['id' => 'mall_id']);
  114. }
  115. /**
  116. * 创建订单
  117. * @Author: lun
  118. * @DateTime: 2022/2/26 0026 18:08
  119. * @Copyright: copyright (c) 2021 广东七件事集团
  120. * @param $mall_id
  121. * @param $addons
  122. * @param $pay_setting
  123. * @return array|bool
  124. */
  125. public static function createOrder($mall_id, $addons, $pay_setting)
  126. {
  127. try {
  128. $time = time();
  129. // 创建订单
  130. $model = new self();
  131. $model->loadDefaultValues();
  132. $model->mall_id = $mall_id;
  133. $model->order_no = Order::generateOrderNo('a');
  134. $model->addons_name = $addons['name'];
  135. $model->unit = $pay_setting['unit'];
  136. $model->duration = $pay_setting['duration'];
  137. $model->version = $addons['version'];
  138. $model->pay_money = $pay_setting['money'];
  139. $model->order_price = $pay_setting['money'];
  140. $model->expire_time = $time + AddonsOrderEnum::EXPIRE_TIME * 60;
  141. if (!$model->save()) throw new Exception($model->getErrorMessage());
  142. $order = $model->toArray();
  143. // 生成交易流水订单
  144. $order_trade_info[] = [
  145. 'order_no' => $order['order_no'],
  146. 'amount' => $order['pay_money'],
  147. 'title'=> $addons['title'],
  148. 'notify_class' => 'common\logic\notify\AddonsPayNotify',
  149. 'order_type' => 'order',
  150. 'return_url' => Yii::$app->request->hostInfo . '/index.php?r=mall/addons/confirm-success&order_id=' . $order['id'],
  151. ];
  152. $trade = \Yii::$app->services->pay->createTrade(0, 0 , $order_trade_info);
  153. if($trade == false) throw new \Exception('生成支付流水失败');
  154. // 生成平台总订单
  155. $platform_order = PlatformOrder::setData([
  156. 'order_id' => $order['id'],
  157. 'order_no' => $order['order_no'],
  158. 'out_trade_no' => $trade['trade_no'],
  159. 'title' => $addons['title'],
  160. 'cover' => $addons['cover'] ?? '',
  161. 'consumer_id' => $mall_id,
  162. 'consumer_name' => $addons['consumer_name'],
  163. 'consumer_type' => PlatformEnum::CONSUMER_TYPE_MALL,
  164. 'pay_money' => $order['pay_money'],
  165. 'order_price' => $order['order_price'],
  166. 'expire_time' => $order['expire_time'],
  167. 'source_table' => self::briefTableName(),
  168. 'from_type' => PlatformEnum::FROM_TYPE_ADDONS_PAY,
  169. ]);
  170. if ($platform_order == false) throw new \Exception('平台订单生成失败:' . PlatformOrder::getStaticError());
  171. // 订单统计
  172. $res = PlatformOrderStatisticsDay::setData([
  173. 'order_num' => 1,
  174. 'order_money' => $order['order_price'],
  175. ]);
  176. if ($res == false) throw new \Exception(PlatformOrderStatisticsDay::getStaticError());
  177. // 判断是否是免费应用
  178. if ($model->pay_money == 0) {
  179. // 修改交易流水
  180. $trade_order = Yii::$app->services->pay->getByTradeNo($trade['trade_no']);
  181. // 修改订单交易流水
  182. $model->out_trade_no = $trade['trade_no'];
  183. if (!$model->save()) throw new Exception($model->getErrorMessage());
  184. // 触发支付回调
  185. $orders = Yii::$app->services->pay->changePaymentTradeOrder($trade_order,PayTypeEnum::FREE);
  186. Yii::$app->services->pay->notify($orders);
  187. }
  188. // 返回信息
  189. return ['order' => [
  190. 'order_id' => $order['id'],
  191. 'order_no' => $order['order_no'],
  192. 'title' => $addons['title'],
  193. 'addons_name' => $addons['name'],
  194. 'unit' => $order['unit'],
  195. 'duration' => $order['duration'],
  196. 'pay_money' => $order['pay_money'],
  197. ], 'trade' => $trade];
  198. } catch (\Exception $e) {
  199. self::setStaticError($e->getMessage());
  200. return false;
  201. }
  202. }
  203. /**
  204. * 保存数据
  205. * @Author: lun
  206. * @DateTime: 2022/3/3 0003 19:49
  207. * @Copyright: copyright (c) 2021 广东七件事集团
  208. * @param $params
  209. * @return array|bool
  210. */
  211. public static function setData($params)
  212. {
  213. try {
  214. $model = self::findOne(['id' => $params['id']]);
  215. if (empty($model)) throw new Exception('查无此订单');
  216. if (!$model->load($params, '') || !$model->save()) throw new Exception($model->getErrorMessage());
  217. return $model->toArray();
  218. } catch (\Exception $e) {
  219. self::setStaticError($e->getMessage());
  220. return false;
  221. }
  222. }
  223. /**
  224. * 获取支付方式
  225. * @Author: lun
  226. * @DateTime: 2022/2/28 0028 9:43
  227. * @Copyright: copyright (c) 2021 广东七件事集团
  228. * @param $payment_str
  229. * @param $trade
  230. * @return array
  231. * @throws \Exception
  232. */
  233. public static function getPaymentArr($payment_str, $trade)
  234. {
  235. $payment_arr = [];
  236. $payment_map = PayTypeEnum::getMap();
  237. $payment_type = Json::decode($payment_str, true);
  238. foreach ($payment_type as $type) {
  239. switch ($type) {
  240. case PayTypeEnum::WECHAT :
  241. if (empty(Yii::$app->services->setting->get('wechat.status'))) break;
  242. // 生成微信支付二维码地址
  243. $payment_arr[] = [
  244. 'payment_url' => Yii::$app->services->pay->wechat($trade, WechatPayTypeEnum::NATIVE),
  245. 'payment_way' => 'scan',// 扫码支付
  246. 'payment_name' => $payment_map[$type],
  247. ];
  248. break;
  249. case PayTypeEnum::ALI :
  250. if (empty(Yii::$app->services->setting->get('alipay.status'))) break;
  251. // 生成支付宝支付地址
  252. $alipay = Yii::$app->services->pay->alipay($trade, AliPayPayTypeEnum::PC);
  253. if (empty($alipay['config'])) throw new \Exception('支付宝扫码地址获取失败');
  254. $payment_arr[] = [
  255. 'payment_url' => $alipay['config'],
  256. 'payment_way' => 'navigate',// 链接跳转
  257. 'payment_name' => $payment_map[$type],
  258. ];
  259. break;
  260. }
  261. }
  262. return $payment_arr;
  263. }
  264. }