https://github.com/RunnerLee/...php
名稱 | 網關 | 支持動做 | 支持回調 | 備註 |
---|---|---|---|---|
alipay_app | 支付寶 APP 支付 | 支付/支付查詢/退款 | 支付 | |
alipay_qr | 支付寶掃碼支付 | 支付/支付查詢/退款 | 支付 | |
alipay_wap | 支付寶手機網站支付 | 支付/支付查詢/退款 | 支付 | |
alipay_web | 支付寶 PC 網站支付 | 支付/支付查詢/退款 | 支付 | |
wechat_app | 微信 APP 支付 | 支付/支付查詢/退款/退款查詢 | 支付通知/退款通知 | |
wechat_h5 | 微信 H5 支付 | 支付/支付查詢/退款/退款查詢 | 支付通知/退款通知 | 內置抓取付款連接功能 |
wechat_mina | 微信小程序支付 | 支付/支付查詢/退款/退款查詢 | 支付通知/退款通知 | |
wechat_official | 微信公衆號支付 | 支付/支付查詢/退款/退款查詢 | 支付通知/退款通知 | |
wechat_qr | 微信掃碼支付 | 支付/支付查詢/退款/退款查詢 | 支付通知/退款通知 | |
union_web | 銀聯網頁支付 | 支付/支付查詢 | 支付通知 | 較舊版本 |
union_app | 銀聯網頁支付 | 支付 | 支付通知 | 較舊版本 |
paypal_express_checkout | PayPal 快速結帳 | 支付/支付查詢 | 支付通知 | 不穩定 |
在對接第三方支付中, 尤爲是須要對接多個第三方支付時, 須要閱讀第三方文檔而後花費大量時間拼裝和調試參數, 例如調用第三方下單建立支付, 若是須要同時接入微信跟支付寶支付, 那麼就須要收集文檔, 可想而知是很是麻煩的(其實還好.. hhh..). laravel
這個組件提供的把與第三方通訊分爲三部分:git
而每部分又部分爲不一樣的動做, 每一個動做綁定一個固定的表單 (Form), 每一個表單的內容是固定的.github
例如主動調用第三方下單建立支付 (ChargeRequest), 他使用的表單是 ChargeRequestForm
. 填寫好表單後, 傳入組件, 便可由組件加工好參數並調用第三方支付.web
這樣就能作到, 只須要了解組件的表單內容, 就能夠接入多個第三方支付, 一勞永逸 (不存在的 hhh).數據庫
這裏以支付寶 PC 網站支付爲例, 若是須要使用其餘的支付網關, 只須要修改實例化 Cashier
時傳入的 $gateway
便可.express
注意, 組件使用的基本貨幣單位是 分.
<?php use Runner\NezhaCashier\Cashier; // 按格式組裝好配置 $config = [ 'app_id' => 'xxxx', 'app_private_key' => 'xxxxx', 'alipay_public_key' => 'xxxxx', ]; // 建立實例, 傳入要使用的 Gateway $cashier = new Cashier('alipay_web', $config);
建立付款小程序
<?php // 組裝 ChargeRequestForm $data = [ 'order_id' => '151627101400000071', 'subject' => 'testing', 'amount' => 1, 'currency' => 'CNY', 'description' => 'testing description', 'return_url' => 'https://www.baidu.com', 'expired_at' => '2018-01-23 19:00:00', ]; $form = $cashier->charge($data); // 以 laravel 爲例 return redirect($form->get('charge_url'));
查詢支付微信小程序
<?php $form = $cashier->query([ 'order_id' => '151627101400000071', ]); var_dump('paid' === $form->get('status'));
接收通知微信
<?php $form = $cashier->notify('charge'); var_dump('paid' === $form->get('status')); var_dump($form->get('trade_sn')); // 取得第三方交易號
退款
<?php $form = $cashier->refund([ 'order_id' => '151627101400000071', 'refund_id' => '3151627101400000071', 'total_amount' => 1, 'refund_amount' => 1, ]);
字段名 | 是否必須 | 字段說明 | 備註 |
---|---|---|---|
order_id | 是 | 訂單號 | |
subject | 是 | 訂單標題 | |
amount | 是 | 訂單金額 | 注意部分支付渠道有金額上線限制 |
currency | 是 | 訂單貨幣 | 注意支付渠道支付 |
description | 是 | 訂單簡述 | 支付渠道會有不一樣的長度限制 |
user_ip | 否 | 用戶IP | |
return_url | 否 | 回調地址 | web類型的支付渠道必須填 |
show_url | 否 | 展現地址 | |
body | 否 | 訂單詳細說明 | 這個參數我應該刪掉 |
expired_at | 否 | 過時時間 | unix 時間戳 |
created_at | 否 | 建立時間 | unix 時間戳, 想不到吧, 連這個鬼都要?? |
其餘依舊待補充...
Q: 相比其餘的 sdk 優勢在哪 ?
A: 不管標榜多優雅多好用的 sdk, 大多都是要求你按照第三方的參數名傳入參數, 那就免不了要看文檔, 免不了在代碼裏要作不少處理. 我想要的是, 從數據庫裏取出訂單後, 作一遍處理就能解決接入多種支付.
Q: 是否是就徹底沒必要看第三方支付的文檔了 ?
A: 並非, 我建議仍是須要看, 而且組件中某些支付 (例如微信公衆號) 是須要傳入一些特殊參數的. 組件只是幫你解決煩心的調用問題.
MIT