You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

347 lines
13 KiB

<?php
/**
* [Laike System] Copyright (c) 2017-2020 laiketui.com
* Laike is not a free software, it under the license terms, visited http://www.laiketui.com/ for more details.
*
* 通用通知接口
* ====================================================
* 支付完成后,微信会把相关支付和用户信息发送到商户设定的通知URL,
* 商户接收回调信息后,根据需要设定相应的处理流程。
*
*/
session_name("money_mojavi");
session_start();
date_default_timezone_set('Asia/Chongqing');
set_time_limit(0);
require_once(dirname(__FILE__) . "/webapp/config.php");
require_once(MO_APP_DIR."/laiketui.php");
require_once(dirname(__FILE__) . '/webapp/config/db_config.php');
require_once(dirname(__FILE__) . '/webapp/lib/DBAction.class.php');
require_once(dirname(__FILE__) . '/webapp/lib/WxPayPubHelper/WxPayPubHelper.php');
require_once(dirname(__FILE__) . '/webapp/lib/WxPayPubHelper/log_.php');
require_once(dirname(__FILE__) . '/webapp/lib/SysConst.class.php');
class order
{
//充值成功金额增加
public function cz($openid, $cmoney, $trade_no)
{
$db = DBAction::getInstance();
$sql = "select * from lkt_user where wx_id = '$openid'";
$r = $db->select($sql);
$money = $r[0]->money; // 用户金额
$user_id = $r[0]->user_id; // 用户id
$event = $trade_no;
$sqll = "insert into lkt_record (user_id,money,oldmoney,event,type) values ('$user_id','$cmoney','$money','$event',1)";
$db->insert($sqll);
//修改金额
$sql = "update lkt_user set money = money+'$cmoney' where wx_id = '$openid'";
$db->update($sql);
exit;
}
//开团
public function creatgroup($order)
{
$db = DBAction::getInstance();
//开启事务
$db->begin();
$uid = $order['uid'];
$pro_id = $order['pro_id'];
$time_over = $order['time_over'];
$sizeid = $order['sizeid'];
$groupid = $order['groupid'];
$pro_name = $order['pro_name'];
$price = $order['price'];
$y_price = $order['y_price'];
$name = $order['name'];
$sheng = $order['sheng'];
$shi = $order['shi'];
$quyu = $order['quyu'];
$address = $order['address'];
$tel = $order['tel'];
$buy_num = $order['buy_num'];
$paytype = $order['paytype'];
$trade_no = $order['trade_no'];
$status = $order['status'];
$ordstatus = $status == 1 ? 9 : 0;
$group_num = 'KT' . substr(time(), 5) . mt_rand(10000, 99999);
$creattime = date('Y-m-d H:i:s');
$time_over = explode(':', $time_over);
$time_over = date('Y-m-d H:i:s', $time_over[0] * 3600 + $time_over[1] * 60 + time());
$pro_size = $db->select("select name,color,size from lkt_configure where id=$sizeid");
$pro_size = $pro_size[0]->name . $pro_size[0]->color . $pro_size[0]->size;
$istsql1 = "insert into lkt_group_open(uid,ptgoods_id,ptcode,ptnumber,addtime,endtime,ptstatus,group_id) values('$uid',$pro_id,'$group_num',1,'$creattime','$time_over',$status,'$groupid')";
$res1 = $db->insert($istsql1);
if ($res1 < 1) {
$db->rollback();
return $istsql1;
}
$user_id = $db->select("select user_id from lkt_user where wx_id='$uid'");
$uid = $user_id[0]->user_id;
$ordernum = 'PT' . mt_rand(10000, 99999) . date('Ymd') . substr(time(), 5);
$istsql2 = "insert into lkt_order(user_id,name,mobile,num,z_price,sNo,sheng,shi,xian,address,pay,add_time,status,otype,ptcode,pid,ptstatus,trade_no) values('$uid','$name','$tel',$buy_num,$price,'$ordernum',$sheng,$shi,$quyu,'$address','$paytype','$creattime',$ordstatus,'pt','$group_num','$groupid',$status,'$trade_no')";
$res2 = $db->insert($istsql2);
if ($res2 < 1) {
$db->rollback();
return $istsql2;
}
$istsql3 = "insert into lkt_order_details(user_id,p_id,p_name,p_price,num,r_sNo,add_time,r_status,size,sid) values('$uid',$pro_id,'$pro_name',$y_price,$buy_num,'$ordernum','$creattime',-1,'$pro_size',$sizeid)";
$res3 = $db->insert($istsql3);
if ($res3 < 1) {
$db->rollback();
return $istsql3;
}
$db->commit();
}
//参团
public function can_order($order)
{
$db = DBAction::getInstance();
//开启事务
$db->begin();
$oid = $order['oid'];
$uid = $order['uid'];
$pro_id = $order['pro_id'];
$man_num = $order['man_num'];
$sizeid = $order['sizeid'];
$groupid = $order['groupid'];
$pro_name = $order['pro_name'];
$price = $order['price'];
$y_price = $order['y_price'];
$name = $order['name'];
$sheng = $order['sheng'];
$shi = $order['shi'];
$quyu = $order['quyu'];
$address = $order['address'];
$tel = $order['tel'];
$buy_num = $order['buy_num'];
$paytype = $order['paytype'];
$trade_no = $order['trade_no'];
$status = $order['status'];
$ordstatus = $status == 1 ? 9 : 0;
$creattime = date('Y-m-d H:i:s');
$pro_size = $db->select("select name,color,size from lkt_configure where id=$sizeid");
$pro_size = $pro_size[0]->name . $pro_size[0]->color . $pro_size[0]->size;
$selsql = "select ptnumber,ptstatus,endtime from lkt_group_open where group_id='$groupid' and ptcode='$oid'";
$selres = $db->select($selsql);
if (!empty($selres)) {
$ptnumber = $selres[0]->ptnumber;
$endtime = strtotime($selres[0]->endtime);
}
$ordernum = 'PT' . mt_rand(10000, 99999) . date('Ymd') . substr(time(), 5);
$user_id = $db->select("select user_id from lkt_user where wx_id='$uid'");
$uid = $user_id[0]->user_id;
if ($endtime >= time()) {
if (($ptnumber + 1) < $man_num) {
$istsql2 = "insert into lkt_order(user_id,name,mobile,num,z_price,sNo,sheng,shi,xian,address,pay,add_time,otype,ptcode,pid,ptstatus,status,trade_no) values('$uid','$name','$tel',$buy_num,$price,'$ordernum',$sheng,$shi,$quyu,'$address','$paytype','$creattime','pt','$oid','$groupid',$status,$ordstatus,'$trade_no')";
$res2 = $db->insert($istsql2);
$istsql3 = "insert into lkt_order_details(user_id,p_id,p_name,p_price,num,r_sNo,add_time,r_status,size,sid) values('$uid',$pro_id,'$pro_name',$y_price,$buy_num,'$ordernum','$creattime',-1,'$pro_size',$sizeid)";
$res3 = $db->insert($istsql3);
$updsql = "update lkt_group_open set ptnumber=ptnumber+1 where group_id='$groupid' and ptcode='$oid'";
$db->update($updsql);
if ($res2 > 0 && $res3 > 0) {
$idres = $db->select("select id from lkt_order where sNo='$ordernum'");
if (!empty($idres)) $idres = $idres[0]->id;
$db->commit();
return 'code:1';
} else {
$db->rollback();
return 'code:2';
}
} else if (($ptnumber + 1) === $man_num) {
$istsql2 = "insert into lkt_order(user_id,name,mobile,num,z_price,sNo,sheng,shi,xian,address,pay,add_time,otype,ptcode,pid,ptstatus,status,trade_no) values('$uid','$name','$tel',$buy_num,'$price','$ordernum',$sheng,$shi,$quyu,'$address','$paytype','$creattime','pt','$oid','$groupid',$status,$ordstatus,'$trade_no')";
$res2 = $db->insert($istsql2);
$istsql3 = "insert into lkt_order_details(user_id,p_id,p_name,p_price,num,r_sNo,add_time,r_status,size,sid) values('$uid',$pro_id,'$pro_name',$y_price,$buy_num,'$ordernum','$creattime',-1,'$pro_size',$sizeid)";
$res3 = $db->insert($istsql3);
$updsql = "update lkt_group_open set ptnumber=ptnumber+1,ptstatus=2 where group_id='$groupid' and ptcode='$oid'";
$db->update($updsql);
$beres = $db->update("update lkt_order set ptstatus=2,status=1 where pid='$groupid' and ptcode='$oid'");
if ($beres < 1) {
$db->rollback();
return 'code:3';
}
$selmsg = "select m.*,d.p_name,d.p_price,d.num,d.sid from (select o.id,o.user_id,o.ptcode,o.sNo,o.z_price,u.wx_id as uid from lkt_order as o left join lkt_user as u on o.user_id=u.user_id where o.pid='$groupid' and o.ptcode='$oid') as m left join lkt_order_details as d on m.sNo=d.r_sNo";
$msgres = $db->select($selmsg);
foreach ($msgres as $k => $v) {
$beres = $db->update("update lkt_configure set num=num-$v->num where id=$v->sid");
if ($beres < 1) {
$db->rollback();
return 'code:4';
}
$fromidsql = "select fromid,open_id from lkt_user_fromid where open_id='$v->uid' and id=(select max(id) from lkt_user_fromid where open_id='$v->uid')";
$fromidres = $db->select($fromidsql);
foreach ($fromidres as $ke => $val) {
if ($val->open_id == $v->uid) {
$msgres[$k]->fromid = $val->fromid;
}
}
}
if ($res2 > 0 && $res3 > 0) {
$sql = "select * from lkt_notice where id = '1'";
$db->select($sql);
$db->commit();
} else {
$db->rollback();
return 'code:5';
}
} else if ($ptnumber == $man_num) {
$beres = $db->update("update lkt_user set money=money+$price where user_id='$uid'");
if ($beres < 1) {
$db->rollback();
return 'code:6';
}
$db->commit();
return 'code:7';
}
} else {
$beres = $db->update("update lkt_user set money=money+$price where user_id='$uid'");
if ($beres < 1) {
$db->rollback();
return 'code:8';
}
}
}
}
$db = DBAction::getInstance();
//使用通用通知接口
$notify = new Notify_pub();
//存储微信的回调
$xml = isset($GLOBALS['HTTP_RAW_POST_DATA'])? $GLOBALS['HTTP_RAW_POST_DATA'] : file_get_contents('php://input');
$notify->saveData($xml);
if ($notify->checkSign() == FALSE) {
$notify->setReturnParameter("return_code", "FAIL");//返回状态码
$notify->setReturnParameter("return_msg", "签名失败");//返回信息
} else {
$notify->setReturnParameter("return_code", "SUCCESS");//设置返回码
}
$returnXml = $notify->returnXml();
echo $returnXml;
//以log文件形式记录回调信息
$log_ = new Log_();
$log_name = "./notify_url.log";//log文件路径
$log_->log_result($log_name, "【接收到的notify通知】:\n" . $xml . "\n");
if ($notify->checkSign() == TRUE) {
$log_->log_result($log_name, "【签名验证结果 succ】:\n" . $notify->checkSign() . "\n");
if ($notify->data["return_code"] == "FAIL") {
//此处应该更新一下订单状态,商户自行增删操作
$log_->log_result($log_name, "【通信出错】:\n" . $xml . "\n");
} elseif ($notify->data["result_code"] == "FAIL") {
//此处应该更新一下订单状态,商户自行增删操作
$log_->log_result($log_name, "【业务出错】:\n" . $xml . "\n");
} else {
//此处应该更新一下订单状态,商户自行增删操作
$trade_no = $notify->data["out_trade_no"];
$type = substr($trade_no, 0, 2);
if ($type == 'CZ') {
$czsql = "select event from lkt_record where event = '$trade_no' ";
$czres = $db->select($czsql);
if (!$czres) {
$order = new order;
$openid = $notify->data["openid"];
$cmoney = $notify->data["total_fee"] / 100;
$order->cz($openid, $cmoney, $trade_no);
}
} else if ($type == 'PT') {
$dsql = "select data from lkt_order_data where trade_no = '$trade_no'";
$dres = $db->select($dsql);
$data = unserialize($dres[0]->data);
$order = new order;
if ($data['pagefrom'] == 'kaituan') {
$ptres = $order->creatgroup($data);
} else {
$ptres = $order->can_order($data);
}
$log_->log_result($log_name, "【拼团处理结果】:\n" . $ptres . "\n");
} else {
$sql = "select * from lkt_order where trade_no='$trade_no'";
$r = $db->select($sql);
if ($r) {
$status = $r[0]->status;
$sNo = $r[0]->sNo;
if ($status < 1) {
$sql_u = "update lkt_order set status = 1,trade_no='$trade_no' where sNo = '$sNo' ";
$r_u = $db->update($sql_u);
if ($r_u) {
$time = date("Y-m-d h:i:s", time()); // 当前时间
}
}
}
}
}
} else {
$log_->log_result($log_name, "【签名验证结果 fail】:\n" . $notify->checkSign() . "\n");
}
?>