getOrderpayInfo($condition); if (empty($order_pay_info)) { return ds_callback(false, '该支付单不存在'); } $order_pay_info['subject'] = '实物订单_' . $order_pay_info['pay_sn']; $order_pay_info['order_type'] = 'real_order'; $condition = []; $condition[] = ['pay_sn', '=', $pay_sn]; $order_list = $order_model->getNormalOrderList($condition); //计算本次需要在线支付的订单总金额 $pay_amount = 0; $point_ratio = config('app.point_ratio'); if (!empty($order_list)) { foreach ($order_list as $order_info) { $payed_amount = floatval($order_info['rcb_amount']) + floatval($order_info['pd_amount']) + floatval($order_info['point_amount'] / $point_ratio); if ($order_info['payment_code'] != 'offline' and $order_info['order_state'] > 0) { if ($order_info['order_state'] == ORDER_STATE_NEW) { } $pay_amount += floatval($order_info['order_amount']) - $payed_amount; } else { } } } $order_pay_info['api_pay_amount'] = $pay_amount; $order_pay_info['order_list'] = $order_list; return ds_callback(true, '', $order_pay_info); } /** * 取得虚拟订单所需支付金额等信息 * @param int $order_sn * @param int $member_id * @return array */ public function getVrOrderInfo($order_sn, $member_id = null) { //验证订单信息 $vrorder_model = model('vrorder'); $condition = []; $condition[] = ['order_sn', '=', $order_sn]; if (!empty($member_id)) { $condition[] = ['buyer_id', '=', $member_id]; } $order_info = $vrorder_model->getVrorderInfo($condition); if (empty($order_info)) { return ds_callback(false, '该订单不存在'); } $order_info['subject'] = '虚拟订单_' . $order_sn; $order_info['order_type'] = 'vr_order'; $order_info['pay_sn'] = $order_sn; //修复 第三方支付时 充值卡没算在内BUG $point_ratio = config('app.point_ratio'); $pay_amount = ds_price_format(floatval($order_info['order_amount']) - floatval($order_info['pd_amount']) - floatval($order_info['rcb_amount'] / $point_ratio)); $order_info['api_pay_amount'] = $pay_amount; return ds_callback(true, '', $order_info); } /** * 取得充值单所需支付金额等信息 * @param int $pdr_sn * @param int $member_id * @return array */ public function getPdOrderInfo($pdr_sn, $member_id = null) { $predeposit_model = model('predeposit'); $condition = []; $condition[] = ['pdr_sn', '=', $pdr_sn]; if (!empty($member_id)) { $condition[] = ['pdr_member_id', '=', $member_id]; } $order_info = $predeposit_model->getPdRechargeInfo($condition); if (empty($order_info)) { return ds_callback(false, '该订单不存在'); } $order_info['subject'] = '预存款充值_' . $order_info['pdr_sn']; $order_info['order_type'] = 'pd_order'; $order_info['pay_sn'] = $order_info['pdr_sn']; $order_info['api_pay_amount'] = $order_info['pdr_amount']; return ds_callback(true, '', $order_info); } public function getTicketOrderInfo($order_sn, $member_id = null) { //验证订单信息 $TicketOrder = model('TicketOrder'); $condition = []; $condition[] = ['order_sn', '=', $order_sn]; if (!empty($member_id)) { $condition[] = ['buyer_id', '=', $member_id]; } $order_info = $TicketOrder->where($condition)->find(); if (empty($order_info)) { return ds_callback(false, '该订单不存在'); } $order_info['subject'] = '电影票订单_' . $order_sn; $order_info['order_type'] = 'ticket_order'; $order_info['pay_sn'] = $order_sn; //修复 第三方支付时 充值卡没算在内BUG $point_ratio = config('app.point_ratio'); $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)); $order_info['api_pay_amount'] = $pay_amount; return ds_callback(true, '', $order_info); } public function getStoreOrderInfo($order_sn, $member_id = null) { //验证订单信息 $StoreOrder = model('StoreOrder'); $condition = []; $condition[] = ['order_sn', '=', $order_sn]; if (!empty($member_id)) { $condition[] = ['buyer_id', '=', $member_id]; } $order_info = $StoreOrder->where($condition)->find(); if (empty($order_info)) { return ds_callback(false, '该订单不存在'); } $order_info['subject'] = '到店付款订单_' . $order_sn; $order_info['order_type'] = 'store_order'; $order_info['pay_sn'] = $order_sn; //修复 第三方支付时 充值卡没算在内BUG $point_ratio = config('app.point_ratio'); $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'])); $order_info['api_pay_amount'] = $pay_amount; return ds_callback(true, '', $order_info); } /** * 取得所使用支付方式信息 * @param unknown $payment_code */ public function getPaymentInfo($payment_code) { if (in_array($payment_code, ['offline', 'predeposit']) || empty($payment_code)) { return ds_callback(false, '系统不支持选定的支付方式'); } $payment_model = model('payment'); $condition = []; $condition[] = ['payment_code', '=', $payment_code]; $payment_info = $payment_model->getPaymentOpenInfo($condition); if (empty($payment_info)) { return ds_callback(false, '系统不支持选定的支付方式'); } $inc_file = PLUGINS_PATH . DIRECTORY_SEPARATOR . 'payments' . DIRECTORY_SEPARATOR . $payment_info['payment_code'] . DIRECTORY_SEPARATOR . $payment_info['payment_code'] . '.php'; if (!file_exists($inc_file)) { return ds_callback(false, '系统不支持选定的支付方式'); } require_once $inc_file; $payment_info['payment_config'] = unserialize($payment_info['payment_config']); return ds_callback(true, '', $payment_info); } /** * 支付成功后修改实物订单状态 */ public function updateRealOrder($out_trade_no, $payment_code, $order_list, $trade_no) { $post['payment_code'] = $payment_code; $post['trade_no'] = $trade_no; try { Db::startTrans(); model('order', 'logic')->changeOrderReceivePay($order_list, 'system', '系统', $post); } catch (\Exception $e) { Db::rollback(); return ds_callback(false, $e->getMessage()); } Db::commit(); return ds_callback(true, '操作成功'); } /** * 支付成功后修改虚拟订单状态 */ public function updateVrOrder($out_trade_no, $payment_code, $order_info, $trade_no) { $post['payment_code'] = $payment_code; $post['trade_no'] = $trade_no; return model('vrorder', 'logic')->changeOrderStatePay($order_info, 'system', $post); } /** * 支付成功后修改虚拟订单状态 */ public function updateTicketOrder($out_trade_no, $payment_code, $order_info, $trade_no) { $post['payment_code'] = $payment_code; $post['trade_no'] = $trade_no; return model('ticketorder', 'logic')->changeOrderStatePay($order_info, 'system', $post); } /** * 支付成功后修改到店付款订单状态 */ public function updateStoreOrder($out_trade_no, $payment_code, $order_info, $trade_no) { $post['payment_code'] = $payment_code; $post['trade_no'] = $trade_no; return model('storeorder', 'logic')->changeOrderStatePay($order_info, 'system', $post); } /** * 支付成功后修改充值订单状态 * @param unknown $out_trade_no * @param unknown $trade_no * @param unknown $payment_code * @return multitype:unknown * @throws Exception */ public function updatePdOrder($out_trade_no, $payment_code, $recharge_info, $trade_no) { $condition = []; $condition[] = ['pdr_sn', '=', $recharge_info['pdr_sn']]; $condition[] = ['pdr_payment_state', '=', 0]; $update = []; $update['pdr_payment_state'] = 1; $update['pdr_paymenttime'] = TIMESTAMP; $update['pdr_payment_code'] = $payment_code; $update['pdr_trade_sn'] = $trade_no; $predeposit_model = model('predeposit'); try { Db::startTrans(); $pdnum = $predeposit_model->getPdRechargeCount([ 'pdr_sn' => $recharge_info['pdr_sn'], 'pdr_payment_state' => 1, ]); if (intval($pdnum) > 0) { throw new \think\Exception('订单已经处理', 10006); } //更改充值状态 $state = $predeposit_model->editPdRecharge($update, $condition); if (!$state) { throw new \think\Exception('更新充值状态失败', 10006); } //变更会员预存款 $data = []; $data['member_id'] = $recharge_info['pdr_member_id']; $data['member_name'] = $recharge_info['pdr_member_name']; $data['amount'] = $recharge_info['pdr_amount']; $data['pdr_sn'] = $recharge_info['pdr_sn']; $predeposit_model->changePd('recharge', $data); Db::commit(); return ds_callback(true); } catch (\Exception $e) { Db::rollback(); return ds_callback(false, $e->getMessage()); } } /** * * @param type $out_trade_no #商城内部订单号 * @param type $trade_no #支付交易流水号 * @param type $order_type #订单ID * @param type $payment_code #支付方式代号 */ public function updateOrder($out_trade_no, $trade_no, $order_type, $payment_code) { $out_trade_no = current(explode('_', $out_trade_no)); if ($order_type == 'real_order') { $order = $this->getRealOrderInfo($out_trade_no); if (empty($order) || empty($order['data']['order_list']) || intval($order['data']['api_paystate'])) { //订单已支付 return true; } $order_list = $order['data']['order_list']; $result = $this->updateRealOrder($out_trade_no, $payment_code, $order_list, $trade_no); foreach ($order_list as $key => $value) { $this->paysuccesspush($value, 0); //发送短信通知 $this->payPhoneMessage($value, 0); } $this->payRecordPush($out_trade_no, 0); } elseif ($order_type == 'vr_order') { $order = $this->getVrOrderInfo($out_trade_no); if (empty($order) || $order['data']['order_state'] != ORDER_STATE_NEW) { //订单已支付 return true; } $result = $this->updateVrOrder($out_trade_no, $payment_code, $order['data'], $trade_no); //TODO 回调这边去关联卡券 $order = $order['data']; $goodsInfo = Db::name('goods')->where('goods_id', $order['goods_id'])->find(); if (!empty($goodsInfo['virtual_code'])) { //存在卡券时 $dataInfo = [ 'virtual_code' => $goodsInfo['virtual_code'], 'quantity' => $order['goods_num'], 'order_id' => $order['order_id'], ]; $buy_logic = model('voucher', 'logic'); $voucherRes = $buy_logic->getVoucherListByGood($dataInfo, $order['buyer_id']); } $this->paysuccesspush($order, 1); //发送订单推送 $this->payRecordPush($out_trade_no, 1); } elseif ($order_type == 'pd_order') { $order = $this->getPdOrderInfo($out_trade_no); if (empty($order) || $order['data']['pdr_payment_state'] == 1) { //订单已支付 return true; } $result = $this->updatePdOrder($out_trade_no, $payment_code, $order['data'], $trade_no); } else if ($order_type == 'ticket_order') { $order = $this->getTicketOrderInfo($out_trade_no); if (empty($order) || $order['data']['order_state'] != ORDER_STATE_NEW) { //订单已支付 return true; } $result = $this->updateTicketOrder($out_trade_no, $payment_code, $order['data'], $trade_no); $this->paysuccesspush($order, 2); //发送订单推送 $this->payRecordPush($out_trade_no, 2); } else if ($order_type == 'store_order') { $order = $this->getStoreOrderInfo($out_trade_no); if (empty($order) || $order['data']['order_state'] != ORDER_STATE_NEW) { //订单已支付 return true; } $result = $this->updateStoreOrder($out_trade_no, $payment_code, $order['data'], $trade_no); $this->paysuccesspush($order, 3); //发送订单推送 $this->payRecordPush($out_trade_no, 3); //发送短信通知 $this->payPhoneMessage($order, 3); } return $result['code'] ? TRUE : FALSE; } private function amount_format($amount) { $amount = trim($amount); return sprintf("%.2f", $amount); } /** * 支付成功推送 * * {{first.DATA}} * 消费时间:{{keyword1.DATA}} * 消费门店:{{keyword2.DATA}} * 消费类型:{{keyword3.DATA}} * 消费金额:{{keyword4.DATA}} * 积分增加:{{keyword5.DATA}} * {{remark.DATA}} * * 尊敬的顾客,您的最新交易信息 * 消费时间:2017-01-01 * 消费门店:成都金沙店 * 消费类型:0001 * 消费金额:100 * 积分增加:100 * 感谢您的使用 */ public function paysuccesspush($order_info, $is_vir) { if ($is_vir == 2) { $ticket_logic = model('Ticket', 'logic'); $result = $ticket_logic->order_film_pay($order_info); } $order_info = $order_info['data'] ?? $order_info; $payment_code_text = '微信支付'; $payment_amount = ''; if ($order_info['pd_amount'] == $order_info['order_amount']) { $payment_code_text = '预存款'; $payment_amount = $this->amount_format($order_info['order_amount']); } else if ($order_info['deduction_amount'] == $order_info['order_amount']) { $payment_code_text = '卡券支付'; $payment_amount = $this->amount_format($order_info['order_amount']); } else if ($order_info['payment_code'] == 'wxpay_jsapi' && $order_info['pd_amount'] == 0 && $order_info['deduction_amount'] == 0) { $payment_code_text = '微信支付'; $payment_amount = $this->amount_format($order_info['order_amount']); } else { if ($order_info['deduction_amount'] > 0) { $payment_amount .= '卡券支付:' . $this->amount_format($order_info['deduction_amount']); } if ($order_info['pd_amount'] > 0) { $payment_amount .= '预存款支付:' . $this->amount_format($order_info['pd_amount']); } if ($order_info['payment_code'] == 'wxpay_jsapi') { $payment_amount .= '微信支付:' . $this->amount_format($order_info['order_amount'] - $order_info['pd_amount'] - $order_info['deduction_amount']); } $payment_amount = $order_info['order_amount'] . '[' . $payment_amount . ']'; } // var_dump($order_info);exit(); $url = config('ds_config.h5_site_url') . '/member/order_detail?order_id=' . $order_info['order_id']; if ($is_vir == 1) { $url = config('ds_config.h5_site_url') . '/member/vrorder_detail?order_id=' . $order_info['order_id']; } else if ($is_vir == 2) { $url = ''; } elseif ($is_vir == 3) { $url = config('ds_config.h5_site_url') . '/'; } $param['weixin_param'] = [ 'url' => $url, 'data' => [ "first" => [ "value" => '尊敬的客户,您有一笔新的交易', "color" => "#333", ], "keyword1" => [ "value" => date('Y-m-d H:i:s', $order_info['payment_time']), "color" => "#333", ], // "keyword2" => array( // "value" => $order_info['store_name'], // "color" => "#333" // ), "keyword2" => [ "value" => $payment_code_text, "color" => "#333", ], "keyword3" => [ "value" => $payment_amount, "color" => "#333", ], "keyword4" => [ "value" => 0, "color" => "#333", ], "remark" => [ "value" => '订单号【' . $order_info['order_sn'] . '】', "color" => "#333", ], ], ]; $param['param'] = []; $param['code'] = 'order_pay_success'; $param['member_id'] = $order_info['buyer_id']; \mall\queue\QueueClient::push('sendMemberMsg', $param); } /** * 消费记录推送 */ public function payRecordPush($out_trade_no, $isVir) { if ($isVir == 1) { //虚拟订单 $orderInfo = Db::name('vrorder')->where([ ['order_sn', '=', $out_trade_no], ])->find(); } else if ($isVir == 2) { $orderInfo = Db::name('ticket_order')->where([ ['order_sn', '=', $out_trade_no], ])->find(); } else { //实物订单 $orderInfo = Db::name('order')->where([ ['order_sn', '=', $out_trade_no], ])->find(); } if (!empty($orderInfo['card_id']) && $orderInfo['card_id'] != 0) { $cardInfo = Db::name('sub_card')->where([['id', '=', $orderInfo['card_id']]])->find(); $params = [ 'cardNo' => $cardInfo['card_no'], 'memberId' => $orderInfo['buyer_id'], 'amount' => $orderInfo['deduction_amount'], //抵消金额 'orderNo' => $orderInfo['order_sn'], 'is_vir' => $isVir, ]; $hostUrl = config('ds_config.do_net_card_url'); $url = $hostUrl . '/api/card.number.bill/add'; $pushRes = common_curl($url, $params); $logModel = model('commonlog'); if (!empty($pushRes['error'])) { $logModel->setLog('card_recard', 2, $params, $pushRes['error']['message']); ds_json_encode(10001, $pushRes['error']['message']); } else { if (empty($pushRes)) { $logModel->setLog('card_recard', 2, $params, '数据丢失!'); ds_json_encode(10001, '推送失败1'); } } $logModel->setLog('card_recard', 1, $params, '推送成功'); return true; } else { return true; } } /** * 消费记录推送 */ public function payRecordPushNoAmount($orderInfo, $isVir) { $logModel = model('commonlog'); if (!empty($orderInfo['orderNo'])) { $params = $orderInfo; $params['is_vir'] = $isVir; $hostUrl = config('ds_config.do_net_card_url'); $url = $hostUrl . '/api/card.number.bill/add'; $pushRes = common_curl($url, $params); if (!empty($pushRes['error'])) { $logModel->setLog('card_recard', 2, $params, $pushRes['error']['message']); ds_json_encode(10001, $pushRes['error']['message']); } else { if (empty($pushRes)) { $logModel->setLog('card_recard', 2, $params, '数据丢失!'); ds_json_encode(10001, '推送失败2'); } } $logModel->setLog('card_recard', 1, $params, '推送成功'); return true; } else { $logModel->setLog('card_recard', 2, [], '数据异常'); ds_json_encode(10001, '数据异常'); } } /** * 退款 卡号消息推送 */ public function refundRecordPush($orderId, $isVir) { if ($isVir == 1) { //虚拟订单 $orderInfo = Db::name('vrorder')->where([ ['order_id', '=', $orderId], ])->find(); } else { //实物订单 $orderInfo = Db::name('order')->where([ ['order_id', '=', $orderId], ])->find(); } if ($orderInfo['card_id'] != 0) { $cardInfo = Db::name('sub_card')->where([['id', '=', $orderInfo['card_id']]])->find(); $amount = $orderInfo['deduction_amount']; $amount *= -1; $params = [ 'cardNo' => $cardInfo['card_no'], 'memberId' => $orderInfo['buyer_id'], 'amount' => $amount, //撤回金额 'orderNo' => $orderInfo['order_sn'], 'is_vir' => $isVir, ]; $hostUrl = config('ds_config.do_net_card_url'); $url = $hostUrl . '/api/card.number.bill/add'; $pushRes = common_curl($url, $params); $logModel = model('commonlog'); if (!empty($pushRes['error'])) { $logModel->setLog('card_refund', 2, $params, $pushRes['error']['message']); ds_json_encode(10001, $pushRes['error']['message']); } else { if (empty($pushRes)) { $logModel->setLog('card_refund', 2, $params, '数据丢失!'); ds_json_encode(10001, '推送失败3'); } } //加回之前退的金额 $nowBalance = $cardInfo['balance'] + $orderInfo['deduction_amount']; if ($nowBalance == $cardInfo['worth']) { //相等,状态为1 未使用 $cardStatus = 1; } else { $cardStatus = 2; } $cardData = [ 'balance' => $nowBalance, 'card_status' => $cardStatus, 'freeze' => $cardInfo['freeze'] - $orderInfo['deduction_amount'], ]; $res = Db::name('sub_card')->where([['id', '=', $orderInfo['card_id']]])->update($cardData); if ($res) { $logModel->setLog('card_refund', 1, $params, '推送成功'); } return true; } else { return true; } } /** * 短信通知 * @param $order * @param int $is_vir */ public function payPhoneMessage($order, $is_vir = 0) { $smslog_model = model('smslog'); $order_info = $order['data'] ?? $order; $message_arr = []; $phone_arr = []; if ($is_vir == 0) { //实物订单 $goods_arr = Db::name('ordergoods')->where('order_id', $order['order_id'])->select(); foreach ($goods_arr as $goods) { $gc_id = Db::name('goods')->where('goods_id', $goods['goods_id'])->value('gc_id_1'); if ($gc_id == 773) { $order_common = Db::name('ordercommon')->where('order_id', $order['order_id'])->find(); $reciver_info = unserialize($order_common['reciver_info']); $phone_arr[] = '15396466632'; $message_arr[] = "您有新的蛋糕订单,请及时处理,蛋糕名称:{$goods['goods_name']},商品数量:{$goods['goods_num']},金额:{$goods['goods_price']},收货人:{$order_common['reciver_name']},联系方式:{$reciver_info['phone']}"; } } } elseif ($is_vir == 3) { //到店订单 $store = Db::name('store')->find($order_info['store_id']); if (!empty($store) && !empty($store['store_phone'])) { $phone_arr[] = $store['store_phone']; $date = date('Y-m-d H:i:s'); $message_arr[] = "​尊敬​的{$store['store_name']},您于{$date},收到{$order_info['order_amount']}元产品付款,请注意查收"; } } if (!empty($phone_arr)) { Log::info("交易完成发送短信:" . json_encode($phone_arr) . ' - ' . json_encode($message_arr)); foreach ($phone_arr as $k => $phone) { $smslog_model->sendSms($phone, ['message' => $message_arr[$k]]); } } } }