<?php<qimengkeji@vip.qq.com>
function diffArrayValue($arr1 = [], $arr2 = [])
{
$difArr1 = array_diff_key($arr1, $arr2);
$difArr2 = array_intersect_key($arr1, $arr2);
$merge = array_merge($difArr1, $difArr2);
foreach ($merge as $key => $value) {
foreach ($arr2 as $key2 => $value2) {
if ($key == $key2) {
$merge[$key] = $value2;
}
}
}
return $merge;
}
function isLogin()
{
if (!session('admin_id')) {
Header("HTTP/1.1 303 See Other");
$url = getHostDomain() . url('admin/Login/index');
Header("Location: $url");
exit;
}
}
function getWechatObj($options = [], $mid = '')
{
if ($mid) {
$mpInfo = getMpInfo($mid);
$options = array(
'appid' => $mpInfo['appid'],
'appsecret' => $mpInfo['appsecret'],
'token' => $mpInfo['valid_token'],
'encodingaeskey' => $mpInfo['encodingaeskey']
);
}
include_once EXTEND_PATH . "wechatSdk/wechat.class.php";
empty($options) ? $options = session('mp_options') : $options = $options;
$weObj = new \Wechat($options);
$weObj->valid();
$weObj->getRev();
return $weObj;
}
function getWechatActiveObj($mid = '')
{
if ($mid == '') {
if (empty(session('mp_options'))) {
exit('公众号标识mid不存在');
}
}
if ($mid) {
$mpInfo = getMpInfo($mid);
$options = array(
'appid' => $mpInfo['appid'],
'appsecret' => $mpInfo['appsecret'],
'token' => $mpInfo['valid_token'],
'encodingaeskey' => $mpInfo['encodingaeskey']
);
}
include_once EXTEND_PATH . "wechatSdk/wechat.class.php";
empty($options) ? $options = session('mp_options') : $options = $options;
$weObj = new \Wechat($options);
return $weObj;
}
function uploadMedia($filePath = '', $type = '')
{
$weObj = getWechatActiveObj();
$media = $weObj->uploadMedia(['media' => '@' . ROOT_PATH . $filePath], $type);
if (empty($media)) {
if ($msg = wxApiResultErrorCode($weObj->errCode)) {
ajaxMsg(0, $msg);
} else {
ajaxMsg(0, 'errCode:' . $weObj->errCode . 'errMsg' . $weObj->errMsg);
}
}
return $media;
}
function uploadForeverMedia($filePath = '', $type, $is_video = false, $video_info = array())
{
$weObj = getWechatActiveObj();
$media = $weObj->uploadForeverMedia(['media' => '@' . ROOT_PATH . $filePath], $type, $is_video, $video_info);
if (empty($media)) {
if ($msg = wxApiResultErrorCode($weObj->errCode)) {
ajaxMsg(0, $msg);
} else {
ajaxMsg(0, 'errCode:' . $weObj->errCode . 'errMsg' . $weObj->errMsg);
}
}
return $media;
}
function replyText($text = null)
{
if (is_string($text)) {
$weObj = getWechatObj();
return $weObj->text($text)->reply();
}
}
function replyImage($media_id = '')
{
$weObj = getWechatObj();
return $weObj->image($media_id)->reply();
}
function replyMusic($title, $desc, $musicurl, $hgmusicurl = '', $thumbmediaid = '')
{
$weObj = getWechatObj();
return $weObj->music($title, $desc, $musicurl, $hgmusicurl = '', $thumbmediaid = '')->reply();
}
function replyVoice($media_id = '')
{
$weObj = getWechatObj();
return $weObj->voice($media_id)->reply();
}
function replyVideo($mediaid = '', $title = '', $description = '')
{
$weObj = getWechatObj();
return $weObj->video($mediaid, $title, $description)->reply();
}
function replyNews($new = [])
{
if (is_array($new)) {
$weObj = getWechatObj();
return $weObj->news($new)->reply();
}
}
function loadAdApi($name = null, $msg = [], $param = [])
{
$model = new \app\common\model\Addons();
$_addon = $model->where('addon', '=', $name)->cache('callAddonCache' . $name)->field('id,status')->find();
if (empty($_addon)) replyText(' No such application exists');
if ($_addon['status'] != 1) replyText('Application has been withdrawn or not installed');
session('apiParam', $param);
$filename = ADDON_PATH . $name . '/controller/Api.php';
$commonFile = ADDON_PATH . $name . '/Common.php';
if (file_exists($commonFile)) {
include_once $commonFile;
}
session('addonName', $name);
if (file_exists($filename)) {
include_once $filename;
$class = '\addons\\' . $name . '\controller\Api';
if (class_exists($class)) {
$apiObj = new $class;
if (!method_exists($apiObj, 'message')) {
replyText('Error:' . $filename . 'Controller Method message() Not Exists');
} else {
$apiObj->message($msg, $param);
}
} else {
replyText('Error:' . $filename . 'Controller Class Method Not Exists');
}
} else {
replyText('Error:' . $filename . 'Controller Class Method Not Exists');
}
}
function sendGroupMassMessage($data)
{
$weObj = getWechatActiveObj();
$result = $weObj->sendGroupMassMessage($data);
if ($result) {
return $result;
} else {
$return['errCode'] = $weObj->errCode;
$return['errMsg'] = $weObj->errMsg;
return $return;
}
}
function get_qrcode($scene_id, $type = 0, $expire = 604800)
{
$weObj = getWechatActiveObj();
$result = $weObj->getQRCode($scene_id, $type, $expire);
if (!$result) {
$return['errcode'] = 1001;
$return['errmsg'] = $weObj->errMsg;
if ($msg = wxApiResultErrorCode($return['errcode'])) {
ajaxMsg(0, $msg);
}
ajaxMsg(0, 'ErrCode: ' . $return['errcode'] . ' ErrMsg: ' . $return['errmsg']);
}
return $result;
}
function getQrRUL($ticket)
{
$weObj = getWechatActiveObj();
$result = $weObj->getQRUrl($ticket);
return $result;
}
function getQrshortUrl($long_url)
{
$weObj = getWechatActiveObj();
return $weObj->getShortUrl($long_url);
}
function getMpInfo($mid = '', $type = 'mp', $expier = 1800)
{
if (empty(input('_mid')) || $type == 'mp') {
$mid ? $mid : $mid = input('mid');
$mpInfo = 'mpInfo_' . $mid;
if ($mid) {
$mpinfoCahe = \think\facade\Cache::get($mpInfo);
if (empty($mpinfoCahe)) {
$mp = \think\Db::name('mp')->where('id', '=', $mid)->find();
if (!empty($mp)) {
\think\facade\Cache::set($mpInfo, $mp, $expier);
return $mp;
} else {
abort(500, lang('没有找到相应的公众号信息'));
}
} else {
return $mpinfoCahe;
}
} else {
abort(500, lang('没有找到相应的公众号信息'));
}
} else getMimiappInfo($mid, $expier);
}
}
function getMpMenu()
{
$weObj = getWechatActiveObj();
return $weObj->getMenu();
}
function deleteMpMenu()
{
$weObj = getWechatActiveObj();
return $weObj->deleteMenu();
}
function createMpMenu($data = [])
{
$weObj = getWechatActiveObj();
if ($weObj->createMenu($data)) {
return true;
} else {
return $weObj;
}
}
function getMpType($type = '')
{
switch ($type) {
case '1':
return '普通订阅号';
break;
case '2':
return '认证订阅号';
break;
case '3':
return '普通服务号';
break;
case '4':
return '认证服务号(媒体、政府)';
break;
}
}
function getAddonInfo($addonName = '', $mid = '')
{
if ($addonName == '' || $mid == '') {
$addonName = session('addonName');
$mid = session('mid') ? session('mid') : input('mid');
}
if ($addonName == '' || $mid == '') {
exit('参数不完整:应用名称或者公众号标识不存在');
}
$addon = \think\Db::name('addons')->where(['addon' => $addonName])->find();
$addonInfo = \think\Db::name('addon_info')->where(['addon' => $addonName, 'mpid' => $mid])->find();
$addon['path'] = ADDON_PATH . $addonName . '/';
$addon['mp_config'] = isset($addonInfo['infos']) ? json_decode($addonInfo['infos'], true) : [];
$addon['common_config'] = isset($addon['config']) ? json_decode($addon['config'], true) : [];
unset($addon['config']);
return $addon;
}
function getAddonLogo($name = '', $type = 'mp')
{
if ($name == '') {
return false;
}
if ($type == 'mp') {
$model = new \app\common\model\Addons();
$info = $model->getAddonByFile($name);
$loginFile = ROOT_PATH . '/addons/' . $name . '/' . $info['logo'];
if (is_file($loginFile)) { return getHostDomain() . '/addons/' . $name . '/' . $info['logo'];
}
} elseif ($type == 'miniapp') {
$model = new \app\common\model\MiniappAddon();
$info = $model->getAddonByFile($name);
$loginFile = MINIAPP_PATH . $name . '/' . $info['logo'];
if (is_file($loginFile)) {
return getHostDomain() . '/miniapp/' . $name . '/' . $info['logo'];
}
}
}
function pr($data)
{
echo '<pre>';
print_r($data);
echo '</pre>';
}
function getAddonConfigByFile($name = '', $key = '')
{
if ($name == '') {
return false;
}
$model = new \app\common\model\Addons();
$info = $model->getAddonByFile($name);
if (isset($info[$key])) {
return $info[$key];
} else {
return false;
}
}
function getAdmin()
{
if (empty(session('admin')) && empty(cookie('admin'))) {
return false;
} else {
$arr1 = session('admin') ? session('admin') : [];
$arr2 = cookie('admin') ? cookie('admin') : [];
return $_admin = array_merge($arr1, $arr2);
}
}
function addonUrl($url = '', $vars = '', $suffix = true, $domain = false)
{
if (!empty($addonRule = session('addonRule')) || $url != '') {
$addonName = isset($addonRule['addon']) ? $addonRule['addon'] : '';
$addonController = isset($addonRule['col']) ? $addonRule['col'] : '';
$addonAction = isset($addonRule['act']) ? $addonRule['act'] : '';
$node = '';
if ($url == '') {
$node = $addonName . '/' . $addonController . '/' . $addonAction;
} else {
$nodeArr = array_values(array_filter(explode('/', $url)));
switch (count($nodeArr)) {
case 1:
$node = $addonName . '/' . $addonController . '/' . $nodeArr[0];
break;
case 2:
$node = $addonName . '/' . $nodeArr[0] . '/' . $nodeArr[1];
break;
case 3:
$node = $node = $nodeArr[0] . '/' . $nodeArr[1] . '/' . $nodeArr[2];
break;
}
}
if (!empty($_mid = input('_mid')) || isset($vars['_mid'])) {
if ($_mid) {
$_mid = $_mid;
} elseif (isset($vars['_mid'])) {
$_mid = $vars['_mid'];
}
$url = \think\facade\Url::build('/api/' . $_mid . '/' . $node, $vars, $suffix, $domain);
return $url = str_replace('.' . config('template.view_suffix'), '', $url);
} else {
if (!empty($mid = input('mid'))) {
if (is_array($vars)) {
$vars = array_merge($vars, ['mid' => $mid]);
} elseif ($vars != '' && !is_array($vars)) {
$vars = $vars . '&' . 'mid=' . $mid;
} else {
$vars = ['mid' => $mid];
}
$url = \think\facade\Url::build(ADDON_ROUTE . $node, $vars, $suffix, $domain);
return $url = str_replace('.' . config('template.view_suffix'), '', $url);
}
}
}
}
function hook($name = '', $params = [])
{
think\facade\Hook::listen($name, $params);
}
function getOrSetOpenid($openid = '')
{
if ($openid != '') {
session('openid', $openid);
return $openid;
} else {
$openid = session('openid');
if ($openid) {
return $openid;
} else {
return null;
}
}
}
function getMemberInfo($openid = '', $field = [])
{
if ($openid = getOrSetOpenid($openid)) {
$user = \think\Db::name('mp_friends')->where(['openid' => $openid])->find();
if (!$field) {
return $user;
} else {
$fields = [];
foreach ($field as $key => $val) {
$fields[$val] = $user[$val];
}
return $fields;
}
}
}
function getFriendInfoForApi($openid = '')
{
$openid || $openid = session('openid');
$Obj = getWechatObj();
return $Obj->getUserInfo($openid);
}
function getHostDomain()
{
return \think\facade\Request::domain();
}
function getForeverMaterial($type, $offset, $count)
{
$weObj = getWechatActiveObj();
return $weObj->getForeverList($type, $offset, $count);
}
function getRandChar($length)
{
$str = null;
$strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
$max = strlen($strPol) - 1;
for ($i = 0; $i < $length; $i++) {
$str .= $strPol[rand(0, $max)] }
return $str;
}
function array_key_case(&$array, $case = CASE_LOWER)
{
$array = array_change_key_case($array, $case);
foreach ($array as $key => $value) {
if (is_array($value)) {
array_key_case($array[$key], $case);
}
}
}
function formatTime($the_time)
{
$now_time = time();
$dur = $now_time - $the_time;
if ($dur < 0) {
return $the_time;
} else {
if ($dur < 60) {
return $dur . '秒前';
} else {
if ($dur < 3600) {
return floor($dur / 60) . '分钟前';
} else {
if ($dur < 86400) {
return floor($dur / 3600) . '小时前';
} else $day = strtotime(date('Y-m-d', time()));
$pday = strtotime(date('Y-m-d', strtotime('-1 day')));
if ($the_time > $pday && $the_time < $day) return $t = '昨天 ' . date('H:i', $the_time);
} else {
if ($dur < 172800) {
return floor($dur / 86400) . '天前';
} else {
return date('Y-m-d H:i', $the_time);
}
}
}
}
}
}
}
function isMobileNumber($mobile)
{
if (!is_numeric($mobile)) {
return false;
}
return preg_match('#^13[\d]{9}$|^14[5,7]{1}\d{8}$|^15[^4]{1}\d{8}$|^17[0,6,7,8]{1}\d{8}$|^18[\d]{9}$#', $mobile) ? true : false;
}
function validateEmail($email)
{
$isValid = true;
$atIndex = strrpos($email, "@");
if (is_bool($atIndex) && !$atIndex) {
$isValid = false;
} else {
$domain = substr($email, $atIndex + 1);
$local = substr($email, 0, $atIndex);
$localLen = strlen($local);
$domainLen = strlen($domain);
if ($localLen < 1 || $localLen > 64) {
$isValid = false;
} else if ($domainLen < 1 || $domainLen > 255) {
$isValid = false;
} else if ($local[0] == '.' || $local[$localLen - 1] == '.') {
$isValid = false;
} else if (preg_match('/\\.\\./', $local)) {
$isValid = false;
} else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)) {
$isValid = false;
} else if (preg_match('/\\.\\./', $domain)) {
$isValid = false;
} else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\", "", $local))) {
if (!preg_match('/^"(\\\\"|[^"])+"$/', str_replace("\\\\", "", $local))) {
$isValid = false;
}
}
if ($isValid && !(checkdnsrr($domain, "MX") || checkdnsrr($domain, "A"))) {
$isValid = false;
}
}
return $isValid;
}
function strExplode($str)
{
$str = preg_replace("/(\n)|(\s)|(\t)|(\')|(')|(,)/", ',', $str);
return explode(',', $str);
}
function getDistance($lat1, $lon1, $lat2, $lon2, $radius = 6378.137{
$rad = floatval(M_PI / 180.0);
$lat1 = floatval($lat1) * $rad;
$lon1 = floatval($lon1) * $rad;
$lat2 = floatval($lat2) * $rad;
$lon2 = floatval($lon2) * $rad;
$theta = $lon2 - $lon1;
$dist = acos(sin($lat1) * sin($lat2) +
cos($lat1) * cos($lat2) * cos($theta)
);
if ($dist < 0) {
$dist += M_PI;
}
$dist = $dist * $radius;
$dist = round($dist);
if ($dist == '0') {
return '1km';
} else {
return $dist . 'km';
}
}
function randomFloat($min = 0, $max = 10)
{
$num = $min + mt_rand() / mt_getrandmax() * ($max - $min);
return sprintf("%.2f", $num);
}
function httpGet($url)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_URL, $url);
$res = curl_exec($curl);
curl_close($curl);
return $res;
}
function httpPost($url, $data, $curlFile = false)
{
if ($curlFile == true) {
$data = json_decode($data, true);
if (is_array($data)) {
foreach ($data as &$value) {
if (is_string($value) && $value[0] === '@' && class_exists('CURLFile', false)) {
$filename = realpath(trim($value, '@'));
file_exists($filename) && $value = new CURLFile($filename);
}
}
}
}
$cl = curl_init();
curl_setopt($cl, CURLOPT_URL, $url);
curl_setopt($cl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($cl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($cl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($cl, CURLOPT_HEADER, false);
curl_setopt($cl, CURLOPT_POST, true);
curl_setopt($cl, CURLOPT_TIMEOUT, 60);
curl_setopt($cl, CURLOPT_POSTFIELDS, http_build_query($data));
list($content, $status) = array(curl_exec($cl), curl_getinfo($cl), curl_close($cl));
return (intval($status["http_code"]) === 200) ? $content : false;
}
function encrypt($string, $operation, $key = '')
{
$key = md5($key);
$key_length = strlen($key);
$string = $operation == 'D' ? base64_decode($string) : substr(md5($string . $key), 0, 8) . $string;
$string_length = strlen($string);
$rndkey = $box = array();
$result = '';
for ($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($key[$i % $key_length]);
$box[$i] = $i;
}
for ($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
for ($a = $j = $i = 0; $i < $string_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
if ($operation == 'D') {
if (substr($result, 0, 8) == substr(md5(substr($result, 8) . $key), 0, 8)) {
return substr($result, 8);
} else {
return '';
}
} else {
return str_replace('=', '', base64_encode($result));
}
}
function ajaxReturn($data = [], $status = 1, $msg = '')
{
header('Content-Type:application/json; charset=utf-8');
$data = $data;
$data['status'] = $status;
if ($msg != '') {
$data['msg'] = $msg;
}
exit(json_encode($data));
}
function ajaxMsg($status = 1, $msg = '')
{
header('Content-Type:application/json; charset=utf-8');
$data['status'] = $status;
$data['msg'] = $msg;
exit(json_encode($data));
}
function object_array($array)
{
if (is_object($array)) {
$array = (array)$array;
}
if (is_array($array)) {
foreach ($array as $key => $value) {
$array[$key] = object_array($value);
}
}
return $array;
}
function jsonToArray($json)
{
if ($json) {
return $arr = object_array(json_decode($json));
}
}
/**
* 将list_to_tree的树还原成列表
* @param array $tree 原来的树
* @param string $child 孩子节点的键
* @param string $order 排序显示的键,一般是主键 升序排列
* @param array $list 过渡用的中间数组,
* @return array 返回排过序的列表数组
* @author yangweijie <yangweijiester@gmail.com>
*/
function tree_to_list($tree, $child = 'child', $order = 'id', &$list = array())
{
if (is_array($tree)) {
$refer = array();
foreach ($tree as $key => $value) {
$reffer = $value;
if (isset($reffer[$child])) {
if ($reffer[$child] == null) {
} else {
unset($reffer[$child]);
tree_to_list($value[$child], $child, $order, $list);
}
}
$list[] = $reffer;
}
$list = list_sort_by($list, $order, $sortby = 'asc');
}
return $list;
}
function list_sort_by($list, $field, $sortby = 'asc')
{
if (is_array($list)) {
$refer = $resultSet = array();
foreach ($list as $i => $data)
$refer[$i] = &$data[$field];
switch ($sortby) {
case 'asc': asort($refer);
break;
case 'desc':// 逆向排序
arsort($refer);
break;
case 'nat': natcasesort($refer);
break;
}
foreach ($refer as $key => $val)
$resultSet[] = &$list[$key];
return $resultSet;
}
return false;
}
function xml_to_array($xml)
{
$reg = "/<(\\w+)[^>]*?>([\\x00-\\xFF]*?)<\\/\\1>/";
if (preg_match_all($reg, $xml, $matches)) {
$count = count($matches[0]);
$arr = array();
for ($i = 0; $i < $count; $i++) {
$key = $matches[1][$i];
$val = xml_to_array($matches[2][$i]); if (array_key_exists($key, $arr)) {
if (is_array($arr[$key])) {
if (!array_key_exists(0, $arr[$key])) {
$arr[$key] = array($arr[$key]);
}
} else {
$arr[$key] = array($arr[$key]);
}
$arr[$key][] = $val;
} else {
$arr[$key] = $val;
}
}
return $arr;
} else {
return $xml;
}
}
function array_to_xml($array)
{
if (!is_array($array)) {
throw new \think\Exception("参数不是数组!");
}
$xml = "<xml>";
foreach ($array as $key => $val) {
if (is_numeric($val)) {
$xml .= "<" . $key . ">" . $val . "</" . $key . ">";
} else {
$xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
}
}
$xml .= "</xml>";
return $xml;
}
function list_search($list, $condition)
{
if (is_string($condition))
parse_str($condition, $condition);
$resultSet = array();
foreach ($list as $key => $data) {
$find = false;
foreach ($condition as $field => $value) {
if (isset($data[$field])) {
if (0 === strpos($value, '/')) {
$find = preg_match($value, $data[$field]);
} elseif ($data[$field] == $value) {
$find = true;
}
}
}
if ($find)
$resultSet[] = &$list[$key];
}
return $resultSet;
}
function GetRreeByMpMenu($list, $id = 'id', $pid = 'pid', $son = 'sub')
{
$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;
}
class Tree
{
private static $primary = 'id';
private static $parentId = 'pid';
private static $child = 'child';
public static function makeTree(&$data, $index = 0)
{
$childs = self::findChild($data, $index);
if (empty($childs)) {
return $childs;
}
foreach ($childs as $k => &$v) {
if (empty($data)) break;
$child = self::makeTree($data, $v[self::$primary]);
if (!empty($child)) {
$v[self::$child] = $child;
}
}
unset($v);
return $childs;
}
public static function findChild(&$data, $index)
{
$childs = [];
foreach ($data as $k => $v) {
if ($v[self::$parentId] == $index) {
$childs[] = $v;
unset($v);
}
}
return $childs;
}
public static function getTreeNoFindChild($data)
{
$map = [];
$tree = [];
foreach ($data as &$it) {
$map[$it[self::$primary]] = &$it;
}
foreach ($data as $key => &$it) {
$parent = &$map[$it[self::$parentId]];
if ($parent) {
$parent['child'][] = &$it;
} else {
$tree[] = &$it;
}
}
return $tree;
}
public static function getParents($data, $catId)
{
$tree = array();
foreach ($data as $item) {
if ($item[self::$primary] == $catId) {
if ($item[self::$parentId] > 0)
$tree = array_merge($tree, self::getParents($data, $item[self::$parentId]));
$tree[] = $item;
break;
}
}
return $tree;
}
}
function moreArrayUnique($arr = array())
{
foreach ($arr[0] as $k => $v) {
$arr_inner_key[] = $k; }
foreach ($arr as $k => $v) {
$v = join(",", $v); $temp[$k] = $v; }
$temp = array_unique($temp); foreach ($temp as $k => $v) {
$a = explode(",", $v); $arr_after[$k] = array_combine($arr_inner_key, $a); }
return $arr_after;
}
function isMobile()
{
if (isset ($_SERVER['HTTP_X_WAP_PROFILE']))
return true;
if (isset ($_SERVER['HTTP_CLIENT']) && 'PhoneClient' == $_SERVER['HTTP_CLIENT'])
return true;
if (isset ($_SERVER['HTTP_VIA']))
return stristr($_SERVER['HTTP_VIA'], 'wap') ? true : false;
if (isset ($_SERVER['HTTP_USER_AGENT'])) {
$clientkeywords = array(
'nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp', 'sie-', 'philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod', 'blackberry', 'meizu', 'android', 'netfront', 'symbian', 'ucweb', 'windowsce', 'palm', 'operamini', 'operamobi', 'openwave', 'nexusone', 'cldc', 'midp', 'wap', 'mobile'
);
if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
return true;
}
}
if (isset ($_SERVER['HTTP_ACCEPT'])) {
if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
return true;
}
}
return false;
}
function my_nohtml_mbsubstr($str, $start = 0, $end = 50, $coded = 'utf-8')
{
$str = strip_tags($str);
$bf = array(" ", " ", "\t", "\n", "\r");
$lb = array("", "", "", "", "");
$str = str_replace($bf, $lb, $str);
return $str = mb_substr($str, $start, $end, $coded);
}
function _trim($str)
{
$arr1 = array(" ", " ",);
$arr2 = array("", "",);
return str_replace($arr1, $arr2, $str);
}
function executeSql($sqlPath)
{
$sql = file_get_contents($sqlPath);
$sql = str_replace("\r", "\n", $sql);
$sql = explode(";\n", $sql);
$orginal = 'rh_';
$prefix = \think\facade\Config::get('database.prefix');
$sql = str_replace("{$orginal}", "{$prefix}", $sql);
$model = new \app\common\model\Addons();
foreach ($sql as $value) {
$value = trim($value);
if (!empty($value)) {
if (substr($value, 0, 12) == 'CREATE TABLE') {
$name = '';
preg_match('|EXISTS `(.*?)`|', $value, $outValue1);
preg_match('|TABLE `(.*?)`|', $value, $outValue2);
if (isset($outValue1[1]) && !empty($outValue1[1])) {
$name = $outValue1[1];
}
if (isset($outValue2[1]) && !empty($outValue2[1])) {
$name = $outValue2[1];
}
if (!$name) {
ajaxMsg('0', $name . ' SQL语句有误,获取不到表名');
}
$res = $model->query("SHOW TABLES LIKE '{$name}'");
if ($res) {
ajaxMsg('0', $name . '表,已经存在');
}
}
}
}
foreach ($sql as $value) {
$value = trim($value);
if (empty($value)) {
continue;
}
$res = $model->execute($value);
}
}
function get_server_ip()
{
if (isset($_SERVER['SERVER_NAME'])) {
return gethostbyname($_SERVER['SERVER_NAME']);
} else {
if (isset($_SERVER)) {
if (isset($_SERVER['SERVER_ADDR'])) {
$server_ip = $_SERVER['SERVER_ADDR'];
} elseif (isset($_SERVER['LOCAL_ADDR'])) {
$server_ip = $_SERVER['LOCAL_ADDR'];
}
} else {
$server_ip = getenv('SERVER_ADDR');
}
return $server_ip ? $server_ip : '获取不到服务器IP';
}
}
function createQrcode($data = '', $file = false, $level = 'L', $size = 4)
{
include_once EXTEND_PATH . 'phpqrcode/phpqrcode.php';
header("Content-type: image/png");
Qrcode::png($data, $file, $level, $size);
}
function rand_string($len = 6, $type = '', $addChars = '')
{
$str = '';
switch ($type) {
case 0:
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' . $addChars;
break;
case 1:
$chars = str_repeat('0123456789', 3);
break;
case 2:
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' . $addChars;
break;
case 3:
$chars = 'abcdefghijklmnopqrstuvwxyz' . $addChars;
break;
case 4:
$chars = "们以我到他会作时要动国产的一是工就年阶义发成部民可出能方进在了不和有大这主中人上为来分生对于学下级地个用同行面说种过命度革而多子后自社加小机也经力线本电高量长党得实家定深法表着水理化争现所二起政三好十战无农使性前等反体合斗路图把结第里正新开论之物从当两些还天资事队批点育重其思与间内去因件日利相由压员气业代全组数果期导平各基或月毛然如应形想制心样干都向变关问比展那它最及外没看治提五解系林者米群头意只明四道马认次文通但条较克又公孔领军流入接席位情运器并飞原油放立题质指建区验活众很教决特此常石强极土少已根共直团统式转别造切九你取西持总料连任志观调七么山程百报更见必真保热委手改管处己将修支识病象几先老光专什六型具示复安带每东增则完风回南广劳轮科北打积车计给节做务被整联步类集号列温装即毫知轴研单色坚据速防史拉世设达尔场织历花受求传口断况采精金界品判参层止边清至万确究书" . $addChars;
break;
default:
$chars = 'ABCDEFGHIJKMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789' . $addChars;
break;
}
if ($len > 10) {
$chars = $type == 1 ? str_repeat($chars, $len) : str_repeat($chars, 5);
}
if ($type != 4) {
$chars = str_shuffle($chars);
$str = substr($chars, 0, $len);
} else {
for ($i = 0; $i < $len; $i++) {
$str .= msubstr($chars, floor(mt_rand(0, mb_strlen($chars, 'utf-8') - 1)), 1);
}
}
return $str;
}
function getStrings($array = [])
{
$str = ['a', 'b' . 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '/', ':', ',', $string = '';
foreach ($array as $k => $v) {
$string = $str[$v];
}
return $string;
}
function getHttpType()
{
return \think\facade\Request::scheme().'://';
}
function getSetting($mid = 0, $name = '', $cate = '')
{
$where = ['mpid' => $mid, 'name' => $name];
if (!empty($cate)) {
$where['cate'] = $cate;
} else {
$param = input();
if (isset($param['_mid']) && !empty($param['_mid'])) {
$where['cate'] = 'miniapp';
} else {
if (!empty(session('miniapp_options')) && empty(session('mp_options'))) {
$where['cate'] = 'miniapp';
} else {
$where['cate'] = 'mp';
}
}
}
$model = new \app\common\model\Setting();
$result = $model->getSetting($where);
return $result;
}
function getMember($member_id = '')
{
$friendModel = new \app\common\model\MpFriends();
if ($member_id) {
$member = $friendModel->getMemberInfo(['id' => $member_id]);
} else {
if (!$mid = input('mid')) {
exit('公众号标识mid不存在');
}
$member = session('member_' . $mid) ? session('member_' . $mid) : [];
}
if (!empty($member)) {
$group = \think\Db::name('member_group')->where(['mpid' => $member['mpid']])->order('up_score ASC,up_money ASC,discount ASC')->select();
$group_id = '0';
$group_name = '';
if (!empty($group)) {
$score = $member['group_score'];
$money = $member['group_money'];
foreach ($group as $key => $val) {
if ($val['up_type'] == '0') {
if ($score >= $val['up_score'] || $money >= $val['up_money']) {
$group_id = $val['gid'];
$group_name = $val['group_name'];
}
} elseif ($val['up_type'] == '1') {
if ($score >= $val['up_score'] && $money >= $val['up_money']) {
$group_id = $val['gid'];
$group_name = $val['group_name'];
}
}
}
$friendModel->updateMember(['id' => $member['id']], ['group_id' => $group_id]);
}
$member = $friendModel->getMemberInfo(['id' => $member['id']]) if (!empty($member)) {
$group = \think\Db::name('member_group')->where(['gid' => $member['group_id']])->field('gid,group_name,discount')->find();
if (!empty($group)) {
$member['gid'] = $group['gid'];
$member['group_name'] = $group['group_name'];
$member['discount'] = $group['discount'];
} else {
$member['gid'] = '';
$member['group_name'] = '';
$member['discount'] = 0;
}
return json_decode(json_encode($member), true);
} else {
return false;
}
} else {
return false;
}
}
/**
* 微信支付函数
* @param $parment_id 定单id
* @author geeson <314835050@qq.com>
* @param int $money
* @param string $openid
* @param string $mid 必须
* @param string $notifyUrl 通知地址
* @param string $body 商品描述
* @param string $goods_tag 订单优惠标记
* @param string $attach 附加数据
* @param string $trade_type 交易类型
* @return bool|json数据,可直接填入js函数作为参数
*/
function wxPayByJsApi($parment_id = '', $goods_tag = '', $trade_type = 'JSAPI')
{
$model = new \app\common\model\Payment();
if (!$payment = $model->getPaymentByFind(['payment_id' => $parment_id])) {
return ['errCode' => -1, 'errMsg' => '交易单号不存在'];
}
if (setWxpayConfig($payment['mpid'])) {
$tools = new \JsApiPay();
$input = new \WxPayUnifiedOrder();
$input->SetBody($payment['title']);
$input->SetAttach($payment['attach']);
$input->SetOut_trade_no($payment['order_number']);
$input->SetTotal_fee($payment['money'] * 100);
$input->SetTime_start(date("YmdHis")) $input->SetTime_expire(date("YmdHis", time() + 86400)) $input->SetGoods_tag($goods_tag);
$input->SetNotify_url(\wxPayConfig::$NOTIFY_URL);
$input->SetTrade_type($trade_type);
$input->SetOpenid($payment['openid']);
$order = \WxPayApi::unifiedOrder($input);
unClient($payment['mpid']);
if (isset($order['return_code'])) {
if ($order['return_code'] == 'SUCCESS') {
$jsApiParameters = $tools->GetJsApiParameters($order);
if ($jsApiParameters == false) {
return ['errCode' => -1, 'errMsg' => '获取API参数失败'];
} else {
return ['errCode' => 'ok', 'data' => $jsApiParameters];
}
} else {
return ['errCode' => -1, 'errMsg' => $order['return_code'] . $order['return_msg']];
}
}
}
return ['errCode' => -1, 'errMsg' => '没有公众号配置信息'];
}
function wxPayRefund($parment_id, $total_fee = null, $refund_fee = null)
{
$model = new \app\common\model\Payment();
if (!$payment = $model->getPaymentByFind(['payment_id' => $parment_id])) {
return ['errCode' => -1, 'errMsg' => '交易单号不存在'];
}
if (setWxpayConfig($payment['mpid'])) {
$total_fee = $total_fee ? $total_fee : $payment['money'] * 100;
$refund_fee = $refund_fee ? $refund_fee : $payment['money'] * 100;
$input = new \WxPayRefund();
$input->SetOut_trade_no($payment['order_number']);
$input->SetTotal_fee($total_fee);
$input->SetRefund_fee($refund_fee);
$input->SetOut_refund_no($payment['order_number']);
$input->SetOp_user_id(WxPayConfig::$MCHID);
$result = \WxPayApi::refund($input);
return $result;
}
return ['errCode' => -1, 'errMsg' => '没有公众号配置信息'];
}
function WxPayRefundQuery($parment_id)
{
$model = new \app\common\model\Payment();
if (!$payment = $model->getPaymentByFind(['payment_id' => $parment_id])) {
return ['errCode' => -1, 'errMsg' => '交易单号不存在'];
}
if (setWxpayConfig($payment['mpid'])) {
$input = new \WxPayRefundQuery();
$input->SetOut_trade_no($payment['order_number']);
return \WxPayApi::refundQuery($input);
}
return ['errCode' => -1, 'errMsg' => '没有公众号配置信息'];
}
/**
* @author Geeson <314835050#qq.com>
* @param string $order_number 订单号
* @return array errCode ok: 成功 -1:失败
*/
function queryOrder($order_number = '')
{
$paymentModel = new \app\common\model\Payment();
$paymentModel->startTrans();
if (!$payment = $paymentModel->where('order_number', $order_number)->lock(true)->find()) {
$paymentModel->rollback();
return ['errCode' => -1, 'errMsg' => '交易单号不存在'];
}
if (setWxpayConfig($payment['mpid'])) {
$input = new \WxPayOrderQuery();
$input->SetOut_trade_no($order_number);
$orderRes = \WxPayApi::orderQuery($input);
unClient($payment['mpid']);
if (!empty($orderRes)) {
if (isset($orderRes['trade_state']) && $orderRes['trade_state'] == 'SUCCESS') if ($payment['status'] == '0') $C_lk = \think\facade\Cache::get($order_number);
if (empty($C_lk)) {
\think\facade\Cache::set($order_number, '1');
if ($paymentModel->where(['mpid' => $payment['mpid'], 'order_number' => $order_number])->update(['status' => 1])) {
\think\facade\Cache::rm($order_number);
$paymentModel->commit();
return ['errCode' => 'ok', 'errMsg' => '交易完成'];
} else {
\think\facade\Cache::rm($order_number);
$paymentModel->rollback();
}
}
} else {
$paymentModel->rollback();
return ['errCode' => 'ok', 'errMsg' => '交易完成'];
}
} else {
$paymentModel->rollback();
return ['errCode' => -1, 'errMsg' => '未完成交易'];
}
} else {
$paymentModel->rollback();
return ['errCode' => -1, 'errMsg' => '交易单号不存在'];
}
}
$paymentModel->rollback();
return ['errCode' => -1, 'errMsg' => '没有公众号配置信息'];
}
function wxpayNotify()
{
if ($xml = file_get_contents('php://input')) {
$xml_parser = xml_parser_create();
if (!xml_parse($xml_parser, $xml, true)) {
xml_parser_free($xml_parser);
return false;
} else {
$array = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
if (isset($array['out_trade_no'])
&& isset($array['openid'])
&& isset($array['mch_id'])
) {
$paymentModel = new \app\common\model\Payment();
if (!$payment = $paymentModel->getPaymentByFind(['order_number' => $array['out_trade_no']])) {
$data = ['return_code' => 'FAIL', 'return_msg' => '定单号不存在'];
} else {
try {
setWxpayConfig($payment['mpid']);
\WxPayResults::Init($xml);
$result = queryOrder($array['out_trade_no']);
if ($result['errCode'] == 'ok') {
if ($payment['callback'] && $payment['callback_status'] == 0) {
$param = json_decode(json_encode($payment), true);
$param['notify_data'] = $array;
if ($callbackResult = httpPost(\think\facade\Request::domain() . $payment['callback'], $param)) {
$CBarray = json_decode($callbackResult, true);
if (!isset($CBarray['errCode']) || $CBarray['errCode'] != 0) {
return false;
}
} else {
return false;
}
}
\app\common\model\Payment::setCallbackStatus($payment['payment_id']);
$data = ['return_code' => 'SUCCESS', 'return_msg' => 'OK'];
} else {
$data = ['return_code' => 'FAIL', 'return_msg' => $result['errMsg']];
}
} catch (\Exception $exception) {
$data = ['return_code' => 'FAIL', 'return_msg' => $exception->getMessage()];
}
}
echo array_to_xml($data);
}
}
}
}
function unClient($mid = '')
{
try {
$sslcert = ROOT_PATH . 'data/' . $mid . '_' . '_apiclient_cert.pem';
$sslkey = ROOT_PATH . 'data/' . $mid . '_' . '_apiclient_key.pem';
@unlink($sslcert);
@unlink($sslkey);
} catch (\ErrorException $exception) {
}
}
function sendRedpack($mid = '', $param = [], $addon = '')
{
if (setWxpayConfig($mid)) {
$url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
$order_number = time() . rand_string(18, 1);
$redpackObj = new Redpack();
$redpackObj->setParments("re_openid", isset($param['openid']) ? $param['openid'] : '') $redpackObj->setParments("mch_billno", $order_number) $redpackObj->setParments("nick_name", isset($param['nick_name']) ? $param['nick_name'] : '') $redpackObj->setParments("send_name", isset($param['send_name']) ? $param['send_name'] : '') $redpackObj->setParments("total_amount", isset($param['money']) ? $param['money'] * 100 : '') $redpackObj->setParments("min_value", isset($param['min_value']) ? $param['min_value'] : '100') $redpackObj->setParments("max_value", isset($param['max_value']) ? $param['max_value'] : '100') $redpackObj->setParments("total_num", isset($param['total_num']) ? $param['total_num'] : '1') $redpackObj->setParments("wishing", isset($param['wishing']) ? $param['wishing'] : '恭喜发财') $redpackObj->setParments("client_ip", \think\facade\Request::ip()) $redpackObj->setParments("act_name", isset($param['act_name']) ? $param['act_name'] : '红包活动') $redpackObj->setParments("remark", isset($param['remark']) ? $param['remark'] : '红包活动') $redpackObj->setParments("nonce_str", getRandChar(32)) $xml = $redpackObj->createRedpackXml();
$result = $redpackObj->xmlToArray($redpackObj->postXmlCurl($xml, $url, true));
$sslcert = ROOT_PATH . 'data/' . $mid . '_' . '_apiclient_cert.pem';
$sslkey = ROOT_PATH . 'data/' . $mid . '_' . '_apiclient_key.pem';
if (isset($result['result_code']) && $result['result_code'] == 'SUCCESS') {
unlink($sslcert);
unlink($sslkey);
$model = new \app\common\model\Redpack();
$param['order_number'] = $order_number;
$param['mpid'] = $mid;
$param['create_time'] = time();
$param['addon'] = $addon;
$model->allowField(true)->save($param);
$param['errCode'] = 0;
$param['errMsg'] = '发放成功';
return $param;
} else {
unlink($sslcert);
unlink($sslkey);
if ($msg = wxApiResultErrorCode($result['result_code'])) {
return ['errCode' => -1, 'errMsg' => $msg];
}
return ['errCode' => -1, 'errMsg' => 'errMsg:' . $result['result_code'] . ':' . $result['return_msg']];
}
} else {
return ['errCode' => -1, 'errMsg' => 'errMsg:该公众号还没有配置支付相关的参数'];
}
}
function setWxpayConfig($mid)
{
if (!empty($config = getSetting($mid, 'wxpay'))) {
include_once EXTEND_PATH . 'wxpayAPI/wxPayApi.php';
\WxPayConfig::$APPID = $config['appid'];
\WxPayConfig::$APPSECRET = $config['appsecret'];
\WxPayConfig::$MCHID = $config['mchid'];
\WxPayConfig::$KEY = $config['paysignkey'];
\wxPayConfig::$NOTIFY_URL = getHostDomain() . '/index.php';
$sslcert = ROOT_PATH . 'data/' . $mid . '_' . '_apiclient_cert.pem';
$sslkey = ROOT_PATH . 'data/' . $mid . '_' . '_apiclient_key.pem';
file_put_contents($sslcert, isset($config['apiclient_cert']) ? $config['apiclient_cert'] : '');
file_put_contents($sslkey, isset($config['apiclient_key']) ? $config['apiclient_key'] : '');
\WxPayConfig::$SSLCERT_PATH = $sslcert;
\WxPayConfig::$SSLKEY_PATH = $sslkey;
return true;
} else {
return false;
}
}
function url($url = '', $vars = '', $suffix = true, $domain = false)
{
if (!empty($mid = input('mid'))) {
if (is_array($vars)) {
if (isset($vars['mid'])) {
$mid = $vars['mid'];
}
$vars = array_merge($vars, ['mid' => $mid]);
} elseif ($vars != '' && !is_array($vars)) {
$vars = $vars . '&' . 'mid=' . $mid;
} else {
$vars = ['mid' => $mid];
}
}
return \think\facade\Url::build($url, $vars, $suffix, $domain);
}
function singleSmsByTx($mid = '', $phoneNumber = '', $msg = '', $type = '0', $nationCode = '86', $extend = "", $ext = "")
{
include_once EXTEND_PATH . 'Qcloud/Sms/Loader.php';
if (!$conf = getSetting($mid, 'sms')) {
return false }
$appid = isset($conf['txsms']['appid']) ? $conf['txsms']['appid'] : '';
$appkey = isset($conf['txsms']['appsecret']) ? $conf['txsms']['appsecret'] : '';
$singleSender = new \Qcloud\Sms\SmsSingleSender($appid, $appkey);
$result = $singleSender->send($type, $nationCode, $phoneNumber, $msg, "", "");
$rsp = json_decode($result, true);
return $rsp;
}
function singleSmsByAli($mid, $PhoneNumbers, $SignName, $TemplateCode, $TemplateParam = [], $OutId = '', $SmsUpExtendCode = '')
{
include_once EXTEND_PATH . 'aliyunSms/SignatureHelper.php';
if (!$conf = getSetting($mid, 'sms')) {
return false }
$accessKeyId = isset($conf['alisms']['appid']) ? $conf['alisms']['appid'] : '';
$accessKeySecret = isset($conf['alisms']['appsecret']) ? $conf['alisms']['appsecret'] : '';
$helper = new \Aliyun\DySDKLite\SignatureHelper();
$params = array();
$params["PhoneNumbers"] = $PhoneNumbers;
$params["SignName"] = $SignName;
$params["TemplateCode"] = $TemplateCode;
$params['TemplateParam'] = $TemplateParam;
$params['OutId'] = $OutId;
$params['SmsUpExtendCode'] = $SmsUpExtendCode;
if (!empty($params["TemplateParam"]) && is_array($params["TemplateParam"])) {
$params["TemplateParam"] = json_encode($params["TemplateParam"], JSON_UNESCAPED_UNICODE);
}
$content = $helper->request(
$accessKeyId,
$accessKeySecret,
"dysmsapi.aliyuncs.com",
array_merge($params, array(
"RegionId" => "cn-hangzhou",
"Action" => "SendSms",
"Version" => "2017-05-25",
))
);
$result = $helper->getErrCode($content->Code);
if ($result == false) {
return false;
} else {
return $result;
}
}
function qiniuUpload($mid = '', $file = '', $key = '')
{
if (!$mid) {
return ['code' => 1, 'msg' => '公众号标识mid不能为空'];
} else {
$st = getSetting($mid, 'cloud');
if (!isset($st['qiniu']) && empty($st['qiniu'])) {
return ['code' => 1, 'msg' => '请先配置七牛云存储参数'];
} else {
include_once EXTEND_PATH . 'Qiniu/autoload.php';
$client = Qiniu\Qiniu::create(array(
'access_key' => $st['qiniu']['accessKey'],
'secret_key' => $st['qiniu']['secretKey'],
'bucket' => $st['qiniu']['bucke'],
'domain' => $st['qiniu']['domain']
));
$result = $client->uploadFile($file, $key);
$result = json_decode(json_encode($result), true);
if (isset($result['response']['code']) && $result['response']['code'] != '200') {
return ['code' => 1, 'msg' => $result['error']];
} else {
return $res = [
'code' => 0,
'data' => [
'src' => $result['data']['url']
]
];
}
}
}
}
function dowloadImage($url, $save_dir = './', $filename = '', $type = 0)
{
if (!file_exists($save_dir) && !@mkdir($save_dir, 0777, true)) {
ajaxMsg(0, $save_dir . '目录不可写');
}
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$img = curl_exec($ch);
curl_close($ch);
$fp2 = @fopen($save_dir . $filename, 'a');
fwrite($fp2, $img);
fclose($fp2);
unset($img, $url);
return $save_dir . $filename;
}
function getAppAndWindvaneByApi()
{
$pars = array();
$pars['host'] = $_SERVER['HTTP_HOST'];
$pars['method'] = 'windVane';
$url = 'https://service.rhaphp.com/gateway';
$urlset = parse_url($url);
$headers[] = "Host: {$urlset['host']}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_TIMEOUT, 500);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($pars, '', '&'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$content = curl_exec($ch);
curl_close($ch);
return $content;
}
function sendCustomMessage($data = [])
{
$wxObj = getWechatActiveObj();
$result = $wxObj->sendCustomMessage($data);
if (empty($result)) {
if ($wxObj->errCode == '45015') {
return ['errcode' => -1, 'errmsg' => '发送失败:此用户48小时内没有与公众号有过互动'];
}
}
if (isset($result['errcode']) && $result['errcode'] == '0') {
return $result;
}
if ($msg = wxApiResultErrorCode($wxObj->errCode)) {
return ['errcode' => -1, 'errmsg' => $msg];
}
return ['errcode' => -1, 'errmsg' => ' errCode:' . $wxObj->errCode . ' errMsg:' . $wxObj->errMsg];
}
function getMedia($media_id, $is_video = false)
{
$wxObj = getWechatActiveObj();
return $result = $wxObj->getMedia($media_id, $is_video = false);
}
function getWxPayUrl($mid = '', $param = [])
{
if (!$mid) {
return ['code' => -1, 'msg' => '公众号标识ID不能为空'];
}
$str = http_build_query($param);
return getHostDomain() . \think\facade\Url::build('service/payment/wxpay', '', false) . '/?mid=' . $mid . '&' . $str;
}
function setMpKeywordByNews($keyword = '', $title = '', $picurl = '', $desc = '', $link = '')
{
$mp = getMpInfo();
if (!$keyword || !$title || !$picurl || !$link || !isset($mp['id'])) {
return false }
$data['mpid'] = $mp['id'];
$data['keyword'] = $keyword;
$data['title'] = $title;
$data['url'] = $picurl;
$data['content'] = $desc;
$data['link'] = getHostDomain() . $link;
$data['type'] = 'news';
$ruleModel = new \app\common\model\MpRule();
$replyMode = new \app\common\model\MpReply();
if ($result = $replyMode->alias('a')->where('a.link', $data['link'])
->join('__MP_RULE__ b', 'b.reply_id=a.reply_id')
->find()) {
if ($data['mpid'] != $result['mpid']) {
ajaxMsg(0, '回复关键词内容公众号标识与当前公众号标识不匹配');
}
$replyMode->allowField(true)->save($data, ['reply_id' => $result['reply_id']]);
$ruleModel->allowField(true)->save(['keyword' => $data['keyword']], ['reply_id' => $result['reply_id']]);
return true;
} else {
if ($res_1 = $replyMode->allowField(true)->save($data)) {
$data['reply_id'] = $replyMode->reply_id;
if (!$res_2 = $ruleModel->allowField(true)->save($data)) {
$replyMode::destroy(['reply_id' => $data['reply_id']]);
}
}
if ($res_1 && $res_2) {
return $replyMode->reply_id;
} else {
return false;
}
}
}
function delKeywordReply($reply_id = '')
{
$mp = getMpInfo();
if (!isset($mp['id']) || empty($mp['id']) || !$reply_id) {
return false }
$ruleModel = new \app\common\model\MpRule();
$replyMode = new \app\common\model\MpReply();
$result = $ruleModel->where(['reply_id' => $reply_id])->find();
if (!empty($result)) {
if ($mp['id'] != $result['mpid']) {
ajaxMsg(0, '回复关键词内容公众号标识与当前公众号标识不匹配');
}
$replyMode->where(['reply_id' => $reply_id])->delete();
$ruleModel->where(['reply_id' => $reply_id])->delete();
return true;
}
return false;
}
function wxApiResultErrorCode($code)
{
$codes = [
'-1' => '系统繁忙,此时请开发者稍候再试', '0' => '请求成功', '40001' => '获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口', '40002' => '不合法的凭证类型', '40003' => '不合法的 OpenID ,请开发者确认 OpenID (该用户)是否已关注公众号,或是否是其他公众号的 OpenID', '40004' => '不合法的媒体文件类型', '40005' => '不合法的文件类型', '40006' => '不合法的文件大小', '40007' => '不合法的媒体文件 id', '40008' => '不合法的消息类型', '40009' => '不合法的图片文件大小', '40010' => '不合法的语音文件大小', '40011' => '不合法的视频文件大小', '40012' => '不合法的缩略图文件大小', '40013' => '不合法的 AppID ,请开发者检查 AppID 的正确性,避免异常字符,注意大小写', '40014' => '不合法的 access_token ,请开发者认真比对 access_token 的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口', '40015' => '不合法的菜单类型', '40016' => '不合法的按钮个数', '40017' => '不合法的按钮个数', '40018' => '不合法的按钮名字长度', '40019' => '不合法的按钮 KEY 长度', '40020' => '不合法的按钮 URL 长度', '40021' => '不合法的菜单版本号', '40022' => '不合法的子菜单级数', '40023' => '不合法的子菜单按钮个数', '40024' => '不合法的子菜单按钮类型', '40025' => '不合法的子菜单按钮名字长度', '40026' => '不合法的子菜单按钮 KEY 长度', '40027' => '不合法的子菜单按钮 URL 长度', '40028' => '不合法的自定义菜单使用用户', '40029' => '不合法的 oauth_code', '40030' => '不合法的 refresh_token', '40031' => '不合法的 openid 列表', '40032' => '不合法的 openid 列表长度', '40033' => '不合法的请求字符,不能包含 \uxxxx 格式的字符', '40035' => '不合法的参数', '40038' => '不合法的请求格式', '40039' => '不合法的 URL 长度', '40050' => '不合法的分组 id', '40051' => '分组名字不合法', '40060' => '删除单篇图文时,指定的 article_idx 不合法', '40117' => '分组名字不合法', '40118' => 'media_id 大小不合法', '40119' => 'button 类型错误', '40120' => 'button 类型错误', '40121' => '不合法的 media_id 类型', '40132' => '微信号不合法', '40137' => '不支持的图片格式', '40155' => '请勿添加其他公众号的主页链接', '41001' => '缺少 access_token 参数', '41002' => '缺少 appid 参数', '41003' => '缺少 refresh_token 参数', '41004' => '缺少 secret 参数', '41005' => '缺少多媒体文件数据', '41006' => '缺少 media_id 参数', '41007' => '缺少子菜单数据', '41008' => '缺少 oauth code', '41009' => '缺少 openid', '42001' => 'access_token 超时,请检查 access_token 的有效期,请参考基础支持 - 获取 access_token 中,对 access_token 的详细机制说明', '42002' => 'refresh_token 超时', '42003' => 'oauth_code 超时', '42007' => '用户修改微信密码, accesstoken 和 refreshtoken 失效,需要重新授权', '43001' => '需要 GET 请求', '43002' => '需要 POST 请求', '43003' => '需要 HTTPS 请求', '43004' => '需要接收者关注', '43005' => '需要好友关系', '43019' => '需要将接收者从黑名单中移除', '44001' => '多媒体文件为空', '44002' => 'POST 的数据包为空', '44003' => '图文消息内容为空', '44004' => '文本消息内容为空', '45001' => '多媒体文件大小超过限制', '45002' => '消息内容超过限制', '45003' => '标题字段超过限制', '45004' => '描述字段超过限制', '45005' => '链接字段超过限制', '45006' => '图片链接字段超过限制', '45007' => '语音播放时间超过限制', '45008' => '图文消息超过限制', '45009' => '接口调用超过限制', '45010' => '创建菜单个数超过限制', '45011' => 'API 调用太频繁,请稍候再试', '45015' => '回复时间超过限制', '45016' => '系统分组,不允许修改', '45017' => '分组名字过长', '45018' => '分组数量超过上限', '45047' => '客服接口下行条数超过上限', '46001' => '不存在媒体数据', '46002' => '不存在的菜单版本', '46003' => '不存在的菜单数据', '46004' => '不存在的用户', '47001' => '解析 JSON/XML 内容错误', '48001' => 'api 功能未授权,请确认公众号已获得该接口,可以在公众平台官网 - 开发者中心页中查看接口权限', '48002' => '粉丝拒收消息(粉丝在公众号选项中,关闭了 “ 接收消息 ” )', '48004' => 'api 接口被封禁,请登录 mp.weixin.qq.com 查看详情', '48005' => 'api 禁止删除被自动回复和自定义菜单引用的素材', '48006' => 'api 禁止清零调用次数,因为清零次数达到上限', '48008' => '没有该类型消息的发送权限', '50001' => '用户未授权该 api', '50002' => '用户受限,可能是违规后接口被封禁', '61451' => '参数错误 (invalid parameter)', '61452' => '无效客服账号 (invalid kf_account)', '61453' => '客服帐号已存在 (kf_account exsited)', '61454' => '客服帐号名长度超过限制 ( 仅允许 10 个英文字符,不包括 @ 及 @ 后的公众号的微信号 )(invalid kf_acount length)', '61455' => '客服帐号名包含非法字符 ( 仅允许英文 + 数字 )(illegal character in kf_account)', '61456' => '客服帐号个数超过限制 (10 个客服账号 )(kf_account count exceeded)', '61457' => '无效头像文件类型 (invalid file type)', '61450' => '系统错误 (system error)', '61500' => '日期格式错误', '65301' => '不存在此 menuid 对应的个性化菜单', '65302' => '没有相应的用户', '65303' => '没有默认菜单,不能创建个性化菜单', '65304' => 'MatchRule 信息为空', '65305' => '个性化菜单数量受限', '65306' => '不支持个性化菜单的帐号', '65307' => '个性化菜单信息为空', '65308' => '包含没有响应类型的 button', '65309' => '个性化菜单开关处于关闭状态', '65310' => '填写了省份或城市信息,国家信息不能为空', '65311' => '填写了城市信息,省份信息不能为空', '65312' => '不合法的国家信息', '65313' => '不合法的省份信息', '65314' => '不合法的城市信息', '65316' => '该公众号的菜单设置了过多的域名外跳(最多跳转到 3 个域名的链接)', '65317' => '不合法的 URL', '9001001' => 'POST 数据参数不合法', '9001002' => '远端服务不可用', '9001003' => 'Ticket 不合法', '9001004' => '获取摇周边用户信息失败', '9001005' => '获取商户信息失败', '9001006' => '获取 OpenID 失败', '9001007' => '上传文件缺失', '9001008' => '上传素材的文件类型不合法', '9001009' => '上传素材的文件尺寸不合法', '9001010' => '上传失败', '9001020' => '帐号不合法', '9001021' => '已有设备激活率低于 50% ,不能新增设备', '9001022' => '设备申请数不合法,必须为大于 0 的数字', '9001023' => '已存在审核中的设备 ID 申请', '9001024' => '一次查询设备 ID 数量不能超过 50', '9001025' => '设备 ID 不合法', '9001026' => '页面 ID 不合法', '9001027' => '页面参数不合法', '9001028' => '一次删除页面 ID 数量不能超过 10', '9001029' => '页面已应用在设备中,请先解除应用关系再删除', '9001030' => '一次查询页面 ID 数量不能超过 50', '9001031' => '时间区间不合法', '9001032' => '保存设备与页面的绑定关系参数错误', '9001033' => '门店 ID 不合法', '9001034' => '设备备注信息过长', '9001035' => '设备申请参数不合法', '9001036' => '查询起始值 begin 不合法',
];
if (isset($codes[$code])) {
return $codes[$code];
} else {
return false;
}
}
function getMimiappInfo($mid = '', $expier = 1800)
{
$mid ? $mid : $mid = input('_mid');
$mpInfo = 'miniapp_' . $mid;
if ($mid) {
$mpinfoCahe = \think\facade\Cache::get($mpInfo);
if (empty($mpinfoCahe)) {
$mp = \think\Db::name('miniapp')->where('id', '=', $mid)->find();
if (!empty($mp)) {
\think\facade\Cache::set($mpInfo, $mp, $expier);
return $mp;
} else {
abort(500, lang('没有找到相应的小程序信息'));
}
} else {
return $mpinfoCahe;
}
} else {
abort(500, lang('没有找到相应的小程序信息'));
}
}
function getMiniProgramObj($options = [])
{
if (empty($options)) {
$options = \think\facade\Session::get('miniapp_options');
if (empty($options)) {
$infos = getMimiappInfo();
$options['appid'] = $infos['appid'];
$options['appsecret'] = $infos['appsecret'];
$options['token'] = $infos['token'];
$options['encodingaeskey'] = $infos['encodingaeskey'];
}
}
include_once EXTEND_PATH . "miniprogram/MiniProgram.php";
return new \miniprogram\MiniProgram($options);
}
function createDir($path)
{
if (is_dir($path)) {
return true;
}
if (is_dir(dirname($path))) {
return mkdir($path);
}
createDir(dirname($path));
return @mkdir($path);
}
function getThumb($file_path, $type = 1)
{
$array = explode('/', $file_path);
$Name = end($array);
$model = new \app\common\model\Picture();
$info = $model->where('name', $Name)->cache(true)->find();
if (!$info) {
return null;
}
$file = '';
switch ($type) {
case 1:
$file = $info['thumb'];
break;
case 2:
$file = $info['reduce'];
break;
case 3:
$file = $info['picture'];
break;
}
return getHostDomain() . DS . $file;
}
function sendTemplateMessage($data = [])
{
$wxObj = getWechatActiveObj();
$result = $wxObj->sendTemplateMessage($data);
if (isset($result['errcode']) && $result['errcode'] == '0') {
return $result;
}
if ($msg = wxApiResultErrorCode($wxObj->errCode)) {
return ['errcode' => -1, 'errmsg' => $msg];
}
return ['errcode' => -1, 'errmsg' => ' errCode:' . $wxObj->errCode . ' errMsg:' . $wxObj->errMsg];
}
function getRuleTypeName($type)
{
switch ($type) {
case 'text':
return '回复文本';
break;
case 'news':
return '回复图文';
break;
case 'addon':
return '触发应用';
break;
case 'voice':
return '回复语音';
break;
case 'image':
return '回复图片';
break;
case 'video':
return '回复视频';
break;
case 'music':
return '回复音乐';
break;
case 'multi_news':
return '回复多图文';
break;
default:
return '未知';
}
}