微信营销平台开发总结p公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-下面将一步步来实现微信公众平台的开发设置了开发者模式的url和token后我们就可以进行开发了Token你自己随便设置一、我们要先验证消息的是否来自微信当然这部也可以省略实现如下开发者接收用户消息的时候,微信服务器将发送GET请求到填写的URL 上,并且带上四个参数(signature、timestamp、nonce、echostr),开发者通过对签名(即signature)的效验,来判断此条消息的真实性。
Signatur:微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数Timestamp:时间戳Nonce:随机数Echostr:随机字符串验证代码:$signature = $_GET["signature"];$timestamp = $_GET["timestamp"];$nonce = $_GET["nonce"];$token = TOKEN;//这个是你自己设置的token$tmpArr = array($token, $timestamp, $nonce);sort($tmpArr, SORT_STRING);$tmpStr = implode( $tmpArr );$tmpStr = sha1( $tmpStr );if( $tmpStr == $signature ){return true;}else{return false;}二、接受发送的消息当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
$xml = new SimpleXMLElement($xml); //创建xml对象foreach ($xml as $key => $value) {$data[$key] = strval($value);}将xml中的标签放到$data的键中内容放到值中以文本信息为例<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[this is a test]]></Content></xml>如果我们想要的到用户发送的文本内容,使用$data[‘Content’] 就可以得到通过 MsgType可以得到发送的信息类型有 text image voice video link location event还有一些事件例如关注取消关注等 xml中会有一个Event 标签类型有:包括subscribe(订阅)、unsubscribe(取消订阅)、CLICK(自定义菜单的点击事件) SCAN扫描你可以通过判断$data[‘MsgType] 和 $data[‘Event‘] 来根据自己的数据库或设计好的回复内容来进行操作三、对于回复的信息你需要echo 一个xml字符串回复的格式在文档中也可以找到$retTMP = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>0</FuncFlag></xml>";//对消息模版中的通配符进行替换$resultStr =sprintf($retTMP,$fromUserName,$toUserName,time(),$retMsg);//输出XML中的描述echo $resultStr;四、调用接口微信中有许多多接口例如发送客服消息获得用户信息列表分组等这些怎么实现呢?这些其实就是为了让我们得到自己粉丝的信息我们好存在自己的数据库中首先我们看到这些接口链接都需要,可能有些人不知道这个怎么获得。
其实这个有时通过接口请求获得一个的,但是首先你要确定你的公众好是服务号有Appid和AppSecret首先我们要有两个函数用来请求接口function curlGet($url){$result = file_get_contents($url);if (empty($result)){$ch = curl_init();curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt ($ch, CURLOPT_URL, $url);curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);$result = curl_exec($ch);curl_close($ch);}$return = json_decode($result,true);return $return;}public function curlPost($url,$Referer,$data) {$header = array('Accept:*/*','Accept-Charset:utf-8;q=0.7,*;q=0.3','Accept-Encoding:gzip,deflate,sdch','Accept-Language:zh-CN,zh;q=0.8','Connection:keep-alive','Referer:'.$Referer,'X-Requested-With:XMLHttpRequest'//,// 'Content-Type:application/x-www-form-urlencoded');$curl = curl_init(); //启动一个curl会话curl_setopt($curl, CURLOPT_URL, $url); //要访问的地址curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //设置HTTP 头字段的数组curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); //对认证证书来源的检查curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); //从证书中检查SSL加密算法是否存在//curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); //使用自动跳转curl_setopt($curl, CURLOPT_AUTOREFERER, 1); //自动设置Referercurl_setopt($curl, CURLOPT_POST, 1); //发送一个常规的Post请求curl_setopt($curl, CURLOPT_POSTFIELDS, $data); //Post提交的数据包curl_setopt($curl, CURLOPT_TIMEOUT, 30); //设置超时限制防止死循环curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //获取的信息以文件流的形式返回curl_setopt($curl, CURLOPT_SSLVERSION,3);$result = curl_exec($curl); //执行一个curl会话curl_close($curl); //关闭curl$return = json_decode($result,true);return $return;}这两个一个是get方式请求一个是post方式请求由于微信返回的信息基本都是json格式所以我们在函数内部已经将json变成了数组获得ACCESS_TOKEN的方法得到AppId和 AppSecret $appid $appsecret$result=$this->curlGet($url_get);if(isset($result['errcode'])){//请求出现错误可以查看手册中的基础支持中的全局返回码说明}$ACC_TOKEN = $result['access_token'];得到token后我们就可以请求接口了以关注者列表或粉丝的详细信息为例:我们可以把粉丝放到自己的数据库中这样以后操作就会方便很多$list=$this->curlGet($getURL);if(isset($list['errcode'])){//获取失败}if(isset($list['count']) && !$list['count']){//未发现新的粉丝");}下面我们就可以根据列表来请求得到每个粉丝的具体信息foreach($list['data']['openid'] as $openid){//获取用户信息$indata[]=$this->curlGet($url_info);}$indata里面存储就是每个粉丝的信息,然后我们在获得粉丝所在分组的信息foreach($indata as $key=>$data){$datagg=array();$datagg["openid"]=$data['openid'];$datagg=json_encode($datagg); //看手册接口的请求的POST参数要json格式$re_group=$this->curlPost($url_group,$refer,$datagg);$data[$key]['group']=$re_group['groupid'];}这样就可以得到粉丝的所在分组其他接口形式都是和上面差不多所区别的就是注意是GET还是POST以及参数的格式。