{"id":15038420,"url":"https://github.com/zoujingli/wechatdeveloper","last_synced_at":"2026-03-07T03:09:44.625Z","repository":{"id":40609202,"uuid":"119039392","full_name":"zoujingli/WeChatDeveloper","owner":"zoujingli","description":"【新】微信服务号+微信小程序+微信支付+支付宝支付","archived":false,"fork":false,"pushed_at":"2025-04-21T15:29:52.000Z","size":716,"stargazers_count":1567,"open_issues_count":10,"forks_count":450,"subscribers_count":57,"default_branch":"master","last_synced_at":"2025-04-24T00:41:35.906Z","etag":null,"topics":["developer","phpsdk","wechat","wxpay","wxsdk"],"latest_commit_sha":null,"homepage":"https://www.kancloud.cn/zoujingli/wechat-developer/content","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/zoujingli.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"license","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-01-26T10:34:51.000Z","updated_at":"2025-04-23T10:21:09.000Z","dependencies_parsed_at":"2024-01-16T16:20:45.979Z","dependency_job_id":"372a4960-5b4d-4afe-8d6b-6b613fbc65ce","html_url":"https://github.com/zoujingli/WeChatDeveloper","commit_stats":{"total_commits":466,"total_committers":18,"mean_commits":25.88888888888889,"dds":0.05579399141630903,"last_synced_commit":"6e349d997d9037de60744529f28ba686b08c3cf1"},"previous_names":[],"tags_count":85,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoujingli%2FWeChatDeveloper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoujingli%2FWeChatDeveloper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoujingli%2FWeChatDeveloper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoujingli%2FWeChatDeveloper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zoujingli","download_url":"https://codeload.github.com/zoujingli/WeChatDeveloper/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253990460,"owners_count":21995774,"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":["developer","phpsdk","wechat","wxpay","wxsdk"],"created_at":"2024-09-24T20:38:25.285Z","updated_at":"2026-03-07T03:09:44.615Z","avatar_url":"https://github.com/zoujingli.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# WeChatDeveloper for PHP\n\n[![star](https://gitcode.com/ThinkAdmin/WeChatDeveloper/star/badge.svg)](https://gitcode.com/ThinkAdmin/ThinkAdmin)\n[![star](https://gitee.com/zoujingli/WeChatDeveloper/badge/star.svg?theme=gvp)](https://gitee.com/zoujingli/WeChatDeveloper)\n[![Latest Stable Version](https://poser.pugx.org/zoujingli/wechat-developer/v/stable)](https://packagist.org/packages/zoujingli/wechat-developer)\n[![Total Downloads](https://poser.pugx.org/zoujingli/wechat-developer/downloads)](https://packagist.org/packages/zoujingli/wechat-developer)\n[![Monthly Downloads](https://poser.pugx.org/zoujingli/wechat-developer/d/monthly)](https://packagist.org/packages/zoujingli/wechat-developer)\n[![Daily Downloads](https://poser.pugx.org/zoujingli/wechat-developer/d/daily)](https://packagist.org/packages/zoujingli/wechat-developer)\n[![PHP Version Require](http://poser.pugx.org/zoujingli/wechat-developer/require/php)](https://packagist.org/packages/wechat-developer)\n[![License](https://poser.pugx.org/zoujingli/wechat-developer/license)](https://packagist.org/packages/zoujingli/wechat-developer)\n\n## 🚀 项目简介\n\n**WeChatDeveloper** 是一个功能全面、安全可靠的 PHP 微信和支付宝开发 SDK，基于 [wechat-php-sdk](https://github.com/zoujingli/wechat-php-sdk) 重构优化而成。项目经过全面的安全加固和代码质量提升，为开发者提供稳定、安全、易用的微信生态和支付解决方案。\n\n## ✨ 核心特性\n\n### 🔒 安全可靠\n\n- **输入验证**：全面防护 XSS 攻击，所有用户输入都经过严格过滤和验证\n- **文件安全**：文件操作前进行存在性和权限检查，防止恶意利用\n- **加密安全**：使用 SHA-256 替代 MD5，提供更强的安全防护\n- **序列化安全**：添加反序列化数据验证，防止代码执行攻击\n\n### 🎯 功能全面\n\n- **微信生态**：支持公众号、小程序、企业微信全生态开发\n- **支付功能**：支持微信支付 V2/V3、支付宝支付全场景\n- **多端支持**：覆盖 App、H5、PC、小程序等所有平台\n- **接口完整**：涵盖用户管理、消息推送、素材管理、支付等所有核心功能\n\n### ⚡ 性能优化\n\n- **自动刷新**：AccessToken 失效自动刷新机制\n- **缓存支持**：支持自定义缓存驱动，可扩展 Redis 等\n- **错误重试**：智能错误重试机制，提高接口调用成功率\n- **类型安全**：修复所有类型声明问题，提升代码质量\n- **自动缓存清理**：自动清理 CURL 临时缓存文件，适配常驻内存框架\n- **通用接口支持**：提供 `callApi()` 万能接口，支持多种 HTTP 方法，适用于所有场景\n\n### 🛠 易于使用\n\n- **统一入口**：通过`\\We::`静态方法统一创建各种功能实例\n- **向后兼容**：完全保持原有 API 和参数，无需修改现有代码\n- **通用接口**：提供标准化的 `callApi()` 方法，支持 GET/POST/PUT/DELETE 等多种 HTTP 方法\n- **文档完善**：提供详细的使用文档和示例代码\n- **社区支持**：活跃的社区和持续的技术支持\n\n## 📋 系统要求\n\n- **PHP 版本**：最低要求 PHP 5.4，建议 PHP 7.0+ 以获取最佳性能\n- **扩展要求**：curl、json、xml、openssl、mbstring、bcmath\n- **权限要求**：缓存目录需要写权限\n- **推荐环境**：PHP 7.4+ / PHP 8.0+ 生产环境\n\n## 📦 快速开始\n\n### 安装方式\n\n#### 方式一：Composer 安装（推荐）\n\n```bash\n# 安装稳定版本\ncomposer require zoujingli/wechat-developer\n\n# 安装开发版本\ncomposer require zoujingli/wechat-developer dev-master\n\n# 更新到最新版本\ncomposer update zoujingli/wechat-developer\n```\n\n#### 方式二：直接下载\n\n```bash\n# 下载项目到本地\ngit clone https://github.com/zoujingli/WeChatDeveloper.git\n\n# 在项目中引入\ninclude \"WeChatDeveloper/include.php\";\n```\n\n### 基础使用\n\n```php\n\u003c?php\n// 1. 引入SDK\ninclude \"WeChatDeveloper/include.php\";\n\n// 2. 配置参数\n$config = [\n    'appid'     =\u003e 'your_wechat_appid',\n    'appsecret' =\u003e 'your_wechat_appsecret',\n    'mch_id'    =\u003e 'your_merchant_id',      // 微信支付需要\n    'mch_key'   =\u003e 'your_merchant_key',     // 微信支付需要\n    'cache_path' =\u003e '/path/to/cache'        // 可选，缓存目录\n];\n\n// 3. 创建实例并调用\ntry {\n    // 微信用户管理\n    $user = \\We::WeChatUser($config);\n    $userList = $user-\u003egetUserList();\n\n    // 微信支付\n    $pay = \\We::WePayOrder($config);\n    $order = $pay-\u003ecreate($orderData);\n\n    // 支付宝支付\n    $alipay = \\We::AliPayWeb($config);\n    $html = $alipay-\u003eapply($payData);\n\n    // 使用通用接口（万能接口）\n    // 所有接口类都提供 callApi() 方法，支持多种 HTTP 方法\n    $result = $user-\u003ecallApi('https://api.weixin.qq.com/cgi-bin/user/get?ACCESS_TOKEN', [], 'GET');\n    $result = $pay-\u003ecallApi('https://api.mch.weixin.qq.com/pay/unifiedorder', $data, 'POST');\n    $result = $alipay-\u003ecallApi('alipay.trade.query', $params, 'GET');  // 支付宝：apiMethod 作为第一参数\n\n} catch (Exception $e) {\n    echo \"错误：\" . $e-\u003egetMessage();\n}\n```\n\n## 🎯 功能模块\n\n### 📱 微信生态支持\n\n#### 微信公众号\n\n- **用户管理**：用户信息获取、标签管理、分组管理\n- **消息推送**：模板消息、客服消息、群发消息\n- **素材管理**：图片、语音、视频、图文素材上传和管理\n- **菜单管理**：自定义菜单创建、查询、删除\n- **网页授权**：OAuth2.0 网页授权，获取用户信息\n- **二维码**：临时二维码、永久二维码生成\n- **JSSDK**：微信前端 JS-SDK 支持\n- **卡券功能**：微信卡券接口支持\n- **门店管理**：门店 WIFI 管理、摇一摇周边\n\n#### 微信小程序\n\n- **数据加密**：小程序数据加密解密处理\n- **用户管理**：用户信息获取、登录状态管理\n- **消息推送**：订阅消息、模板消息、动态消息\n- **二维码**：小程序码生成、URL Scheme\n- **内容安全**：图片内容检测、文本内容检测\n- **物流助手**：发货信息管理、物流状态查询\n- **直播功能**：小程序直播接口支持\n- **搜索优化**：小程序页面搜索优化\n- **插件管理**：小程序插件申请、管理\n- **OCR 服务**：身份证、银行卡、驾驶证识别\n- **生物认证**：指纹、面部识别支持\n\n#### 企业微信\n\n- **部门管理**：部门信息获取、创建、更新\n- **用户管理**：企业用户信息管理\n- **消息推送**：企业消息推送功能\n\n### 💰 支付功能支持\n\n#### 微信支付\n\n- **V2 接口**：统一下单、查询、关闭、退款\n- **V3 接口**：新一代支付接口，支持更多功能\n- **支付方式**：JSAPI、APP、H5、Native、小程序支付\n- **订单管理**：订单创建、查询、关闭、退款\n- **账单管理**：对账单下载、交易明细查询\n- **企业付款**：打款到零钱、打款到银行卡\n- **分账功能**：微信分账接口支持\n- **代金券**：代金券创建、发放、核销\n- **红包功能**：微信红包发送和管理\n\n#### 支付宝支付\n\n- **支付方式**：App 支付、Web 支付、Wap 支付、扫码支付、刷卡支付\n- **订单管理**：订单创建、查询、关闭、退款\n- **转账功能**：单笔转账、批量转账\n- **账单管理**：对账单下载、交易查询\n- **证书支持**：RSA、RSA2 签名，证书模式支持\n\n## 💡 使用案例\n\n### 📱 微信公众号功能\n\n#### 用户管理\n\n```php\n\u003c?php\n// 获取用户列表\n$user = \\We::WeChatUser($config);\n$result = $user-\u003egetUserList();\n\n// 批量获取用户信息\nforeach (array_chunk($result['data']['openid'], 100) as $openids) {\n    $userList = $user-\u003egetBatchUserInfo($openids);\n    foreach ($userList['user_info_list'] as $userInfo) {\n        echo \"用户：\" . $userInfo['nickname'] . \"\\n\";\n    }\n}\n\n// 设置用户备注\n$user-\u003eupdateMark('openid', 'VIP用户');\n```\n\n#### 二维码生成\n\n```php\n\u003c?php\n// 创建临时二维码\n$qrcode = \\We::WeChatQrcode($config);\n$result = $qrcode-\u003ecreate('场景内容');\n\n// 获取二维码链接\n$url = $qrcode-\u003eurl($result['ticket']);\necho \"二维码链接：\" . $url;\n```\n\n#### 菜单管理\n\n```php\n\u003c?php\n// 获取当前菜单\n$menu = \\We::WeChatMenu($config);\n$result = $menu-\u003eget();\n\n// 创建自定义菜单\n$menuData = [\n    'button' =\u003e [\n        [\n            'type' =\u003e 'click',\n            'name' =\u003e '今日歌曲',\n            'key' =\u003e 'V1001_TODAY_MUSIC'\n        ],\n        [\n            'name' =\u003e '菜单',\n            'sub_button' =\u003e [\n                [\n                    'type' =\u003e 'view',\n                    'name' =\u003e '搜索',\n                    'url' =\u003e 'http://www.soso.com/'\n                ]\n            ]\n        ]\n    ]\n];\n$menu-\u003ecreate($menuData);\n```\n\n### 💰 微信支付功能\n\n#### 微信支付 V2 接口\n\n```php\n\u003c?php\n// 创建支付订单\n$pay = \\We::WePayOrder($config);\n$options = [\n    'body'             =\u003e '测试商品',\n    'out_trade_no'     =\u003e time(),\n    'total_fee'        =\u003e '1',\n    'openid'           =\u003e 'o38gpszoJoC9oJYz3UHHf6bEp0Lo',\n    'trade_type'       =\u003e 'JSAPI', // JSAPI/NATIVE/APP/MWEB\n    'notify_url'       =\u003e 'https://your-domain.com/notify.php',\n    'spbill_create_ip' =\u003e '127.0.0.1',\n];\n\n$result = $pay-\u003ecreate($options);\n\n// 生成JSAPI支付参数\n$jsApiParams = $pay-\u003ecreateParamsForJsApi($result['prepay_id']);\n// 将 $jsApiParams 传给前端发起支付\n```\n\n#### 微信支付 V3 接口\n\n```php\n\u003c?php\n// 创建V3支付订单\n$payment = \\WePayV3\\Order::instance($config);\n$order = (string)time();\n\n// JSAPI支付\n$result = $payment-\u003ecreate('jsapi', [\n    'appid'        =\u003e $config['appid'],\n    'mchid'        =\u003e $config['mch_id'],\n    'description'  =\u003e '商品描述',\n    'out_trade_no' =\u003e $order,\n    'notify_url'   =\u003e 'https://your-domain.com/notify.php',\n    'payer'        =\u003e ['openid' =\u003e 'o38gps3vNdCqaggFfrBRCRikwlWY'],\n    'amount'       =\u003e ['total' =\u003e 2, 'currency' =\u003e 'CNY'],\n]);\n\n// H5支付\n$result = $payment-\u003ecreate('h5', [\n    'appid'        =\u003e $config['appid'],\n    'mchid'        =\u003e $config['mch_id'],\n    'description'  =\u003e '商品描述',\n    'out_trade_no' =\u003e $order,\n    'notify_url'   =\u003e 'https://your-domain.com/notify.php',\n    'amount'       =\u003e ['total' =\u003e 2, 'currency' =\u003e 'CNY'],\n    'scene_info'   =\u003e [\n        'h5_info' =\u003e ['type' =\u003e 'Wap'],\n        'payer_client_ip' =\u003e '14.23.150.211',\n    ],\n]);\n\n// 查询订单\n$result = $payment-\u003equery($order);\n\n// 创建退款\n$refundResult = $payment-\u003ecreateRefund([\n    'out_trade_no'  =\u003e $order,\n    'out_refund_no' =\u003e strval(time()),\n    'amount'        =\u003e [\n        'refund'   =\u003e 2,\n        'total'    =\u003e 2,\n        'currency' =\u003e 'CNY'\n    ]\n]);\n```\n\n#### 微信红包\n\n```php\n\u003c?php\n// 发送微信红包\n$redpack = \\We::WePayRedpack($config);\n$options = [\n    'mch_billno'   =\u003e time(),\n    're_openid'    =\u003e 'o38gps3vNdCqaggFfrBRCRikwlWY',\n    'send_name'    =\u003e '商户名称',\n    'act_name'     =\u003e '活动名称',\n    'total_amount' =\u003e '100',\n    'total_num'    =\u003e '1',\n    'wishing'      =\u003e '感谢您参加活动！',\n    'remark'       =\u003e '快来抢红包！',\n    'client_ip'    =\u003e '127.0.0.1',\n];\n\n$result = $redpack-\u003ecreate($options);\n\n// 查询红包记录\n$result = $redpack-\u003equery($options['mch_billno']);\n```\n\n### 💳 支付宝支付功能\n\n#### 网站支付\n\n```php\n\u003c?php\n// 支付宝网站支付\n$alipay = \\We::AliPayWeb($config);\n$result = $alipay-\u003eapply([\n    'out_trade_no' =\u003e time(),\n    'total_amount' =\u003e '1',\n    'subject'      =\u003e '支付订单描述',\n]);\n\n// 直接输出HTML表单，用户点击即可跳转支付\necho $result;\n```\n\n#### App 支付\n\n```php\n\u003c?php\n// 支付宝App支付\n$alipay = \\We::AliPayApp($config);\n$result = $alipay-\u003eapply([\n    'out_trade_no' =\u003e strval(time()),\n    'total_amount' =\u003e '1',\n    'subject'      =\u003e '支付宝订单标题',\n]);\n\n// 返回支付参数字符串，传给App端\necho $result;\n```\n\n#### 转账功能\n\n```php\n\u003c?php\n// 支付宝转账\n$transfer = \\We::AliPayTransfer($config);\n$result = $transfer-\u003ecreate([\n    'out_biz_no'   =\u003e time(),\n    'trans_amount' =\u003e '10',\n    'product_code' =\u003e 'TRANS_ACCOUNT_NO_PWD',\n    'biz_scene'    =\u003e 'DIRECT_TRANSFER',\n    'payee_info'   =\u003e [\n        'identity'      =\u003e 'zoujingli@qq.com',\n        'identity_type' =\u003e 'ALIPAY_LOGON_ID',\n        'name'          =\u003e '收款人姓名',\n    ],\n]);\n```\n\n### 📱 微信小程序功能\n\n#### 用户登录和数据解密\n\n```php\n\u003c?php\n// 小程序用户登录\n$mini = \\We::WeMiniCrypt($config);\n\n// 获取session_key\n$session = $mini-\u003esession($code);\n\n// 解密用户数据\n$userInfo = $mini-\u003euserInfo($code, $iv, $encryptedData);\n\n// 直接解密数据\n$decoded = $mini-\u003edecode($iv, $sessionKey, $encryptedData);\n```\n\n#### 小程序码生成\n\n```php\n\u003c?php\n// 生成小程序码\n$qrcode = \\We::WeMiniQrcode($config);\n$result = $qrcode-\u003ecreate([\n    'scene' =\u003e 'id=123',\n    'page'  =\u003e 'pages/index/index',\n    'width' =\u003e 430\n]);\n```\n\n### 🔧 高级功能\n\n#### 通用接口（万能接口）\n\n所有接口类都提供了 `callApi()` 通用方法，支持多种 HTTP 方法（GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS），可以直接传入完整 URL 和参数进行请求，适用于官方新增接口或自定义接口调用。\n\n**方法签名：**\n\n```php\n// 微信公众号\ncallApi(string $url, array|string $data = [], string $method = 'GET')\n\n// 微信支付V2\ncallApi(string $url, array|string $data = [], string $method = 'POST', bool $isCert = false, string $signType = 'HMAC-SHA256')\n\n// 微信支付V3\ncallApi(string $url, array|string $data = '', string $method = 'POST', bool $verify = false)\n\n// 支付宝\ncallApi(string $apiMethod, array|string $data = [], string $method = 'GET', bool $verify = false)\n```\n\n**支持的 HTTP 方法：**\n\n- `GET` - 获取资源（默认：微信公众号、支付宝）\n- `POST` - 创建/提交数据（默认：微信支付）\n- `PUT` - 更新资源\n- `DELETE` - 删除资源\n- `PATCH` - 部分更新\n- `HEAD` - 获取响应头\n- `OPTIONS` - 获取支持的方法\n\n##### 微信公众号通用接口\n\n```php\n\u003c?php\n$user = \\We::WeChatUser($config);\n\n// GET请求 - 自动处理ACCESS_TOKEN\n$result = $user-\u003ecallApi(\n    'https://api.weixin.qq.com/cgi-bin/user/info?openid=OPENID\u0026lang=zh_CN\u0026ACCESS_TOKEN',\n    [], // GET参数（如果URL中已包含参数，这里可以为空）\n    'GET'\n);\n\n// POST请求 - 批量获取用户信息（自动JSON编码）\n$result = $user-\u003ecallApi(\n    'https://api.weixin.qq.com/cgi-bin/user/info/batchget?ACCESS_TOKEN',\n    ['user_list' =\u003e [['openid' =\u003e 'xxx'], ['openid' =\u003e 'yyy']]],\n    'POST'\n);\n\n// PUT请求 - 更新资源\n$result = $user-\u003ecallApi($url, $data, 'PUT');\n\n// DELETE请求 - 删除资源\n$result = $user-\u003ecallApi($url, $data, 'DELETE');\n\n// PATCH请求 - 部分更新\n$result = $user-\u003ecallApi($url, $data, 'PATCH');\n```\n\n**参数说明：**\n\n- `$url` (string) - 完整URL或相对路径（支持 ACCESS_TOKEN 占位符，自动替换）\n- `$data` (array|string) - 请求参数（GET参数或POST数据，支持数组或字符串）\n- `$method` (string) - 请求方法 GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS，默认 GET\n\n**默认行为：**\n\n- ✅ 自动处理 ACCESS_TOKEN（URL中包含 ACCESS_TOKEN 时自动替换）\n- ✅ POST 请求自动转为 JSON（数组数据）\n- ✅ 返回解析后的数组\n\n##### 微信支付V2通用接口\n\n```php\n\u003c?php\n$pay = \\We::WePayOrder($config);\n\n// POST请求 - 统一下单（自动签名，默认HMAC-SHA256）\n$result = $pay-\u003ecallApi(\n    'https://api.mch.weixin.qq.com/pay/unifiedorder',\n    [\n        'body' =\u003e '测试商品',\n        'out_trade_no' =\u003e time(),\n        'total_fee' =\u003e '1',\n        'openid' =\u003e 'o38gpszoJoC9oJYz3UHHf6bEp0Lo',\n        'trade_type' =\u003e 'JSAPI',\n        'notify_url' =\u003e 'https://your-domain.com/notify.php',\n        'spbill_create_ip' =\u003e '127.0.0.1',\n    ],\n    'POST'\n);\n\n// POST请求 - 使用MD5签名\n$result = $pay-\u003ecallApi(\n    'https://api.mch.weixin.qq.com/pay/unifiedorder',\n    $data,\n    'POST',\n    false,  // 不需要证书\n    'MD5'   // 签名类型：MD5\n);\n\n// POST请求 - 需要证书（如退款）\n$result = $pay-\u003ecallApi(\n    'https://api.mch.weixin.qq.com/secapi/pay/refund',\n    $data,\n    'POST',\n    true,   // 需要证书\n    'MD5'   // 签名类型\n);\n\n// GET请求 - 查询订单\n$result = $pay-\u003ecallApi(\n    'https://api.mch.weixin.qq.com/pay/orderquery',\n    ['out_trade_no' =\u003e '123456'],\n    'GET'\n);\n\n// PUT/DELETE请求\n$result = $pay-\u003ecallApi($url, $data, 'PUT', false, 'MD5');\n$result = $pay-\u003ecallApi($url, $data, 'DELETE', false, 'MD5');\n```\n\n**参数说明：**\n\n- `$url` (string) - 完整URL\n- `$data` (array|string) - 请求参数（支持数组或字符串）\n- `$method` (string) - 请求方法 GET|POST|PUT|DELETE|PATCH，默认 POST\n- `$isCert` (bool) - 是否需要证书，默认 false\n- `$signType` (string) - 签名类型 MD5|HMAC-SHA256，默认 HMAC-SHA256\n\n**默认行为：**\n\n- ✅ 自动签名（POST/PUT/PATCH/DELETE 请求）\n- ✅ 返回解析后的数组（XML格式）\n\n##### 微信支付V3通用接口\n\n```php\n\u003c?php\n$payment = \\WePayV3\\Order::instance($config);\n\n// POST请求 - 创建JSAPI支付订单（相对路径）\n$result = $payment-\u003ecallApi(\n    '/v3/pay/transactions/jsapi',\n    [\n        'appid' =\u003e $config['appid'],\n        'mchid' =\u003e $config['mch_id'],\n        'description' =\u003e '商品描述',\n        'out_trade_no' =\u003e (string)time(),\n        'notify_url' =\u003e 'https://your-domain.com/notify.php',\n        'payer' =\u003e ['openid' =\u003e 'o38gpszoJoC9oJYz3UHHf6bEp0Lo'],\n        'amount' =\u003e ['total' =\u003e 2, 'currency' =\u003e 'CNY'],\n    ],\n    'POST'\n);\n\n// GET请求 - 查询订单（完整URL或相对路径）\n$result = $payment-\u003ecallApi(\n    '/v3/pay/transactions/out-trade-no/123456?mchid=' . $config['mch_id'],\n    '',\n    'GET',\n    true  // 验证响应签名\n);\n\n// PUT请求 - 更新资源\n$result = $payment-\u003ecallApi('/v3/some/resource/xxx', $data, 'PUT');\n\n// DELETE请求 - 删除资源\n$result = $payment-\u003ecallApi('/v3/some/resource/xxx', '', 'DELETE');\n```\n\n**参数说明：**\n\n- `$url` (string) - 完整URL或相对路径（如 `/v3/pay/transactions/jsapi`）\n- `$data` (array|string) - 请求数据（数组会自动转为JSON）\n- `$method` (string) - 请求方法 GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS，默认 POST\n- `$verify` (bool) - 验证响应签名，默认 false\n\n**默认行为：**\n\n- ✅ 数组数据自动转为 JSON\n- ✅ 返回解析后的数组\n\n##### 支付宝通用接口\n\n```php\n\u003c?php\n$alipay = \\We::AliPayWeb($config);\n\n// GET请求 - 查询订单\n$result = $alipay-\u003ecallApi(\n    'alipay.trade.query',  // API方法名（必填，第一参数）\n    ['out_trade_no' =\u003e '123456'],\n    'GET',\n    false                  // 验证响应签名，默认false\n);\n\n// POST请求 - 订单退款\n$result = $alipay-\u003ecallApi(\n    'alipay.trade.refund',  // API方法名（第一参数）\n    [\n        'out_trade_no' =\u003e '123456',\n        'refund_amount' =\u003e '10',\n    ],\n    'POST',\n    false                    // 不验证响应签名\n);\n\n// PUT/DELETE请求\n$result = $alipay-\u003ecallApi('alipay.some.method', $data, 'PUT', false);\n```\n\n**参数说明：**\n\n- `$apiMethod` (string) - API方法名（如：`alipay.trade.query`），必填，第一参数\n- `$data` (array|string) - 请求参数（支持数组或字符串）\n- `$method` (string) - 请求方法 GET|POST|PUT|DELETE|PATCH，默认 GET\n- `$verify` (bool) - 验证响应签名，默认 false\n\n**默认行为：**\n\n- ✅ 自动使用 gateway 作为请求URL\n- ✅ 自动签名（默认开启）\n- ✅ 返回解析后的数组\n\n#### 自定义缓存\n\nSDK 支持自定义缓存驱动，可以适配 Redis、Memcached 等缓存系统，特别适用于常驻内存框架（Workerman、Swoole 等）。\n\n```php\n\u003c?php\n// 配置自定义缓存（适配常驻内存框架）\n\\WeChat\\Contracts\\Tools::$cache_callable = [\n    'set' =\u003e function ($name, $value, $expired = 360) {\n        // 自定义缓存设置逻辑\n        // $name: 缓存名称\n        // $value: 缓存值\n        // $expired: 过期时间（秒）\n        return Redis::setex($name, $expired, serialize($value));\n    },\n    'get' =\u003e function ($name) {\n        // 自定义缓存获取逻辑\n        // $name: 缓存名称\n        // 返回: 缓存值或 null\n        $data = Redis::get($name);\n        return $data ? unserialize($data) : null;\n    },\n    'del' =\u003e function ($name) {\n        // 自定义缓存删除逻辑\n        // $name: 缓存名称\n        // 返回: boolean\n        return Redis::del($name);\n    },\n    'put' =\u003e function ($name, $content) {\n        // 自定义文件缓存逻辑（用于证书等文件）\n        // $name: 文件名称\n        // $content: 文件内容\n        // 返回: 文件路径（必须是可读的文件路径）\n        $file = '/path/to/cache/' . $name;\n        file_put_contents($file, $content);\n        return $file;\n    },\n];\n\n// 注意：\n// 1. 未配置自定义缓存时，默认使用文件缓存\n// 2. 文件缓存路径可通过配置中的 'cache_path' 参数设置\n// 3. SDK 会自动清理 CURL 临时缓存文件，无需手动处理\n// 4. 在常驻内存框架中，建议使用 Redis 等外部缓存替代文件缓存\n```\n\n#### 错误处理\n\n```php\n\u003c?php\ntry {\n    $user = \\We::WeChatUser($config);\n    $result = $user-\u003egetUserList();\n} catch (\\WeChat\\Exceptions\\InvalidResponseException $e) {\n    // 接口调用异常\n    echo \"接口错误：\" . $e-\u003egetMessage();\n} catch (\\WeChat\\Exceptions\\LocalCacheException $e) {\n    // 缓存异常\n    echo \"缓存错误：\" . $e-\u003egetMessage();\n} catch (Exception $e) {\n    // 其他异常\n    echo \"系统错误：\" . $e-\u003egetMessage();\n}\n```\n\n### 🧩 小程序快速示例\n\n#### 订阅消息发送\n\n```php\n\u003c?php\n$mini = \\We::WeMiniNewtmpl($config);\n$mini-\u003esend([\n    'touser'      =\u003e '用户openid',\n    'template_id' =\u003e '模板ID',\n    'page'        =\u003e 'pages/index?foo=bar',\n    'data'        =\u003e [\n        'thing1' =\u003e ['value' =\u003e '订单已支付'],\n        'time2'  =\u003e ['value' =\u003e '2024-01-01 12:00'],\n    ],\n]);\n```\n\n#### 内容安全校验\n\n```php\n\u003c?php\n$security = \\We::WeMiniSecurity($config);\n\n// 文本校验\n$security-\u003emsgSecCheck('留言内容示例');\n\n// 图片校验（文件流）\n$imgContent = file_get_contents('/path/to/demo.jpg');\n$security-\u003eimgSecCheck($imgContent);\n```\n\n## ⚙️ 配置说明\n\n### 基础配置\n\n#### 微信公众号配置\n\n```php\n\u003c?php\n$wechatConfig = [\n    'appid'          =\u003e 'wx60a43dd8161666d4',\n    'appsecret'      =\u003e 'b4e28746f1bd73b5c6684f5e01883c36',\n    'token'          =\u003e 'your_wechat_token',\n    'encodingaeskey' =\u003e 'your_encodingaeskey',\n    'cache_path'     =\u003e '/path/to/cache',\n];\n```\n\n#### 微信支付配置\n\n```php\n\u003c?php\n// 微信支付V2配置\n$payConfig = [\n    'appid'      =\u003e 'wx60a43dd8161666d4',\n    'mch_id'     =\u003e '15293xxxxxx',\n    'mch_key'    =\u003e 'your_merchant_key',\n    'cache_path' =\u003e '/path/to/cache',\n];\n\n// 微信支付V3配置（推荐）\n$payV3Config = [\n    'appid'        =\u003e 'wx60a43dd8161666d4',\n    'mch_id'       =\u003e '15293xxxxxx',\n    'mch_v3_key'   =\u003e '98b7fxxxxxxxxxxxxxxxxxxxxxxxxxxxx',\n    'cert_serial'  =\u003e '49055D67B2XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',\n    'cert_public'  =\u003e '-----BEGIN CERTIFICATE-----...',\n    'cert_private' =\u003e '-----BEGIN PRIVATE KEY-----...',\n    'cache_path'   =\u003e '/path/to/cache',\n    'cert_package' =\u003e [\n        'PUB_KEY_ID_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' =\u003e '-----BEGIN CERTIFICATE-----...'\n    ],\n];\n```\n\n#### 支付宝配置\n\n```php\n\u003c?php\n// 支付宝公钥模式配置\n$alipayConfig = [\n    'appid'       =\u003e '2021000122667306',\n    'private_key' =\u003e 'MIIEowIBAAKCAQEAn...',\n    'public_key'  =\u003e 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...',\n    'sign_type'   =\u003e 'RSA2',\n    'notify_url'  =\u003e 'https://your-domain.com/alipay/notify',\n    'return_url'  =\u003e 'https://your-domain.com/alipay/return',\n    'charset'     =\u003e 'utf-8',\n    'debug'       =\u003e false, // 生产环境设为false\n];\n\n// 支付宝证书模式配置\n$alipayCertConfig = [\n    'appid'            =\u003e '2021000122667306',\n    'private_key'      =\u003e 'MIIEowIBAAKCAQEAn...',\n    'app_cert_path'    =\u003e '/path/to/appPublicCert.crt',\n    'alipay_root_path' =\u003e '/path/to/alipayRootCert.crt',\n    'alipay_cert_path' =\u003e '/path/to/alipayPublicCert.crt',\n    'sign_type'        =\u003e 'RSA2',\n    'notify_url'       =\u003e 'https://your-domain.com/alipay/notify',\n    'return_url'       =\u003e 'https://your-domain.com/alipay/return',\n];\n```\n\n## ❓ 常见问题\n\n### Q: 如何获取微信支付证书？\n\nA: 登录微信商户平台，在\"账户中心\" -\u003e \"API 安全\" -\u003e \"API 证书\"中下载证书文件，或使用 API 证书下载工具。\n\n### Q: 支付宝沙箱环境如何配置？\n\nA: 设置 `debug =\u003e true` 并使用沙箱环境的 `appid` 和密钥即可。\n\n### Q: AccessToken 过期怎么办？\n\nA: SDK 已内置自动刷新机制，无需手动处理。如需自定义，可设置 `GetAccessTokenCallback` 回调函数。\n\n### Q: 如何自定义缓存存储？\n\nA: 配置 `\\WeChat\\Contracts\\Tools::$cache_callable` 数组，实现自定义的缓存逻辑。\n\n### Q: 支持哪些 PHP 版本？\n\nA: 最低支持 PHP 5.4，建议使用 PHP 7.0+ 以获得最佳性能。\n\n### Q: 如何处理支付回调？\n\nA: 使用 `\\WeChat\\Receive` 类处理微信支付回调，使用 `\\AliPay\\Web` 的 `notify()` 方法处理支付宝回调。\n\n### Q: 小程序数据解密失败？\n\nA: 确保 `session_key` 有效且未过期，检查 `iv` 和 `encryptedData` 参数是否正确。\n\n### Q: 如何调试接口调用？\n\nA: 开启错误日志，查看具体的错误信息。SDK 会抛出详细的异常信息帮助定位问题。\n\n### Q: 如何在常驻内存框架中使用？\n\nA: SDK 会自动清理 CURL 缓存文件，无需额外配置。在常驻内存环境中，建议通过自定义缓存驱动（`\\WeChat\\Contracts\\Tools::$cache_callable`）使用 Redis 等外部缓存，避免文件缓存带来的问题。\n\n## 📁 文件说明\n\n| 文件名               | 类名                  | 描述             | 类型    | 加载方法                      |\n|-------------------|---------------------|----------------|-------|---------------------------|\n| **支付宝支付**         |                     |                |       |                           |\n| App.php           | AliPay\\App          | 支付宝 App 支付     | 支付宝支付 | \\We::AliPayApp()          |\n| Bill.php          | AliPay\\Bill         | 支付宝账单下载        | 支付宝支付 | \\We::AliPayBill()         |\n| Pos.php           | AliPay\\Pos          | 支付宝刷卡支付        | 支付宝支付 | \\We::AliPayPos()          |\n| Scan.php          | AliPay\\Scan         | 支付宝扫码支付        | 支付宝支付 | \\We::AliPayScan()         |\n| Transfer.php      | AliPay\\Transfer     | 支付宝转账          | 支付宝支付 | \\We::AliPayTransfer()     |\n| Wap.php           | AliPay\\Wap          | 支付宝 Wap 支付     | 支付宝支付 | \\We::AliPayWap()          |\n| Web.php           | AliPay\\Web          | 支付宝 Web 支付     | 支付宝支付 | \\We::AliPayWeb()          |\n| **微信公众号**         |                     |                |       |                           |\n| Card.php          | WeChat\\Card         | 微信卡券接口支持       | 认证服务号 | \\We::WeChatCard()         |\n| Custom.php        | WeChat\\Custom       | 微信客服消息接口支持     | 认证服务号 | \\We::WeChatCustom()       |\n| Draft.php         | WeChat\\Draft        | 微信草稿箱          | 认证服务号 | \\We::WeChatDraft()        |\n| Freepublish.php   | WeChat\\Freepublish  | 微信发布能力         | 认证服务号 | \\We::WeChatFreepublish()  |\n| Media.php         | WeChat\\Media        | 微信媒体素材接口支持     | 认证服务号 | \\We::WeChatMedia()        |\n| Menu.php          | WeChat\\Menu         | 微信菜单管理         | 认证服务号 | \\We::WeChatMenu()         |\n| Oauth.php         | WeChat\\Oauth        | 微信网页授权消息类接口    | 认证服务号 | \\We::WeChatOauth()        |\n| Pay.php           | WeChat\\Pay          | 微信支付类接口        | 认证服务号 | \\We::WeChatPay()          |\n| Product.php       | WeChat\\Product      | 微信商店类接口        | 认证服务号 | \\We::WeChatProduct()      |\n| Qrcode.php        | WeChat\\Qrcode       | 微信二维码接口支持      | 认证服务号 | \\We::WeChatQrcode()       |\n| Receive.php       | WeChat\\Receive      | 微信推送事件消息处理支持   | 认证服务号 | \\We::WeChatReceive()      |\n| Scan.php          | WeChat\\Scan         | 微信扫一扫接口支持      | 认证服务号 | \\We::WeChatScan()         |\n| Script.php        | WeChat\\Script       | 微信前端 JSSDK 支持  | 认证服务号 | \\We::WeChatScript()       |\n| Shake.php         | WeChat\\Shake        | 微信蓝牙设备揺一揺接口    | 认证服务号 | \\We::WeChatShake()        |\n| Tags.php          | WeChat\\Tags         | 微信粉丝标签接口支持     | 认证服务号 | \\We::WeChatTags()         |\n| Template.php      | WeChat\\Template     | 微信模板消息接口支持     | 认证服务号 | \\We::WeChatTemplate()     |\n| User.php          | WeChat\\User         | 微信粉丝管理接口支持     | 认证服务号 | \\We::WeChatUser()         |\n| Wifi.php          | WeChat\\Wifi         | 微信门店 WIFI 管理支持 | 认证服务号 | \\We::WeChatWifi()         |\n| **微信支付**          |                     |                |       |                           |\n| Bill.php          | WePay\\Bill          | 微信商户账单及评论      | 微信支付  | \\We::WePayBill()          |\n| Coupon.php        | WePay\\Coupon        | 微信商户代金券        | 微信支付  | \\We::WePayCoupon()        |\n| Order.php         | WePay\\Order         | 微信商户订单         | 微信支付  | \\We::WePayOrder()         |\n| Redpack.php       | WePay\\Redpack       | 微信红包支持         | 微信支付  | \\We::WePayRedpack()       |\n| Refund.php        | WePay\\Refund        | 微信商户退款         | 微信支付  | \\We::WePayRefund()        |\n| Transfers.php     | WePay\\Transfers     | 微信商户打款到零钱      | 微信支付  | \\We::WePayTransfers()     |\n| TransfersBank.php | WePay\\TransfersBank | 微信商户打款到银行卡     | 微信支付  | \\We::WePayTransfersBank() |\n| **微信小程序**         |                     |                |       |                           |\n| Crypt.php         | WeMini\\Crypt        | 微信小程序数据加密处理    | 微信小程序 | \\We::WeMiniCrypt()        |\n| Delivery.php      | WeMini\\Delivery     | 小程序即时配送        | 微信小程序 | \\We::WeMiniDelivery()     |\n| Guide.php         | WeMini\\Guide        | 小程序导购助手        | 微信小程序 | \\We::WeMiniGuide()        |\n| Image.php         | WeMini\\Image        | 小程序图像处理        | 微信小程序 | \\We::WeMiniImage()        |\n| Live.php          | WeMini\\Live         | 小程序直播接口        | 微信小程序 | \\We::WeMiniLive()         |\n| Logistics.php     | WeMini\\Logistics    | 小程序物流助手        | 微信小程序 | \\We::WeMiniLogistics()    |\n| Message.php       | WeMini\\Message      | 小程序动态消息        | 微信小程序 | \\We::WeMiniMessage()      |\n| Newtmpl.php       | WeMini\\Newtmpl      | 小程序订阅消息        | 微信小程序 | \\We::WeMiniNewtmpl()      |\n| Ocr.php           | WeMini\\Ocr          | 小程序 ORC 服务     | 微信小程序 | \\We::WeMiniOcr()          |\n| Operation.php     | WeMini\\Operation    | 小程序运维中心        | 微信小程序 | \\We::WeMiniOperation()    |\n| Plugs.php         | WeMini\\Plugs        | 微信小程序插件管理      | 微信小程序 | \\We::WeMiniPlugs()        |\n| Poi.php           | WeMini\\Poi          | 小程序地址管理        | 微信小程序 | \\We::WeMiniPoi()          |\n| Qrcode.php        | WeMini\\Qrcode       | 微信小程序二维码管理     | 微信小程序 | \\We::WeMiniQrcode()       |\n| Scheme.php        | WeMini\\Scheme       | 小程序 URL-Scheme | 微信小程序 | \\We::WeMiniScheme()       |\n| Search.php        | WeMini\\Search       | 小程序搜索          | 微信小程序 | \\We::WeMiniSearch()       |\n| Security.php      | WeMini\\Security     | 小程序内容安全        | 微信小程序 | \\We::WeMiniSecurity()     |\n| Shipping.php      | WeMini\\Shipping     | 小程序发货信息        | 微信小程序 | \\We::WeMiniShipping()     |\n| Soter.php         | WeMini\\Soter        | 小程序生物认证        | 微信小程序 | \\We::WeMiniSoter()        |\n| Template.php      | WeMini\\Template     | 微信小程序模板消息支持    | 微信小程序 | \\We::WeMiniTemplate()     |\n| Total.php         | WeMini\\Total        | 微信小程序数据接口      | 微信小程序 | \\We::WeMiniTotal()        |\n\n## 📚 文档资源\n\n### 官方文档\n\n- **微信公众平台**：https://mp.weixin.qq.com/wiki\n- **微信支付文档**：https://pay.weixin.qq.com/wiki/doc/api/index.html\n- **支付宝开放平台**：https://opendocs.alipay.com/\n\n### 项目资源\n\n- **ThinkAdmin**：https://github.com/zoujingli/ThinkAdmin\n- **在线文档**：https://www.kancloud.cn/zoujingli/wechat-developer\n- **技术交流群**：QQ 群 513350915\n\n### 代码仓库\n\n- **GitHub**：https://github.com/zoujingli/WeChatDeveloper（主仓库）\n- **Gitee**：https://gitee.com/zoujingli/WeChatDeveloper（国内镜像）\n- **GitCode**：https://gitcode.com/ThinkAdmin/WeChatDeveloper（国内镜像）\n\n## 🛡️ 安全说明\n\n本项目经过全面的安全加固，包括：\n\n- 输入验证和 XSS 防护\n- 文件操作安全检查\n- 加密算法安全升级\n- 序列化数据验证\n- 类型安全修复\n\n建议在生产环境中：\n\n- 定期更新到最新版本\n- 配置 HTTPS 传输\n- 设置适当的文件权限\n- 监控异常访问日志\n\n## 📄 版权说明\n\n**WeChatDeveloper** 遵循 **MIT** 开源协议发布，并免费提供使用。\n\n本项目包含的第三方源码和二进制文件的版权信息将另行标注，请在对应文件查看。\n\n版权所有 Copyright © 2014-2025 by ThinkAdmin (https://thinkadmin.top) All rights reserved。\n\n## 💝 赞助支持\n\n如果这个项目对您有帮助，欢迎赞助支持！\n\n![赞助](https://thinkadmin.top/static/img/pay.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzoujingli%2Fwechatdeveloper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzoujingli%2Fwechatdeveloper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzoujingli%2Fwechatdeveloper/lists"}