Просмотр исходного кода

Merge branch 'master' of ssh://git.9026.com:2212/swdz-WangHaijun/BaoMa

whj 4 лет назад
Родитель
Сommit
83ea19916c

+ 171 - 1
app/Helpers/functions.php

xqd xqd xqd
@@ -8,7 +8,6 @@
 
 use Illuminate\Support\Facades\Log;
 use App\Exceptions\ExitOutException;
-use App\Models\User;
 
 //统一输出格式话的json数据
 if (!function_exists('out')) {
@@ -93,6 +92,21 @@ if (!function_exists('get_distance_field')) {
     }
 }
 
+//获取用户的distance的sql字段
+if (!function_exists('get_user_distance_field')) {
+    function get_user_distance_field($user)
+    {
+        $coordinate = get_user_coordinate($user);
+        $latitude = $coordinate['latitude'];
+        $longitude = $coordinate['longitude'];
+        if (empty($latitude) || empty($longitude)) {
+            return '999999999 distance';
+        }
+
+        return 'if(longitude=0 and latitude=0,999999999,round(6378.138*2*asin(sqrt(pow(sin( (' . $latitude . '*pi()/180-latitude*pi()/180)/2),2)+cos(' . $latitude . '*pi()/180)*cos(latitude*pi()/180)* pow(sin((' . $longitude . '*pi()/180-longitude*pi()/180)/2),2)))*1000)) distance';
+    }
+}
+
 //构建单号
 if (!function_exists('build_sn')) {
     function build_sn($id, $len = 2, $prefix = '')
@@ -172,3 +186,159 @@ if (!function_exists('get_user_distance')) {
         return $data;
     }
 }
+
+//发送短信
+if (!function_exists('send_sms')) {
+    function send_sms($phone, $templateKey, $templateParam = [])
+    {
+        $sms_config = config('config.aly_sms');
+        //是否启用https
+        $security = false;
+        $params = [];
+        $params["PhoneNumbers"] = $phone;
+        $params["SignName"] = $sms_config['sign_name'];
+        $params["TemplateCode"] = $sms_config[$templateKey];
+        $params['TemplateParam'] = $templateParam;
+
+        if (is_array($params["TemplateParam"])) {
+            $params["TemplateParam"] = json_encode($params["TemplateParam"], JSON_UNESCAPED_UNICODE);
+        }
+
+        $content = aly_sm_request(
+            $sms_config['access_key'],
+            $sms_config['access_secret'],
+            "dysmsapi.aliyuncs.com",
+            array_merge($params, array(
+                "RegionId" => "cn-hangzhou",
+                "Action" => "SendSms",
+                "Version" => "2017-05-25",
+            )),
+            $security
+        );
+
+        return $content;
+    }
+}
+
+if (!function_exists('aly_sm_request')) {
+    function aly_sm_request($accessKeyId, $accessKeySecret, $domain, $params, $security = false, $method = 'POST')
+    {
+        $apiParams = array_merge(array(
+            "SignatureMethod" => "HMAC-SHA1",
+            "SignatureNonce" => uniqid(mt_rand(0, 0xffff), true),
+            "SignatureVersion" => "1.0",
+            "AccessKeyId" => $accessKeyId,
+            "Timestamp" => gmdate("Y-m-d\TH:i:s\Z"),
+            "Format" => "JSON",
+        ), $params);
+        ksort($apiParams);
+
+        $sortedQueryStringTmp = "";
+        foreach ($apiParams as $key => $value) {
+            $sortedQueryStringTmp .= "&" . aly_sms_encode($key) . "=" . aly_sms_encode($value);
+        }
+
+        $stringToSign = "${method}&%2F&" . aly_sms_encode(substr($sortedQueryStringTmp, 1));
+
+        $sign = base64_encode(hash_hmac("sha1", $stringToSign, $accessKeySecret . "&", true));
+
+        $signature = aly_sms_encode($sign);
+
+        $url = ($security ? 'https' : 'http') . "://{$domain}/";
+
+        try {
+            $content = aly_sms_fetch_content($url, $method, "Signature={$signature}{$sortedQueryStringTmp}");
+            return json_decode($content);
+        } catch (\Exception $e) {
+            return false;
+        }
+    }
+}
+
+if (!function_exists('aly_sms_encode')) {
+    function aly_sms_encode($str)
+    {
+        $res = urlencode($str);
+        $res = preg_replace("/\+/", "%20", $res);
+        $res = preg_replace("/\*/", "%2A", $res);
+        $res = preg_replace("/%7E/", "~", $res);
+        return $res;
+    }
+}
+
+if (!function_exists('aly_sms_fetch_content')) {
+    function aly_sms_fetch_content($url, $method, $body)
+    {
+        $ch = curl_init();
+
+        if ($method == 'POST') {
+            curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
+            curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
+        } else {
+            $url .= '?' . $body;
+        }
+
+        curl_setopt($ch, CURLOPT_URL, $url);
+        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
+            "x-sdk-client" => "php/2.0.0"
+        ));
+
+        if (substr($url, 0, 5) == 'https') {
+            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
+        }
+
+        $rtn = curl_exec($ch);
+
+        if ($rtn === false) {
+            // 大多由设置等原因引起,一般无法保障后续逻辑正常执行,
+            // 所以这里触发的是E_USER_ERROR,会终止脚本执行,无法被try...catch捕获,需要用户排查环境、网络等故障
+            trigger_error("[CURL_" . curl_errno($ch) . "]: " . curl_error($ch), E_USER_ERROR);
+        }
+        curl_close($ch);
+
+        return $rtn;
+    }
+}
+
+//检测重复请求 超过就禁止访问 有用户flag就针对用户flag 没有flag就针对ip地址(ip的话注意反代情况,可能每个用户请求的ip都是反代服务器的ip,当然可以配置一波反代服务器使得业务服务器获取到真实用户ip) 最小只能设置1s一次请求 不支持1s以下 如果开启了redis可以改写支持毫秒级的方法
+if (!function_exists('check_repeat_request')) {
+    function check_repeat_request($time, $limit, $flag = '')
+    {
+        $action = request()->getPathInfo();
+        if (!empty($flag)){
+            $key = $action.$flag;
+        }
+        else {
+            $ip = request()->ip();
+            $key = $action.$ip;
+        }
+
+        $time = $time < 1 ? 1 : $time;
+        $time = round($time);
+        if (Cache::has($key)){
+            Cache::increment($key);
+            $count = Cache::get($key);
+            if($count > $limit){
+                exit_out(null, 11003, '操作过于频繁,请稍后重试~');
+            }
+        }
+        else {
+            Cache::set($key, 1, $time);
+        }
+
+        return true;
+    }
+}
+
+//随机生成验证码
+if (!function_exists('generate_code')) {
+    function generate_code($length = 6)
+    {
+        $min = pow(10, ($length - 1));
+        $max = pow(10, $length) - 1;
+        return rand($min, $max);
+    }
+}

+ 146 - 2
app/Http/Controllers/Api/V1/CommonController.php

xqd xqd xqd xqd xqd xqd
@@ -9,8 +9,10 @@
 namespace App\Http\Controllers\Api\V1;
 
 use App\Http\Controllers\Controller;
+use App\Models\Area;
 use App\Models\User;
 use EasyWeChat\Factory;
+use Cache;
 
 class CommonController extends Controller
 {
@@ -19,12 +21,27 @@ class CommonController extends Controller
         $req = request()->post();
         $this->validate(request(), [
             'wechat_code' => 'required',
+            'phone|手机号' => 'max:20',
+            'verify_code|验证码' => 'integer',
             'nickname|昵称' => 'max:50',
             'avatar|头像' => 'url',
             'latitude|纬度' => 'numeric',
             'longitude|纬度' => 'numeric',
         ]);
 
+        if (!empty($req['phone'])) {
+            if (empty($req['verify_code'])) {
+                return out(null, 10003, '验证码不能为空');
+            }
+            $verify_code = Cache::get($req['phone'].'-1');
+            if($verify_code != $req['verify_code']){
+                if (env('APP_ENV') == 'online' || $req['verify_code'] != '111111') {
+                    return out(null, 10004, '验证码错误');
+                }
+            }
+            Cache::delete($req['phone'].'-1');
+        }
+
         $app = Factory::miniProgram(config('config.wechat_small_program'));
         $data = $app->auth->session($req['wechat_code']);
         if (empty($data['openid'])){
@@ -40,6 +57,7 @@ class CommonController extends Controller
                 'avatar' => $req['avatar'] ?? '',
                 'latitude' => $req['latitude'] ?? 0,
                 'longitude' => $req['longitude'] ?? 0,
+                'phone' => $req['phone'] ?? '',
                 'session_key' => $session_key
             ]);
         }
@@ -48,13 +66,16 @@ class CommonController extends Controller
                 return out(null, 10002, '该账号已被冻结');
             }
 
-            User::where('id', $user['id'])->update([
+            $update = [
                 'nickname' => $req['nickname'] ?? '',
                 'avatar' => $req['avatar'] ?? '',
                 'latitude' => $req['latitude'] ?? 0,
                 'longitude' => $req['longitude'] ?? 0,
+                'phone' => $req['phone'] ?? '',
                 'session_key' => $session_key
-            ]);
+            ];
+            $update = array_filter($update);
+            User::where('id', $user['id'])->update($update);
         }
 
         $token = aes_encrypt(['id' => $user['id'], 'time' => time()]);
@@ -62,6 +83,63 @@ class CommonController extends Controller
         return out(['token' => $token]);
     }
 
+    public function getPhoneNumber()
+    {
+        $req = request()->post();
+        $this->validate(request(), [
+            'wechat_code' => 'required',
+            'iv' => 'required',
+            'encryptData' => 'required',
+        ]);
+
+        try {
+            $app = Factory::miniProgram(config('config.wechat_small_program'));
+            $data = $app->auth->session($req['wechat_code']);
+            if (empty($data['openid']) || empty($data['session_key'])){
+                return out(null, 10001, '微信code错误');
+            }
+
+            $decryptedData = $app->encryptor->decryptData($data['session_key'], $req['iv'], $req['encryptData']);
+            if (empty($decryptedData['phoneNumber'])) {
+                return out(null, 10002, '授权手机号错误');
+            }
+
+            if (!User::where('openid', $data['openid'])->exists()){
+                User::create([
+                    'openid' => $data['openid'],
+                    'phone' => $decryptedData['phoneNumber'],
+                    'session_key' => $data['session_key']
+                ]);
+            }
+
+        } catch (\Exception $e) {
+            return out(null, 10003, '获取手机号失败', $e->getMessage());
+        }
+
+        return out($decryptedData);
+    }
+
+    public function getUserByCode()
+    {
+        $req = request()->post();
+        $this->validate(request(), [
+            'wechat_code' => 'required',
+        ]);
+
+        $app = Factory::miniProgram(config('config.wechat_small_program'));
+        $data = $app->auth->session($req['wechat_code']);
+        if (empty($data['openid'])){
+            return out(null, 10001, '微信code错误');
+        }
+
+        $user = User::select(['id', 'status', 'phone', 'nickname', 'avatar'])->where('openid', $data['openid'])->first();
+        if (!empty($user) && $user['status'] == 0) {
+            return out(null, 10002, '该账号已被冻结');
+        }
+
+        return out($user);
+    }
+
     public function uploadFile()
     {
         $file = request()->file('file');
@@ -77,7 +155,73 @@ class CommonController extends Controller
 
     public function areaList()
     {
+        $areas = Area::get();
+        $data1 = $data2 = $data3 = [];
+        foreach ($areas as $k => $v) {
+            if ($v['level'] == 1) {
+                $data1[$k]['id'] = $v['id'];
+                $data1[$k]['name'] = $v['name'];
+                $data1[$k]['sub'] = [];
+            }
+            if ($v['level'] == 2) {
+                $arr = [];
+                $arr['id'] = $v['id'];
+                $arr['name'] = $v['name'];
+                //$arr['sub'] = [];
+                $data2[$v['parent_id']][] = $arr;
+            }
+            /*if ($v['level'] == 3) {
+                $arr = [];
+                $arr['id'] = $v['id'];
+                $arr['name'] = $v['name'];
+                $data3[$v['parent_id']][] = $arr;
+            }*/
+        }
+
+        /*foreach ($data2 as $k => $v) {
+            foreach ($v as $k1 => $v1) {
+                $data2[$k][$k1]['sub'] = $data3[$v1['id']]??[];
+            }
+        }*/
+
+        foreach ($data1 as $k => $v) {
+            $data1[$k]['sub'] = $data2[$v['id']]??[];
+        }
+
+        return out($data1);
+    }
+
+    public function sendVerifyCode()
+    {
+        //防止恶意刷验证码接口,一分钟最多10次
+        check_repeat_request(60, 10);
         $req = request()->post();
+        $this->validate(request(), [
+            'type' => 'required|integer',
+            'phone|手机号' => 'required',
+        ]);
+
+        if($req['type'] == 3 || $req['type'] == 4){
+            $user = User::getUserByToken();
+            if ($user['phone'] != $req['phone']){
+                return out(null, 30007, '该手机号不是注册时的手机号');
+            }
+        }
+        if ($req['type'] == 5) {
+            if (User::where('phone', $req['phone'])->exists()) {
+                return out(null, 30008, '此手机号已经被占用');
+            }
+        }
+
+        $verify_code = generate_code();
+        $result = send_sms($req['phone'], 'verify_template_code', ['code' => $verify_code]);
+        if (!$result){
+            return out(null, 30010, '验证码发送失败,请稍后重试');
+        }
+
+        Cache::set($req['phone'].'-'.$req['type'], $verify_code, config('config.aly_sms.sms_verify_code_expire'));
+
+        return out();
     }
 
     public function doc()

+ 36 - 0
app/Http/Controllers/Api/V1/CouponController.php

xqd
@@ -9,12 +9,48 @@
 namespace App\Http\Controllers\Api\V1;
 
 use App\Models\Coupon;
+use App\Models\UserCoupon;
 
 class CouponController extends AuthController
 {
     public function couponList()
     {
         $data = Coupon::orderBy('id', 'desc')->paginate();
+
+        return out($data);
+    }
+
+    public function receiveCoupon()
+    {
+        $req = request()->post();
+        $this->validate(request(), [
+            'coupon_id' => 'required|integer'
+        ]);
+        $user = $this->user;
+
+        if (UserCoupon::where('user_id', $user['id'])->where('coupon_id', $req['coupon_id'])->exists()) {
+            return out(null, 10001, '您已经领取过该优惠券了');
+        }
+
+        $add = Coupon::select(['id as coupon_id', 'name', 'title', 'desc', 'rules', 'icon', 'type', 'usable_type', 'money', 'discount', 'min_consume_amount', 'max_reduce_amount', 'expire_type', 'effective_days', 'start_time', 'end_time'])->where('id', $req['coupon_id'])->first()->toArray();
+        unset($add['is_receive']);
+        $add['user_id'] = $user['id'];
+        $expire_time = $add['end_time'];
+        if ($add['expire_type'] == 1) {
+            $expire_time = time() + $add['effective_days']*24*3600;
+        }
+        $add['expire_time'] = $expire_time;
+        UserCoupon::create($add);
+
+        return out();
+    }
+
+    public function userCouponList()
+    {
+        $user = $this->user;
+
+        $data = UserCoupon::where('user_id', $user['id'])->where('status', 1)->where('expire_time', '>', time())->orderBy('id', 'desc')->paginate();
+
         return out($data);
     }
 }

+ 1 - 2
app/Http/Controllers/Api/V1/DocterController.php

xqd
@@ -32,8 +32,7 @@ class DocterController extends AuthController
         ]);
         $user = $this->user;
 
-        $coordinate = get_user_coordinate($user);
-        $distance_field = get_distance_field($coordinate['latitude'], $coordinate['longitude']);
+        $distance_field = get_user_distance_field($user);
 
         $builder = Docter::with('office', 'qualification')->select(['id', 'type', 'name', 'phone', 'sex', 'birthday', 'avatar', 'status', 'label', 'sign', 'intro', 'office_id', 'qualification_id', 'score', 'service_persons', 'eva_num', 'service_days', 'phone_minutes', 'chat_price', 'phone_price', 'appoint_price', 'is_chat', 'is_phone', 'is_appoint', 'latitude', 'longitude', DB::raw($distance_field)])->where('status', 1);
         $list_type = !empty($req['list_type']) ? $req['list_type'] : 0;

+ 20 - 0
app/Http/Controllers/Api/V1/EvaluateController.php

xqd xqd
@@ -15,7 +15,9 @@ class EvaluateController extends AuthController
     public function evaluateList()
     {
         $user = $this->user;
+
         $data = Evaluate::with('order.docter')->where('user_id', $user['id'])->orderBy('id', 'desc')->paginate();
+
         return out($data);
     }
 
@@ -27,6 +29,24 @@ class EvaluateController extends AuthController
         ]);
 
         $data = Evaluate::with('order.docter')->where('id', $req['evaluate_id'])->first();
+
         return out($data);
     }
+
+    public function sumbitEvaluate()
+    {
+        $req = request()->post();
+        $this->validate(request(), [
+            'order_id' => 'required|integer',
+            'docter_id' => 'required|integer',
+            'score' => 'required|integer',
+            'content' => 'max:500',
+        ]);
+        $user = $this->user;
+
+        $req['user_id'] = $user['id'];
+        Evaluate::create($req);
+
+        return out();
+    }
 }

+ 24 - 10
app/Http/Controllers/Api/V1/OrderController.php

xqd xqd xqd xqd xqd xqd
@@ -40,9 +40,14 @@ class OrderController extends AuthController
             'phone_minutes' => 'required_if:product_type,1|integer',
             'symptoms' => 'required_if:product_type,2|max:2000',
             'medical_imgs' => 'required_if:product_type,2|json|max:3000',
+            'pay_password|支付密码' => 'required_if:payment_type,2|integer',
         ]);
         $user = $this->user;
 
+        if (sha1(md5($req['pay_password'])) !== $user['pay_password']) {
+            return out(null, 10001, '密码错误');
+        }
+
         $discount_amount = 0;
         if (!empty($req['user_coupon_id'])) {
             //计算优惠金额
@@ -162,9 +167,14 @@ class OrderController extends AuthController
             'docter_id' => 'required_if:product_type,3|integer',
             'vaccine_id' => 'required_if:product_type,4|integer',
             'nurse_ids' => 'required_if:product_type,5|json',
+            'pay_password|支付密码' => 'required_if:payment_type,2|integer',
         ]);
         $user = $this->user;
 
+        if (sha1(md5($req['pay_password'])) !== $user['pay_password']) {
+            return out(null, 10001, '密码错误');
+        }
+
         $product_type = $req['product_type'];
 
         if ($req['product_type'] == 4) {
@@ -308,9 +318,14 @@ class OrderController extends AuthController
             'is_security' => 'required|in:0,1',
             'guardian_name' => 'required|max:50',
             'relationship_type' => 'required|integer',
+            'pay_password|支付密码' => 'required_if:payment_type,2|integer',
         ]);
         $user = $this->user;
 
+        if (sha1(md5($req['pay_password'])) !== $user['pay_password']) {
+            return out(null, 10001, '密码错误');
+        }
+
         $discount_amount = 0;
         if (!empty($req['user_coupon_id'])) {
             //计算优惠金额
@@ -358,7 +373,7 @@ class OrderController extends AuthController
             unset($addPatient['age']);
             OrderPatient::create($addPatient);
             //保存订单服务包表
-            $addPack = ServicePack::select(['id as service_pack_id', 'name as pack_name', 'intro as pack_intro', 'price as pack_price', 'team_id', 'phone_minutes', 'chat_num', 'appoint_num', 'vaccine_limit_amount', 'nurses_limit_amount', 'effective_days'])->where('id', $req['service_pack_id'])->first()->toArray();
+            $addPack = ServicePack::select(['id as service_pack_id', 'name as pack_name', 'intro as pack_intro', 'price as pack_price', 'insurance_policy', 'team_id', 'phone_minutes', 'chat_num', 'appoint_num', 'vaccine_limit_amount', 'nurses_limit_amount', 'effective_days'])->where('id', $req['service_pack_id'])->first()->toArray();
             $addPack['order_id'] = $order['id'];
             $addPack['is_security'] = $req['is_security'];
             $addPack['guardian_name'] = $req['guardian_name'];
@@ -420,7 +435,7 @@ class OrderController extends AuthController
     {
         $req = request()->post();
         $this->validate(request(), [
-            'list_type' => 'required|in:1,2,3',
+            'list_type' => 'required|in:0,1,2',
             'product_type' => 'integer',
             'order_status' => 'integer',
             'time_sort' => 'in:0,1'
@@ -432,14 +447,13 @@ class OrderController extends AuthController
             $builder->where('product_type', $req['product_type']);
         }
         else {
-            if ($req['list_type'] == 1) {
-                $builder->whereIn('product_type', [1,2]);
-            }
-            elseif ($req['list_type'] == 2) {
-                $builder->whereIn('product_type', [3,4,5]);
-            }
-            elseif ($req['list_type'] == 3) {
-                $builder->where('product_type', 6);
+            if (!empty($req['list_type'])) {
+                if ($req['list_type'] == 1) {
+                    $builder->whereIn('product_type', [1,2]);
+                }
+                elseif ($req['list_type'] == 2) {
+                    $builder->whereIn('product_type', [3,4,5]);
+                }
             }
         }
         if (!empty($req['order_status'])) {

+ 30 - 0
app/Http/Controllers/Api/V1/OrganizationController.php

xqd
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: zilongs
+ * Date: 20-10-29
+ * Time: 下午3:43
+ */
+
+namespace App\Http\Controllers\Api\V1;
+
+use App\Models\Organization;
+use DB;
+
+class OrganizationController extends AuthController
+{
+    public function organizationList()
+    {
+        $this->validate(request(), [
+            'latitude' => 'numeric',
+            'longitude' => 'numeric',
+        ]);
+        $user = $this->user;
+
+        $distance_field = get_user_distance_field($user);
+
+        $data = Organization::with('docter')->select(['id', 'type', 'name', 'province_id', 'city_id', 'area_id', 'address', 'latitude', 'longitude', DB::raw($distance_field)])->orderBy('distance', 'asc')->paginate();
+
+        return out($data);
+    }
+}

+ 0 - 1
app/Http/Controllers/Api/V1/PayCallbackController.php

xqd
@@ -13,7 +13,6 @@ use App\Models\Docter;
 use App\Models\Order;
 use App\Models\Payment;
 use App\Models\User;
-use App\Models\UserBalanceLog;
 use DB;
 use EasyWeChat\Factory;
 

+ 1 - 1
app/Http/Controllers/Api/V1/ServicePackController.php

xqd
@@ -26,7 +26,7 @@ class ServicePackController extends AuthController
             'service_pack_id' => 'required|integer'
         ]);
 
-        $data = ServicePack::with('team.docter')->where('id', $req['service_pack_id'])->first();
+        $data = ServicePack::with('team.docter.office', 'team.docter.qualification')->where('id', $req['service_pack_id'])->first();
 
         return out($data);
     }

+ 60 - 3
app/Http/Controllers/Api/V1/UserController.php

xqd xqd xqd
@@ -12,7 +12,9 @@ use App\Models\Order;
 use App\Models\User;
 use App\Models\UserBalanceLog;
 use App\Models\UserCoupon;
+use App\Models\UserMessage;
 use EasyWeChat\Factory;
+use Cache;
 
 class UserController extends AuthController
 {
@@ -20,7 +22,7 @@ class UserController extends AuthController
     {
         $user = $this->user;
 
-        unset($user['session_key']);
+        unset($user['session_key'], $user['pay_password']);
 
         $user['coupon_num'] = UserCoupon::where('user_id', $user['id'])->where('status', 1)->where('expire_time', '>', time())->count();
 
@@ -83,12 +85,67 @@ class UserController extends AuthController
         return out($data);
     }
 
-    public function userCouponList()
+    public function updatePayPassword()
     {
+        $req = request()->post();
+        $this->validate(request(), [
+            'verify_code|验证码' => 'required|integer',
+            'pay_password|支付密码' => 'required|integer'
+        ]);
         $user = $this->user;
 
-        $data = UserCoupon::where('user_id', $user['id'])->where('status', 1)->where('expire_time', '>', time())->paginate();
+        $verify_code = Cache::get($user['phone'].'-3');
+        if($verify_code != $req['verify_code']){
+            if (env('APP_ENV') == 'online' || $req['verify_code'] != '111111') {
+                return out(null, 10001, '验证码错误');
+            }
+        }
+        Cache::delete($user['phone'].'-3');
 
+        User::where('id', $user['id'])->update(['pay_password' => sha1(md5($req['pay_password']))]);
+
+        return out();
+    }
+
+    public function userMessageList()
+    {
+        $user = $this->user;
+        $data = UserMessage::where('user_id', $user['id'])->orderBy('id', 'desc')->paginate();
         return out($data);
     }
+
+    public function changeUserPhone()
+    {
+        $req = request()->post();
+        $this->validate(request(), [
+            'old_verify_code' => 'required|integer',
+            'new_verify_code' => 'required|integer',
+            'new_phone' => 'required'
+        ]);
+        $user = $this->user;
+
+        $verify_code = Cache::get($user['phone'].'-4');
+        if($verify_code != $req['old_verify_code']){
+            if (env('APP_ENV') == 'online' || $req['old_verify_code'] != '111111') {
+                return out(null, 10001, '老手机验证码错误');
+            }
+        }
+        Cache::delete($user['phone'].'-4');
+
+        $verify_code = Cache::get($req['new_phone'].'-5');
+        if($verify_code != $req['new_verify_code']){
+            if (env('APP_ENV') == 'online' || $req['new_verify_code'] != '111111') {
+                return out(null, 10002, '新验证码错误');
+            }
+        }
+        Cache::delete($req['new_phone'].'-5');
+
+        if (User::where('phone', $req['new_phone'])->exists()) {
+            return out(null, 30008, '新手机号已经被占用');
+        }
+
+        User::where('id', $user['id'])->update(['phone' => $req['new_phone']]);
+
+        return out();
+    }
 }

+ 1 - 1
app/Http/Controllers/Api/V1/VaccineController.php

xqd
@@ -17,7 +17,7 @@ class VaccineController extends AuthController
         $req = request()->post();
         $this->validate(request(), [
             'name' => 'max:50',
-            'type' => 'in:1,2',
+            'type' => 'in:0,1,2',
             'sort_type' => 'in:1,2',
         ]);
 

+ 12 - 0
app/Models/Coupon.php

xqd
@@ -10,5 +10,17 @@ namespace App\Models;
 
 class Coupon extends BaseModel
 {
+    protected $appends = ['is_receive'];
 
+    public function getIsReceiveAttribute()
+    {
+        $user = User::getUserByToken(false);
+        if (!empty($user)) {
+            if (UserCoupon::where('user_id', $user['id'])->where('coupon_id', $this->id)->exists()) {
+                return 1;
+            }
+        }
+
+        return 0;
+    }
 }

+ 5 - 0
app/Models/Evaluate.php

xqd
@@ -19,4 +19,9 @@ class Evaluate extends BaseModel
     {
         return $this->belongsTo(Order::class);
     }
+
+    public function docter()
+    {
+        return $this->belongsTo(Docter::class);
+    }
 }

+ 27 - 2
app/Models/User.php

xqd xqd xqd
@@ -8,6 +8,8 @@
 
 namespace App\Models;
 
+use DB;
+
 class User extends BaseModel
 {
     public function getCouponNumAttribute()
@@ -16,20 +18,29 @@ class User extends BaseModel
     }
 
     //通过token获取用户信息
-    public static function getUserByToken()
+    public static function getUserByToken($is_exit = true)
     {
         $auth = request()->header('token');
         if (empty($auth)) {
+            if (!$is_exit) {
+                return '';
+            }
             exit_out(null, 401, '认证失效,请重新登录');
         }
 
         $arr = aes_decrypt($auth);
         if (empty($arr['id'])) {
+            if (!$is_exit) {
+                return '';
+            }
             exit_out(null, 401, '认证失效,请重新登录');
         }
 
         $user = User::where('id', $arr['id'])->first();
         if (empty($user)){
+            if (!$is_exit) {
+                return '';
+            }
             exit_out(null, 601, '该账号已被删除');
         }
         $user = $user->toArray();
@@ -46,7 +57,21 @@ class User extends BaseModel
     {
         $user = User::select(['balance'])->where('id', $user_id)->first();
 
-        User::where('id', $user_id)->increment('balance', $change_balance);
+        if ($type == 2) {
+            User::where('id', $user_id)->update([
+                'balance' => DB::raw('balance + '.$change_balance),
+                'topup_balance'  => DB::raw('topup_balance + '.$change_balance),
+            ]);
+        }
+        elseif ($type == 3) {
+            User::where('id', $user_id)->update([
+                'balance' => DB::raw('balance + '.$change_balance),
+                'giving_balance'  => DB::raw('giving_balance + '.$change_balance),
+            ]);
+        }
+        else {
+            User::where('id', $user_id)->increment('balance', $change_balance);
+        }
 
         UserBalanceLog::create([
             'user_id' => $user_id,

+ 14 - 0
app/Models/UserMessage.php

xqd
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: zilongs
+ * Date: 20-10-30
+ * Time: 下午4:43
+ */
+
+namespace App\Models;
+
+class UserMessage extends BaseModel
+{
+
+}

+ 9 - 1
config/config.php

xqd
@@ -20,8 +20,16 @@ return [
         'app_id' => 'wx92066f7587c34617',
         'mch_id' => '1398823402',
         'key' => 'c1891122765718911227657189112276',
-        'notify_url' => env('API_HOST', '').'/api/payCallback/wechatPayNotify'
+        'notify_url' => env('API_HOST', '').'/api/v1/payCallback/wechatPayNotify'
     ],
 
     'product_type_map' => [1 => '电话咨询', 2 => '图文咨询', 3 => '门诊预约', 4 => '疫苗接种预约', 5 => '儿保预约', 6 => '服务包', 7 => '充值'],
+
+    'aly_sms' => [
+        'access_key' => 'LTAI4FgJdnfwsj5Bb6ioWSD9',
+        'access_secret' => 'S4Tp2eNVKHROuNOLjTvAICTnjqXFFR',
+        'sign_name' => '思维定制',
+        'verify_template_code' => 'SMS_185242509',
+        'sms_verify_code_expire' => 360,
+    ],
 ];