jun vor 6 Monaten
Ursprung
Commit
2a5026262d

+ 18 - 0
.gitignore.bat

@@ -0,0 +1,18 @@
+/.idea
+/.vscode
+/.well-known
+/bootstrap/cache/*
+/storage/framework/cache/*
+/storage/framework/sessions/*
+/storage/framework/testing/*
+/storage/framework/views/*
+/elkconf
+/vendor
+*.DS_Store
+*.log
+.env
+.env.backup
+.phpunit.result.cache
+docker-compose.override.yml
+Homestead.json
+Homestead.yaml

+ 1 - 0
app/Facades/Servers/WechatMini/Mini.php

@@ -7,6 +7,7 @@ use Illuminate\Support\Facades\Facade;
  * 
  * @method static string getUrlLink($path,$query='')     获取UrlLink
  * @method static array  getUserPhone($code)        手机号授权
+ * @method static array  jscode2session($code)      用户openid
  * @method static string  getAccessToken()          获取AccessToken
  * @method static mixed  queryUrlLink($urlLink)     查询加密UrlLink
  * 

+ 1 - 1
app/Facades/Servers/WechatMini/MiniPay.php

@@ -20,7 +20,7 @@ class MiniPay extends Facade
      */
     protected static function getFacadeAccessor()
     {
-        return '\App\Servers\WechatMini\MiniPay';
+        return '\App\Servers\WechatMini\Pay';
     }
 }
 

+ 4 - 0
app/Http/Controllers/Api/Orders.php

@@ -12,6 +12,7 @@ use App\Models\OrdersAddr;
 use App\Models\OrdersProduct;
 use App\Models\ShopCart;
 use Illuminate\Support\Facades\DB;
+use Kra8\Snowflake\Snowflake;
 
 /**
  * 订单接口
@@ -55,6 +56,8 @@ class Orders extends Api{
 		$orderProduct					= [];
 		// 产品价格同级,用于优惠券计算
 		$productPrice					= [];
+        $Snowflake = new Snowflake();
+        $SnowflakeId = $Snowflake->next();
 		// 循环处理购买信息
 		foreach ($buyList as $buyInfo) 	{
 			// 如果产品不存在
@@ -178,6 +181,7 @@ class Orders extends Api{
 				$productList			= array_values($order['product_list']);
 				// 删除非必要数据
 				unset($order['product_list']);
+                $order['snowflake_id'] = $SnowflakeId;
 				// 创建总订单
 				$orderId				= $Model->add($order);
 				// 如果订单写入失败	

+ 12 - 4
app/Http/Controllers/Api/Wechat.php

@@ -17,14 +17,16 @@ class Wechat extends Api{
 	 * 小程序手机号授权				/api/wechat/phone_number
 	 * 
 	 * @param	string		$code		授权码
-	 * 
+	 * @param	string		$openid		微信openid
+	 *
 	 * */
 	public function phone_number(Custom $Custom){
 		// 接口验签
 		// $this->verify_sign();
 		// 接收参数
 		$code									= request('code','');
-		// 授权结果
+		$openid									= request('openid','');
+		// 授权手机号结果
 		$result									= Mini::getUserPhone($code);
 		// 如果所需字段不存在
 		if( isset($result['error']) ) 			return json_send(['code'=>'error','msg'=>'授权失败','data'=>['error'=>$result['error']]]);
@@ -39,7 +41,7 @@ class Wechat extends Api{
 		// 如果没有ID
 		if( empty($custom['uid']) )				{
 			// 注册账号
-			$custom['uid'] 						= $Custom->add(['phone'=>$phone,'username'=>hide_phone($phone)]);
+			$custom['uid'] 						= $Custom->add(['phone'=>$phone,'username'=>hide_phone($phone),'openid'=>$openid]);
 			// 注册失败
 			if( empty($custom['uid']) )			return json_send(['code'=>'error','msg'=>'注册失败,请重试','data'=>['error'=>'注册失败,请重试']]);
 		}
@@ -48,6 +50,12 @@ class Wechat extends Api{
 		// 返回结果
 		return									json_send(['code'=>'success','msg'=>'登录成功','data'=>$token]);
 	}
-
+    public function jscode2session(Custom $Custom)
+    {
+        $code									= request('code','');
+        // 授权手机号结果
+        $result									= Mini::jscode2session($code);
+        return json_send(['code'=>'success','msg'=>'获取openid成功','data'=>$result['openid']]);
+    }
 
 }

+ 73 - 33
app/Http/Controllers/Api/WechatPay.php

@@ -3,14 +3,18 @@
 use App\Http\Controllers\Api\Api;
 use App\Models\Custom;
 use App\Models\Orders;
-use App\Facades\Servers\WechatMini\MiniPay;
+use App\Facades\Servers\Logs\Log;
 use EasyWeChat\Factory;
 use Illuminate\Http\Request;
+use App\Servers\WechatPay\Payment;
+use WeChatPay\Formatter;
+use WeChatPay\Crypto\AesGcm;
+use WeChatPay\Crypto\Rsa;
 
 /**
- * 微信接口
+ * 微信支付接口
  * 
- * @author 刘相欣
+ * @author JUN
  * 
  * */
 class WechatPay extends Api{
@@ -18,45 +22,81 @@ class WechatPay extends Api{
      * 小程序微信支付下单				/api/wechat_pay/unifiedorder
      *
      * */
-    public function unifiedorder($request)
+    public function unifiedorder()
     {
-        $data = [];
-        $result = MiniPay::unifiedOrder($data);
-        return $result;
+        // 检查登录
+        $uid				= $this->checkLogin();
+        $openid				= request('openid','');
+        $orderId			= request('order_id','');
+        $snowflakeId		= request('snowflake_id','');
+        $orderInfo          = Orders::query()->where('id',$orderId)->get();
+        if (empty($orderInfo))
+            return		json_send(['code'=>'error','msg'=>'订单不存在','data'=>['id'=>null]]);
+        if ($orderInfo['custom_uid'] != $uid)
+            return		json_send(['code'=>'error','msg'=>'订单已支付或取消','data'=>['id'=>null]]);
+        if ($orderInfo['status'] != 1)
+            return		json_send(['code'=>'error','msg'=>'订单已支付或取消','data'=>['id'=>null]]);
+
+        $payment = new Payment();
+        return $payment->pay(['out_trade_no' => $orderInfo['snowflake_id'],'openid' => $openid,'description' => '开邻智教','total_price' => $orderInfo['pay_total']]);
     }
 	
 	/**
 	 * 小程序微信支付回调				/api/wechat_pay/notify
 	 * 
 	 * */
-    public function notify($request)
+    public function notify()
     {
-        $app				= Factory::payment(config('wechat.mini_pay'));
-        $response = $app->handlePaidNotify(function ($message, $fail) {
-            // 支付成功的处理逻辑
-            $order = Orders::query()->where('out_trade_no','=',$message['out_trade_no'])->first();
-            // 如果订单不存在
-            if (!$order) {
-                return true;
-            }
-            $data = [];
-            if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
-                // 用户是否支付成功
-                if ($message['result_code'] === 'SUCCESS') {
-                    $order->paid_at = time(); // 更新支付时间为当前时间
-                    $order->status = 'paid';
-
-                    // 用户支付失败
-                } elseif ($message['result_code']=== 'FAIL') {
-                    $order->status = 'paid_fail';
-                }
-            } else {
-                return $fail('通信失败,请稍后再通知我');
+        $post_data = request();
+        Log::log('notify_wechat_pay', 'post_data:' . $post_data);
+        //获取headers参数
+        $headers = request()->header();
+        Log::log('notify_wechat_pay', '微信支付回调返回headers参数:' . json_encode($headers));
+
+        $inWechatpaySignature = $headers['wechatpay-signature'];
+        $inWechatpayTimestamp = $headers['wechatpay-timestamp'];
+        $inWechatpaySerial = $headers['wechatpay-serial'];
+        $inWechatpayNonce = $headers['wechatpay-nonce'];
+        $inBody = $post_data;
+
+        $apiv3Key = Config('wechat.APIV3');// 在商户平台上设置的APIv3密钥
+        // 根据通知的平台证书序列号,查询本地平台证书文件,
+        $platformCertificateFilePath = Config('wechat.platformCertificate');
+        $platformPublicKeyInstance = Rsa::from($platformCertificateFilePath, Rsa::KEY_TYPE_PUBLIC);
+
+        // 检查通知时间偏移量,允许5分钟之内的偏移
+        $timeOffsetStatus = 300 >= abs(Formatter::timestamp() - (int)$inWechatpayTimestamp);
+        Log::log('notify_wechat_pay', '时间偏移量:' . $timeOffsetStatus);
+        $verifiedStatus = Rsa::verify(
+        // 构造验签名串
+            Formatter::joinedByLineFeed($inWechatpayTimestamp, $inWechatpayNonce, $inBody),
+            $inWechatpaySignature,
+            $platformPublicKeyInstance
+        );
+        Log::log('notify_wechat_pay', '验签:' . $verifiedStatus);
+        $orderService = new OrderService();
+        if ($timeOffsetStatus && $verifiedStatus) {
+            // 转换通知的JSON文本消息为PHP Array数组
+            $inBodyArray = (array)json_decode($inBody, true);
+            // 使用PHP7的数据解构语法,从Array中解构并赋值变量
+            ['resource' => [
+                'ciphertext' => $ciphertext,
+                'nonce' => $nonce,
+                'associated_data' => $aad
+            ]] = $inBodyArray;
+            // 加密文本消息解密
+            $inBodyResource = AesGcm::decrypt($ciphertext, $apiv3Key, $nonce, $aad);
+            // 把解密后的文本转换为PHP Array数组
+            $inBodyResourceArray = (array)json_decode($inBodyResource, true);
+            Log::log('notify_wechat_pay', '打印解密后的结果:' . json_encode($inBodyResourceArray));
+            Log::log('notify_wechat_pay', '参数:' . $inBodyResourceArray['trade_state'] . '订单号' . $inBodyResourceArray['out_trade_no'] . '微信支付号' . $inBodyResourceArray['transaction_id']);
+            if ($inBodyResourceArray['trade_state'] == "SUCCESS") {
+                Log::log('notify_wechat_pay', '通知订单');
+                $res = $orderService->payCallback($inBodyResourceArray['out_trade_no'], $inBodyResourceArray['transaction_id']);
+                Log::log('notify_wechat_pay', '通知返回' . json_encode($res));
+
             }
-            $fail('Order not exists.');
-            return true; // 返回 true 表示处理成功
-        });
-        return $response;
+        }
     }
 
 

+ 13 - 1
app/Servers/WechatMini/Mini.php

@@ -82,5 +82,17 @@ class Mini
 		// 获取不包含区号的手机号(因为绑定手机号字段会有国际区号)
 		return                                  ['error'=>$result['errcode'].'=>'.$result['errmsg']];
     }
-
+    /**
+     * 获取用户openid
+     * @param  string   $code           授权码
+     *
+     */
+    public function jscode2session($code){
+        // 获取手机号
+        $result							    = $this->mp->auth->session($code);
+        // 判断结果
+        if( !empty($result['errcode']) )    return ['error'=>$result['errcode'].'=>'.$result['errmsg']];
+        // 获取不包含区号的手机号(因为绑定手机号字段会有国际区号)
+        return                              $result;
+    }
 }

+ 1 - 6
app/Servers/WechatMini/MiniPay.php

@@ -20,12 +20,7 @@ class MiniPay
      */
     public function unifiedOrder($request)
     {
-        $result = $this->payment->order->unify([
-            'body' => $request->get('body'), // 商品描述
-            'out_trade_no' => $request->get('out_trade_no'), // 商户订单号
-            'total_fee' => $request->get('total_fee'), // 订单金额
-            'notify_url' => $request->get('notify_url'), // 支付结果通知地址
-        ]);
+        $result = $this->payment->order->unify($request);
 
         if ($result['return_code'] === 'SUCCESS' && !isset($result['err_code'])) {
             $prepayId = $result['prepay_id'];

+ 156 - 0
app/Servers/WechatPay/Payment.php

@@ -0,0 +1,156 @@
+<?php   namespace App\Servers\WechatPay;
+
+use DateTime;
+use DateTimeZone;
+use App\Facades\Servers\Logs\Log;
+use WeChatPay\Builder;
+use WeChatPay\Crypto\Rsa;
+use WeChatPay\Util\PemUtil;
+use WeChatPay\Formatter;
+
+class Payment
+{
+    private $appid;
+    private $mchid;
+    private $instance;
+    private $merchantPrivateKeyInstance;
+    private $merchantCertificateSerial;
+
+    function __construct()
+    {
+        // 从本地文件中加载「商户API私钥」,「商户API私钥」会用来生成请求的签名
+        $merchantPrivateKeyFilePath = Config('wechat.pay.key');
+        $merchantPrivateKeyInstance = Rsa::from($merchantPrivateKeyFilePath, Rsa::KEY_TYPE_PRIVATE);
+        // 「商户API证书」的「证书序列号」
+        // 从本地文件中加载「微信支付平台证书」,用来验证微信支付应答的签名
+        $platformCertificateFilePath = Config('wechat.platformCertificate');
+        $platformPublicKeyInstance = Rsa::from($platformCertificateFilePath, Rsa::KEY_TYPE_PUBLIC);
+        // 从「微信支付平台证书」中获取「证书序列号」
+        $platformCertificateSerial = PemUtil::parseCertificateSerialNo($platformCertificateFilePath);
+        // 构造一个 APIv3 客户端实例
+        $instance = Builder::factory([
+            'mchid'      => Config('wechat.pay.mch_id'),
+            'serial'     => Config('wechat.pay.certificate'),
+            'privateKey' => $merchantPrivateKeyInstance,
+            'certs'      => [
+                $platformCertificateSerial => $platformPublicKeyInstance,
+            ],
+        ]);
+        $this->instance   = $instance;
+        $this->appid   = Config('wechat.pay.appid');
+        $this->mchid   = Config('wechat.pay.mch_id');
+        $this->merchantPrivateKeyInstance   = $merchantPrivateKeyInstance;
+        $this->merchantCertificateSerial   = Config('wechat.pay.certificate');
+        return;
+    }
+    /**
+     * 拉起小程序支付
+     */
+    public function pay($params)
+    {
+        $notify_url = Config('wechat.pay.notify_url');
+
+        //调用微信JSAPI下单获取预支付交易会话标识
+        try {
+            $resp = $this->instance
+                ->chain('v3/pay/transactions/jsapi')
+                ->post(['json' => [
+                    'mchid'        => $this->mchid,
+                    'out_trade_no' => $params['out_trade_no'],
+                    'appid'        => $this->appid,
+                    'description'  => $params['description'],
+                    'time_expire'  => $this->timestampToRfc3339(time() + env('ORDER_OUT_TIME')*60),
+                    'notify_url'   => $notify_url,
+                    'amount'       => [
+                        'total'    => $params['total_price'],
+                        'currency' => 'CNY'
+                    ],
+                    'payer'        => [
+                        'openid'   => $params['openid']
+                    ]
+                ]]);
+            $result = json_decode($resp->getBody(),true);
+            $prepay_id = $result['prepay_id'];
+        } catch (\Exception $e) {
+            if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
+                $r = $e->getResponse();
+                // 记录错误信息
+                Log::error('wechat/Payment','拉起小程序支付,出现错误'.$r->getBody().'参数'.json_encode($params));
+            }
+            return response()->json(['error' => '拉起支付失败'], 500);
+        }
+        //根据返回的预支付交易会话标识,组装调起小程序支付参数
+        $data = [
+            'appId'     => $this->appid,
+            'timeStamp' => (string)Formatter::timestamp(),
+            'nonceStr'  => Formatter::nonce(),
+            'package'   => 'prepay_id='.$prepay_id,
+        ];
+        $data += ['paySign' => Rsa::sign(
+            Formatter::joinedByLineFeed(...array_values($data)),
+            $this->merchantPrivateKeyInstance
+        ), 'signType' => 'RSA'];
+        return response()->json($data);
+    }
+
+    //查询订单
+    public function query($params)
+    {
+        try {
+            $promise = $this->instance
+                ->chain('v3/pay/transactions/id/'.$params[''])
+                ->get(['json' => [
+                    'mchid'        => $this->mchid,
+                ]]);
+        } catch (\Exception $e) {
+            if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
+                $r = $e->getResponse();
+                // 记录错误信息
+                Log::error('wechat/Payment','查询订单,出现错误'.$r->getBody().'参数'.json_encode($params));
+            }
+            return response()->json(['error' => '查询订单支付失败'], 500);
+        }
+        return response()->json($promise);
+    }
+
+    /**
+     * 订单微信退款
+     */
+    public function refund($params)
+    {
+        $notify_url = Config('wechat.course_refund_notify_url');
+        try {
+            $resp = $this->instance
+                ->chain('v3/refund/domestic/refunds')
+                ->post(['json' => [
+                    'transaction_id'  => $params['transaction_id'],
+                    'out_refund_no'   => $params['out_refund_no'],
+                    'reason'          => $params['reason'] ?? '',
+                    'notify_url'      => $notify_url,
+                    'amount'          => [
+                        'refund'      => $params['refund'],
+                        'total'       => $params['total'],
+                        'currency'    => 'CNY'
+                    ],
+                ]]);
+        } catch (\Exception $e) {
+            if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
+                $r = $e->getResponse();
+                Log::error('wechat/Payment','订单微信退款,出现错误'.$r->getBody());
+            }
+            return response()->json(['error' => '订单微信退款失败'], 500);
+        }
+        return response()->json($resp);
+    }
+    //Rfc3339时间日期格式
+    public function timestampToRfc3339($timestamp)
+    {
+        // 转换为DateTime对象
+        $dateTime = new DateTime();
+        $dateTime->setTimestamp($timestamp);
+        // 设置时区,默认为UTC
+        $dateTime->setTimezone(new DateTimeZone('UTC'));
+        // 格式化为RFC3339
+        return $dateTime->format(DateTime::RFC3339);
+    }
+}

+ 8 - 1
composer.json

@@ -12,6 +12,7 @@
         "guzzlehttp/guzzle": "^7.0.1",
         "intervention/image": "^2.5",
         "ixudra/curl": "^6.21",
+        "kra8/laravel-snowflake": "2.1.0",
         "laravel/framework": "^8.12",
         "laravel/tinker": "^2.5",
         "overtrue/qcloud-cos-client": "^1.0",
@@ -72,5 +73,11 @@
         }
     },
     "minimum-stability": "dev",
-    "prefer-stable": true
+    "prefer-stable": true,
+    "repositories": {
+        "packagist": {
+            "type": "composer",
+            "url": "https://mirrors.aliyun.com/composer/"
+        }
+    }
 }

+ 69 - 4
composer.lock

@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "96a63dd17e9e451d6b3fa27d2502abc0",
+    "content-hash": "6876cbd426750d180b48dd2ed79c8230",
     "packages": [
         {
             "name": "asm89/stack-cors",
@@ -1729,6 +1729,71 @@
             },
             "time": "2022-07-31T09:58:52+00:00"
         },
+        {
+            "name": "kra8/laravel-snowflake",
+            "version": "v2.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/kra8/laravel-snowflake.git",
+                "reference": "c56250c9e5b75eb26864f298039a74720b2ab1ed"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/kra8/laravel-snowflake/zipball/c56250c9e5b75eb26864f298039a74720b2ab1ed",
+                "reference": "c56250c9e5b75eb26864f298039a74720b2ab1ed",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "illuminate/support": "^6.3|^7.0|^8.0|^9.0",
+                "php": "^7.2.5|^8.0"
+            },
+            "require-dev": {
+                "orchestra/testbench": "^5.0|^6.0|^7.0",
+                "phpunit/phpunit": "^8.5.8|^9.3.3"
+            },
+            "type": "library",
+            "extra": {
+                "laravel": {
+                    "providers": [
+                        "Kra8\\Snowflake\\Providers\\LaravelServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Kra8\\Snowflake\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Koki Asai",
+                    "email": "me@kra.dev"
+                }
+            ],
+            "description": "Snowflake for Laravel and Lumen.",
+            "homepage": "https://github.com/kra8/laravel-snowflake",
+            "keywords": [
+                "laravel",
+                "lumen",
+                "php",
+                "snowflake"
+            ],
+            "support": {
+                "issues": "https://github.com/kra8/laravel-snowflake/issues",
+                "source": "https://github.com/kra8/laravel-snowflake/tree/v2.1.0"
+            },
+            "time": "2022-02-28T04:04:37+00:00"
+        },
         {
             "name": "laravel/framework",
             "version": "v8.83.27",
@@ -10406,12 +10471,12 @@
     ],
     "aliases": [],
     "minimum-stability": "dev",
-    "stability-flags": [],
+    "stability-flags": {},
     "prefer-stable": true,
     "prefer-lowest": false,
     "platform": {
         "php": "^7.3|^8.0"
     },
-    "platform-dev": [],
-    "plugin-api-version": "2.3.0"
+    "platform-dev": {},
+    "plugin-api-version": "2.6.0"
 }

+ 1 - 0
config/app.php

@@ -159,6 +159,7 @@ return [
         Illuminate\Translation\TranslationServiceProvider::class,
         Illuminate\Validation\ValidationServiceProvider::class,
         Illuminate\View\ViewServiceProvider::class,
+        Kra8\Snowflake\Providers\LaravelServiceProvider::class,
 
         /*
          * Package Service Providers...

+ 5 - 5
config/wechat.php

@@ -21,10 +21,10 @@ return [
         'token' => env('WECHAT_WORK_TOKEN', 'Efd61RPH3GzEwfEATRwdJVKhi'),
         'aes_key' => env('WECHAT_WORK_ENCODING_AES_KEY', 'XL1brptJzQeDMwp5nvuojb8YEDx9GXy9kxaQ8JQl2Zu'),
     ],
-    'mini_pay'=>[
-        'app_id' => 'wxfa381386497cd3b9',
-        'mch_id'             => 'your-mch-id',
-        'key'                => 'key-for-signature',   // API v2 密钥 (注意: 是v2密钥 是v2密钥 是v2密钥)
-        'notify_url'         => '默认的订单回调地址',
+    'pay'=>[
+        'app_id' => 'wxe270937ea4d7f7d5',
+        'mch_id'             => '1612111355',
+        'key'                => 'XgdyHUHDznKNJEYzPCcQe6AMfV6ZGOT2',   // API v2 密钥 (注意: 是v2密钥 是v2密钥 是v2密钥)
+        'notify_url'         => env('APP_HOST').'/api/wechat/pay/notify',
     ],
 ];

+ 8 - 5
routes/api.php

@@ -19,6 +19,9 @@ Route::any('test/sync_user',[\App\Http\Controllers\Api\Test::class,'sync_user'])
 // 小程序手机号授权登录
 Route::any('wechat/phone_number',[\App\Http\Controllers\Api\Wechat::class,'phone_number']);
 
+// 小程序openid
+Route::any('wechat/jscode2session',[\App\Http\Controllers\Api\Wechat::class,'jscode2session']);
+
 // 客户信息
 Route::any('custom/get_info',[\App\Http\Controllers\Api\Custom::class,'get_info']);
 
@@ -113,15 +116,15 @@ Route::any('custom/set_city',[\App\Http\Controllers\Api\Custom::class,'set_city'
 Route::any('banner/get_list',[\App\Http\Controllers\Api\Banner::class,'get_list']);
 
 // 上课列表
-Route::any('course/get_list',[\App\Http\Controllers\Api\course::class,'get_list']);
+Route::any('course/get_list',[\App\Http\Controllers\Api\Course::class,'get_list']);
 //预约上课
-Route::any('course/reservation',[\App\Http\Controllers\Api\course::class,'reservation']);
+Route::any('course/reservation',[\App\Http\Controllers\Api\Course::class,'reservation']);
 //课程排课表
-Route::any('course/get_schedule_list',[\App\Http\Controllers\Api\course::class,'get_schedule_list']);
+Route::any('course/get_schedule_list',[\App\Http\Controllers\Api\Course::class,'get_schedule_list']);
 //我的预约列表
-Route::any('course/reservation_list',[\App\Http\Controllers\Api\course::class,'reservation_list']);
+Route::any('course/reservation_list',[\App\Http\Controllers\Api\Course::class,'reservation_list']);
 //取消预约
-Route::any('course/cancel_reservation',[\App\Http\Controllers\Api\course::class,'cancel_reservation']);
+Route::any('course/cancel_reservation',[\App\Http\Controllers\Api\Course::class,'cancel_reservation']);
 
 // 微信支付回调
 Route::any('wechat_pay/notify',[\App\Http\Controllers\Api\WechatPay::class,'notify']);