checkOrder($order_id); if ($project_id) { $info = array(); $info['id'] = 1; $info['status'] = 1; $info['order_id'] = $order_id; $info['project_id'] = $project_id; } else { $db = Dever::db('pay/order'); $info = $db->one(array('order_id' => $order_id, 'rand' => time() . rand(1,1000))); } if ($info && $info['status']) { $param['status'] = 2; $msg = '支付成功'; if ($desc) { $param['status'] = 3; $param['status_desc'] = $desc; $msg = '支付失败||' . $desc; } $this->log($msg, $info); if (isset($info['id'])) { $param['where_id'] = $info['id']; if ($param['status']) { $param['pay_time'] = time(); } $db->update($param); } $notify = false; $key = false; if (isset($info['project_id']) && $info['project_id']) { $project = Dever::db('pay/project')->one($info['project_id']); if ($project && $project['notify']) { $notify = $project['notify']; //$key = md5($project['key']); $key = $project['key']; } } if (!$notify) { $notify = Dever::config('base', 'project')->pay_notify; //$key = md5($notify); $key = $notify; } if ($notify && $key) { $send = array(); $send['pay_product_id'] = $info['product_id']; $send['pay_uid'] = $info['uid']; $send['pay_cash'] = $info['cash']; $send['pay_order_id'] = $order_id; $send['pay_status'] = $param['status']; $send['pay_msg'] = $msg; $send['pay_id'] = $info['id']; # 2020-08-20 取消之前的加密方式,使用自动加密 /* $send['pay_time'] = time(); $send['pay_nonce'] = Dever::nonce(); ksort($send); $send['signature'] = md5($key . '&' . http_build_query($send)); */ $send['dever_token'] = $key; $this->log($notify, $send); if (strstr($notify, 'http://') || strstr($notify, 'https://')) { Dever::curl($notify, $send); } else { Dever::load($notify, $send); } } } else { $this->log('支付失败', '错误的订单id:' . $order_id); } } /** * 更新订单的支付信息 */ protected function updateOrderParam($order_id, $data) { if ($this->checkOrder($order_id)) { return false; } $db = Dever::db('pay/order'); $info = $db->one(array('order_id' => $order_id, 'status' => 1)); if ($info) { $param['where_id'] = $info['id']; $param['param'] = Dever::array_encode($data); $db->update($param); } } /** * 创建订单 */ protected function createOrder($uid, $username, $account_id, $project_id, $product_id, $name, $cash, $type, $order_id = false) { if ($this->checkOrder($order_id)) { return $this->order_id = $order_id; } $state = $order_id; $db = Dever::db('pay/order'); if (!$state) { $order_id = Dever::order(); } $this->order_id = $order_id; $info = $db->one(array('order_id' => $order_id)); if ($info) { if (!$state) { return $this->createOrder($uid, $username, $account_id, $project_id, $product_id, $name, $cash, $type); } else { return $order_id; } } else { if (!$username && Dever::project('passport')) { $user = Dever::db('passport/user')->one($uid); if ($user) { $username = $user['username']; } } $add['status'] = 1; $add['uid'] = $uid; $add['username'] = $username; $add['account_id'] = $account_id; $add['project_id'] = $project_id; $add['name'] = $name; $add['cash'] = $cash; $add['type'] = $type; $add['order_id'] = $order_id; $add['product_id'] = $product_id; $add['id'] = $db->insert($add); $msg = '发起支付'; $this->log($msg, $add); } return $order_id; } public function checkOrder($order_id) { if (strstr($order_id, 'O')) { $array = explode('O', $order_id); return $array[1]; } return false; } /** * 获取回调url */ protected function url($type, $account_id) { //$project = Dever::project('pay'); //return $project['url'] . 'daemon/notify/'.$type.'.php'; return str_replace('?', '', Dever::url('api.notify?account_id=' . $account_id, 'pay')); } # 退款 public function refundByOrder($order_id, $refund_order_id = false, $refund_cash = false, $other = false) { $info = Dever::db('pay/order')->one(array('order_id' => $order_id)); if ($info && ($info['status'] == 1 || $info['status'] == 2 || $info['status'] == 6)) { if ($info['param']) { $info['param'] = Dever::array_decode($info['param']); if (isset($info['param']['other']) && $info['param']['other'] && $other) { $info['param']['other'] = $other; } } $cash = $refund_cash ? $refund_cash : $info['cash']; $refund_data = array(); if ($refund_order_id) { # 检测该订单是否退款过 $refund_data['order_id'] = $info['id']; $refund_data['order_num'] = $refund_order_id; if ($refund_cash) { $refund_data['cash'] = $refund_cash; } $refund_data['clear'] = true; $state = Dever::db('pay/refund')->one($refund_data); if ($state) { return false; } $refund_order_id = $refund_order_id . '_' . Dever::order(); } $state = $this->refund($info['order_id'], $cash, $info, $refund_order_id, $other); if ($state) { if ($refund_order_id) { $status = 6; if ($refund_data) { Dever::db('pay/refund')->insert($refund_data); } } else { $status = 5; } Dever::db('pay/order')->update(array('where_id' => $info['id'], 'status' => $status, 'refund_cash' => $cash)); return 'yes'; } else { return false; } } return false; } /** * 写日志 */ public function log($msg, $data = array()) { if ($data) { $data = Dever::json_encode($data); $msg .= '||' . $data; /* $insert = $data; $insert['cdate'] = time(); Dever::db('pay/order_log')->insert($insert); */ } Dever::log($msg, 'pay'); } }