{"id":13459443,"url":"https://github.com/yansongda/pay","last_synced_at":"2025-05-13T15:06:18.191Z","repository":{"id":37735198,"uuid":"100355112","full_name":"yansongda/pay","owner":"yansongda","description":"可能是我用过的最优雅的 Alipay/WeChat/Douyin/Unipay/江苏银行 的支付 SDK 扩展包了","archived":false,"fork":false,"pushed_at":"2025-04-30T19:36:20.000Z","size":2919,"stargazers_count":5150,"open_issues_count":34,"forks_count":1042,"subscribers_count":153,"default_branch":"master","last_synced_at":"2025-05-05T22:41:59.389Z","etag":null,"topics":["alipay","douyin","laravel-pay","pay","payment","php","unipay","wechat","weixin","yansongda"],"latest_commit_sha":null,"homepage":"http://pay.yansongda.cn","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yansongda.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2017-08-15T08:14:02.000Z","updated_at":"2025-05-04T14:35:50.000Z","dependencies_parsed_at":"2024-02-16T03:32:21.462Z","dependency_job_id":"5a2e7a18-6796-4d88-960a-fc289b552c95","html_url":"https://github.com/yansongda/pay","commit_stats":{"total_commits":960,"total_committers":50,"mean_commits":19.2,"dds":"0.15312499999999996","last_synced_commit":"d334efe24123dcea91aaa47bf2f10ca1571abaad"},"previous_names":[],"tags_count":248,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yansongda%2Fpay","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yansongda%2Fpay/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yansongda%2Fpay/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yansongda%2Fpay/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yansongda","download_url":"https://codeload.github.com/yansongda/pay/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253969225,"owners_count":21992262,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alipay","douyin","laravel-pay","pay","payment","php","unipay","wechat","weixin","yansongda"],"created_at":"2024-07-31T09:01:22.505Z","updated_at":"2025-05-13T15:06:18.117Z","avatar_url":"https://github.com/yansongda.png","language":"PHP","readme":"\u003cp align=\"center\"\u003e\n      \u003ca href=\"https://pay.yansongda.cn\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\u003cimg width=\"200\" src=\"https://cdn.jsdelivr.net/gh/yansongda/pay/web/public/images/logo.png\" alt=\"Logo\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://codecov.io/gh/yansongda/pay\" \u003e\u003cimg src=\"https://codecov.io/gh/yansongda/pay/branch/master/graph/badge.svg?token=tYMV0YT5jj\"/\u003e\u003c/a\u003e\n    \u003ca href=\"https://scrutinizer-ci.com/g/yansongda/pay/?branch=master\"\u003e\u003cimg src=\"https://scrutinizer-ci.com/g/yansongda/pay/badges/quality-score.png?b=master\" alt=\"scrutinizer\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/yansongda/pay/actions\"\u003e\u003cimg src=\"https://github.com/yansongda/pay/workflows/Tester/badge.svg\" alt=\"Tester Status\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/yansongda/pay/actions\"\u003e\u003cimg src=\"https://github.com/yansongda/pay/workflows/Code%20Coverage/badge.svg\" alt=\"Code Coverage Status\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/yansongda/pay/actions\"\u003e\u003cimg src=\"https://github.com/yansongda/pay/workflows/Coding%20Style/badge.svg\" alt=\"Coding Style Status\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://packagist.org/packages/yansongda/pay\"\u003e\u003cimg src=\"https://poser.pugx.org/yansongda/pay/v/stable\" alt=\"Stable Version\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://packagist.org/packages/yansongda/pay\"\u003e\u003cimg src=\"https://poser.pugx.org/yansongda/pay/downloads\" alt=\"Total Downloads\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://packagist.org/packages/yansongda/pay\"\u003e\u003cimg src=\"https://poser.pugx.org/yansongda/pay/license\" alt=\"License\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n## 前言\n\nv3 版与 v2 版在底层有很大的不同，基础架构做了重新的设计，更易扩展，使用起来更方便。\n\n开发了多次支付宝与微信支付后，很自然产生一种反感，惰性又来了，想在网上找相关的轮子，可是一直没有找到一款自己觉得逞心如意的，要么使用起来太难理解，要么文件结构太杂乱，只有自己撸起袖子干了。\n\n欢迎 Star，欢迎 PR！\n\nhyperf 扩展包请 [传送至这里](https://github.com/yansongda/hyperf-pay)\n\nlaravel 扩展包请 [传送至这里](https://github.com/yansongda/laravel-pay)\n\nyii 扩展包请 [传送至这里](https://github.com/guanguans/yii-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://pay.yansongda.cn/docs/v3/overview/planning](https://pay.yansongda.cn/docs/v3/overview/planning)\n\n## 详细文档\n\n[https://pay.yansongda.cn](https://pay.yansongda.cn)\n\n## 支持的支付方法\n\nyansongda/pay 100% 兼容 支付宝/微信/银联 所有功能（包括服务商功能），只需通过「插件机制」引入即可。\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/pay:~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' =\u003e [\n            'default' =\u003e [\n                // 必填-支付宝分配的 app_id\n                'app_id' =\u003e '2016082000295641',\n                // 必填-应用私钥 字符串或路径\n                'app_secret_cert' =\u003e '89iZ2iC16H6/6a3YcP+hDZUjiNGQx9cuwi9eJyykvcwhD...',\n                // 必填-应用公钥证书 路径\n                'app_public_cert_path' =\u003e '/Users/yansongda/pay/cert/appCertPublicKey_2016082000295641.crt',\n                // 必填-支付宝公钥证书 路径\n                'alipay_public_cert_path' =\u003e '/Users/yansongda/pay/cert/alipayCertPublicKey_RSA2.crt',\n                // 必填-支付宝根证书 路径\n                'alipay_root_cert_path' =\u003e '/Users/yansongda/pay/cert/alipayRootCert.crt',\n                'return_url' =\u003e 'https://yansongda.cn/alipay/return',\n                'notify_url' =\u003e 'https://yansongda.cn/alipay/notify',\n                // 选填-第三方应用授权token\n                'app_auth_token' =\u003e '',\n                // 选填-服务商模式下的服务商 id，当 mode 为 Pay::MODE_SERVICE 时使用该参数\n                'service_provider_id' =\u003e '',\n                // 选填-默认为正常模式。可选为： MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE\n                'mode' =\u003e Pay::MODE_NORMAL,\n            ],       \n        ],   \n        'logger' =\u003e [ // optional\n            'enable' =\u003e false,\n            'file' =\u003e './logs/alipay.log',\n            'level' =\u003e 'info', // 建议生产环境等级调整为 info，开发环境为 debug\n            'type' =\u003e 'single', // optional, 可选 daily.\n            'max_file' =\u003e 30, // optional, 当 type 为 daily 时有效，默认 30 天\n        ],\n        'http' =\u003e [ // optional\n            'timeout' =\u003e 5.0,\n            'connect_timeout' =\u003e 5.0,\n            // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)\n        ],\n    ];\n\n    public function web()\n    {\n        Pay::config($this-\u003econfig);\n        \n        $result = Pay::alipay()-\u003eweb([\n            'out_trade_no' =\u003e ''.time(),\n            'total_amount' =\u003e '0.01',\n            'subject' =\u003e 'yansongda 测试 - 1',\n        ]);\n        \n        return $result;\n    }\n\n    public function returnCallback()\n    {\n        Pay::config($this-\u003econfig);\n    \n        $data = Pay::alipay()-\u003ecallback(); // 是的，验签就这么简单！\n\n        // 订单号：$data-\u003eout_trade_no\n        // 支付宝交易号：$data-\u003etrade_no\n        // 订单总金额：$data-\u003etotal_amount\n    }\n\n    public function notifyCallback()\n    {\n        Pay::config($this-\u003econfig);\n        \n        try{\n            $data = Pay::alipay()-\u003ecallback(); // 是的，验签就这么简单！\n\n            // 请自行对 trade_status 进行判断及其它逻辑进行判断，在支付宝的业务通知中，只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时，支付宝才会认定为买家付款成功。\n            // 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号；\n            // 2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额）；\n            // 3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）；\n            // 4、验证app_id是否为该商户本身。\n            // 5、其它业务逻辑情况\n        } catch (\\Throwable $e) {\n            dd($e);\n        }\n\n        return Pay::alipay()-\u003esuccess();\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' =\u003e [\n            'default' =\u003e [\n                // 必填-商户号\n                'mch_id' =\u003e '',\n                // 选填-v2商户私钥\n                'mch_secret_key_v2' =\u003e '',\n                // 必填-v3商户秘钥\n                'mch_secret_key' =\u003e '',\n                // 必填-商户私钥 字符串或路径\n                'mch_secret_cert' =\u003e '',\n                // 必填-商户公钥证书路径\n                'mch_public_cert_path' =\u003e '',\n                // 必填\n                'notify_url' =\u003e 'https://yansongda.cn/wechat/notify',\n                // 选填-公众号 的 app_id\n                'mp_app_id' =\u003e '',\n                // 选填-小程序 的 app_id\n                'mini_app_id' =\u003e '',\n                // 选填-app 的 app_id\n                'app_id' =\u003e '',\n                // 选填-服务商模式下，子公众号 的 app_id\n                'sub_mp_app_id' =\u003e '',\n                // 选填-服务商模式下，子 app 的 app_id\n                'sub_app_id' =\u003e '',\n                // 选填-服务商模式下，子小程序 的 app_id\n                'sub_mini_app_id' =\u003e '',\n                // 选填-服务商模式下，子商户id\n                'sub_mch_id' =\u003e '',\n                // 选填-微信平台公钥证书路径, optional，强烈建议 php-fpm 模式下配置此参数\n                'wechat_public_cert_path' =\u003e [\n                    '45F59D4DABF31918AFCEC556D5D2C6E376675D57' =\u003e __DIR__.'/Cert/wechatpay_45F***D57.pem',\n                ],\n                // 选填-默认为正常模式。可选为： MODE_NORMAL, MODE_SERVICE\n                'mode' =\u003e Pay::MODE_NORMAL,\n            ]\n        ],\n        'logger' =\u003e [ // optional\n            'enable' =\u003e false,\n            'file' =\u003e './logs/wechat.log',\n            'level' =\u003e 'info', // 建议生产环境等级调整为 info，开发环境为 debug\n            'type' =\u003e 'single', // optional, 可选 daily.\n            'max_file' =\u003e 30, // optional, 当 type 为 daily 时有效，默认 30 天\n        ],\n        'http' =\u003e [ // optional\n            'timeout' =\u003e 5.0,\n            'connect_timeout' =\u003e 5.0,\n            // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)\n        ],\n    ];\n\n    public function index()\n    {\n        Pay::config($this-\u003econfig);\n        \n        $order = [\n            'out_trade_no' =\u003e time().'',\n            'description' =\u003e 'subject-测试',\n            'amount' =\u003e [\n                 'total' =\u003e 1,\n            ],\n            'payer' =\u003e [\n                 'openid' =\u003e 'onkVf1FjWS5SBxxxxxxxx',\n            ],\n        ];\n\n        $pay = Pay::wechat()-\u003emp($order);\n\n        // $pay-\u003eappId\n        // $pay-\u003etimeStamp\n        // $pay-\u003enonceStr\n        // $pay-\u003epackage\n        // $pay-\u003esignType\n    }\n\n    public function callback()\n    {\n        Pay::config($this-\u003econfig);\n        \n        try{\n            $data = Pay::wechat()-\u003ecallback(); // 是的，验签就这么简单！\n        } catch (\\Throwable $e) {\n            dd($e);\n        }\n        \n        return Pay::wechat()-\u003esuccess();\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' =\u003e [\n            'default' =\u003e [\n                // 选填-商户号\n                // 抖音开放平台 --\u003e 应用详情 --\u003e 支付信息 --\u003e 产品管理 --\u003e 商户号\n                'mch_id' =\u003e '73744242495132490630',\n                // 必填-支付 Token，用于支付回调签名\n                // 抖音开放平台 --\u003e 应用详情 --\u003e 支付信息 --\u003e 支付设置 --\u003e Token(令牌)\n                'mch_secret_token' =\u003e 'douyin_mini_token',\n                // 必填-支付 SALT，用于支付签名\n                // 抖音开放平台 --\u003e 应用详情 --\u003e 支付信息 --\u003e 支付设置 --\u003e SALT\n                'mch_secret_salt' =\u003e 'oDxWDBr4U7FAAQ8hnGDm29i4A6pbTMDKme4WLLvA',\n                // 必填-小程序 app_id\n                // 抖音开放平台 --\u003e 应用详情 --\u003e 支付信息 --\u003e 支付设置 --\u003e 小程序appid\n                'mini_app_id' =\u003e 'tt226e54d3bd581bf801',\n                // 选填-抖音开放平台服务商id\n                'thirdparty_id' =\u003e '',\n                // 选填-抖音支付回调地址\n                'notify_url' =\u003e 'https://yansongda.cn/douyin/notify',\n            ],\n        ],\n        'logger' =\u003e [ // optional\n            'enable' =\u003e false,\n            'file' =\u003e './logs/alipay.log',\n            'level' =\u003e 'info', // 建议生产环境等级调整为 info，开发环境为 debug\n            'type' =\u003e 'single', // optional, 可选 daily.\n            'max_file' =\u003e 30, // optional, 当 type 为 daily 时有效，默认 30 天\n        ],\n        'http' =\u003e [ // optional\n            'timeout' =\u003e 5.0,\n            'connect_timeout' =\u003e 5.0,\n            // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)\n        ],\n    ];\n\n    public function pay()\n    {\n        Pay::config($this-\u003econfig);\n        \n        $result = Pay::douyin()-\u003emini([\n            'out_order_no' =\u003e date('YmdHis').mt_rand(1000, 9999),\n            'total_amount' =\u003e 1,\n            'subject' =\u003e '闫嵩达 - test - subject - 01',\n            'body' =\u003e '闫嵩达 - test - body - 01',\n            'valid_time' =\u003e 600,\n            'expand_order_info' =\u003e json_encode([\n                'original_delivery_fee' =\u003e 15,\n                'actual_delivery_fee' =\u003e 10\n            ])\n        ]);\n        \n        return $result;\n    }\n\n    public function callback()\n    {\n        Pay::config($this-\u003econfig);\n    \n        try{\n            $data = Pay::douyin()-\u003ecallback(); // 是的，验签就这么简单！\n        } catch (\\Throwable $e) {\n            dd($e)\n        }\n\n        return Pay::douyin()-\u003esuccess();\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' =\u003e [\n            'default' =\u003e [\n                // 服务代码\n                'svr_code' =\u003e '',\n                // 必填-合作商ID\n                'partner_id' =\u003e '',\n                // 必填-公私钥对编号\n                'public_key_code' =\u003e '00',\n                // 必填-商户私钥(加密签名)\n                'mch_secret_cert_path' =\u003e '',\n                // 必填-商户公钥证书路径(提供江苏银行进行验证签名用)\n                'mch_public_cert_path' =\u003e '',\n                // 必填-江苏银行的公钥(用于解密江苏银行返回的数据)\n                'jsb_public_cert_path' =\u003e '',\n                //支付通知地址\n                'notify_url'            =\u003e '', \n                // 选填-默认为正常模式。可选为： MODE_NORMAL:正式环境, MODE_SANDBOX:测试环境\n                'mode' =\u003e Pay::MODE_NORMAL,\n            ]\n        ],\n        'logger' =\u003e [ // optional\n            'enable' =\u003e false,\n            'file' =\u003e './logs/epay.log',\n            'level' =\u003e 'info', // 建议生产环境等级调整为 info，开发环境为 debug\n            'type' =\u003e 'single', // optional, 可选 daily.\n            'max_file' =\u003e 30, // optional, 当 type 为 daily 时有效，默认 30 天\n        ],\n        'http' =\u003e [ // optional\n            'timeout' =\u003e 5.0,\n            'connect_timeout' =\u003e 5.0,\n            // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)\n        ],\n    ];\n\n    public function index()\n    {\n        Pay::config($this-\u003econfig);\n        \n        $order = [\n            'outTradeNo' =\u003e time().'',\n            'proInfo' =\u003e 'subject-测试',\n            'totalFee'=\u003e 1,\n        ];\n\n        $pay = Pay::jsb()-\u003escan($order);\n    }\n\n    public function notifyCallback()\n    {\n        Pay::config($this-\u003econfig);\n\n        try{\n            $data = Pay::jsb()-\u003ecallback(); // 是的，验签就这么简单！\n        } catch (\\Throwable $e) {\n            dd($e);\n        }\n        \n        return Pay::jsb()-\u003esuccess();\n    }\n}\n```\n\n## 代码贡献\n\n由于测试及使用环境的限制，本项目中只开发了「支付宝」、「微信支付」、「抖音支付」、「银联」、「江苏银行」的相关支付网关。\n\n如果您有其它支付网关的需求，或者发现本项目中需要改进的代码，**_欢迎 Fork 并提交 PR！_**\n\n## 赏一杯咖啡吧\n\n![pay](https://cdn.jsdelivr.net/gh/yansongda/pay/web/public/images/pay.jpg)\n\n## LICENSE\n\nMIT\n","funding_links":[],"categories":["PHP","Third-party SDK","目录","金融股票","电子商务( E-commerce )","武器库"],"sub_categories":["电子商务 E-commerce","资源传输下载","后端"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyansongda%2Fpay","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyansongda%2Fpay","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyansongda%2Fpay/lists"}