From 669c0180a1c8c9fe62990e6ef8ba7ca4adef93b8 Mon Sep 17 00:00:00 2001 From: Han <137454534@qq.com> Date: Sun, 28 Apr 2024 21:49:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20V2=E7=89=88=E6=9C=AC=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=99=AE=E9=80=9A=E7=BA=A2=E5=8C=85=20(#973)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * V2版本 微信发放普通红包 * V2微信发送普通红包测试单例 --------- Co-authored-by: ohh Co-authored-by: yansongda --- CHANGELOG.md | 6 ++ .../Wechat/V2/Pay/Redpack/SendPlugin.php | 81 +++++++++++++++++++ src/Shortcut/Wechat/RedpackShortcut.php | 32 ++++++++ .../Wechat/V2/Pay/Redpack/SendPluginTest.php | 40 +++++++++ tests/Shortcut/Wechat/RedpackShortcutTest.php | 42 ++++++++++ 5 files changed, 201 insertions(+) create mode 100644 src/Plugin/Wechat/V2/Pay/Redpack/SendPlugin.php create mode 100644 src/Shortcut/Wechat/RedpackShortcut.php create mode 100644 tests/Plugin/Wechat/V2/Pay/Redpack/SendPluginTest.php create mode 100644 tests/Shortcut/Wechat/RedpackShortcutTest.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 24dcbcc05..5f07537e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## v3.7.2 + +### added + +- feat: 微信V2版本支持普通红包(#973) + ## v3.7.1 ### fixed diff --git a/src/Plugin/Wechat/V2/Pay/Redpack/SendPlugin.php b/src/Plugin/Wechat/V2/Pay/Redpack/SendPlugin.php new file mode 100644 index 000000000..6d2cf3347 --- /dev/null +++ b/src/Plugin/Wechat/V2/Pay/Redpack/SendPlugin.php @@ -0,0 +1,81 @@ + $rocket]); + $payload = $rocket->getPayload(); + $params = $rocket->getParams(); + $config = get_wechat_config($params); + + if (Pay::MODE_SERVICE === ($config['mode'] ?? Pay::MODE_NORMAL)) { + $data = $this->service($payload, $config, $params); + } + + $rocket->setPacker(XmlPacker::class) + ->mergePayload(array_merge( + [ + '_url' => 'mmpaymkttransfers/sendredpack', + '_content_type' => 'application/xml', + 'nonce_str' => Str::random(32), + '_http' => [ + 'ssl_key' => $config['mch_secret_cert'], + 'cert' => $config['mch_public_cert_path'], + ], + ], + $data ?? $this->normal($config, $params) + )); + + Logger::info('[Wechat][V2][Pay][Pos][PayPlugin] 插件装载完毕', ['rocket' => $rocket]); + + return $next($rocket); + } + + protected function normal(array $config, array $params): array + { + return [ + 'wxappid' => $config[get_wechat_type_key($params)] ?? '', + 'mch_id' => $config['mch_id'] ?? '', + ]; + } + + protected function service(Collection $payload, array $config, array $params): array + { + $wechatTypeKey = get_wechat_type_key($params); + + return [ + 'wxappid' => $config[$wechatTypeKey] ?? '', + 'mch_id' => $config['mch_id'] ?? '', + 'sub_mch_id' => $payload->get('sub_mch_id', $config['sub_mch_id'] ?? ''), + 'msgappid' => $config['sub_'.$wechatTypeKey], + ]; + } +} diff --git a/src/Shortcut/Wechat/RedpackShortcut.php b/src/Shortcut/Wechat/RedpackShortcut.php new file mode 100644 index 000000000..25d9ce7d5 --- /dev/null +++ b/src/Shortcut/Wechat/RedpackShortcut.php @@ -0,0 +1,32 @@ +plugin = new SendPlugin(); + } + + public function testNormal() + { + $rocket = new Rocket(); + $rocket->setPayload(new Collection( [ + "mch_billno" => "111", + ])); + + $result = $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + $payload = $result->getPayload(); + + self::assertEquals(XmlPacker::class, $result->getPacker()); + self::assertEquals('mmpaymkttransfers/sendredpack', $payload->get('_url')); + self::assertEquals('application/xml', $payload->get('_content_type')); + self::assertEquals('111', $payload->get('mch_billno')); + self::assertEquals('wx55955316af4ef13', $payload->get('wxappid')); + self::assertEquals('1600314069', $payload->get('mch_id')); + self::assertNotEmpty($payload->get('nonce_str')); + } +} diff --git a/tests/Shortcut/Wechat/RedpackShortcutTest.php b/tests/Shortcut/Wechat/RedpackShortcutTest.php new file mode 100644 index 000000000..68d98053b --- /dev/null +++ b/tests/Shortcut/Wechat/RedpackShortcutTest.php @@ -0,0 +1,42 @@ +plugin = new RedpackShortcut(); + } + + public function testDefault() + { + self::assertEquals([ + StartPlugin::class, + SendPlugin::class, + AddPayloadSignaturePlugin::class, + AddPayloadBodyPlugin::class, + AddRadarPlugin::class, + VerifySignaturePlugin::class, + ResponsePlugin::class, + ParserPlugin::class, + ], $this->plugin->getPlugins([])); + } +}