[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-8339":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":22,"hasPages":24,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":34,"readmeContent":35,"aiSummary":36,"trendingCount":16,"starSnapshotCount":16,"syncStatus":37,"lastSyncTime":38,"discoverSource":39},8339,"pay","yansongda\u002Fpay","yansongda","可能是我用过的最优雅的 Alipay\u002FWeChat\u002FDouyin\u002FUnipay\u002F江苏银行 的支付 SDK 扩展包了","http:\u002F\u002Fpay.yansongda.cn",null,"PHP",5345,1050,153,26,0,1,18,3,69.36,"MIT License",false,"master",true,[26,27,28,5,29,30,31,32,33,7],"alipay","douyin","laravel-pay","payment","php","unipay","wechat","weixin","2026-06-12 04:00:38","\u003Cp align=\"center\">\n      \u003Ca href=\"https:\u002F\u002Fpay.yansongda.cn\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Cimg width=\"200\" src=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fyansongda\u002Fpay\u002Fweb\u002Fpublic\u002Fimages\u002Flogo.png\" alt=\"Logo\">\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n    \u003Ca href=\"https:\u002F\u002Fcodecov.io\u002Fgh\u002Fyansongda\u002Fpay\" >\u003Cimg src=\"https:\u002F\u002Fcodecov.io\u002Fgh\u002Fyansongda\u002Fpay\u002Fbranch\u002Fmaster\u002Fgraph\u002Fbadge.svg?token=tYMV0YT5jj\"\u002F>\u003C\u002Fa>\n    \u003Ca href=\"https:\u002F\u002Fscrutinizer-ci.com\u002Fg\u002Fyansongda\u002Fpay\u002F?branch=master\">\u003Cimg src=\"https:\u002F\u002Fscrutinizer-ci.com\u002Fg\u002Fyansongda\u002Fpay\u002Fbadges\u002Fquality-score.png?b=master\" alt=\"scrutinizer\">\u003C\u002Fa>\n    \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fyansongda\u002Fpay\u002Factions\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fyansongda\u002Fpay\u002Fworkflows\u002FTester\u002Fbadge.svg\" alt=\"Tester Status\">\u003C\u002Fa>\n    \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fyansongda\u002Fpay\u002Factions\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fyansongda\u002Fpay\u002Fworkflows\u002FCode%20Coverage\u002Fbadge.svg\" alt=\"Code Coverage Status\">\u003C\u002Fa>\n    \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fyansongda\u002Fpay\u002Factions\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fyansongda\u002Fpay\u002Fworkflows\u002FCoding%20Style\u002Fbadge.svg\" alt=\"Coding Style Status\">\u003C\u002Fa>\n    \u003Ca href=\"https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fyansongda\u002Fpay\">\u003Cimg src=\"https:\u002F\u002Fposer.pugx.org\u002Fyansongda\u002Fpay\u002Fv\u002Fstable\" alt=\"Stable Version\">\u003C\u002Fa>\n    \u003Ca href=\"https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fyansongda\u002Fpay\">\u003Cimg src=\"https:\u002F\u002Fposer.pugx.org\u002Fyansongda\u002Fpay\u002Fdownloads\" alt=\"Total Downloads\">\u003C\u002Fa>\n    \u003Ca href=\"https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fyansongda\u002Fpay\">\u003Cimg src=\"https:\u002F\u002Fposer.pugx.org\u002Fyansongda\u002Fpay\u002Flicense\" alt=\"License\">\u003C\u002Fa>\n\u003C\u002Fp>\n\n## 前言\n\nv3 版与 v2 版在底层有很大的不同，基础架构做了重新的设计，更易扩展，使用起来更方便。\n\n开发了多次支付宝与微信支付后，很自然产生一种反感，惰性又来了，想在网上找相关的轮子，可是一直没有找到一款自己觉得逞心如意的，要么使用起来太难理解，要么文件结构太杂乱，只有自己撸起袖子干了。\n\n欢迎 Star，欢迎 PR！\n\nhyperf 扩展包请 [传送至这里](https:\u002F\u002Fgithub.com\u002Fyansongda\u002Fhyperf-pay)\n\nlaravel 扩展包请 [传送至这里](https:\u002F\u002Fgithub.com\u002Fyansongda\u002Flaravel-pay)\n\nyii 扩展包请 [传送至这里](https:\u002F\u002Fgithub.com\u002Fguanguans\u002Fyii-pay)\n\n## 特点\n\n- 多租户支持\n- Swoole 支持\n- 灵活的插件机制\n- 丰富的事件系统\n- 命名不那么乱七八糟\n- 隐藏开发者不需要关注的细节\n- 根据支付宝、微信最新 API 开发而成\n- 高度抽象的类，免去各种拼json与xml的痛苦\n- 文件结构清晰易理解，可以随心所欲添加本项目中没有的支付网关\n- 方法使用更优雅，不必再去研究那些奇怪的的方法名或者类名是做啥用的\n- 内置自动获取微信公共证书方法，再也不用再费劲去考虑第一次获取证书的的问题了\n- 符合 PSR2、PSR3、PSR4、PSR7、PSR11、PSR14、PSR18 等各项标准，你可以各种方便的与你的框架集成\n\n## 版本计划\n\n[https:\u002F\u002Fpay.yansongda.cn\u002Fdocs\u002Fv3\u002Foverview\u002Fplanning](https:\u002F\u002Fpay.yansongda.cn\u002Fdocs\u002Fv3\u002Foverview\u002Fplanning)\n\n## 详细文档\n\n[https:\u002F\u002Fpay.yansongda.cn](https:\u002F\u002Fpay.yansongda.cn)\n\n## 支持的支付方法\n\nyansongda\u002Fpay 100% 兼容 支付宝\u002F微信\u002F银联 所有功能（包括服务商功能），只需通过「插件机制」引入即可。\n\n同时，SDK 直接支持内置了以下插件，详情请查阅文档。\n\n### 支付宝\n\n- 电脑支付\n- 手机网站支付\n- APP 支付\n- 刷卡支付\n- 扫码支付\n- 账户转账\n- 小程序支付\n- ...\n\n### 微信\n\n- 公众号支付\n- 小程序支付\n- H5 支付\n- 扫码支付\n- APP 支付\n- 刷卡支付\n- ...\n\n### 抖音\n\n- 小程序支付\n- ...\n\n### 银联\n\n- 手机网站支付\n- 电脑网站支付\n- 刷卡支付\n- 扫码支付\n- ...\n- \n### 江苏银行(e融支付)\n\n- 聚合扫码支付(微信,支付宝,银联,e融)\n- ...\n\n## 安装\n```shell\ncomposer require yansongda\u002Fpay:~3.7.0 -vvv\n```\n\n## 深情一撇\n\n### 支付宝\n```php\n\u003C?php\n\nnamespace App\\Http\\Controllers;\n\nuse Yansongda\\Pay\\Pay;\n\nclass AlipayController\n{\n    protected $config = [\n        'alipay' => [\n            'default' => [\n                \u002F\u002F 必填-支付宝分配的 app_id\n                'app_id' => '2016082000295641',\n                \u002F\u002F 必填-应用私钥 字符串或路径\n                'app_secret_cert' => '89iZ2iC16H6\u002F6a3YcP+hDZUjiNGQx9cuwi9eJyykvcwhD...',\n                \u002F\u002F 必填-应用公钥证书 路径\n                'app_public_cert_path' => '\u002FUsers\u002Fyansongda\u002Fpay\u002Fcert\u002FappCertPublicKey_2016082000295641.crt',\n                \u002F\u002F 必填-支付宝公钥证书 路径\n                'alipay_public_cert_path' => '\u002FUsers\u002Fyansongda\u002Fpay\u002Fcert\u002FalipayCertPublicKey_RSA2.crt',\n                \u002F\u002F 必填-支付宝根证书 路径\n                'alipay_root_cert_path' => '\u002FUsers\u002Fyansongda\u002Fpay\u002Fcert\u002FalipayRootCert.crt',\n                'return_url' => 'https:\u002F\u002Fyansongda.cn\u002Falipay\u002Freturn',\n                'notify_url' => 'https:\u002F\u002Fyansongda.cn\u002Falipay\u002Fnotify',\n                \u002F\u002F 选填-第三方应用授权token\n                'app_auth_token' => '',\n                \u002F\u002F 选填-服务商模式下的服务商 id，当 mode 为 Pay::MODE_SERVICE 时使用该参数\n                'service_provider_id' => '',\n                \u002F\u002F 选填-默认为正常模式。可选为： MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE\n                'mode' => Pay::MODE_NORMAL,\n            ],       \n        ],   \n        'logger' => [ \u002F\u002F optional\n            'enable' => false,\n            'file' => '.\u002Flogs\u002Falipay.log',\n            'level' => 'info', \u002F\u002F 建议生产环境等级调整为 info，开发环境为 debug\n            'type' => 'single', \u002F\u002F optional, 可选 daily.\n            'max_file' => 30, \u002F\u002F optional, 当 type 为 daily 时有效，默认 30 天\n        ],\n        'http' => [ \u002F\u002F optional\n            'timeout' => 5.0,\n            'connect_timeout' => 5.0,\n            \u002F\u002F 更多配置项请参考 [Guzzle](https:\u002F\u002Fguzzle-cn.readthedocs.io\u002Fzh_CN\u002Flatest\u002Frequest-options.html)\n        ],\n    ];\n\n    public function web()\n    {\n        Pay::config($this->config);\n        \n        $result = Pay::alipay()->web([\n            'out_trade_no' => ''.time(),\n            'total_amount' => '0.01',\n            'subject' => 'yansongda 测试 - 1',\n        ]);\n        \n        return $result;\n    }\n\n    public function returnCallback()\n    {\n        Pay::config($this->config);\n    \n        $data = Pay::alipay()->callback(); \u002F\u002F 是的，验签就这么简单！\n\n        \u002F\u002F 订单号：$data->out_trade_no\n        \u002F\u002F 支付宝交易号：$data->trade_no\n        \u002F\u002F 订单总金额：$data->total_amount\n    }\n\n    public function notifyCallback()\n    {\n        Pay::config($this->config);\n        \n        try{\n            $data = Pay::alipay()->callback(); \u002F\u002F 是的，验签就这么简单！\n\n            \u002F\u002F 请自行对 trade_status 进行判断及其它逻辑进行判断，在支付宝的业务通知中，只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时，支付宝才会认定为买家付款成功。\n            \u002F\u002F 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号；\n            \u002F\u002F 2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额）；\n            \u002F\u002F 3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id\u002Fseller_email）；\n            \u002F\u002F 4、验证app_id是否为该商户本身。\n            \u002F\u002F 5、其它业务逻辑情况\n        } catch (\\Throwable $e) {\n            dd($e);\n        }\n\n        return Pay::alipay()->success();\n    }\n}\n```\n\n### 微信\n```php\n\u003C?php\n\nnamespace App\\Http\\Controllers;\n\nuse Yansongda\\Pay\\Pay;\n\nclass WechatController\n{\n    protected $config = [\n        'wechat' => [\n            'default' => [\n                \u002F\u002F 必填-商户号\n                'mch_id' => '',\n                \u002F\u002F 选填-v2商户私钥\n                'mch_secret_key_v2' => '',\n                \u002F\u002F 必填-v3商户秘钥\n                'mch_secret_key' => '',\n                \u002F\u002F 必填-商户私钥 字符串或路径\n                'mch_secret_cert' => '',\n                \u002F\u002F 必填-商户公钥证书路径\n                'mch_public_cert_path' => '',\n                \u002F\u002F 必填\n                'notify_url' => 'https:\u002F\u002Fyansongda.cn\u002Fwechat\u002Fnotify',\n                \u002F\u002F 选填-公众号 的 app_id\n                'mp_app_id' => '',\n                \u002F\u002F 选填-小程序 的 app_id\n                'mini_app_id' => '',\n                \u002F\u002F 选填-app 的 app_id\n                'app_id' => '',\n                \u002F\u002F 选填-服务商模式下，子公众号 的 app_id\n                'sub_mp_app_id' => '',\n                \u002F\u002F 选填-服务商模式下，子 app 的 app_id\n                'sub_app_id' => '',\n                \u002F\u002F 选填-服务商模式下，子小程序 的 app_id\n                'sub_mini_app_id' => '',\n                \u002F\u002F 选填-服务商模式下，子商户id\n                'sub_mch_id' => '',\n                \u002F\u002F 选填-微信平台公钥证书路径, optional，强烈建议 php-fpm 模式下配置此参数\n                'wechat_public_cert_path' => [\n                    '45F59D4DABF31918AFCEC556D5D2C6E376675D57' => __DIR__.'\u002FCert\u002Fwechatpay_45F***D57.pem',\n                ],\n                \u002F\u002F 选填-默认为正常模式。可选为： MODE_NORMAL, MODE_SERVICE\n                'mode' => Pay::MODE_NORMAL,\n            ]\n        ],\n        'logger' => [ \u002F\u002F optional\n            'enable' => false,\n            'file' => '.\u002Flogs\u002Fwechat.log',\n            'level' => 'info', \u002F\u002F 建议生产环境等级调整为 info，开发环境为 debug\n            'type' => 'single', \u002F\u002F optional, 可选 daily.\n            'max_file' => 30, \u002F\u002F optional, 当 type 为 daily 时有效，默认 30 天\n        ],\n        'http' => [ \u002F\u002F optional\n            'timeout' => 5.0,\n            'connect_timeout' => 5.0,\n            \u002F\u002F 更多配置项请参考 [Guzzle](https:\u002F\u002Fguzzle-cn.readthedocs.io\u002Fzh_CN\u002Flatest\u002Frequest-options.html)\n        ],\n    ];\n\n    public function index()\n    {\n        Pay::config($this->config);\n        \n        $order = [\n            'out_trade_no' => time().'',\n            'description' => 'subject-测试',\n            'amount' => [\n                 'total' => 1,\n            ],\n            'payer' => [\n                 'openid' => 'onkVf1FjWS5SBxxxxxxxx',\n            ],\n        ];\n\n        $pay = Pay::wechat()->mp($order);\n\n        \u002F\u002F $pay->appId\n        \u002F\u002F $pay->timeStamp\n        \u002F\u002F $pay->nonceStr\n        \u002F\u002F $pay->package\n        \u002F\u002F $pay->signType\n    }\n\n    public function callback()\n    {\n        Pay::config($this->config);\n        \n        try{\n            $data = Pay::wechat()->callback(); \u002F\u002F 是的，验签就这么简单！\n        } catch (\\Throwable $e) {\n            dd($e);\n        }\n        \n        return Pay::wechat()->success();\n    }\n}\n```\n\n### 抖音\n```php\n\u003C?php\n\nnamespace App\\Http\\Controllers;\n\nuse Yansongda\\Pay\\Pay;\n\nclass DouyinController\n{\n    protected $config = [\n        'douyin' => [\n            'default' => [\n                \u002F\u002F 选填-商户号\n                \u002F\u002F 抖音开放平台 --> 应用详情 --> 支付信息 --> 产品管理 --> 商户号\n                'mch_id' => '73744242495132490630',\n                \u002F\u002F 必填-支付 Token，用于支付回调签名\n                \u002F\u002F 抖音开放平台 --> 应用详情 --> 支付信息 --> 支付设置 --> Token(令牌)\n                'mch_secret_token' => 'douyin_mini_token',\n                \u002F\u002F 必填-支付 SALT，用于支付签名\n                \u002F\u002F 抖音开放平台 --> 应用详情 --> 支付信息 --> 支付设置 --> SALT\n                'mch_secret_salt' => 'oDxWDBr4U7FAAQ8hnGDm29i4A6pbTMDKme4WLLvA',\n                \u002F\u002F 必填-小程序 app_id\n                \u002F\u002F 抖音开放平台 --> 应用详情 --> 支付信息 --> 支付设置 --> 小程序appid\n                'mini_app_id' => 'tt226e54d3bd581bf801',\n                \u002F\u002F 选填-抖音开放平台服务商id\n                'thirdparty_id' => '',\n                \u002F\u002F 选填-抖音支付回调地址\n                'notify_url' => 'https:\u002F\u002Fyansongda.cn\u002Fdouyin\u002Fnotify',\n            ],\n        ],\n        'logger' => [ \u002F\u002F optional\n            'enable' => false,\n            'file' => '.\u002Flogs\u002Falipay.log',\n            'level' => 'info', \u002F\u002F 建议生产环境等级调整为 info，开发环境为 debug\n            'type' => 'single', \u002F\u002F optional, 可选 daily.\n            'max_file' => 30, \u002F\u002F optional, 当 type 为 daily 时有效，默认 30 天\n        ],\n        'http' => [ \u002F\u002F optional\n            'timeout' => 5.0,\n            'connect_timeout' => 5.0,\n            \u002F\u002F 更多配置项请参考 [Guzzle](https:\u002F\u002Fguzzle-cn.readthedocs.io\u002Fzh_CN\u002Flatest\u002Frequest-options.html)\n        ],\n    ];\n\n    public function pay()\n    {\n        Pay::config($this->config);\n        \n        $result = Pay::douyin()->mini([\n            'out_order_no' => date('YmdHis').mt_rand(1000, 9999),\n            'total_amount' => 1,\n            'subject' => '闫嵩达 - test - subject - 01',\n            'body' => '闫嵩达 - test - body - 01',\n            'valid_time' => 600,\n            'expand_order_info' => json_encode([\n                'original_delivery_fee' => 15,\n                'actual_delivery_fee' => 10\n            ])\n        ]);\n        \n        return $result;\n    }\n\n    public function callback()\n    {\n        Pay::config($this->config);\n    \n        try{\n            $data = Pay::douyin()->callback(); \u002F\u002F 是的，验签就这么简单！\n        } catch (\\Throwable $e) {\n            dd($e)\n        }\n\n        return Pay::douyin()->success();\n    }\n}\n```\n\n### 江苏银行(e融支付)\n```php\n\u003C?php\n\nnamespace App\\Http\\Controllers;\n\nuse Yansongda\\Pay\\Pay;\n\nclass JsbController\n{\n    protected $config = [\n        'jsb' => [\n            'default' => [\n                \u002F\u002F 服务代码\n                'svr_code' => '',\n                \u002F\u002F 必填-合作商ID\n                'partner_id' => '',\n                \u002F\u002F 必填-公私钥对编号\n                'public_key_code' => '00',\n                \u002F\u002F 必填-商户私钥(加密签名)\n                'mch_secret_cert_path' => '',\n                \u002F\u002F 必填-商户公钥证书路径(提供江苏银行进行验证签名用)\n                'mch_public_cert_path' => '',\n                \u002F\u002F 必填-江苏银行的公钥(用于解密江苏银行返回的数据)\n                'jsb_public_cert_path' => '',\n                \u002F\u002F支付通知地址\n                'notify_url'            => '', \n                \u002F\u002F 选填-默认为正常模式。可选为： MODE_NORMAL:正式环境, MODE_SANDBOX:测试环境\n                'mode' => Pay::MODE_NORMAL,\n            ]\n        ],\n        'logger' => [ \u002F\u002F optional\n            'enable' => false,\n            'file' => '.\u002Flogs\u002Fepay.log',\n            'level' => 'info', \u002F\u002F 建议生产环境等级调整为 info，开发环境为 debug\n            'type' => 'single', \u002F\u002F optional, 可选 daily.\n            'max_file' => 30, \u002F\u002F optional, 当 type 为 daily 时有效，默认 30 天\n        ],\n        'http' => [ \u002F\u002F optional\n            'timeout' => 5.0,\n            'connect_timeout' => 5.0,\n            \u002F\u002F 更多配置项请参考 [Guzzle](https:\u002F\u002Fguzzle-cn.readthedocs.io\u002Fzh_CN\u002Flatest\u002Frequest-options.html)\n        ],\n    ];\n\n    public function index()\n    {\n        Pay::config($this->config);\n        \n        $order = [\n            'outTradeNo' => time().'',\n            'proInfo' => 'subject-测试',\n            'totalFee'=> 1,\n        ];\n\n        $pay = Pay::jsb()->scan($order);\n    }\n\n    public function notifyCallback()\n    {\n        Pay::config($this->config);\n\n        try{\n            $data = Pay::jsb()->callback(); \u002F\u002F 是的，验签就这么简单！\n        } catch (\\Throwable $e) {\n            dd($e);\n        }\n        \n        return Pay::jsb()->success();\n    }\n}\n```\n\n## 代码贡献\n\n由于测试及使用环境的限制，本项目中只开发了「支付宝」、「微信支付」、「抖音支付」、「银联」、「江苏银行」的相关支付网关。\n\n如果您有其它支付网关的需求，或者发现本项目中需要改进的代码，**_欢迎 Fork 并提交 PR！_**\n\n## 赏一杯咖啡吧\n\n![pay](https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fyansongda\u002Fpay\u002Fweb\u002Fpublic\u002Fimages\u002Fpay.jpg)\n\n## LICENSE\n\nMIT\n","yansongda\u002Fpay 是一个为 PHP 开发者设计的支付 SDK 扩展包，支持包括支付宝、微信、抖音、银联和江苏银行在内的多种支付方式。该项目的核心功能包括多租户支持、Swoole 支持、灵活的插件机制以及丰富的事件系统等。它通过高度抽象的类来简化 JSON 和 XML 的处理过程，并且内置了自动获取微信公共证书的方法，使得开发者可以更加专注于业务逻辑的实现。清晰的文件结构也便于用户根据需要添加新的支付网关。此扩展包特别适合需要集成多种支付渠道的应用场景，如电商平台、在线服务提供商等，能够极大提高开发效率并确保代码质量。",2,"2026-06-11 03:17:27","top_language"]