diff --git a/assets/images/alipay-icon.svg b/assets/images/alipay-icon.svg
deleted file mode 100644
index c84cc458..00000000
--- a/assets/images/alipay-icon.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/images/alipay.svg b/assets/images/alipay.svg
deleted file mode 100644
index 5678e211..00000000
--- a/assets/images/alipay.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/images/icons/official-extension.svg b/assets/images/icons/official-extension.svg
deleted file mode 100644
index 8270a1ab..00000000
--- a/assets/images/icons/official-extension.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/composer.json b/composer.json
deleted file mode 100644
index 6f8ed125..00000000
--- a/composer.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "require": {
- "alipaysdk/easysdk": "^2.0"
- }
-}
diff --git a/composer.lock b/composer.lock
deleted file mode 100644
index 9a0f5de8..00000000
--- a/composer.lock
+++ /dev/null
@@ -1,832 +0,0 @@
-{
- "_readme": [
- "This file locks the dependencies of your project to a known state",
- "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
- "This file is @generated automatically"
- ],
- "content-hash": "524ca69e0ade104f4102231471f256e3",
- "packages": [
- {
- "name": "adbario/php-dot-notation",
- "version": "2.5.0",
- "source": {
- "type": "git",
- "url": "https://github.com/adbario/php-dot-notation.git",
- "reference": "081e2cca50c84bfeeea2e3ef9b2c8d206d80ccae"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/adbario/php-dot-notation/zipball/081e2cca50c84bfeeea2e3ef9b2c8d206d80ccae",
- "reference": "081e2cca50c84bfeeea2e3ef9b2c8d206d80ccae",
- "shasum": ""
- },
- "require": {
- "ext-json": "*",
- "php": "^5.5 || ^7.0 || ^8.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.8|^5.7|^6.6|^7.5|^8.5|^9.5",
- "squizlabs/php_codesniffer": "^3.6"
- },
- "type": "library",
- "autoload": {
- "files": [
- "src/helpers.php"
- ],
- "psr-4": {
- "Adbar\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Riku Särkinen",
- "email": "riku@adbar.io"
- }
- ],
- "description": "PHP dot notation access to arrays",
- "homepage": "https://github.com/adbario/php-dot-notation",
- "keywords": [
- "ArrayAccess",
- "dotnotation"
- ],
- "support": {
- "issues": "https://github.com/adbario/php-dot-notation/issues",
- "source": "https://github.com/adbario/php-dot-notation/tree/2.5.0"
- },
- "time": "2022-10-14T20:31:46+00:00"
- },
- {
- "name": "alibabacloud/tea",
- "version": "3.2.1",
- "source": {
- "type": "git",
- "url": "https://github.com/aliyun/tea-php.git",
- "reference": "1619cb96c158384f72b873e1f85de8b299c9c367"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/aliyun/tea-php/zipball/1619cb96c158384f72b873e1f85de8b299c9c367",
- "reference": "1619cb96c158384f72b873e1f85de8b299c9c367",
- "shasum": ""
- },
- "require": {
- "adbario/php-dot-notation": "^2.4",
- "ext-curl": "*",
- "ext-json": "*",
- "ext-libxml": "*",
- "ext-mbstring": "*",
- "ext-openssl": "*",
- "ext-simplexml": "*",
- "ext-xmlwriter": "*",
- "guzzlehttp/guzzle": "^6.3|^7.0",
- "php": ">=5.5"
- },
- "require-dev": {
- "phpunit/phpunit": "*",
- "symfony/dotenv": "^3.4",
- "symfony/var-dumper": "^3.4"
- },
- "suggest": {
- "ext-sockets": "To use client-side monitoring"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "AlibabaCloud\\Tea\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "Apache-2.0"
- ],
- "authors": [
- {
- "name": "Alibaba Cloud SDK",
- "email": "sdk-team@alibabacloud.com",
- "homepage": "http://www.alibabacloud.com"
- }
- ],
- "description": "Client of Tea for PHP",
- "homepage": "https://www.alibabacloud.com/",
- "keywords": [
- "alibabacloud",
- "client",
- "cloud",
- "tea"
- ],
- "support": {
- "issues": "https://github.com/aliyun/tea-php/issues",
- "source": "https://github.com/aliyun/tea-php"
- },
- "time": "2023-05-16T06:43:41+00:00"
- },
- {
- "name": "alibabacloud/tea-fileform",
- "version": "0.3.4",
- "source": {
- "type": "git",
- "url": "https://github.com/alibabacloud-sdk-php/tea-fileform.git",
- "reference": "4bf0c75a045c8115aa8cb1a394bd08d8bb833181"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/alibabacloud-sdk-php/tea-fileform/zipball/4bf0c75a045c8115aa8cb1a394bd08d8bb833181",
- "reference": "4bf0c75a045c8115aa8cb1a394bd08d8bb833181",
- "shasum": ""
- },
- "require": {
- "alibabacloud/tea": "^3.0",
- "php": ">5.5"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.8.35|^5.4.3"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "AlibabaCloud\\Tea\\FileForm\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "Apache-2.0"
- ],
- "authors": [
- {
- "name": "Alibaba Cloud SDK",
- "email": "sdk-team@alibabacloud.com"
- }
- ],
- "description": "Alibaba Cloud Tea File Library for PHP",
- "support": {
- "issues": "https://github.com/alibabacloud-sdk-php/tea-fileform/issues",
- "source": "https://github.com/alibabacloud-sdk-php/tea-fileform/tree/0.3.4"
- },
- "time": "2020-12-01T07:24:35+00:00"
- },
- {
- "name": "alipaysdk/easysdk",
- "version": "2.2.3",
- "source": {
- "type": "git",
- "url": "https://github.com/alipay/alipay-easysdk.git",
- "reference": "c6008839a22a5fca08e9f8536730f7abfed522d5"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/alipay/alipay-easysdk/zipball/c6008839a22a5fca08e9f8536730f7abfed522d5",
- "reference": "c6008839a22a5fca08e9f8536730f7abfed522d5",
- "shasum": ""
- },
- "require": {
- "alibabacloud/tea": "^3.1",
- "alibabacloud/tea-fileform": "^0.3.2",
- "ext-ctype": "*",
- "ext-curl": "*",
- "ext-dom": "*",
- "ext-fileinfo": "*",
- "ext-json": "*",
- "ext-libxml": "*",
- "ext-mbstring": "*",
- "ext-openssl": "*",
- "ext-simplexml": "*",
- "ext-xmlwriter": "*",
- "guzzlehttp/guzzle": ">=6.3",
- "php": ">=7.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^7.5"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Alipay\\EasySDK\\": "php/src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "Apache-2.0"
- ],
- "authors": [
- {
- "name": "junying.wjy",
- "email": "junying.wjy@antfin.com"
- }
- ],
- "description": "支付宝官方 Alipay Easy SDK",
- "support": {
- "source": "https://github.com/alipay/alipay-easysdk/tree/v2.2.3"
- },
- "time": "2022-11-28T14:04:57+00:00"
- },
- {
- "name": "guzzlehttp/guzzle",
- "version": "7.10.0",
- "source": {
- "type": "git",
- "url": "https://github.com/guzzle/guzzle.git",
- "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4",
- "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4",
- "shasum": ""
- },
- "require": {
- "ext-json": "*",
- "guzzlehttp/promises": "^2.3",
- "guzzlehttp/psr7": "^2.8",
- "php": "^7.2.5 || ^8.0",
- "psr/http-client": "^1.0",
- "symfony/deprecation-contracts": "^2.2 || ^3.0"
- },
- "provide": {
- "psr/http-client-implementation": "1.0"
- },
- "require-dev": {
- "bamarni/composer-bin-plugin": "^1.8.2",
- "ext-curl": "*",
- "guzzle/client-integration-tests": "3.0.2",
- "php-http/message-factory": "^1.1",
- "phpunit/phpunit": "^8.5.39 || ^9.6.20",
- "psr/log": "^1.1 || ^2.0 || ^3.0"
- },
- "suggest": {
- "ext-curl": "Required for CURL handler support",
- "ext-intl": "Required for Internationalized Domain Name (IDN) support",
- "psr/log": "Required for using the Log middleware"
- },
- "type": "library",
- "extra": {
- "bamarni-bin": {
- "bin-links": true,
- "forward-command": false
- }
- },
- "autoload": {
- "files": [
- "src/functions_include.php"
- ],
- "psr-4": {
- "GuzzleHttp\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Graham Campbell",
- "email": "hello@gjcampbell.co.uk",
- "homepage": "https://github.com/GrahamCampbell"
- },
- {
- "name": "Michael Dowling",
- "email": "mtdowling@gmail.com",
- "homepage": "https://github.com/mtdowling"
- },
- {
- "name": "Jeremy Lindblom",
- "email": "jeremeamia@gmail.com",
- "homepage": "https://github.com/jeremeamia"
- },
- {
- "name": "George Mponos",
- "email": "gmponos@gmail.com",
- "homepage": "https://github.com/gmponos"
- },
- {
- "name": "Tobias Nyholm",
- "email": "tobias.nyholm@gmail.com",
- "homepage": "https://github.com/Nyholm"
- },
- {
- "name": "Márk Sági-Kazár",
- "email": "mark.sagikazar@gmail.com",
- "homepage": "https://github.com/sagikazarmark"
- },
- {
- "name": "Tobias Schultze",
- "email": "webmaster@tubo-world.de",
- "homepage": "https://github.com/Tobion"
- }
- ],
- "description": "Guzzle is a PHP HTTP client library",
- "keywords": [
- "client",
- "curl",
- "framework",
- "http",
- "http client",
- "psr-18",
- "psr-7",
- "rest",
- "web service"
- ],
- "support": {
- "issues": "https://github.com/guzzle/guzzle/issues",
- "source": "https://github.com/guzzle/guzzle/tree/7.10.0"
- },
- "funding": [
- {
- "url": "https://github.com/GrahamCampbell",
- "type": "github"
- },
- {
- "url": "https://github.com/Nyholm",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
- "type": "tidelift"
- }
- ],
- "time": "2025-08-23T22:36:01+00:00"
- },
- {
- "name": "guzzlehttp/promises",
- "version": "2.3.0",
- "source": {
- "type": "git",
- "url": "https://github.com/guzzle/promises.git",
- "reference": "481557b130ef3790cf82b713667b43030dc9c957"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957",
- "reference": "481557b130ef3790cf82b713667b43030dc9c957",
- "shasum": ""
- },
- "require": {
- "php": "^7.2.5 || ^8.0"
- },
- "require-dev": {
- "bamarni/composer-bin-plugin": "^1.8.2",
- "phpunit/phpunit": "^8.5.44 || ^9.6.25"
- },
- "type": "library",
- "extra": {
- "bamarni-bin": {
- "bin-links": true,
- "forward-command": false
- }
- },
- "autoload": {
- "psr-4": {
- "GuzzleHttp\\Promise\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Graham Campbell",
- "email": "hello@gjcampbell.co.uk",
- "homepage": "https://github.com/GrahamCampbell"
- },
- {
- "name": "Michael Dowling",
- "email": "mtdowling@gmail.com",
- "homepage": "https://github.com/mtdowling"
- },
- {
- "name": "Tobias Nyholm",
- "email": "tobias.nyholm@gmail.com",
- "homepage": "https://github.com/Nyholm"
- },
- {
- "name": "Tobias Schultze",
- "email": "webmaster@tubo-world.de",
- "homepage": "https://github.com/Tobion"
- }
- ],
- "description": "Guzzle promises library",
- "keywords": [
- "promise"
- ],
- "support": {
- "issues": "https://github.com/guzzle/promises/issues",
- "source": "https://github.com/guzzle/promises/tree/2.3.0"
- },
- "funding": [
- {
- "url": "https://github.com/GrahamCampbell",
- "type": "github"
- },
- {
- "url": "https://github.com/Nyholm",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
- "type": "tidelift"
- }
- ],
- "time": "2025-08-22T14:34:08+00:00"
- },
- {
- "name": "guzzlehttp/psr7",
- "version": "2.8.0",
- "source": {
- "type": "git",
- "url": "https://github.com/guzzle/psr7.git",
- "reference": "21dc724a0583619cd1652f673303492272778051"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051",
- "reference": "21dc724a0583619cd1652f673303492272778051",
- "shasum": ""
- },
- "require": {
- "php": "^7.2.5 || ^8.0",
- "psr/http-factory": "^1.0",
- "psr/http-message": "^1.1 || ^2.0",
- "ralouphie/getallheaders": "^3.0"
- },
- "provide": {
- "psr/http-factory-implementation": "1.0",
- "psr/http-message-implementation": "1.0"
- },
- "require-dev": {
- "bamarni/composer-bin-plugin": "^1.8.2",
- "http-interop/http-factory-tests": "0.9.0",
- "phpunit/phpunit": "^8.5.44 || ^9.6.25"
- },
- "suggest": {
- "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
- },
- "type": "library",
- "extra": {
- "bamarni-bin": {
- "bin-links": true,
- "forward-command": false
- }
- },
- "autoload": {
- "psr-4": {
- "GuzzleHttp\\Psr7\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Graham Campbell",
- "email": "hello@gjcampbell.co.uk",
- "homepage": "https://github.com/GrahamCampbell"
- },
- {
- "name": "Michael Dowling",
- "email": "mtdowling@gmail.com",
- "homepage": "https://github.com/mtdowling"
- },
- {
- "name": "George Mponos",
- "email": "gmponos@gmail.com",
- "homepage": "https://github.com/gmponos"
- },
- {
- "name": "Tobias Nyholm",
- "email": "tobias.nyholm@gmail.com",
- "homepage": "https://github.com/Nyholm"
- },
- {
- "name": "Márk Sági-Kazár",
- "email": "mark.sagikazar@gmail.com",
- "homepage": "https://github.com/sagikazarmark"
- },
- {
- "name": "Tobias Schultze",
- "email": "webmaster@tubo-world.de",
- "homepage": "https://github.com/Tobion"
- },
- {
- "name": "Márk Sági-Kazár",
- "email": "mark.sagikazar@gmail.com",
- "homepage": "https://sagikazarmark.hu"
- }
- ],
- "description": "PSR-7 message implementation that also provides common utility methods",
- "keywords": [
- "http",
- "message",
- "psr-7",
- "request",
- "response",
- "stream",
- "uri",
- "url"
- ],
- "support": {
- "issues": "https://github.com/guzzle/psr7/issues",
- "source": "https://github.com/guzzle/psr7/tree/2.8.0"
- },
- "funding": [
- {
- "url": "https://github.com/GrahamCampbell",
- "type": "github"
- },
- {
- "url": "https://github.com/Nyholm",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
- "type": "tidelift"
- }
- ],
- "time": "2025-08-23T21:21:41+00:00"
- },
- {
- "name": "psr/http-client",
- "version": "1.0.3",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/http-client.git",
- "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90",
- "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90",
- "shasum": ""
- },
- "require": {
- "php": "^7.0 || ^8.0",
- "psr/http-message": "^1.0 || ^2.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Psr\\Http\\Client\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "https://www.php-fig.org/"
- }
- ],
- "description": "Common interface for HTTP clients",
- "homepage": "https://github.com/php-fig/http-client",
- "keywords": [
- "http",
- "http-client",
- "psr",
- "psr-18"
- ],
- "support": {
- "source": "https://github.com/php-fig/http-client"
- },
- "time": "2023-09-23T14:17:50+00:00"
- },
- {
- "name": "psr/http-factory",
- "version": "1.1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/http-factory.git",
- "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
- "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
- "shasum": ""
- },
- "require": {
- "php": ">=7.1",
- "psr/http-message": "^1.0 || ^2.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Psr\\Http\\Message\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "https://www.php-fig.org/"
- }
- ],
- "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories",
- "keywords": [
- "factory",
- "http",
- "message",
- "psr",
- "psr-17",
- "psr-7",
- "request",
- "response"
- ],
- "support": {
- "source": "https://github.com/php-fig/http-factory"
- },
- "time": "2024-04-15T12:06:14+00:00"
- },
- {
- "name": "psr/http-message",
- "version": "2.0",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/http-message.git",
- "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
- "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
- "shasum": ""
- },
- "require": {
- "php": "^7.2 || ^8.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.0.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Psr\\Http\\Message\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "https://www.php-fig.org/"
- }
- ],
- "description": "Common interface for HTTP messages",
- "homepage": "https://github.com/php-fig/http-message",
- "keywords": [
- "http",
- "http-message",
- "psr",
- "psr-7",
- "request",
- "response"
- ],
- "support": {
- "source": "https://github.com/php-fig/http-message/tree/2.0"
- },
- "time": "2023-04-04T09:54:51+00:00"
- },
- {
- "name": "ralouphie/getallheaders",
- "version": "3.0.3",
- "source": {
- "type": "git",
- "url": "https://github.com/ralouphie/getallheaders.git",
- "reference": "120b605dfeb996808c31b6477290a714d356e822"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
- "reference": "120b605dfeb996808c31b6477290a714d356e822",
- "shasum": ""
- },
- "require": {
- "php": ">=5.6"
- },
- "require-dev": {
- "php-coveralls/php-coveralls": "^2.1",
- "phpunit/phpunit": "^5 || ^6.5"
- },
- "type": "library",
- "autoload": {
- "files": [
- "src/getallheaders.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Ralph Khattar",
- "email": "ralph.khattar@gmail.com"
- }
- ],
- "description": "A polyfill for getallheaders.",
- "support": {
- "issues": "https://github.com/ralouphie/getallheaders/issues",
- "source": "https://github.com/ralouphie/getallheaders/tree/develop"
- },
- "time": "2019-03-08T08:55:37+00:00"
- },
- {
- "name": "symfony/deprecation-contracts",
- "version": "v3.6.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/deprecation-contracts.git",
- "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
- "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
- "shasum": ""
- },
- "require": {
- "php": ">=8.1"
- },
- "type": "library",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/contracts",
- "name": "symfony/contracts"
- },
- "branch-alias": {
- "dev-main": "3.6-dev"
- }
- },
- "autoload": {
- "files": [
- "function.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "A generic function and convention to trigger deprecation notices",
- "homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2024-09-25T14:21:43+00:00"
- }
- ],
- "packages-dev": [],
- "aliases": [],
- "minimum-stability": "stable",
- "stability-flags": {},
- "prefer-stable": false,
- "prefer-lowest": false,
- "platform": {},
- "platform-dev": {},
- "plugin-api-version": "2.6.0"
-}
diff --git a/css/admin/main.css b/css/admin/main.css
index 861bb247..b61da326 100755
--- a/css/admin/main.css
+++ b/css/admin/main.css
@@ -39,4 +39,71 @@
.woo-alipay-settings .test-status-message.is-active,
.woo-alipay-settings .description.help.is-active {
display: block;
+}
+
+.woo-alipay-config-help {
+ max-width: 800px;
+}
+
+.woo-alipay-config-help ul {
+ margin-left: 30px;
+}
+
+.woo-alipay-config-help li {
+ list-style: disc;
+}
+
+.woo-alipay-config-help .inside {
+ padding: 0 30px 12px;
+}
+
+.woo-alipay-config-help .handle {
+ border-bottom: 1px solid #ccd0d4;
+ line-height: 1.4em;
+ font-size: 14px;
+ margin: 0;
+ padding: 8px 12px;
+}
+
+.js .woo-alipay-config-help .handlediv {
+ display: block;
+}
+
+.woo-alipay-config-help .handlediv {
+ display: none;
+ float: right;
+ width: 36px;
+ height: 36px;
+ margin: 0;
+ padding: 0;
+ border: 0;
+ background: 0 0;
+ cursor: pointer;
+}
+
+.woo-alipay-config-help .handlediv,
+.woo-alipay-config-help .handlediv.button-link {
+ color: #72777c;
+}
+
+.woo-alipay-config-help .handlediv .toggle-indicator:before {
+ margin-top: 4px;
+ width: 20px;
+ border-radius: 50%;
+ text-indent: -1px;
+ content: "\f142";
+ display: inline-block;
+ font: normal 20px/1 dashicons;
+ speak: none;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ text-decoration: none!important;
+}
+
+.woo-alipay-config-help.closed .handlediv .toggle-indicator:before {
+ content: "\f140";
+}
+
+.woo-alipay-config-help.closed .inside {
+ display: none;
}
\ No newline at end of file
diff --git a/css/admin/main.min.css b/css/admin/main.min.css
index 861bb247..6773ca06 100755
--- a/css/admin/main.min.css
+++ b/css/admin/main.min.css
@@ -1,42 +1 @@
-.woo-alipay-settings .spinner,
-.woo-alipay-settings .test-status {
- display: inline-block;
- float: none;
- vertical-align: middle;
-}
-
-.woo-alipay-settings .spinner {
- background-size: 20px 20px;
- opacity: .7;
- filter: alpha(opacity=70);
-}
-
-.woo-alipay-settings .test-status .success {
- color: #46b450;
-}
-
-.woo-alipay-settings .test-status .failure,
-.woo-alipay-settings .test-status .error {
- color: #dc3232;
-}
-
-.woo-alipay-settings .test-status .dashicons {
- margin: 4px 10px 8px;
- display: none;
-}
-
-.woo-alipay-settings .test-status .dashicons.is-active {
- display: inline-block;
-}
-
-.woo-alipay-settings .test-status-message.success,
-.woo-alipay-settings .test-status-message.failure,
-.woo-alipay-settings .test-status-message.error,
-.woo-alipay-settings .description.help {
- display: none;
-}
-
-.woo-alipay-settings .test-status-message.is-active,
-.woo-alipay-settings .description.help.is-active {
- display: block;
-}
\ No newline at end of file
+.woo-alipay-settings .spinner,.woo-alipay-settings .test-status{display:inline-block;float:none;vertical-align:middle}.woo-alipay-settings .spinner{background-size:20px 20px;opacity:.7}.woo-alipay-settings .test-status .success{color:#46b450}.woo-alipay-settings .test-status .error,.woo-alipay-settings .test-status .failure{color:#dc3232}.woo-alipay-settings .test-status .dashicons{margin:4px 10px 8px;display:none}.woo-alipay-settings .test-status .dashicons.is-active{display:inline-block}.woo-alipay-settings .description.help,.woo-alipay-settings .test-status-message.error,.woo-alipay-settings .test-status-message.failure,.woo-alipay-settings .test-status-message.success{display:none}.woo-alipay-settings .description.help.is-active,.woo-alipay-settings .test-status-message.is-active{display:block}.woo-alipay-config-help{max-width:800px}.woo-alipay-config-help ul{margin-left:30px}.woo-alipay-config-help li{list-style:disc}.woo-alipay-config-help .inside{padding:0 30px 12px}.woo-alipay-config-help .handle{border-bottom:1px solid #ccd0d4;line-height:1.4em;font-size:14px;margin:0;padding:8px 12px}.js .woo-alipay-config-help .handlediv{display:block}.woo-alipay-config-help .handlediv{display:none;float:right;width:36px;height:36px;margin:0;padding:0;border:0;background:0 0;cursor:pointer}.woo-alipay-config-help .handlediv,.woo-alipay-config-help .handlediv.button-link{color:#72777c}.woo-alipay-config-help .handlediv .toggle-indicator:before{margin-top:4px;width:20px;border-radius:50%;text-indent:-1px;content:"\f142";display:inline-block;font:20px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important}.woo-alipay-config-help.closed .handlediv .toggle-indicator:before{content:"\f140"}.woo-alipay-config-help.closed .inside{display:none}
\ No newline at end of file
diff --git a/inc/class-wc-alipay-blocks-support.php b/inc/class-wc-alipay-blocks-support.php
deleted file mode 100644
index 22c20ae0..00000000
--- a/inc/class-wc-alipay-blocks-support.php
+++ /dev/null
@@ -1,68 +0,0 @@
-name = 'alipay';
- }
-
- public function initialize() {
- $this->settings = get_option( 'woocommerce_alipay_settings', array() );
-
- $gateways = WC()->payment_gateways->payment_gateways();
- $this->gateway = isset( $gateways['alipay'] ) ? $gateways['alipay'] : false;
- }
-
- public function is_active() {
- $enabled = isset( $this->settings['enabled'] ) ? $this->settings['enabled'] : 'no';
- return 'yes' === $enabled;
- }
-
- public function get_payment_method_script_handles() {
- $script_path = 'js/frontend/blocks.js';
- $script_asset_path = WOO_ALIPAY_PLUGIN_PATH . 'js/frontend/blocks.asset.php';
- $script_asset = file_exists( $script_asset_path )
- ? require( $script_asset_path )
- : array(
- 'dependencies' => array( 'wc-blocks-registry', 'wp-element', 'wp-html-entities', 'wp-i18n' ),
- 'version' => '3.1.0'
- );
- $script_url = trailingslashit( WOO_ALIPAY_PLUGIN_URL ) . $script_path;
-
- wp_register_script(
- 'wc-alipay-payments-blocks',
- $script_url,
- $script_asset['dependencies'],
- $script_asset['version'],
- true
- );
-
- if ( function_exists( 'wp_set_script_translations' ) ) {
- wp_set_script_translations( 'wc-alipay-payments-blocks', 'woo-alipay', WOO_ALIPAY_PLUGIN_PATH . 'languages' );
- }
-
- return [ 'wc-alipay-payments-blocks' ];
- }
-
- public function get_payment_method_script_handles_for_admin() {
- return $this->get_payment_method_script_handles();
- }
-
- public function get_payment_method_data() {
- return [
- 'title' => $this->get_setting( 'title', '支付宝' ),
- 'description' => $this->get_setting( 'description', '通过支付宝付款(中国大陆,包括香港和澳门)。' ),
- 'supports' => $this->get_supported_features(),
- 'icon' => WOO_ALIPAY_PLUGIN_URL . 'assets/images/alipay-icon.svg',
- ];
- }
-
- public function get_supported_features() {
- return $this->gateway ? $this->gateway->supports : [];
- }
-}
\ No newline at end of file
diff --git a/inc/class-wc-alipay.php b/inc/class-wc-alipay.php
index c0a7df4a..2cb678eb 100755
--- a/inc/class-wc-alipay.php
+++ b/inc/class-wc-alipay.php
@@ -40,7 +40,6 @@ class WC_Alipay extends WC_Payment_Gateway
$this->method_title = __('Alipay by Woo Alipay', 'woo-alipay');
$this->charset = strtolower(get_bloginfo('charset'));
$this->id = self::GATEWAY_ID;
- $this->icon = WOO_ALIPAY_PLUGIN_URL . 'assets/images/alipay-icon.svg';
$this->description = $this->get_option('description');
$this->method_description = __('Alipay is a simple, secure and fast online payment method.', 'woo-alipay');
$this->exchange_rate = $this->get_option('exchange_rate');
@@ -56,13 +55,6 @@ class WC_Alipay extends WC_Payment_Gateway
$this->supports = array(
'products',
'refunds',
- 'subscriptions',
- 'subscription_cancellation',
- 'subscription_suspension',
- 'subscription_reactivation',
- 'subscription_amount_changes',
- 'subscription_date_changes',
- 'multiple_subscriptions',
);
self::$log_enabled = ('yes' === $this->get_option('debug', 'no'));
@@ -123,26 +115,18 @@ class WC_Alipay extends WC_Payment_Gateway
'appid' => array(
'title' => __('Alipay App ID', 'woo-alipay'),
'type' => 'text',
- 'description' => sprintf(
- __('在支付宝开放平台获取的应用ID。%s', 'woo-alipay'),
- '' . __('前往支付宝开放平台', 'woo-alipay') . ''
- ),
+ 'description' => __('The App ID found in Alipay Open Platform', 'woo-alipay'),
),
'public_key' => array(
'title' => __('Alipay public key', 'woo-alipay'),
'type' => 'textarea',
- 'description' => sprintf(
- __('支付宝公钥,在支付宝开放平台应用详情页面获取。%s', 'woo-alipay'),
- '' . __('查看配置教程', 'woo-alipay') . ''
- ),
+ 'description' => __('The Alipay public key generated in the Alipay Open Platform ("支付宝公钥").', 'woo-alipay'),
),
'private_key' => array(
'title' => __('Alipay Merchant application private key', 'woo-alipay'),
'type' => 'textarea',
- 'description' => sprintf(
- __('应用私钥,使用支付宝密钥生成工具或openssl命令生成。
此密钥为机密信息,请勿泄露给任何人。%s', 'woo-alipay'),
- '' . __('查看密钥生成教程', 'woo-alipay') . ''
- ),
+ 'description' => __('The private key generated with the provided Alipay tool application or the openssl command line.
+This key is secret and is not recorded in Alipay Open Platform - DO NOT SHARE THIS VALUE WITH ANYONE.', 'woo-alipay'),
),
'sandbox' => array(
'title' => __('Sandbox', 'woo-alipay'),
@@ -185,9 +169,9 @@ class WC_Alipay extends WC_Payment_Gateway
protected function is_wooalipay_enabled()
{
- $alipay_options = get_option('woocommerce_alipay_settings', array());
+ $alipay_options = get_option('woocommerce_alipay_settings');
- return isset($alipay_options['enabled']) && ('yes' === $alipay_options['enabled']);
+ return ('yes' === $alipay_options['enabled']);
}
public function validate_settings()
@@ -217,15 +201,8 @@ class WC_Alipay extends WC_Payment_Gateway
{
$is_available = ('yes' === $this->enabled) ? true : false;
- if (!$is_available) {
- return false;
- }
-
- if ('yes' === $this->get_option('sandbox')) {
- return true;
- }
-
if ($this->multi_currency_enabled) {
+
if (
!in_array(get_woocommerce_currency(), $this->supported_currencies, true) &&
!$this->exchange_rate
@@ -275,9 +252,12 @@ class WC_Alipay extends WC_Payment_Gateway
$order = new WC_Order($order_id);
if (!$this->can_refund_order($order)) {
- return new WP_Error('error', __('Refund failed', 'woocommerce') . ' - ' . $this->refundable_status['reason']);
+
+ return new WP_Error('error', __('Refund failed', 'woocommerce') . ' - ' . $this->refund_status['reason']);
}
+ Woo_Alipay::require_lib('refund');
+
$trade_no = $order->get_transaction_id();
$total = $this->maybe_convert_amount($order->get_total());
$amount = $this->maybe_convert_amount($amount);
@@ -354,23 +334,29 @@ class WC_Alipay extends WC_Payment_Gateway
protected function do_refund($out_trade_no, $trade_no, $amount, $refund_id, $reason, $order_id = 0)
{
- \Alipay\EasySDK\Kernel\Factory::setOptions($this->get_easy_sdk_config());
+ $refund_request_builder = new AlipayTradeRefundContentBuilder();
- try {
- $response = \Alipay\EasySDK\Kernel\Factory::payment()->common()->refund($out_trade_no, $amount, $reason, $refund_id);
-
- $responseChecker = new \Alipay\EasySDK\Kernel\Util\ResponseChecker();
- if ($responseChecker->success($response)) {
- self::log(__METHOD__ . ' Refund Result: ' . wc_print_r($response, true));
- return $response;
- } else {
- self::log(__METHOD__ . ' Refund Error: ' . wc_print_r($response, true));
- return new WP_Error('error', $response->msg . '; ' . $response->subMsg);
- }
- } catch (Exception $e) {
- self::log(__METHOD__ . ' Refund Exception: ' . $e->getMessage(), 'error');
- return new WP_Error('error', $e->getMessage());
+ $refund_request_builder->setOutTradeNo($out_trade_no);
+ $refund_request_builder->setTradeNo($trade_no);
+ $refund_request_builder->setRefundAmount($amount);
+ $refund_request_builder->setOutRequestNo($refund_id);
+ $refund_request_builder->setRefundReason(esc_html($reason));
+
+ $config = $this->get_config($order_id);
+ $aop = new AlipayTradeService($config);
+ $response = $aop->Refund($refund_request_builder);
+
+ if (10000 !== absint($response->code)) {
+ self::log(__METHOD__ . ' Refund Error: ' . wc_print_r($response, true));
+
+ $result = new WP_Error('error', $response->msg . '; ' . $response->sub_msg);
+ } else {
+ self::log(__METHOD__ . ' Refund Result: ' . wc_print_r($response, true));
+
+ $result = $response;
}
+
+ return $result;
}
protected function get_config($order_id = 0)
@@ -390,41 +376,16 @@ class WC_Alipay extends WC_Payment_Gateway
return $config;
}
- protected function get_easy_sdk_config()
+ protected static function log($message, $level = 'info', $force = false)
{
- $config = new \Alipay\EasySDK\Kernel\Config();
- $config->protocol = 'https';
- $config->gatewayHost = ('yes' === $this->get_option('sandbox')) ? 'openapi.alipaydev.com' : 'openapi.alipay.com';
- $config->signType = 'RSA2';
- $config->appId = $this->get_option('appid');
- $config->merchantPrivateKey = $this->get_option('private_key');
- $config->alipayPublicKey = $this->get_option('public_key');
- $config->notifyUrl = $this->notify_url;
-
- return $config;
- }
- protected static function log($message, $level = 'info', $force = false, $context = array())
- {
if (self::$log_enabled || $force) {
+
if (empty(self::$log)) {
self::$log = wc_get_logger();
}
- $default_context = array(
- 'source' => self::GATEWAY_ID,
- 'timestamp' => current_time('mysql'),
- 'user_id' => get_current_user_id(),
- 'ip_address' => WC_Geolocation::get_ip_address(),
- );
-
- $context = array_merge($default_context, $context);
-
- if (is_array($message) || is_object($message)) {
- $message = wc_print_r($message, true);
- }
-
- self::$log->log($level, $message, $context);
+ self::$log->log($level, $message, array('source' => self::GATEWAY_ID));
}
}
@@ -462,42 +423,78 @@ class WC_Alipay extends WC_Payment_Gateway
$order = new WC_Order($order_id);
if (!$order || $order->is_paid()) {
+
return;
}
- $total = $this->maybe_convert_amount($order->get_total());
- $out_trade_no = 'WooA' . $order_id . '-' . current_time('timestamp');
- $subject = $this->get_order_title($order);
- $return_url = $this->get_return_url($order);
+ Woo_Alipay::require_lib($this->is_mobile() ? 'payment_mobile' : 'payment_computer');
- \Alipay\EasySDK\Kernel\Factory::setOptions($this->get_easy_sdk_config());
-
- try {
- if ($this->is_mobile()) {
- $result = \Alipay\EasySDK\Kernel\Factory::payment()->wap()->pay($subject, $out_trade_no, $total, '', $return_url);
- } else {
- $result = \Alipay\EasySDK\Kernel\Factory::payment()->page()->pay($subject, $out_trade_no, $total, $return_url);
- }
-
- if (isset($result->body)) {
- echo $result->body;
- return;
- }
- } catch (Exception $e) {
- self::log('Easy SDK Payment Error: ' . $e->getMessage(), 'error', true);
+ if ($result instanceof WP_Error) {
+ self::log(__METHOD__ . ' Order #' . $order_id . ': ' . wc_print_r($result));
}
+ $total = $this->maybe_convert_amount($order->get_total());
+
+ if ($this->is_mobile()) {
+ $pay_request_builder = new AlipayTradeWapPayContentBuilder();
+ } else {
+ $pay_request_builder = new AlipayTradePagePayContentBuilder();
+ }
+
+ $pay_request_builder->setBody($this->get_order_title($order, true));
+ $pay_request_builder->setSubject($this->get_order_title($order));
+ $pay_request_builder->setTotalAmount($total);
+ $pay_request_builder->setOutTradeNo('WooA' . $order_id . '-' . current_time('timestamp'));
+
+ if ($this->is_mobile()) {
+ $pay_request_builder->setTimeExpress('15m');
+ }
+
+ $config = $this->get_config($order_id);
+ $aop = new AlipayTradeService($config);
$dispatcher_form = false;
global $wpdb;
try {
- $order->add_meta_data('alipay_initalRequest', $out_trade_no, true);
- $order->save();
+ ob_start();
- set_query_var('dispatcher_form', $result->body);
+ if ($this->is_mobile()) {
+ $html = $aop->wapPay($pay_request_builder, $config['return_url'], $config['notify_url']);
+ } else {
+ $html = $aop->pagePay($pay_request_builder, $config['return_url'], $config['notify_url']);
+ }
+
+ $dom = new DOMDocument();
+ $dom->loadHTML($html);
+ $forms = $dom->getElementsByTagName('form');
+ $payUrl = '';
+ foreach ($forms as $form) {
+ $action = $form->getAttribute('action');
+ if (strpos($action, 'https://openapi.alipay.com/gateway.do') !== false) {
+ $payUrl = $action;
+ $inputs = $form->getElementsByTagName('input');
+ foreach ($inputs as $input) {
+ $name = $input->getAttribute('name');
+ $value = urlencode($input->getAttribute('value'));
+ $params[$name] = $value;
+ if (!empty($name)) {
+ $payUrl .= "&$name=$value";
+ }
+ }
+ break;
+ }
+ }
+ $order->add_meta_data('alipay_initalRequest', $payUrl, true);
+ $order->save();
+ //$order->add_meta_data('alipay_initalRequest', $r['alipay_trade_page_pay_response']['pay_url'], true);
+
+ set_query_var('dispatcher_form', ob_get_clean());
} catch (Exception $e) {
+ ob_end_clean();
+
$message = ' Caught an exception when trying to generate the Alipay redirection form: ';
+
self::log(__METHOD__ . $message . wc_print_r($e, true), 'error');
$order->update_status('failed', $e->getMessage());
WC()->cart->empty_cart();
@@ -566,16 +563,19 @@ class WC_Alipay extends WC_Payment_Gateway
{
echo '
' . esc_html(__('Alipay is a simple, secure and fast online payment method.', 'woo-alipay')) . '
'; - - echo ''; - printf( - __('需要配置帮助?请查看 %1$s 获取详细的配置指南和文档。', 'woo-alipay'), - '' . __('官方文档', 'woo-alipay') . '' - ); - echo '
'; - echo '