linwu 2 жил өмнө
parent
commit
a765dda702

+ 2 - 2
app/admin/controller/Index.php

@@ -21,14 +21,14 @@ class Index
         $merchantId = config('wxconfig.payMchId');
 
 // 从本地文件中加载「商户API私钥」,「商户API私钥」会用来生成请求的签名
-        $merchantPrivateKeyFilePath = file_get_contents(root_path('/extend/payment/cert') . 'apiclient_key.pem');
+        $merchantPrivateKeyFilePath = file_get_contents(root_path('extend/payment/cert') . 'apiclient_key.pem');
         $merchantPrivateKeyInstance = Rsa::from($merchantPrivateKeyFilePath, Rsa::KEY_TYPE_PRIVATE);
 
 // 「商户API证书」的「证书序列号」
         $merchantCertificateSerial = config('wxconfig.serial');
 
 // 从本地文件中加载「微信支付平台证书」,用来验证微信支付应答的签名
-        $platformCertificateFilePath = file_get_contents(root_path('/extend/payment/cert') . 'cert.pem');
+        $platformCertificateFilePath = file_get_contents(root_path('extend/payment/cert') . 'cert.pem');
         $platformPublicKeyInstance   = Rsa::from($platformCertificateFilePath, Rsa::KEY_TYPE_PUBLIC);
 
 // 从「微信支付平台证书」中获取「证书序列号」

+ 23 - 0
extend/payment/cert/cert.pem

@@ -0,0 +1,23 @@
+-----BEGIN CERTIFICATE-----
+MIID3DCCAsSgAwIBAgIUTM+ck3JVXSYdflq8mz/psb9IJXcwDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMjIwMTE4MDIzNzA5WhcNMjcwMTE3MDIzNzA5WjBuMRgwFgYDVQQDDA9U
+ZW5wYXkuY29tIHNpZ24xEzARBgNVBAoMClRlbnBheS5jb20xHTAbBgNVBAsMFFRl
+bnBheS5jb20gQ0EgQ2VudGVyMQswCQYDVQQGDAJDTjERMA8GA1UEBwwIU2hlblpo
+ZW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC8ZJYkVm9v8EzQ3AtL
+aYVkpcm8TLRsdXuk3Yfm7N9grz9XiJhped/NAOqCbr3SId8Hr5JPoM0UNc4G8oQL
+TX13J7bSo3choZP+qyllrrK+3HPTZWAPVOpeUYuddvXtMgl0kunh7gqUPfwsWT48
+0mXbBXqiPYaIR0+F/ubwIB73IxNSArvrAhNa4kfMC8BoWVrVvxwpuYNdLrjaN8AO
+gA+WqzUCuwGernF68rja5uQcypV3WoF7jN3boLSsJuP92towMDi7ROUxdEgqS1Xq
+/tSKnB4yauXaQ0oDkIFbDLRTjDRoNNC62rUUZU38s1QNyk+cehvNyePiV/9SbvxK
+VklRAgMBAAGjgYEwfzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE8DBlBgNVHR8EXjBc
+MFqgWKBWhlRodHRwOi8vZXZjYS5pdHJ1cy5jb20uY24vcHVibGljL2l0cnVzY3Js
+P0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFEMzk3NTQ5ODQ2QzAxQzNFOEVCRDIwDQYJ
+KoZIhvcNAQELBQADggEBAJU3dPGmWpeMLcegPx8HP4eFzil7vuKZxTvZoCaTbchS
+GZNDs+E4NQd8TIn5WMOBFt+gd8aQ2FomQ7kqz6/NQ2vFXb9JZd1dh+jzxH5K6Mqm
+Nr6+rhyAQigCT7Ts2uZdeaZIXWi/ZK+dAGEfNDacjSATvkagrYm14W1edZD0+0rv
+NxaG/JQBE7j2X8CI0a/dDpi3QUHIsdwaA+TyAKCaExP7qutiVxdEHqsDdozfS/VH
+EBvaKe8OarDK3tOxfZRGgmx+7aCBKih254Pku2MkwLT0XHIX88r0JLHehcQC6EUk
+xZ5IQEKd1Sh/yRImXM0FtGTAtFQL0Zf0H72djO3ZIpA=
+-----END CERTIFICATE-----

+ 224 - 0
vendor_back/Url.php

@@ -0,0 +1,224 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+declare (strict_types = 1);
+
+namespace think\app;
+
+use think\App;
+use think\Route;
+use think\route\Url as UrlBuild;
+
+/**
+ * 路由地址生成
+ */
+class Url extends UrlBuild
+{
+
+    /**
+     * 直接解析URL地址
+     * @access protected
+     * @param  string      $url URL
+     * @param  string|bool $domain Domain
+     * @return string
+     */
+    protected function parseUrl(string $url, &$domain): string
+    {
+        $request = $this->app->request;
+
+        if (0 === strpos($url, '/')) {
+            // 直接作为路由地址解析
+            $url = substr($url, 1);
+        } elseif (false !== strpos($url, '\\')) {
+            // 解析到类
+            $url = ltrim(str_replace('\\', '/', $url), '/');
+        } elseif (0 === strpos($url, '@')) {
+            // 解析到控制器
+            $url = substr($url, 1);
+        } elseif ('' === $url) {
+            $url = $this->app->http->getName() . '/' . $request->controller() . '/' . $request->action();
+        } else {
+            // 解析到 应用/控制器/操作
+            $controller = $request->controller();
+            $app        = $this->app->http->getName();
+
+            $path       = explode('/', $url);
+            $action     = array_pop($path);
+            $controller = empty($path) ? $controller : array_pop($path);
+            $app        = empty($path) ? $app : array_pop($path);
+
+            $url = $controller . '/' . $action;
+
+            $bind = $this->app->config->get('app.domain_bind', []);
+
+            if ($key = array_search($app, $bind)) {
+                $domain = is_bool($domain) ? $key : $domain;
+            } else {
+                $map = $this->app->config->get('app.app_map', []);
+
+                if ($key = array_search($app, $map)) {
+                    $url = $key . '/' . $url;
+                } else {
+                    $url = $app . '/' . $url;
+                }
+            }
+
+        }
+
+        return $url;
+    }
+
+    public function build()
+    {
+        // 解析URL
+        $url     = $this->url;
+        $suffix  = $this->suffix;
+        $domain  = $this->domain;
+        $request = $this->app->request;
+        $vars    = $this->vars;
+
+        if (0 === strpos($url, '[') && $pos = strpos($url, ']')) {
+            // [name] 表示使用路由命名标识生成URL
+            $name = substr($url, 1, $pos - 1);
+            $url  = 'name' . substr($url, $pos + 1);
+        }
+
+        if (false === strpos($url, '://') && 0 !== strpos($url, '/')) {
+            $info = parse_url($url);
+            $url  = !empty($info['path']) ? $info['path'] : '';
+
+            if (isset($info['fragment'])) {
+                // 解析锚点
+                $anchor = $info['fragment'];
+
+                if (false !== strpos($anchor, '?')) {
+                    // 解析参数
+                    list($anchor, $info['query']) = explode('?', $anchor, 2);
+                }
+
+                if (false !== strpos($anchor, '@')) {
+                    // 解析域名
+                    list($anchor, $domain) = explode('@', $anchor, 2);
+                }
+            } elseif (strpos($url, '@') && false === strpos($url, '\\')) {
+                // 解析域名
+                list($url, $domain) = explode('@', $url, 2);
+            }
+        }
+
+        if ($url) {
+            $checkName   = isset($name) ? $name : $url . (isset($info['query']) ? '?' . $info['query'] : '');
+            $checkDomain = $domain && is_string($domain) ? $domain : null;
+
+            $rule = $this->route->getName($checkName, $checkDomain);
+
+            if (empty($rule) && isset($info['query'])) {
+                $rule = $this->route->getName($url, $checkDomain);
+                // 解析地址里面参数 合并到vars
+                parse_str($info['query'], $params);
+                $vars = array_merge($params, $vars);
+                unset($info['query']);
+            }
+        }
+
+        if (!empty($rule) && $match = $this->getRuleUrl($rule, $vars, $domain)) {
+            // 匹配路由命名标识
+            $url = $match[0];
+
+            if ($domain && !empty($match[1])) {
+                $domain = $match[1];
+            }
+
+            if (!is_null($match[2])) {
+                $suffix = $match[2];
+            }
+
+            if (!$this->app->http->isBind()) {
+                $url = $this->app->http->getName() . '/' . $url;
+            }
+        } elseif (!empty($rule) && isset($name)) {
+            throw new \InvalidArgumentException('route name not exists:' . $name);
+        } else {
+            // 检测URL绑定
+            $bind = $this->route->getDomainBind($domain && is_string($domain) ? $domain : null);
+
+            if ($bind && 0 === strpos($url, $bind)) {
+                $url = substr($url, strlen($bind) + 1);
+            } else {
+                $binds = $this->route->getBind();
+
+                foreach ($binds as $key => $val) {
+                    if (is_string($val) && 0 === strpos($url, $val) && substr_count($val, '/') > 1) {
+                        $url    = substr($url, strlen($val) + 1);
+                        $domain = $key;
+                        break;
+                    }
+                }
+            }
+
+            // 路由标识不存在 直接解析
+            $url = $this->parseUrl($url, $domain);
+
+            if (isset($info['query'])) {
+                // 解析地址里面参数 合并到vars
+                parse_str($info['query'], $params);
+                $vars = array_merge($params, $vars);
+            }
+        }
+
+        // 还原URL分隔符
+        $depr = $this->route->config('pathinfo_depr');
+        $url  = str_replace('/', $depr, $url);
+
+        $file = $request->baseFile();
+        if ($file && 0 !== strpos($request->url(), $file)) {
+            $file = str_replace('\\', '/', dirname($file));
+        }
+
+        $url = rtrim($file, '/') . '/' . ltrim($url, '/');
+
+        // URL后缀
+        if ('/' == substr($url, -1) || '' == $url) {
+            $suffix = '';
+        } else {
+            $suffix = $this->parseSuffix($suffix);
+        }
+
+        // 锚点
+        $anchor = !empty($anchor) ? '#' . $anchor : '';
+
+        // 参数组装
+        if (!empty($vars)) {
+            // 添加参数
+            if ($this->route->config('url_common_param')) {
+                $vars = http_build_query($vars);
+                $url .= $suffix . '?' . $vars . $anchor;
+            } else {
+                foreach ($vars as $var => $val) {
+                    $val = (string) $val;
+                    if ('' !== $val) {
+                        $url .= $depr . $var . $depr . urlencode($val);
+                    }
+                }
+
+                $url .= $suffix . $anchor;
+            }
+        } else {
+            $url .= $suffix . $anchor;
+        }
+
+        // 检测域名
+        $domain = $this->parseDomain($url, $domain);
+
+        // URL组装
+        return $domain . rtrim($this->root, '/') . '/' . ltrim($url, '/');
+    }
+
+}

+ 7 - 0
vendor_back/services.php

@@ -0,0 +1,7 @@
+<?php 
+// This file is automatically generated at:2020-08-19 09:01:17
+declare (strict_types = 1);
+return array (
+  0 => 'think\\captcha\\CaptchaService',
+  1 => 'think\\app\\Service',
+);