diff --git a/application/api/controller/Payment.php b/application/api/controller/Payment.php index abedc303..69217516 100644 --- a/application/api/controller/Payment.php +++ b/application/api/controller/Payment.php @@ -66,7 +66,6 @@ class Payment extends Controller $order_number = $this->createOrderSn(); $data['order_sn'] = $order_number; $data['money'] = $money; - $data['coin'] = $coin; $data['user_id'] = $user_id; $data['pay_type'] = $type; $data['createtime'] = time(); @@ -96,7 +95,10 @@ class Payment extends Controller $tonglian = new \TongLian(); $result['tl'] = $tonglian->TongLianPay($data, $type); }elseif($type == 6){ - $result = null; + $result = [ + 'order_no' => $order_number, +// 'merchant_id' => get_system_config_value('merchant_id') + ]; }else{ return V(0, '请选择正确的支付方式', null); } @@ -339,4 +341,92 @@ class Payment extends Controller echo "fail"; } } + + //苹果回调 + public function notify_apple(){ + // 1. 接收APP端参数 + $orderNo = input('order_no', 0); + $paymentToken = input('payment_token', ''); // APP端获取的支付凭证 + + // 2. 参数校验 + if (empty($orderNo) || empty($paymentToken)) { + return V(0, '参数缺失'); + } + + // 3. 查询订单(防止订单不存在) + $order = Db::name('vs_user_recharge')->where('order_sn', $orderNo)->find(); + if (!$order) { + return V(0, '订单不存在'); + } + if ($order['pay_status'] == 2) { + return V(0, '订单已支付');// 幂等处理,防止重复回调 + } + + // 4. 调用苹果接口验证支付凭证 + $verifyResult = $this->verifyApplePayReceipt($paymentToken); + if (!$verifyResult) { + return V(0, '支付凭证验证失败'); + } + + // 2. 从苹果返回的凭证中解析实际支付金额(//沙箱环境没有这个参数) + $applePayAmount = $verifyResult['receipt']['in_app'][0]['price'] ?? 0; // 苹果返回的实际支付金额 + + // 3. 校验金额一致性(允许微小误差,如分位四舍五入) + if (abs($order['money'] - $applePayAmount) > 0.01) { + // 金额不一致,拒绝更新订单 +// return V(0, '金额不一致');//沙箱环境没有这个参数 + } + + $transaction_id = $verifyResult['receipt']['in_app'][0]['transaction_id'] ?? '';// 苹果返回的订单号 + // 5. 更新订单状态 + //成功后的业务逻辑处理 + $where['order_sn']=$orderNo; + $where['order_type']=1;//1 充值 + $where['pay_type']=6;//1微信2支付宝 3通联支付宝 4通联微信 + $where['pay_status']=1; + + $data=[ + 'trade_no' => $transaction_id + ]; + + $res = handelCharge($where,$data); + if($res==0){ + return V(0, '订单处理失败'); + } + return V(1, '支付成功'); + } + + + // 核心:调用苹果服务器验证支付凭证 + private function verifyApplePayReceipt($paymentToken) + { + // 订单创建时的金额(固定/用户输入的自由金额) + + // 1. 组装请求参数 + $postData = json_encode([ + 'receipt-data' => $paymentToken, // APP端传入的支付凭 + ]); + + // 2. 先请求生产环境,失败再试沙箱(苹果推荐逻辑) +// $url = 'https://buy.itunes.apple.com/verifyReceipt';//正式验证环境 + $url = "https://sandbox.itunes.apple.com/verifyReceipt";//沙箱测试环境 + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 生产环境建议开启 + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); + $result = curl_exec($ch); + curl_close($ch); + + $result = json_decode($result, true); + // 验证返回码:status=0表示验证成功 + if ($result['status'] == 0) { + return $result; + } + + return false; + } } \ No newline at end of file diff --git a/application/api/controller/UserWallet.php b/application/api/controller/UserWallet.php index 67ceda73..6e3cd8ca 100644 --- a/application/api/controller/UserWallet.php +++ b/application/api/controller/UserWallet.php @@ -87,6 +87,47 @@ class UserWallet extends BaseCom } return V(1, '获取成功', $reslut_data); } + + //苹果商店充值金额列表 + public function can_recharge_list_ios(){ + $app_version = request()->header('App-Version'); + $system = request()->header('system'); + + $reslut = db::name("vs_can_recharge")->where("status",1)->where("delete_time",0)->order('money asc')->select(); + $reslut_data = []; + + if ($system == 'iOS') { + $api_versions = db::name('version')->where(['type' => 2, 'status' => 1])->order('id', 'desc')->find(); + //app的版本和用户使用的当前版本比对 + //$api_versions['newversion'] 是数据库当前的版本 也是用户使用的版本 + //$app_version 有可能是appstore里面的审核版本 审核版本比用户的版本高 + + $result = version_compare($api_versions['newversion'],$app_version); + if ($result < 0) {//-1:前面版本小于后面版本,0:相等,1:前面版本大于后面版本 +// $api_version = 1;//商店审核版本给前端返回1 + foreach ($reslut as $k=>$v){ + if($v['money'] == 2000){ + $reslut_data[$k]['money'] = 1999; + }else{ + $reslut_data[$k]['money'] = $v['money']; + } + $reslut_data[$k]['coins'] = $v['coins']; + $reslut_data[$k]['ios_coins'] = $v['coins'] * 7 / 10; + $reslut_data[$k]['product_id'] = $v['product_id']; + } + }else{ + foreach ($reslut as $k=>$v){ + $reslut_data[$k]['money'] = $v['money']; + $reslut_data[$k]['coins'] = $v['coins']; + $reslut_data[$k]['ios_coins'] = $v['coins'] * 7 / 10; + $reslut_data[$k]['product_id'] = $v['product_id']; + } + } + } + + return V(1, '获取成功', $reslut_data); + } + /* * 钻石兑换金币比例 */ diff --git a/application/api/model/Room.php b/application/api/model/Room.php index 816a9c3f..f13226a2 100644 --- a/application/api/model/Room.php +++ b/application/api/model/Room.php @@ -2745,7 +2745,6 @@ class Room extends Model } } - $data = []; //1-交友,3、4、8-不要了 if($type == 1 || $type == 3 || $type == 4 || $type == 8){ @@ -2756,6 +2755,7 @@ class Room extends Model 'is_song' => 1 ]; } + //拍卖 if($type == 2){ $data = [ @@ -2765,6 +2765,7 @@ class Room extends Model 'is_song' => 1 ]; } + //(互娱) if($type == 7){ $data = [ @@ -2782,6 +2783,7 @@ class Room extends Model 'room_up_pit_type' => 1, ]; } + //签约房 if($type == 10){ $data = [ @@ -2843,6 +2845,7 @@ class Room extends Model 'text' => '房间类型已修改type--'.$type ]; model('Chat')->sendMsg(1012,$room_id,$text); + Cache::rm('room_info_'.$room_id); return ['code' => 1, 'msg' => '修改成功', 'data' => null]; } diff --git a/application/api/model/RoomPit.php b/application/api/model/RoomPit.php index fabade2e..328165ec 100644 --- a/application/api/model/RoomPit.php +++ b/application/api/model/RoomPit.php @@ -294,6 +294,8 @@ class RoomPit extends Model } } + //检查是否在坑位上 + $pit_infos = db::name('vs_room_pit')->where(['room_id' => $room_id, 'user_id' => $user_id])->field('id,pit_number')->find(); if($pit_number == 9){ //检查用户是否是房主或主持 $is_room_owner =db::name('vs_room')->where(['id' => $room_id, 'user_id' => $user_id])->field('id')->find(); @@ -301,15 +303,15 @@ class RoomPit extends Model if(!$is_room_owner && !$is_room_host){ return ['code' => 0, 'msg' => '没有权限', 'data' => null]; } + if($pit_infos){ + return ['code' => 0, 'msg' => '您已在麦上', 'data' => null]; + } } if($pit_number == 10){ return ['code' => 0, 'msg' => '请等待主持抱麦', 'data' => null]; } - //检查是否在坑位上 - $pit_infos = db::name('vs_room_pit')->where(['room_id' => $room_id, 'user_id' => $user_id])->field('id,pit_number')->find(); - if($room_info['label_id'] == 5 && $room_info['step'] != 1 && $pit_number < 9){ return ['code' => 0, 'msg' => '互娱房 此阶段不可此操作', 'data' => null]; } diff --git a/application/api/model/RoomSong.php b/application/api/model/RoomSong.php index deb993e0..99964762 100644 --- a/application/api/model/RoomSong.php +++ b/application/api/model/RoomSong.php @@ -140,6 +140,7 @@ class RoomSong extends Model model('RoomPit')->DownPit($v['user_id'],$room_id,$v['pit_number']); } } + Cache::rm('room_info_'.$room_id); //推送消息 $text = [ 'text' => '房间类型变成k歌--2' @@ -529,6 +530,11 @@ class RoomSong extends Model if(!$host && $owner != $user_id){ return ['code' => 0, 'msg' => '您没有权限上麦', 'data' => null]; } + //检查是否在坑位上 + $pit_infos = db::name('vs_room_pit')->where(['room_id' => $room_id, 'user_id' => $user_id])->field('id,pit_number')->find(); + if($pit_infos){ + return ['code' => 0, 'msg' => '您已在麦上', 'data' => null]; + } } $ompit = model('RoomPit')->OnPit($user_id,$room_id,$pit_number);//用户上了这个房间的几号麦位 diff --git a/application/api/model/User.php b/application/api/model/User.php index dac41ed1..8baa10c7 100644 --- a/application/api/model/User.php +++ b/application/api/model/User.php @@ -867,7 +867,7 @@ class User extends Model $member_name = db::name('user')->where('id' , $user_id)->value('nickname'); $member_face_url = db::name('user')->where('id' , $user_id)->value('avatar'); model('Tencent')->modify_user_infos($user_id, $member_name, $member_face_url); - + Cache::rm('user_base_info_'.$user_id); return ['code' => 1, 'msg' => '修改成功', 'data' => null]; } catch(\Exception $e){