微信营销活动
2015-09-08 09:54
567 查看
微信开发中的营销活动
微信营销活动推广,在公众号中一般用于设置菜单,也适用于消息的推送,也用于消息的回复。除消息推送属于主动响应外,其他则属于被动消息响应。被动响应则由一套关键字系统服务,当用户发送关键字到服务器,则触发响应的事件,服务器则以http的方式响应用户。下面具体介绍一下关键字系统:
关键词系统
1.信息结构
CREATE TABLE `custom_keyword` ( `aid` int(11) unsigned NOT NULL COMMENT '公众号id', `business_id` int(11) unsigned NOT NULL COMMENT '商户id', `plc_sourceid` varchar(50) NOT NULL COMMENT '公众账号原始id', `group_id` int(11) unsigned NOT NULL COMMENT '规则分组', `custom_reply_id` varchar(64) NOT NULL COMMENT '回复内容id', `ktag` varchar(50) NOT NULL COMMENT '关键词tag', `match_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '匹配类型:1全配 2模糊', `reply_type` smallint(6) NOT NULL DEFAULT '1' COMMENT '回复类型:1文本 2图文 3音乐', `is_hiden` smallint(6) NOT NULL DEFAULT '0' COMMENT '0显示大于零隐藏 1关注时回复 2活动时回复', `ctime` int(11) NOT NULL COMMENT '创建时间', `flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1删除标志', UNIQUE KEY `uindex_b_p_k` (`business_id`,`plc_sourceid`,`ktag`), UNIQUE KEY `uindex_a_k` (`aid`,`ktag`), KEY `i_aid_group_id` (`aid`,`group_id`), KEY `i_business_id_plc_sourceid_group_id` (`business_id`,`plc_sourceid`,`group_id`), KEY `i_aid` (`aid`), KEY `i_business_id_plc_sourceid` (`business_id`,`plc_sourceid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='关键字tags列表';
2.工作流程图
图1-1 关键词系统工作流图
用户状态系统
1.信息结构
CREATE TABLE `userlisten - 列表内容 ` ( `aid` int(11) unsigned NOT NULL COMMENT '公众账号id', `wechat_id` varchar(50) NOT NULL COMMENT '用户openid', `modules` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '模块', `status` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '模块状态', `reply_appid` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '回复的应用id', `reply_type` smallint(6) unsigned NOT NULL DEFAULT '0' COMMENT '回复类型', `utime` int(11) unsigned NOT NULL COMMENT '更新时间', `ctime` int(11) unsigned NOT NULL COMMENT '创建时间', `flag` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '删除标志', UNIQUE KEY `unique_a_wechat_id` (`aid`,`wechat_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.工作流程图
图1-2 用户状态工作流图
结论:所有营销活动,都与关键词系统有关,涉及到图文回复、素材管理(微信素材管理、第三方素材管理),前端页面展示相关的活动,经由js处理,将结果反馈给服务器,形成用户与服务器(微信-第三方)的交互。
微信墙
微信墙需求原型:标题用于显示在大屏幕上,关键词用于用户触发该微信墙。
这里是有一篇关于微信墙的文章,介绍很详细,《微信墙怎么弄》。
根据需求,首先是把所有的微信墙在后台显示出来(也可以带query查询,query数据以post形式发送):
public function actionIndex(){ $aid = intval(Yii::app()->request->getParam('aid)); $cret = Wechat::model()->getPlcaccount(array('id' => $aid, 'business_id' => $this->sdid)); $size = 12; $page = intval(Yii::app()->request->getParam('page',1)); $aCondition = array('business_id' => $this->sdid , 'plc_sourceid' => $cret['plc_sourceid']); if($_GET['keywords']){ $keywords = filterString($_GET['keywords']); $aCondition['keyword'] = array('op'=>'LIKE', 'val' = "%$keywords%"); } $data = Wall::model()->getWall($page,$size,$aCondition,'wall'); $this->assign('data',$data); $this->addCss('bootstrap_min','bootstrap_responsive_min','style','todc_bootstrap','themes','inside'); $this->addScript('bootstrap_min','inside','plugins.daterangepicker.moment_min'); $this->assign('aid',$aid); $this->display('index'); }
对index操作中的变量及函数说明:
aid是公众号托管到第三方系统中生成的id,属于第三方数据库字段,不属于微信服务器数据字段,也就是绑定公众号时生成的id
sdid,
business_id是商户注册第三方服务时生成的账户id
size,
page是分页函数用到的参数,分别表示大小,页数
plc_sourceid是公众号原始id,可以登录微信后台,在
公众号设置中可以查询到。
编辑微信墙:
public function actionEdit() { if(empty($_POST)) { $aid = (int)Yii::app()->request->getParam('aid'); $id = (int)Yii::app()->request->getParam('id'); $cret = Wechat::model()->getPlcaccount(array('id' => $aid, 'business_id' => $this->sdid)); $arr = array( //'plc_sourceid'=>$cret['plc_sourceid'], //'business_id' => $this->sdid, 'pid' => $aid, 'status' => 1, 'lt' => array('start_time' => date('Y-m-d H:i:s')), 'gt' => array('end_time' => date('Y-m-d H:i:s')) //'start_time' => array('op'=>'<', val=>time()), //'end_time' => array('op'=>'>', val=>time()) ); /*读取投票活动的信息*/ //$act_vote = activity::model()->getVote(1, 10, $arr); $act_vote = Vote::model()->getVoteList($arr,1,10); $this->assign('act_vote', $act_vote); $this->addCss('bootstrap_min', 'bootstrap_responsive_min', 'style', 'todc_bootstrap_button', 'themes', 'plugins.uploadify.uploadify_t', 'plugins.daterangepicker.daterangepicker', 'inside'); $this->addScript('bootstrap_min', 'plugins.validation.jquery_validate_min', 'plugins.validation.jquery_validate_methods', 'plugins.form.jquery_form_min', 'jquery_ui_custom', 'plugins.uploadify.jquery_uploadify', 'plugins.mini_audio_player.jquery_jplayer_min', 'plugins.mini_audio_player.jquery_mb_miniPlayer', 'plugins.zeroclipboard.zeroclipboard_min', 'plugins.datepicker.bootstrap-datepicker', 'plugins.daterangepicker.moment_min', 'plugins.daterangepicker.daterangepicker', 'inside'); $this->assign('aid', $aid); $this->assign('md5', $this->md5); if($id) { $wall = Wall::model()->getOneWall(array('id'=>$id, 'business_id'=>$this->sdid, 'plc_sourceid'=>$cret['plc_sourceid']), 'Wall'); if(1 == $wall['photo']) { $wall_photo = Wall::model()->getOneWall(array('photo_id'=>$id, 'business_id'=>$this->sdid, 'plc_sourceid'=>$cret['plc_sourceid']), 'WallPhoto'); } if(1 == $wall['bigwheel']) { $wall_bigwheel = Wall::model()->getOneWall(array('bigwheel_id'=>$id, 'business_id'=>$this->sdid, 'plc_sourceid'=>$cret['plc_sourceid']), 'Wallbigwheel'); $wall_bigwheel['bigwheel_option'] = json_decode($wall_bigwheel['bigwheel_option'], true); } if(1 == $wall['lottery']) { $wall_lottery = Wall::model()->getOneWall(array('lottery_id'=>$id, 'business_id'=>$this->sdid, 'plc_sourceid'=>$cret['plc_sourceid']), 'WallLottery'); $wall_lottery['lottery_option'] = json_decode($wall_lottery['lottery_option'], true); } if(1 == $wall['vote']) { $wall_vote = Wall::model()->getOneWall(array('vote_id'=>$id, 'business_id'=>$this->sdid, 'plc_sourceid'=>$cret['plc_sourceid']), 'WallVote'); } if(1 == $wall['race']) { $wall_race = Wall::model()->getOneWall(array('race_id'=>$id, 'business_id'=>$this->sdid, 'plc_sourceid'=>$cret['plc_sourceid']), 'WallRace'); } //签到墙 if(1 == $wall['has_signin']){ $wall_signin = array(); } //抢红包 if(1 == $wall['has_red_packet']){ $wall_red = Wall::model()->getAllDataInfo('{{wall_red_packet}}',array("pid"=>$aid,"wall_id"=>$id,"flag"=>0)," sequence asc "); $sequence_valid_minute_other = 0; $game_valid_second_other = 0; foreach($wall_red as $key => $info){ $sequence_valid_minute = (int) $info['sequence_valid_minute']; if($sequence_valid_minute != 1 && $sequence_valid_minute != 5 && $sequence_valid_minute != 10){ $sequence_valid_minute_other = $sequence_valid_minute; $sequence_valid_minute = 0; } $game_valid_second = (int) $info['game_valid_second']; if($game_valid_second != 10 && $game_valid_second != 20 && $game_valid_second != 60){ $game_valid_second_other = $game_valid_second; $game_valid_second = 0; } $valid_type = $info['valid_type']; $valid_end_time = $valid_type == 1 ? date('Y-m-d',strtotime($info['valid_end_time'])) : ''; $valid_day = $info['valid_day']; $name = $info['name']; $wall_red[$key]['enumeration_money'] = !empty($info['enumeration_money']) ? json_decode($info['enumeration_money']) : array(''); } } /*读取相册数据*/ $albums = Albums::model()->GetPictureListByAlbumsId($cret['plc_sourceid'],$this->sdid,$wall_photo['albums_id']); $this->assign('wall', $wall); $this->assign('albums', $albums); $this->assign('wall_photo', $wall_photo); $this->assign('wall_bigwheel', $wall_bigwheel); $this->assign('wall_lottery', $wall_lottery); $this->assign('wall_vote', $wall_vote); $this->assign('wall_race', $wall_race); $this->assign('wall_red',$wall_red); $this->assign('sequence_valid_minute_other',$sequence_valid_minute_other); $this->assign('game_valid_second_other',$game_valid_second_other); $this->assign('sequence_valid_minute',$sequence_valid_minute); $this->assign('game_valid_second',$game_valid_second); $this->assign('valid_type',$valid_type); $this->assign('valid_end_time',$valid_end_time); $this->assign('valid_day',$valid_day); $this->assign('name',$name); $this->assign('business_id',$this->sdid); $this->assign('id', $id); $this->display('edit'); } else { $this->display('add'); } } else { $_POST = filterString($_POST); // 参数过滤 $id = $_POST['id']; $aid = $_POST['aid']; $cret = Wechat::model()->getPlcaccount(array('id' => $aid, 'business_id' => $this->sdid)); $_POST['business_id'] = $this->sdid; $_POST['plc_sourceid'] = $cret['plc_sourceid']; $time = explode('-',$_POST['time']); $_POST['start_time'] = strtotime(trim($time[0])); $_POST['end_time'] = strtotime(trim($time[1])); empty($_POST['title']) ? $_POST['title'] = '微信墙' : $_POST['title'] = $_POST['title']; empty($_POST['photo_name']) && 1 == $_POST['photo'] ? $_POST['photo_name'] = '照片' : $_POST['photo_name'] = $_POST['photo_name']; empty($_POST['bigwheel_name']) && 1 == $_POST['bigwheel'] ? $_POST['bigwheel_name'] = '大转盘' : $_POST['bigwheel_name'] = $_POST['bigwheel_name']; empty($_POST['lottery_name']) && 1 == $_POST['lottery'] ? $_POST['lottery_name'] = '抽奖' : $_POST['lottery_name'] = $_POST['lottery_name']; empty($_POST['vote_name']) && 1 == $_POST['vote'] ? $_POST['vote_name'] = '投票' : $_POST['vote_name'] = $_POST['vote_name']; empty($_POST['play_audio']) ? $_POST['play_audio']=0 : ''; empty($_POST['photo']) ? $_POST['photo']=0 : ''; empty($_POST['bigwheel']) ? $_POST['bigwheel']=0 : ''; empty($_POST['lottery']) ? $_POST['lottery']=0 : ''; empty($_POST['vote']) ? $_POST['vote']=0 : ''; empty($_POST['race']) ? $_POST['race']=0 : ''; $envelope = (int) Yii::app()->request->getPost('has_red_packet',0); if(1 == $_POST['bigwheel'] && !empty($_POST['bigwheel_keyword'])) $kword[] = $_POST['bigwheel_keyword']; if(1 == $_POST['lottery'] && !empty($_POST['lottery_keyword'])) $kword[] = $_POST['lottery_keyword']; if(1 == $_POST['vote'] && !empty($_POST['vote_keyword'])) $kword[] = $_POST['vote_keyword']; if(1 == $_POST['race'] && !empty($_POST['paoma_keyword'])) $kword[] = $_POST['paoma_keyword']; if(1 == $_POST['race'] && !empty($_POST['race_keyword'])) $kword[] = $_POST['race_keyword']; if($envelope == 1){ $kword[] = Yii::app()->request->getPost('red_packet_key_word'); } $iskword = 0; $syskeyword = array('0','1'); //系统关键字 /* 检测关键字是否重复 */ foreach ($kword as $k => $v) { if(in_array($v, $syskeyword)){ echo '“'.$v.'”是系统关键字,请重新输入!';exit(); } foreach ($kword as $ki => $vi) { if($k == $ki+1){ continue; } elseif($kword[$k] == $kword[$ki+1]) { $iskword = 1; } } } if ($iskword == 1) { echo '关键字重复!';exit(); } if(1 == $_POST['race']) { if(1 == $_POST['race_num'] && $_POST['race_option']) { $waste = array(); /* 根据页面样式查找需要过滤的key*/ foreach ($_POST['race_option']['sort'] as $k => $v) { $i = $k*3; $waste[] = $i+1; $waste[] = $i+2; } /* 过滤key*/ foreach ($waste as $k => $v) { unset($_POST['race_option']['type'][$v]); unset($_POST['race_option']['picurl'][$v]); unset($_POST['race_option']['title'][$v]); } /* 对过滤后的数组重新索引*/ $_POST['race_option']['type'] = array_values($_POST['race_option']['type']); $_POST['race_option']['picurl'] = array_values($_POST['race_option']['picurl']); $_POST['race_option']['title'] = array_values($_POST['race_option']['title']); } $req = Wall::model()->arrayRequired($_POST['race_option']); if(false === $req){ echo '“摇一摇跑马”添加奖项不能为空';exit(); } } //红包强逻辑 if($envelope == 1){ $red_packet_name = Yii::app()->request->getPost('name','');//红包活动名称 $sequence_valid_minute = (int) Yii::app()->request->getPost('sequence_valid_minute',10);//红包活动固定时间 $sequence_valid_minute_other = (int) Yii::app()->request->getPost('sequence_valid_minute_other');//其他时间 $game_valid_second = (int) Yii::app()->request->getPost('game_valid_second',10);//抢红包时间 $game_valid_second_other = (int) Yii::app()->request->getPost('game_valid_second_other');//其他时间 $valid_type = (int) Yii::app()->request->getPost('valid_type',1);//有效期类型 $valid_end_time = Yii::app()->request->getPost('valid_end_time','0000-00-00 00:00:00');//绝对有效期 $valid_day = (int)Yii::app()->request->getPost('valid_day',0);//相对有效期 $balance = Yii::app()->request->getPost('balance');//预算 $money_type = Yii::app()->request->getPost('money_type');//红包金额类型 $fixed_money = Yii::app()->request->getPost('fixed_money');//固定金额 $random_max_money = Yii::app()->request->getPost('random_max_money');//随机金额 $enumeration_money = Yii::app()->request->getPost('enumeration_money');//相随随机金额 $red_packet_id = Yii::app()->request->getPost('red_packet_id');//红包轮数主键 $red_packet_did = Yii::app()->request->getPost('red_packet_did');//被删除红包轮数 foreach($balance as $key => $value){ $type = $money_type[$key];//红包金额类型 if($type < 3){ continue; } else if($type == 3){ $emoney = array(); foreach($enumeration_money[$key] as $number => $money){ $emoney[] = number_format($money,2,'.',','); } $enumeration_money[$key] = json_encode($emoney); } else { echo '红包数据异常';exit(); } } } if(empty($id)) { /*校验关键字是否重复*/ $arr = KeywordReply::model()->checkKeyTags($_POST['keyword'], $this->sdid, $cret['plc_sourceid']); if($arr) { echo '关键词重复,请重新输入!';exit(); } $ret = Wall::model()->addWall($_POST, 'Wall'); /*插入关键字*/ $key = KeyWordReply::model()->addKeyTags($_POST['keyword'], $ret, $this->sdid, $cret['plc_sourceid'], '201'); $id = $ret; } else { if(0 == $_POST['examine']){ Wall::model()->updateWall(array('audit'=>0), array('wallid'=>$id,'plc_sourceid'=>$cret['plc_sourceid'], 'business_id'=>$this->sdid), 'WallUser'); } //删除旧关键词 $tag_del = KeywordReply::model()->delKtag(array('business_id' => $this->sdid, 'plc_sourceid' =>$cret['plc_sourceid'], 'custom_reply_id' => $id,'reply_type'=>201)); /*校验关键字是否重复*/ $arr = KeywordReply::model()->checkKeyTags($_POST['keyword'], $this->sdid, $cret['plc_sourceid']); if($arr) { echo '关键词重复,请重新输入!';exit(); } $aWhere = array('id'=>$id, 'plc_sourceid'=>$cret['plc_sourceid'], 'business_id'=>$this->sdid); $ret = Wall::model()->updateWall($_POST, $aWhere, 'Wall'); /*插入关键字*/ $key = KeyWordReply::model()->addKeyTags($_POST['keyword'], $id, $this->sdid, $cret['plc_sourceid'], '201'); } if ($this->check($ret)) { echo '编辑失败';exit(); } /* 附表操作*/ if(1 == $_POST['photo']) { $_POST['photo_id'] = $id; $albums_arr = array(); $albums_arr['photoid'] = $_POST['phout_list']; $albums_arr['url'] = $_POST['phout_url']; $albums_arr['title'] = $_POST['imagestexts']; $albums_arr['description'] = array(); if($albums_arr) { $result = Albums::model()->SavePictureByAlbumsId($albums_arr,$cret['plc_sourceid'],$this->sdid,$_POST['albums_id']); } $wall_photo = Wall::model()->getOneWall(array('photo_id'=>$id, 'business_id'=>$this->sdid, 'plc_sourceid'=>$cret['plc_sourceid']), 'WallPhoto'); if(empty($wall_photo)){ $photo = Wall::model()->addWall($_POST, 'WallPhoto'); }else{ $photo = Wall::model()->updateWall($_POST, array('photo_id'=>$id,'plc_sourceid'=>$cret['plc_sourceid'], 'business_id'=>$this->sdid), 'WallPhoto'); } } if(1 == $_POST['bigwheel']) { $_POST['bigwheel_id'] = $id; $req = Wall::model()->arrayRequired($_POST['bigwheel_option']); if(false === $req){ echo '“大转盘”添加奖项不能为空';exit(); } $_POST['bigwheel_option'] = json_encode($_POST['bigwheel_option']); $wall_bigwheel = Wall::model()->getOneWall(array('bigwheel_id'=>$id, 'business_id'=>$this->sdid, 'plc_sourceid'=>$cret['plc_sourceid']), 'Wallbigwheel'); if(empty($wall_bigwheel)){ $bigwheel = Wall::model()->addWall($_POST, 'Wallbigwheel'); }else{ $bigwheel = Wall::model()->updateWall($_POST, array('bigwheel_id'=>$id,'plc_sourceid'=>$cret['plc_sourceid'], 'business_id'=>$this->sdid), 'Wallbigwheel'); } } if(1 == $_POST['lottery']) { $_POST['lottery_id'] = $id; $req = Wall::model()->arrayRequired($_POST['lottery_option']); if(false === $req){ echo '“抽奖”添加奖项不能为空';exit(); } $_POST['lottery_option'] = json_encode($_POST['lottery_option']); $wall_lottery = Wall::model()->getOneWall(array('lottery_id'=>$id, 'business_id'=>$this->sdid, 'plc_sourceid'=>$cret['plc_sourceid']), 'WallLottery'); if(empty($wall_lottery)){ $lottery = Wall::model()->addWall($_POST, 'WallLottery'); }else{ $lottery = Wall::model()->updateWall($_POST, array('lottery_id'=>$id,'plc_sourceid'=>$cret['plc_sourceid'], 'business_id'=>$this->sdid), 'WallLottery'); } } if(1 == $_POST['vote']) { $_POST['vote_id'] = $id; $wall_vote = Wall::model()->getOneWall(array('vote_id'=>$id, 'business_id'=>$this->sdid, 'plc_sourceid'=>$cret['plc_sourceid']), 'WallVote'); if(empty($wall_vote)){ $vote = Wall::model()->addWall($_POST, 'WallVote'); } else { $vote = Wall::model()->updateWall($_POST, array('vote_id'=>$id,'plc_sourceid'=>$cret['plc_sourceid'], 'business_id'=>$this->sdid), 'WallVote'); } } if(1 == $_POST['race']){ $_POST['race_id'] = $id; $_POST['race_option'] = json_encode($_POST['race_option']); $wall_race = Wall::model()->getOneWall(array('race_id'=>$id, 'business_id'=>$this->sdid, 'plc_sourceid'=>$cret['plc_sourceid']), 'WallRace'); if(empty($wall_race)){ $race = Wall::model()->addWall($_POST, 'WallRace'); } else { $race = Wall::model()->updateWall($_POST, array('race_id'=>$id,'plc_sourceid'=>$cret['plc_sourceid'], 'business_id'=>$this->sdid), 'WallRace'); } } //红包 if(1 == $envelope){ //更新活动 if(is_array($balance) && !empty($balance)){ $sequence = 1; foreach($balance as $balance_key => $balance_money){ $params = array(); $params['pid'] = $aid; $params['wall_id'] = $id; $params['sequence'] = $sequence; $params['name'] = $red_packet_name; $params['sequence_valid_minute'] = $sequence_valid_minute == 0 ? (int) $sequence_valid_minute_other : (int) $sequence_valid_minute; $params['game_valid_second'] = $game_valid_second == 0 ? (int) $game_valid_second_other : (int) $game_valid_second; $params['balance'] = $balance_money; $params['money'] = isset($fixed_money[$balance_key]) ? $fixed_money[$balance_key] : 0.00; $params['random_min_money'] = 0.01; $params['random_max_money'] = isset($random_max_money[$balance_key]) ? $random_max_money[$balance_key] : 0.00; $params['enumeration_money'] = isset($enumeration_money[$balance_key]) ? $enumeration_money[$balance_key] : 0.00; $params['valid_type'] = $valid_type; $params['valid_end_time'] = empty($valid_end_time) ? '0000-00-00 00:00:00' : date('Y-m-d 23:59:59',strtotime($valid_end_time)); $params['valid_day'] = $valid_day; if(isset($red_packet_id[$balance_key])){ $where = array( 'pid' => $aid, /*'sequence_status' => 0,*/ 'id' => (int) $red_packet_id[$balance_key] ); Wall::model()->updateDataInfo('{{wall_red_packet}}',$params,$where); } else { $params['money_type'] = $money_type[$balance_key]; $params['flag'] = 0; $params['sequence_status'] = 0; $params['create_time'] = date('Y-m-d H:i:s'); Wall::model()->insertDataInfo('{{wall_red_packet}}',$params); } $sequence++; } $red_packet_info = Wall::model()->getAllDataInfo('{{wall_red_packet}}',array('pid'=>$aid,'wall_id'=>$id, 'flag' => 0)," sequence asc"); $rd = EasyRedis::getInstance('wall'); $red_key = "{$aid}_{$id}_sequencelist"; $rd->hSet($red_key,$id,json_encode($red_packet_info)); } //删除活动 if(!empty($red_packet_did)){ $red_packet_did = explode(',',$red_packet_did); foreach($red_packet_did as $del_id){ if(!empty($del_id) && $del_id > 0){ Wall::model()->updateDataInfo('{{wall_red_packet}}',array('flag'=>1),array('pid'=>$aid,'id'=>$del_id)); } } } } echo json_encode(array('errno'=>'0','error'=>'编辑成功!','url' =>'/Wewall/Index?aid='.$aid)); return ; } }
微渠道
点球大战
鹊桥相会
大转盘
优惠劵
刮刮卡
老版圣诞活动
一战到底
砸金蛋
2048
暖男躲避战
圣诞活动
疯狂划算
拆礼盒
彩票推广
红包
全民经纪人
新年活动
微助力
童年回忆
设计原型
相关文章推荐
- 社交巨头三国杀:微信、WhatsApp、Line到底有啥区别?
- 微信悄悄升级群聊功能:个人微信营销号的福音
- 我是运营,我没有假期
- 如何做到日消息量100万的微信公众号?
- 论微信取消推送功能的可能性(原创)
- 如何成为一名专家级的开发人员
- 微信的成功,靠的是QQ导流吗?
- 企业邮局 营销新势力
- 微信服务号推送模板消息接口
- PHP限制页面只能在微信自带浏览器访问的代码
- .NET微信公众号开发之公众号消息处理
- 使用nodejs开发cli项目实例
- HTML5实现微信拍摄上传照片功能
- 微信小程序去哪里找 小程序到底如何使用(附小程序名单)
- 使用jQuery.wechat构建微信WEB应用
- nodejs开发微博实例
- Egret引擎开发指南之创建项目