where($map)->find(); if(empty($result_data)) {$this->record_logs("数据异常");return false;} $other = $order->where(array('merchandise_id'=>$result_data['merchandise_id'],'pay_status'=>1))->find(); if(!empty($other)){ $datasave['pay_status'] = 1; $datasave['is_refund'] = 2; $res = $order->where($map)->save($datasave); return false; } if($result_data['pay_status'] == 0) { $data_save['pay_status'] = 1; $data_save['trade_no'] = $data['trade_no']; $data_save['pay_time'] = NOW_TIME; $res = $order->where($map)->save($data_save); if($res!== false) { M('Merchandise','tab_')->where(['id'=>$result_data['merchandise_id']])->save(['status'=>4]); M('user','tab_')->where(['id'=>$result_data['buyer_id']])->setInc("cumulative",$result_data['order_price']); return true; } else { $this->record_logs("修改数据失败"); } } else { return true; } } /** *充值到游戏成功后修改充值状态和设置游戏币 */ protected function set_spend($data){ $spend = M('Spend',"tab_"); $map['pay_order_number'] = $data['out_trade_no']; $d = $spend->where($map)->find(); if(empty($d)){$this->record_logs("数据异常");return false;} // 支付金额判断 by zgc if (isset($data['money']) && $d['pay_amount'] != $data['money']) { $this->record_logs("支付金额不一致".$data['out_trade_no'].":".$data['money']);return false; } if($d['pay_status'] == 0){ // 处理绑币平台币优先处理 if ($d['deduction_amount'] > 0) { $out_trade_no = "PF_" . date('Ymd') . date('His') . sp_random_string(4); $bind_balance = M('user_play', 'tab_')->where(array( 'user_id' => $d['user_id'], 'game_id' => $d['game_id'] ))->getField('bind_balance'); $request = $d; $request['pay_order_number'] = $out_trade_no; $request['price'] = $bind_balance; $request['deduction_amount'] = 0; $request['pay_way'] = -1; $request['pay_status'] = 1; if ($d['deduction_amount'] > $bind_balance) $bb = 0; else $bb = $bind_balance - $d['deduction_amount']; if ($bind_balance > 0) { M('user_play', 'tab_')->where(array( 'user_id' => $d['user_id'], 'game_id' => $d['game_id'] ))->save(array( 'bind_balance' => $bb )); $result = $this->add_spend($request); $this->set_ratio($request['pay_order_number'], 2); // 游戏返利 } if ($bb == 0) { $mbalance = $d['deduction_amount'] - $bind_balance; if ($mbalance > 0) { $request['pay_way'] = 0; $request['pay_order_number'] = $request['pay_order_number']."_1"; $request['price'] = $mbalance; $balance = M('user', 'tab_')->where(array( 'id' => $d['user_id'], ))->getField('balance'); if ($balance < $mbalance) { // 异常 $this->record_logs($mbalance."平台币余额不足".$balance);return false; } M('user', 'tab_')->where(array( 'id' => $d['user_id'] ))->save(array( 'balance' => $balance - $mbalance, )); $result = $this->add_spend($request); $this->set_ratio($request['pay_order_number'], 2); // 游戏返利 } } } $data_save['pay_status'] = 1; $data_save['order_number'] = $data['trade_no']; $map_s['pay_order_number'] = $data['out_trade_no']; $r = $spend->where($map_s)->save($data_save); $this->set_ratio($d['pay_order_number']); //APP邀请好友消费奖励平台币 $this->inviteFriendAward($d['user_id'],$d['pay_amount'],$data['out_trade_no']); //充值奖励积分 $this->rechargeAwardPoint($d['user_id'],$d['pay_amount']); //累计消费 $this->changeCumulative('Spend',$d['pay_order_number']); if($r!== false){ $game = new GameApi(); $game->game_pay_notify($data,1); return true; }else{ $this->record_logs("修改数据失败"); } } else{ return true; } } /** *充值平台币成功后的设置 */ protected function set_deposit($data){ $deposit = M('deposit',"tab_"); $map['pay_order_number'] = $data['out_trade_no']; $d = $deposit->where($map)->find(); if(empty($d)){return false;} if($d['pay_status'] == 0){ $data_save['pay_status'] = 1; $data_save['order_number'] = $data['trade_no']; $data_save['check_sign'] = get_check_sign($d['user_id'],$data['trade_no'],$d['pay_amount'],$d['create_time']); $map_s['pay_order_number'] = $data['out_trade_no']; $r = $deposit->where($map_s)->save($data_save); if($r !== false){ $user = M("user","tab_"); $user->where("id=".$d['user_id'])->setInc("balance",$d['pay_amount']); $user->where("id=".$d['user_id'])->setInc("cumulative",$d['pay_amount']); //APP邀请好友消费奖励平台币 $this->inviteFriendAward($d['user_id'],$d['pay_amount'],$data['out_trade_no']); //充值奖励积分 $this->rechargeAwardPoint($d['user_id'],$d['pay_amount']); }else{ $this->record_logs("修改数据失败"); } return true; } else{ return true; } } /** * 充值推广平台币 */ protected function set_balance($data){ $balance = M("balance", "tab_"); $map['pay_order_number'] = $data['out_trade_no']; $orderinfo = $balance->where($map)->find(); if($orderinfo['pay_status'] == 0){ $data_save['pay_status'] = 1; $data_save['order_number'] = $data['trade_no']; $map_s['pay_order_number'] = $data['out_trade_no']; $r = $balance->where($map_s)->save($data_save); if($r!== false){ $promote = M("promote","tab_"); $map['account'] = $orderinfo['recharge_account']; $promote->where($map)->setInc("balance_coin",$orderinfo['money']); }else{ $this->record_logs("修改数据失败"); } return true; }else{ return true; } } /** *设置代充数据信息 */ protected function set_agent($data){ $agent = M("agent","tab_"); $map['pay_order_number'] = $data['out_trade_no']; $d = $agent->where($map)->find(); if(empty($d)){return false;} if($d['pay_status'] == 0){ $data_save['pay_status'] = 1; $data_save['order_number'] = $data['trade_no']; $map_s['pay_order_number'] = $data['out_trade_no']; $r = $agent->where($map_s)->save($data_save); if($r!== false){ $user = M("user_play","tab_"); $map_play['user_id'] = $d['user_id']; $map_play['game_id'] = $d['game_id']; $res = $user->where($map_play)->setInc("bind_balance",$d['amount']); }else{ $this->record_logs("修改数据失败"); } return true; } else{ return true; } } /* * 超级签支付成功通知验证后调用 * return 1订单不存在 2已支付 0成功 -1数据错误 */ protected function supersign_pay_notify($data) { $order = M('game_supersign', 'tab_')->where(array( 'order_id' => $data['order_id'] ))->find(); if (!$order) return 0; if ($order['pay_status'] == 1) return 0; $r = M('game_supersign', 'tab_')->where(array( 'order_id' => $data['order_id'], 'pay_status' => 0, ))->save(array( 'trade_id' => $data['trade_id'], 'pay_status' => 1, 'pay_way'=>$data['pay_way'], 'pay_time' => time() )); if (!$r) return -1; return 1; } /** * 绑币充值回调 * @param $data * @return bool * author: xmy 280564871@qq.com */ protected function set_bind_recharge($data) { $bind_recharge = M("bind_recharge", "tab_"); $map['pay_order_number'] = $data['out_trade_no']; $d = $bind_recharge->where($map)->find(); if (empty($d)) { return false; } if ($d['pay_status'] == 0) { $data_save['pay_status'] = 1; $data_save['order_number'] = $data['trade_no']; $data_save['check_sign'] = get_check_sign($d['user_id'],$data['trade_no'],$d['amount'],$d['create_time']); $map_s['pay_order_number'] = $data['out_trade_no']; $r = $bind_recharge->where($map_s)->save($data_save); if ($r !== false) { $user = M("user_play", "tab_"); $map_play['user_id'] = $d['user_id']; $map_play['game_id'] = $d['game_id']; $res = $user->where($map_play)->setInc("bind_balance", $d['amount']); //APP邀请好友消费奖励平台币 $this->inviteFriendAward($d['user_id'],$d['real_amount'],$data['out_trade_no']); //充值奖励积分 $this->rechargeAwardPoint($d['user_id'],$d['real_amount']); } else { $this->record_logs("修改数据失败"); } return true; } else { return true; } } /** * 获取奖励平台币 总额 * @param $invite_id * @param $user_id * @return mixed * author: xmy 280564871@qq.com */ protected function getUserInviteCoin($invite_id,$user_id){ $tab_sha=M('share_record','tab_'); $map['invite_id'] = $invite_id; $map['user_id'] = $user_id; $data = $tab_sha->field("sum(award_coin) as award_coin") ->where($map) ->group("user_id") ->find(); return $data['award_coin']; } /** * 邀请好友消费奖励平台币 * @param $user_id * @param $pay_amount * @param $order_number * @return bool * author: xmy 280564871@qq.com */ protected function inviteFriendAward($user_id,$pay_amount,$order_number){ $tab_sha=M('share_record','tab_'); $map['user_id'] = $user_id; $share_record = $tab_sha->where($map)->find(); if(empty($share_record)){ return true; } $invite_id = $share_record['invite_id']; //计算奖励 $award_coin = round($pay_amount * 0.05,2); //增加邀请用户 平台币 $invite = M("user","tab_")->find($invite_id);//邀请人 //获取该邀请人共获得多少平台币 $total = $this->getUserInviteCoin($invite_id,$user_id); //是否到达上限 if($total >= 100){ return true; } if($total+$award_coin > 100){ $award_coin = 100 - $total; } //$award_coin=99; $invite['balance'] += $award_coin; //奖励平台币记录 $share_record['create_time'] = time(); $share_record['award_coin'] = $award_coin; $share_record['order_number'] = $order_number; unset($share_record['id']); //开启事务 $tab_sha->startTrans(); $record_result = $tab_sha->add($share_record);//平台币奖励记录 $invite_result = M("user","tab_")->save($invite);//邀请人平台币存储 if($record_result === false || $invite_result === false){ $tab_sha->rollback(); return false; }else{ $tab_sha->commit(); return true; } } /** * 获取积分方式 * @param $key * @return bool|mixed * author: xmy 280564871@qq.com */ public function getPointType($key){ $map['key'] = $key; $map['status'] = 1; $type = M("point_type","tab_")->where($map)->find(); if(empty($type)){ // $this->error = "此奖励不存在或被禁用"; return false; } return $type; } /** * 充值获得积分 * @param $user_id * @param $pay_amount * @return bool * author: xmy 280564871@qq.com */ protected function rechargeAwardPoint($user_id,$pay_amount){ $point_recorddd=M('point_record','tab_'); $user = M("user","tab_")->find($user_id); if(empty($user_id)){ return true; } //奖励用户积分 $point_type = $this->getPointType("recharge_spend"); $point = intval($point_type['point'] * $pay_amount); $point_recorddd->startTrans(); if($point > 0){ $user['point'] += $point; //积分记录 $data['user_id'] = $user_id; $data['type_id'] = $point_type['id']; $data['point'] = $point; $data['create_time'] = time(); $data['type'] = 1; $point_result = M("point_record","tab_")->add($data);//积分记录存储 } $user_result = M("user","tab_")->save($user);//被邀请人积分存储 if($point_result === false || $user_result === false){ $point_recorddd->rollback(); return false; }else{ $point_recorddd->commit(); return true; } } /** *游戏返利 */ protected function set_ratio($data) { $map['pay_order_number']=$data; $spend=M("Spend","tab_")->where($map)->find(); $reb_map['game_id']=$spend['game_id']; $time = time(); $reb_map['starttime'] = ['lt',$time]; $reb_map_str = "endtime > {$time} or endtime = 0"; if($spend['promote_id'] == 0){ $reb_map['promote_id'] = ['in','0,-1']; }else{ $reb_map['promote_id'] = ['neq',0]; } $rebate=M("Rebate","tab_")->where($reb_map)->where($reb_map_str)->find(); if (!empty($rebate)) { if ($rebate['money'] > 0 && $rebate['status'] == 1) { if ($spend['pay_amount'] >= $rebate['money']) { $this->compute($spend, $rebate); } else { return false; } } else { $this->compute($spend, $rebate); } }else { return false; } } //计算返利 protected function compute($spend,$rebate){ $user_map['user_id']=$spend['user_id']; $user_map['game_id']=$spend['game_id']; $bind_balance=$spend['pay_amount']*($rebate['ratio']/100); $spend['ratio']=$rebate['ratio']; $spend['ratio_amount']=$bind_balance; M("rebate_list","tab_")->add($this->add_rebate_list($spend)); $re=M("UserPlay","tab_")->where($user_map)->setInc("bind_balance",$bind_balance); return $re; } /** *返利记录 */ protected function add_rebate_list($data){ $add['pay_order_number']=$data['pay_order_number']; $add['game_id']=$data['game_id']; $add['game_name']=$data['game_name']; $add['user_id']=$data['user_id']; $add['user_name'] = $data['user_account']; $add['pay_amount']=$data['pay_amount']; $add['ratio']=$data['ratio']; $add['ratio_amount']=$data['ratio_amount']; $add['promote_id']=$data['promote_id']; $add['promote_name']=$data['promote_account']; $add['create_time']=time(); return $add; } /** * 累计消费 * lcj */ protected function changeCumulative($table,$order=''){ $table = M($table,'tab_'); $data = $table->where(array('pay_order_number'=>$order))->find(); if($data){ //平台币 绑币不累计消费 if($data['pay_way']>0){ $user = M('user','tab_'); $user->where(array('id'=>$data['user_id']))->setInc("cumulative",$data['pay_amount']); //小号充值则大号小号一起累计 if($data['small_id']>0){ $user->where(array('id'=>$data['small_id']))->setInc("cumulative",$data['pay_amount']); } } }else{ return false; } } /** *日志记录 */ protected function record_logs($msg=""){ \Think\Log::record($msg); } protected function wite_text($txt,$name){ $myfile = fopen($name, "w") or die("Unable to open file!"); fwrite($myfile, $txt); fclose($myfile); } /** *消费表添加数据 */ public function add_spend($data,$type=0){ $spend = M("spend","tab_"); $spend_data = $this->spend_param($data); $ordercheck = $spend->where(array('pay_order_number'=>$spend_data["pay_order_number"]))->find(); if($ordercheck) { if($type==1){ redirect(U('Spend/notice',array('user_id'=>$ordercheck['user_id'],'game_id'=>$ordercheck['game_id'],'msg'=>'订单已经存在,请刷新充值页面重新下单!')));exit; }else{ $this->set_message(0,'fail',"订单已经存在,请刷新充值页面重新下单!"); } } // if(!is_check_apply_promote($spend_data['game_id'],$spend_data['promote_id'])){ // $spend_data['promote_id']=0; // $spend_data['promote_account']="自然注册"; // } $result = $spend->add($spend_data); return $result; } /** *消费记录表 参数 */ private function spend_param($param=array()){ $user_entity = get_user_entity($param['user_id']); $data_spned['user_id'] = $param["user_id"]; $data_spned['user_account'] = $user_entity["account"]; $data_spned['user_nickname'] = $user_entity["nickname"]; $data_spned['game_id'] = $param["game_id"]; $data_spned['game_appid'] = $param["game_appid"]; $data_spned['game_name'] = get_game_name($param["game_id"]); $data_spned['selle_ratio'] = get_game_selle_ratio($param["game_id"]); $data_spned['server_id'] = $param["server_id"]; $data_spned['server_name'] = $param["server_name"]; $data_spned['game_player_name'] = $param["game_player_name"]; $data_spned['promote_id'] = $user_entity["promote_id"]; $data_spned['promote_account'] = $user_entity["promote_account"]; $data_spned['order_number'] = $param["order_number"]; $data_spned['pay_order_number'] = $param["pay_order_number"]; $data_spned['props_name'] = $param["title"]; $data_spned['cost'] = $param["price"];//原价 $data_spned['deduction_amount'] = $param["deduction_amount"];// 抵扣价格 $data_spned['discount_amount'] = $param["discount_amount"];// 折扣价格 $data_spned['pay_time'] = NOW_TIME; $data_spned['pay_status'] = $param["pay_status"]; $data_spned['pay_game_status'] = 0; $data_spned['extend'] = $param['extend']; $data_spned['pay_way'] = $param["pay_way"]; if($data_spned['pay_way'] != 7){ $discount = $this->get_discount($param['game_id'],$user_entity['promote_id'],$param['user_id']); $data_spned['pay_amount'] = $param["price"] * $discount['discount']/10;//实付金额 $data_spned['discount_type'] = $discount['discount_type']; }else{//苹果支付不计入折扣 $data_spned['pay_amount'] = $param["price"]; $data_spned['discount_type'] = 0; } if (isset($param['actual_amount']) && $param['actual_amount']) $data_spned['pay_amount'] = $param['actual_amount']; // 实际支付价格 $data_spned['spend_ip'] = $param["spend_ip"]; $data_spned['sdk_version'] = $param["sdk_version"]; if($param['small_user_id'] != $param['user_id']) { $data_spned['small_id'] = $param["small_user_id"]; $data_spned['small_account'] = get_user_account_by_id($param['small_user_id']); } return $data_spned; } /** * 获取用户折扣 * @param $game_id 游戏ID * @param $promote_id 渠道ID * @param $user_id 用户ID * @return mixed */ protected function get_discount($game_id,$promote_id,$user_id){ //获取折扣 $map['game_id'] = $game_id; $map['promote_id'] =-1; $map['status'] = 2; $discount = M('Promote_welfare','tab_')->where($map)->find(); if(null==$discount){ $map['game_id'] = $game_id; $map['promote_id'] = $promote_id == 0 ? 0 : -2; $map['status'] = 2; $discount = M('Promote_welfare','tab_')->where($map)->find(); } $discount = discount_data($discount); if(empty($discount)){ $res['discount'] = 10; $res['discount_type'] = 0;//无折扣 return $res; } //判断用户是否为首冲 $where['game_id'] = $game_id; $where['user_id'] = $user_id; $where['pay_status'] = 1; $data = M('bind_spend','tab_')->where($where)->find(); if(!empty($data) || !empty(M('spend','tab_')->where($where)->find())){ $res['discount'] = $discount['continue_discount'];//续冲 $res['discount_type'] = 2; }else{ $res['discount'] = $discount['first_discount'];//首冲 $res['discount_type'] = 1; } return $res; } /** *游戏返利 *$type 类型 1 非绑定平台币 2绑定平台币 */ /* public function set_ratio($data,$type = 1){ $map['pay_order_number']=$data; $map['pay_way'] = ($type==2) ? -1 : 0; // 判断支付类型 $spend=M("Spend","tab_")->where($map)->find(); $reb_map['game_id']=$spend['game_id']; $time = time(); $reb_map['starttime'] = ['lt',$time]; $reb_map_str = "endtime > {$time} or endtime = 0"; switch ($spend['promote_id']) { case 0: $reb_map['promote_id'] = array('in','0,-1'); break; default: $reb_map['promote_id'] = array('in','1,-1'); break; } //如果是绑币则判断是否开启绑币返利 if($type == 2){$reb_map['bind_status'] = 1;} $rebate=M("Rebate","tab_")->where($reb_map)->where($reb_map_str)->find();// if (!empty($rebate)) { if($rebate['money']>0 && $rebate['status']==1){ if($spend['pay_amount']>=$rebate['money']){ $this->compute($spend,$rebate); }else{ return false; } }else{ $this->compute($spend,$rebate); } }else{ return false; } } */ }