OrderPayDataForm.php 62 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\client\models\v1\order;
  8. use app\models\AccountLog;
  9. use app\models\common\CommonOrder;
  10. use app\models\Goods;
  11. use app\models\GoodsBook;
  12. use app\models\Order;
  13. use app\models\OrderDetail;
  14. use app\models\OrderUnion;
  15. use app\models\SaaSLeaguePriceLog;
  16. use app\models\SaasUser;
  17. use app\models\User;
  18. use app\models\VerifyCardLog;
  19. use app\models\VerifyCardSale;
  20. use app\modules\client\models\OrderComplete;
  21. use app\modules\client\models\v1\LoginForm;
  22. use app\modules\client\models\v1\ShareMoneyForm;
  23. use app\modules\common\models\NotifyForm;
  24. use app\utils\Alipay\Alipay;
  25. use app\utils\Alipay\AlipayProfit;
  26. use app\utils\CloudPrint;
  27. use app\utils\OrderNo;
  28. use app\utils\Share\BonusPool;
  29. use app\utils\Wechat\WechatNewPay;
  30. use app\utils\Wechat\WechatPay;
  31. use app\utils\yunst\src\OrderYunst;
  32. use ByteDance\ByteDance;
  33. use yii\base\Model;
  34. use yii\helpers\Json;
  35. use app\utils\Delivery\Delivery;
  36. use app\models\Store;
  37. use app\utils\Adapay\Adapay;
  38. use app\utils\Adapay\AdapayV2;
  39. use app\utils\Allinpay\Allinpay;
  40. use app\models\UserPayMonth;
  41. use app\modules\admin\models\UserAuditForm;
  42. /**
  43. * @property User $user
  44. * @property Order $order
  45. */
  46. class OrderPayDataForm extends Model
  47. {
  48. public $store_id;
  49. public $order_id;
  50. public $order_id_list;
  51. public $pay_type;
  52. public $user;
  53. public $form_id;
  54. public $parent_user_id;
  55. public $condition;
  56. public $pay_offline;
  57. public $_from;
  58. public $is_combine;
  59. public $session_key;
  60. public $ali_requireOrder;
  61. public $ali_sourceId;
  62. /** @var Wechat $wechat */
  63. private $wechat;
  64. private $wechatPay;
  65. private $order;
  66. const PAY_FROM_APP = 'app';
  67. const PAY_FROM_MINI = 'mini';
  68. const PAY_FROM_H5 = 'h5';
  69. const PAY_FROM_OFFICIAL = 'official';
  70. const PAY_FROM_YUNST = 'yunst';
  71. public function rules()
  72. {
  73. return [
  74. [['pay_type', '_from'], 'required'],
  75. [['_from'], 'in', 'range' => ['app', 'mini', 'h5', 'official', 'yunst']],
  76. [['pay_type'], 'in', 'range' => [
  77. -1, 1, 2, 3, 4, 5,
  78. Order::PAY_TYPE_OFFLINE,
  79. Order::PAY_TYPE_MONTH,
  80. Order::PAY_TYPE_ADAPAY_WX, Order::PAY_TYPE_ADAPAY_ALIPAY, Order::PAY_TYPE_ADAPAY_QUICKPAY_FRONTPAY,
  81. Order::PAY_TYPE_HUIFU_V2_JSPAY_WX,
  82. Order::PAY_TYPE_WX_B2B,
  83. Order::PAY_TYPE_ALLINPAY_WX, Order::PAY_TYPE_ALLINPAY_ALIPAY,
  84. Order::PAY_TYPE_YUNST_WECHAT_PAY
  85. ]], // 'WECHAT_PAY', 'HUODAO_PAY', 'BALANCE_PAY' 'ALIPAY',
  86. [['form_id', 'order_id_list', '_from'], 'string'],
  87. ['is_combine', 'default', 'value' => 0],
  88. [['parent_user_id', 'condition', 'order_id', 'is_combine'], 'integer'],
  89. [['ali_requireOrder', 'ali_sourceId', 'pay_offline'], 'safe'],
  90. [['session_key'], 'safe'],
  91. ];
  92. }
  93. public function search()
  94. {
  95. if($this->pay_type == -1){
  96. $this->pay_type = Order::PAY_TYPE_BALANCE_PAID;
  97. }
  98. $this->wechatPay = \Yii::$app->controller->wechatPay;
  99. if (!$this->validate()) {
  100. return [
  101. 'code' => 1,
  102. 'msg' => $this->getErrorSummary(false)[0],
  103. ];
  104. }
  105. $this->user->money = doubleval($this->user->money);
  106. if ($this->order_id_list) {
  107. $order_id_list = json_decode($this->order_id_list, true);
  108. if (is_array($order_id_list) && count($order_id_list) == 1) {
  109. $this->order_id = $order_id_list[0];
  110. $this->order_id_list = '';
  111. }
  112. }
  113. $t = \Yii::$app->db->beginTransaction();
  114. try {
  115. User::find()->where('id = ' . $this->user->id . ' for update')->one();
  116. if ($this->order_id) { //单个订单付款
  117. $this->order = Order::findOne([
  118. // 'store_id' => $this->store_id,
  119. 'id' => $this->order_id,
  120. ]);
  121. //感觉$this->pay_type == 2条件可以不用加 因为货到付款支付时候不走这个方法 走meetOrderPay()
  122. if (intval($this->order->is_pay) || (intval($this->order->pay_type) === 2 && $this->pay_type == 2)) {
  123. $t->rollBack();
  124. return [
  125. 'code' => 1,
  126. 'msg' => '订单已支付',
  127. ];
  128. }
  129. if($this->order->integral_price > 0){
  130. if($this->order->integral_price > $this->user->integral){
  131. $t->rollBack();
  132. return [
  133. 'code' => 1,
  134. 'msg' => '积分不足,请重新下单',
  135. ];
  136. }
  137. }
  138. // 供应链系统下单时是否使用平台商户号,1使用,0未使用
  139. if (\Yii::$app->prod_is_dandianpu() &&
  140. !is_h5() &&
  141. (
  142. (
  143. !Store::hasIncoming($this->order->store_id) && $this->pay_type == 1)
  144. || ($this->pay_type == 1 && $this->_from == self::PAY_FROM_APP)
  145. ) &&
  146. self_mini() === false
  147. ) {
  148. $is_use_platform_mch = 1;
  149. if ($this->is_combine) {
  150. if ($this->user->money >= $this->order->pay_price) {
  151. $this->pay_type = 3;
  152. $is_use_platform_mch = 0;
  153. }
  154. }
  155. $this->order->is_use_platform_mch = $is_use_platform_mch;
  156. $this->order->save();
  157. }
  158. if ($this->order->pay_price == 0) {
  159. // 这里要判断订单之前是不是货到付款的订单 如果是货到付款的订单
  160. if($this->order->pay_type == 2 && $this->order->trade_status == Order::ORDER_FLOW_SEND){
  161. $this->order->is_pay = 1;
  162. // 如果是货到付款已发货 用户选择支付的话 订单修改为确认收货
  163. $this->order->trade_status = Order::ORDER_FLOW_CONFIRM;
  164. $this->order->confirm_time = time();
  165. $this->order->save();
  166. return [
  167. 'code' => 0,
  168. 'msg' => '支付成功'
  169. ];
  170. }else{
  171. $this->order->pay_time = time();
  172. $this->order->is_pay = 1;
  173. if($this->order->order_type == 7){
  174. $this->order->pay_type = 7; //积分兑换
  175. }else{
  176. $this->order->pay_type = 3;
  177. }
  178. $this->order->trade_status = Order::ORDER_FLOW_NO_SEND;
  179. $this->order->save();
  180. }
  181. if ($this->order->verify_card_id > 0) {
  182. VerifyCardSale::updateAll(['status' => 1], ['id' => $this->order->verify_card_id]);
  183. $verifylog = new VerifyCardLog();
  184. $verifylog->store_id = $this->order->store_id;
  185. $verifylog->sale_id = $this->order->verify_card_id;
  186. $verifylog->shop_id = 0;
  187. $verifylog->use_time = time();
  188. $verifylog->user_id = get_user_id();
  189. $verifylog->type = VerifyCardLog::WRITE_TYPE_EXCHANGE;
  190. $verifylog->describe = '使用卡券礼品卡兑换商品';
  191. $verifylog->save();
  192. }
  193. $this->setReturnData($this->order);
  194. $t->commit();
  195. // 支付完成后,相关操作
  196. (new NotifyForm())->videoGoodsShare($this->order);
  197. $form = new OrderComplete();
  198. $form->order_id = $this->order->id;
  199. $form->order_type = 0;
  200. $form->store_id = $this->order->store_id;
  201. $form->notify();
  202. return [
  203. 'code' => 0,
  204. 'msg' => '支付成功'
  205. ];
  206. }
  207. if (!$this->order) {
  208. $t->rollBack();
  209. return [
  210. 'code' => 1,
  211. 'msg' => '订单不存在',
  212. ];
  213. }
  214. if ($this->order->is_delete == 1 || $this->order->trade_status == Order::ORDER_FLOW_CANCEL) {
  215. $t->rollBack();
  216. return [
  217. 'code' => 1,
  218. 'msg' => '订单已取消',
  219. ];
  220. }
  221. if ($this->order->is_pay == 1 || ($this->order->trade_status > -1 && $this->order->pay_type != 2)) {
  222. $t->rollBack();
  223. return [
  224. 'code' => 1,
  225. 'msg' => '订单状态异常',
  226. ];
  227. }
  228. try {
  229. $this->checkGoodsConfine($this->order);
  230. } catch (\Exception $e) {
  231. $t->rollBack();
  232. return [
  233. 'code' => 1,
  234. 'msg' => $e->getMessage()
  235. ];
  236. }
  237. // 存储parent_id
  238. // if ($this->user && $this->user->parent_user_id) {
  239. // CommonOrder::saveParentId($this->user->parent_user_id);
  240. // }
  241. $goods_names = '';
  242. $goods_list = OrderDetail::find()->alias('od')->leftJoin(['g' => Goods::tableName()],
  243. 'g.id=od.goods_id')->where(['od.order_id' => $this->order->id, 'od.is_delete' => 0,
  244. ])->select('g.name,g.verify_card_id')->asArray()->all();
  245. foreach ($goods_list as $goods) {
  246. $goods_names .= $goods['name'] . ';';
  247. }
  248. $goods_names = mb_substr($goods_names, 0, 32, 'utf-8');
  249. // 去除非utf8字符
  250. if (function_exists('iconv')) {
  251. // 使用iconv函数去除非UTF-8字符
  252. $goods_names = iconv('UTF-8', 'UTF-8//IGNORE', $goods_names);
  253. } else {
  254. // 如果iconv不可用,则使用正则表达式尝试去除非UTF-8字符
  255. $goods_names = preg_replace('/[^\x{0000}-\x{FFFF}]/u', '', $goods_names);
  256. }
  257. $this->setReturnData($this->order);
  258. $this->order->order_union_id = 0;
  259. if (!$this->order->save()) {
  260. $t->rollBack();
  261. return [
  262. 'code' => 1,
  263. 'msg' => '订单保存失败'
  264. ];
  265. }
  266. // 余额抵扣支付
  267. $balance_price = 0;
  268. if ($this->pay_type == 2) {
  269. $this->is_combine = 0;
  270. }
  271. if ($this->is_combine) {
  272. if ($this->user->money >= $this->order->pay_price) {
  273. $this->pay_type = 3;
  274. } else {
  275. $balance_price = $this->user->money;
  276. $this->order->combine_money = $this->user->money;
  277. $this->order->is_combine_pay = Order::IS_COMBINE_PAY;
  278. $this->order->save();
  279. }
  280. } else {
  281. $this->order->combine_money = 0;
  282. $this->order->is_combine_pay = Order::NOT_COMBINE_PAY;
  283. $this->order->save();
  284. }
  285. if ($this->pay_type == 1 || $this->pay_type == 4 || $this->pay_type == 5 || in_array($this->pay_type, [Order::PAY_TYPE_WX_B2B, Order::PAY_TYPE_ADAPAY_WX, Order::PAY_TYPE_ADAPAY_ALIPAY, Order::PAY_TYPE_ADAPAY_QUICKPAY_FRONTPAY, Order::PAY_TYPE_HUIFU_V2_JSPAY_WX]) || in_array($this->pay_type, [Order::PAY_TYPE_ALLINPAY_WX, Order::PAY_TYPE_ALLINPAY_ALIPAY]) || $this->pay_type == Order::PAY_TYPE_YUNST_WECHAT_PAY) {
  286. if ($this->order->pay_price == 0) {
  287. $this->order->is_pay = 1;
  288. $this->order->pay_type = 1;
  289. if ($this->pay_type == 4) {
  290. $this->order->pay_type = 4;
  291. }
  292. $this->order->pay_time = time();
  293. if (!$this->order->save()) {
  294. $t->rollBack();
  295. return [
  296. 'code' => 1,
  297. 'msg' => '支付失败'
  298. ];
  299. }
  300. // 支付完成后,相关操作
  301. (new NotifyForm())->videoGoodsShare($this->order);
  302. $form = new OrderComplete();
  303. $form->order_id = $this->order->id;
  304. $form->order_type = 0;
  305. $form->store_id = $this->order->store_id;
  306. $form->notify();
  307. $t->commit();
  308. return [
  309. 'code' => 0,
  310. 'msg' => '0元支付'
  311. ];
  312. }
  313. //供应链系统h5支付以及公众号支付 只能使用供应链平台配置的商户信息 不能自己配置 所以给这加is_use_platform_mch 让商城自己提现
  314. if (\Yii::$app->prod_is_dandianpu() && ((is_h5() || $this->_from == self::PAY_FROM_OFFICIAL) &&
  315. (
  316. ((!Store::hasIncoming($this->order->store_id, 'wechat', is_h5())) && $this->pay_type == Order::PAY_TYPE_WECHAT) ||
  317. ((!Store::hasIncoming($this->order->store_id, 'alipay', is_h5())) && $this->pay_type == Order::PAY_TYPE_ALI)
  318. ))
  319. ) {
  320. $this->order->is_use_platform_mch = 1;
  321. $this->order->save();
  322. }
  323. // if ($this->order->store_id == 74 && in_array($this->pay_type, [1])){
  324. // $this->pay_type = Order::PAY_TYPE_HUIFU_V2_JSPAY_WX;
  325. // }
  326. if ($this->pay_type == 1) {
  327. // \Yii::error($this->_from);
  328. if ($this->_from == self::PAY_FROM_APP) {
  329. if (\Yii::$app->prod_is_dandianpu() && self_mini() === false) {
  330. $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, true, $balance_price);
  331. } else {
  332. if (is_profit_pay()) {
  333. $result = WechatNewPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, true, $balance_price);
  334. } else {
  335. $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, true, $balance_price);
  336. }
  337. }
  338. } else if ($this->_from == self::PAY_FROM_H5) {
  339. if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming($this->order->store_id) && self_mini() === false) {
  340. $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, true);
  341. } else {
  342. if (is_profit_pay()) {
  343. $result = WechatNewPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, true);
  344. } else {
  345. $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, true);
  346. }
  347. }
  348. } else if ($this->_from == self::PAY_FROM_OFFICIAL) {
  349. $self_mini = intval(\app\models\Option::get('self_mini', get_store_id(), 'store', 0)['value']);
  350. if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming($this->order->store_id) && !$self_mini) {
  351. $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, false, true);
  352. } else {
  353. if (is_profit_pay()) {
  354. $result = WechatNewPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, false, true);
  355. } else {
  356. $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, false, true);
  357. }
  358. }
  359. } else {
  360. if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming($this->order->store_id) && self_mini() === false) {
  361. $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price);
  362. } else {
  363. if (is_profit_pay() && Store::hasIncoming($this->order->store_id)) {
  364. $result = WechatNewPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price);
  365. } else {
  366. $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price);
  367. }
  368. if (\app\modules\admin\models\WastoreForm::$test && get_mini_id() == 88) {
  369. $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price);
  370. }
  371. }
  372. }
  373. if (isset($result['code']) && $result['code'] == 1) {
  374. if ($this->_from == self::PAY_FROM_OFFICIAL) {
  375. $result['wechat_platform_open_id'] = get_user()->wechat_platform_open_id;
  376. $result['h5_auth_link'] = LoginForm::getAuthLink();
  377. }
  378. return $result;
  379. }
  380. CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
  381. $t->commit();
  382. \app\modules\admin\models\WastoreForm::afterOrderPrepay($this->order, $result['res']);
  383. return [
  384. 'code' => 0,
  385. 'msg' => 'success',
  386. 'data' => (object)$result['data'],
  387. 'res' => $result['res'],
  388. 'body' => $goods_names
  389. ];
  390. }
  391. if ($this->pay_type == Order::PAY_TYPE_WX_B2B) {
  392. // \Yii::error($this->_from);
  393. $result = UserAuditForm::pay($this->session_key, $this->order, OrderNo::ORDER_MALL, $goods_names, $balance_price);
  394. CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
  395. $t->commit();
  396. // \app\modules\admin\models\WastoreForm::afterOrderPrepay($this->order, $result['res']);
  397. return $result;
  398. }
  399. if ($this->pay_type == Order::PAY_TYPE_YUNST_WECHAT_PAY) {
  400. // if (!Store::hasIncoming($this->order->store_id, 'yunst')) {
  401. // return [
  402. // 'code' => 1,
  403. // 'msg' => '商家未配置通联支付'
  404. // ];
  405. // }
  406. //是非独立部署 进件流程//通联支付 start
  407. $store = Store::findOne(['id' => $this->order->store_id]);
  408. $OrderYunst = new OrderYunst();
  409. $result2 = $OrderYunst->payYunst($this->order->store_id, $this->order->order_no, $store->cusid, $this->order->pay_price * 100);
  410. if ($result2['subCode'] == 'SUCCESS') {
  411. $payInfo = json_decode($result2['data']['payinfo'], true);
  412. if (!empty($payInfo)) {
  413. if (is_array($payInfo)) {
  414. return [
  415. 'code' => 0,
  416. 'data' => $payInfo,
  417. 'msg' => 'success',
  418. 'res' => $payInfo
  419. ];
  420. }
  421. return [
  422. 'code' => 1,
  423. 'msg' => $result2['data']['errmsg']
  424. ];
  425. }
  426. return [
  427. 'code' => 1,
  428. 'msg' => $result2['subMsg']
  429. ];
  430. }
  431. return $result2;
  432. //通联支付 end
  433. }
  434. if (in_array($this->pay_type, [Order::PAY_TYPE_ALLINPAY_WX, Order::PAY_TYPE_ALLINPAY_ALIPAY])) {
  435. $is_official = $this->_from == self::PAY_FROM_OFFICIAL;
  436. $result = Allinpay::pay($this->pay_type, $this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, is_h5(), $is_official);
  437. $t->commit();
  438. return $result;
  439. }
  440. if (in_array($this->pay_type, [Order::PAY_TYPE_ADAPAY_WX, Order::PAY_TYPE_ADAPAY_ALIPAY])) {
  441. $is_official = $this->_from == self::PAY_FROM_OFFICIAL;
  442. $result = Adapay::create($this->pay_type, $this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, false, $is_official);
  443. $t->commit();
  444. return $result;
  445. }
  446. if (in_array($this->pay_type, [Order::PAY_TYPE_ADAPAY_QUICKPAY_FRONTPAY, Order::PAY_TYPE_HUIFU_V2_JSPAY_WX])) {
  447. $is_official = $this->_from == self::PAY_FROM_OFFICIAL;
  448. $result = AdapayV2::create($this->pay_type, $this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, false, $is_official);
  449. $t->commit();
  450. return $result;
  451. }
  452. if ($this->pay_type == 4) {
  453. if ($this->_from == self::PAY_FROM_MINI) {
  454. if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming($this->order->store_id) && self_mini() === false) {
  455. $result = Alipay::mini($this->order, $goods_names, $this->user, '', '', 0, $balance_price, $this);
  456. } else {
  457. if (is_profit_pay('ali')) {
  458. $result = AlipayProfit::mini($this->order, $goods_names, $this->user, '', '', false, 0, $balance_price, $this);
  459. } else {
  460. $result = Alipay::mini($this->order, $goods_names, $this->user, '', '', 0, $balance_price, $this);
  461. }
  462. }
  463. if (isset($result['code']) && $result['code'] == 1) {
  464. return $result;
  465. }
  466. $t->commit();
  467. return [
  468. 'code' => 0,
  469. 'msg' => 'success',
  470. 'data' => $result['data']['trade_no'],
  471. 'body' => $goods_names
  472. ];
  473. } else if ($this->_from == self::PAY_FROM_H5) {
  474. if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming($this->order->store_id, 'alipay', is_h5())) {
  475. $result = Alipay::wap($this->order,$goods_names);
  476. } else {
  477. if (is_profit_pay()) {
  478. $result = AlipayProfit::wap($this->order, $goods_names);
  479. } else {
  480. $result = Alipay::wap($this->order, $goods_names);
  481. }
  482. }
  483. $t->commit();
  484. if($result['code']){
  485. return $result;
  486. }
  487. return [
  488. 'code' => 0,
  489. 'msg' => 'success',
  490. 'data' => $result['data'],
  491. 'body' => $goods_names
  492. ];
  493. } else {
  494. if (is_profit_pay('ali')) {
  495. $result = AlipayProfit::app($this->order, $goods_names, $this->user, '', $balance_price);
  496. } else {
  497. $result = Alipay::app($this->order, $goods_names, $this->user, '', $balance_price);
  498. }
  499. if (isset($result['code']) && $result['code'] == 1) {
  500. $t->commit();
  501. return $result;
  502. }
  503. $t->commit();
  504. return [
  505. 'code' => 0,
  506. 'msg' => 'success',
  507. 'data' => $result['data'],
  508. 'body' => $goods_names
  509. ];
  510. }
  511. }
  512. // 抖音小程序
  513. if ($this->pay_type == 5) {
  514. $result = ByteDance::pay($this->order, '', $goods_names, 0 , $balance_price);
  515. if (isset($result['code']) && $result['code'] == 1) {
  516. return $result;
  517. }
  518. $t->commit();
  519. return [
  520. 'code' => 0,
  521. 'msg' => 'success',
  522. 'data' => $result['data'],
  523. ];
  524. }
  525. }
  526. //货到付款和余额支付数据处理
  527. if ($this->pay_type == 2 || $this->pay_type == 3) {
  528. $order = $this->order;
  529. // 中间页选择货到付款,需要存入支付类型
  530. if ($this->pay_type == 2) {
  531. $order->is_pay = 0;
  532. $order->pay_type = 2;
  533. $order->save();
  534. }
  535. //余额支付 用户余额变动
  536. if ($this->pay_type == 3) {
  537. $user_id = $order->user_id;
  538. //判断好友代付
  539. if ((int)get_user_id() !== (int)$order->user_id) {
  540. $user = User::findOne(['binding' => get_user()->binding, 'is_delete' => 0, 'store_id' => $order->store_id]);//查询当前商城的用户id
  541. $user_id = $user->id;
  542. if (empty($user)) {
  543. $store = Store::findOne($order->store_id);
  544. return [
  545. 'code' => 1,
  546. 'msg' => '支付失败,用户在商城:' . $store->name . '未注册用户。',
  547. ];
  548. }
  549. }
  550. $user = User::findOne(['id' => $user_id]);
  551. if ($user->money < $order->pay_price) {
  552. $t->rollBack();
  553. return [
  554. 'code' => 1,
  555. 'msg' => '支付失败,余额不足',
  556. ];
  557. }
  558. // $user->money -= floatval($order->pay_price);
  559. $res = AccountLog::saveLog($user->id, floatval($order->pay_price), AccountLog::TYPE_BALANCE, AccountLog::LOG_TYPE_EXPEND, 1, $order->id, "商城余额支付,订单号为:{$order->order_no}。");
  560. if (!$res) {
  561. $t->rollBack();
  562. return [
  563. 'code' => 1,
  564. 'msg' => '支付失败'
  565. ];
  566. }
  567. $order->is_pay = 1;
  568. $order->pay_type = 3;
  569. $order->trade_status = Order::ORDER_FLOW_NO_SEND;
  570. $order->pay_time = time();
  571. $order->is_combine_pay = 0;
  572. $order->combine_money = 0;
  573. if ($order->user_id != $user->id) {
  574. $order->pay_user_id = $user->id;
  575. }
  576. if (!$order->save()) {
  577. $t->rollBack();
  578. return [
  579. 'code' => 1,
  580. 'msg' => '支付失败'
  581. ];
  582. }
  583. }
  584. // 同城配送订单下单
  585. // if ($order->is_delivery == 1) {
  586. // $detail_goods = OrderDetail::find()->where(['order_id' => $order->id])->select('goods_name as name, pic, num, total_price as price')->asArray()->all();
  587. // Delivery::addOrder($detail_goods, $order->order_no);
  588. // }
  589. // 支付完成后,相关操作
  590. (new NotifyForm())->videoGoodsShare($order);
  591. $form = new OrderComplete();
  592. $form->order_id = $order->id;
  593. $form->order_type = 0;
  594. $form->store_id = $order->store_id;
  595. $form->notify();
  596. CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
  597. $t->commit();
  598. return [
  599. 'code' => 0,
  600. 'msg' => '支付成功',
  601. 'data' => ''
  602. ];
  603. }
  604. if($this->pay_type == Order::PAY_TYPE_OFFLINE){
  605. $order = $this->order;
  606. $order->is_pay = 0;
  607. $order->pay_type = Order::PAY_TYPE_OFFLINE;
  608. $order->save();
  609. if(is_string($this->pay_offline)){
  610. $this->pay_offline = json_decode($this->pay_offline, true);
  611. }
  612. $payOffline = \app\models\OrderPayOffline::addPay(get_store_id(), get_user_id(), $this->order->id, $this->pay_offline['type'], $this->pay_offline['desc'], $this->pay_offline['pic_list']);
  613. if($payOffline['code'] != 0){
  614. $t->rollBack();
  615. return $payOffline;
  616. }
  617. $t->commit();
  618. return [
  619. 'code' => 0,
  620. 'msg' => '操作成功,请等待审核',
  621. 'data' => ''
  622. ];
  623. }
  624. if($this->pay_type == Order::PAY_TYPE_MONTH){
  625. $order = $this->order;
  626. $order->is_pay = 1;
  627. $order->pay_type = Order::PAY_TYPE_MONTH;
  628. $order->trade_status = Order::ORDER_FLOW_NO_SEND;
  629. $order->pay_time = time();
  630. $order->save();
  631. $payMonth = UserPayMonth::addPay(get_user_id(), $order);
  632. if($payMonth['code']){
  633. $t->rollBack();
  634. return $payMonth;
  635. }
  636. // 支付完成后,相关操作
  637. (new NotifyForm())->videoGoodsShare($order);
  638. $form = new OrderComplete();
  639. $form->order_id = $order->id;
  640. $form->order_type = 0;
  641. $form->store_id = $order->store_id;
  642. $form->notify();
  643. CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
  644. $t->commit();
  645. return [
  646. 'code' => 0,
  647. 'msg' => '支付成功',
  648. 'data' => $payMonth,
  649. ];
  650. }
  651. } elseif ($this->order_id_list) { //多个订单合并付款
  652. $order_id_list = json_decode($this->order_id_list, true);
  653. if (!$order_id_list) {
  654. $order_id_list = explode(',', $this->order_id_list);
  655. }
  656. if (!$order_id_list) {
  657. $t->rollBack();
  658. return [
  659. 'code' => 1,
  660. 'msg' => '数据错误:订单格式不正确。',
  661. ];
  662. }
  663. $order_list = [];
  664. $total_pay_price = 0;
  665. foreach ($order_id_list as $order_id) {
  666. $order = Order::findOne([
  667. 'store_id' => $this->store_id,
  668. 'id' => $order_id,
  669. 'is_delete' => 0,
  670. ]);
  671. if (!$order) {
  672. $t->rollBack();
  673. return [
  674. 'code' => 1,
  675. 'msg' => '订单不存在',
  676. ];
  677. }
  678. if ($order->is_pay == 1) {
  679. $t->rollBack();
  680. return [
  681. 'code' => 1,
  682. 'msg' => '存在已付款的订单,订单合并支付失败,请到我的订单重新支付。',
  683. ];
  684. }
  685. try {
  686. $this->checkGoodsConfine($order);
  687. } catch (\Exception $e) {
  688. $t->rollBack();
  689. return [
  690. 'code' =>1,
  691. 'msg' => $e->getMessage()
  692. ];
  693. }
  694. $order_list[] = $order;
  695. $total_pay_price += doubleval($order->pay_price);
  696. $this->setReturnData($order);
  697. }
  698. // 余额抵扣支付
  699. $balance_price = 0;
  700. if ($this->is_combine) {
  701. // todo 合并订单支付 不能使用混合支付
  702. if($this->user->money < $total_pay_price){
  703. $t->rollBack();
  704. return ['code'=>1,'msg' => '余额不足'];
  705. }
  706. $this->pay_type = 3;
  707. // if ($this->user->money >= $total_pay_price) {
  708. // $this->pay_type = 3;
  709. // } else {
  710. // $balance_price = $this->user->money;
  711. // $this->order->combine_money = $this->user->money;
  712. // $this->order->is_combine_pay = Order::IS_COMBINE_PAY;
  713. // $this->order->save();
  714. // }
  715. } else {
  716. foreach($order_id_list as $order_id){
  717. $order = Order::findOne([
  718. 'store_id' => $this->store_id,
  719. 'id' => $order_id,
  720. 'is_delete' => 0,
  721. ]);
  722. $order->combine_money = 0;
  723. $order->is_combine_pay = Order::NOT_COMBINE_PAY;
  724. $order->save();
  725. }
  726. }
  727. // 微信支付
  728. if ($this->pay_type == 1) {
  729. // \Yii::error($this->_from);
  730. if ($this->_from == self::PAY_FROM_APP) {
  731. if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming(get_store_id()) && self_mini() === false) {
  732. $result = WechatPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price);
  733. } else {
  734. if (is_profit_pay()) {
  735. $result = WechatNewPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price);
  736. } else {
  737. $result = WechatPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price);
  738. }
  739. }
  740. } else if ($this->_from == self::PAY_FROM_H5) {
  741. if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming(get_store_id()) && self_mini() === false) {
  742. $result = WechatPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price, true);
  743. } else {
  744. if (is_profit_pay()) {
  745. $result = WechatNewPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price, true);
  746. } else {
  747. $result = WechatPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price, true);
  748. }
  749. }
  750. } else if ($this->_from == self::PAY_FROM_OFFICIAL) {
  751. $self_mini = intval(\app\models\Option::get('self_mini', get_store_id(), 'store', 0)['value']);
  752. if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming(get_store_id()) && !$self_mini) {
  753. $result = WechatPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price, false, true);
  754. } else {
  755. if (is_profit_pay()) {
  756. $result = WechatNewPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price, false, true);
  757. } else {
  758. $result = WechatPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price, false, true);
  759. }
  760. }
  761. } else {
  762. if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming(get_store_id()) && self_mini() === false) {
  763. $result = WechatPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price);
  764. } else {
  765. if (is_profit_pay() && Store::hasIncoming(get_store_id())) {
  766. $result = WechatNewPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price);
  767. } else {
  768. $result = WechatPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price);
  769. }
  770. }
  771. }
  772. if (isset($result['code']) && $result['code'] == 1) {
  773. $t->rollBack();
  774. return $result;
  775. }
  776. CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
  777. $t->commit();
  778. return [
  779. 'code' => 0,
  780. 'msg' => 'success',
  781. 'data' => (object)$result['data'],
  782. 'res' => $result['res'],
  783. 'body' => $result['body'],
  784. ];
  785. }
  786. if ($this->pay_type == 4) {
  787. if ($this->_from == self::PAY_FROM_MINI) {
  788. if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming(get_store_id()) && self_mini() === false) {
  789. $result = Alipay::mini($order_list, '', $this->user, '', OrderNo::ORDER_UNION, $total_pay_price, $balance_price, $this);
  790. } else {
  791. if (is_profit_pay('ali')) {
  792. $result = AlipayProfit::mini($order_list, '', $this->user, '', OrderNo::ORDER_UNION, false, $total_pay_price, $balance_price, $this);
  793. } else {
  794. $result = Alipay::mini($order_list, '', $this->user, '', OrderNo::ORDER_UNION, $total_pay_price, $balance_price, $this);
  795. }
  796. }
  797. if (isset($result['code']) && $result['code'] == 1) {
  798. return $result;
  799. }
  800. $t->commit();
  801. return [
  802. 'code' => 0,
  803. 'msg' => 'success',
  804. 'data' => $result['data']['trade_no'],
  805. 'body' => '订单合并支付'
  806. ];
  807. } else if ($this->_from == self::PAY_FROM_H5) {
  808. if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming(get_store_id()) && self_mini() === false) {
  809. $result = Alipay::wap($order_list,'','',OrderNo::ORDER_UNION,$total_pay_price,$balance_price, $this);
  810. } else {
  811. if (is_profit_pay()) {
  812. $result = AlipayProfit::wap($order_list, '','',OrderNo::ORDER_UNION,$total_pay_price,$balance_price, $this);
  813. } else {
  814. $result = Alipay::wap($order_list, '','',OrderNo::ORDER_UNION,$total_pay_price,$balance_price, $this);
  815. }
  816. }
  817. $t->commit();
  818. return [
  819. 'code' => 0,
  820. 'msg' => 'success',
  821. 'data' => $result['data'],
  822. 'body' => '订单合并支付'
  823. ];
  824. } else {
  825. if (is_profit_pay('ali')) {
  826. $result = AlipayProfit::app($this->order, '', $this->user,OrderNo::ORDER_UNION,$total_pay_price,$this->user, $balance_price);
  827. } else {
  828. $result = Alipay::app($this->order, '', $this->user,OrderNo::ORDER_UNION,$total_pay_price, $balance_price);
  829. }
  830. if (isset($result['code']) && $result['code'] == 1) {
  831. $t->commit();
  832. return $result;
  833. }
  834. $t->commit();
  835. return [
  836. 'code' => 0,
  837. 'msg' => 'success',
  838. 'data' => $result['data'],
  839. 'body' => '订单合并支付'
  840. ];
  841. }
  842. // if (is_profit_pay('ali')) {
  843. // $result = AlipayProfit::mini($this->order, '', $this->user, '', OrderNo::ORDER_UNION, false, $total_pay_price, $balance_price);
  844. // } else {
  845. // $result = Alipay::mini($this->order, '', $this->user, '', OrderNo::ORDER_UNION, $total_pay_price, $balance_price);
  846. // }
  847. // if (isset($result['code']) && $result['code'] == 1) {
  848. // return $result;
  849. // }
  850. // $t->commit();
  851. // return [
  852. // 'code' => 0,
  853. // 'msg' => 'success',
  854. // 'data' => $result['data']['trade_no'],
  855. // ];
  856. }
  857. // 抖音
  858. if ($this->pay_type == 5) {
  859. $result = ByteDance::pay($this->order, OrderNo::ORDER_UNION, '', $total_pay_price , $balance_price);
  860. if (isset($result['code']) && $result['code'] == 1) {
  861. return $result;
  862. }
  863. $t->commit();
  864. return [
  865. 'code' => 0,
  866. 'msg' => 'success',
  867. 'data' => $result['data']['trade_no'],
  868. ];
  869. }
  870. //货到付款和余额支付数据处理
  871. if ($this->pay_type == 2 || $this->pay_type == 3) {
  872. //余额支付 用户余额变动
  873. if ($this->pay_type == 3) {
  874. if ($this->user->money < $total_pay_price) {
  875. $t->rollBack();
  876. return [
  877. 'code' => 1,
  878. 'msg' => '支付失败,余额不足',
  879. ];
  880. }
  881. $this->user->money = $this->user->money - $total_pay_price;
  882. if (!$this->user->save()) {
  883. $t->rollBack();
  884. return [
  885. 'code' => 1,
  886. 'msg' => '支付失败'
  887. ];
  888. } else {
  889. AccountLog::saveLog($this->user->id, floatval($total_pay_price), AccountLog::TYPE_BALANCE, AccountLog::LOG_TYPE_EXPEND, 1, 0, '合并订单支付');
  890. }
  891. foreach ($order_list as $order) {
  892. $order->is_pay = 1;
  893. $order->pay_type = 3;
  894. $order->pay_time = time();
  895. // 合并订单支付后修改订单状态为未发货
  896. $order->trade_status = Order::ORDER_FLOW_NO_SEND;
  897. $order->save();
  898. }
  899. }
  900. foreach ($order_list as $order) {
  901. (new NotifyForm())->videoGoodsShare($order);
  902. // 支付完成后,相关操作
  903. $form = new OrderComplete();
  904. $form->order_id = $order->id;
  905. $form->order_type = 0;
  906. $form->store_id = get_store_id();
  907. $form->notify();
  908. }
  909. CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
  910. //查询订单信息
  911. //var_dump($is_on);
  912. $t->commit();
  913. return [
  914. 'code' => 0,
  915. 'msg' => '订单提交成功'
  916. ];
  917. }
  918. }
  919. } catch (\Throwable $e) {
  920. \Yii::error($e);
  921. $t->rollBack();
  922. return [
  923. 'code' => 1,
  924. 'msg' => $e->getMessage(),
  925. 'data' => $e->getTrace(),
  926. ];
  927. }
  928. }
  929. public function meetOrderPay()
  930. {
  931. $this->wechatPay = \Yii::$app->controller->wechatPay;
  932. if (!$this->validate()) {
  933. return [
  934. 'code' => 1,
  935. 'msg' => $this->getErrorSummary(false)[0],
  936. ];
  937. }
  938. if(empty($this->order_id)){
  939. return ['code'=>1,'msg'=>'订单ID错误'];
  940. }
  941. $this->order = Order::find()->where(['id'=>$this->order_id,'pay_type'=>2])->one();
  942. if(!$this->order){
  943. return ['code' => 1, 'msg' => '订单不存在'];
  944. }
  945. if($this->order->is_pay == Order::IS_PAY_TRUE){
  946. return ['code' => 1, 'msg' => '订单已支付,请勿重复支付'];
  947. }
  948. $goods_names = '';
  949. $goods_list = OrderDetail::find()->alias('od')->leftJoin(['g' => Goods::tableName()],
  950. 'g.id=od.goods_id')->where(['od.order_id' => $this->order->id, 'od.is_delete' => 0,
  951. ])->select('g.name,g.verify_card_id')->asArray()->all();
  952. foreach ($goods_list as $goods) {
  953. $goods_names .= $goods['name'] . ';';
  954. }
  955. $goods_names = mb_substr($goods_names, 0, 32, 'utf-8');
  956. // 不会存在余额混合支付
  957. $balance_price = 0;
  958. $t = \Yii::$app->db->beginTransaction();
  959. // 微信支付
  960. if($this->pay_type == 1){
  961. if ($this->_from == self::PAY_FROM_APP) {
  962. if (is_profit_pay()) {
  963. $result = WechatNewPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, true, $balance_price);
  964. } else {
  965. $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, true, $balance_price);
  966. }
  967. } else if ($this->_from == self::PAY_FROM_H5) {
  968. if (is_profit_pay()) {
  969. $result = WechatNewPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, true);
  970. } else {
  971. $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, true);
  972. }
  973. } else if ($this->_from == self::PAY_FROM_OFFICIAL) {
  974. if (is_profit_pay()) {
  975. $result = WechatNewPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, false, true);
  976. } else {
  977. $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, false, true);
  978. }
  979. } else {
  980. if (is_profit_pay()) {
  981. $result = WechatNewPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price);
  982. } else {
  983. $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price);
  984. }
  985. }
  986. if (isset($result['code']) && $result['code'] == 1) {
  987. if ($this->_from == self::PAY_FROM_OFFICIAL) {
  988. $result['wechat_platform_open_id'] = get_user()->wechat_platform_open_id;
  989. $result['h5_auth_link'] = LoginForm::getAuthLink();
  990. }
  991. return $result;
  992. }
  993. CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
  994. $t->commit();
  995. return [
  996. 'code' => 0,
  997. 'msg' => 'success',
  998. 'data' => (object)$result['data'],
  999. 'res' => $result['res'],
  1000. 'body' => $goods_names
  1001. ];
  1002. }
  1003. // 支付宝支付
  1004. if($this->pay_type == 4){
  1005. if ($this->_from == self::PAY_FROM_MINI) {
  1006. if (is_profit_pay('ali')) {
  1007. $result = AlipayProfit::mini($this->order, $goods_names, $this->user, '', '', false, 0, $balance_price);
  1008. } else {
  1009. $result = Alipay::mini($this->order, $goods_names, $this->user, '', '', 0, $balance_price);
  1010. }
  1011. if (isset($result['code']) && $result['code'] == 1) {
  1012. return $result;
  1013. }
  1014. $t->commit();
  1015. return [
  1016. 'code' => 0,
  1017. 'msg' => 'success',
  1018. 'data' => $result['data']['trade_no'],
  1019. 'body' => $goods_names
  1020. ];
  1021. } else {
  1022. if (is_profit_pay('ali')) {
  1023. $result = AlipayProfit::app($this->order, $goods_names, $this->user, $balance_price);
  1024. } else {
  1025. $result = Alipay::app($this->order, $goods_names, $this->user, $balance_price);
  1026. }
  1027. if (isset($result['code']) && $result['code'] == 1) {
  1028. $t->commit();
  1029. return $result;
  1030. }
  1031. $t->commit();
  1032. return [
  1033. 'code' => 0,
  1034. 'msg' => 'success',
  1035. 'data' => $result['data'],
  1036. 'body' => $goods_names
  1037. ];
  1038. }
  1039. }
  1040. return ['code' => 1,'msg' => '货到付款支付错误'];
  1041. }
  1042. /**
  1043. * 设置佣金
  1044. * @param Order $order
  1045. * @return mixed
  1046. */
  1047. public function setReturnData($order)
  1048. {
  1049. $form = new ShareMoneyForm();
  1050. $form->order = $order;
  1051. $form->order_type = 0;
  1052. //处理联盟券 用户减少
  1053. if($order->take_price > 0){
  1054. $user = User::findOne($order->user_id);
  1055. $saas_user = SaasUser::findOne(['mobile' => $user->binding]);
  1056. if($saas_user){
  1057. $take_price = $order->take_price;
  1058. $before = $saas_user->league_price;
  1059. $saas_user->updateCounters(['league_price' => -floatval($take_price)]);
  1060. \app\models\SaaSLeaguePriceLog::setLeaguePriceLog(
  1061. $order->store_id,
  1062. $saas_user->id,
  1063. $take_price,
  1064. $before,
  1065. \app\models\SaaSLeaguePriceLog::TYPE_DEDUCTION,
  1066. \app\models\SaaSLeaguePriceLog::TAKE_TYPE,
  1067. \app\models\SaaSLeaguePriceLog::ROLE_USER,
  1068. $order->id
  1069. );
  1070. }
  1071. }
  1072. return $form->setData();
  1073. }
  1074. /**
  1075. * @param Order $order
  1076. * @throws \Exception
  1077. */
  1078. private function checkGoodsConfine($order)
  1079. {
  1080. foreach ($order->detail as $detail) {
  1081. /* @var Goods $goods*/
  1082. /* @var OrderDetail $detail*/
  1083. $goods = $detail->goods;
  1084. if ($goods->confine_count && $goods->confine_count > 0) {
  1085. $user = User::findOne($order->user_id);
  1086. $goodsNum = Goods::getBuyNum($user, $goods->id);
  1087. if ($goodsNum) {
  1088. } else {
  1089. $goodsNum = 0;
  1090. }
  1091. $goodsTotalNum = intval($goodsNum + $detail->num);
  1092. if ($goodsTotalNum > $goods->confine_count) {
  1093. throw new \Exception('商品:' . $goods->name . ' 超出购买数量', 1);
  1094. }
  1095. }
  1096. //起订数量
  1097. if (($goods['order_min_count'] && $goods['order_min_count'] > 0)) {
  1098. if ($detail->num < $goods['order_min_count']) {
  1099. throw new \Exception('商品:' . $goods->name . ' 起订数量' . $goods['order_min_count'], 1);
  1100. }
  1101. }
  1102. if (in_array($order->order_type, [1, 2])) {
  1103. $res = $this->bookCheckGoodsNum($goods, $detail, $order);
  1104. if ($res['code'] > 0) {
  1105. throw new \Exception($res['msg'], 1);
  1106. }
  1107. }
  1108. }
  1109. }
  1110. /**
  1111. * @param Goods $goods
  1112. * @param OrderDetail $detail
  1113. * @param Order $order
  1114. */
  1115. private function bookCheckGoodsNum($goods, $detail, $order)
  1116. {
  1117. // 判断时间
  1118. if (time() - $order->created_at > 15 * 60) {
  1119. return [
  1120. 'code' => 1,
  1121. 'msg' => '订单已过支付时间,将自动取消'
  1122. ];
  1123. }
  1124. $attr = Json::decode($detail->attr);
  1125. // 酒店预约
  1126. if ($order->order_type == 1) {
  1127. // $date_book = GoodsBook::findOne(['goods_id' => $goods->id])->date_book;
  1128. // $date_book = Json::decode($date_book);
  1129. // if (!$date_book) {
  1130. // return [
  1131. // 'code' => 1,
  1132. // 'msg' => '数据异常'
  1133. // ];
  1134. // }
  1135. // $data_config = array_combine(array_column($date_book, 'date'), array_column($date_book, 'num'));
  1136. // foreach ($attr as $value) {
  1137. // if (isset($data_config[$value['date']])) {
  1138. // if ($data_config[$value['date']] < $detail->num) {
  1139. // return [
  1140. // 'code' => 1,
  1141. // 'msg' => '选中日期' . $value['date'] . '内暂无房源'
  1142. // ];
  1143. // }
  1144. // } else {
  1145. // return [
  1146. // 'code' => 1,
  1147. // 'msg' => '未找到预约时间下相关商品数据'
  1148. // ];
  1149. // }
  1150. // }
  1151. }
  1152. // 服务预约
  1153. if ($order->order_type == 2) {
  1154. $service_book = GoodsBook::findOne(['goods_id' => $goods->id])->service_book;
  1155. $service_book = Json::decode($service_book);
  1156. if (!$service_book) {
  1157. return [
  1158. 'code' => 1,
  1159. 'msg' => '数据异常'
  1160. ];
  1161. }
  1162. $date_data = $this->getDateByInterval(7);
  1163. $count = 0;
  1164. $new_arr = [
  1165. 'data' => []
  1166. ];
  1167. $order = Order::find()->alias('o')
  1168. ->leftJoin(['od' => OrderDetail::tableName()], 'o.id = od.order_id')
  1169. ->where(['o.trade_status' => [0, 2, 3], 'o.is_delete' => 0, 'o.order_type' => 2, 'goods_id' => $goods['id']])
  1170. ->andWhere(['>', 'o.created_at', strtotime(date("Y-m-d"))])
  1171. ->select('od.attr, od.num')->asArray()->all();
  1172. foreach ($date_data as $index => $datum) {
  1173. $new_arr['data'][$index]['date'] = $datum;
  1174. $new_arr['data'][$index]['time'] = $service_book['data'][0]['time'];
  1175. }
  1176. if (!$new_arr) {
  1177. return [
  1178. 'code' => 1,
  1179. 'msg' => '数据异常'
  1180. ];
  1181. }
  1182. $service_book = $new_arr['data'];
  1183. $service_book_date = array_column($service_book, NULL, 'date');
  1184. $service_book_time = $service_book_date[$attr['date']]['time'];
  1185. $num = 0;
  1186. $is = false;
  1187. foreach ($order as $item) {
  1188. $item['attr'] = json_decode($item['attr'], true);
  1189. if ($item['attr']['date'] === $attr['date']) {
  1190. if ($attr['time'] == $item['attr']['time']) {
  1191. $num += $item['num'];
  1192. }
  1193. }
  1194. }
  1195. foreach ($service_book_time as $m) {
  1196. foreach ($m['times'] as $n) {
  1197. $is = true;
  1198. if ($n['time'] == $attr['time']) {
  1199. if (($detail->num + $num) > $n['num']) {
  1200. return [
  1201. 'code' => 1,
  1202. 'msg' => $n['time'] . '时间段内暂不可预约'
  1203. ];
  1204. }
  1205. }
  1206. }
  1207. }
  1208. if ($is === false) {
  1209. return [
  1210. 'code' => 1,
  1211. 'msg' => '未找到预约时间下相关商品数据'
  1212. ];
  1213. }
  1214. }
  1215. return [
  1216. 'code' => 0,
  1217. 'msg' => 'success'
  1218. ];
  1219. }
  1220. public function getDateByInterval(int $num) :array
  1221. {
  1222. //var_dump($st, $et);die;
  1223. $returnData = [];
  1224. $i = 0;
  1225. do {
  1226. $temp = date('Y-m-d', strtotime('+' . $i . ' day', strtotime(date('Y-m-d'))));
  1227. $returnData[] = $temp;
  1228. $i++;
  1229. } while ($i < $num);
  1230. return $returnData;
  1231. }
  1232. }