## 整合插件
在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');
~~~