## 整合插件
在FastAdmin中默認是不允許整合其它付費插件的,如需整合到其它付費插件,則必須有相應可替代的功能,不能因為缺少這個付費插件而無法使用。如需整合免費插件,則無相應限制。
## 適配后臺暗色模式插件
## 整合普通插件
在使用其它插件的方法、模型、代碼之前,需按以下方法進行判斷
~~~php
//讀取插件的狀態,epay為插件標識
$info = get_addon_info('epay');
if($info && $info['state']){
//代碼邏輯
} else {
exception("請確保微信支付寶整合插件已安裝并啟用");
}
~~~
如果需要判斷依賴插件的版本可使用
~~~php
//讀取插件的狀態,epay為插件標識
$info = get_addon_info('epay');
if($info && $info['state']){
if(version_compare($info['version'], '1.3.0') >= 0){
//代碼邏輯
} else {
exception("請安裝微信支付寶整合插件1.3.0及以上版本");
}
} else {
exception("請確保微信支付寶整合插件已安裝并啟用");
}
~~~
如需讀取插件配置可使用
~~~php
//讀取插件的配置,epay為插件標識
$config = get_addon_config('epay');
$version = $config['version'] ?? 'v2';
~~~
## 整合支付插件
默認微信支付寶整合插件是使用微信支付`V2`的API接口,如需使用`V3`的接口需要做特殊處理。
目前微信支付寶整合插件已經發布`1.3.0`,從`1.3.0`開始支持微信支付`V3`的API接口,我們在整合微信支付寶插件時如果需要使用`V3`的接口,需要按以下的步驟進行操作。
### 準備工作
1、首先確保已經安裝微信支付寶整合插件`1.3.0+`
2、在我們控制器代碼的`__construct`或`_initialize`方法中使用`set_addon_config('epay', ['version' => 'v3'], false);`切換`V3`接口,該代碼務必在`__construct`或`_initialize`方法中使用。
3、參照`easyPay`文檔使用`V3`的接口:https://pay.yansongda.cn/docs/v3/quick-start/init.html
### 常用方法
~~~css
//獲取當前接口版本
\addons\epay\library\Service::getSdkVersion();
//判斷當前是V2還是V3接口
\addons\epay\library\Service::isVersionV2();
\addons\epay\library\Service::isVersionV3();
~~~
插件內還提供了快捷**獲取微信支付寶插件配置**和**提交訂單**的方法(可選),也可以參考`epsyPay`的文檔自行實例化使用。
~~~php
/**
* 獲取初始化配置,V2和V3返回的結構不一致
* @param string $type 支付類型
* @param array $custom 自定義微信支付寶相關配置,用于覆蓋插件默認配置
* @return array
*/
\addons\epay\library\Service::getConfig($type = 'wechat', $custom = []);
/**
* 提交訂單
* @param array|float $amount 訂單金額
* @param string $orderid 訂單號
* @param string $type 支付類型,可選alipay或wechat
* @param string $title 訂單標題
* @param string $notifyurl 通知回調URL
* @param string $returnurl 跳轉返回URL
* @param string $method 支付方法,支持web/wap/app/scan/pos/mp/miniapp
* @param string $openid Openid
* @param array $custom 自定義微信支付寶相關配置,用于覆蓋插件默認配置
* @return Response|RedirectResponse|Collection
*/
\addons\epay\library\Service::submitOrder($amount, $orderid = null, $type = null, $title = null, $notifyurl = null, $returnurl = null, $method = null, $openid = '', $custom = []);
~~~
溫馨提示:
1、你的支付參數配置信息可以在自己的應用中進行定義和配置
2、`V2`和`V3`的接口中特別是微信支付差異比較大,需特別注意。
## 整合云存儲上傳插件
在插件開發中可以快速的整合FastAdmin插件市場的云存儲上傳插件。如果是后臺上傳無需任何特殊配置。
如果我們需要使用API上傳文件至云存儲,有以下兩種方式可以使用:
### 框架自帶API上傳(需登錄)
在使用框架自帶的API進行上傳文件,則要求傳遞用戶當前的`token`,如果應用插件未使用FastAdmin的默認用戶體系,可能無法獲取到用戶的`token`,此時建議使用`插件自定義API上傳`的形式
請求地址
> http://www.yoursite.com/api/common/upload
請求方法
> POST
請求參數
| 參數 | 必需 | 描述 |
| --- | --- | --- |
| file | 是 | 上傳文件 |
| token | 是 | 用戶的token |
### 插件自定義API上傳(無需登錄或自行鑒權)
如果我們的應用插件未使用FastAdmin的默認用戶體系,可能無法獲取到用戶的`token`,從而無法使用框架自帶的API上傳接口,此時我們可以采用自定義API進行上傳。
請求地址
> http://www.yoursite.com/addons/demo/common/upload
請求方法
> POST
請求參數
| 參數 | 必需 | 描述 |
| --- | --- | --- |
| file | 是 | 上傳文件 |
| custom1 | 是 | 自定義參數1 |
| custom2 | 是 | 自定義參數2 |
代碼示例
~~~php
namespace addons\demo\controller;
use app\common\exception\UploadException;
use app\common\library\Upload;
use think\addons\Controller;
use Exception;
use think\App;
use think\Config;
use think\Hook;
use think\Lang;
class Common extends Controller
{
//上傳方法
public function upload()
{
// 自定義鑒權判斷
// 強烈建議這里判斷$file = $this->request->file('file');的后綴和mimetype
// 載入語言包,避免出現英文錯誤提示
Lang::load(APP_PATH . 'api/lang/zh-cn.php');
// 獲取上傳配置
$uploadConfig = Config::get("upload");
// 兼容云存儲上傳
if ($uploadConfig['storage'] != 'local') {
// 這里可以修改允許上傳文件的后綴或修改存儲的文件路徑,例如只允許上傳圖片
set_addon_config($uploadConfig['storage'], ['savekey' => '/uploads/{year}{mon}{day}/{filemd5}{.suffix}', 'mimetype' => 'jpg,png,bmp,jpeg,gif'], false);
// 添加允許上傳的行為
Hook::add('upload_config_checklogin', function () {
return true;
});
request()->param('isApi', true);
App::invokeMethod(["\\addons\\{$uploadConfig["storage"]}\\controller\\Index", "upload"], ['isApi' => true]);
} else {
// 這里可以修改允許上傳文件的后綴或修改存儲的文件路徑,例如只允許上傳圖片
//Config::set('upload', array_merge($uploadConfig, ['savekey' => '/uploads/{year}{mon}{day}/{filemd5}{.suffix}', 'mimetype' => 'jpg,png,bmp,jpeg,gif']));
$attachment = null;
// 默認普通上傳文件
$file = $this->request->file('file');
try {
$upload = new Upload($file);
$attachment = $upload->upload();
} catch (UploadException $e) {
$this->error($e->getMessage());
}
$this->success('上傳成功', '', ['url' => $attachment->url, 'fullurl' => cdnurl($attachment->url, true)]);
}
}
}
~~~
## 整合第三方登錄插件
如果使用了FastAdmin自帶的`fa_user`表,建議整合第三方登錄插件,第三方登錄插件支持微信、微博、QQ,支持微信掃碼登錄,支持UnionID機制。
當我們開發的應用插件獲取到了第三方平臺的openid以后,可以調用`\addons\third\library\Service::connect`來創建關聯,如下:
~~~php
/**
* 綁定第三方登錄
* @param string $platform 平臺,wechat=微信,qq=QQ,weibo=微博
* @param array $params 參數,必須包含openid
* @param array $extend 會員擴展信息,可使用fa_user表中的字段
* @param int $keeptime 有效時長,默認為永久
* @return boolean
*/
\addons\third\library\Service::connect('wechat', [
'openid'=>'用戶的openid',
'unionid'=>'用戶的unionid', //僅在微信
'apptype'=>'第三方類型',//miniapp=微信小程序,mp=公眾號,web=PC,app=APP
'nickname'=>'用戶昵稱',//可以為空
'avatar'=>'頭像',//可以為空
], [
'mobile'=>'手機號', //可選,可使用fa_user表字段
'username'=>'用戶名' ,//可選,可使用fa_user表字段
]);
~~~
如果需要判斷用戶是否綁定第三方登錄,可以使用如下判斷:
~~~php
/**
* 判斷是否綁定第三方
* @param string $platform 平臺
* @param string $openid Openid
* @param string $apptype 平臺類型(web/miniapp/mp/app),可選
* @param string $unionid Unionid,可選
* @return bool
*/
$isBind = \addons\third\library\Service::isBindThird('wechat', '用戶的openid','miniapp','用戶的unionid');
~~~