Payment.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. <?php
  2. namespace app\common\logic;
  3. use app\common\model\Goods;
  4. use think\facade\Db;
  5. use think\facade\Log;
  6. /**
  7. * ============================================================================
  8. * DSMall多用户商城
  9. * ============================================================================
  10. * 版权所有 2014-2028 长沙德尚网络科技有限公司,并保留所有权利。
  11. * 网站地址: http://www.csdeshang.com
  12. * ----------------------------------------------------------------------------
  13. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
  14. * 不允许对程序代码以任何形式任何目的的再发布。
  15. * ============================================================================
  16. * 逻辑层模型
  17. */
  18. class Payment
  19. {
  20. /**
  21. * 取得实物订单所需支付金额等信息
  22. * @param int $pay_sn
  23. * @param int $member_id
  24. * @return array
  25. */
  26. public function getRealOrderInfo($pay_sn, $member_id = null)
  27. {
  28. //验证订单信息
  29. $order_model = model('order');
  30. $condition = [];
  31. $condition[] = ['pay_sn', '=', $pay_sn];
  32. if (!empty($member_id)) {
  33. $condition[] = ['buyer_id', '=', $member_id];
  34. }
  35. $order_pay_info = $order_model->getOrderpayInfo($condition);
  36. if (empty($order_pay_info)) {
  37. return ds_callback(false, '该支付单不存在');
  38. }
  39. $order_pay_info['subject'] = '实物订单_' . $order_pay_info['pay_sn'];
  40. $order_pay_info['order_type'] = 'real_order';
  41. $condition = [];
  42. $condition[] = ['pay_sn', '=', $pay_sn];
  43. $order_list = $order_model->getNormalOrderList($condition);
  44. //计算本次需要在线支付的订单总金额
  45. $pay_amount = 0;
  46. $point_ratio = config('app.point_ratio');
  47. if (!empty($order_list)) {
  48. foreach ($order_list as $order_info) {
  49. $payed_amount = floatval($order_info['rcb_amount']) + floatval($order_info['pd_amount']) + floatval($order_info['point_amount'] / $point_ratio);
  50. if ($order_info['payment_code'] != 'offline' and $order_info['order_state'] > 0) {
  51. if ($order_info['order_state'] == ORDER_STATE_NEW) {
  52. }
  53. $pay_amount += floatval($order_info['order_amount']) - $payed_amount;
  54. } else {
  55. }
  56. }
  57. }
  58. $order_pay_info['api_pay_amount'] = $pay_amount;
  59. $order_pay_info['order_list'] = $order_list;
  60. return ds_callback(true, '', $order_pay_info);
  61. }
  62. /**
  63. * 取得虚拟订单所需支付金额等信息
  64. * @param int $order_sn
  65. * @param int $member_id
  66. * @return array
  67. */
  68. public function getVrOrderInfo($order_sn, $member_id = null)
  69. {
  70. //验证订单信息
  71. $vrorder_model = model('vrorder');
  72. $condition = [];
  73. $condition[] = ['order_sn', '=', $order_sn];
  74. if (!empty($member_id)) {
  75. $condition[] = ['buyer_id', '=', $member_id];
  76. }
  77. $order_info = $vrorder_model->getVrorderInfo($condition);
  78. if (empty($order_info)) {
  79. return ds_callback(false, '该订单不存在');
  80. }
  81. $order_info['subject'] = '虚拟订单_' . $order_sn;
  82. $order_info['order_type'] = 'vr_order';
  83. $order_info['pay_sn'] = $order_sn;
  84. //修复 第三方支付时 充值卡没算在内BUG
  85. $point_ratio = config('app.point_ratio');
  86. $pay_amount = ds_price_format(floatval($order_info['order_amount']) - floatval($order_info['pd_amount']) - floatval($order_info['rcb_amount'] / $point_ratio));
  87. $order_info['api_pay_amount'] = $pay_amount;
  88. return ds_callback(true, '', $order_info);
  89. }
  90. /**
  91. * 取得充值单所需支付金额等信息
  92. * @param int $pdr_sn
  93. * @param int $member_id
  94. * @return array
  95. */
  96. public function getPdOrderInfo($pdr_sn, $member_id = null)
  97. {
  98. $predeposit_model = model('predeposit');
  99. $condition = [];
  100. $condition[] = ['pdr_sn', '=', $pdr_sn];
  101. if (!empty($member_id)) {
  102. $condition[] = ['pdr_member_id', '=', $member_id];
  103. }
  104. $order_info = $predeposit_model->getPdRechargeInfo($condition);
  105. if (empty($order_info)) {
  106. return ds_callback(false, '该订单不存在');
  107. }
  108. $order_info['subject'] = '预存款充值_' . $order_info['pdr_sn'];
  109. $order_info['order_type'] = 'pd_order';
  110. $order_info['pay_sn'] = $order_info['pdr_sn'];
  111. $order_info['api_pay_amount'] = $order_info['pdr_amount'];
  112. return ds_callback(true, '', $order_info);
  113. }
  114. public function getTicketOrderInfo($order_sn, $member_id = null)
  115. {
  116. //验证订单信息
  117. $TicketOrder = model('TicketOrder');
  118. $condition = [];
  119. $condition[] = ['order_sn', '=', $order_sn];
  120. if (!empty($member_id)) {
  121. $condition[] = ['buyer_id', '=', $member_id];
  122. }
  123. $order_info = $TicketOrder->where($condition)->find();
  124. if (empty($order_info)) {
  125. return ds_callback(false, '该订单不存在');
  126. }
  127. $order_info['subject'] = '电影票订单_' . $order_sn;
  128. $order_info['order_type'] = 'ticket_order';
  129. $order_info['pay_sn'] = $order_sn;
  130. //修复 第三方支付时 充值卡没算在内BUG
  131. $point_ratio = config('app.point_ratio');
  132. $pay_amount = ds_price_format(floatval($order_info['order_amount']) - floatval($order_info['pd_amount']) - floatval($order_info['rcb_amount']) - floatval($order_info['point_amount'] / $point_ratio));
  133. $order_info['api_pay_amount'] = $pay_amount;
  134. return ds_callback(true, '', $order_info);
  135. }
  136. public function getStoreOrderInfo($order_sn, $member_id = null)
  137. {
  138. //验证订单信息
  139. $StoreOrder = model('StoreOrder');
  140. $condition = [];
  141. $condition[] = ['order_sn', '=', $order_sn];
  142. if (!empty($member_id)) {
  143. $condition[] = ['buyer_id', '=', $member_id];
  144. }
  145. $order_info = $StoreOrder->where($condition)->find();
  146. if (empty($order_info)) {
  147. return ds_callback(false, '该订单不存在');
  148. }
  149. $order_info['subject'] = '到店付款订单_' . $order_sn;
  150. $order_info['order_type'] = 'store_order';
  151. $order_info['pay_sn'] = $order_sn;
  152. //修复 第三方支付时 充值卡没算在内BUG
  153. $point_ratio = config('app.point_ratio');
  154. $pay_amount = ds_price_format(floatval($order_info['order_amount']) - floatval($order_info['pd_amount']) - floatval($order_info['point_amount'] / $point_ratio) - floatval($order_info['deduction_amount']));
  155. $order_info['api_pay_amount'] = $pay_amount;
  156. return ds_callback(true, '', $order_info);
  157. }
  158. /**
  159. * 取得所使用支付方式信息
  160. * @param unknown $payment_code
  161. */
  162. public function getPaymentInfo($payment_code)
  163. {
  164. if (in_array($payment_code, ['offline', 'predeposit']) || empty($payment_code)) {
  165. return ds_callback(false, '系统不支持选定的支付方式');
  166. }
  167. $payment_model = model('payment');
  168. $condition = [];
  169. $condition[] = ['payment_code', '=', $payment_code];
  170. $payment_info = $payment_model->getPaymentOpenInfo($condition);
  171. if (empty($payment_info)) {
  172. return ds_callback(false, '系统不支持选定的支付方式');
  173. }
  174. $inc_file = PLUGINS_PATH . DIRECTORY_SEPARATOR . 'payments' . DIRECTORY_SEPARATOR . $payment_info['payment_code'] . DIRECTORY_SEPARATOR . $payment_info['payment_code'] . '.php';
  175. if (!file_exists($inc_file)) {
  176. return ds_callback(false, '系统不支持选定的支付方式');
  177. }
  178. require_once $inc_file;
  179. $payment_info['payment_config'] = unserialize($payment_info['payment_config']);
  180. return ds_callback(true, '', $payment_info);
  181. }
  182. /**
  183. * 支付成功后修改实物订单状态
  184. */
  185. public function updateRealOrder($out_trade_no, $payment_code, $order_list, $trade_no)
  186. {
  187. $post['payment_code'] = $payment_code;
  188. $post['trade_no'] = $trade_no;
  189. try {
  190. Db::startTrans();
  191. model('order', 'logic')->changeOrderReceivePay($order_list, 'system', '系统', $post);
  192. } catch (\Exception $e) {
  193. Db::rollback();
  194. return ds_callback(false, $e->getMessage());
  195. }
  196. Db::commit();
  197. return ds_callback(true, '操作成功');
  198. }
  199. /**
  200. * 支付成功后修改虚拟订单状态
  201. */
  202. public function updateVrOrder($out_trade_no, $payment_code, $order_info, $trade_no)
  203. {
  204. $post['payment_code'] = $payment_code;
  205. $post['trade_no'] = $trade_no;
  206. return model('vrorder', 'logic')->changeOrderStatePay($order_info, 'system', $post);
  207. }
  208. /**
  209. * 支付成功后修改虚拟订单状态
  210. */
  211. public function updateTicketOrder($out_trade_no, $payment_code, $order_info, $trade_no)
  212. {
  213. $post['payment_code'] = $payment_code;
  214. $post['trade_no'] = $trade_no;
  215. return model('ticketorder', 'logic')->changeOrderStatePay($order_info, 'system', $post);
  216. }
  217. /**
  218. * 支付成功后修改到店付款订单状态
  219. */
  220. public function updateStoreOrder($out_trade_no, $payment_code, $order_info, $trade_no)
  221. {
  222. $post['payment_code'] = $payment_code;
  223. $post['trade_no'] = $trade_no;
  224. return model('storeorder', 'logic')->changeOrderStatePay($order_info, 'system', $post);
  225. }
  226. /**
  227. * 支付成功后修改充值订单状态
  228. * @param unknown $out_trade_no
  229. * @param unknown $trade_no
  230. * @param unknown $payment_code
  231. * @return multitype:unknown
  232. * @throws Exception
  233. */
  234. public function updatePdOrder($out_trade_no, $payment_code, $recharge_info, $trade_no)
  235. {
  236. $condition = [];
  237. $condition[] = ['pdr_sn', '=', $recharge_info['pdr_sn']];
  238. $condition[] = ['pdr_payment_state', '=', 0];
  239. $update = [];
  240. $update['pdr_payment_state'] = 1;
  241. $update['pdr_paymenttime'] = TIMESTAMP;
  242. $update['pdr_payment_code'] = $payment_code;
  243. $update['pdr_trade_sn'] = $trade_no;
  244. $predeposit_model = model('predeposit');
  245. try {
  246. Db::startTrans();
  247. $pdnum = $predeposit_model->getPdRechargeCount([
  248. 'pdr_sn' => $recharge_info['pdr_sn'], 'pdr_payment_state' => 1,
  249. ]);
  250. if (intval($pdnum) > 0) {
  251. throw new \think\Exception('订单已经处理', 10006);
  252. }
  253. //更改充值状态
  254. $state = $predeposit_model->editPdRecharge($update, $condition);
  255. if (!$state) {
  256. throw new \think\Exception('更新充值状态失败', 10006);
  257. }
  258. //变更会员预存款
  259. $data = [];
  260. $data['member_id'] = $recharge_info['pdr_member_id'];
  261. $data['member_name'] = $recharge_info['pdr_member_name'];
  262. $data['amount'] = $recharge_info['pdr_amount'];
  263. $data['pdr_sn'] = $recharge_info['pdr_sn'];
  264. $predeposit_model->changePd('recharge', $data);
  265. Db::commit();
  266. return ds_callback(true);
  267. } catch (\Exception $e) {
  268. Db::rollback();
  269. return ds_callback(false, $e->getMessage());
  270. }
  271. }
  272. /**
  273. *
  274. * @param type $out_trade_no #商城内部订单号
  275. * @param type $trade_no #支付交易流水号
  276. * @param type $order_type #订单ID
  277. * @param type $payment_code #支付方式代号
  278. */
  279. public function updateOrder($out_trade_no, $trade_no, $order_type, $payment_code)
  280. {
  281. $out_trade_no = current(explode('_', $out_trade_no));
  282. if ($order_type == 'real_order') {
  283. $order = $this->getRealOrderInfo($out_trade_no);
  284. if (empty($order) || empty($order['data']['order_list']) || intval($order['data']['api_paystate'])) {
  285. //订单已支付
  286. return true;
  287. }
  288. $order_list = $order['data']['order_list'];
  289. $result = $this->updateRealOrder($out_trade_no, $payment_code, $order_list, $trade_no);
  290. foreach ($order_list as $key => $value) {
  291. $this->paysuccesspush($value, 0);
  292. //发送短信通知
  293. $this->payPhoneMessage($value, 0);
  294. }
  295. $this->payRecordPush($out_trade_no, 0);
  296. } elseif ($order_type == 'vr_order') {
  297. $order = $this->getVrOrderInfo($out_trade_no);
  298. if (empty($order) || $order['data']['order_state'] != ORDER_STATE_NEW) {
  299. //订单已支付
  300. return true;
  301. }
  302. $result = $this->updateVrOrder($out_trade_no, $payment_code, $order['data'], $trade_no);
  303. //TODO 回调这边去关联卡券
  304. $order = $order['data'];
  305. $goodsInfo = Db::name('goods')->where('goods_id', $order['goods_id'])->find();
  306. if (!empty($goodsInfo['virtual_code'])) {
  307. //存在卡券时
  308. $dataInfo = [
  309. 'virtual_code' => $goodsInfo['virtual_code'],
  310. 'quantity' => $order['goods_num'],
  311. 'order_id' => $order['order_id'],
  312. ];
  313. $buy_logic = model('voucher', 'logic');
  314. $voucherRes = $buy_logic->getVoucherListByGood($dataInfo, $order['buyer_id']);
  315. }
  316. $this->paysuccesspush($order, 1);
  317. //发送订单推送
  318. $this->payRecordPush($out_trade_no, 1);
  319. } elseif ($order_type == 'pd_order') {
  320. $order = $this->getPdOrderInfo($out_trade_no);
  321. if (empty($order) || $order['data']['pdr_payment_state'] == 1) {
  322. //订单已支付
  323. return true;
  324. }
  325. $result = $this->updatePdOrder($out_trade_no, $payment_code, $order['data'], $trade_no);
  326. } else if ($order_type == 'ticket_order') {
  327. $order = $this->getTicketOrderInfo($out_trade_no);
  328. if (empty($order) || $order['data']['order_state'] != ORDER_STATE_NEW) {
  329. //订单已支付
  330. return true;
  331. }
  332. $result = $this->updateTicketOrder($out_trade_no, $payment_code, $order['data'], $trade_no);
  333. $this->paysuccesspush($order, 2);
  334. //发送订单推送
  335. $this->payRecordPush($out_trade_no, 2);
  336. } else if ($order_type == 'store_order') {
  337. $order = $this->getStoreOrderInfo($out_trade_no);
  338. if (empty($order) || $order['data']['order_state'] != ORDER_STATE_NEW) {
  339. //订单已支付
  340. return true;
  341. }
  342. $result = $this->updateStoreOrder($out_trade_no, $payment_code, $order['data'], $trade_no);
  343. $this->paysuccesspush($order, 3);
  344. //发送订单推送
  345. $this->payRecordPush($out_trade_no, 3);
  346. //发送短信通知
  347. $this->payPhoneMessage($order, 3);
  348. }
  349. return $result['code'] ? TRUE : FALSE;
  350. }
  351. private function amount_format($amount)
  352. {
  353. $amount = trim($amount);
  354. return sprintf("%.2f", $amount);
  355. }
  356. /**
  357. * 支付成功推送
  358. *
  359. * {{first.DATA}}
  360. * 消费时间:{{keyword1.DATA}}
  361. * 消费门店:{{keyword2.DATA}}
  362. * 消费类型:{{keyword3.DATA}}
  363. * 消费金额:{{keyword4.DATA}}
  364. * 积分增加:{{keyword5.DATA}}
  365. * {{remark.DATA}}
  366. *
  367. * 尊敬的顾客,您的最新交易信息
  368. * 消费时间:2017-01-01
  369. * 消费门店:成都金沙店
  370. * 消费类型:0001
  371. * 消费金额:100
  372. * 积分增加:100
  373. * 感谢您的使用
  374. */
  375. public function paysuccesspush($order_info, $is_vir)
  376. {
  377. if ($is_vir == 2) {
  378. $ticket_logic = model('Ticket', 'logic');
  379. $result = $ticket_logic->order_film_pay($order_info);
  380. }
  381. $order_info = $order_info['data'] ?? $order_info;
  382. $payment_code_text = '微信支付';
  383. $payment_amount = '';
  384. if ($order_info['pd_amount'] == $order_info['order_amount']) {
  385. $payment_code_text = '预存款';
  386. $payment_amount = $this->amount_format($order_info['order_amount']);
  387. } else if ($order_info['deduction_amount'] == $order_info['order_amount']) {
  388. $payment_code_text = '卡券支付';
  389. $payment_amount = $this->amount_format($order_info['order_amount']);
  390. } else if ($order_info['payment_code'] == 'wxpay_jsapi' && $order_info['pd_amount'] == 0 && $order_info['deduction_amount'] == 0) {
  391. $payment_code_text = '微信支付';
  392. $payment_amount = $this->amount_format($order_info['order_amount']);
  393. } else {
  394. if ($order_info['deduction_amount'] > 0) {
  395. $payment_amount .= '卡券支付:' . $this->amount_format($order_info['deduction_amount']);
  396. }
  397. if ($order_info['pd_amount'] > 0) {
  398. $payment_amount .= '预存款支付:' . $this->amount_format($order_info['pd_amount']);
  399. }
  400. if ($order_info['payment_code'] == 'wxpay_jsapi') {
  401. $payment_amount .= '微信支付:' . $this->amount_format($order_info['order_amount'] - $order_info['pd_amount'] - $order_info['deduction_amount']);
  402. }
  403. $payment_amount = $order_info['order_amount'] . '[' . $payment_amount . ']';
  404. }
  405. // var_dump($order_info);exit();
  406. $url = config('ds_config.h5_site_url') . '/member/order_detail?order_id=' . $order_info['order_id'];
  407. if ($is_vir == 1) {
  408. $url = config('ds_config.h5_site_url') . '/member/vrorder_detail?order_id=' . $order_info['order_id'];
  409. } else if ($is_vir == 2) {
  410. $url = '';
  411. } elseif ($is_vir == 3) {
  412. $url = config('ds_config.h5_site_url') . '/';
  413. }
  414. $param['weixin_param'] = [
  415. 'url' => $url,
  416. 'data' => [
  417. "first" => [
  418. "value" => '尊敬的客户,您有一笔新的交易',
  419. "color" => "#333",
  420. ],
  421. "keyword1" => [
  422. "value" => date('Y-m-d H:i:s', $order_info['payment_time']),
  423. "color" => "#333",
  424. ],
  425. // "keyword2" => array(
  426. // "value" => $order_info['store_name'],
  427. // "color" => "#333"
  428. // ),
  429. "keyword2" => [
  430. "value" => $payment_code_text,
  431. "color" => "#333",
  432. ],
  433. "keyword3" => [
  434. "value" => $payment_amount,
  435. "color" => "#333",
  436. ],
  437. "keyword4" => [
  438. "value" => 0,
  439. "color" => "#333",
  440. ],
  441. "remark" => [
  442. "value" => '订单号【' . $order_info['order_sn'] . '】',
  443. "color" => "#333",
  444. ],
  445. ],
  446. ];
  447. $param['param'] = [];
  448. $param['code'] = 'order_pay_success';
  449. $param['member_id'] = $order_info['buyer_id'];
  450. \mall\queue\QueueClient::push('sendMemberMsg', $param);
  451. }
  452. /**
  453. * 消费记录推送
  454. */
  455. public function payRecordPush($out_trade_no, $isVir)
  456. {
  457. if ($isVir == 1) {
  458. //虚拟订单
  459. $orderInfo = Db::name('vrorder')->where([
  460. ['order_sn', '=', $out_trade_no],
  461. ])->find();
  462. } else if ($isVir == 2) {
  463. $orderInfo = Db::name('ticket_order')->where([
  464. ['order_sn', '=', $out_trade_no],
  465. ])->find();
  466. } else {
  467. //实物订单
  468. $orderInfo = Db::name('order')->where([
  469. ['order_sn', '=', $out_trade_no],
  470. ])->find();
  471. }
  472. if (!empty($orderInfo['card_id']) && $orderInfo['card_id'] != 0) {
  473. $cardInfo = Db::name('sub_card')->where([['id', '=', $orderInfo['card_id']]])->find();
  474. $params = [
  475. 'cardNo' => $cardInfo['card_no'],
  476. 'memberId' => $orderInfo['buyer_id'],
  477. 'amount' => $orderInfo['deduction_amount'], //抵消金额
  478. 'orderNo' => $orderInfo['order_sn'],
  479. 'is_vir' => $isVir,
  480. ];
  481. $hostUrl = config('ds_config.do_net_card_url');
  482. $url = $hostUrl . '/api/card.number.bill/add';
  483. $pushRes = common_curl($url, $params);
  484. $logModel = model('commonlog');
  485. if (!empty($pushRes['error'])) {
  486. $logModel->setLog('card_recard', 2, $params, $pushRes['error']['message']);
  487. ds_json_encode(10001, $pushRes['error']['message']);
  488. } else {
  489. if (empty($pushRes)) {
  490. $logModel->setLog('card_recard', 2, $params, '数据丢失!');
  491. ds_json_encode(10001, '推送失败1');
  492. }
  493. }
  494. $logModel->setLog('card_recard', 1, $params, '推送成功');
  495. return true;
  496. } else {
  497. return true;
  498. }
  499. }
  500. /**
  501. * 消费记录推送
  502. */
  503. public function payRecordPushNoAmount($orderInfo, $isVir)
  504. {
  505. $logModel = model('commonlog');
  506. if (!empty($orderInfo['orderNo'])) {
  507. $params = $orderInfo;
  508. $params['is_vir'] = $isVir;
  509. $hostUrl = config('ds_config.do_net_card_url');
  510. $url = $hostUrl . '/api/card.number.bill/add';
  511. $pushRes = common_curl($url, $params);
  512. if (!empty($pushRes['error'])) {
  513. $logModel->setLog('card_recard', 2, $params, $pushRes['error']['message']);
  514. ds_json_encode(10001, $pushRes['error']['message']);
  515. } else {
  516. if (empty($pushRes)) {
  517. $logModel->setLog('card_recard', 2, $params, '数据丢失!');
  518. ds_json_encode(10001, '推送失败2');
  519. }
  520. }
  521. $logModel->setLog('card_recard', 1, $params, '推送成功');
  522. return true;
  523. } else {
  524. $logModel->setLog('card_recard', 2, [], '数据异常');
  525. ds_json_encode(10001, '数据异常');
  526. }
  527. }
  528. /**
  529. * 退款 卡号消息推送
  530. */
  531. public function refundRecordPush($orderId, $isVir)
  532. {
  533. if ($isVir == 1) {
  534. //虚拟订单
  535. $orderInfo = Db::name('vrorder')->where([
  536. ['order_id', '=', $orderId],
  537. ])->find();
  538. } else {
  539. //实物订单
  540. $orderInfo = Db::name('order')->where([
  541. ['order_id', '=', $orderId],
  542. ])->find();
  543. }
  544. if ($orderInfo['card_id'] != 0) {
  545. $cardInfo = Db::name('sub_card')->where([['id', '=', $orderInfo['card_id']]])->find();
  546. $amount = $orderInfo['deduction_amount'];
  547. $amount *= -1;
  548. $params = [
  549. 'cardNo' => $cardInfo['card_no'],
  550. 'memberId' => $orderInfo['buyer_id'],
  551. 'amount' => $amount, //撤回金额
  552. 'orderNo' => $orderInfo['order_sn'],
  553. 'is_vir' => $isVir,
  554. ];
  555. $hostUrl = config('ds_config.do_net_card_url');
  556. $url = $hostUrl . '/api/card.number.bill/add';
  557. $pushRes = common_curl($url, $params);
  558. $logModel = model('commonlog');
  559. if (!empty($pushRes['error'])) {
  560. $logModel->setLog('card_refund', 2, $params, $pushRes['error']['message']);
  561. ds_json_encode(10001, $pushRes['error']['message']);
  562. } else {
  563. if (empty($pushRes)) {
  564. $logModel->setLog('card_refund', 2, $params, '数据丢失!');
  565. ds_json_encode(10001, '推送失败3');
  566. }
  567. }
  568. //加回之前退的金额
  569. $nowBalance = $cardInfo['balance'] + $orderInfo['deduction_amount'];
  570. if ($nowBalance == $cardInfo['worth']) {
  571. //相等,状态为1 未使用
  572. $cardStatus = 1;
  573. } else {
  574. $cardStatus = 2;
  575. }
  576. $cardData = [
  577. 'balance' => $nowBalance,
  578. 'card_status' => $cardStatus,
  579. 'freeze' => $cardInfo['freeze'] - $orderInfo['deduction_amount'],
  580. ];
  581. $res = Db::name('sub_card')->where([['id', '=', $orderInfo['card_id']]])->update($cardData);
  582. if ($res) {
  583. $logModel->setLog('card_refund', 1, $params, '推送成功');
  584. }
  585. return true;
  586. } else {
  587. return true;
  588. }
  589. }
  590. /**
  591. * 短信通知
  592. * @param $order
  593. * @param int $is_vir
  594. */
  595. public function payPhoneMessage($order, $is_vir = 0)
  596. {
  597. $smslog_model = model('smslog');
  598. $order_info = $order['data'] ?? $order;
  599. $message_arr = [];
  600. $phone_arr = [];
  601. if ($is_vir == 0) {
  602. //实物订单
  603. $goods_arr = Db::name('ordergoods')->where('order_id', $order['order_id'])->select();
  604. foreach ($goods_arr as $goods) {
  605. $gc_id = Db::name('goods')->where('goods_id', $goods['goods_id'])->value('gc_id_1');
  606. if ($gc_id == 773) {
  607. $order_common = Db::name('ordercommon')->where('order_id', $order['order_id'])->find();
  608. $reciver_info = unserialize($order_common['reciver_info']);
  609. $phone_arr[] = '15396466632';
  610. $message_arr[] = "您有新的蛋糕订单,请及时处理,蛋糕名称:{$goods['goods_name']},商品数量:{$goods['goods_num']},金额:{$goods['goods_price']},收货人:{$order_common['reciver_name']},联系方式:{$reciver_info['phone']}";
  611. }
  612. }
  613. } elseif ($is_vir == 3) {
  614. //到店订单
  615. $store = Db::name('store')->find($order_info['store_id']);
  616. if (!empty($store) && !empty($store['store_phone'])) {
  617. $phone_arr[] = $store['store_phone'];
  618. $date = date('Y-m-d H:i:s');
  619. $message_arr[] = "​尊敬​的{$store['store_name']},您于{$date},收到{$order_info['order_amount']}元产品付款,请注意查收";
  620. }
  621. }
  622. if (!empty($phone_arr)) {
  623. Log::info("交易完成发送短信:" . json_encode($phone_arr) . ' - ' . json_encode($message_arr));
  624. foreach ($phone_arr as $k => $phone) {
  625. $smslog_model->sendSms($phone, ['message' => $message_arr[$k]]);
  626. }
  627. }
  628. }
  629. }