diff --git a/app/api/controller/PayController.php b/app/api/controller/PayController.php index a891d6d..ea84f05 100644 --- a/app/api/controller/PayController.php +++ b/app/api/controller/PayController.php @@ -5,6 +5,9 @@ namespace app\api\controller; use app\common\enum\user\UserTerminalEnum; use app\common\service\pay\WeChatPayService; +use app\Request; +use Error; +use support\Log; /** * 支付 diff --git a/app/common/logic/PaymentLogic.php b/app/common/logic/PaymentLogic.php index 5efa536..76b0e8e 100644 --- a/app/common/logic/PaymentLogic.php +++ b/app/common/logic/PaymentLogic.php @@ -17,7 +17,9 @@ namespace app\common\logic; use app\common\enum\PayEnum; use app\common\service\pay\WeChatPayService; - +use Webman\Config; +use Yansongda\Pay\Pay; +use app\common\model\user\UserAuth; /** * 支付逻辑 @@ -26,8 +28,18 @@ use app\common\service\pay\WeChatPayService; */ class PaymentLogic extends BaseLogic { + /** + * 授权信息 + * @var UserAuth|array|\think\Model + */ + protected $auth; + public function __construct() + { + $config = Config::get('payment'); + Pay::config($config); + } /** * @notes 支付 * @param $payWay @@ -54,10 +66,26 @@ class PaymentLogic extends BaseLogic } switch ($payWay) { case PayEnum::WECHAT_PAY: - $payService = (new WeChatPayService($terminal, $order['uid'] ?? null)); - $order['pay_sn'] = $paySn; - $order['redirect_url'] = $redirectUrl; - $result = $payService->pay($from, $order); + // $payService = (new WeChatPayService($terminal, $order['uid'] ?? null)); + // $order['pay_sn'] = $paySn; + // $order['redirect_url'] = $redirectUrl; + // $result = $payService->pay($from, $order); + $auth = UserAuth::where(['user_id' => $order['uid'], 'terminal' => $terminal])->findOrEmpty(); + + $order = [ + 'out_trade_no' => $paySn, + 'description' => '商品', + 'amount' => [ + 'total' => intval($order['actual'] * 100), + 'currency' => 'CNY', + ], + "payer" => [ + "openid" => $auth['openid']??0 + ], + 'attach' => $from + ]; + + $result = Pay::wechat()->mini($order); break; default: self::$error = '订单异常'; diff --git a/app/common/service/pay/WeChatPayService.php b/app/common/service/pay/WeChatPayService.php index dee38ad..f3a9bb2 100644 --- a/app/common/service/pay/WeChatPayService.php +++ b/app/common/service/pay/WeChatPayService.php @@ -15,6 +15,8 @@ use app\Request; use EasyWeChat\Pay\Application; use EasyWeChat\Pay\Message; use support\Log; +use Webman\Config; +use Yansongda\Pay\Pay; /** * 微信支付 @@ -92,7 +94,6 @@ class WeChatPayService extends BasePayService 'pay_way' => PayEnum::WECHAT_PAY ]; } catch (\Exception $e) { - d($e); $this->setError($e->getMessage()); return false; } @@ -235,33 +236,36 @@ class WeChatPayService extends BasePayService */ public function notify() { - Log::error(json_encode(Request()->post())); + $config = Config::get('payment'); + Pay::config($config); + $result = Pay::wechat()->callback(request()->post()); +d($result); + // Log::error(json_encode(Request()->post())); + // $server = $this->app->getServer(); + // // 支付通知 + // $server->handlePaid(function (Message $message) { + // if ($message['trade_state'] === 'SUCCESS') { + // $extra['transaction_id'] = $message['transaction_id']; + // $attach = $message['attach']; + // $message['out_trade_no'] = mb_substr($message['out_trade_no'], 0, 18); + // switch ($attach) { + // case 'cashierclass': + // $order = Cashierclass::where(['number' => $message['out_trade_no']])->findOrEmpty(); + // if($order->isEmpty() || $order->paid == PayEnum::ISPAID) { + // return true; + // } + // PayNotifyLogic::handle('cashierclass', $message['out_trade_no'], $extra); + // break; + // } + // } + // return true; + // }); - $server = $this->app->getServer(); - // 支付通知 - $server->handlePaid(function (Message $message) { - if ($message['trade_state'] === 'SUCCESS') { - $extra['transaction_id'] = $message['transaction_id']; - $attach = $message['attach']; - $message['out_trade_no'] = mb_substr($message['out_trade_no'], 0, 18); - switch ($attach) { - case 'cashierclass': - $order = Cashierclass::where(['number' => $message['out_trade_no']])->findOrEmpty(); - if($order->isEmpty() || $order->paid == PayEnum::ISPAID) { - return true; - } - PayNotifyLogic::handle('cashierclass', $message['out_trade_no'], $extra); - break; - } - } - return true; - }); - - // 退款通知 - $server->handleRefunded(function (Message $message) { - return true; - }); - return $server->serve(); + // // 退款通知 + // $server->handleRefunded(function (Message $message) { + // return true; + // }); + // return $server->serve(); } diff --git a/composer.json b/composer.json index 4f40e4f..b8aa62f 100644 --- a/composer.json +++ b/composer.json @@ -44,10 +44,11 @@ "doctrine/annotations": "^1.14", "illuminate/redis": "^10.22", "symfony/cache": "^6.4", - "yansongda/pay": "^3.6", "tinywan/jwt": "^1.9", "next/var-dumper": "^0.1.0", - "w7corp/easywechat": "^6.8" + "w7corp/easywechat": "^6.8", + "yansongda/pay": "^3.6", + "hyperf/pimple": "~2.2.0" }, "suggest": { "ext-event": "For better performance. " diff --git a/composer.lock b/composer.lock index ac3e423..358e89e 100644 --- a/composer.lock +++ b/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": "cb269cd47d94c38e34c51802a740203d", + "content-hash": "31c73aec55a41927680c578e301dcb28", "packages": [ { "name": "aliyuncs/oss-sdk-php", @@ -1336,6 +1336,360 @@ ], "time": "2023-12-03T19:50:20+00:00" }, + { + "name": "hyperf/context", + "version": "v3.1.15", + "source": { + "type": "git", + "url": "https://github.com/hyperf/context.git", + "reference": "ad913fd50eb5f738c038e172c120bc6956c0da69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/context/zipball/ad913fd50eb5f738c038e172c120bc6956c0da69", + "reference": "ad913fd50eb5f738c038e172c120bc6956c0da69", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/engine": "^2.0", + "php": ">=8.1" + }, + "suggest": { + "swow/psr7-plus": "Required to use RequestContext and ResponseContext" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Context\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A coroutine/application context library.", + "homepage": "https://hyperf.io", + "keywords": [ + "Context", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-03-23T11:28:51+00:00" + }, + { + "name": "hyperf/contract", + "version": "v3.1.2", + "source": { + "type": "git", + "url": "https://github.com/hyperf/contract.git", + "reference": "f5379df6df65363d645506f373888372135ac0c6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/contract/zipball/f5379df6df65363d645506f373888372135ac0c6", + "reference": "f5379df6df65363d645506f373888372135ac0c6", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Contract\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The contracts of Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-12-11T03:14:01+00:00" + }, + { + "name": "hyperf/engine", + "version": "v2.10.5", + "source": { + "type": "git", + "url": "https://github.com/hyperf/engine.git", + "reference": "b3e1a025e388815612815a0b08fc4f2439140676" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/engine/zipball/b3e1a025e388815612815a0b08fc4f2439140676", + "reference": "b3e1a025e388815612815a0b08fc4f2439140676", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/engine-contract": "~1.9.0", + "php": ">=8.0" + }, + "conflict": { + "ext-swoole": "<5.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "hyperf/guzzle": "^3.0", + "hyperf/http-message": "^3.0", + "mockery/mockery": "^1.5", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^9.4", + "swoole/ide-helper": "5.*" + }, + "suggest": { + "ext-sockets": "*", + "ext-swoole": ">=5.0", + "hyperf/http-message": "Required to use ResponseEmitter.", + "psr/http-message": "Required to use WebSocket Frame." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.10-dev" + }, + "hyperf": { + "config": "Hyperf\\Engine\\ConfigProvider" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Engine\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Coroutine engine provided by swoole.", + "keywords": [ + "engine", + "hyperf", + "php", + "swoole" + ], + "support": { + "issues": "https://github.com/hyperf/engine/issues", + "source": "https://github.com/hyperf/engine/tree/v2.10.5" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-03-12T06:06:19+00:00" + }, + { + "name": "hyperf/engine-contract", + "version": "v1.9.1", + "source": { + "type": "git", + "url": "https://github.com/hyperf/engine-contract.git", + "reference": "fec2e45f35404b2e5b4c3eaf1b0dce67d60771eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/engine-contract/zipball/fec2e45f35404b2e5b4c3eaf1b0dce67d60771eb", + "reference": "fec2e45f35404b2e5b4c3eaf1b0dce67d60771eb", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "mockery/mockery": "^1.0", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": ">=7.0", + "psr/http-message": "^1.0", + "swoole/ide-helper": "^4.5" + }, + "suggest": { + "psr/http-message": "Required to use WebSocket Frame." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Engine\\Contract\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Contract for Coroutine Engine", + "keywords": [ + "contract", + "coroutine", + "engine", + "hyperf", + "php" + ], + "support": { + "issues": "https://github.com/hyperf/engine-contract/issues", + "source": "https://github.com/hyperf/engine-contract/tree/v1.9.1" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-12-15T07:37:14+00:00" + }, + { + "name": "hyperf/pimple", + "version": "v2.2.2", + "source": { + "type": "git", + "url": "https://github.com/hyperf-cloud/pimple-integration.git", + "reference": "7bd07745c256b83679471c06ec2a11e901d37277" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf-cloud/pimple-integration/zipball/7bd07745c256b83679471c06ec2a11e901d37277", + "reference": "7bd07745c256b83679471c06ec2a11e901d37277", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/context": "^3.0", + "hyperf/contract": "^3.0", + "php": ">=8.0", + "pimple/pimple": "^3.3" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "hyperf/support": "^3.0", + "mockery/mockery": "^1.3", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": ">=7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + }, + "hyperf": { + "config": "Hyperf\\Pimple\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Pimple\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Pimple Container", + "keywords": [ + "container", + "hyperf", + "php", + "psr11" + ], + "support": { + "issues": "https://github.com/hyperf-cloud/pimple-integration/issues", + "source": "https://github.com/hyperf-cloud/pimple-integration/tree/v2.2.2" + }, + "time": "2023-06-10T04:41:29+00:00" + }, { "name": "illuminate/collections", "version": "v10.48.4", @@ -2530,112 +2884,6 @@ ], "time": "2024-03-08T06:41:54+00:00" }, - { - "name": "overtrue/wechat", - "version": "6.7.4", - "source": { - "type": "git", - "url": "https://github.com/w7corp/easywechat.git", - "reference": "9cc301d21584a63b13ae21b85a0ea878fa6e4a4f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/w7corp/easywechat/zipball/9cc301d21584a63b13ae21b85a0ea878fa6e4a4f", - "reference": "9cc301d21584a63b13ae21b85a0ea878fa6e4a4f", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-curl": "*", - "ext-fileinfo": "*", - "ext-libxml": "*", - "ext-openssl": "*", - "ext-simplexml": "*", - "ext-sodium": "*", - "monolog/monolog": "^2.2", - "nyholm/psr7": "^1.5", - "nyholm/psr7-server": "^1.0", - "overtrue/socialite": "^3.5|^4.0.1", - "php": ">=8.0.2", - "psr/http-client": "^1.0", - "psr/simple-cache": "^1.0|^2.0|^3.0", - "symfony/cache": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/mime": "^5.4|^6.0", - "symfony/polyfill-php81": "^1.25", - "symfony/psr-http-message-bridge": "^2.1.2" - }, - "require-dev": { - "brainmaestro/composer-git-hooks": "^2.8", - "friendsofphp/php-cs-fixer": "^3.5.0", - "jetbrains/phpstorm-attributes": "^1.0", - "mikey179/vfsstream": "^1.6", - "mockery/mockery": "^1.4.4", - "phpstan/phpstan": "^1.0", - "phpunit/phpunit": "^9.5", - "symfony/var-dumper": "^5.2" - }, - "type": "library", - "extra": { - "hooks": { - "pre-commit": [ - "composer check-style", - "composer phpstan", - "composer test" - ], - "pre-push": [ - "composer check-style" - ], - "config": { - "stop-on-failure": [ - "pre-commit", - "pre-push" - ] - } - } - }, - "autoload": { - "psr-4": { - "EasyWeChat\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "overtrue", - "email": "anzhengchao@gmail.com" - } - ], - "description": "微信SDK", - "keywords": [ - "easywechat", - "sdk", - "wechat", - "weixin", - "weixin-sdk" - ], - "support": { - "issues": "https://github.com/w7corp/easywechat/issues", - "source": "https://github.com/w7corp/easywechat/tree/6.7.4" - }, - "funding": [ - { - "url": "https://github.com/overtrue", - "type": "github" - } - ], - "abandoned": "w7corp/easywechat", - "time": "2022-08-29T09:32:29+00:00" - }, { "name": "php-di/invoker", "version": "2.3.4", @@ -3019,6 +3267,65 @@ ], "time": "2023-11-12T21:59:55+00:00" }, + { + "name": "pimple/pimple", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1 || ^2.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^5.4@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Pimple": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple, a simple Dependency Injection Container", + "homepage": "https://pimple.symfony.com", + "keywords": [ + "container", + "dependency injection" + ], + "support": { + "source": "https://github.com/silexphp/Pimple/tree/v3.5.0" + }, + "time": "2021-10-28T11:13:42+00:00" + }, { "name": "psr/cache", "version": "3.0.0", diff --git a/config/payment.php b/config/payment.php new file mode 100644 index 0000000..7f21c15 --- /dev/null +++ b/config/payment.php @@ -0,0 +1,80 @@ + [ + 'default' => [ + // 必填-支付宝分配的 app_id + 'app_id' => '20160909004708941', + // 必填-应用私钥 字符串或路径 + 'app_secret_cert' => 'MIIEpAIBAAKCxxxxxxxxxxxxxxP4r3m4OUmD/+XDgCg==', + // 必填-应用公钥证书 路径 + 'app_public_cert_path' => base_path().'/payment/appCertPublicKey_2016090900470841.crt', + // 必填-支付宝公钥证书 路径 + 'alipay_public_cert_path' => base_path().'/payment/alipayCertPublicKey_RSA2.crt', + // 必填-支付宝根证书 路径 + 'alipay_root_cert_path' => base_path().'/payment/alipayRootCert.crt', + // 选填-同步回调地址 + 'return_url' => 'https://webman.tinywan.cn/payment/alipay-return', + // 选填-异步回调地址 + 'notify_url' => 'https://webman.tinywan.cn/payment/alipay-notify', + // 选填-服务商模式下的服务商 id,当 mode 为 Pay::MODE_SERVICE 时使用该参数 + 'service_provider_id' => '', + // 选填-默认为正常模式。可选为: MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE + 'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX, + ] + ], + 'wechat' => [ + 'default' => [ + // 必填-商户号,服务商模式下为服务商商户号 + 'mch_id' => '1654274867', + // 必填-商户秘钥 + 'mch_secret_key' => 'F6C2A57790C667607D8E8C0C00CCF9B6', + // 必填-商户私钥 字符串或路径 + 'mch_secret_cert' => getenv(runtime_path('/cart/c208f16ad08e6d2516e0b73e6d0ab8da.pem')), + // 必填-商户公钥证书路径 + 'mch_public_cert_path' =>getenv(runtime_path('/cart/82fdc3426e3aeb9e5df91a9547ac5ef3.pem')), + // 必填 + 'notify_url' => 'https://erp.lihaink.cn/api/pay/notifyMnp', + // 选填-公众号 的 app_id + 'mp_app_id' => '', + // 选填-小程序 的 app_id + 'mini_app_id' => 'wxdee751952c8c2027', + // 选填-app 的 app_id + 'app_id' => '', + // 选填-合单 app_id + 'combine_app_id' => '', + // 选填-合单商户号 + 'combine_mch_id' => '', + // 选填-服务商模式下,子公众号 的 app_id + 'sub_mp_app_id' => '', + // 选填-服务商模式下,子 app 的 app_id + 'sub_app_id' => '', + // 选填-服务商模式下,子小程序 的 app_id + 'sub_mini_app_id' => '', + // 选填-服务商模式下,子商户id + 'sub_mch_id' => '', + // 选填-微信公钥证书路径, optional,强烈建议 php-fpm 模式下配置此参数 + 'wechat_public_cert_path' => [ + ], + // 选填-默认为正常模式。可选为: MODE_NORMAL, MODE_SERVICE + 'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX, + ] + ], + 'logger' => [ + 'enable' => false, + 'file' => runtime_path().'/logs/alipay.log', + 'level' => 'debug', // 建议生产环境等级调整为 info,开发环境为 debug + 'type' => 'single', // optional, 可选 daily. + 'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天 + ], + 'http' => [ // optional + 'timeout' => 5.0, + 'connect_timeout' => 5.0, + // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html) + ], + '_force' => true, +]; \ No newline at end of file