nezha cashier
v1.2.1
nezha-docs
名稱 | 閘道 | 支持動作 | 支援回調 | 備註 |
---|---|---|---|---|
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 快速結帳 | 付款/付款查詢 | 支付通知 | 不穩定 |
pingan_wechat_h5 | 平安銀行微信H5支付 | 支付/支付查詢/退款 | 支付 | |
wechatoversea_official | 微信跨境公眾號支付 | 支付/支付查詢/退款 | 支付 |
在對接第三方支付, 尤其是需要對接多個第三方支付時, 需要閱讀第三方文檔然後花費大量時間拼裝和調試參數, 例如調用第三方下單創建支付, 如果需要同時接入微信跟支付寶支付, 那麼就需要收集文檔, 可想而知是非常麻煩的(其實還好.. hhh..).
這個組件提供的把與第三方通訊分為三部分:
而每部分又部分為不同的動作, 每個動作綁定一個固定的表單(Form), 每個表單的內容是固定的.
例如主動呼叫第三方下單建立支付(ChargeRequest), 他使用的表單是ChargeRequestForm
. 填寫好表單後, 傳入元件, 即可由元件加工好參數並呼叫第三方支付.
這樣就能做到, 只需要了解組件的表單內容, 就可以接入多個第三方支付, 一勞永逸(不存在的hhh).
這裡以支付寶PC 網站支付為例, 如果需要使用其他的支付網關, 只需要修改實例化Cashier
時傳入的$gateway
即可.
注意, 組件使用的基本貨幣單位是分.
<?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