【微信公众平台开发】之二:高级功能开发(基于SAE)

导引:选择BAE还是SAE

*BAE3.0使用git推送每次修改非常爽,

本地修改>推送到oschina(自己留念)和BAE>点击发布>实际测试;

但是没有在线代码编辑功能!!中间出现问题就很坑爹,得重来一遍。

*SAE缺点是不能使用git,但可以在线编辑!(很多时候只是想验证新想法,在线编辑非常有用)。还有SAE可以上传多个版本的代码,比如版本1设为默认发布,版本2调试新功能a,版本3调试新功能b。而且不同版本可独立访问,调试起来非常方便。我一般先用“微信开发测试小助手”测试新功能可用,再将其添加到默认版本。

*微信开发模式页面需要填写服务器URL和Token,如果BAE可以多个版本共存,那么微信接口可以在SAE和BAE之间随意切换,而且BAE的版本回退好像有点问题。

*综上,BAE很坑,用SAE吧

0、资料

0.1、五星PHP+新浪SAE平台免费搭建微信公众帐号平台消息接口,实现查天气、无(http://coolwb.com/2460.html)

0.2、微信本地调试工具“Fiddler”(没用过)以及“微信开发测试小助手”(推荐这个);

1、对各类信息的回复以及图文回复

<?php
/**
  * wechat php test
  * 主要用于本机测试
  * by Jason
  * 2014.9.17
  */

//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
//$wechatObj->valid(); 注释掉验证函数
$wechatObj->responseMsg();//调用回复信息方法

class wechatCallbackapiTest
{
	public function valid()
    {
        $echoStr = $_GET["echostr"];

        //valid signature , option
        if($this->checkSignature()){
        	echo $echoStr;
        	exit;
        }
    }

    public function responseMsg()
    {
		//get post data, May be due to the different environments
		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

      	//extract post data
		if (!empty($postStr)){
                /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
                   the best way is to check the validity of xml by yourself */
                libxml_disable_entity_loader(true);
              	$postObj = simplexml_load_string($postStr, ‘SimpleXMLElement‘, LIBXML_NOCDATA);
                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
                $keyword = trim($postObj->Content);
                $time = time();

				//type为消息类型,customevent为事件类型
				$type =$postObj->MsgType;
				$customevent =$postObj->Event;
				//经纬度
				$weiDu = $postObj->Location_X;
				$jingDu= $postObj->Location_Y;

                $textTpl = "<xml>
							<ToUserName><![CDATA[%s]]></ToUserName>
							<FromUserName><![CDATA[%s]]></FromUserName>
							<CreateTime>%s</CreateTime>
							<MsgType><![CDATA[%s]]></MsgType>
							<Content><![CDATA[%s]]></Content>
							<FuncFlag>0</FuncFlag>
							</xml>";          
				//接收事件推送,关注事件
				if($type=="event" and $customevent=="subscribe"){
					$msgType = "text";
					$contentStr="感谢您的关注\n回复menu 查看本菜单\n回复1 查看联系方式\n回复2 查看小道消息\n回复3 查看办公地址\n回复图片查看新闻";
					$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
					echo $resultStr;
				}
				//单图文test,执行本句之后不再执行switch语句
            	//$this->replyNews1($fromUsername, $toUsername, $time);
				//接收普通消息
				switch($type){
					//文本消息
                    //文本消息0不适合在本地软件调试
					case "text":{
						if(!empty( $keyword )){
							//关键词回复
							if($keyword=="menu"){
								$contentStr="感谢您的关注\n回复menu 查看本菜单\n回复1 查看联系方式\n回复2 查看小道消息\n回复3 查看办公地址\n回复news 查看新闻";
							}else if($keyword==1){
								$contentStr="联系方式:1007511108";
							}else if($keyword==2){
								$contentStr="小道消息正在加载,请稍候……";
							}else if($keyword==3){
								$contentStr="办公地址:大学城中心湖水下5米";
                            }else if($keyword=="news"){
                                $contentStr="";//设字符串为空
                                $this->replyNews1($fromUsername, $toUsername, $time);
                            }else{
								$contentStr="this is not a legal keyword,please try again";
                                
							}
						}else{
							$contentStr="输入为空";
						}
						break;
					}
					//图片消息
					case "image":
						$contentStr="这张图真好看";
						break;
					//语音消息
					case "voice":
						sleep(2);
						$contentStr="嗯……你声音真好听";
						break;
					//视频消息
					case "video":
						sleep(3);
						$contentStr="这部片子不是我喜欢的类型";
						break;
					//地理位置消息
					case "location":{
						$contentStr="你的纬度是{$weiDu},经度是{$jingDu},捕食者1号已锁定目标!";
						break;
					}
					//链接消息
					case "link":
						$contentStr="你确定发送的链接没有病毒??";
						break;
					//消息不是以上类型
					default:
						$contentStr="此项功能尚未开发";
						break;
				}
				//统一输出
				$msgType = "text";
				$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
				echo $resultStr;

        }else {
        	echo "";
        	exit;
        }
    }
	//发送消息
	//音乐回复
	function replyMusic(){
	}
	//单图文回复
	function replyNews1($fromUsername, $toUsername, $time){
		$newsTpl="<xml>
					<ToUserName><![CDATA[%s]]></ToUserName>
					<FromUserName><![CDATA[%s]]></FromUserName>
					<CreateTime>%s</CreateTime>
					<MsgType><![CDATA[news]]></MsgType>
					<ArticleCount>1</ArticleCount>
					<Articles>
					<item>
					<Title><![CDATA[食品安全关乎人民群众的切身利益]]></Title> 
					<Description><![CDATA[这个news很难Description]]></Description>
					<PicUrl><![CDATA[http://lawlietfans.duapp.com/picture/big1.png]]></PicUrl>
					<Url><![CDATA[http://www.baidu.com]]></Url>
					</item>

					</Articles>
					</xml> ";
		$resultStr = sprintf($newsTpl, $fromUsername, $toUsername, $time);
		echo $resultStr;
	}
	//多图文回复
	function replyNews2(){
	}

	private function checkSignature()
	{
        // you must define TOKEN by yourself
        if (!defined("TOKEN")) {
            throw new Exception(‘TOKEN is not defined!‘);
        }
        
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        
		$token = TOKEN;
		$tmpArr = array($token, $timestamp, $nonce);
        // use SORT_STRING rule
		sort($tmpArr, SORT_STRING);
		$tmpStr = implode( $tmpArr );
		$tmpStr = sha1( $tmpStr );

		if( $tmpStr == $signature ){
			return true;
		}else{
			return false;
		}
	}
}

?>

2、API

2.1、图灵机器人

这是我发现的最好的免费智能机器人,查看(http://www.tuling123.com)的帮助文档按照步骤做即可,很简单。

然后解析api返回的json数据即可:

$apiStr = file_get_contents($url); 
$apiObj =json_decode($apiStr);
$contentStr = $apiObj->text;

2.2、LBS开发:百度地图
占位

3、数据库

官方文档(http://sae.sina.com.cn/doc/php/mysql.html)

试图在SAE平台使用BAE中的数据库是行不通的(我还傻傻想为什么),在那家平台就当然要用那家数据库;

首先参考(四星http://blog.csdn.net/zh379835552/article/details/39160967)

和(五星http://www.cnblogs.com/mchina/p/3332283.html)进入mysqlMyAdmin控制台;

接着创建表weixin并插入数据

CREATE TABLE IF NOT EXISTS `weixin` (

`id` int(8) NOT NULL AUTO_INCREMENT,

`title` varchar(255) NOT NULL,

`content` varchar(255) NOT NULL,

PRIMARY KEY (`id`)

)

-- 转存表中的数据 `weixin`

INSERT INTO `weixin` (`id`, `title`, `content`) VALUES

(1, ‘中国合伙人‘, ‘导演:陈可辛;编剧:张冀‘),

(2, ‘死亡笔记‘, ‘导演:dy;编剧:bj‘);

接着编辑php代码,运行即可成功(注释详细,一看就会)

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
 <head>
   <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
  <title>database data test</title>
 </head>
 <body>
<?php
//echo "Welcome to Sina Cloud";
//SAE的mysql是utf8编码的所以需要在meta标签中指定页面的charset为utf-8
//从环境变量中取出数据库所要的参数
    $host=getenv(‘SAE_MYSQL_HOST_M‘);
    $port=getenv(‘SAE_MYSQL_PORT‘);
    $user=getenv(‘SAE_MYSQL_USER‘);
    $pwd=getenv(‘SAE_MYSQL_PASS‘);
/***配置数据库名称,全局名MYSQLNAME或者$dbname ***/
 define("MYSQLNAME", "sNAwDmdhLkhSLCmATYsf");
 $dbname=‘app_lawlietfans‘;
//定义好的参数
/*接着调用mysql_connect()连接服务器,可以用上面赋值之后的host、port、user、pwd来替代这里的参数*/
$link = mysql_connect(SAE_MYSQL_HOST_M.‘:‘.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
if(!$link) {
      die("Connect Server Failed: " . mysql_error());
    }
/*连接成功后立即调用mysql_select_db()选中需要连接的数据库*/
if(!mysql_select_db($dbname,$link)) {
      die("Select Database Failed: " . mysql_error($link));
    }
/*至此连接已完全建立,就可对当前数据库进行相应的操作了*/
    /*!!!注意,无法再通过本次连接调用mysql_select_db来切换到其它数据库了!!!*/
    /* 需要再连接其它数据库,请再使用mysql_connect+mysql_select_db启动另一个连接*/
     
    /**
    * 接下来就可以使用其它标准php mysql函数操作进行数据库操作
    */

//检索数据
    $sql = "select * from weixin";
    $rs = mysql_query($sql, $link);
    if ($rs === false) {
        die("Select Failed: " . mysql_error($link));
    } else {
        echo "Select Succeed<br />";
        while ($row = mysql_fetch_assoc($rs)) {
            echo "{$row[‘id‘]} {$row[‘title‘]} {$row[‘content‘]}<br />";
        }
    }
 ?>
 </body>
</html>

接着在做一个查询电影的功能也很简单。

4、超链接调用其他wap站应用

对工具类的功能来说,与其在微信中找各种接口不如直接调用其他wap站更好,(http://r2.mo.baidu.com/webapp_html.php?version=4_0&fn=webpage_flash)有一些wap站可以参考,推荐(http://m.46644.com/tool/);

有了这些链接,可以以超链接或者图文消息

(若“text”格式则需要XML转义字符:

< &lt;
> &gt;
& &amp;
‘  &apos;
" &quot;

)的形式引导用户直接访问需要的功能。(当然,如果有自己的wap站点更好。也可使用百度siteapp将普通站点一件转换为wap站)

5、缓存

如果要实现二级菜单,需要记住用户当前在菜单逻辑中的位置。微信服务器不支持cookie和session,使用数据库速度太慢,所以要使用缓存来实现此功能。

文档(http://sae.sina.com.cn/doc/php/memcache.html);

实现图灵机器人智能聊天和普通功能之间的切换;(得瑟下,效果非常好\(^o^)/)

//初始化SAE的缓存
 $mem=memcache_init();
 if($mmc==false)
   echo "mc init failed\n";
 $strUser = $mem->get($fromUsername."key");//获取缓存值
 //接下来修改前面代码case “text” 部分
 case "text":{
                        if(empty($strUser)){
                            if($keyword=="chat"){
                                //设置缓存变量$fromUsername."key"
                                $mem->set($fromUsername."key",$fromUsername."chat",$flag=0,$expire=0);
                                $contentStr="开始和luffy君进行对话,输入#退出聊天";
                            }else if($keyword=="menu"){
								$contentStr="回复menu 查看本菜单\n回复1、2、3、news查看消息\n回复chat和luffy君聊天";
							}else if($keyword==1){
								$contentStr="联系方式:1007511108";
							}else if($keyword==2){
								$contentStr="小道消息正在加载,请稍候……";
							}else if($keyword==3){
								$contentStr="办公地址:大学城中心湖水下5米";
                            }else if($keyword=="news"){
                                $contentStr="";//设字符串为空
                                $this->replyNews1($fromUsername, $toUsername, $time);
                            }else{
                            	$contentStr="回复menu 查看本菜单\n回复1、2、3、news查看消息\n回复chat和luffy君聊天";
                            }
                        }
                        else {
                            if($keyword=="#"){
                            	$contentStr="已经退出聊天,输入chat重新开始聊天";
                                $strUser=$mem->delete($fromUsername."key");
                            }else{
                                //判断是否为同一用户发送聊天请求
                                if($strUser==$fromUsername."chat"){
                                    $apiKey = "你的API key"; 
                                    $apiURL = "http://www.tuling123.com/openapi/api?key=KEY&info=INFO";
                                    // 设置报文头, 构建请求报文 
                                    //header("Content-type: text/html; charset=utf-8"); 
                                    $url = str_replace("INFO", $keyword, str_replace("KEY", $apiKey, $apiURL)); 
    
                                    // 用file_get_contents 以get方式获取内容
                                    //读取json类型数据
                                    $apiStr = file_get_contents($url); 
                                    $apiObj =json_decode($apiStr);
                                    $contentStr = $apiObj->text; 
                                }
                            }
                        }
						break;
					}

6、补充

学习别人的优秀框架:(http://sae.sina.com.cn/?m=appstore&category=2)

其中第一个开源到github,fork之后有空研究。在此感谢作者。

时间: 2024-11-03 20:58:19

【微信公众平台开发】之二:高级功能开发(基于SAE)的相关文章

微信公众平台开放 9 大高级接口,它有什么意义?

微信刚刚更新公众平台,向服务号开放微信认证,开放 9 大高级接口,增加开发者问答系统,并对微信公众平台的后台管理界面进行改版. 其中最受关注的是微信向开发者开放的九大高级接口.这些接口为: 语音识别接口 客服接口 OAuth2.0 网页授权接口 生成带参数的二维码接口 获取用户地理位置接口 获取用户基本信息接口 获取关注者列表接口 用户分组接口 上传下载多媒体文件接口 上图中,微信官方对九大接口作了详细的介绍.我们一起来看看微信开放这些接口有什么意义. 1. 语音识别 描述:通过语音识别接口,用

04微信公众平台 - 实现【翻译】功能函数,返回一个文本字符串。

一.功能代码函数实现 private function _baiduDic($keyword) { $tranurlaip = "http://openapi.baidu.com/public/2.0/bmt/translate?client_id=9peNkh97N6B9GGj9zBke9tGQ&q={$keyword}&from=auto&to=auto"; //翻译URLapi地址 $transtr = file_get_contents($tranurl

05微信公众平台 - 实现【点歌】功能函数,返回一个文本字符串。

一.功能代码函数实现 /* * 功能5:根据歌名点歌功能,输入歌名即可,传入参数为输入对象$postObj */ private function _listenMusic($postObj) { $ret= "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTi

微信公众平台自定义菜单及高级接口PHP SDK

本文介绍介绍微信公众平台自定义菜单及高级接口的PHP SDK及使用方法. 作者 方倍工作室 修正记录: 2014.05.03 v1.0 方倍工作室 http://www.cnblogs.com/txw1958/ SDK 源码: 1 /* 2 方倍工作室 http://www.cnblogs.com/txw1958/ 3 CopyRight 2014 www.doucube.com All Rights Reserved 4 */ 5 6 class class_weixin_adv 7 { 8

微信公众平台体验(二)JS-SDK

申请两三天了,还没有审核通过,先看一下一些文档吧,感受下微信的新Feature吧: 微信公众平台今日面向开发者开放微信内网页开发工具包(微信JS-SDK). 通过微信JS-SDK提供的11类接口集,开发者不仅能够在网页上使用微信本身的拍照.选图.语音.位置等基本能力,还可以直接使用微信分享.扫一扫.卡券.支付等微信特有的能力,为微信用户提供更优质的网页体验. 微信JS-SDK主要包含以下能力: 1.分享类接口 支持获取"分享到朋友圈"."发送给朋友"."分

ASP.NET 微信公众平台模板消息推送功能完整开发

最近公众平台的用户提出了新需求,他们希望当收到新的邮件或者日程的时候,公众平台能主动推送一条提醒给用户.看了看平台提供的接口,似乎只有[模板消息]能尽量满足这一需求,但不得不说微信提供的实例太少,而且只有PHP的,不过摸索了一下还是成功的实现了. 首先是准备工作,需要申请开通[模板消息]功能,网上教程很多.然后申请通过之后,用户可以从现有的模板里选择15个使用,也可以自己添加模板使用.这里吐槽一下:申请添加新的模板时,微信出于保护用户的目的禁止了一些“看起来会很频繁”的消息类型,比如这图里的——

微信公众号聊天室 H5私聊功能开发 带推送提醒功能

微聊聊天室是专门针对微信公众号.H5开发的一款聊天室, 可群发计划.私聊, 群房间数无限制, 部署在您自己的服务器上, 有需要的联系我 qq: 445899710 微信 hype522147 下图是俩功能 1. 点击头像和用户私聊 2. 点击顶部联系管理菜单, 主动与客服管理私聊 效果图预览 原文地址:https://www.cnblogs.com/ccjin/p/11361114.html

微信公众平台新增投票组件化功能

公众平台投票组件功能已上线.该功能在支持公众号发起简单投票基础上,更可满足其发放调研问卷的需求.此后公众号可通过群发.自定义菜单.自动回复等多渠道发布投票并统一管理投票. 主要功能更新如下: 1. 投票一旦创建可多次使用:投票组件页面与图文消息编辑页都可新建投票,并通过群发.自定义菜单.自动回复等多渠道发出. 2. 投票问题与选项升级:每个投票可插入多个问题,且每个问题的选项均支持插入图片. 3. 统一管理所有投票:投票管理页面可对所有投票进行删除和查看详情操作.

Delphi XE7 用indy开发微信公众平台(9)- 高级群发接口

高级群发接口 1.上传多媒体文件(这里以上传图片为例) uses IdMultipartFormData; const UpMediaUrl = 'http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=%s'; function UpMedia(AccessToken, MediaType, MediaFile: String): String; var J: TJSONObject; Url: Strin

微信公众平台带参数二维码配置工具的实现

配置带参数的二维码同样需要先获取Access Token,获取方法在上一篇文章中有描述:http://www.cnblogs.com/leoyoungblog/p/5032249.html. 利用获取到的Access Token,可以创建二维码的Ticket.通过POST方法向服务器提交相关信息,JS代码如下: 1 function getTicket() 2 { 3 var url = "qrcode_manage.php?access_token="+$("#access