www.gusucode.com > Destoon B2B仿淘宝电子商务网站 UTF8 v6.0源码程序 > destoon/module/member/admin/weixin.inc.php
<?php defined('IN_DESTOON') or exit('Access Denied'); isset($username) or $username = ''; isset($openid) or $openid = ''; if(check_name($username)) { $U = $db->get_one("SELECT * FROM {$DT_PRE}weixin_user WHERE username='$username'"); $U or msg('用户未绑定微信帐号'); $openid = $U['openid']; } else if($openid) { $U = $db->get_one("SELECT * FROM {$DT_PRE}weixin_user WHERE openid='$openid'"); $U or msg('微信帐号不存在'); } if($openid) { $U['headimgurl'] or $U['headimgurl'] = 'api/weixin/image/headimg.jpg'; $menus = array ( array('消息记录', '?moduleid='.$moduleid.'&file='.$file.'&openid='.$openid), array('事件记录', '?moduleid='.$moduleid.'&file='.$file.'&openid='.$openid.'&action=event'), array('微信交谈', '?moduleid='.$moduleid.'&file='.$file.'&openid='.$openid.'&action=chat'), ); } else { $menus = array ( array('消息记录', '?moduleid='.$moduleid.'&file='.$file), array('事件记录', '?moduleid='.$moduleid.'&file='.$file.'&action=event'), array('用户管理', '?moduleid='.$moduleid.'&file='.$file.'&action=user'), array('菜单管理', '?moduleid='.$moduleid.'&file='.$file.'&action=menu'), array('帐号设置', '?moduleid='.$moduleid.'&file='.$file.'&action=setting'), array('公众平台', DT_PATH.'api/redirect.php?url=http://mp.weixin.qq.com/', 'target="_blank"'), ); } switch($action) { case 'unbind': $itemid or msg('请选择记录'); $itemids = is_array($itemid) ? implode(',', $itemid) : $itemid; $db->query("UPDATE {$DT_PRE}weixin_user SET username='' WHERE itemid IN ($itemids)"); dmsg('解除成功', $forward); break; case 'delete': $itemid or msg('请选择记录'); $itemids = is_array($itemid) ? implode(',', $itemid) : $itemid; $db->query("DELETE FROM {$DT_PRE}weixin_chat WHERE itemid IN ($itemids)"); dmsg('删除成功', $forward); break; case 'setting': if($submit) { $open = $setting['appid'] && $setting['appsecret'] && $setting['apptoken'] && $setting['weixin'] ? 1 : 0; $db->query("UPDATE {$DT_PRE}setting SET item_value='$open' WHERE item_key='weixin' AND item='3'"); cache_module(3); update_setting('weixin', $setting); cache_weixin(); dmsg($open ? '微信已开启' : '微信已关闭', '?moduleid='.$moduleid.'&file='.$file.'&action='.$action); } else { cache_weixin(); extract(dhtmlspecialchars(cache_read('weixin.php'))); include tpl('weixin_setting', $module); } break; case 'sync': require DT_ROOT.'/api/weixin/init.inc.php'; isset($next_openid) or $next_openid = ''; $num = isset($num) ? intval($num) : 0; $url = 'https://api.weixin.qq.com/cgi-bin/user/get?access_token='.$access_token.'&next_openid='.$next_openid; $arr = $wx->http_get($url); isset($arr['total']) or msg('连接失败,请检查配置'); if($arr['total'] == 0) dmsg('同步成功', '?moduleid='.$moduleid.'&file='.$file.'&action=user'); foreach($arr['data']['openid'] as $v) { $num++; $user = weixin_user($v); if(!$user) $db->query("INSERT INTO {$DT_PRE}weixin_user (openid) VALUES ('$v')"); } if($arr['next_openid'] == '' || $arr['next_openid'] == $next_openid) { msg('会员同步成功,开始同步会员资料...', '?moduleid='.$moduleid.'&file='.$file.'&action=sync_user'); } else { msg('已同步 '.$num.' 位会员'.progress(1, $num, $arr['total']), '?moduleid='.$moduleid.'&file='.$file.'&action='.$action.'&num='.$num.'&next_openid='.$arr['next_openid']); } break; case 'sync_user': require DT_ROOT.'/api/weixin/init.inc.php'; if(!isset($fid)) { $r = $db->get_one("SELECT min(itemid) AS fid FROM {$DT_PRE}weixin_user"); $fid = $r['fid'] ? $r['fid'] : 0; } isset($sid) or $sid = $fid; if(!isset($tid)) { $r = $db->get_one("SELECT max(itemid) AS tid FROM {$DT_PRE}weixin_user"); $tid = $r['tid'] ? $r['tid'] : 0; } isset($num) or $num = 50; if($fid <= $tid) { $result = $db->query("SELECT * FROM {$DT_PRE}weixin_user WHERE itemid>=$fid ORDER BY itemid LIMIT 0,$num "); if($db->affected_rows($result)) { while($user = $db->fetch_array($result)) { $itemid = $user['itemid']; $info = $wx->get_user($user['openid']); if($info) { if($info['subscribe'] == 0) { $sql = "subscribe=0,username='',edittime=$DT_TIME"; } else { $sql = "subscribe=1,addtime=".$info['subscribe_time'].",edittime=$DT_TIME"; foreach(array('nickname', 'sex', 'city', 'province', 'country', 'language', 'headimgurl') as $v) { if(isset($info[$v])) $sql .= ",".$v."='".addslashes($info[$v])."'"; } } $db->query("UPDATE {$DT_PRE}weixin_user SET $sql WHERE itemid=$itemid"); } } $itemid += 1; } else { $itemid = $fid + $num; } } else { dmsg('同步成功', '?moduleid='.$moduleid.'&file='.$file.'&action=user'); } msg('ID从'.$fid.'至'.($itemid-1).'资料同步成功'.progress($sid, $fid, $tid), "?moduleid=$moduleid&file=$file&action=$action&sid=$sid&fid=$itemid&tid=$tid&num=$num"); break; case 'chat': include tpl('weixin_chat', $module); break; case 'send': $openid or exit; $word = trim(strip_tags($word)); $word or dalert('发送内容不能为空', '', 'window.parent.chat_show();'); require DT_ROOT.'/api/weixin/init.inc.php'; $str = substr($word, 0, 4); $ext = substr($word, -3); $file = ''; $type = 'text'; if($str == 'http' && in_array($ext, array('jpg', 'amr', 'mp3', 'mp4'))) { if(strpos($word, DT_PATH) === 0) { $file = str_replace(DT_PATH, DT_ROOT.'/', $word); } else { if($DT['remote_url'] && strpos($word, $DT['remote_url']) === 0) { $file = DT_ROOT.'/file/temp/'.date('YmdHis', $DT_TIME).mt_rand(10, 99).$_userid.'.'.$ext; file_copy($word, $file); } } if(strpos($file, '/file/') !== false && strpos($file, '..') === false && is_file($file)) { $arr = $wx->http_upload($file); if($arr[0]) { file_del($file); $word = $arr[0];//Media_ID $type = $arr[1]; } else { dalert('上传失败 - '.$arr[1], '', 'window.parent.chat_show();'); } } } $arr = $wx->send($openid, $type, $word); if($arr['errcode'] != 0) { if($arr['errcode'] == 45015) dalert('回复时间超过限制[须48小时内回复]', '', 'window.parent.chat_hide(1);'); dalert('发送失败 - '.$arr['errmsg'].'(errcode:'.$arr['errcode'].')', '', 'window.parent.chat_show();'); } $post = array(); $post['content'] = $word; $post['type'] = 'reply'; $post['openid'] = $openid; $post['editor'] = $_username; $post['addtime'] = $DT_TIME; $post['misc']['type'] = $type; $post['misc'] = $post['misc'] ? serialize($post['misc']) : ''; $post = daddslashes($post); $sql = ''; foreach($post as $k=>$v) { $sql .= ",$k='$v'"; } $db->query("INSERT INTO {$DT_PRE}weixin_chat SET ".substr($sql, 1)); dalert('', '', 'window.parent.chat_show(2);'); break; case 'load': $openid or exit; $chatlast = $_chatlast = intval($chatlast); $josn = $debug = ''; $i = $j = 0; if($chatlast) { $sql = "SELECT * FROM {$DT_PRE}weixin_chat WHERE openid='$openid' AND event=0 AND addtime>$chatlast ORDER BY addtime DESC"; } else { $sql = "SELECT * FROM {$DT_PRE}weixin_chat WHERE openid='$openid' AND event=0 ORDER BY addtime DESC LIMIT 20"; } $lists = array(); $result = $db->query($sql); while($r = $db->fetch_array($result)) { if($r['type'] == 'reply' && $r['editor'] != $_username) continue; $lists[] = $r; } $num = count($lists); if($num) { for($k = $num - 1; $k >= 0; $k--) { $r = $lists[$k]; $time = timetodate($r['addtime'], 'H:i:s'); $date2 = timetodate($r['addtime'], 'Y-m-d'); if($date2 == $date1) { $date = ''; } else { $date = $date1 = $date2; } if($i == 0 && $chatlast) $date = ''; $word = weixin_msg($r['type'], $r['content'], $r['misc']); $word = str_replace('"', '\"', $word); if($r['editor']) { $name = '我'; $self = 1; } else { $name = $U['nickname']; $self = 0; if($_chatlast) $j++; } $chatlast = $r['addtime']; $josn .= ($i ? ',' : '').'{time:"'.$time.'",date:"'.$date.'",name:"'.$name.'",word:"'.$word.'",self:"'.$self.'"}'; $i = 1; } } $debug = timetodate($chatlast, 6).'-'.$j; $josn = '{chat_msg:['.$josn.'],chat_new:"'.$j.'",chat_last:"'.$chatlast.'",chat_bug:"'.$debug.'"}'; exit($josn); break; case 'user': $SEX = array('未知', '男', '女'); $SUBSCRIBE = array('<span style="color:red;">已取消</span>', '<span style="color:green;">关注中</span>'); $sfields = array('按条件', '会员名', '昵称', '城市', '省份', '国籍', '语言'); $dfields = array('username', 'username', 'nickname', 'city', 'province', 'country', 'language'); $sorder = array('结果排序方式', '关注时间降序', '关注时间升序', '更新时间降序', '更新时间升序'); $dorder = array('itemid DESC', 'addtime DESC', 'addtime ASC', 'logintime DESC', 'logintime ASC'); isset($fields) && isset($dfields[$fields]) or $fields = 0; isset($site) or $site = ''; isset($order) && isset($dorder[$order]) or $order = 0; $thumb = isset($thumb) ? intval($thumb) : 0; $sex = isset($sex) ? intval($sex) : -1; $subscribe = isset($subscribe) ? intval($subscribe) : -1; $fields_select = dselect($sfields, 'fields', '', $fields); $order_select = dselect($sorder, 'order', '', $order); $condition = '1'; if($keyword) $condition .= " AND $dfields[$fields] LIKE '%$keyword%'"; if($thumb) $condition .= " AND headimgurl<>''"; if($sex > -1) $condition .= " AND sex='$sex'"; if($subscribe > -1) $condition .= " AND subscribe='$subscribe'"; $order = $dorder[$order]; if($page > 1 && $sum) { $items = $sum; } else { $r = $db->get_one("SELECT COUNT(*) AS num FROM {$DT_PRE}weixin_user WHERE $condition"); $items = $r['num']; } $pages = pages($items, $page, $pagesize); $lists = array(); $result = $db->query("SELECT * FROM {$DT_PRE}weixin_user WHERE $condition ORDER BY $order LIMIT $offset,$pagesize"); while($r = $db->fetch_array($result)) { $r['adddate'] = timetodate($r['addtime'], 5); $r['editdate'] = timetodate($r['edittime'], 5); $r['gender'] = $SEX[$r['sex']]; $r['status'] = $SUBSCRIBE[$r['subscribe']]; $r['headimgurl'] or $r['headimgurl'] = 'api/weixin/image/headimg.jpg'; $lists[] = $r; } include tpl('weixin_user', $module); break; case 'menu': require DT_ROOT.'/api/weixin/init.inc.php'; if($submit) { update_setting('weixin-menu', array('menu' => serialize($post))); cache_weixin(); $menu = $sub = $btn = array(); for($i = 0; $i < 3; $i++) { $sub[$i] = 0; if($post[$i][1]['name'] && $post[$i][1]['key']) $sub[$i] = 1; } for($i = 0; $i < 3; $i++) { if($post[$i][0]['name']) { $menu[$i]['name'] = urlencode(convert($post[$i][0]['name'], DT_CHARSET, 'UTF-8')); if($sub[$i]) { for($j = 1; $j < 6; $j++) { if($post[$i][$j]['name'] && $post[$i][$j]['key']) { $menu[$i]['sub_button'][$j-1]['name'] = urlencode(convert($post[$i][$j]['name'], DT_CHARSET, 'UTF-8')); if(substr($post[$i][$j]['key'], 0, 4) == 'http') { $menu[$i]['sub_button'][$j-1]['type'] = 'view'; $menu[$i]['sub_button'][$j-1]['url'] = $post[$i][$j]['key']; } else { $menu[$i]['sub_button'][$j-1]['type'] = 'click'; $menu[$i]['sub_button'][$j-1]['key'] = $post[$i][$j]['key']; } } else { break; } } } else { if($post[$i][0]['key']) { if(substr($post[$i][0]['key'], 0, 4) == 'http') { $menu[$i]['type'] = 'view'; $menu[$i]['url'] = $post[$i][0]['key']; } else { $menu[$i]['type'] = 'click'; $menu[$i]['key'] = $post[$i][0]['key']; } } else { msg('菜单'.($i+1).' 地址/事件 不能为空'); } } } } $btn['button'] = $menu; $par = stripslashes(urldecode(json_encode($btn))); $url = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$access_token; $arr = $wx->http_post($url, $par); if($arr['errcode'] == 0) { dmsg('同步成功', '?moduleid='.$moduleid.'&file='.$file.'&action='.$action); } else { msg('同步失败 - '.$arr['errcode'].':'.$arr['errmsg']); } } else { #print_r($wx->http_get('https://api.weixin.qq.com/cgi-bin/menu/get?access_token='.$access_token)); cache_weixin(); $menu = cache_read('weixin-menu.php'); if(count($menu) < 1 || count($menu) > 3) { $menu = array(); for($i = 0; $i < 3; $i++) { for($j = 0; $j < 6; $j++) { $menu[$i][$j]['name'] = ''; $menu[$i][$j]['key'] = ''; } } } include tpl('weixin_menu', $module); } break; default: $sfields = array('按条件', '消息内容', '微信昵称', '会员名', '网站编辑'); $dfields = array('c.content', 'c.content', 'u.nickname', 'u.username', 'c.editor'); isset($fields) && isset($dfields[$fields]) or $fields = 0; isset($type) or $type = ''; $event = isset($event) ? intval($event) : -1; $fields_select = dselect($sfields, 'fields', '', $fields); $condition = 'u.openid=c.openid'; if($action == 'event') { $condition .= " AND c.event=1"; $TYPE = array( 'subscribe' => '用户订阅', 'unsubscribe' => '取消订阅', 'SCAN' => '扫描二维码', 'LOCATION' => '地理位置', 'CLICK' => '点击菜单', 'VIEW' => '点击链接', ); } else { $condition .= " AND c.event=0"; $TYPE = array( 'text' => '文本消息', 'image' => '图片消息', 'voice' => '语音消息', 'video' => '视频消息', 'location' => '地理位置', 'link' => '链接消息', 'reply' => '网站回复', 'push' => '网站推送', ); } if($keyword) $condition .= " AND $dfields[$fields] LIKE '%$keyword%'"; if($type) $condition .= " AND c.type='$type'"; if($openid) $condition .= " AND c.openid='$openid'"; if($page > 1 && $sum) { $items = $sum; } else { $r = $db->get_one("SELECT COUNT(*) AS num FROM {$DT_PRE}weixin_chat c,{$DT_PRE}weixin_user u WHERE $condition"); $items = $r['num']; } $pages = pages($items, $page, $pagesize); $lists = array(); $result = $db->query("SELECT u.username,u.nickname,u.sex,u.city,u.province,u.country,u.language,u.headimgurl,c.* FROM {$DT_PRE}weixin_chat c,{$DT_PRE}weixin_user u WHERE $condition ORDER BY c.addtime DESC LIMIT $offset,$pagesize"); while($r = $db->fetch_array($result)) { $r['adddate'] = timetodate($r['addtime'], 5); $r['headimgurl'] or $r['headimgurl'] = 'api/weixin/image/headimg.jpg'; $r['msg'] = weixin_msg($r['type'], $r['content'], $r['misc']); $lists[] = $r; } include tpl('weixin', $module); break; } function weixin_msg($type, $content, $misc) { $misc = $misc ? unserialize($misc) : array(); switch($type) { case 'image': return '<a href="'.$content.'" target="_blank"><img src="'.$content.'" onload="if(this.width>200) this.width=200;" onerror="this.src=\'api/weixin/image/media_image_error.gif\';" style="border:#CCCCCC 1px solid;padding:2px;"/></a>'; break; case 'voice': return '<a href="javascript:Dwidget(\'api/weixin/media.php?action='.$type.'&mediaid='.$misc['MediaId'].'\', \'播放语音 - QuickTime Player\', 300, 16, \'no\');"><img src="api/weixin/image/media_voice.gif" align="absmiddle"/></a> <a href="api/weixin/down.php?mediaid='.$misc['MediaId'].'" class="t">下载</a>'; break; case 'video': return '<a href="javascript:Dwidget(\'api/weixin/media.php?action='.$type.'&mediaid='.$misc['MediaId'].'\', \'播放视频 - QuickTime Player\', 300, 400, \'no\');"><img src="api/weixin/image/media_video.gif" align="absmiddle"/></a> <a href="api/weixin/down.php?mediaid='.$misc['MediaId'].'" class="t">下载</a>'; break; case 'location': return '<img src="api/weixin/image/media_map_marker.gif" align="absmiddle"/> <a href="javascript:Dwidget(\'api/weixin/media.php?action='.$type.'&latitude='.$misc['Location_X'].'&longitude='.$misc['Location_Y'].'&zoom='.$misc['Scale'].'\', \'查看地图 - '.$content.'\', 450, 400, \'no\');" class="t">'.$content.'</a>'; break; case 'link': return '<a href="'.$content.'" target="_blank" class="t">'.$misc['Title'].'</a>'.($misc['Description'] ? '<br/>'.$misc['Description'] : ''); break; case 'reply': if($misc['type'] == 'image') { return weixin_msg($misc['type'], 'api/weixin/down.php?mediaid='.$content, ''); } else if($misc['type'] == 'voice' || $misc['type'] == 'video') { return weixin_msg($misc['type'], '', serialize(array('MediaId'=>$content, ''))); } if(preg_match_all("/([http|https]+)\:\/\/([a-z0-9\/\-\_\.\,\?\&\#\=\%\+\;]{4,})/i", $content, $m)) { foreach($m[0] as $u) { if(preg_match("/^(jpg|jpeg|gif|png|bmp)$/i", file_ext($u)) && !preg_match("/([\?\&\=]{1,})/i", $u)) { $content = str_replace($u, '<a href="'.$u.'" target="_blank"><img src="'.$u.'" onload="if(this.width>200) this.width=200;" onerror="this.src=\'api/weixin/image/media_image_error.gif\';" style="border:#CCCCCC 1px solid;padding:2px;"/></a>', $content); } else { $content = str_replace($u, '<a href="'.$u.'" target="_blank" class="t">'.$u.'</a>', $content); } } } return $content; break; case 'CLICK': $E = array( 'V_member' => '绑定会员', ); return isset($E[$content]) ? $E[$content] : $content; break; case 'VIEW': return '<a href="'.$content.'" target="_blank" class="t">打开链接</a>'; break; case 'LOCATION': return '<a href="javascript:Dwidget(\'api/weixin/media.php?action=location&latitude='.$misc['Latitude'].'&longitude='.$misc['Longitude'].'\', \'查看地图\', 450, 400, \'no\');"><img src="api/weixin/image/media_map.gif" align="absmiddle"/></a>'; break; default: return $content; break; } } ?>