OrderPayDataForm.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\plugins\scanCodePay\models\form;
  8. use app\models\AccountLog;
  9. use app\models\common\CommonOrder;
  10. use app\models\Goods;
  11. use app\models\OrderUnion;
  12. use app\models\User;
  13. use app\plugins\scanCodePay\models\OrderComplete;
  14. use app\modules\client\models\v1\ShareMoneyForm;
  15. use app\models\Order as COrder;
  16. use app\plugins\scanCodePay\models\Order;
  17. use app\plugins\scanCodePay\models\OrderDetail;
  18. use app\utils\Alipay\Alipay;
  19. // use app\utils\CloudPrint;
  20. use app\utils\Alipay\AlipayProfit;
  21. use app\utils\OrderNo;
  22. use app\utils\Wechat\WechatNewPay;
  23. use app\utils\Wechat\WechatPay;
  24. use EasyWeChat\MiniProgram\Application;
  25. use yii\base\BaseObject;
  26. use yii\base\Model;
  27. use app\models\Store;
  28. use app\utils\Adapay\Adapay;
  29. /**
  30. * @property User $user
  31. * @property Order $order
  32. */
  33. class OrderPayDataForm extends Model
  34. {
  35. public $store_id;
  36. public $order_id;
  37. public $order_id_list;
  38. public $pay_type;
  39. public $user;
  40. public $form_id;
  41. public $parent_user_id;
  42. public $condition;
  43. public $_from;
  44. public $is_combine;
  45. /** @var Application $wechat */
  46. private $wechat;
  47. private $wechatPay;
  48. private $order;
  49. private $session_key;
  50. const PAY_FROM_APP = 'app';
  51. const PAY_FROM_MINI = 'mini';
  52. public function rules()
  53. {
  54. return [
  55. [['pay_type', '_from'], 'required'],
  56. [['_from'], 'in', 'range' => ['app', 'mini']],
  57. [['pay_type'], 'in', 'range' => [1, 2, 3, 4, COrder::PAY_TYPE_WX_B2B, COrder::PAY_TYPE_ADAPAY_WX, COrder::PAY_TYPE_ADAPAY_ALIPAY]], // 'WECHAT_PAY', 'HUODAO_PAY', 'BALANCE_PAY' 'ALIPAY',
  58. [['form_id', 'order_id_list', '_from'], 'string'],
  59. ['is_combine', 'default', 'value' => 0],
  60. [['parent_user_id', 'condition', 'order_id', 'is_combine'], 'integer'],
  61. [['session_key'], 'safe'],
  62. ];
  63. }
  64. public function search()
  65. {
  66. $this->wechatPay = \Yii::$app->controller->wechatPay;
  67. if (!$this->validate()) {
  68. return [
  69. 'code' => 1,
  70. 'msg' => $this->getErrorSummary(false)[0],
  71. ];
  72. }
  73. $this->user->money = doubleval($this->user->money);
  74. if ($this->order_id_list) {
  75. $order_id_list = json_decode($this->order_id_list, true);
  76. if (is_array($order_id_list) && count($order_id_list) == 1) {
  77. $this->order_id = $order_id_list[0];
  78. $this->order_id_list = '';
  79. }
  80. }
  81. $t = \Yii::$app->db->beginTransaction();
  82. $this->order = Order::findOne([
  83. 'store_id' => $this->store_id,
  84. 'id' => $this->order_id,
  85. ]);
  86. if (!$this->order) {
  87. $t->rollBack();
  88. return [
  89. 'code' => 1,
  90. 'msg' => '订单不存在',
  91. ];
  92. }
  93. if ($this->order->is_delete == 1 || $this->order->trade_status == Order::ORDER_FLOW_CANCEL) {
  94. $t->rollBack();
  95. return [
  96. 'code' => 1,
  97. 'msg' => '订单已取消',
  98. ];
  99. }
  100. // 存储parent_id
  101. CommonOrder::saveParentId($this->parent_user_id);
  102. $goods_names = '';
  103. $goods_list = OrderDetail::find()->alias('od')->leftJoin(['g' => Goods::tableName()],
  104. 'g.id=od.goods_id')->where(['od.order_id' => $this->order->id, 'od.is_delete' => 0,
  105. ])->select('g.name,g.verify_card_id')->asArray()->all();
  106. foreach ($goods_list as $goods) {
  107. $goods_names .= $goods['name'] . ';';
  108. }
  109. $goods_names = mb_substr($goods_names, 0, 32, 'utf-8');
  110. $this->setReturnData($this->order);
  111. $this->order->order_union_id = 0;
  112. // 供应链系统下单时是否使用平台商户号,1使用,0未使用
  113. if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming($this->store_id)) {
  114. $this->order->is_use_platform_mch = 1;
  115. }
  116. if (!$this->order->save()) {
  117. $t->rollBack();
  118. return [
  119. 'code' => 1,
  120. 'msg' => '订单保存失败'
  121. ];
  122. }
  123. // 余额抵扣支付
  124. $balance_price = 0;
  125. if ($this->is_combine) {
  126. if ($this->user->money >= $this->order->pay_price) {
  127. $this->pay_type = 3;
  128. } else {
  129. $balance_price = $this->user->money;
  130. $this->order->combine_money = $this->user->money;
  131. $this->order->is_combine_pay = 1;
  132. $this->order->save();
  133. }
  134. } else {
  135. $this->order->combine_money = 0;
  136. $this->order->is_combine_pay = 0;
  137. $this->order->save();
  138. }
  139. if ($this->pay_type == 1) {
  140. if ($this->order->pay_price == 0) {
  141. $this->order->is_pay = 1;
  142. $this->order->pay_type = 1;
  143. if ($this->pay_type == 4) {
  144. $this->order->pay_type = 4;
  145. }
  146. $this->order->pay_time = time();
  147. if (!$this->order->save()) {
  148. $t->rollBack();
  149. return [
  150. 'code' => 1,
  151. 'msg' => '支付失败'
  152. ];
  153. }
  154. // 支付完成后,相关操作
  155. $form = new OrderComplete();
  156. $form->order_id = $this->order->id;
  157. $form->order_type = 6;
  158. $form->store_id = get_store_id();
  159. $form->notify();
  160. $t->commit();
  161. return [
  162. 'code' => 0,
  163. 'msg' => '0元支付'
  164. ];
  165. }
  166. if ($this->_from == self::PAY_FROM_APP) {
  167. if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming(get_store_id()) && self_mini() === false) {
  168. $result = WechatPay::orderUnify($this->order, OrderNo::ORDER_SCAN_CODE_PAY, $goods_names, 0, true, $balance_price);
  169. } else {
  170. if (is_profit_pay()) {
  171. $result = WechatNewPay::orderUnify($this->order, OrderNo::ORDER_SCAN_CODE_PAY, $goods_names, 0, true, $balance_price);
  172. } else {
  173. $result = WechatPay::orderUnify($this->order, OrderNo::ORDER_SCAN_CODE_PAY, $goods_names, 0, true, $balance_price);
  174. }
  175. }
  176. } else {
  177. if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming(get_store_id()) && self_mini() === false) {
  178. $result = WechatPay::orderUnify($this->order, OrderNo::ORDER_SCAN_CODE_PAY, $goods_names, 0, false, $balance_price);
  179. } else {
  180. if (is_profit_pay()) {
  181. $result = WechatNewPay::orderUnify($this->order, OrderNo::ORDER_SCAN_CODE_PAY, $goods_names, 0, false, $balance_price);
  182. } else {
  183. $result = WechatPay::orderUnify($this->order, OrderNo::ORDER_SCAN_CODE_PAY, $goods_names, 0, false, $balance_price);
  184. }
  185. }
  186. }
  187. if (isset($result['code']) && $result['code'] == 1) {
  188. return $result;
  189. }
  190. // CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
  191. $t->commit();
  192. return [
  193. 'code' => 0,
  194. 'msg' => 'success',
  195. 'data' => (object)$result['data'],
  196. 'res' => $result['res'],
  197. 'body' => $goods_names
  198. ];
  199. } elseif (in_array($this->pay_type, [COrder::PAY_TYPE_ADAPAY_WX, COrder::PAY_TYPE_ADAPAY_ALIPAY])) {
  200. $result = Adapay::create($this->pay_type, $this->order, OrderNo::ORDER_SCAN_CODE_PAY, $goods_names, 0, false, $balance_price);
  201. $t->commit();
  202. return $result;
  203. } elseif (in_array($this->pay_type, [COrder::PAY_TYPE_WX_B2B])) {
  204. $result = \app\modules\admin\models\UserAuditForm::pay($this->session_key, $this->order, OrderNo::ORDER_SCAN_CODE_PAY, $goods_names);
  205. $t->commit();
  206. return $result;
  207. } else if ($this->pay_type == 4) {
  208. if (is_profit_pay('ali')) {
  209. $result = AlipayProfit::mini($this->order, $goods_names, $this->user, '', '', false, 0, $balance_price);
  210. } else {
  211. $result = Alipay::mini($this->order, $goods_names, $this->user, '', '', 0, $balance_price);
  212. }
  213. if (isset($result['code']) && $result['code'] == 1) {
  214. return $result;
  215. }
  216. $t->commit();
  217. return [
  218. 'code' => 0,
  219. 'msg' => 'success',
  220. 'data' => $result['data']['trade_no'],
  221. 'body' => $goods_names
  222. ];
  223. } else if ($this->pay_type == 3) {
  224. $order = $this->order;
  225. $user = User::findOne(['id' => $order->user_id]);
  226. if ($user->money < $order->pay_price) {
  227. $t->rollBack();
  228. return [
  229. 'code' => 1,
  230. 'msg' => '支付失败,余额不足',
  231. ];
  232. }
  233. // $user->money -= floatval($order->pay_price);
  234. $res = AccountLog::saveLog($user->id, floatval($order->pay_price), AccountLog::TYPE_BALANCE, AccountLog::LOG_TYPE_EXPEND, AccountLog::TYPE_SCAN_CODE_PAY, $order->id, "当面付余额支付,订单号为:{$order->order_no}。");
  235. if (!$res) {
  236. $t->rollBack();
  237. return [
  238. 'code' => 1,
  239. 'msg' => '支付失败'
  240. ];
  241. }
  242. $order->is_pay = 1;
  243. $order->pay_type = 3;
  244. $order->trade_status = \app\models\Order::ORDER_FLOW_CONFIRM;
  245. $order->pay_time = time();
  246. if (!$order->save()) {
  247. $t->rollBack();
  248. return [
  249. 'code' => 1,
  250. 'msg' => '支付失败'
  251. ];
  252. }
  253. // 支付完成后,相关操作
  254. $form = new OrderComplete();
  255. $form->order_id = $this->order->id;
  256. $form->order_type = 6;
  257. $form->store_id = $this->order->store_id;
  258. $form->notify();
  259. $t->commit();
  260. return [
  261. 'code' => 0,
  262. 'msg' => '支付成功'
  263. ];
  264. } else {
  265. return [
  266. 'code' => 1,
  267. 'msg' => '支付方式有误'
  268. ];
  269. }
  270. }
  271. /**
  272. * 设置佣金
  273. * @param Order $order
  274. * @return mixed
  275. */
  276. private function setReturnData($order)
  277. {
  278. $form = new ShareMoneyForm();
  279. $form->order = $order;
  280. return $form->setScanCodePayData();
  281. }
  282. }