Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
T
tl_estate
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
hujun
tl_estate
Commits
b6928345
Commit
b6928345
authored
Dec 04, 2017
by
clone
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
去掉些没用的冗余
parent
db76a4a3
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
33 additions
and
1551 deletions
+33
-1551
Index.php
application/index/controller/member/Index.php
+2
-1
Basic.php
application/index/extend/Basic.php
+1
-1
DataService.php
application/index/service/DataService.php
+0
-129
ExtendService.php
application/index/service/ExtendService.php
+0
-104
FileService.php
application/index/service/FileService.php
+0
-313
HttpService.php
application/index/service/HttpService.php
+0
-124
LogService.php
application/index/service/LogService.php
+0
-53
NodeService.php
application/index/service/NodeService.php
+0
-158
PayService.php
application/index/service/PayService.php
+0
-146
SoapService.php
application/index/service/SoapService.php
+0
-89
ToolsService.php
application/index/service/ToolsService.php
+0
-174
WechatService.php
application/index/service/WechatService.php
+0
-250
route.php
application/route.php
+30
-9
No files found.
application/index/controller/member/Index.php
View file @
b6928345
...
@@ -6,7 +6,8 @@ namespace app\index\controller\member;
...
@@ -6,7 +6,8 @@ namespace app\index\controller\member;
* Date: 17-12-3
* Date: 17-12-3
* Time: 下午1:03
* Time: 下午1:03
*/
*/
use
app\index\behavior\Basic
;
use
app\index\extend\Basic
;
class
Index
extends
Basic
{
class
Index
extends
Basic
{
public
function
member
(){
public
function
member
(){
return
view
(
'member/member'
,[
'title'
=>
'thinkphp'
]);
return
view
(
'member/member'
,[
'title'
=>
'thinkphp'
]);
...
...
application/index/
behavior
/Basic.php
→
application/index/
extend
/Basic.php
View file @
b6928345
<?php
<?php
namespace
app\index\
behavior
;
namespace
app\index\
extend
;
/**
/**
* Created by PhpStorm.
* Created by PhpStorm.
* User: zw
* User: zw
...
...
application/index/service/DataService.php
deleted
100644 → 0
View file @
db76a4a3
<?php
// +----------------------------------------------------------------------
// | Think.Admin
// +----------------------------------------------------------------------
// | 版权所有 2014~2017 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
// +----------------------------------------------------------------------
// | 官方网站: http://think.ctolog.com
// +----------------------------------------------------------------------
// | 开源协议 ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | github开源项目:https://github.com/zoujingli/Think.Admin
// +----------------------------------------------------------------------
namespace
service
;
use
think\Db
;
use
think\Request
;
/**
* 基础数据服务
* Class DataService
* @package service
* @author Anyon <zoujingli@qq.com>
* @date 2017/03/22 15:32
*/
class
DataService
{
/**
* 数据签名
* @param array $data
* @param string $apikey
* @param string $prefix
* @return string
*/
public
static
function
sign
(
&
$data
,
$apikey
=
''
,
$prefix
=
''
)
{
$data
[
'_SIGNSTR_'
]
=
strtoupper
(
isset
(
$data
[
'_SIGNSTR_'
])
?
$data
[
'_SIGNSTR_'
]
:
substr
(
md5
(
uniqid
()),
22
));
ksort
(
$data
);
foreach
(
array_values
(
$data
)
as
$string
)
{
is_array
(
$string
)
||
(
$prefix
.=
"
{
$string
}
"
);
}
return
strtoupper
(
md5
(
$prefix
.
$apikey
.
$data
[
'_SIGNSTR_'
]));
}
/**
* 删除指定序号
* @param string $sequence
* @param string $type
* @return bool
*/
public
static
function
deleteSequence
(
$sequence
,
$type
=
'SYSTEM'
)
{
$data
=
[
'sequence'
=>
$sequence
,
'type'
=>
strtoupper
(
$type
)];
return
Db
::
name
(
'SystemSequence'
)
->
where
(
$data
)
->
delete
();
}
/**
* 生成唯一序号 (失败返回 NULL )
* @param int $length 序号长度
* @param string $type 序号顾类型
* @return string
*/
public
static
function
createSequence
(
$length
=
10
,
$type
=
'SYSTEM'
)
{
$times
=
0
;
while
(
$times
++
<
10
)
{
list
(
$i
,
$sequence
)
=
[
0
,
''
];
while
(
$i
++
<
$length
)
{
$sequence
.=
(
$i
<=
1
?
rand
(
1
,
9
)
:
rand
(
0
,
9
));
}
$data
=
[
'sequence'
=>
$sequence
,
'type'
=>
strtoupper
(
$type
)];
if
(
Db
::
name
(
'SystemSequence'
)
->
where
(
$data
)
->
count
()
<
1
)
{
if
(
Db
::
name
(
'SystemSequence'
)
->
insert
(
$data
)
!==
false
)
{
return
$sequence
;
}
}
}
return
null
;
}
/**
* 数据增量保存
* @param \think\db\Query|string $dbQuery 数据查询对象
* @param array $data 需要保存或更新的数据
* @param string $key 条件主键限制
* @param array $where 其它的where条件
* @return bool
*/
public
static
function
save
(
$dbQuery
,
$data
,
$key
=
'id'
,
$where
=
[])
{
$db
=
is_string
(
$dbQuery
)
?
Db
::
name
(
$dbQuery
)
:
$dbQuery
;
$where
[
$key
]
=
isset
(
$data
[
$key
])
?
$data
[
$key
]
:
''
;
if
(
$db
->
where
(
$where
)
->
count
()
>
0
)
{
return
$db
->
where
(
$where
)
->
update
(
$data
)
!==
false
;
}
return
$db
->
insert
(
$data
)
!==
false
;
}
/**
* 更新数据表内容
* @param \think\db\Query|string $dbQuery 数据查询对象
* @param array $where 额外查询条件
* @return bool|null
*/
public
static
function
update
(
&
$dbQuery
,
$where
=
[])
{
$request
=
Request
::
instance
();
$db
=
is_string
(
$dbQuery
)
?
Db
::
name
(
$dbQuery
)
:
$dbQuery
;
$ids
=
explode
(
','
,
$request
->
post
(
'id'
,
''
));
$field
=
$request
->
post
(
'field'
,
''
);
$value
=
$request
->
post
(
'value'
,
''
);
$pk
=
$db
->
getPk
([
'table'
=>
$db
->
getTable
()]);
$where
[
empty
(
$pk
)
?
'id'
:
$pk
]
=
[
'in'
,
$ids
];
// 删除模式,如果存在 is_deleted 字段使用软删除
if
(
$field
===
'delete'
)
{
if
(
method_exists
(
$db
,
'getTableFields'
))
{
if
(
in_array
(
'is_deleted'
,
$db
->
getTableFields
(
$db
->
getTable
())))
{
return
false
!==
$db
->
where
(
$where
)
->
update
([
'is_deleted'
=>
1
]);
}
}
return
false
!==
$db
->
where
(
$where
)
->
delete
();
}
// 更新模式,更新指定字段内容
return
false
!==
$db
->
where
(
$where
)
->
update
([
$field
=>
$value
]);
}
}
application/index/service/ExtendService.php
deleted
100644 → 0
View file @
db76a4a3
<?php
// +----------------------------------------------------------------------
// | Think.Admin
// +----------------------------------------------------------------------
// | 版权所有 2014~2017 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
// +----------------------------------------------------------------------
// | 官方网站: http://think.ctolog.com
// +----------------------------------------------------------------------
// | 开源协议 ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | github开源项目:https://github.com/zoujingli/Think.Admin
// +----------------------------------------------------------------------
namespace
service
;
use
think\Db
;
use
think\Request
;
/**
* 扩展服务
* Class ExtendService
* @package service
*/
class
ExtendService
{
/**
* 发送短信验证码
* @param string $phone 手机号
* @param string $content 短信内容
* @param string $productid 短信通道ID
* @return bool
*/
public
static
function
sendSms
(
$phone
,
$content
,
$productid
=
'676767'
)
{
$tkey
=
date
(
"YmdHis"
);
$data
=
[
'username'
=>
sysconf
(
'sms_username'
),
'tkey'
=>
$tkey
,
'content'
=>
$content
,
'mobile'
=>
$phone
,
'productid'
=>
$productid
,
'password'
=>
md5
(
md5
(
sysconf
(
'sms_password'
))
.
$tkey
),
];
$result
=
HttpService
::
post
(
'http://www.ztsms.cn/sendNSms.do'
,
$data
);
list
(
$code
,
$msg
)
=
explode
(
','
,
$result
.
','
);
$insert
=
[
'phone'
=>
$phone
,
'content'
=>
$content
,
'result'
=>
$result
];
Db
::
name
(
'MemberSmsHistory'
)
->
insert
(
$insert
);
return
intval
(
$code
)
===
1
;
}
/**
* 查询短信余额
* @return array
*/
public
static
function
querySmsBalance
()
{
$tkey
=
date
(
"YmdHis"
);
$data
=
[
'username'
=>
sysconf
(
'sms_username'
),
'tkey'
=>
$tkey
,
'password'
=>
md5
(
md5
(
sysconf
(
'sms_password'
))
.
$tkey
),
];
$result
=
HttpService
::
post
(
'http://www.ztsms.cn/balanceN.do'
,
$data
);
if
(
$result
>
-
1
)
{
return
[
'code'
=>
1
,
'num'
=>
$result
,
'msg'
=>
'获取短信剩余条数成功!'
];
}
elseif
(
$result
>
-
2
)
{
return
[
'code'
=>
0
,
'num'
=>
'0'
,
'msg'
=>
'用户名或者密码不正确!'
];
}
elseif
(
$result
>
-
3
)
{
return
[
'code'
=>
0
,
'num'
=>
'0'
,
'msg'
=>
'tkey不正确!'
];
}
elseif
(
$result
>
-
4
)
{
return
[
'code'
=>
0
,
'num'
=>
'0'
,
'msg'
=>
'用户不存在或用户停用!'
];
}
}
/**
* 通用物流单查询
* @param string $code 快递物流编号
* @return array
*/
public
static
function
expressByAuto
(
$code
)
{
list
(
$result
,
$client_ip
)
=
[[],
Request
::
instance
()
->
ip
()];
$header
=
[
'Host'
=>
'www.kuaidi100.com'
,
'CLIENT-IP'
=>
$client_ip
,
'X-FORWARDED-FOR'
=>
$client_ip
];
$autoResult
=
HttpService
::
get
(
"http://www.kuaidi100.com/autonumber/autoComNum?text=
{
$code
}
"
,
[],
30
,
$header
);
foreach
(
json_decode
(
$autoResult
)
->
auto
as
$vo
)
{
$result
[
$vo
->
comCode
]
=
self
::
express
(
$vo
->
comCode
,
$code
);
}
return
$result
;
}
/**
* 查询物流信息
* @param string $express_code 快递公司编辑
* @param string $express_no 快递物流编号
* @return array
*/
public
static
function
express
(
$express_code
,
$express_no
)
{
list
(
$microtime
,
$client_ip
)
=
[
microtime
(
true
),
Request
::
instance
()
->
ip
()];
$header
=
[
'Host'
=>
'www.kuaidi100.com'
,
'CLIENT-IP'
=>
$client_ip
,
'X-FORWARDED-FOR'
=>
$client_ip
];
$location
=
"http://www.kuaidi100.com/query?type=
{
$express_code
}
&postid=
{
$express_no
}
&id=1&valicode=&temp=
{
$microtime
}
"
;
return
json_decode
(
HttpService
::
get
(
$location
,
[],
30
,
$header
),
true
);
}
}
\ No newline at end of file
application/index/service/FileService.php
deleted
100644 → 0
View file @
db76a4a3
<?php
// +----------------------------------------------------------------------
// | Think.Admin
// +----------------------------------------------------------------------
// | 版权所有 2014~2017 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
// +----------------------------------------------------------------------
// | 官方网站: http://think.ctolog.com
// +----------------------------------------------------------------------
// | 开源协议 ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | github开源项目:https://github.com/zoujingli/Think.Admin
// +----------------------------------------------------------------------
namespace
service
;
use
Exception
;
use
OSS\Core\OssException
;
use
OSS\OssClient
;
use
Qiniu\Auth
;
use
Qiniu\Storage\BucketManager
;
use
Qiniu\Storage\UploadManager
;
use
think\Config
;
use
think\Log
;
/**
* 系统文件服务
* Class FileService
* @package service
* @author Anyon <zoujingli@qq.com>
* @date 2017/03/15 15:17
*/
class
FileService
{
/**
* 根据文件后缀获取文件MINE
* @param array $exts 文件后缀
* @param array $mine 文件后缀MINE信息
* @return string
*/
public
static
function
getFileMine
(
$exts
,
$mine
=
[])
{
$mines
=
Config
::
get
(
'mines'
);
foreach
(
is_string
(
$exts
)
?
explode
(
','
,
$exts
)
:
$exts
as
$_e
)
{
if
(
isset
(
$mines
[
strtolower
(
$_e
)]))
{
$_exinfo
=
$mines
[
strtolower
(
$_e
)];
$mine
[]
=
is_array
(
$_exinfo
)
?
join
(
','
,
$_exinfo
)
:
$_exinfo
;
}
}
return
join
(
','
,
$mine
);
}
/**
* 获取文件当前URL地址
* @param string $filename
* @param string|null $storage
* @return bool|string
*/
public
static
function
getFileUrl
(
$filename
,
$storage
=
null
)
{
if
(
self
::
hasFile
(
$filename
,
$storage
)
===
false
)
{
return
false
;
}
switch
(
empty
(
$storage
)
?
sysconf
(
'storage_type'
)
:
$storage
)
{
case
'local'
:
return
self
::
getBaseUriLocal
()
.
$filename
;
case
'qiniu'
:
return
self
::
getBaseUriQiniu
()
.
$filename
;
case
'oss'
:
return
self
::
getBaseUriOss
()
.
$filename
;
}
return
false
;
}
/**
* 根据配置获取到七牛云文件上传目标地址
* @return string
*/
public
static
function
getUploadLocalUrl
()
{
return
url
(
'@admin/plugs/upload'
);
}
/**
* 根据配置获取到七牛云文件上传目标地址
* @param bool $isClient
* @return string
*/
public
static
function
getUploadQiniuUrl
(
$isClient
=
true
)
{
$region
=
sysconf
(
'storage_qiniu_region'
);
$isHttps
=
!!
sysconf
(
'storage_qiniu_is_https'
);
switch
(
$region
)
{
case
'华东'
:
if
(
$isHttps
)
{
return
$isClient
?
'https://upload.qbox.me'
:
'https://up.qbox.me'
;
}
return
$isClient
?
'http://upload.qiniu.com'
:
'http://up.qiniu.com'
;
case
'华北'
:
if
(
$isHttps
)
{
return
$isClient
?
'https://upload-z1.qbox.me'
:
'https://up-z1.qbox.me'
;
}
return
$isClient
?
'http://upload-z1.qiniu.com'
:
'http://up-z1.qiniu.com'
;
case
'北美'
:
if
(
$isHttps
)
{
return
$isClient
?
'https://upload-na0.qbox.me'
:
'https://up-na0.qbox.me'
;
}
return
$isClient
?
'http://upload-na0.qiniu.com'
:
'http://up-na0.qiniu.com'
;
case
'华南'
:
default
:
if
(
$isHttps
)
{
return
$isClient
?
'https://upload-z2.qbox.me'
:
'https://up-z2.qbox.me'
;
}
return
$isClient
?
'http://upload-z2.qiniu.com'
:
'http://up-z2.qiniu.com'
;
}
}
/**
* 获取AliOSS上传地址
* @return string
*/
public
static
function
getUploadOssUrl
()
{
return
(
request
()
->
isSsl
()
?
'https'
:
'http'
)
.
'://'
.
sysconf
(
'storage_oss_domain'
);
}
/**
* 获取服务器URL前缀
* @return string
*/
public
static
function
getBaseUriLocal
()
{
$appRoot
=
request
()
->
root
(
true
);
$uriRoot
=
preg_match
(
'/\.php$/'
,
$appRoot
)
?
dirname
(
$appRoot
)
:
$appRoot
;
return
"
{
$uriRoot
}
/static/upload/"
;
}
/**
* 获取七牛云URL前缀
* @return string
*/
public
static
function
getBaseUriQiniu
()
{
return
(
sysconf
(
'storage_qiniu_is_https'
)
?
'https'
:
'http'
)
.
'://'
.
sysconf
(
'storage_qiniu_domain'
)
.
'/'
;
}
/**
* 获取AliOss URL前缀
* @return string
*/
public
static
function
getBaseUriOss
()
{
return
(
sysconf
(
'storage_oss_is_https'
)
?
'https'
:
'http'
)
.
'://'
.
sysconf
(
'storage_oss_domain'
)
.
'/'
;
}
/**
* 获取文件相对名称
* @param string $location 文件标识
* @param string $ext 文件后缀
* @param string $pre 文件前缀
* @return string
*/
public
static
function
getFileName
(
$location
,
$ext
=
''
,
$pre
=
''
)
{
return
$pre
.
join
(
'/'
,
str_split
(
md5
(
$location
),
16
))
.
'.'
.
$ext
;
}
/**
* 检查文件是否已经存在
* @param string $filename
* @param string|null $storage
* @return bool
*/
public
static
function
hasFile
(
$filename
,
$storage
=
null
)
{
switch
(
empty
(
$storage
)
?
sysconf
(
'storage_type'
)
:
$storage
)
{
case
'local'
:
return
file_exists
(
ROOT_PATH
.
'static/upload/'
.
$filename
);
case
'qiniu'
:
$auth
=
new
Auth
(
sysconf
(
'storage_qiniu_access_key'
),
sysconf
(
'storage_qiniu_secret_key'
));
$bucketMgr
=
new
BucketManager
(
$auth
);
list
(
$ret
,
$err
)
=
$bucketMgr
->
stat
(
sysconf
(
'storage_qiniu_bucket'
),
$filename
);
return
$err
===
null
;
case
'oss'
:
$ossClient
=
new
OssClient
(
sysconf
(
'storage_oss_keyid'
),
sysconf
(
'storage_oss_secret'
),
self
::
getBaseUriOss
(),
true
);
return
$ossClient
->
doesObjectExist
(
sysconf
(
'storage_oss_bucket'
),
$filename
);
}
return
false
;
}
/**
* 根据Key读取文件内容
* @param string $filename
* @param string|null $storage
* @return string|null
*/
public
static
function
readFile
(
$filename
,
$storage
=
null
)
{
switch
(
empty
(
$storage
)
?
sysconf
(
'storage_type'
)
:
$storage
)
{
case
'local'
:
$file
=
ROOT_PATH
.
'static/upload/'
.
$filename
;
return
file_exists
(
$file
)
?
file_get_contents
(
$file
)
:
''
;
case
'qiniu'
:
$auth
=
new
Auth
(
sysconf
(
'storage_qiniu_access_key'
),
sysconf
(
'storage_qiniu_secret_key'
));
return
file_get_contents
(
$auth
->
privateDownloadUrl
(
self
::
getBaseUriQiniu
()
.
$filename
));
case
'oss'
:
$ossClient
=
new
OssClient
(
sysconf
(
'storage_oss_keyid'
),
sysconf
(
'storage_oss_secret'
),
self
::
getBaseUriOss
(),
true
);
return
$ossClient
->
getObject
(
sysconf
(
'storage_oss_bucket'
),
$filename
);
}
Log
::
error
(
"通过
{
$storage
}
读取文件
{
$filename
}
的不存在!"
);
return
null
;
}
/**
* 根据当前配置存储文件
* @param string $filename
* @param string $content
* @param string|null $file_storage
* @return array|false
*/
public
static
function
save
(
$filename
,
$content
,
$file_storage
=
null
)
{
$type
=
empty
(
$file_storage
)
?
sysconf
(
'storage_type'
)
:
$file_storage
;
if
(
!
method_exists
(
__CLASS__
,
$type
))
{
Log
::
error
(
"保存存储失败,调用
{
$type
}
存储引擎不存在!"
);
return
false
;
}
return
self
::
$type
(
$filename
,
$content
);
}
/**
* 文件储存在本地
* @param string $filename
* @param string $content
* @return array|null
*/
public
static
function
local
(
$filename
,
$content
)
{
try
{
$filepath
=
ROOT_PATH
.
'static/upload/'
.
$filename
;
!
file_exists
(
dirname
(
$filepath
))
&&
mkdir
(
dirname
(
$filepath
),
'0755'
,
true
);
if
(
file_put_contents
(
$filepath
,
$content
))
{
$url
=
pathinfo
(
request
()
->
baseFile
(
true
),
PATHINFO_DIRNAME
)
.
'/static/upload/'
.
$filename
;
return
[
'file'
=>
$filepath
,
'hash'
=>
md5_file
(
$filepath
),
'key'
=>
"static/upload/
{
$filename
}
"
,
'url'
=>
$url
];
}
}
catch
(
Exception
$err
)
{
Log
::
error
(
'本地文件存储失败, '
.
var_export
(
$err
,
true
));
}
return
null
;
}
/**
* 七牛云存储
* @param string $filename
* @param string $content
* @return array|null
*/
public
static
function
qiniu
(
$filename
,
$content
)
{
$auth
=
new
Auth
(
sysconf
(
'storage_qiniu_access_key'
),
sysconf
(
'storage_qiniu_secret_key'
));
$token
=
$auth
->
uploadToken
(
sysconf
(
'storage_qiniu_bucket'
));
$uploadMgr
=
new
UploadManager
();
list
(
$result
,
$err
)
=
$uploadMgr
->
put
(
$token
,
$filename
,
$content
);
if
(
$err
!==
null
)
{
Log
::
error
(
'七牛云文件上传失败, '
.
var_export
(
$err
,
true
));
return
null
;
}
$result
[
'file'
]
=
$filename
;
$result
[
'url'
]
=
self
::
getBaseUriQiniu
()
.
$filename
;
return
$result
;
}
/**
* 阿里云OSS
* @param string $filename
* @param string $content
* @return array|null
*/
public
static
function
oss
(
$filename
,
$content
)
{
try
{
$ossClient
=
new
OssClient
(
sysconf
(
'storage_oss_keyid'
),
sysconf
(
'storage_oss_secret'
),
self
::
getBaseUriOss
(),
true
);
$result
=
$ossClient
->
putObject
(
sysconf
(
'storage_oss_bucket'
),
$filename
,
$content
);
return
[
'file'
=>
$filename
,
'hash'
=>
$result
[
'content-md5'
],
'key'
=>
$filename
,
'url'
=>
$result
[
'oss-request-url'
]];
}
catch
(
OssException
$err
)
{
Log
::
error
(
'阿里云OSS文件上传失败, '
.
var_export
(
$err
,
true
));
return
null
;
}
}
/**
* 下载文件到本地
* @param string $url 文件URL地址
* @param bool $isForce 是否强制重新下载文件
* @return array|null;
*/
public
static
function
download
(
$url
,
$isForce
=
false
)
{
try
{
$filename
=
self
::
getFileName
(
$url
,
strtolower
(
pathinfo
(
$url
,
4
)),
'download/'
);
if
(
false
===
$isForce
&&
(
$siteUrl
=
self
::
getFileUrl
(
$filename
,
'local'
)))
{
$realfile
=
ROOT_PATH
.
'static/upload/'
.
$filename
;
return
[
'file'
=>
$realfile
,
'hash'
=>
md5_file
(
$realfile
),
'key'
=>
"static/upload/
{
$filename
}
"
,
'url'
=>
$siteUrl
];
}
return
self
::
local
(
$filename
,
file_get_contents
(
$url
));
}
catch
(
\Exception
$e
)
{
Log
::
error
(
"FileService 文件下载失败 [
{
$url
}
] .
{
$e
->
getMessage
()
}
"
);
return
null
;
}
}
}
application/index/service/HttpService.php
deleted
100644 → 0
View file @
db76a4a3
<?php
// +----------------------------------------------------------------------
// | Think.Admin
// +----------------------------------------------------------------------
// | 版权所有 2014~2017 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
// +----------------------------------------------------------------------
// | 官方网站: http://think.ctolog.com
// +----------------------------------------------------------------------
// | 开源协议 ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | github开源项目:https://github.com/zoujingli/Think.Admin
// +----------------------------------------------------------------------
namespace
service
;
use
CURLFile
;
/**
* HTTP请求服务
* Class HttpService
* @package service
* @author Anyon <zoujingli@qq.com>
* @date 2017/03/22 15:32
*/
class
HttpService
{
/**
* HTTP GET 请求
* @param string $url 请求的URL地址
* @param array $data GET参数
* @param int $second 设置超时时间(默认30秒)
* @param array $header 请求Header信息
* @return bool|string
*/
public
static
function
get
(
$url
,
$data
=
[],
$second
=
30
,
$header
=
[])
{
if
(
!
empty
(
$data
))
{
$url
.=
(
stripos
(
$url
,
'?'
)
===
false
?
'?'
:
'&'
);
$url
.=
(
is_array
(
$data
)
?
http_build_query
(
$data
)
:
$data
);
}
$curl
=
curl_init
();
self
::
applyHttp
(
$curl
,
$url
);
curl_setopt
(
$curl
,
CURLOPT_URL
,
$url
);
curl_setopt
(
$curl
,
CURLOPT_TIMEOUT
,
$second
);
curl_setopt
(
$curl
,
CURLOPT_RETURNTRANSFER
,
1
);
if
(
!
empty
(
$header
))
{
curl_setopt
(
$curl
,
CURLOPT_HTTPHEADER
,
$header
);
}
list
(
$content
,
$status
)
=
[
curl_exec
(
$curl
),
curl_getinfo
(
$curl
),
curl_close
(
$curl
)];
return
(
intval
(
$status
[
"http_code"
])
===
200
)
?
$content
:
false
;
}
/**
* POST 请求(支持文件上传)
* @param string $url HTTP请求URL地址
* @param array|string $data POST提交的数据
* @param int $second 请求超时时间
* @param array $header 请求Header信息
* @return bool|string
*/
static
public
function
post
(
$url
,
$data
=
[],
$second
=
30
,
$header
=
[])
{
$curl
=
curl_init
();
self
::
applyData
(
$data
);
self
::
applyHttp
(
$curl
,
$url
);
curl_setopt
(
$curl
,
CURLOPT_TIMEOUT
,
$second
);
curl_setopt
(
$curl
,
CURLOPT_URL
,
$url
);
curl_setopt
(
$curl
,
CURLOPT_HEADER
,
false
);
curl_setopt
(
$curl
,
CURLOPT_RETURNTRANSFER
,
true
);
curl_setopt
(
$curl
,
CURLOPT_POST
,
true
);
curl_setopt
(
$curl
,
CURLOPT_POSTFIELDS
,
$data
);
if
(
!
empty
(
$header
))
{
curl_setopt
(
$curl
,
CURLOPT_HTTPHEADER
,
$header
);
}
list
(
$content
,
$status
)
=
[
curl_exec
(
$curl
),
curl_getinfo
(
$curl
),
curl_close
(
$curl
)];
return
(
intval
(
$status
[
"http_code"
])
===
200
)
?
$content
:
false
;
}
/**
* 设置SSL参数
* @param $curl
* @param string $url
*/
private
static
function
applyHttp
(
&
$curl
,
$url
)
{
if
(
stripos
(
$url
,
"https"
)
===
0
)
{
curl_setopt
(
$curl
,
CURLOPT_SSL_VERIFYPEER
,
false
);
curl_setopt
(
$curl
,
CURLOPT_SSL_VERIFYHOST
,
false
);
curl_setopt
(
$curl
,
CURLOPT_SSLVERSION
,
1
);
}
}
/**
* Post 数据过滤处理
* @param array $data
* @param bool $isBuild
* @return string
*/
private
static
function
applyData
(
&
$data
,
$isBuild
=
true
)
{
if
(
!
is_array
(
$data
))
{
return
null
;
}
foreach
(
$data
as
&
$value
)
{
is_array
(
$value
)
&&
$isBuild
=
true
;
if
(
!
(
is_string
(
$value
)
&&
strlen
(
$value
)
>
0
&&
$value
[
0
]
===
'@'
))
{
continue
;
}
if
(
!
file_exists
((
$file
=
realpath
(
trim
(
$value
,
'@'
)))))
{
continue
;
}
list
(
$isBuild
,
$mime
)
=
[
false
,
FileService
::
getFileMine
(
pathinfo
(
$file
,
4
))];
if
(
class_exists
(
'CURLFile'
,
false
))
{
$value
=
new
CURLFile
(
$file
,
$mime
);
}
else
{
$value
=
"
{
$value
}
;type=
{
$mime
}
"
;
}
}
$isBuild
&&
$data
=
http_build_query
(
$data
);
}
}
application/index/service/LogService.php
deleted
100644 → 0
View file @
db76a4a3
<?php
// +----------------------------------------------------------------------
// | Think.Admin
// +----------------------------------------------------------------------
// | 版权所有 2014~2017 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
// +----------------------------------------------------------------------
// | 官方网站: http://think.ctolog.com
// +----------------------------------------------------------------------
// | 开源协议 ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | github开源项目:https://github.com/zoujingli/Think.Admin
// +----------------------------------------------------------------------
namespace
service
;
use
think\Db
;
use
think\Request
;
/**
* 操作日志服务
* Class LogService
* @package service
* @author Anyon <zoujingli@qq.com>
* @date 2017/03/24 13:25
*/
class
LogService
{
/**
* 获取数据操作对象
* @return \think\db\Query
*/
protected
static
function
db
()
{
return
Db
::
name
(
'SystemLog'
);
}
/**
* 写入操作日志
* @param string $action
* @param string $content
* @return bool
*/
public
static
function
write
(
$action
=
'行为'
,
$content
=
"内容描述"
)
{
$request
=
Request
::
instance
();
$node
=
strtolower
(
join
(
'/'
,
[
$request
->
module
(),
$request
->
controller
(),
$request
->
action
()]));
$data
=
[
'ip'
=>
$request
->
ip
(),
'node'
=>
$node
,
'username'
=>
session
(
'user.username'
)
.
''
,
'action'
=>
$action
,
'content'
=>
$content
];
return
self
::
db
()
->
insert
(
$data
)
!==
false
;
}
}
application/index/service/NodeService.php
deleted
100644 → 0
View file @
db76a4a3
<?php
// +----------------------------------------------------------------------
// | Think.Admin
// +----------------------------------------------------------------------
// | 版权所有 2014~2017 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
// +----------------------------------------------------------------------
// | 官方网站: http://think.ctolog.com
// +----------------------------------------------------------------------
// | 开源协议 ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | github开源项目:https://github.com/zoujingli/Think.Admin
// +----------------------------------------------------------------------
namespace
service
;
use
think\Db
;
/**
* 系统权限节点读取器
* Class NodeService
* @package extend
* @author Anyon <zoujingli@qq.com>
* @date 2017/05/08 11:28
*/
class
NodeService
{
/**
* 应用用户权限节点
* @return bool
*/
public
static
function
applyAuthNode
()
{
cache
(
'need_access_node'
,
null
);
if
((
$userid
=
session
(
'user.id'
)))
{
session
(
'user'
,
Db
::
name
(
'SystemUser'
)
->
where
(
'id'
,
$userid
)
->
find
());
}
if
((
$authorize
=
session
(
'user.authorize'
)))
{
$where
=
[
'id'
=>
[
'in'
,
explode
(
','
,
$authorize
)],
'status'
=>
'1'
];
$authorizeids
=
Db
::
name
(
'SystemAuth'
)
->
where
(
$where
)
->
column
(
'id'
);
if
(
empty
(
$authorizeids
))
{
return
session
(
'user.nodes'
,
[]);
}
$nodes
=
Db
::
name
(
'SystemAuthNode'
)
->
whereIn
(
'auth'
,
$authorizeids
)
->
column
(
'node'
);
return
session
(
'user.nodes'
,
$nodes
);
}
return
false
;
}
/**
* 获取授权节点
* @return array
*/
public
static
function
getAuthNode
()
{
$nodes
=
cache
(
'need_access_node'
);
if
(
empty
(
$nodes
))
{
$nodes
=
Db
::
name
(
'SystemNode'
)
->
where
([
'is_auth'
=>
'1'
])
->
column
(
'node'
);
cache
(
'need_access_node'
,
$nodes
);
}
return
$nodes
;
}
/**
* 检查用户节点权限
* @param string $node 节点
* @return bool
*/
public
static
function
checkAuthNode
(
$node
)
{
list
(
$module
,
$controller
,
$action
)
=
explode
(
'/'
,
str_replace
([
'?'
,
'='
,
'&'
],
'/'
,
$node
.
'///'
));
$auth_node
=
strtolower
(
trim
(
"
{
$module
}
/
{
$controller
}
/
{
$action
}
"
,
'/'
));
if
(
session
(
'user.username'
)
===
'admin'
||
stripos
(
$node
,
'admin/index'
)
===
0
)
{
return
true
;
}
if
(
!
in_array
(
$auth_node
,
self
::
getAuthNode
()))
{
return
true
;
}
return
in_array
(
$auth_node
,
(
array
)
session
(
'user.nodes'
));
}
/**
* 获取系统代码节点
* @param array $nodes
* @return array
*/
public
static
function
get
(
$nodes
=
[])
{
$alias
=
Db
::
name
(
'SystemNode'
)
->
column
(
'node,is_menu,is_auth,is_login,title'
);
$ignore
=
[
'index'
,
'wechat/api'
,
'wechat/notify'
,
'wechat/review'
,
'admin/plugs'
,
'admin/login'
,
'admin/index'
];
foreach
(
self
::
getNodeTree
(
APP_PATH
)
as
$thr
)
{
foreach
(
$ignore
as
$str
)
{
if
(
stripos
(
$thr
,
$str
)
===
0
)
{
continue
2
;
}
}
$tmp
=
explode
(
'/'
,
$thr
);
list
(
$one
,
$two
)
=
[
"
{
$tmp
[
0
]
}
"
,
"
{
$tmp
[
0
]
}
/
{
$tmp
[
1
]
}
"
];
$nodes
[
$one
]
=
array_merge
(
isset
(
$alias
[
$one
])
?
$alias
[
$one
]
:
[
'node'
=>
$one
,
'title'
=>
''
,
'is_menu'
=>
0
,
'is_auth'
=>
0
,
'is_login'
=>
0
],
[
'pnode'
=>
''
]);
$nodes
[
$two
]
=
array_merge
(
isset
(
$alias
[
$two
])
?
$alias
[
$two
]
:
[
'node'
=>
$two
,
'title'
=>
''
,
'is_menu'
=>
0
,
'is_auth'
=>
0
,
'is_login'
=>
0
],
[
'pnode'
=>
$one
]);
$nodes
[
$thr
]
=
array_merge
(
isset
(
$alias
[
$thr
])
?
$alias
[
$thr
]
:
[
'node'
=>
$thr
,
'title'
=>
''
,
'is_menu'
=>
0
,
'is_auth'
=>
0
,
'is_login'
=>
0
],
[
'pnode'
=>
$two
]);
}
foreach
(
$nodes
as
&
$node
)
{
list
(
$node
[
'is_auth'
],
$node
[
'is_menu'
],
$node
[
'is_login'
])
=
[
intval
(
$node
[
'is_auth'
]),
intval
(
$node
[
'is_menu'
]),
empty
(
$node
[
'is_auth'
])
?
intval
(
$node
[
'is_login'
])
:
1
];
}
return
$nodes
;
}
/**
* 获取节点列表
* @param string $path 路径
* @param array $nodes 额外数据
* @return array
*/
public
static
function
getNodeTree
(
$path
,
$nodes
=
[])
{
foreach
(
self
::
_getFilePaths
(
$path
)
as
$vo
)
{
if
(
!
preg_match
(
'|/(\w+)/controller/(\w+)|'
,
str_replace
(
DS
,
'/'
,
$vo
),
$matches
)
||
count
(
$matches
)
!==
3
)
{
continue
;
}
$className
=
config
(
'app_namespace'
)
.
str_replace
(
'/'
,
'\\'
,
$matches
[
0
]);
if
(
!
class_exists
(
$className
))
{
continue
;
}
foreach
(
get_class_methods
(
$className
)
as
$actionName
)
{
if
(
$actionName
[
0
]
!==
'_'
)
{
$nodes
[]
=
strtolower
(
"
{
$matches
[
1
]
}
/
{
$matches
[
2
]
}
/
{
$actionName
}
"
);
}
}
}
return
$nodes
;
}
/**
* 获取所有PHP文件
* @param string $path 目录
* @param array $data 额外数据
* @param string $ext 文件后缀
* @return array
*/
private
static
function
_getFilePaths
(
$path
,
$data
=
[],
$ext
=
'php'
)
{
foreach
(
scandir
(
$path
)
as
$dir
)
{
if
(
$dir
[
0
]
===
'.'
)
{
continue
;
}
if
((
$tmp
=
realpath
(
$path
.
DS
.
$dir
))
&&
(
is_dir
(
$tmp
)
||
pathinfo
(
$tmp
,
4
)
===
$ext
))
{
is_dir
(
$tmp
)
?
$data
=
array_merge
(
$data
,
self
::
_getFilePaths
(
$tmp
))
:
$data
[]
=
$tmp
;
}
}
return
$data
;
}
}
application/index/service/PayService.php
deleted
100644 → 0
View file @
db76a4a3
<?php
// +----------------------------------------------------------------------
// | Think.Admin
// +----------------------------------------------------------------------
// | 版权所有 2014~2017 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
// +----------------------------------------------------------------------
// | 官方网站: http://think.ctolog.com
// +----------------------------------------------------------------------
// | 开源协议 ( https://mit-license.org )
// +----------------------------------------------------------------------
// | github开源项目:https://github.com/zoujingli/Think.Admin
// +----------------------------------------------------------------------
namespace
service
;
use
Endroid\QrCode\QrCode
;
use
Wechat\WechatPay
;
use
think\Log
;
use
think\Db
;
/**
* 支付数据服务
* Class PayService
* @package service
* @author Anyon <zoujingli@qq.com>
* @date 2016/10/25 14:49
*/
class
PayService
{
/**
* 查询订单是否已经支付
* @param string $order_no
* @return bool
*/
public
static
function
isPay
(
$order_no
)
{
$map
=
[
'order_no'
=>
$order_no
,
'is_pay'
=>
'1'
];
return
Db
::
name
(
'WechatPayPrepayid'
)
->
where
(
$map
)
->
count
()
>
0
;
}
/**
* 创建微信二维码支付(扫码支付模式二)
* @param WechatPay $pay 支付SDK
* @param string $order_no 系统订单号
* @param int $fee 支付金额
* @param string $title 订单标题
* @param string $from 订单来源
* @return false|string
*/
public
static
function
createWechatPayQrc
(
WechatPay
$pay
,
$order_no
,
$fee
,
$title
,
$from
=
'wechat'
)
{
$prepayid
=
self
::
createWechatPrepayid
(
$pay
,
null
,
$order_no
,
$fee
,
$title
,
'NATIVE'
,
$from
);
if
(
$prepayid
===
false
)
{
return
false
;
}
$filename
=
FileService
::
getFileName
(
$prepayid
,
'png'
,
'qrc/'
);
if
(
!
FileService
::
hasFile
(
$filename
,
'local'
))
{
$qrCode
=
new
QrCode
(
$prepayid
);
if
(
null
===
FileService
::
save
(
$filename
,
$qrCode
->
get
(),
'local'
))
{
return
false
;
}
}
return
FileService
::
getFileUrl
(
$filename
,
'local'
);
}
/**
* 创建微信JSAPI支付签名包
* @param WechatPay $pay 支付SDK
* @param string $openid 微信用户openid
* @param string $order_no 系统订单号
* @param int $fee 支付金额
* @param string $title 订单标题
* @return bool|array
*/
public
static
function
createWechatPayJsPicker
(
WechatPay
$pay
,
$openid
,
$order_no
,
$fee
,
$title
)
{
if
((
$prepayid
=
self
::
createWechatPrepayid
(
$pay
,
$openid
,
$order_no
,
$fee
,
$title
,
'JSAPI'
))
===
false
)
{
return
false
;
}
return
$pay
->
createMchPay
(
$prepayid
);
}
/**
* 微信退款操作
* @param WechatPay $pay 支付SDK
* @param string $order_no 系统订单号
* @param int $fee 退款金额
* @param string|null $refund_no 退款订单号
* @param string $refund_account
* @return bool
*/
public
static
function
putWechatRefund
(
WechatPay
$pay
,
$order_no
,
$fee
=
0
,
$refund_no
=
null
,
$refund_account
=
''
)
{
$map
=
[
'order_no'
=>
$order_no
,
'is_pay'
=>
'1'
,
'appid'
=>
$pay
->
appid
];
$notify
=
Db
::
name
(
'WechatPayPrepayid'
)
->
where
(
$map
)
->
find
();
if
(
empty
(
$notify
))
{
Log
::
error
(
"内部订单号
{
$order_no
}
验证退款失败"
);
return
false
;
}
if
(
false
!==
$pay
->
refund
(
$notify
[
'out_trade_no'
],
$notify
[
'transaction_id'
],
is_null
(
$refund_no
)
?
"T
{
$order_no
}
"
:
$refund_no
,
$notify
[
'fee'
],
empty
(
$fee
)
?
$notify
[
'fee'
]
:
$fee
,
''
,
$refund_account
))
{
$data
=
[
'out_trade_no'
=>
$notify
[
'out_trade_no'
],
'is_refund'
=>
"1"
,
'refund_at'
=>
date
(
'Y-m-d H:i:s'
),
'expires_in'
=>
time
()
+
7000
];
if
(
DataService
::
save
(
'wechat_pay_prepayid'
,
$data
,
'out_trade_no'
))
{
return
true
;
}
Log
::
error
(
"内部订单号
{
$order_no
}
退款成功,系统更新异常"
);
return
false
;
}
Log
::
error
(
"内部订单号
{
$order_no
}
退款失败,
{
$pay
->
errMsg
}
"
);
return
false
;
}
/**
* 创建微信预支付码
* @param WechatPay $pay 支付SDK
* @param string $openid 支付者Openid
* @param string $order_no 实际订单号
* @param int $fee 实际订单支付费用
* @param string $title 订单标题
* @param string $trade_type 付款方式
* @param string $from 订单来源
* @return bool|string
*/
public
static
function
createWechatPrepayid
(
WechatPay
$pay
,
$openid
,
$order_no
,
$fee
,
$title
,
$trade_type
=
'JSAPI'
,
$from
=
'wechat'
)
{
$map
=
[
'order_no'
=>
$order_no
,
'is_pay'
=>
'1'
,
'expires_in'
=>
time
(),
'appid'
=>
$pay
->
appid
,
'trade_type'
=>
$trade_type
];
$where
=
'appid=:appid and order_no=:order_no and (is_pay=:is_pay or expires_in>:expires_in) and trade_type=:trade_type'
;
$prepayinfo
=
Db
::
name
(
'WechatPayPrepayid'
)
->
where
(
$where
,
$map
)
->
find
();
if
(
empty
(
$prepayinfo
)
||
empty
(
$prepayinfo
[
'prepayid'
]))
{
$out_trade_no
=
DataService
::
createSequence
(
18
,
'WXPAY-OUTER-NO'
);
if
(
!
(
$prepayid
=
$pay
->
getPrepayId
(
$openid
,
$title
,
$out_trade_no
,
$fee
,
url
(
"@wechat/notify"
,
''
,
true
,
true
),
$trade_type
)))
{
Log
::
error
(
"内部订单号
{
$order_no
}
生成预支付失败,
{
$pay
->
errMsg
}
"
);
return
false
;
}
$data
=
[
'prepayid'
=>
$prepayid
,
'order_no'
=>
$order_no
,
'out_trade_no'
=>
$out_trade_no
,
'fee'
=>
$fee
,
'trade_type'
=>
$trade_type
];
list
(
$data
[
'from'
],
$data
[
'appid'
],
$data
[
'expires_in'
])
=
[
$from
,
$pay
->
getAppid
(),
time
()
+
5400
];
if
(
Db
::
name
(
'WechatPayPrepayid'
)
->
insert
(
$data
)
>
0
)
{
Log
::
notice
(
"内部订单号
{
$order_no
}
生成预支付成功,
{
$prepayid
}
"
);
return
$prepayid
;
}
}
return
$prepayinfo
[
'prepayid'
];
}
}
application/index/service/SoapService.php
deleted
100644 → 0
View file @
db76a4a3
<?php
// +----------------------------------------------------------------------
// | Think.Admin
// +----------------------------------------------------------------------
// | 版权所有 2014~2017 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
// +----------------------------------------------------------------------
// | 官方网站: http://think.ctolog.com
// +----------------------------------------------------------------------
// | 开源协议 ( https://mit-license.org )
// +----------------------------------------------------------------------
// | github开源项目:https://github.com/zoujingli/Think.Admin
// +----------------------------------------------------------------------
namespace
service
;
use
think\Log
;
/**
* Soap服务对象
* Class SoapService
* @package service
*/
class
SoapService
{
/**
* SOAP实例对象
* @var \SoapClient
*/
protected
$soap
;
/**
* 错误消息
* @var string
*/
protected
$error
;
/**
* SoapService constructor.
* @param string|null $wsdl WSDL连接参数
* @param array $params Params连接参数
* @throws \Exception
*/
public
function
__construct
(
$wsdl
,
$params
)
{
set_time_limit
(
3600
);
if
(
!
extension_loaded
(
'soap'
))
{
throw
new
\Exception
(
'Not support soap.'
);
}
$this
->
soap
=
new
\SoapClient
(
$wsdl
,
$params
);
}
/**
* 属性获取转换
* @param $name
* @return string
*/
public
function
__get
(
$name
)
{
switch
(
strtolower
(
$name
))
{
case
'errmsg'
:
return
$this
->
getError
();
case
'errcode'
:
return
$this
->
getErrorCode
();
case
'appid'
:
return
$this
->
getAppid
();
}
return
''
;
}
/**
* @param string $name SOAP调用方法名
* @param array|string $arguments SOAP调用参数
* @return array|string|bool
* @throws \Exception
*/
public
function
__call
(
$name
,
$arguments
)
{
try
{
return
$this
->
soap
->
__call
(
$name
,
$arguments
);
}
catch
(
\Exception
$e
)
{
Log
::
error
(
"Soap Error. Call
{
$name
}
Method --- "
.
$e
->
getMessage
());
}
return
false
;
}
}
\ No newline at end of file
application/index/service/ToolsService.php
deleted
100644 → 0
View file @
db76a4a3
<?php
// +----------------------------------------------------------------------
// | Think.Admin
// +----------------------------------------------------------------------
// | 版权所有 2014~2017 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
// +----------------------------------------------------------------------
// | 官方网站: http://think.ctolog.com
// +----------------------------------------------------------------------
// | 开源协议 ( https://mit-license.org )
// +----------------------------------------------------------------------
// | github开源项目:https://github.com/zoujingli/Think.Admin
// +----------------------------------------------------------------------
namespace
service
;
use
think\Request
;
/**
* 系统工具服务
* Class ToolsService
* @package service
* @author Anyon <zoujingli@qq.com>
* @date 2016/10/25 14:49
*/
class
ToolsService
{
/**
* Cors Options 授权处理
*/
public
static
function
corsOptionsHandler
()
{
if
(
request
()
->
isOptions
())
{
header
(
'Access-Control-Allow-Origin:*'
);
header
(
'Access-Control-Allow-Headers:Accept,Referer,Host,Keep-Alive,User-Agent,X-Requested-With,Cache-Control,Content-Type,Cookie,token'
);
header
(
'Access-Control-Allow-Credentials:true'
);
header
(
'Access-Control-Allow-Methods:GET,POST,OPTIONS'
);
header
(
'Access-Control-Max-Age:1728000'
);
header
(
'Content-Type:text/plain charset=UTF-8'
);
header
(
'Content-Length: 0'
,
true
);
header
(
'status: 204'
);
header
(
'HTTP/1.0 204 No Content'
);
exit
;
}
}
/**
* Cors Request Header信息
* @return array
*/
public
static
function
corsRequestHander
()
{
return
[
'Access-Control-Allow-Origin'
=>
'*'
,
'Access-Control-Allow-Credentials'
=>
true
,
'Access-Control-Allow-Methods'
=>
'GET,POST,OPTIONS'
,
'Access-Defined-X-Support'
=>
'service@cuci.cc'
,
'Access-Defined-X-Servers'
=>
'Guangzhou Cuci Technology Co. Ltd'
,
];
}
/**
* Emoji原形转换为String
* @param string $content
* @return string
*/
public
static
function
emojiEncode
(
$content
)
{
return
json_decode
(
preg_replace_callback
(
"/(
\\
\u[ed][0-9a-f]
{
3
}
)/i"
,
function
(
$str
)
{
return
addslashes
(
$str
[
0
]);
},
json_encode
(
$content
)));
}
/**
* Emoji字符串转换为原形
* @param string $content
* @return string
*/
public
static
function
emojiDecode
(
$content
)
{
return
json_decode
(
preg_replace_callback
(
'/\\\\\\\\/i'
,
function
()
{
return
'\\'
;
},
json_encode
(
$content
)));
}
/**
* 一维数据数组生成数据树
* @param array $list 数据列表
* @param string $id 父ID Key
* @param string $pid ID Key
* @param string $son 定义子数据Key
* @return array
*/
public
static
function
arr2tree
(
$list
,
$id
=
'id'
,
$pid
=
'pid'
,
$son
=
'sub'
)
{
list
(
$tree
,
$map
)
=
[[],
[]];
foreach
(
$list
as
$item
)
{
$map
[
$item
[
$id
]]
=
$item
;
}
foreach
(
$list
as
$item
)
{
if
(
isset
(
$item
[
$pid
])
&&
isset
(
$map
[
$item
[
$pid
]]))
{
$map
[
$item
[
$pid
]][
$son
][]
=
&
$map
[
$item
[
$id
]];
}
else
{
$tree
[]
=
&
$map
[
$item
[
$id
]];
}
}
unset
(
$map
);
return
$tree
;
}
/**
* 一维数据数组生成数据树
* @param array $list 数据列表
* @param string $id ID Key
* @param string $pid 父ID Key
* @param string $path
* @param string $ppath
* @return array
*/
public
static
function
arr2table
(
array
$list
,
$id
=
'id'
,
$pid
=
'pid'
,
$path
=
'path'
,
$ppath
=
''
)
{
$tree
=
[];
foreach
(
self
::
arr2tree
(
$list
,
$id
,
$pid
)
as
$attr
)
{
$attr
[
$path
]
=
"
{
$ppath
}
-
{
$attr
[
$id
]
}
"
;
$attr
[
'sub'
]
=
isset
(
$attr
[
'sub'
])
?
$attr
[
'sub'
]
:
[];
$attr
[
'spl'
]
=
str_repeat
(
" ├ "
,
substr_count
(
$ppath
,
'-'
));
$sub
=
$attr
[
'sub'
];
unset
(
$attr
[
'sub'
]);
$tree
[]
=
$attr
;
if
(
!
empty
(
$sub
))
{
$tree
=
array_merge
(
$tree
,
(
array
)
self
::
arr2table
(
$sub
,
$id
,
$pid
,
$path
,
$attr
[
$path
]));
}
}
return
$tree
;
}
/**
* 获取数据树子ID
* @param array $list 数据列表
* @param int $id 起始ID
* @param string $key 子Key
* @param string $pkey 父Key
* @return array
*/
public
static
function
getArrSubIds
(
$list
,
$id
=
0
,
$key
=
'id'
,
$pkey
=
'pid'
)
{
$ids
=
[
intval
(
$id
)];
foreach
(
$list
as
$vo
)
{
if
(
intval
(
$vo
[
$pkey
])
>
0
&&
intval
(
$vo
[
$pkey
])
===
intval
(
$id
))
{
$ids
=
array_merge
(
$ids
,
self
::
getArrSubIds
(
$list
,
intval
(
$vo
[
$key
]),
$key
,
$pkey
));
}
}
return
$ids
;
}
/**
* 物流单查询
* @param $code
* @return array
*/
public
static
function
express
(
$code
)
{
list
(
$result
,
$client_ip
)
=
[[],
Request
::
instance
()
->
ip
()];
$header
=
[
'Host'
=>
'www.kuaidi100.com'
,
'CLIENT-IP'
=>
$client_ip
,
'X-FORWARDED-FOR'
=>
$client_ip
];
$autoResult
=
HttpService
::
get
(
"http://www.kuaidi100.com/autonumber/autoComNum?text=
{
$code
}
"
,
[],
30
,
$header
);
foreach
(
json_decode
(
$autoResult
)
->
auto
as
$vo
)
{
$microtime
=
microtime
(
true
);
$location
=
"http://www.kuaidi100.com/query?type=
{
$vo
->
comCode
}
&postid=
{
$code
}
&id=1&valicode=&temp=
{
$microtime
}
"
;
$result
[
$vo
->
comCode
]
=
json_decode
(
HttpService
::
get
(
$location
,
[],
30
,
$header
),
true
);
}
return
$result
;
}
}
application/index/service/WechatService.php
deleted
100644 → 0
View file @
db76a4a3
<?php
// +----------------------------------------------------------------------
// | Think.Admin
// +----------------------------------------------------------------------
// | 版权所有 2014~2017 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
// +----------------------------------------------------------------------
// | 官方网站: http://think.ctolog.com
// +----------------------------------------------------------------------
// | 开源协议 ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | github开源项目:https://github.com/zoujingli/Think.Admin
// +----------------------------------------------------------------------
namespace
service
;
use
think\Db
;
use
think\Log
;
/**
* 微信数据服务
* Class WechatService
* @package service
* @author Anyon <zoujingli@qq.com>
* @date 2017/03/22 15:32
*/
class
WechatService
{
/**
* 通过图文ID读取图文信息
* @param int $id 本地图文ID
* @param array $where 额外的查询条件
* @return array
*/
public
static
function
getNewsById
(
$id
,
$where
=
[])
{
$data
=
Db
::
name
(
'WechatNews'
)
->
where
([
'id'
=>
$id
])
->
where
(
$where
)
->
find
();
$article_ids
=
explode
(
','
,
$data
[
'article_id'
]);
$articles
=
Db
::
name
(
'WechatNewsArticle'
)
->
whereIn
(
'id'
,
$article_ids
)
->
select
();
$data
[
'articles'
]
=
[];
foreach
(
$article_ids
as
$article_id
)
{
foreach
(
$articles
as
$article
)
{
if
(
intval
(
$article
[
'id'
])
===
intval
(
$article_id
))
{
unset
(
$article
[
'create_by'
],
$article
[
'create_at'
]);
$article
[
'content'
]
=
htmlspecialchars_decode
(
$article
[
'content'
]);
$data
[
'articles'
][]
=
$article
;
}
}
}
unset
(
$articles
);
return
$data
;
}
/**
* 上传图片到微信服务器
* @param string $local_url
* @return string|null
*/
public
static
function
uploadImage
(
$local_url
)
{
# 检测文件上否已经上传过了
$md5
=
md5
(
$local_url
);
if
((
$img
=
Db
::
name
(
'WechatNewsImage'
)
->
where
([
'md5'
=>
$md5
])
->
find
())
&&
!
empty
(
$img
[
'media_url'
]))
{
return
$img
[
'media_url'
];
}
# 下载临时文件到本地
$content
=
file_get_contents
(
$local_url
);
$filename
=
'wechat/image/'
.
join
(
'/'
,
str_split
(
$md5
,
16
))
.
'.'
.
strtolower
(
pathinfo
(
$local_url
,
4
));
# 上传图片到微信服务器
if
((
$result
=
FileService
::
local
(
$filename
,
$content
))
&&
isset
(
$result
[
'file'
]))
{
$wechat
=
load_wechat
(
'media'
);
$info
=
$wechat
->
uploadImg
([
'media'
=>
base64_encode
(
$content
)]);
if
(
!
empty
(
$info
))
{
$data
=
[
'local_url'
=>
$local_url
,
'media_url'
=>
$info
[
'url'
],
'md5'
=>
$md5
];
Db
::
name
(
'WechatNewsImage'
)
->
insert
(
$data
);
return
$info
[
'url'
];
}
Log
::
error
(
"图片上传失败,请稍后再试!
{
$wechat
->
errMsg
}
[
{
$wechat
->
errCode
}
]"
);
}
return
null
;
}
/**
* 上传图片永久素材
* @param string $local_url 文件URL地址
* @param string $type 文件类型
* @param bool $is_video 是否为视频文件
* @param array $video_info 视频信息
* @return string|null
*/
public
static
function
uploadForeverMedia
(
$local_url
=
''
,
$type
=
'image'
,
$is_video
=
false
,
$video_info
=
[])
{
# 检测文件上否已经上传过了
$wechat
=
load_wechat
(
'media'
);
$map
=
[
'md5'
=>
md5
(
$local_url
),
'appid'
=>
$wechat
->
getAppid
()];
if
((
$img
=
Db
::
name
(
'WechatNewsMedia'
)
->
where
(
$map
)
->
find
())
&&
!
empty
(
$img
[
'media_id'
]))
{
return
$img
[
'media_id'
];
}
# 下载临时文件到本地
$content
=
file_get_contents
(
$local_url
);
$filename
=
'wechat/image/'
.
join
(
'/'
,
str_split
(
md5
(
$local_url
),
16
))
.
'.'
.
strtolower
(
pathinfo
(
$local_url
,
4
));
if
((
$upload
=
FileService
::
local
(
$filename
,
$content
))
&&
isset
(
$upload
[
'file'
])
&&
file_exists
(
$upload
[
'file'
]))
{
# 上传图片到微信服务器
if
(
false
!==
(
$result
=
$wechat
->
uploadForeverMedia
([
'media'
=>
base64_encode
(
$content
)],
$type
,
$is_video
,
$video_info
)))
{
$data
=
[
'md5'
=>
$map
[
'md5'
],
'type'
=>
$type
,
'appid'
=>
$wechat
->
getAppid
(),
'media_id'
=>
$result
[
'media_id'
],
'local_url'
=>
$local_url
];
isset
(
$result
[
'url'
])
&&
$data
[
'media_url'
]
=
$result
[
'url'
];
Db
::
name
(
'WechatNewsMedia'
)
->
insert
(
$data
);
return
$data
[
'media_id'
];
}
}
Log
::
error
(
"素材上传失败, 请稍后再试!
{
$wechat
->
errMsg
}
[
{
$wechat
->
errCode
}
]"
);
return
null
;
}
/**
* 从微信服务器获取所有标签
* @return bool
*/
public
static
function
syncFansTags
()
{
$wechat
=
load_wechat
(
"User"
);
if
((
$result
=
$wechat
->
getTags
())
!==
false
)
{
Db
::
name
(
'WechatFansTags'
)
->
where
(
'appid'
,
$wechat
->
getAppid
())
->
delete
();
foreach
(
array_chunk
(
$result
[
'tags'
],
100
)
as
$list
)
{
Db
::
name
(
'WechatFansTags'
)
->
insertAll
(
$list
);
}
}
return
true
;
}
/**
* 同步粉丝的标签
* @param string $openid
* @return bool
*/
public
static
function
syncFansTagsByOpenid
(
$openid
)
{
$wechat
=
load_wechat
(
'User'
);
$tagsid
=
$wechat
->
getUserTags
(
$openid
);
if
(
$tagsid
===
false
||
!
is_array
(
$tagsid
))
{
return
false
;
}
$data
=
[
'openid'
=>
$openid
,
'tagid_list'
=>
join
(
','
,
$tagsid
)];
return
DataService
::
save
(
'wechat_fans'
,
$data
,
'openid'
,
[
'appid'
=>
$wechat
->
getAppid
()]);
}
/**
* 保存/更新粉丝信息
* @param array $user
* @param string $appid
* @return bool
*/
public
static
function
setFansInfo
(
$user
,
$appid
=
''
)
{
if
(
!
empty
(
$user
[
'subscribe_time'
]))
{
$user
[
'subscribe_at'
]
=
date
(
'Y-m-d H:i:s'
,
$user
[
'subscribe_time'
]);
}
if
(
!
empty
(
$user
[
'tagid_list'
])
&&
is_array
(
$user
[
'tagid_list'
]))
{
$user
[
'tagid_list'
]
=
join
(
','
,
$user
[
'tagid_list'
]);
}
foreach
([
'country'
,
'province'
,
'city'
,
'nickname'
,
'remark'
]
as
$k
)
{
isset
(
$user
[
$k
])
&&
$user
[
$k
]
=
ToolsService
::
emojiEncode
(
$user
[
$k
]);
}
$user
[
'appid'
]
=
$appid
;
return
DataService
::
save
(
'WechatFans'
,
$user
,
'openid'
);
}
/**
* 读取粉丝信息
* @param string $openid 微信用户openid
* @param string $appid 公众号appid
* @return array|false
*/
public
static
function
getFansInfo
(
$openid
,
$appid
=
null
)
{
$map
=
[
'openid'
=>
$openid
];
is_string
(
$appid
)
&&
$map
[
'appid'
]
=
$appid
;
$user
=
Db
::
name
(
'WechatFans'
)
->
where
(
$map
)
->
find
();
foreach
([
'country'
,
'province'
,
'city'
,
'nickname'
,
'remark'
]
as
$k
)
{
isset
(
$user
[
$k
])
&&
$user
[
$k
]
=
ToolsService
::
emojiDecode
(
$user
[
$k
]);
}
return
$user
;
}
/**
* 同步获取粉丝列表
* @param string $next_openid
* @return bool
*/
public
static
function
syncAllFans
(
$next_openid
=
''
)
{
$wechat
=
load_wechat
(
'User'
);
$appid
=
$wechat
->
getAppid
();
if
(
false
===
(
$result
=
$wechat
->
getUserList
(
$next_openid
))
||
empty
(
$result
[
'data'
][
'openid'
]))
{
Log
::
error
(
"获取粉丝列表失败,
{
$wechat
->
errMsg
}
[
{
$wechat
->
errCode
}
]"
);
return
false
;
}
foreach
(
array_chunk
(
$result
[
'data'
][
'openid'
],
100
)
as
$openids
)
{
if
(
false
===
(
$info
=
$wechat
->
getUserBatchInfo
(
$openids
))
||
!
is_array
(
$info
))
{
Log
::
error
(
"获取用户信息失败,
{
$wechat
->
errMsg
}
[
{
$wechat
->
errCode
}
]"
);
return
false
;
}
foreach
(
$info
as
$user
)
{
if
(
false
===
self
::
setFansInfo
(
$user
,
$appid
))
{
Log
::
error
(
'更新粉丝信息更新失败!'
);
return
false
;
}
if
(
$result
[
'next_openid'
]
===
$user
[
'openid'
])
{
unset
(
$result
[
'next_openid'
]);
}
}
}
return
empty
(
$result
[
'next_openid'
])
?
true
:
self
::
syncAllFans
(
$result
[
'next_openid'
]);
}
/**
* 同步获取黑名单信息
* @param string $next_openid
* @return bool
*/
public
static
function
syncBlackFans
(
$next_openid
=
''
)
{
$wechat
=
load_wechat
(
'User'
);
$result
=
$wechat
->
getBacklist
(
$next_openid
);
if
(
$result
===
false
||
empty
(
$result
[
'data'
][
'openid'
]))
{
if
(
empty
(
$result
[
'total'
]))
{
return
true
;
}
Log
::
error
(
"获取粉丝黑名单列表失败,
{
$wechat
->
errMsg
}
[
{
$wechat
->
errCode
}
]"
);
return
false
;
}
foreach
(
$result
[
'data'
][
'openid'
]
as
$openid
)
{
if
(
false
===
(
$user
=
$wechat
->
getUserInfo
(
$openid
)))
{
Log
::
error
(
"获取用户[
{
$openid
}
]信息失败,
$wechat->errMsg
"
);
return
false
;
}
$user
[
'is_back'
]
=
'1'
;
if
(
false
===
self
::
setFansInfo
(
$user
))
{
Log
::
error
(
'更新粉丝信息更新失败!'
);
return
false
;
}
if
(
$result
[
'next_openid'
]
===
$openid
)
{
unset
(
$result
[
'next_openid'
]);
}
}
return
empty
(
$result
[
'next_openid'
])
?
true
:
self
::
syncBlackFans
(
$result
[
'next_openid'
]);
}
}
application/route.php
View file @
b6928345
...
@@ -8,14 +8,34 @@
...
@@ -8,14 +8,34 @@
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
use
think\Route
;
return
[
'__pattern__'
=>
[
'name'
=>
'\w+'
,
],
'[hello]'
=>
[
':id'
=>
[
'index/hello'
,
[
'method'
=>
'get'
],
[
'id'
=>
'\d+'
]],
':name'
=>
[
'index/hello'
,
[
'method'
=>
'post'
]],
],
];
// 注册路由到index模块的News控制器的read操作
/*Route::get(['/', '/:d'], 'index/index');
Route::get(['/well', '/w'], 'index/wellCome');
Route::get('/s', 'index/wellCome');*/
//推荐这种风格 注明控制器
/*IndexController*/
/*Route::rule([
'/' => 'index/index',
'/well' => 'index/wellCome',
'/re' => 'index/read'
], '', 'GET|POST');
// 检测路由规则仅GET请求有效
Route::any('new/:id','News/read',['method'=>'get']);
// 检测路由规则仅GET和POST请求有效
Route::any('new/:id','News/read',['method'=>'get|post']);
Route::get('/he/:id', 'index/hello');
/*StoreController
Route::rule([
'/saveStore' => 'store/save'
], '', 'GET');
/*Error
Route::rule(['/city/:name' => 'error/index'] , '' ,'GET');*/
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment