post("data"); $filename = ROOT_PATH."mw.txt"; if(!file_exists($filename)){ touch($filename); chmod($filename,0777); } file_put_contents($filename,$param,FILE_APPEND); if (empty($param)) { Log::info("参数错误"); return "FAIL"; } $data = json_decode($param, true); if (json_last_error() != JSON_ERROR_NONE) { Log::info("数据解析错误"); return "FAIL"; } // 验证签名 if (!$this->checkSign($data)) { Log::info("签名错误"); return "FAIL"; } // 检查订单 $orderInfo = db("nw_complex_pay")->where("orderid", $data['cp_order_id'])->find(); if (!$orderInfo) { Log::info($data['cp_order_id'] . ":订单信息不存在"); return "FAIL"; } if ($orderInfo['status'] == 1) { Log::info($data['cp_order_id'] . ":订单信息已支付不能重复支付"); return "FAIL"; } if ($orderInfo['amount'] != intval($data['amount'])) { Log::info($data['cp_order_id'] . ":订单金额错误"); return "FAIL"; } $this->updateOrder($orderInfo['orderid'], $data['amount'],$data['order_id']); return "SUCCESS"; } /** * 验证签名 */ public function checkSign($data) { $sign = $data['sign']; unset($data['sign']); ksort($data); $signString = ""; foreach ($data as $key => $val) { $signString .= $key . "=" . $val . "&"; } $signString = trim($signString, "&"); $signString = self::APPSECCRET . $signString . self::APPSECCRET; $sign_result = strtoupper(md5($signString)); if ($sign == $sign_result) { return true; } return false; } /** * 更新订单信息 * * @param string $orderid :订单编号 * @param string $real_amount :第三方支付的金额(现金部分) * * @return boolean */ public function updateOrder($orderid, $real_amount = '',$sub_order_id=null) { $complexPayModel = new ComplexPay(); $payCpinfoModel = new PayCpinfo; $membersModel = new ComplexMembers(); $result = false; //消费订单信息 $payInfo = $complexPayModel->field('id,status,amount,userid,gameid,channel_id')->where(['orderid' => $orderid])->find(); if ($real_amount != '' && $payInfo['amount'] != $real_amount) { $result = false; //写入日志 log_message('订单编号:' . $orderid . '支付金额不一致,订单状态更新失败', 'error', LOG_PATH . '../paylog/'); } //待支付状态时 elseif ($payInfo['status'] == 0) { // 启动事务 Db::startTrans(); try { $complexPayModel->where(['id' => $payInfo['id']])->update( [ 'status' => 1, 'pay_time' => NOW_TIMESTAMP, 'sub_orderid'=>$sub_order_id ]); //cy_paycpinfo表记录状态更新 $payCpinfoModel->where(['orderid' => $orderid])->update(['payflag' => 1, 'update_time' => NOW_TIMESTAMP]); $result = true; // 提交事务 Db::commit(); } catch (\Exception $e) { // 回滚事务 Db::rollback(); $result = false; //写入日志 log_message('订单编号:' . $orderid . '订单状态更新失败' . $e->getMessage(), 'error', LOG_PATH . '../paylog/'); } } //订单状态更新成功 if ($result) { //更新member表的total_pay_amount $membersModel->where(['id' => $payInfo['userid']])->update(['total_pay_amount' => Db::raw('total_pay_amount+' . $payInfo['amount'])]); // 通知CP,支付成功 (new PayCallback())->callBackToCp($orderid); //预警邮件 (new PayLogic())->payWarning($payInfo['userid'], $payInfo['channel_id'], $payInfo['gameid'], $payInfo['amount']); } } }