Ver Fonte

增加报名

15954078560 há 3 anos atrás
pai
commit
540e29bd17

+ 5 - 5
addons/qcloudsms/config.php

@@ -97,11 +97,11 @@ return [
         'type' => 'array',
         'content' => [],
         'value' => [
-            'register' => '1363524',
-            'resetpwd' => '1363524',
-            'changepwd' => '1363524',
-            'mobilelogin' => '1363524',
-            'changemobile' => '1363524',
+            'register' => '1378407',
+            'resetpwd' => '1378407',
+            'changepwd' => '1378407',
+            'mobilelogin' => '1378407',
+            'changemobile' => '1378407',
         ],
         'rule' => 'required',
         'msg' => '',

+ 414 - 0
application/api/controller/Index.php

@@ -6,6 +6,7 @@ use AlibabaCloud\SDK\Dyvmsapi\V20170525\Models\ListCallTaskResponseBody\data;
 use app\common\controller\Api;
 use function GuzzleHttp\Psr7\uri_for;
 use think\Db;
+use wxpay;
 
 /**
  * 首页接口
@@ -416,8 +417,421 @@ class Index extends Api
         $this->success('招标详情', $info);
     }
 
+    //报名活动之前检查
+    public function beforesignup() {
+        $id = input('id', 0, 'intval'); //活动id
+        if (!$id) {
+            $this->error('请选择要报名的活动');
+        }
+        $info = Db::name('active')->find($id);
+        if (!$info) {
+            $this->error('活动不存在');
+        }
+        if ($info['signupendtime'] < time() || $info['status'] != 0) {
+            $this->error('活动报名已经截止');
+        }
+        if ($info['currentperson'] >= $info['maxperson']) {
+            $this->error('活动名额已满');
+        }
+        //检查自己信息是否完善
+        if (!$this->auth->realname) {
+            $this->error('请在个人资料中完善真实姓名', '', 5);
+        }
+        if (!$this->auth->idcard) {
+            $this->error('请在个人资料中完善身份证号', '', 5);
+        }
+        if (!$this->auth->emergencycontact) {
+            $this->error('请在个人资料中完善紧急联系人', '', 5);
+        }
+        if (!$this->auth->contactmobile) {
+            $this->error('请在个人资料中完善紧急联系方式', '', 5);
+        }
+
+        $this->success('检查通过');
+    }
+
+    //报名活动
+    public function signupactive() {
+        //检查自己信息是否完善
+        if (!$this->auth->realname || !$this->auth->idcard || !$this->auth->emergencycontact || !$this->auth->contactmobile) {
+            $this->error('请在个人资料中完善资料', '', 5);
+        }
+
+        $id = input('id', 0, 'intval'); //活动id
+        //人员信息json串:
+        // name姓名 credtype证件类型 idcard身份证号 mobile手机号 emergencycontact紧急联系人 contactmobile紧急联系方式
+        // insurance保险 originalprice原价  vipprice会员价 coupon_id用户优惠券ID is_free是否使用免费次数:0=否,1=是
+        // price小计  is_self是否本人:0=否,1=是
+        $active_people = input('active_people', '', 'trim');
+        $paytype = input('paytype', 0, 'intval'); //支付方式:0=余额,1=微信
+        $total_price = input('total_price', 0, 'trim'); //总价格
+
+        if (!preg_match('/^[0-9]+(.[0-9]{1,2})?$/', $total_price) || $total_price < 0) {
+            $this->error('合计价格错误');
+        }
+        if (!in_array($paytype, [0, 1])) {
+            $this->error('支付错误');
+        }
+        if ($total_price == 0 && $paytype != 0) {
+            $this->error('请选择余额支付');
+        }
+        //检查活动信息
+        if (!$id) {
+            $this->error('请选择要报名的活动');
+        }
+        $info = Db::name('active')->find($id);
+        if (!$info) {
+            $this->error('活动不存在');
+        }
+        if ($info['signupendtime'] < time() || $info['status'] != 0) {
+            $this->error('活动报名已经截止');
+        }
+        if ($info['currentperson'] >= $info['maxperson']) {
+            $this->error('活动名额已满');
+        }
+        //检查人员信息
+        if (!$active_people) {
+            $this->error('请添加报名人员信息');
+        }
+        $active_people = json_decode($active_people, true);
+        if (!$active_people) {
+            $this->error('请添加报名人员信息');
+        }
+        if ($info['currentperson'] + count($active_people) > $info['maxperson']) {
+            $this->error('活动名额不足');
+        }
+
+        $_data = [];
+        $total_amount = 0; //总价格验证
+        $active_people = Db::name('active_people'); //报名人员表
+        $active_people_modify = Db::name('active_people_modify'); //报名修改信息表
+        $vip = Db::name('vip');
+        $user_coupon = Db::name('user_coupon');
+        foreach ($active_people as &$v) {
+            $data = [];
+            //判断是否报名过
+            $count = $active_people->where(['active_id' => $id, 'idcard' => $v['idcard']])->count('id');
+            if ($count) {
+                $this->error($v['name'] . $v['idcard'] . '已报名过该活动');
+                break;
+            }
+            $count2 = $active_people_modify->where(['active_id' => $id, 'idcard' => $v['idcard'], 'status' => 0])->count('id');
+            if ($count2) {
+                $this->error($v['name'] . $v['idcard'] . '已提交过修改,请等待审核');
+                break;
+            }
+            //判断证件类型和保险
+            if (!$v['credtype'] || iconv_strlen($v['credtype'], 'utf-8') > 50) {
+                $this->error('证件类型错误');
+                break;
+            }
+            if (!$v['insurance'] || iconv_strlen($v['insurance'], 'utf-8') > 50) {
+                $this->error('保险信息错误');
+                break;
+            }
+            //判断用户信息
+            if ($v['is_self']) {
+                //本人判断年龄 价格
+                if ($info['maxage'] > 0) {
+                    $age = $this->idcardage($this->auth->idcard);
+                    if ($age < $info['minage'] || $age > $info['maxage']) {
+                        $this->error('活动年龄限制为' . $info['minage'] . '-' . $info['maxage']);
+                        break;
+                    }
+                }
+                if ($v['is_free'] == 1) { //使用免费次数
+                    if ($info['is_free'] != 1) {
+                        $this->error('活动暂不支持免费体验');
+                        break;
+                    }
+                    if ($v['vipprice'] != 0 || $v['price'] != 0) {
+                        $this->error($this->auth->realname . '价格错误');
+                        break;
+                    }
+                    if ($v['coupon_id']) {
+                        $this->error('使用免费体验,无法使用优惠券');
+                        break;
+                    }
+                } else { //不使用免费次数
+                    //会员价和优惠券是否可以叠加使用:0=否,1=是
+                    if ($info['is_overlying'] == 0 && $v['vipprice'] != $info['price'] && $v['coupon_id']) {
+                        $this->error('该活动不支持会员价和优惠券同时使用');
+                        break;
+                    }
+                    //计算会员价, 会员价优先顺序: 生日 > 女生特权日 > 会员价格
+                    $birthday = date('md', $this->auth->birthday);
+                    $now_day = date('md', time());
+                    if ($birthday == $now_day) {
+                        //生日折扣
+                        $vip_info = $vip->find($this->auth->maxlevel);
+                        if (!$vip_info) {
+                            $this->error('会员信息缺失,请联系管理员');
+                            break;
+                        }
+                        if ($vip_info['birthdiscount'] > 100 || $vip_info['birthdiscount'] < 0) {
+                            $this->error('会员生日折扣错误,请联系管理员');
+                            break;
+                        }
+                        $discount = $vip_info['birthdiscount'];
+                    } elseif ($info['girldiscount'] < 100 && $info['girldiscount'] > 0 && $this->auth->gender == 2) {
+                        //女生特权日折扣
+                        $discount = $info['girldiscount'];
+                    } else {
+                        //会员折扣
+                        $vip_info = $vip->find($this->auth->maxlevel);
+                        if (!$vip_info) {
+                            $this->error('会员信息缺失,请联系管理员');
+                            break;
+                        }
+                        if ($vip_info['vipdiscount'] > 100 || $vip_info['vipdiscount'] < 0) {
+                            $this->error('会员折扣错误,请联系管理员');
+                            break;
+                        }
+                        $discount = $vip_info['vipdiscount'];
+                    }
+                    $vipprice = $info['price'] * $discount / 100; //会员价
+                    //查询优惠券
+                    if ($v['coupon_id']) {
+                        $user_coupon_info = $user_coupon->where(['id' => $v['coupon_id'], 'user_id' => $this->auth->id])->find();
+                        if (!$user_coupon_info) {
+                            $this->error('优惠券不存在');
+                        }
+                        if ($user_coupon_info['status'] != 0) {
+                            $this->error('优惠券已使用');
+                        }
+                        if ($user_coupon_info['endtime'] < time()) {
+                            $this->error('优惠券已过期');
+                        }
+                        if ($user_coupon_info['type'] == 1) {
+                            //打折券
+                            if ($user_coupon_info['money'] < 0 || $user_coupon_info['money'] > 100) {
+                                $this->error('优惠券折扣错误,请联系管理员');
+                                break;
+                            }
+                        } else {
+                            //抵扣券
+                            //会员价和优惠券是否可以叠加使用:0=否,1=是
+                            if ($info['is_overlying'] == 0) {
+                                if ($info['price'] < $user_coupon_info['minmoney']) {
+                                    $this->error('优惠券使用条件不满足');
+                                    break;
+                                }
+                            } else {
+                                if ($vipprice < $user_coupon_info['minmoney']) {
+                                    $this->error('优惠券使用条件不满足');
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                    //判断价格
+                    //会员价和优惠券是否可以叠加使用:0=否,1=是
+                    if ($info['is_overlying'] == 0) {
+                        if ($v['coupon_id']) { //使用优惠券
+                            if ($v['vipprice'] != $info['price']) {
+                                $this->error('会员价显示错误');
+                                break;
+                            }
+                            if ($user_coupon_info['type'] == 1) {
+                                //打折券
+                                $price = $info['price'] * $user_coupon_info['money'] / 100;
+                            } else {
+                                //抵扣券
+                                $price = $info['price'] - $user_coupon_info['money'];
+                            }
+                        } else {
+                            $price = $vipprice;
+                        }
+                    } else {
+                        if ($vipprice != $v['vipprice']) {
+                            $this->error('会员价显示错误');
+                            break;
+                        }
+                        if ($v['coupon_id']) { //使用优惠券
+                            if ($user_coupon_info['type'] == 1) {
+                                //打折券
+                                $price = $vipprice * $user_coupon_info['money'] / 100;
+                            } else {
+                                //抵扣券
+                                $price = $vipprice - $user_coupon_info['money'];
+                            }
+                        } else {
+                            $price = $vipprice;
+                        }
+                    }
+
+                    //判断小计
+                    if ($price != $v['price']) {
+                        $this->error('小计显示错误');
+                        break;
+                    }
+
+                    $data['vipprice'] = $v['vipprice']; //会员价
+                    $data['coupon_id'] = $v['coupon_id']; //优惠券id
+                    if ($v['coupon_id']) {
+                        $data['coupontype'] = $user_coupon_info['type'];
+                        $data['couponprice'] = $user_coupon_info['money'];
+                    }
+                }
+
+                $data['name'] = $this->auth->realname;
+                $data['idcard'] = $this->auth->idcard;
+                $data['mobile'] = $this->auth->mobile;
+                $data['emergencycontact'] = $this->auth->emergencycontact;
+                $data['contactmobile'] = $this->auth->contactmobile;
+            } else {
+                //帮人报名判断年龄 报名信息
+                if ($info['maxage'] > 0) {
+                    $age = $this->idcardage($v['idcard']);
+                    if ($age < $info['minage'] || $age > $info['maxage']) {
+                        $this->error('活动年龄限制为' . $info['minage'] . '-' . $info['maxage']);
+                        break;
+                    }
+                }
+                if (!$v['name'] || iconv_strlen($v['name'], 'utf-8') > 50) {
+                    $this->error('请输入正确姓名');
+                    break;
+                }
+                if (iconv_strlen($v['idcard'], 'utf-8') != 18) {
+                    $this->error('请输入正确身份证号');
+                    break;
+                }
+                if (!is_mobile($v['mobile'])) {
+                    $this->error('请输入正确手机号');
+                    break;
+                }
+                if (!$v['emergencycontact'] || iconv_strlen($v['emergencycontact'], 'utf-8') > 50) {
+                    $this->error('请输入紧急联系人');
+                    break;
+                }
+                if (!is_mobile($v['contactmobile'])) {
+                    $this->error('请输入正确紧急联系人方式');
+                    break;
+                }
+                if ($v['price'] != $info['price']) {
+                    $this->error('小计显示错误');
+                    break;
+                }
+
+                $data['name'] = $v['name'];
+                $data['idcard'] = $v['idcard'];
+                $data['mobile'] = $v['mobile'];
+                $data['emergencycontact'] = $v['emergencycontact'];
+                $data['contactmobile'] = $v['contactmobile'];
+                $data['vipprice'] = $info['price']; //会员价
+            }
+
+            $data['active_id'] = $id;
+            $data['user_id'] = $this->auth->id;
+            $data['credtype'] = $v['credtype'];
+            $data['insurance'] = $v['insurance'];
+            $data['originalprice'] = $info['price'];
+            $data['is_free'] = $v['is_free'];
+            $data['price'] = $v['price']; //小计
+            $data['is_self'] = $v['is_self'];
+            $data['createtime'] = time();
+
+            array_push($_data, $data);
+            $total_amount += $v['price'];
+        }
+
+        if ($total_amount != $total_price) {
+            $this->error('合计价格错误');
+        }
+        if ($paytype == 0) { //余额支付
+            if ($this->auth->money < $total_amount) {
+                $this->error('余额不足,请先去充值');
+            }
+        }
+
+        //构建订单信息
+        $order_data['order_sn'] = date('YmdHis', time()) . rand(10000000, 99999999);
+        $order_data['active_id'] = $id;
+        $order_data['user_id'] = $this->auth->id;
+        $order_data['paytype'] = $paytype;
+        $order_data['price'] = $total_amount;
+        $order_data['number'] = count($active_people);
+        $order_data['status'] = $paytype == 1 ? 0 : 1;
+        $order_data['createtime'] = time();
+
+        //开始事务
+        Db::startTrans();
+        //添加订单
+        $rs = Db::name('active_order')->insertGetId($order_data);
+        if (!$rs) {
+            Db::rollback();
+            $this->error('网络延迟,请稍后再试');
+        }
+        //添加人员信息
+        foreach ($_data as &$v) {
+            $v['order_id'] = $rs;
+            $rt = $active_people->insertGetId($v);
+            if (!$rt) {
+                Db::rollback();
+                $this->error('网络延迟,请稍后再试');
+            }
+        }
+        //扣款 支付方式:0=余额,1=微信
+        if ($paytype == 0) {
+            $res = create_log(-$total_amount, '支付活动订单', $this->auth->id, 2);
+            if ($res != 1) {
+                Db::rollback();
+                $this->error('余额资金异常,请联系管理员');
+            }
+
+            Db::commit();
+            $this->success('报名成功');
+        } else {
+            //生成支付订单记录
+            $rechar_order['user_id'] = $this->auth->id;
+            $rechar_order['order_no'] = date('YmdHis', time()) . rand(10000000, 99999999); //微信订单编号
+            $rechar_order['money'] = $total_amount;
+            $rechar_order['purpose'] = 1; //充值用途:1=支付订单,2=充值,3=开通会员
+            $rechar_order['pay_type'] = 'wechat';
+            $rechar_order['relation_id'] = $rs;
+            $rechar_order['createtime'] = time();
+            $rechar_order['money'] = $total_amount;
+
+            $result = Db::name('rechar_order')->insertGetId($rechar_order);
+            if (!$result) {
+                Db::rollback();
+                $this->error('网络延迟,请稍后再试');
+            }
+
+            //构建支付链接数据
+            $wxData['body'] = '报名活动支付';
+            $wxData['out_trade_no'] = $rechar_order['order_no'];
+            $wxData['total_fee'] = $total_amount;
+//            $wxData['total_fee'] = 0.01;
+            $wxData['openid'] = $this->auth->openid;
 
+//            require_once($_SERVER['DOCUMENT_ROOT'] . '/Plugins/Weixin/WxPay/WxPay.php');
+            $wxPay = new wxpay\WxPay(config('wxchatpay'));
+            $doResult = $wxPay->WxPayJs($wxData);
 
+            $this->success('微信支付参数返回成功', $doResult);
+        }
+    }
+
+    //根据身份证号获取年龄
+    public function idcardage($idcard = '') {
+        //截取身份证里的出生日期
+        $year = substr($idcard, 6, 4);
+        $month = substr($idcard, 10, 2);
+        $day = substr($idcard, 12, 2);
+        //获取当前日期
+        $current_year = date('Y');
+        $current_month = date('m');
+        $current_day = date('d');
+        //计算年龄
+        $age = $current_year - $year;//今年减去生日年
+        if ($month > $current_month || ($month == $current_month && $day > $current_day)) {
+            //如果出生月大于当前月或出生月等于当前月但出生日大于当前日则减一岁
+            $age--;
+        }
+
+        return $age;
+    }
 
 
 

+ 92 - 0
application/common.php

@@ -5,6 +5,7 @@
 use Symfony\Component\VarExporter\VarExporter;
 use think\exception\HttpResponseException;
 use think\Response;
+use think\Db;
 
 if (!function_exists('__')) {
 
@@ -681,4 +682,95 @@ function httpRequest($url, $method, $postfields = null, $headers = array(), $deb
     curl_close($ci);
     return $response;
     //return array($http_code, $response,$requestinfo);
+}
+
+/**
+ * 资金记录
+ * param int $balance 变动的金额数量,减少时传:-$balance,增加时直接传:$balance
+ * param string $desc 描述
+ * param int $user_id 登录用户id
+ * $type    类型:1=充值,2=支付,3=后台
+ * return int
+ */
+function create_log($balance = 0, $desc = '', $user_id = 0, $type = 0) {
+    $map['id'] = $user_id;
+    $user = Db::name('user');
+    $user_info = $user->where($map)->field('id, money')->find();
+
+    if ($user_info['money'] < 0) {
+        return -3;
+    }
+
+    // 查询log日志
+    $user_account = Db::name('user_money_log');
+    $data = array();
+    $log = array();
+
+    $silver_logs = $user_account->where(['user_id' => $user_id])->order('id desc')->limit(10)->select();
+
+    $all_count = count($silver_logs); //日志记录数量
+
+    if ($all_count < 1) {
+        if ($user_info['money'] > 0) {
+            return -7;
+        }
+    } else {
+        $all_change_silver = array();
+        if ($all_count == 1) {  // 只有一条日志  变动金额=余额
+            if ($silver_logs[0]['after'] != $silver_logs[0]['money']) {
+//                add_error_user($silver_logs[0]['user_id'], 0);
+                return -8;
+            }
+        }
+        $log_count = $all_count - 1;
+        $last_user_silver = '';
+        foreach ($silver_logs as $key => $value) {
+            if ($key == $log_count) {
+                $last_user_silver = $value['after'];
+                break;
+            }
+            $all_change_silver[] = $value['money'];
+        }
+
+        //变动金额+最初余额=最新余额
+//        $new_silver = $last_user_silver + array_sum($all_change_silver); // 最新余额+变动总金额
+//        $silver_difference = abs($new_silver - $silver_logs[0]['user_diamond']);
+
+        $new_silver = $last_user_silver + array_sum($all_change_silver); // 最新余额+变动总金额
+        $silver_difference = abs(number_format($new_silver, 2, '.', '') - number_format($silver_logs[0]['after'], 2, '.', ''));
+//        p($silver_difference);die;
+        if ($silver_difference > 1) {
+//            add_error_user($silver_logs[0]['user_id'], 0);
+            return -9;
+        }
+    }
+
+    $log['user_id'] = $user_id;
+    $log['type'] = $type;
+    $log['money'] = $balance;
+    $log['before'] = $user_info['money'];
+    $log['after'] = $user_info['money'] + $balance;
+    $log['memo'] = $desc;
+    $log['createtime'] = time();
+
+    $data['money'] = $log['after'];
+    if ($data['after'] < 0) {
+        return -12;
+    }
+
+    if ($balance != 0) {
+        $change_result = $user->where($map)->save($data); // 更改用户余额
+        if ($change_result !== false) {
+            $rows = $user_account->add($log);
+            if ($rows > 0) {
+                return 1;
+            } else {
+                return -10;
+            }
+        } else {
+            return -11;
+        }
+    }
+
+    return 1;
 }

+ 2 - 1
extend/wxpay/WxPay.php

@@ -1,5 +1,6 @@
 <?php
 
+namespace wxpay;
 /**
  * 微信插件 使用需 require_once("./Plugins/WxPay/WxPay.php");
  * @author Jack_YanTC <627495692@qq.com>
@@ -17,7 +18,7 @@ class WxPay {
      * @param $options ['notify_url'] 支付宝回调地址
      */
     public function __construct($options = array()) {
-        $this->config = !empty($options) ? $options : C('WxPay');
+        $this->config = !empty($options) ? $options : config('wxchatpay');
     }
 
     /**