Ticket.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <?php
  2. namespace app\common\logic;
  3. use think\facade\Db;
  4. use think\facade\Log;
  5. class Ticket
  6. {
  7. protected $domain = "https://ilike-cloud-mapi.zmaxfilm.com";
  8. public function order_film_pay($order_info)
  9. {
  10. $url = $this->domain . '/pay/pay/orderFilmPay';
  11. $order_info = empty($order_info['data']) ? $order_info : $order_info['data'];
  12. $data = [];
  13. $data['account'] = 'bbfuli1117';
  14. $data['payType'] = 'bbflpay';
  15. $data['amount'] = $order_info['order_amount'];
  16. $data['outTradeNo'] = $order_info['order_sn'];
  17. $data['merchantOrderNo'] = $order_info['third_pay_order_id'];
  18. $data['sign'] = $this->makesign($data);
  19. $result = $this->curl($url, $data);
  20. Log::info('电影订单支付成功接口返回消息:' . $result);
  21. $result = json_decode($result, true);
  22. // var_dump($result);exit();
  23. if ($result['status'] != 0) {
  24. return false;
  25. }
  26. return true;
  27. }
  28. /**
  29. * 支付订单
  30. * @param array $order_info
  31. * @param string $role 操作角色 buyer、seller、admin、system 分别代表买家、商家、管理员、系统
  32. * @param string $post
  33. * @return array
  34. */
  35. public function changeOrderStatePay($order_info, $role, $post)
  36. {
  37. try {
  38. $TicketOrder = model('TicketOrder');
  39. Db::startTrans();
  40. $predeposit_model = model('predeposit');
  41. //下单,支付被冻结的充值卡
  42. $rcb_amount = floatval($order_info['rcb_amount']);
  43. if ($rcb_amount > 0) {
  44. $data_pd = [];
  45. $data_pd['member_id'] = $order_info['buyer_id'];
  46. $data_pd['member_name'] = $order_info['buyer_name'];
  47. $data_pd['amount'] = $rcb_amount;
  48. $data_pd['order_sn'] = $order_info['order_sn'];
  49. $predeposit_model->changeRcb('order_comb_pay', $data_pd);
  50. }
  51. //下单,支付被冻结的预存款
  52. $pd_amount = floatval($order_info['pd_amount']);
  53. if ($pd_amount > 0) {
  54. $data_pd = [];
  55. $data_pd['member_id'] = $order_info['buyer_id'];
  56. $data_pd['member_name'] = $order_info['buyer_name'];
  57. $data_pd['amount'] = $pd_amount;
  58. $data_pd['order_sn'] = $order_info['order_sn'];
  59. $predeposit_model->changePd('order_comb_pay', $data_pd);
  60. }
  61. //更新订单状态
  62. $update_order = [];
  63. $update_order['order_state'] = ORDER_STATE_PAY;
  64. $update_order['payment_time'] = isset($post['payment_time']) ? strtotime($post['payment_time']) : TIMESTAMP;
  65. $update_order['payment_code'] = $post['payment_code'];
  66. $update_order['trade_no'] = $post['trade_no'];
  67. $update = $TicketOrder->edit($update_order, ['order_id' => $order_info['order_id']]);
  68. if (!$update) {
  69. throw new \think\Exception(lang('ds_common_save_fail'), 10006);
  70. }
  71. Db::commit();
  72. return ds_callback(true, '更新成功');
  73. } catch (Exception $e) {
  74. Db::rollback();
  75. return ds_callback(false, $e->getMessage());
  76. }
  77. }
  78. /**
  79. * 取消订单
  80. */
  81. public function changeOrderStateCancel($order_info)
  82. {
  83. $expense = Db::name('sub_card_expense')->where('is_vir', 2)->where('order_id', $order_info['id'])->find();
  84. if (!empty($expense)) {
  85. //1.回滚卡片余额
  86. $cardInfo = Db::name('sub_card')->where('id', $expense['card_id'])->find();
  87. if (($cardInfo['balance'] + $order_info['deduction_amount']) == $cardInfo['worth']) {
  88. $cardStatus = 1;
  89. } else {
  90. $cardStatus = 2;
  91. }
  92. $cardUpdate = [
  93. 'card_status' => $cardStatus,
  94. 'balance' => $cardInfo['balance'] + $order_info['deduction_amount'],
  95. 'freeze' => $cardInfo['freeze'] - $order_info['deduction_amount'],
  96. 'update_time' => time(),
  97. 'used_count' => $cardInfo['used_count'] - 1,
  98. ];
  99. $cardRes = Db::name('sub_card')->where('id', $expense['card_id'])->update($cardUpdate);
  100. if ($cardRes) {
  101. //如果卡的数据恢复成功了 删除卡的消费记录
  102. Db::name('sub_card_expense')->where('id', $expense['id'])->update(['expense_status' => 2]);
  103. }
  104. }
  105. //更改订单状态
  106. $TicketOrder = model('TicketOrder');
  107. $TicketOrder->where('id', $order_info['id'])->update(['order_state' => 0]);
  108. Log::info('电影票订单取消,id:' . $order_info['id'] . ',时间:' . date('Y-m-d H:i:s'));
  109. }
  110. private function makesign($data)
  111. {
  112. ksort($data);
  113. $string = $this->tourlparams($data);
  114. $string = $string . 'OiwYehcnkeflRjVN';
  115. $string = md5(sha1($string));
  116. return substr($string, 8, 16);
  117. }
  118. private function tourlparams($data)
  119. {
  120. $buff = "";
  121. foreach ($data as $k => $v) {
  122. if ($k != "sign" && $v != "" && !is_array($v)) {
  123. $buff .= $k . $v;
  124. }
  125. }
  126. return $buff;
  127. }
  128. private function curl($url, $data = '', $headers = [], $timeout = 60, $issplit = false)
  129. {
  130. $ch = curl_init();
  131. curl_setopt($ch, CURLOPT_URL, $url);
  132. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  133. @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  134. curl_setopt($ch, CURLOPT_HEADER, 0);
  135. @curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
  136. if ($data) {
  137. curl_setopt($ch, CURLOPT_POST, 1);
  138. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  139. }
  140. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  141. curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  142. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  143. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  144. curl_setopt($ch, CURLOPT_SSLVERSION, 1);
  145. curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1");
  146. if (!empty($headers) && is_array($headers)) {
  147. curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  148. }
  149. ob_start();
  150. $res = curl_exec($ch);
  151. $headersize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
  152. $header = substr($res, 0, $headersize);
  153. $body = substr($res, $headersize);
  154. ob_end_clean();
  155. curl_close($ch);
  156. unset($ch);
  157. if ($issplit) {
  158. return ['header' => $header, 'body' => $body];
  159. }
  160. return $res;
  161. }
  162. }