哪吒收銀 (nezha-cashier) 用起來很是輕鬆的支付 sdk

GitHub

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

  1. request, 請求, 主動調用第三方
  2. response, 響應, 主動調用第三方得到的響應
  3. notification, 通知, 第三方的各種通知

而每部分又部分爲不一樣的動做, 每一個動做綁定一個固定的表單 (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,
]);

表單及字段說明

ChargeRequestForm

字段名 是否必須 字段說明 備註
order_id 訂單號
subject 訂單標題
amount 訂單金額 注意部分支付渠道有金額上線限制
currency 訂單貨幣 注意支付渠道支付
description 訂單簡述 支付渠道會有不一樣的長度限制
user_ip 用戶IP
return_url 回調地址 web類型的支付渠道必須填
show_url 展現地址
body 訂單詳細說明 這個參數我應該刪掉
expired_at 過時時間 unix 時間戳
created_at 建立時間 unix 時間戳, 想不到吧, 連這個鬼都要??

其餘依舊待補充...

FAQ

Q: 相比其餘的 sdk 優勢在哪 ?

A: 不管標榜多優雅多好用的 sdk, 大多都是要求你按照第三方的參數名傳入參數, 那就免不了要看文檔, 免不了在代碼裏要作不少處理. 我想要的是, 從數據庫裏取出訂單後, 作一遍處理就能解決接入多種支付.

Q: 是否是就徹底沒必要看第三方支付的文檔了 ?

A: 並非, 我建議仍是須要看, 而且組件中某些支付 (例如微信公衆號) 是須要傳入一些特殊參數的. 組件只是幫你解決煩心的調用問題.

License

MIT

相關文章
相關標籤/搜索