<h1 align="center">Pay</h1> <p align="center"> <a href="https://styleci.io/repos/100355112"><img src="https://styleci.io/repos/100355112/shield?branch=master" alt="StyleCI"></a> <a href="https://scrutinizer-ci.com/g/yansongda/pay/?branch=master"><img src="https://scrutinizer-ci.com/g/yansongda/pay/badges/quality-score.png?b=master" alt="Scrutinizer Code Quality"></a> <a href="https://scrutinizer-ci.com/g/yansongda/pay/build-status/master"><img src="https://scrutinizer-ci.com/g/yansongda/pay/badges/build.png?b=master" alt="Build Status"></a> <a href="https://packagist.org/packages/yansongda/pay"><img src="https://poser.pugx.org/yansongda/pay/v/stable" alt="Latest Stable Version"></a> <a href="https://packagist.org/packages/yansongda/pay"><img src="https://poser.pugx.org/yansongda/pay/downloads" alt="Total Downloads"></a> <a href="https://packagist.org/packages/yansongda/pay"><img src="https://poser.pugx.org/yansongda/pay/v/unstable" alt="Latest Unstable Version"></a> <a href="https://packagist.org/packages/yansongda/pay"><img src="https://poser.pugx.org/yansongda/pay/license" alt="License"></a> </p> **!注意:v1.x 版本將不做新功能開發,只進行 bug 維護!請大家盡快遷移到 v2 版本!** 開發了多次支付寶與微信支付后,很自然產生一種反感,惰性又來了,想在網上找相關的輪子,可是一直沒有找到一款自己覺得逞心如意的,要么使用起來太難理解,要么文件結構太雜亂,只有自己擼起袖子干了。 **說明,請先熟悉支付寶說明文檔!!** 歡迎 Star,歡迎 PR! laravel 擴展包請 [https://github.com/yansongda/laravel-pay](https://github.com/yansongda/laravel-pay) ## 特點 - 命名不那么亂七八糟 - 隱藏開發者不需要關注的細節 - 根據支付寶、微信最新 API 開發而成 - 高度抽象的類,免去各種拼json與xml的痛苦 - 符合 PSR 標准,你可以各種方便的與你的框架集成 - 文件結構清晰易理解,可以隨心所欲添加本項目中沒有的支付網關 - 方法使用更優雅,不必再去研究那些奇怪的的方法名或者類名是做啥用的 ## 運行環境 - PHP 5.6+ - composer ## 支持的支付網關 由於各支付網關參差不齊,所以我們抽象了兩個方法 `driver()`,`gateway()`。 兩個方法的作用如下: `driver()` : 確定支付平台,如 `alipay`,`wechat`; `gateway()`: 確定支付網關。通過此方法,確定支付平台下的支付網關。例如,支付寶下有 「電腦網站支付」,「手機網站支付」,「APP 支付」三種支付網關,通過傳入 `web`,`wap`,`app` 確定。 詳細思路可以查看源代碼。 ### 1、支付寶 - 電腦支付 - 手機網站支付 - APP 支付 - 刷卡支付 - 掃碼支付 SDK 中對應的 driver 和 gateway 如下表所示: | driver | gateway | 描述 | | :----: | :-----: | :-------: | | alipay | web | 電腦支付 | | alipay | wap | 手機網站支付 | | alipay | app | APP 支付 | | alipay | pos | 刷卡支付 | | alipay | scan | 掃碼支付 | | alipay | transfer | 帳戶轉賬(可用於平台用戶提現) | ### 2、微信 - 公眾號支付 - 小程序支付 - H5 支付 - 掃碼支付 - 刷卡支付 - APP 支付 SDK 中對應的 driver 和 gateway 如下表所示: | driver | gateway | 描述 | | :----: | :-----: | :-------: | | wechat | mp | 公眾號支付 | | wechat | miniapp | 小程序支付 | | wechat | wap | H5 支付 | | wechat | scan | 掃碼支付 | | wechat | pos | 刷卡支付 | | wechat | app | APP 支付 | | wechat | transfer | 企業付款 | ## 支持的方法 所有網關均支持以下方法 - pay(array $config_biz) 說明:支付接口 參數:數組類型,訂單業務配置項,包含 訂單號,訂單金額等 返回:mixed 詳情請看「支付網關配置說明與返回值」一節。 - refund(array|string $config_biz, $refund_amount = null) 說明:退款接口 參數:`$config_biz` 為字符串類型僅對`支付寶支付`有效,此時代表訂單號,第二個參數為退款金額。 返回:mixed 退款成功,返回 服務器返回的數組;否則返回 false; - close(array|string $config_biz) 說明:關閉訂單接口 參數:`$config_biz` 為字符串類型時代表訂單號,如果為數組,則為關閉訂單業務配置項,配置項內容請參考各個支付網關官方文檔。 返回:mixed 關閉訂單成功,返回 服務器返回的數組;否則返回 false; - find(string $out_trade_no) 說明:查找訂單接口 參數:`$out_trade_no` 為訂單號。 返回:mixed 查找訂單成功,返回 服務器返回的數組;否則返回 false; - verify($data, $sign = null) 說明:驗證服務器返回消息是否合法 參數:`$data` 為服務器接收到的原始內容,`$sign` 為簽名信息,當其為空時,系統將自動轉化 `$data` 為數組,然后取 `$data['sign']`。 返回:mixed 驗證成功,返回 服務器返回的數組;否則返回 false; ## 安裝 ```shell composer require "yansongda/pay:^1.0" ``` ## 使用說明 ### 0、一個完整的例子: ```php <?php namespace App\Http\Controllers; use Yansongda\Pay\Pay; use Illuminate\Http\Request; class PayController extends Controller { protected $config = [ 'alipay' => [ 'app_id' => '2016082000295641', 'notify_url' => 'http://yansongda.cn/alipay_notify.php', 'return_url' => 'http://yansongda.cn/return.php', 'ali_public_key' => 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuWJKrQ6SWvS6niI+4vEVZiYfjkCfLQfoFI2nCp9ZLDS42QtiL4Ccyx8scgc3nhVwmVRte8f57TFvGhvJD0upT4O5O/lRxmTjechXAorirVdAODpOu0mFfQV9y/T9o9hHnU+VmO5spoVb3umqpq6D/Pt8p25Yk852/w01VTIczrXC4QlrbOEe3sr1E9auoC7rgYjjCO6lZUIDjX/oBmNXZxhRDrYx4Yf5X7y8FRBFvygIE2FgxV4Yw+SL3QAa2m5MLcbusJpxOml9YVQfP8iSurx41PvvXUMo49JG3BDVernaCYXQCoUJv9fJwbnfZd7J5YByC+5KM4sblJTq7bXZWQIDAQAB', 'private_key' => 'MIIEpAIBAAKCAQEAs6+F2leOgOrvj9jTeDhb5q46GewOjqLBlGSs/bVL4Z3fMr3p+Q1Tux/6uogeVi/eHd84xvQdfpZ87A1SfoWnEGH5z15yorccxSOwWUI+q8gz51IWqjgZxhWKe31BxNZ+prnQpyeMBtE25fXp5nQZ/pftgePyUUvUZRcAUisswntobDQKbwx28VCXw5XB2A+lvYEvxmMv/QexYjwKK4M54j435TuC3UctZbnuynSPpOmCu45ZhEYXd4YMsGMdZE5/077ZU1aU7wx/gk07PiHImEOCDkzqsFo0Buc/knGcdOiUDvm2hn2y1XvwjyFOThsqCsQYi4JmwZdRa8kvOf57nwIDAQABAoIBAQCw5QCqln4VTrTvcW+msB1ReX57nJgsNfDLbV2dG8mLYQemBa9833DqDK6iynTLNq69y88ylose33o2TVtEccGp8Dqluv6yUAED14G6LexS43KtrXPgugAtsXE253ZDGUNwUggnN1i0MW2RcMqHdQ9ORDWvJUCeZj/AEafgPN8AyiLrZeL07jJz/uaRfAuNqkImCVIarKUX3HBCjl9TpuoMjcMhz/MsOmQ0agtCatO1eoH1sqv5Odvxb1i59c8Hvq/mGEXyRuoiDo05SE6IyXYXr84/Nf2xvVNHNQA6kTckj8shSi+HGM4mO1Y4Pbb7XcnxNkT0Inn6oJMSiy56P+CpAoGBAO1O+5FE1ZuVGuLb48cY+0lHCD+nhSBd66B5FrxgPYCkFOQWR7pWyfNDBlmO3SSooQ8TQXA25blrkDxzOAEGX57EPiipXr/hy5e+WNoukpy09rsO1TMsvC+v0FXLvZ+TIAkqfnYBgaT56ku7yZ8aFGMwdCPL7WJYAwUIcZX8wZ3dAoGBAMHWplAqhe4bfkGOEEpfs6VvEQxCqYMYVyR65K0rI1LiDZn6Ij8fdVtwMjGKFSZZTspmsqnbbuCE/VTyDzF4NpAxdm3cBtZACv1Lpu2Om+aTzhK2PI6WTDVTKAJBYegXaahBCqVbSxieR62IWtmOMjggTtAKWZ1P5LQcRwdkaB2rAoGAWnAPT318Kp7YcDx8whOzMGnxqtCc24jvk2iSUZgb2Dqv+3zCOTF6JUsV0Guxu5bISoZ8GdfSFKf5gBAo97sGFeuUBMsHYPkcLehM1FmLZk1Q+ljcx3P1A/ds3kWXLolTXCrlpvNMBSN5NwOKAyhdPK/qkvnUrfX8sJ5XK2H4J8ECgYAGIZ0HIiE0Y+g9eJnpUFelXvsCEUW9YNK4065SD/BBGedmPHRC3OLgbo8X5A9BNEf6vP7fwpIiRfKhcjqqzOuk6fueA/yvYD04v+Da2MzzoS8+hkcqF3T3pta4I4tORRdRfCUzD80zTSZlRc/h286Y2eTETd+By1onnFFe2X01mwKBgQDaxo4PBcLL2OyVT5DoXiIdTCJ8KNZL9+kV1aiBuOWxnRgkDjPngslzNa1bK+klGgJNYDbQqohKNn1HeFX3mYNfCUpuSnD2Yag53Dd/1DLO+NxzwvTu4D6DCUnMMMBVaF42ig31Bs0jI3JQZVqeeFzSET8fkoFopJf3G6UXlrIEAQ==', ], ]; public function index() { $config_biz = [ 'out_trade_no' => time(), 'total_amount' => '1', 'subject' => 'test subject', ]; $pay = new Pay($this->config); return $pay->driver('alipay')->gateway()->pay($config_biz); } public function return(Request $request) { $pay = new Pay($this->config); return $pay->driver('alipay')->gateway()->verify($request->all()); } public function notify(Request $request) { $pay = new Pay($this->config); if ($pay->driver('alipay')->gateway()->verify($request->all())) { // 請自行對 trade_status 進行判斷及其它邏輯進行判斷,在支付寶的業務通知中,只有交易通知狀態為 TRADE_SUCCESS 或 TRADE_FINISHED 時,支付寶才會認定為買家付款成功。 // 1、商戶需要驗證該通知數據中的out_trade_no是否為商戶系統中創建的訂單號; // 2、判斷total_amount是否確實為該訂單的實際金額(即商戶訂單創建時的金額); // 3、校驗通知中的seller_id(或者seller_email) 是否為out_trade_no這筆單據的對應的操作方(有的時候,一個商戶可能有多個seller_id/seller_email); // 4、驗證app_id是否為該商戶本身。 // 5、其它業務邏輯情況 file_put_contents(storage_path('notify.txt'), "收到來自支付寶的異步通知\r\n", FILE_APPEND); file_put_contents(storage_path('notify.txt'), '訂單號:' . $request->out_trade_no . "\r\n", FILE_APPEND); file_put_contents(storage_path('notify.txt'), '訂單金額:' . $request->total_amount . "\r\n\r\n", FILE_APPEND); } else { file_put_contents(storage_path('notify.txt'), "收到異步通知\r\n", FILE_APPEND); } echo "success"; } } ``` ```php <?php namespace App\Http\Controllers; use Yansongda\Pay\Pay; use Illuminate\Http\Request; class PayController extends Controller { protected $config = [ 'wechat' => [ 'app_id' => 'wxb3f6xxxxxxxxxx', 'mch_id' => '1457xxxxx2', 'notify_url' => 'http://yansongda.cn/wechat_notify.php', 'key' => 'mF2suE9sU6Mk1Cxxxxxxxxxx45', 'cert_client' => './apiclient_cert.pem', 'cert_key' => './apiclient_key.pem', ], ]; public function index() { $config_biz = [ 'out_trade_no' => 'e2', 'total_fee' => '1', // **單位:分** 'body' => 'test body', 'spbill_create_ip' => '8.8.8.8', 'openid' => 'onkVf1FjWS5SBIihS-123456_abc', ]; $pay = new Pay($this->config); return $pay->driver('wechat')->gateway('mp')->pay($config_biz); } public function notify(Request $request) { $pay = new Pay($this->config); $verify = $pay->driver('wechat')->gateway('mp')->verify($request->getContent()); if ($verify) { file_put_contents('notify.txt', "收到來自微信的異步通知\r\n", FILE_APPEND); file_put_contents('notify.txt', '訂單號:' . $verify['out_trade_no'] . "\r\n", FILE_APPEND); file_put_contents('notify.txt', '訂單金額:' . $verify['total_fee'] . "\r\n\r\n", FILE_APPEND); } else { file_put_contents(storage_path('notify.txt'), "收到異步通知\r\n", FILE_APPEND); } echo "success"; } } ``` ### 1、准備配置參數 ```php <?php $config = [ 'alipay' => [ 'app_id' => '', // 支付寶提供的 APP_ID 'ali_public_key' => '', // 支付寶公鑰,1行填寫 'private_key' => '', // 自己的私鑰,1行填寫 ], ]; $config_biz = [ 'out_trade_no' => '12', // 訂單號 'total_amount' => '13', // 訂單金額,單位:元,**微信支付,單位:分** 'subject' => 'test subject', // 訂單商品標題 ]; ``` ### 2、在代碼中使用 ```php <?php $pay = new Pay($config); return $pay->driver('alipay')->gateway('web')->pay($config_biz); ``` ## 錯誤 使用非跳轉接口(如, `refund` 接口,`close` 接口)時,如果在調用相關支付網關 API 時有錯誤產生,會拋出 `GatewayException` 錯誤,可以通過 `$e->getMessage()` 查看,同時,也可通過 `$e->raw` 查看調用 API 后返回的原始數據,該值為數組格式。 ## 支付網關配置說明與返回值 由於支付網關不同,每家參數參差不齊,為了方便,我們抽象定義了兩個參數:`$config`,`$config_biz`,分別為全局參數,業務參數。但是,所有配置參數均為官方標准參數,無任何差別。 「業務參數」為訂單相關的參數,「全局參數」為除訂單相關參數以外的全局性參數。 具體參數列表請查看每個支付網關的使用說明。 ### 1、支付寶 - 電腦網站支付 #### 最小配置參數 ```php <?php $config = [ 'alipay' => [ 'app_id' => '', // 支付寶提供的 APP_ID 'ali_public_key' => '', // 支付寶公鑰,1行填寫 'private_key' => '', // 自己的私鑰,1行填寫 ], ]; $config_biz = [ 'out_trade_no' => '12', // 訂單號 'total_amount' => '13', // 訂單金額,單位:元 'subject' => 'test subject', // 訂單商品標題 ]; ``` #### 所有配置參數 所有參數均為官方標准參數,無任何差別。[點擊這里](https://docs.open.alipay.com/common/105901 '支付寶官方文檔') 查看官方文檔。 ```php <?php $config = [ 'alipay' => [ 'app_id' => '', // 支付寶提供的 APP_ID 'ali_public_key' => '', // 支付寶公鑰,1行填寫 'private_key' => '', // 自己的私鑰,1行填寫 'return_url' => '', // 同步通知 url,*強烈建議加上本參數* 'notify_url' => '', // 異步通知 url,*強烈建議加上本參數* ], ]; $config_biz = [ 'out_trade_no' => '', 'total_amount' => '', 'subject' => '', // 訂單描述 'body' => '', // 訂單包含的商品列表信息,Json格式: {"show_url":"https://或http://打頭的商品的展示地址"} ,在支付時,可點擊商品名稱跳轉到該地址 'goods_detail' => '', // 該筆訂單允許的最晚付款時間,逾期將關閉交易。取值范圍:1m~15d。m-分鍾,h-小時,d-天,1c-當天(1c-當天的情況下,無論交易何時創建,都在0點關閉)。 該參數數值不接受小數點, 如 1.5h,可轉換為 90m。該參數在請求到支付寶時開始計時。 'timeout_express' => '', // 禁用渠道,用戶不可用指定渠道支付當有多個渠道時用“,”分隔注:與enable_pay_channels互斥 'disable_pay_channels' => '', // 可用渠道,用戶只能在指定渠道范圍內支付當有多個渠道時用“,”分隔注:與disable_pay_channels互斥 'enable_pay_channels' => '', // 公用回傳參數,如果請求時傳遞了該參數,則返回給商戶時會回傳該參數。支付寶只會在異步通知時將該參數原樣返回。本參數必須進行UrlEncode之后才可以發送給支付寶 'passback_params' => '', // 業務擴展參數,詳見 [業務擴展參數說明](https://docs.open.alipay.com/#kzcs) 'extend_params' => '', // 商品主類型:0—虛擬類商品,1—實物類商品(默認)注:虛擬類商品不支持使用花唄渠道 'goods_type' => '', // 獲取用戶授權信息,可實現如免登功能。獲取方法請查閱:用戶信息授權 'auth_token' => '', /** * PC掃碼支付的方式,支持前置模式和跳轉模式。 * * 前置模式是將二維碼前置到商戶的訂單確認頁的模式。需要商戶在自己的頁面中以iframe方式請求支付寶頁面。具體分為以下幾種: * 0:訂單碼-簡約前置模式,對應iframe寬度不能小於600px,高度不能小於300px; * 1:訂單碼-前置模式,對應iframe寬度不能小於300px,高度不能小於600px; * 3:訂單碼-迷你前置模式,對應iframe寬度不能小於75px,高度不能小於75px; * 4:訂單碼-可定義寬度的嵌入式二維碼,商戶可根據需要設定二維碼的大小。 * * 跳轉模式下,用戶的掃碼界面是由支付寶生成的,不在商戶的域名下。 * 2:訂單碼-跳轉模式 */ 'qr_pay_mode' => '', // 商戶自定義二維碼寬度 注:qr_pay_mode=4時該參數生效 'qrcode_width' => '' ]; ``` #### 返回值 - pay() 類型:string 說明:該接口返回跳轉到支付寶支付的 Html 代碼。 ### 2、支付寶 - 手機網站支付 #### 最小配置參數 ```php <?php $config = [ 'alipay' => [ 'app_id' => '', // 支付寶提供的 APP_ID 'ali_public_key' => '', // 支付寶公鑰,1行填寫 'private_key' => '', // 自己的私鑰,1行填寫 ], ]; $config_biz = [ 'out_trade_no' => '12', // 訂單號 'total_amount' => '13', // 訂單金額,單位:元 'subject' => 'test subject', // 訂單商品標題 ]; ``` #### 所有配置參數 該網關大部分參數和 「電腦支付」 相同,具體請參考 [官方文檔](https://docs.open.alipay.com/203/107090/ '支付寶手機網站支付文檔') #### 返回值 - pay() 類型:string 說明:該接口返回跳轉到支付寶支付的 Html 代碼。 ### 3、支付寶 - APP 支付 #### 最小配置參數 ```php <?php $config = [ 'alipay' => [ 'app_id' => '', // 支付寶提供的 APP_ID 'notify_url' => '', // 支付寶異步通知地址 'ali_public_key' => '', // 支付寶公鑰,1行填寫 'private_key' => '', // 自己的私鑰,1行填寫 ], ]; $config_biz = [ 'out_trade_no' => '12', // 訂單號 'total_amount' => '13', // 訂單金額,單位:元 'subject' => 'test subject', // 訂單商品標題 ]; ``` #### 所有配置參數 該網關大部分參數和 「電腦支付」 相同,具體請參考 [官方文檔](https://docs.open.alipay.com/204/105465/ '支付寶APP支付文檔') #### 返回值 - pay() 類型:string 說明:該接口返回用於客戶端調用的 orderString 字符串,可直接供 APP 客戶端調用,客戶端調用方法不在此文檔討論范圍內,[Android 用戶請看這里](https://docs.open.alipay.com/204/105300/),[Ios 用戶請看這里](https://docs.open.alipay.com/204/105299/)。 ### 4、支付寶 - 刷卡支付 #### 最小配置參數 ```php <?php $config = [ 'alipay' => [ 'app_id' => '', // 支付寶提供的 APP_ID 'ali_public_key' => '', // 支付寶公鑰,1行填寫 'private_key' => '', // 自己的私鑰,1行填寫 ], ]; $config_biz = [ 'out_trade_no' => '12', // 訂單號 'total_amount' => '13', // 訂單金額,單位:元 'subject' => 'test subject', // 訂單商品標題 'auth_code' => '123456', // 授權碼 ]; ``` #### 所有配置參數 該網關大部分參數和 「電腦支付」 相同,具體請參考 [官方文檔](https://docs.open.alipay.com/api_1/alipay.trade.pay ' 支付寶APP支付文檔') #### 返回值 - pay() 類型:array|bool 說明:該接口成功時返回服務器響應的數組;驗簽失敗返回 false。 ### 5、支付寶 - 掃碼支付 #### 最小配置參數 ```php <?php $config = [ 'alipay' => [ 'app_id' => '', // 支付寶提供的 APP_ID 'notify_url' => '', // 支付寶異步通知地址 'ali_public_key' => '', // 支付寶公鑰,1行填寫 'private_key' => '', // 自己的私鑰,1行填寫 ], ]; $config_biz = [ 'out_trade_no' => '12', // 訂單號 'total_amount' => '13', // 訂單金額,單位:元 'subject' => 'test subject', // 訂單商品標題 ]; ``` #### 所有配置參數 該網關大部分參數和 「電腦支付」 相同,具體請參考 [官方文檔](https://docs.open.alipay.com/api_1/alipay.trade.precreate ' 支付寶APP支付文檔') #### 返回值 - pay() 類型:string 說明:該接口返回二維碼鏈接,可以通過其他庫轉換為二維碼供用戶掃描。 ### 6、支付寶 - 帳戶轉賬 #### 最小配置參數 ```php <?php $config = [ 'alipay' => [ 'app_id' => '', // 支付寶提供的 APP_ID 'ali_public_key' => '', // 支付寶公鑰,1行填寫 'private_key' => '', // 自己的私鑰,1行填寫 ], ]; $config_biz = [ 'out_biz_no' => '', // 訂單號 'payee_type' => 'ALIPAY_LOGONID', // 收款方賬戶類型(ALIPAY_LOGONID | ALIPAY_USERID) 'payee_account' => 'demo@sandbox.com', // 收款方賬戶 'amount' => '10', // 轉賬金額 ]; ``` #### 所有配置參數 ```php <?php $config = [ 'alipay' => [ 'app_id' => '', // 支付寶提供的 APP_ID 'ali_public_key' => '', // 支付寶公鑰,1行填寫 'private_key' => '', // 自己的私鑰,1行填寫 ], ]; $config_biz = [ 'out_biz_no' => '', // 訂單號 'payee_type' => 'ALIPAY_LOGONID', // 收款方賬戶類型(ALIPAY_LOGONID | ALIPAY_USERID) 'payee_account' => 'demo@sandbox.com', // 收款方賬戶 'amount' => '10', // 轉賬金額 'payer_show_name' => '未寒', // 付款方姓名 'payee_real_name' => '張三', // 收款方真實姓名 'remark' => '張三', // 轉賬備注 ]; ``` [官方文檔](https://doc.open.alipay.com/docs/api.htm?apiId=1321&docType=4 ' 單筆轉賬到支付寶賬戶接口') #### 返回值 - pay() 類型:array|bool 說明:該接口成功時返回服務器響應的數組;驗簽失敗返回 false。 ### 7、微信 - 公眾號支付 #### 最小配置參數 ```php <?php $config = [ 'wechat' => [ 'app_id' => '', // 公眾號APPID 'mch_id' => '', // 微信商戶號 'notify_url' => '', 'key' => '', // 微信支付簽名秘鑰 'cert_client' => './apiclient_cert.pem', // 客戶端證書路徑,退款時需要用到 'cert_key' => './apiclient_key.pem', // 客戶端秘鑰路徑,退款時需要用到 ], ]; $config_biz = [ 'out_trade_no' => '', // 訂單號 'total_fee' => '', // 訂單金額,**單位:分** 'body' => '', // 訂單描述 'spbill_create_ip' => '', // 支付人的 IP 'openid' => '', // 支付人的 openID ]; ``` #### 所有配置參數 所有參數均為官方標准參數,無任何差別。[點擊這里](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1 '微信支付官方文檔') 查看官方文檔。 ```php <?php $config = [ 'wechat' => [ 'endpoint_url' => 'https://apihk.mch.weixin.qq.com/', // optional, default 'https://api.mch.weixin.qq.com/' 'app_id' => '', // 公眾號APPID 'mch_id' => '', // 微信商戶號 'notify_url' => '', 'key' => '', // 微信支付簽名秘鑰 'cert_client' => './apiclient_cert.pem', // 客戶端證書路徑,退款時需要用到 'cert_key' => './apiclient_key.pem', // 客戶端秘鑰路徑,退款時需要用到 ], ]; $config_biz = [ 'out_trade_no' => '', // 訂單號 'total_fee' => '', // 訂單金額,**單位:分** 'body' => '', // 訂單描述 'spbill_create_ip' => '', // 支付人的 IP 'openid' => '', // 支付人的 openID // 自定義參數,可以為終端設備號(門店號或收銀設備ID),PC網頁或公眾號內支付可以傳"WEB" 'device_info' => '', // 商品詳細描述,對於使用單品優惠的商戶,改字段必須按照規范上傳,詳見“單品優惠參數說明” 'detail' => '', // 附加數據,在查詢API和支付通知中原樣返回,可作為自定義參數使用。 'attach' => '', // 符合ISO 4217標准的三位字母代碼,默認人民幣:CNY,詳細列表請參見貨幣類型 'fee_type' => '', // 訂單生成時間,格式為yyyyMMddHHmmss,如2009年12月25日9點10分10秒表示為20091225091010。其他詳見時間規則 'time_start' => '', // 訂單失效時間,格式為yyyyMMddHHmmss,如2009年12月27日9點10分10秒表示為20091227091010。其他詳見時間規則注意:最短失效時間間隔必須大於5分鍾 'time_expire' => '', // 訂單優惠標記,使用代金券或立減優惠功能時需要的參數,說明詳見代金券或立減優惠 'goods_tag' => '', // trade_type=NATIVE時(即掃碼支付),此參數必傳。此參數為二維碼中包含的商品ID,商戶自行定義。 'product_id' => '', // 上傳此參數no_credit--可限制用戶不能使用信用卡支付 'limit_pay' => '', // 該字段用於上報場景信息,目前支持上報實際門店信息。該字段為JSON對象數據,對象格式為{"store_info":{"id": "門店ID","name": "名稱","area_code": "編碼","address": "地址" }} ,字段詳細說明請點擊行前的+展開 'scene_info' => '', ]; ``` #### 返回值 - pay() 類型:array 說明:返回用於 微信內H5調起支付 的所需參數數組。后續調用不在本文檔討論范圍內,具體請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6)。 后續調用舉例: ```html <script type="text/javascript"> function onBridgeReady(){ WeixinJSBridge.invoke( 'getBrandWCPayRequest', { "appId":"<?php echo $pay['appId']; ?>", //公眾號名稱,由商戶傳入 "timeStamp":"<?php echo $pay['timeStamp']; ?>", //時間戳,自1970年以來的秒數 "nonceStr":"<?php echo $pay['nonceStr']; ?>", //隨機串 "package":"<?php echo $pay['package']; ?>", "signType":"<?php echo $pay['signType']; ?>", //微信簽名方式: "paySign":"<?php echo $pay['paySign']; ?>" //微信簽名 }, function(res){ if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判斷前端返回,微信團隊鄭重提示:res.err_msg將在用戶支付成功后返回 ok,但並不保證它絕對可靠。 } ); } $(function(){ $('#pay').click(function(){ if (typeof WeixinJSBridge == "undefined"){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', onBridgeReady); document.attachEvent('onWeixinJSBridgeReady', onBridgeReady); } }else{ onBridgeReady(); } }) }); </script> ``` ### 8、微信 - 小程序支付 #### 最小配置參數 ```php <?php $config = [ 'wechat' => [ 'miniapp_id' => '', // 小程序APPID 'mch_id' => '', // 微信商戶號 'notify_url' => '', 'key' => '', // 微信支付簽名秘鑰 'cert_client' => './apiclient_cert.pem', // 客戶端證書路徑,退款時需要用到 'cert_key' => './apiclient_key.pem', // 客戶端秘鑰路徑,退款時需要用到 ], ]; $config_biz = [ 'out_trade_no' => '', // 訂單號 'total_fee' => '', // 訂單金額,**單位:分** 'body' => '', // 訂單描述 'spbill_create_ip' => '', // 支付人的 IP 'openid' => '', // 支付人的 openID ]; ``` #### 所有配置參數 由於「小程序支付」和「公眾號支付」都使用的是 JSAPI,所以,除了 APPID 一個使用的是公眾號的 APPID 一個使用的是 小程序的 APPID 以外,該網關所有參數和 「公眾號支付」 相同,具體請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1)。 #### 返回值 - pay() 類型:array 說明:返回用於 小程序調起支付API 的所需參數數組。后續調用不在本文檔討論范圍內,具體請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=3)。 ### 9、微信 - H5 支付 #### 最小配置參數 ```php <?php $config = [ 'wechat' => [ 'app_id' => '', // 微信公眾號 APPID 'mch_id' => '', // 微信商戶號 'return_url' => '', // *此配置選項可選*,注意,該跳轉 URL 只有跳轉之意,沒有同步通知功能 'notify_url' => '', 'key' => '', // 微信支付簽名秘鑰 'cert_client' => './apiclient_cert.pem', // 客戶端證書路徑,退款時需要用到 'cert_key' => './apiclient_key.pem', // 客戶端秘鑰路徑,退款時需要用到 ], ]; $config_biz = [ 'out_trade_no' => '', // 訂單號 'total_fee' => '', // 訂單金額,**單位:分** 'body' => '', // 訂單描述 'spbill_create_ip' => '', // 支付人的 IP ]; ``` #### 所有配置參數 所有配置項和前面支付網關相差不大,請[點擊這里查看](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1). #### 返回值 - pay() 類型:string 說明:返回微信支付中間頁網址,可直接 302 跳轉。 ### 10、微信 - 掃碼支付 這里使用「模式二」進行掃碼支付,具體請[參考這里](https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5) #### 最小配置參數 ```php <?php $config = [ 'wechat' => [ 'app_id' => '', // 微信公眾號 APPID 'mch_id' => '', // 微信商戶號 'notify_url' => '', 'key' => '', // 微信支付簽名秘鑰 'cert_client' => './apiclient_cert.pem', // 客戶端證書路徑,退款時需要用到 'cert_key' => './apiclient_key.pem', // 客戶端秘鑰路徑,退款時需要用到 ], ]; $config_biz = [ 'out_trade_no' => '', // 訂單號 'total_fee' => '', // 訂單金額,**單位:分** 'body' => '', // 訂單描述 'spbill_create_ip' => '', // 調用 API 服務器的 IP 'product_id' => '', // 訂單商品 ID ]; ``` #### 所有配置參數 所有配置項和前面支付網關相差不大,請[點擊這里查看](https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1) #### 返回值 - pay() 類型:string 說明:返回微信支付二維碼 URL 地址,可直接將此 url 生成二維碼,展示給用戶進行掃碼支付。 ### 11、微信 - 刷卡支付 #### 最小配置參數 ```php <?php $config = [ 'wechat' => [ 'app_id' => '', // 公眾號 APPID 'mch_id' => '', // 微信商戶號 'key' => '', // 微信支付簽名秘鑰 'cert_client' => './apiclient_cert.pem', // 客戶端證書路徑,退款時需要用到 'cert_key' => './apiclient_key.pem', // 客戶端秘鑰路徑,退款時需要用到 ], ]; $config_biz = [ 'out_trade_no' => '', // 訂單號 'total_fee' => '', // 訂單金額,**單位:分** 'body' => '', // 訂單描述 'spbill_create_ip' => '', // 支付人的 IP 'auth_code' => '', // 授權碼 ]; ``` #### 所有配置參數 該網關所有參數和其它支付網關基本相同,具體請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1)。 #### 返回值 - pay() 類型:array 說明:返回用於服務器返回的數組。返回參數請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1)。 ### 12、微信 - APP 支付 #### 最小配置參數 ```php <?php $config = [ 'wechat' => [ 'appid' => '', // APPID 'mch_id' => '', // 微信商戶號 'notify_url' => '', 'key' => '', // 微信支付簽名秘鑰 'cert_client' => './apiclient_cert.pem', // 客戶端證書路徑,退款時需要用到 'cert_key' => './apiclient_key.pem', // 客戶端秘鑰路徑,退款時需要用到 ], ]; $config_biz = [ 'out_trade_no' => '', // 訂單號 'total_fee' => '', // 訂單金額,**單位:分** 'body' => '', // 訂單描述 'spbill_create_ip' => '', // 支付人的 IP ]; ``` #### 所有配置參數 該網關所有參數和其它支付網關相同相同,具體請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1)。 #### 返回值 - pay() 類型:array 說明:返回用於 小程序調起支付API 的所需參數數組。后續調用不在本文檔討論范圍內,具體請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5)。 ### 12、微信 - 企業付款 #### 最小配置參數 ```php <?php $config = [ 'wechat' => [ 'appid' => '', // APPID 'mch_id' => '', // 微信商戶號 'key' => '', // 微信支付簽名秘鑰 'cert_client' => './apiclient_cert.pem', // 客戶端證書路徑,退款時需要用到 'cert_key' => './apiclient_key.pem', // 客戶端秘鑰路徑,退款時需要用到 ], ]; $config_biz = [ 'partner_trade_no' => '', //商戶訂單號 'openid' => '', //收款人的openid 'check_name' => 'NO_CHECK', //NO_CHECK:不校驗真實姓名\FORCE_CHECK:強校驗真實姓名 // 're_user_name'=>'張三', //check_name為 FORCE_CHECK 校驗實名的時候必須提交 'amount' => 100, //企業付款金額,單位為分 'desc' => '帳戶提現', //付款說明 'spbill_create_ip' => '192.168.0.1', //發起交易的IP地址 ]; ``` #### 所有配置參數 具體請看 [官方文檔](https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2)。 #### 返回值 - pay() 類型:array 說明:返回用於 支付結果 的數組。具體請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2)。 ### 13、微信 - 發放裂變紅包 #### 最小配置參數 ```php <?php $config = [ 'wechat' => [ 'app_id'=>'wxaxxxxxxxx', 'mch_id' => '1442222202', 'key' => 'ddddddddddddddd', 'cert_client' => 'D:\php\xxx\application\wxpay\cert\apiclient_cert.pem', 'cert_key' => 'D:\php\xxx\application\wxpay\cert\apiclient_key.pem', ], ]; $config_biz = [ 'wxappid'=>'wxaxxxxxxxx', 'mch_billno' => 'hb'.time(), 'send_name'=>'萌點雲科技',//商戶名稱 're_openid'=>'ogg5JwsssssssssssCdXeD_S54',//用戶openid 'total_amount' =>333, // 付款金額,單位分 'wishing'=>'提前祝你狗年大吉',//紅包祝福語 'client_ip'=>'192.168.0.1',//調用接口的機器Ip地址 'total_num'=>'3',//紅包發放總人數 'act_name'=>'提前拜年',//活動名稱 'remark'=>'提前祝你狗年大吉,苟富貴勿相忘!', //備注 'amt_type'=>'ALL_RAND',//ALL_RAND—全部隨機,商戶指定總金額和紅包發放總人數,由微信支付隨機計算出各紅包金額 ]; $pay = new Pay($config); try { $res= $pay->driver('wechat')->gateway('groupredpack')->pay($config_biz); }catch (Exception $e){ } ``` #### 所有配置參數 具體請看 [官方文檔](https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5&index=4)。 #### 返回值 - pay() 類型:array 說明:返回用於 支付結果 的數組。具體請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5&index=4)。 ### 14、微信 - 發放普通紅包 #### 最小配置參數 ```php <?php $config = [ 'wechat' => [ 'app_id'=>'wxaxxxxxxxx', 'mch_id' => '1442222202', 'key' => 'ddddddddddddddd', 'cert_client' => 'D:\php\xxx\application\wxpay\cert\apiclient_cert.pem', 'cert_key' => 'D:\php\xxx\application\wxpay\cert\apiclient_key.pem', ], ]; $config_biz = [ 'wxappid'=>'wxaxxxxxxxx', 'mch_billno' => 'hb'.time(), 'send_name'=>'萌點雲科技',//商戶名稱 're_openid'=>'ogg5JwsssssssssssCdXeD_S54',//用戶openid 'total_amount' =>100, // 付款金額,單位分 'wishing'=>'提前祝你狗年大吉',//紅包祝福語 'client_ip'=>'192.168.0.1',//調用接口的機器Ip地址 'total_num'=>'1',//紅包發放總人數 'act_name'=>'提前拜年',//活動名稱 'remark'=>'提前祝你狗年大吉,苟富貴勿相忘!', //備注 ]; $pay = new Pay($config); try { $res= $pay->driver('wechat')->gateway('redpack')->pay($config_biz); }catch (Exception $e){ } ``` #### 所有配置參數 具體請看 [官方文檔](https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3)。 #### 返回值 - pay() 類型:array 說明:返回用於 支付結果 的數組。具體請 [參考這里](https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3)。 ## 代碼貢獻 由於測試及使用環境的限制,本項目中只開發了「支付寶」和「微信支付」的相關支付網關。 如果您有其它支付網關的需求,或者發現本項目中需要改進的代碼,**_歡迎 Fork 並提交 PR!_** ## LICENSE MIT