瀏覽代碼

支付功能

jun 6 月之前
父節點
當前提交
f74908fc18

+ 6 - 1
app/Http/Controllers/Api/Orders.php

@@ -228,8 +228,13 @@ class Orders extends Api{
 			}
 			// 提交数据
 			DB::commit();
+            $data = [
+                'order_id'      =>$orderId,
+                'pay_total'     =>$order['pay_total'],
+                'snowflake_id'  =>$order['snowflake_id'],
+            ];
 			// 返回结果
-			return						json_send(['code'=>'success','msg'=>'下单成功','data'=>['id'=>null]]);
+			return						json_send(['code'=>'success','msg'=>'下单成功','data'=>$data]);
 			// 返回结果
 		} catch (\Throwable $th) {
 			// 回退数据

+ 2 - 1
app/Http/Controllers/Api/Wechat.php

@@ -50,11 +50,12 @@ class Wechat extends Api{
 		// 返回结果
 		return									json_send(['code'=>'success','msg'=>'登录成功','data'=>$token]);
 	}
-    public function jscode2session(Custom $Custom)
+    public function jscode2session()
     {
         $code									= request('code','');
         // 授权手机号结果
         $result									= Mini::jscode2session($code);
+        if (!$result['openid']) return json_send(['code'=>'error','msg'=>'获取openid失败','data'=>$result['error']]);
         return json_send(['code'=>'success','msg'=>'获取openid成功','data'=>$result['openid']]);
     }
 

+ 12 - 9
app/Http/Controllers/Api/WechatPay.php

@@ -7,6 +7,7 @@ use App\Facades\Servers\Logs\Log;
 use EasyWeChat\Factory;
 use Illuminate\Http\Request;
 use App\Servers\WechatPay\Payment;
+use App\Facades\Servers\WechatMini\Mini;
 use WeChatPay\Formatter;
 use WeChatPay\Crypto\AesGcm;
 use WeChatPay\Crypto\Rsa;
@@ -19,33 +20,35 @@ use WeChatPay\Crypto\Rsa;
  * */
 class WechatPay extends Api{
     /**
-     * 小程序微信支付下单				/api/wechat_pay/unifiedorder
+     * 小程序微信支付下单				/api/wechat_pay/pay
      *
      * */
-    public function unifiedorder()
+    public function pay(Custom $Custom)
     {
         // 检查登录
         $uid				= $this->checkLogin();
-        $openid				= request('openid','');
+        $code				= request('code','');
         $orderId			= request('order_id','');
-        $snowflakeId		= request('snowflake_id','');
-        $orderInfo          = Orders::query()->where('id',$orderId)->get();
+        $orderInfo          = Orders::query()->where('id','=',$orderId)->first()->toArray();
         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]]);
+            return		json_send(['code'=>'error','msg'=>'无权操作','data'=>['id'=>null]]);
         if ($orderInfo['status'] != 1)
             return		json_send(['code'=>'error','msg'=>'订单已支付或取消','data'=>['id'=>null]]);
-
+        //获取openid
+        $result			= Mini::jscode2session($code);
+        if (!$result['openid']) return json_send(['code'=>'error','msg'=>'获取openid失败','data'=>$result['error']]);
+        $openid = $result['openid'];
         $payment = new Payment();
-        return $payment->pay(['out_trade_no' => $orderInfo['snowflake_id'],'openid' => $openid,'description' => '开邻智教','total_price' => $orderInfo['pay_total']]);
+        return $payment->pay(['out_trade_no' => $orderInfo['snowflake_id'],'openid' => $openid,'description' => '开邻智教课程','total_price' => $orderInfo['pay_total']]);
     }
 	
 	/**
 	 * 小程序微信支付回调				/api/wechat_pay/notify
 	 * 
 	 * */
-    public function notify()
+    public function notify(Custom $Custom)
     {
         $post_data = request();
         Log::log('notify_wechat_pay', 'post_data:' . $post_data);

+ 29 - 22
app/Servers/WechatPay/Payment.php

@@ -19,28 +19,35 @@ class Payment
     function __construct()
     {
         // 从本地文件中加载「商户API私钥」,「商户API私钥」会用来生成请求的签名
-        $merchantPrivateKeyFilePath = Config('wechat.pay.key');
+        //$merchantPrivateKeyFilePath = Config('wechatpay.private_key');
+        $merchantPrivateKeyFilePath = 'file://D:\phpstudy_pro\WWW\mall\kailin\resources\1612111355_20241118_cert\apiclient_key.pem';
         $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);
+        $merchantCertificateSerial = '4A5F7CFCC3280CF8C09735D5FC2DEFBC9CCD6F46';
+
+        // 从本地文件中加载「微信支付平台证书」或者「微信支付平台公钥」,用来验证微信支付应答的签名
+        $platformCertificateOrPublicKeyFilePath = Config('wechatpay.platformCertificate');
+        $platformPublicKeyInstance =    Rsa::from($platformCertificateOrPublicKeyFilePath, Rsa::KEY_TYPE_PUBLIC);
+
+        // 「微信支付平台证书」的「证书序列号」或者是「微信支付平台公钥ID」
+        // 「平台证书序列号」及/或「平台公钥ID」可以从 商户平台 -> 账户中心 -> API安全 直接查询到
+        $platformCertificateSerialOrPublicKeyId = 'PUB_KEY_ID_0116121113552024111800218500000334';
+
         // 构造一个 APIv3 客户端实例
         $instance = Builder::factory([
-            'mchid'      => Config('wechat.pay.mch_id'),
-            'serial'     => Config('wechat.pay.certificate'),
+            'mchid'      => Config('wechatpay.mchid'),
+            'serial'     => $merchantCertificateSerial,
             'privateKey' => $merchantPrivateKeyInstance,
             'certs'      => [
-                $platformCertificateSerial => $platformPublicKeyInstance,
+                $platformCertificateSerialOrPublicKeyId => $platformPublicKeyInstance,
             ],
         ]);
         $this->instance   = $instance;
-        $this->appid   = Config('wechat.pay.appid');
-        $this->mchid   = Config('wechat.pay.mch_id');
+        $this->appid   = Config('wechatpay.appid');
+        $this->mchid   = Config('wechatpay.mchid');
         $this->merchantPrivateKeyInstance   = $merchantPrivateKeyInstance;
-        $this->merchantCertificateSerial   = Config('wechat.pay.certificate');
+        $this->merchantCertificateSerial   = Config('wechat.certificate');
         return;
     }
     /**
@@ -48,21 +55,21 @@ class Payment
      */
     public function pay($params)
     {
-        $notify_url = Config('wechat.pay.notify_url');
-
+        $notify_url = Config('wechatpay.notify_url');
         //调用微信JSAPI下单获取预支付交易会话标识
-        try {
+        //try {
             $resp = $this->instance
                 ->chain('v3/pay/transactions/jsapi')
                 ->post(['json' => [
                     'mchid'        => $this->mchid,
-                    'out_trade_no' => $params['out_trade_no'],
+                    'out_trade_no' => (string)$params['out_trade_no'],
                     'appid'        => $this->appid,
                     'description'  => $params['description'],
-                    'time_expire'  => $this->timestampToRfc3339(time() + env('ORDER_OUT_TIME')*60),
-                    'notify_url'   => $notify_url,
+                    /*'time_expire'  => $this->timestampToRfc3339(time() + env('ORDER_OUT_TIME')*60),*/
+                    'notify_url'   => env('APP_URL').'/api/wechat_pay/notify',
                     'amount'       => [
-                        'total'    => $params['total_price'],
+                        'total'    => 1,
+                        //'total'    => $params['total_price'],
                         'currency' => 'CNY'
                     ],
                     'payer'        => [
@@ -71,14 +78,14 @@ class Payment
                 ]]);
             $result = json_decode($resp->getBody(),true);
             $prepay_id = $result['prepay_id'];
-        } catch (\Exception $e) {
+        /*} 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,
@@ -90,7 +97,7 @@ class Payment
             Formatter::joinedByLineFeed(...array_values($data)),
             $this->merchantPrivateKeyInstance
         ), 'signType' => 'RSA'];
-        return response()->json($data);
+        return json_send(['code'=>'success','msg'=>'成功','data'=>$data]);
     }
 
     //查询订单

+ 2 - 1
composer.json

@@ -22,7 +22,8 @@
         "vinkla/hashids": "^9.1",
         "w7corp/easywechat": "^5.35",
         "wantp/snowflake": "^1.2",
-        "wechatpay/wechatpay": "^1.4"
+        "wechatpay/wechatpay": "^1.4",
+        "wechatpay/wechatpay-guzzle-middleware": "^0.2.2"
     },
     "require-dev": {
         "facade/ignition": "^2.5",

+ 56 - 1
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": "6876cbd426750d180b48dd2ed79c8230",
+    "content-hash": "042c9292d792206e5b9c46809e528e73",
     "packages": [
         {
             "name": "asm89/stack-cors",
@@ -7955,6 +7955,61 @@
                 "source": "https://github.com/wechatpay-apiv3/wechatpay-php/tree/v1.4.10"
             },
             "time": "2024-09-19T04:22:06+00:00"
+        },
+        {
+            "name": "wechatpay/wechatpay-guzzle-middleware",
+            "version": "0.2.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/wechatpay-apiv3/wechatpay-guzzle-middleware.git",
+                "reference": "6782ac33ed8cf97628609a71cdc5e84a6a40677a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/wechatpay-apiv3/wechatpay-guzzle-middleware/zipball/6782ac33ed8cf97628609a71cdc5e84a6a40677a",
+                "reference": "6782ac33ed8cf97628609a71cdc5e84a6a40677a",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-openssl": "*",
+                "php": ">=5.5"
+            },
+            "require-dev": {
+                "guzzlehttp/guzzle": "^6.3"
+            },
+            "suggest": {
+                "ext-bcmath": "Require bcmath in php 5.* version.",
+                "guzzlehttp/guzzle": "For using wechatpay guzzle middleware."
+            },
+            "bin": [
+                "tool/CertificateDownloader.php"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "WechatPay\\GuzzleMiddleware\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "description": "WechatPay API V3 Guzzle Middleware",
+            "homepage": "https://wechatpay-api.gitbook.io/wechatpay-api-v3/",
+            "keywords": [
+                "wechatpay"
+            ],
+            "support": {
+                "issues": "https://github.com/wechatpay-apiv3/wechatpay-guzzle-middleware/issues",
+                "source": "https://github.com/wechatpay-apiv3/wechatpay-guzzle-middleware/tree/v0.2.2"
+            },
+            "time": "2021-03-05T03:09:29+00:00"
         }
     ],
     "packages-dev": [

+ 2 - 8
config/wechat.php

@@ -2,8 +2,8 @@
 
 return [
     'mini'=>[
-        'app_id' => 'wxfa381386497cd3b9',
-        'secret' => 'a95b641bfd35ddc42d2e00a6f7f88370',
+        'app_id' => 'wxe270937ea4d7f7d5',
+        'secret' => 'af6899e266636c46e2d5ac7b3c4387d5',
         // 下面为可选项
         // 指定 API 调用返回结果的类型:array(default)/collection/object/raw/自定义类名
         'response_type' => 'array',
@@ -21,10 +21,4 @@ return [
         'token' => env('WECHAT_WORK_TOKEN', 'Efd61RPH3GzEwfEATRwdJVKhi'),
         'aes_key' => env('WECHAT_WORK_ENCODING_AES_KEY', 'XL1brptJzQeDMwp5nvuojb8YEDx9GXy9kxaQ8JQl2Zu'),
     ],
-    'pay'=>[
-        'app_id' => 'wxe270937ea4d7f7d5',
-        'mch_id'             => '1612111355',
-        'key'                => 'XgdyHUHDznKNJEYzPCcQe6AMfV6ZGOT2',   // API v2 密钥 (注意: 是v2密钥 是v2密钥 是v2密钥)
-        'notify_url'         => env('APP_HOST').'/api/wechat/pay/notify',
-    ],
 ];

+ 46 - 0
config/wechatpay.php

@@ -0,0 +1,46 @@
+<?php
+return array(
+    'appid'                 => "wxe270937ea4d7f7d5",//appid
+    'mchid'                 => "1612111355",//微信直连商户号mchid
+    'certificate'           => '68E43B250D73977F1DC0E0D0827AF25A8BFB1777', //证书序列号
+    'APIV3'                 => 'iD1xB1mH6zO7pP2wD1rU4aD2nH7oL2lN',
+    'notify_url'            => env('APP_URL').'/api/wechat_pay/notify',
+    'private_key'           => '-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCYUOGwfz9rFZxJ
+XPNxZovgG321BiwTe+9HtWgCElnMVVMCFipa+ybcMQh0p3M68jdH3PMVbKjrEYy5
+huT3HM5C44l54o2lRM4eMLHvMLeu6VoYSyeXO2hscgVD9QOBmoYVHDx+hatr3rl7
+MGpFhwMnXAeD+a6IXpdek5Wvz46Q6LsnuMf+uNyJ1QwLzWi/VUnJSkT9skyQYtGp
+1ou1NENhrIRqyYtvjarJJQpCvtyGRBaXxNoWeH88RKKvvbMm+YqYjCZBa3Ds/yBa
++HgBKWj9AtjajmfskiGAU9uAmCes3Bvh9qmm0SuvbwCe8GxYcpdsq992rEP8kybO
+nPGi+KZJAgMBAAECggEACbLUvBVOJ3ZnzjAR/D2IWIvHlFhBRDhXAxzk84TRnPYt
+4+sfZU2qqsigfjUPXEiCBpxmCg4yL02dxU52k9mMtKuiXFV1qXlZGokFO3LBr2yC
+ZRub+MA6pPUZqrsWLxF0yjFTFMdUI/k5nEN38Ndo9v+gJuImH97OCqKhHGG99TIT
+WUVpBCK9z61Iiju67+p5TeTqB3aeIs/KKER2OLdyA6gq1iez8MJLKHi4wzCVCgEa
+QTc0jY4P3KLBoLCxTOZF0qdgepeFvkf/LmoTUWduDpZVhS4wCBZ+pvIEeCAyXhgE
+qDYjjSvj4pGoSFulJxiNMQfP5hqfwC38vskz1s3LkQKBgQDKFrGZgGr5tk+UhnNU
+H3hEkU0aWf3clkDF0DcwRC5FhNTyAGmt1WtUGKcU5S6HgTJkQdu6JaEiABsfrtra
+Aja+0i3YaAr2wyy1DMWNNnDr2fVkLLsCAxh74BVoPFU4iYdqUPwK7dGdxDtGrODE
+XzPkSHBXqP4rNAZMouFEmk9NBQKBgQDA8wtV5+WZjXUipYrXPPJ6bgWjGfESlLs7
+JRo0af0smkULraOGdhv2sjeUUgJsS6upPJuJCuA74YPb/X4OWzOhNGmFvOlxpfE/
+ij3acbjUICUwvJEhbqBvH39UZoNwzqYOAHVjsCMhzDBMzwleERDLdeKFSxojKb1S
+Hh4JqsMXdQKBgQCRLyqamBrCmcqkbs9uMUmrISReeSabkkqoksUDZQhFI4AE+Gzz
+2S7JdQicR2ZdLWFxi6r7GcugbKkP4wQRuaNxBfivz1eJHoEA9VL794+6sZTNSiFz
++Ztea4eVojqraoqhw9q/U0nT6UWYqdy015ylNbGYGK25hh+8cQwbyCyOrQKBgF+D
+cKcT5mp+xe9itzoZJ4dHk27L1rR1/8ElerVbikJcE7XWPM7BBNK4Ih9AAYcOZmme
+YPgT9DBwUE/ESnRc3U/9nAbiH0Vs+eGUU04hYXdQeliH3+gG1VBs7SEgpgxfn3/q
+5jF07c87PuWmz2JLXF77eii1prilXtyZoBD1ASJJAoGBAJBoum6Kf0mMnPeO+yHl
+p460VX69OpMNmwK5Gqo9WXRt+Xeljm3EVIneWiM6+EDYS0yaRMUwYWXJK8fzrpNH
+vXCuqZYM91l6IwxDcs6gKsIP4wt8KWNr7T58/QnTjDPoOJ3qjHljvJ0BQhh4cWvw
+ar4uACF4RGnjJiOnuzWhJ9z0
+-----END PRIVATE KEY-----
+',//API 私钥
+    'platformCertificate'       => '-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu8bSm61/CgGJSIm+KPJd
+jxAvK3cgZaUS2YR0UrzlNeL8+4n6YqbUBoCTd2M9ZpxD/b0MHGEwJRmawkDJXj/r
+ygKVBJSqMYtjkJvuTAQuBUGTpz+8l+alaNPn5yYuEuNo78LyImlPkU1tIxTfP41v
+0wwgEzEJT/jTFbtBxGs+odU6kz3lzQ1yPOasRuSZMdsEVrQfaxDGYugtZxf5XHgM
+8d3K5G1gGSh0JUfnORc1b39xUpGn3SVzm3Zdm28Ghjs494RCD52ymfYYUaBFejSr
+0MeVJnZ7GmOH/m3qjtBMhKlmE8dDHxmuKIKVw4/dJZWhGxSxQp+aRIhZp8TCmdEX
+pwIDAQAB
+-----END PUBLIC KEY-----' //平台支付证书
+);

二進制
resources/1612111355_20241118_cert/apiclient_cert.p12


+ 25 - 0
resources/1612111355_20241118_cert/apiclient_cert.pem

@@ -0,0 +1,25 @@
+-----BEGIN CERTIFICATE-----
+MIIEKDCCAxCgAwIBAgIUSl98/MMoDPjAlzXV/C3vvJzNb0YwDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMjQxMTE4MDcwODExWhcNMjkxMTE3MDcwODExWjCBgTETMBEGA1UEAwwK
+MTYxMjExMTM1NTEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMS0wKwYDVQQL
+DCTmt7HlnLPlpKfmlrnml6DpmoXnp5HmioDmnInpmZDlhazlj7gxCzAJBgNVBAYT
+AkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAMFyZJ/aPaA3wh76/HQbGoUPPF62Alf6wKO73DLFKI+IUao1GnV1fLOZ
+vRYwNngQdK7CGAyn3F1joESDtbEzJPRSisNmClJOiAhfEwazKRKuQ5WQsNNMrjJ6
+A5u+n9fA62GFvPe+sLxARoonCJBm9Lcy/BUqG3eRy7c68pgO8kMysk+5sbP55ok9
+Q3rXsr2sGrEWxWFwy/Ysg1nymNw+Vgm1SYef7iQAqqEtXYQbptOUrM5EMCDk6Elj
+HZ6ITpc4lkthQNyINHX+tLKf2wlSTXrYEGlE93KhVWhuWhKzDKV0yiwooScoWm09
+CGYdPzOW4QqDJDUn5pfTi/k2JZ5Ew2ECAwEAAaOBuTCBtjAJBgNVHRMEAjAAMAsG
+A1UdDwQEAwID+DCBmwYDVR0fBIGTMIGQMIGNoIGKoIGHhoGEaHR0cDovL2V2Y2Eu
+aXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRC
+MDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyJnNnPUhBQ0M0NzFCNjU0MjJFMTJCMjdB
+OUQzM0E4N0FEMUNERjU5MjZFMTQwMzcxMA0GCSqGSIb3DQEBCwUAA4IBAQBABzEi
+tR2IKZg/l0uXm5fOCMRXobRmLMV36M2rEM2XyAa6I2OfOKTg/H/SIeBdXk4sQE13
+U/0Jb5xX67Bsb8tP7pEwfjxprsxxA42uDCWkbUNYTTxRe5i4ux3ZPC/Q04VS9ewZ
+NUhcJ7C00mpS9tDP6cbLhethUM1+JP/tn7TZ3eEZb9BV7al56CAfCYVgkNfToZMM
+a73xZ3TL0KRrVOi9QsTPV1C2C5FLaQDRMTiDhIp+5+MHLfpHprnmHexk/a4uaVli
+wx+X6RyyKNhqZnO/AZUh2pAtqQ4dt86u2lIR1XOJdI3rjpl/gla8zImhvNpm0Aoe
+JsVF5WTQnbC7c2Jv
+-----END CERTIFICATE-----

+ 28 - 0
resources/1612111355_20241118_cert/apiclient_key.pem

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDBcmSf2j2gN8Ie
++vx0GxqFDzxetgJX+sCju9wyxSiPiFGqNRp1dXyzmb0WMDZ4EHSuwhgMp9xdY6BE
+g7WxMyT0UorDZgpSTogIXxMGsykSrkOVkLDTTK4yegObvp/XwOthhbz3vrC8QEaK
+JwiQZvS3MvwVKht3kcu3OvKYDvJDMrJPubGz+eaJPUN617K9rBqxFsVhcMv2LINZ
+8pjcPlYJtUmHn+4kAKqhLV2EG6bTlKzORDAg5OhJYx2eiE6XOJZLYUDciDR1/rSy
+n9sJUk162BBpRPdyoVVobloSswyldMosKKEnKFptPQhmHT8zluEKgyQ1J+aX04v5
+NiWeRMNhAgMBAAECggEBAJUphdmUyMwP8ok88wj8FTjghKZrJed9HKmkI6iqShpS
+/NWH2P0VOLCsLRc82eM+nRpb43tuvAbu2Re7j5AxZZ9XPlRpDDBnCZGa7erOny8e
+XFKpnQ9xIykc2Edxd4M/6L/sBcfqrBCcZ0gDzSC7oprYn3QaYc+TBkglFgaWD8wr
+pdNjXPFziXXQ2nWbvnE/70MERrSTUTnaQMuBRLW9Vyo/wg4HQ5Bfk1CnvQZvmJ3b
+zhLj7VBDk2x2WQPX9Fb53VxBeRc4c2cSncgZlom3Qdj+VO8wqZ7xsLIvN/f7qqy8
+qCCH0TU0FzNICbWVJz38UZWDv2T7mOg3DBky55JNOZkCgYEA5tLeUb1dTZqECoq5
+8z9F+4nxU7GGg/xM4GAFCkqmL4zAgAu2noLMWlXnE9s0uWJ2f+zErqEqJgKPWrc5
+5I+4GdJV+rrMM299DdKtomAvgsRVNW33sU5Q0aUDK3aQeDhlvDkmuRq03CZxlaD0
+D366ftX+/q8F5zsB9vCmkffaoDcCgYEA1ovgWQ84KpxXIABTd25wfnpmy6nOOiuv
+IeiaLmm0iPihXD5+8xZ2xQgI3tRLGvd+YxzhaIiCYIZilOyr1qhdA1tVWc3gONVw
+JmE4jZGSBVgnIfUQDbhK9tx0a+ayYII3pfC8+y6zPY7OI2t9eotVN7FncEhid3c+
+HMH3soFg/ScCgYAgVfgZIVsZzQSkaWzFW97U7y0kmWELymOGp0ztdSm0zZYGGh36
+NL6mBRS7HmFTeyy4nRWslR1Pd9pXTgXJNC0JSQMMffCvX/X34sS6U5k0S4bYVlB1
+wU/nHqPECfcRMG1oIeV/1vLxSF1vJb4rEYjUzevMB/7ettB+pJXhKwSwnwKBgQDR
+tua0h2DyneG4ITl1S9ngd8sVl0VDrUHClnhnl+Hl5Yrs/RXgjfvIuwLYtZE4qeW8
+AhX/tTgkHBgu1G1gJTDOQC/c2ZYsV84JZgz+rOWcHcAavE5V6ug0B+gxNM718TNu
+HDTOHqcMLBQpoT+FUr8Y8mtW4RqHBmMLfzqdHURuDwKBgHqGTnJ0N9G1OZKIa3Pd
+IT+VHwi+LKimXMbWL8unh3n43aIPeBVD+vvEhZsx0dHlAEbJ7Fw7zTHtVuIhe73O
+342TuO4BZaOE0pl9+iOdXNxBZx3e1p2mU8fAOoPZFDaqJNRQVQHLH3P8FMChby9B
+2s3YrNc5pJxE0mtBzbZYja9B
+-----END PRIVATE KEY-----

+ 9 - 0
resources/1612111355_20241118_cert/pub_key.pem

@@ -0,0 +1,9 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu8bSm61/CgGJSIm+KPJd
+jxAvK3cgZaUS2YR0UrzlNeL8+4n6YqbUBoCTd2M9ZpxD/b0MHGEwJRmawkDJXj/r
+ygKVBJSqMYtjkJvuTAQuBUGTpz+8l+alaNPn5yYuEuNo78LyImlPkU1tIxTfP41v
+0wwgEzEJT/jTFbtBxGs+odU6kz3lzQ1yPOasRuSZMdsEVrQfaxDGYugtZxf5XHgM
+8d3K5G1gGSh0JUfnORc1b39xUpGn3SVzm3Zdm28Ghjs494RCD52ymfYYUaBFejSr
+0MeVJnZ7GmOH/m3qjtBMhKlmE8dDHxmuKIKVw4/dJZWhGxSxQp+aRIhZp8TCmdEX
+pwIDAQAB
+-----END PUBLIC KEY-----

+ 18 - 0
resources/1612111355_20241118_cert/璇佷功浣跨敤璇存槑.txt

@@ -0,0 +1,18 @@
+欢迎使用微信支付!
+附件中的三份文件(证书pkcs12格式、证书pem格式、证书密钥pem格式),为接口中强制要求时需携带的证书文件。
+证书属于敏感信息,请妥善保管不要泄露和被他人复制。
+不同开发语言下的证书格式不同,以下为说明指引:
+    证书pkcs12格式(apiclient_cert.p12)
+        包含了私钥信息的证书文件,为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份
+        部分安全性要求较高的API需要使用该证书来确认您的调用身份
+        windows上可以直接双击导入系统,导入过程中会提示输入证书密码,证书密码默认为您的商户号(如:1900006031)
+    证书pem格式(apiclient_cert.pem)
+        从apiclient_cert.p12中导出证书部分的文件,为pem格式,请妥善保管不要泄漏和被他人复制
+        部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供
+        您也可以使用openssl命令来自己导出:openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem
+    证书密钥pem格式(apiclient_key.pem)
+        从apiclient_cert.p12中导出密钥部分的文件,为pem格式
+        部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供
+        您也可以使用openssl命令来自己导出:openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem
+备注说明:  
+        由于绝大部分操作系统已内置了微信支付服务器证书的根CA证书,  2018年3月6日后, 不再提供CA证书文件(rootca.pem)下载 

+ 3 - 0
routes/api.php

@@ -126,5 +126,8 @@ Route::any('course/reservation_list',[\App\Http\Controllers\Api\Course::class,'r
 //取消预约
 Route::any('course/cancel_reservation',[\App\Http\Controllers\Api\Course::class,'cancel_reservation']);
 
+
+// 微信支付
+Route::any('wechat_pay/pay',[\App\Http\Controllers\Api\WechatPay::class,'pay']);
 // 微信支付回调
 Route::any('wechat_pay/notify',[\App\Http\Controllers\Api\WechatPay::class,'notify']);