作者 杨育虎

ok

<?php
return array (
0 =>
array (
'name' => 'wechat',
'title' => '微信',
'type' => 'array',
'content' =>
array (
),
'value' =>
array (
'appid' => '',
'app_id' => '',
'app_secret' => '',
'miniapp_id' => 'wxf06ef1898e5e6d55',
'mch_id' => '1591095591',
'key' => 'iqEyMLJMfBzOyJYwEAZGrGXqOIxWp176',
'notify_url' => '/addons/epay/api/notifyx/type/wechat',
'cert_client' => '/epay/certs/apiclient_cert.pem',
'cert_key' => '/epay/certs/apiclient_key.pem',
'log' => '1',
),
'rule' => '',
'msg' => '',
'tip' => '微信参数配置',
'ok' => '',
'extend' => '',
),
1 =>
array (
'name' => 'alipay',
'title' => '支付宝',
'type' => 'array',
'content' =>
array (
),
'value' =>
array (
'app_id' => '',
'notify_url' => '/addons/epay/api/notifyx/type/alipay',
'return_url' => '/addons/epay/api/returnx/type/alipay',
'ali_public_key' => '',
'private_key' => '',
'log' => 1,
),
'rule' => 'required',
'msg' => '',
'tip' => '支付宝参数配置',
'ok' => '',
'extend' => '',
),
2 =>
array (
'name' => '__tips__',
'title' => '温馨提示',
'type' => 'array',
'content' =>
array (
),
'value' => '请注意微信支付证书路径位于/addons/epay/certs目录下,请替换成你自己的证书<br>appid:APP的appid<br>app_id:公众号的appid<br>app_secret:公众号的secret<br>miniapp_id:小程序ID<br>mch_id:微信商户ID<br>key:微信商户支付的密钥',
'rule' => '',
'msg' => '',
'tip' => '微信参数配置',
'ok' => '',
'extend' => '',
),
);
<?php
return array (
0 =>
array (
'name' => 'wechat',
'title' => '微信',
'type' => 'array',
'content' =>
array (
),
'value' =>
array (
'appid' => '',
'app_id' => '',
'app_secret' => '',
'miniapp_id' => 'wxf06ef1898e5e6d55',
'mch_id' => '1591095591',
'key' => 'iqEyMLJMfBzOyJYwEAZGrGXqOIxWp176',
'notify_url' => '/addons/epay/api/notifyx/type/wechat',
'cert_client' => '/epay/certs/apiclient_cert.pem',
'cert_key' => '/epay/certs/apiclient_key.pem',
'log' => '1',
),
'rule' => '',
'msg' => '',
'tip' => '微信参数配置',
'ok' => '',
'extend' => '',
),
1 =>
array (
'name' => 'alipay',
'title' => '支付宝',
'type' => 'array',
'content' =>
array (
),
'value' =>
array (
'app_id' => '',
'notify_url' => '/addons/epay/api/notifyx/type/alipay',
'return_url' => '/addons/epay/api/returnx/type/alipay',
'ali_public_key' => '',
'private_key' => '',
'log' => 1,
),
'rule' => 'required',
'msg' => '',
'tip' => '支付宝参数配置',
'ok' => '',
'extend' => '',
),
2 =>
array (
'name' => '__tips__',
'title' => '温馨提示',
'type' => 'array',
'content' =>
array (
),
'value' => '请注意微信支付证书路径位于/addons/epay/certs目录下,请替换成你自己的证书<br>appid:APP的appid<br>app_id:公众号的appid<br>app_secret:公众号的secret<br>miniapp_id:小程序ID<br>mch_id:微信商户ID<br>key:微信商户支付的密钥',
'rule' => '',
'msg' => '',
'tip' => '微信参数配置',
'ok' => '',
'extend' => '',
),
);
... ...
<?php
return array (
0 =>
array (
'name' => 'qq',
'title' => 'QQ',
'type' => 'array',
'content' =>
array (
'app_id' => '',
'app_secret' => '',
'scope' => 'get_user_info',
),
'value' =>
array (
'app_id' => '100000000',
'app_secret' => '123456',
'scope' => 'get_user_info',
),
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
),
1 =>
array (
'name' => 'wechat',
'title' => '微信',
'type' => 'array',
'content' =>
array (
'app_id' => '',
'app_secret' => '',
'callback' => '',
'scope' => 'snsapi_base',
),
'value' =>
array (
'app_id' => 'wxf06ef1898e5e6d55',
'app_secret' => 'afdf55fd5d385f0f0900c6b350576310',
'scope' => 'snsapi_base',
),
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
),
2 =>
array (
'name' => 'weibo',
'title' => '微博',
'type' => 'array',
'content' =>
array (
'app_id' => '',
'app_secret' => '',
'scope' => 'get_user_info',
),
'value' =>
array (
'app_id' => '100000000',
'app_secret' => '123456',
'scope' => 'get_user_info',
),
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
),
3 =>
array (
'name' => 'bindaccount',
'title' => '账号绑定',
'type' => 'radio',
'content' =>
array (
1 => '开启',
0 => '关闭',
),
'value' => '1',
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '是否开启账号绑定',
'extend' => '',
),
4 =>
array (
'name' => 'rewrite',
'title' => '伪静态',
'type' => 'array',
'content' =>
array (
),
'value' =>
array (
'index/index' => '/third$',
'index/connect' => '/third/connect/[:platform]',
'index/callback' => '/third/callback/[:platform]',
'index/bind' => '/third/bind/[:platform]',
'index/unbind' => '/third/unbind/[:platform]',
),
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
),
);
<?php
return array (
0 =>
array (
'name' => 'qq',
'title' => 'QQ',
'type' => 'array',
'content' =>
array (
'app_id' => '',
'app_secret' => '',
'scope' => 'get_user_info',
),
'value' =>
array (
'app_id' => '100000000',
'app_secret' => '123456',
'scope' => 'get_user_info',
),
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
),
1 =>
array (
'name' => 'wechat',
'title' => '微信',
'type' => 'array',
'content' =>
array (
'app_id' => '',
'app_secret' => '',
'callback' => '',
'scope' => 'snsapi_base',
),
'value' =>
array (
'app_id' => 'wxf06ef1898e5e6d55',
'app_secret' => 'afdf55fd5d385f0f0900c6b350576310',
'scope' => 'snsapi_base',
),
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
),
2 =>
array (
'name' => 'weibo',
'title' => '微博',
'type' => 'array',
'content' =>
array (
'app_id' => '',
'app_secret' => '',
'scope' => 'get_user_info',
),
'value' =>
array (
'app_id' => '100000000',
'app_secret' => '123456',
'scope' => 'get_user_info',
),
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
),
3 =>
array (
'name' => 'bindaccount',
'title' => '账号绑定',
'type' => 'radio',
'content' =>
array (
1 => '开启',
0 => '关闭',
),
'value' => '1',
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '是否开启账号绑定',
'extend' => '',
),
4 =>
array (
'name' => 'rewrite',
'title' => '伪静态',
'type' => 'array',
'content' =>
array (
),
'value' =>
array (
'index/index' => '/third$',
'index/connect' => '/third/connect/[:platform]',
'index/callback' => '/third/callback/[:platform]',
'index/bind' => '/third/bind/[:platform]',
'index/unbind' => '/third/unbind/[:platform]',
),
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
),
);
... ...
<?php
return array (
0 =>
array (
'name' => 'app_id',
'title' => 'app_id',
'type' => 'string',
'content' =>
array (
),
'value' => 'wxf06ef1898e5e6d55',
'rule' => 'required',
'msg' => '',
'tip' => '你的微信公众号appid',
'ok' => '',
'extend' => '',
),
1 =>
array (
'name' => 'secret',
'title' => 'secret',
'type' => 'string',
'content' =>
array (
),
'value' => 'afdf55fd5d385f0f0900c6b350576310',
'rule' => 'required',
'msg' => '',
'tip' => '你的微信公众号appsecret',
'ok' => '',
'extend' => '',
),
2 =>
array (
'name' => 'token',
'title' => 'token',
'type' => 'string',
'content' =>
array (
),
'value' => 'your token',
'rule' => 'required',
'msg' => '',
'tip' => '通信token',
'ok' => '',
'extend' => '',
),
3 =>
array (
'name' => 'aes_key',
'title' => 'aes_key',
'type' => 'string',
'content' =>
array (
),
'value' => 'your aes_key',
'rule' => '',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
),
4 =>
array (
'name' => 'debug',
'title' => '调试模式',
'type' => 'radio',
'content' =>
array (
0 => '否',
1 => '是',
),
'value' => '1',
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
),
5 =>
array (
'name' => 'log_level',
'title' => '日志记录等级',
'type' => 'select',
'content' =>
array (
'debug' => 'debug',
'info' => 'info',
'notice' => 'notice',
'warning' => 'warning',
'error' => 'error',
'critical' => 'critical',
'alert' => 'alert',
'emergency' => 'emergency',
),
'value' => 'debug',
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
),
6 =>
array (
'name' => 'oauth_callback',
'title' => '登录回调',
'type' => 'string',
'content' =>
array (
),
'value' => 'http://www.yoursite.com/addons/wechat/index/callback',
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
),
);
<?php
return array (
0 =>
array (
'name' => 'app_id',
'title' => 'app_id',
'type' => 'string',
'content' =>
array (
),
'value' => 'wxf06ef1898e5e6d55',
'rule' => 'required',
'msg' => '',
'tip' => '你的微信公众号appid',
'ok' => '',
'extend' => '',
),
1 =>
array (
'name' => 'secret',
'title' => 'secret',
'type' => 'string',
'content' =>
array (
),
'value' => 'afdf55fd5d385f0f0900c6b350576310',
'rule' => 'required',
'msg' => '',
'tip' => '你的微信公众号appsecret',
'ok' => '',
'extend' => '',
),
2 =>
array (
'name' => 'token',
'title' => 'token',
'type' => 'string',
'content' =>
array (
),
'value' => 'your token',
'rule' => 'required',
'msg' => '',
'tip' => '通信token',
'ok' => '',
'extend' => '',
),
3 =>
array (
'name' => 'aes_key',
'title' => 'aes_key',
'type' => 'string',
'content' =>
array (
),
'value' => 'your aes_key',
'rule' => '',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
),
4 =>
array (
'name' => 'debug',
'title' => '调试模式',
'type' => 'radio',
'content' =>
array (
0 => '否',
1 => '是',
),
'value' => '1',
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
),
5 =>
array (
'name' => 'log_level',
'title' => '日志记录等级',
'type' => 'select',
'content' =>
array (
'debug' => 'debug',
'info' => 'info',
'notice' => 'notice',
'warning' => 'warning',
'error' => 'error',
'critical' => 'critical',
'alert' => 'alert',
'emergency' => 'emergency',
),
'value' => 'debug',
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
),
6 =>
array (
'name' => 'oauth_callback',
'title' => '登录回调',
'type' => 'string',
'content' =>
array (
),
'value' => 'http://www.yoursite.com/addons/wechat/index/callback',
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
),
);
... ...
<?php
namespace app\api\controller;
use addons\epay\library\Service;
use addons\third\Third;
use addons\wechat\library\Config as ConfigService;
use app\api\model\Order;
use app\common\controller\Api;
use app\common\library\Auth;
use app\common\model\Area;
use app\common\model\Attachment;
use app\common\model\Version;
use EasyWeChat\Encryption\EncryptionException;
use EasyWeChat\Foundation\Application;
use fast\Http;
use fast\Random;
use think\Config;
use think\Db;
/**
* 公共接口
*/
class Common extends Api
{
protected $noNeedLogin = ['init', 'getSessionKey', 'login', 'codeToToken', 'upload', 'payNotify'];
protected $noNeedRight = '*';
/**
* 加载初始化
*
* @param string $version 版本号
* @param string $lng 经度
* @param string $lat 纬度
*/
public function init()
{
if ($version = $this->request->request('version')) {
$lng = $this->request->request('lng');
$lat = $this->request->request('lat');
$content = [
'citydata' => Area::getCityFromLngLat($lng, $lat),
'versiondata' => Version::check($version),
'uploaddata' => Config::get('upload'),
'coverdata' => Config::get("cover"),
];
$this->success('', $content);
} else {
$this->error(__('Invalid parameters'));
}
}
/**
* 上传文件
* @ApiMethod (POST)
* @param File $file 文件流
*/
public function upload()
{
$config = get_addon_config('qiniu');
$file = $this->request->file('file');
if (!$file || !$file->isValid()) {
$this->error("请上传有效的文件");
}
$fileInfo = $file->getInfo();
$filePath = $file->getRealPath() ?: $file->getPathname();
preg_match('/(\d+)(\w+)/', $config['maxsize'], $matches);
$type = strtolower($matches[2]);
$typeDict = ['b' => 0, 'k' => 1, 'kb' => 1, 'm' => 2, 'mb' => 2, 'gb' => 3, 'g' => 3];
$size = (int)$config['maxsize'] * pow(1024, isset($typeDict[$type]) ? $typeDict[$type] : 0);
$suffix = strtolower(pathinfo($fileInfo['name'], PATHINFO_EXTENSION));
$suffix = $suffix ? $suffix : 'file';
$md5 = md5_file($filePath);
$search = ['$(year)', '$(mon)', '$(day)', '$(etag)', '$(ext)'];
$replace = [date("Y"), date("m"), date("d"), $md5, '.' . $suffix];
$object = ltrim(str_replace($search, $replace, $config['savekey']), '/');
$mimetypeArr = explode(',', strtolower($config['mimetype']));
$typeArr = explode('/', $fileInfo['type']);
//检查文件大小
if (!$file->checkSize($size)) {
$this->error("起过最大可上传文件限制");
}
//验证文件后缀
if ($config['mimetype'] !== '*' &&
(
!in_array($suffix, $mimetypeArr)
|| (stripos($typeArr[0] . '/', $config['mimetype']) !== false && (!in_array($fileInfo['type'], $mimetypeArr) && !in_array($typeArr[0] . '/*', $mimetypeArr)))
)
) {
$this->error(__('上传格式限制'));
}
$savekey = '/' . $object;
$uploadDir = substr($savekey, 0, strripos($savekey, '/') + 1);
$fileName = substr($savekey, strripos($savekey, '/') + 1);
//先上传到本地
$splInfo = $file->move(ROOT_PATH . '/public' . $uploadDir, $fileName);
if ($splInfo) {
$extparam = $this->request->post();
$filePath = $splInfo->getRealPath() ?: $splInfo->getPathname();
$sha1 = sha1_file($filePath);
$imagewidth = $imageheight = 0;
if (in_array($suffix, ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'swf'])) {
$imgInfo = getimagesize($splInfo->getPathname());
$imagewidth = isset($imgInfo[0]) ? $imgInfo[0] : $imagewidth;
$imageheight = isset($imgInfo[1]) ? $imgInfo[1] : $imageheight;
}
$params = array(
'admin_id' => session('admin.id'),
'user_id' => $this->auth->id,
'filesize' => $fileInfo['size'],
'imagewidth' => $imagewidth,
'imageheight' => $imageheight,
'imagetype' => $suffix,
'imageframes' => 0,
'mimetype' => $fileInfo['type'],
'url' => $uploadDir . $splInfo->getSaveName(),
'uploadtime' => time(),
'storage' => 'local',
'sha1' => $sha1,
'extparam' => json_encode($extparam),
);
$attachment = Attachment::create(array_filter($params), true);
$policy = array(
'saveKey' => ltrim($savekey, '/'),
);
$auth = new \addons\qiniu\library\Auth($config['app_key'], $config['secret_key']);
$token = $auth->uploadToken($config['bucket'], null, $config['expire'], $policy);
$multipart = [
['name' => 'token', 'contents' => $token],
[
'name' => 'file',
'contents' => fopen($filePath, 'r'),
'filename' => $fileName,
]
];
try {
$client = new \GuzzleHttp\Client();
$res = $client->request('POST', $config['uploadurl'], [
'multipart' => $multipart
]);
$code = $res->getStatusCode();
//成功不做任何操作
} catch (\GuzzleHttp\Exception\ClientException $e) {
$attachment->delete();
unlink($filePath);
$this->error("上传失败");
}
$url = '/' . $object;
//上传成功后将存储变更为qiniu
$attachment->storage = 'qiniu';
$attachment->save();
$this->success("上传成功", ['url' => cdnurl($url), 'save_path' => $url]);
} else {
$this->error('上传失败');
}
return;
}
/**
* 支付回调
* @ApiTitle (支付回调)
* @ApiSummary ()
* @ApiMethod (POST)
*/
public function payNotify()
{
$payType = 'wechat';
$pay = Service::checkNotify($payType);
if (!$pay) {
echo '签名错误';
return;
}
$data = $pay->verify();
$order = new Order();
Db::startTrans();
try {
$out_trade_no = $data['out_trade_no'];
$orderInfo = $order->infoAndLockById($out_trade_no);
if(!$orderInfo) {
Db::rollback();
} else {
if($orderInfo['status'] == 3) {
Db::rollback();
} else {
$res = $order->updateOne($orderInfo['id'], ['status' => 3, 'updatetime' => time()]);
if(!$res) {
Db::rollback();
} else {
// 根据订单内容修改相应的数据
$res = handleOrder($orderInfo);
if(!$res) {
Db::rollback();
} else {
Db::commit();
}
}
}
}
} catch (\Exception $e) {
}
$pay->success();
}
/**
* 获取SessionKey
* @ApiTitle (获取SessionKey)
* @ApiSummary (使用code换取SessionKey)
* @ApiMethod (POST)
* @ApiParams (name="code", type="string", required=true, description="code")
*/
public function getSessionKey(){
$config = get_addon_config('third');
$code = $this->request->param('code');
if (!$code) {
$this->error('参数不正确');
}
$params = [
'appid' => $config['wechat']['app_id'],
'secret' => $config['wechat']['app_secret'],
'js_code' => $code,
'grant_type' => 'authorization_code'
];
$result = Http::sendRequest("https://api.weixin.qq.com/sns/jscode2session", $params, 'GET');
if ($result['ret']) {
$json = (array)json_decode($result['msg'], true);
$this->success("SessionKey",$json);
}else{
$this->error('获取失败',$result);
};
}
/**
* 小程序登录
* @ApiTitle (小程序登录)
* @ApiSummary (微信小程序登录)
* @ApiMethod (POST)
* @ApiParams (name="sessionKey", type="string", required=true, description="sessionKey")
* @ApiParams (name="iv", type="string", required=true, description="iv")
* @ApiParams (name="encryptedData", type="object", required=true, description="encryptedData")
* @ApiParams (name="store_id", type="integer", required=false, description="门店ID,二维码进入小程序可能会带入此值")
*/
public function login(){
$sessionKey = $this->request->param('sessionKey');
$iv = $this->request->param('iv');
$encryptData = $this->request->param('encryptedData');
$storeId = $this->request->param('store_id',0,'int');
if (!$sessionKey || !$iv || !$encryptData) {
$this->error('参数不正确');
}
try {
$app = new Application(ConfigService::load());
$miniProgram = $app->mini_program;
$result = $miniProgram->encryptor->decryptData($sessionKey, $iv, $encryptData);
if (isset($result['openId'])) {
$platform = 'wxapp';
$data = [
'openid' => $result['openId'],
'userinfo' => [
'nickname' => $result['nickName'],
'unionid' => isset($result['unionId']) ? $result['unionId'] : '',
],
'access_token' => $sessionKey,
'refresh_token' => '',
'expires_in' => 0,
];
$extend = [
'group_id'=>1,
'gender' => $result['gender'],
'nickname' => $result['nickName'],
'name' => $result['nickName'],
'avatar' => $result['avatarUrl'],
'store_id'=>$storeId,
];
$ret = \addons\third\library\Service::connect($platform, $data, $extend);
if ($ret) {
$auth = Auth::instance();
$this->success('登录成功', ['userInfo' => $auth->getUserinfo()]);
} else {
$this->error('登录失败');
}
} else {
$this->error('登录失败',$result);
}
} catch (EncryptionException $e) {
$this->error($e->getMessage());
}
}
/**
* CODE换取Token
* @ApiTitle (CODE换取Token)
* @ApiSummary (使用code换取Token)
* @ApiMethod (POST)
* @ApiParams (name="code", type="string", required=true, description="code")
*/
public function codeToToken()
{
$config = get_addon_config('third');
$code = $this->request->param('code');
if (!$code) {
$this->error('参数不正确');
}
$params = [
'appid' => $config['wechat']['app_id'],
'secret' => $config['wechat']['app_secret'],
'js_code' => $code,
'grant_type' => 'authorization_code',
];
$result = Http::sendRequest("https://api.weixin.qq.com/sns/jscode2session", $params, 'GET');
if ($result['ret']) {
$json = (array)json_decode($result['msg'], true);
if (isset($json['openid'])) {
$userId = Db::name('third')->where(['platform'=>'wxapp','openid'=>$json['openid']])->value('user_id');
$auth = Auth::instance();
$ret=$auth->direct($userId);
if ($ret) {
Db::name('third')->where(['user_id'=>$userId])->setField('access_token', $json['session_key']);
$this->success("登录成功", ['userInfo' => $auth->getUserinfo()]);
} else {
$this->error("登录失败",$userId,'401');
}
} else {
$this->error("登录失败",$json);
}
} else {
$this->error("登录失败");
}
}
}
<?php
namespace app\api\controller;
use addons\epay\library\Service;
use addons\third\Third;
use addons\wechat\library\Config as ConfigService;
use app\api\model\Order;
use app\common\controller\Api;
use app\common\library\Auth;
use app\common\model\Area;
use app\common\model\Attachment;
use app\common\model\Version;
use EasyWeChat\Encryption\EncryptionException;
use EasyWeChat\Foundation\Application;
use fast\Http;
use fast\Random;
use think\Config;
use think\Db;
/**
* 公共接口
*/
class Common extends Api
{
protected $noNeedLogin = ['init', 'getSessionKey', 'login', 'codeToToken', 'upload', 'payNotify'];
protected $noNeedRight = '*';
/**
* 加载初始化
*
* @param string $version 版本号
* @param string $lng 经度
* @param string $lat 纬度
*/
public function init()
{
if ($version = $this->request->request('version')) {
$lng = $this->request->request('lng');
$lat = $this->request->request('lat');
$content = [
'citydata' => Area::getCityFromLngLat($lng, $lat),
'versiondata' => Version::check($version),
'uploaddata' => Config::get('upload'),
'coverdata' => Config::get("cover"),
];
$this->success('', $content);
} else {
$this->error(__('Invalid parameters'));
}
}
/**
* 上传文件
* @ApiMethod (POST)
* @param File $file 文件流
*/
public function upload()
{
$config = get_addon_config('qiniu');
$file = $this->request->file('file');
if (!$file || !$file->isValid()) {
$this->error("请上传有效的文件");
}
$fileInfo = $file->getInfo();
$filePath = $file->getRealPath() ?: $file->getPathname();
preg_match('/(\d+)(\w+)/', $config['maxsize'], $matches);
$type = strtolower($matches[2]);
$typeDict = ['b' => 0, 'k' => 1, 'kb' => 1, 'm' => 2, 'mb' => 2, 'gb' => 3, 'g' => 3];
$size = (int)$config['maxsize'] * pow(1024, isset($typeDict[$type]) ? $typeDict[$type] : 0);
$suffix = strtolower(pathinfo($fileInfo['name'], PATHINFO_EXTENSION));
$suffix = $suffix ? $suffix : 'file';
$md5 = md5_file($filePath);
$search = ['$(year)', '$(mon)', '$(day)', '$(etag)', '$(ext)'];
$replace = [date("Y"), date("m"), date("d"), $md5, '.' . $suffix];
$object = ltrim(str_replace($search, $replace, $config['savekey']), '/');
$mimetypeArr = explode(',', strtolower($config['mimetype']));
$typeArr = explode('/', $fileInfo['type']);
//检查文件大小
if (!$file->checkSize($size)) {
$this->error("起过最大可上传文件限制");
}
//验证文件后缀
if ($config['mimetype'] !== '*' &&
(
!in_array($suffix, $mimetypeArr)
|| (stripos($typeArr[0] . '/', $config['mimetype']) !== false && (!in_array($fileInfo['type'], $mimetypeArr) && !in_array($typeArr[0] . '/*', $mimetypeArr)))
)
) {
$this->error(__('上传格式限制'));
}
$savekey = '/' . $object;
$uploadDir = substr($savekey, 0, strripos($savekey, '/') + 1);
$fileName = substr($savekey, strripos($savekey, '/') + 1);
//先上传到本地
$splInfo = $file->move(ROOT_PATH . '/public' . $uploadDir, $fileName);
if ($splInfo) {
$extparam = $this->request->post();
$filePath = $splInfo->getRealPath() ?: $splInfo->getPathname();
$sha1 = sha1_file($filePath);
$imagewidth = $imageheight = 0;
if (in_array($suffix, ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'swf'])) {
$imgInfo = getimagesize($splInfo->getPathname());
$imagewidth = isset($imgInfo[0]) ? $imgInfo[0] : $imagewidth;
$imageheight = isset($imgInfo[1]) ? $imgInfo[1] : $imageheight;
}
$params = array(
'admin_id' => session('admin.id'),
'user_id' => $this->auth->id,
'filesize' => $fileInfo['size'],
'imagewidth' => $imagewidth,
'imageheight' => $imageheight,
'imagetype' => $suffix,
'imageframes' => 0,
'mimetype' => $fileInfo['type'],
'url' => $uploadDir . $splInfo->getSaveName(),
'uploadtime' => time(),
'storage' => 'local',
'sha1' => $sha1,
'extparam' => json_encode($extparam),
);
$attachment = Attachment::create(array_filter($params), true);
$policy = array(
'saveKey' => ltrim($savekey, '/'),
);
$auth = new \addons\qiniu\library\Auth($config['app_key'], $config['secret_key']);
$token = $auth->uploadToken($config['bucket'], null, $config['expire'], $policy);
$multipart = [
['name' => 'token', 'contents' => $token],
[
'name' => 'file',
'contents' => fopen($filePath, 'r'),
'filename' => $fileName,
]
];
try {
$client = new \GuzzleHttp\Client();
$res = $client->request('POST', $config['uploadurl'], [
'multipart' => $multipart
]);
$code = $res->getStatusCode();
//成功不做任何操作
} catch (\GuzzleHttp\Exception\ClientException $e) {
$attachment->delete();
unlink($filePath);
$this->error("上传失败");
}
$url = '/' . $object;
//上传成功后将存储变更为qiniu
$attachment->storage = 'qiniu';
$attachment->save();
$this->success("上传成功", ['url' => cdnurl($url), 'save_path' => $url]);
} else {
$this->error('上传失败');
}
return;
}
/**
* 支付回调
* @ApiTitle (支付回调)
* @ApiSummary ()
* @ApiMethod (POST)
*/
public function payNotify()
{
$payType = 'wechat';
$pay = Service::checkNotify($payType);
if (!$pay) {
echo '签名错误';
return;
}
$data = $pay->verify();
$order = new Order();
Db::startTrans();
try {
$out_trade_no = $data['out_trade_no'];
$orderInfo = $order->infoAndLockById($out_trade_no);
if(!$orderInfo) {
Db::rollback();
} else {
if($orderInfo['status'] == 3) {
Db::rollback();
} else {
$res = $order->updateOne($orderInfo['id'], ['status' => 3, 'updatetime' => time()]);
if(!$res) {
Db::rollback();
} else {
// 根据订单内容修改相应的数据
$res = handleOrder($orderInfo);
if(!$res) {
Db::rollback();
} else {
Db::commit();
}
}
}
}
} catch (\Exception $e) {
}
$pay->success();
}
/**
* 获取SessionKey
* @ApiTitle (获取SessionKey)
* @ApiSummary (使用code换取SessionKey)
* @ApiMethod (POST)
* @ApiParams (name="code", type="string", required=true, description="code")
*/
public function getSessionKey(){
$config = get_addon_config('third');
$code = $this->request->param('code');
if (!$code) {
$this->error('参数不正确');
}
$params = [
'appid' => $config['wechat']['app_id'],
'secret' => $config['wechat']['app_secret'],
'js_code' => $code,
'grant_type' => 'authorization_code'
];
$result = Http::sendRequest("https://api.weixin.qq.com/sns/jscode2session", $params, 'GET');
if ($result['ret']) {
$json = (array)json_decode($result['msg'], true);
$this->success("SessionKey",$json);
}else{
$this->error('获取失败',$result);
};
}
/**
* 小程序登录
* @ApiTitle (小程序登录)
* @ApiSummary (微信小程序登录)
* @ApiMethod (POST)
* @ApiParams (name="sessionKey", type="string", required=true, description="sessionKey")
* @ApiParams (name="iv", type="string", required=true, description="iv")
* @ApiParams (name="encryptedData", type="object", required=true, description="encryptedData")
* @ApiParams (name="store_id", type="integer", required=false, description="门店ID,二维码进入小程序可能会带入此值")
*/
public function login(){
$sessionKey = $this->request->param('sessionKey');
$iv = $this->request->param('iv');
$encryptData = $this->request->param('encryptedData');
$storeId = $this->request->param('store_id',0,'int');
if (!$sessionKey || !$iv || !$encryptData) {
$this->error('参数不正确');
}
try {
$app = new Application(ConfigService::load());
$miniProgram = $app->mini_program;
$result = $miniProgram->encryptor->decryptData($sessionKey, $iv, $encryptData);
if (isset($result['openId'])) {
$platform = 'wxapp';
$data = [
'openid' => $result['openId'],
'userinfo' => [
'nickname' => $result['nickName'],
'unionid' => isset($result['unionId']) ? $result['unionId'] : '',
],
'access_token' => $sessionKey,
'refresh_token' => '',
'expires_in' => 0,
];
$extend = [
'group_id'=>1,
'gender' => $result['gender'],
'nickname' => $result['nickName'],
'name' => $result['nickName'],
'avatar' => $result['avatarUrl'],
'store_id'=>$storeId,
];
$ret = \addons\third\library\Service::connect($platform, $data, $extend);
if ($ret) {
$auth = Auth::instance();
$this->success('登录成功', ['userInfo' => $auth->getUserinfo()]);
} else {
$this->error('登录失败');
}
} else {
$this->error('登录失败',$result);
}
} catch (EncryptionException $e) {
$this->error($e->getMessage());
}
}
/**
* CODE换取Token
* @ApiTitle (CODE换取Token)
* @ApiSummary (使用code换取Token)
* @ApiMethod (POST)
* @ApiParams (name="code", type="string", required=true, description="code")
*/
public function codeToToken()
{
$config = get_addon_config('third');
$code = $this->request->param('code');
if (!$code) {
$this->error('参数不正确');
}
$params = [
'appid' => $config['wechat']['app_id'],
'secret' => $config['wechat']['app_secret'],
'js_code' => $code,
'grant_type' => 'authorization_code',
];
$result = Http::sendRequest("https://api.weixin.qq.com/sns/jscode2session", $params, 'GET');
if ($result['ret']) {
$json = (array)json_decode($result['msg'], true);
if (isset($json['openid'])) {
$userId = Db::name('third')->where(['platform'=>'wxapp','openid'=>$json['openid']])->value('user_id');
$auth = Auth::instance();
$ret=$auth->direct($userId);
if ($ret) {
Db::name('third')->where(['user_id'=>$userId])->setField('access_token', $json['session_key']);
$this->success("登录成功", ['userInfo' => $auth->getUserinfo()]);
} else {
$this->error("登录失败",$userId,'401');
}
} else {
$this->error("登录失败",$json);
}
} else {
$this->error("登录失败");
}
}
}
... ...
... ... @@ -18,4 +18,5 @@ return [
'app\admin\command\Addon',
'app\admin\command\Api',
'app\command\PayToUser',
'app\command\Sql',
];
... ...
<?php
/**
* Created by PhpStorm.
* User: DELL
* Date: 2019/5/31
* Time: 9:25
*/
/**
* Created by PhpStorm.
* User: DELL
* Date: 2019/4/9
* Time: 10:58
*/
namespace app\command;
use app\api\model\Third;
use app\api\model\Withdraw;
use think\console\Input;
use think\console\Output;
use think\console\Command;
use addons\epay\library\Service;
use think\Db;
use think\Log;
use Yansongda\Pay\Pay;
class Sql extends Command{
protected function configure()
{
$this->setName('Sql')->setDescription('企业微信付款到用户,每1分钟执行,执行必须带锁防止同时出现两个脚本');
}
protected function execute(Input $input, Output $output)
{
$f = true;
$page = 1;
$size = 1;
while ($f) {
$u = Db::table('t_univs')->order('ID', 'asc')->page($page, $size)->select();
if(isset($u[0]) && $u[0]) {
$us = Db::table('fa_university')->where(['name' => ['like', $u[0]['UnivsName'].'%']])->find();
if($us) {
$co = Db::table('t_univsdep')->where(['UnivsID' => ['=', $u[0]['UnivsID']]])->select();
foreach ($co as $k => $v) {
Db::table('fa_college')->insert(['university_id' => $us['id'], 'name' => $v['DepName'], 'show_switch' => 1]);
}
}
} else {
$f = false;
}
$page++;
}
}
}
\ No newline at end of file
... ...