完整的微信公众平台开发2

24天前写了这个系列的第一篇,后面老大要求用php,后来就改php。这20几天进步缓慢,但还是进步了些,这里把学到的“干货”,奉献给大家,有兴趣的朋友扫描下面的二维码关注我的学习,求指导,求批评。


微信的基本流程,实例解析自动回复,是今天我想整理的。后面的连接数据库,百度地图API调用,大转盘等,都在施工中。求关注,求督促。

微信和公众平台的交流是以xml为载体,采用一问一答的方式进行。把这句话记清楚,因为很重要。下面开始第一个实例“被关注时自动回复”的解释。(....注意我用的是解释,原创属于"青龙老贼",对于只想和用户进行简单交流的朋友,其实把编辑模式用熟练了,基本的业务就OK了)。

我们需要一个自己的微信公众号和一个SAE开发平台。还有对xml和php有一定的了解。在下面的文档中有非常详细的介绍,在此感谢青龙老哥的分享。

http://download.csdn.net/detail/bailin710258/6325203

认真看完这两篇文档,相信大家一定已经实现了,被关注时自动回复文字的功能。在这里我只理清下思路:

1、接口的配置

在开发模式界面下载wx_sample-->解压后上传到自己的服务器-->更改TOKEN的值。接口配置中的参数

url: 你的服务器/wx_sample.php

Token:token的值。

配置完成了wx_sample.php可以情清空(不是删除)为什么要这样做呢?我们来看这个文件的代码

<?php
/**
  * wechat php test
  */

//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();

class wechatCallbackapiTest
{//验证签名和接口
	public function valid()
    {//获得由get方法传来的表单中name属性为‘echostr’的值,并将其赋值给变量$echoStr
        $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)){
                
              	$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
                $keyword = trim($postObj->Content);
                $time = time();
                $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(!empty( $keyword ))
                {
              		$msgType = "text";
                	$contentStr = "Welcome to wechat world!";
                	$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                	echo $resultStr;
                }else{
                	echo "Input something...";
                }

        }else {
        	echo "";
        	exit;
        }
    }
		
	private function checkSignature()
	{
        $signature = $_GET["signature"];//加密签名
        $timestamp = $_GET["timestamp"];//时间戳
        $nonce = $_GET["nonce"];	//随机数
        		
		$token = TOKEN;
		$tmpArr = array($token, $timestamp, $nonce);
		sort($tmpArr);//排序
		$tmpStr = implode( $tmpArr );//拼接
		$tmpStr = sha1( $tmpStr );//验证,如果成功,则返回所计算的 SHA-1 散列,如果失败,则返回 false。
		
		if( $tmpStr == $signature ){
			return true;
		}else{
			return false;
		}
	}
}

?>

由以上代码可知,当你在微信公众平台,填上url和token并提交后,平台就会向url所在的地址发个get请求,其中包括了时间戳、随机数等参数。你的服务器等到这些参数后会结合token进行验证,验证通过则原样返回$echoStr(随机字符串)这个参数,反之则什么都不返回。所以掌握原理后我们只姚这几行代码就能通验证


2、消息的自动回复

首先得重复下句话:微信和公众平台的交流是以xml为载体,采用一问一答的方式进行当普通微信用户向公众账号发消息时,微信服务器将以xml的形式通过POST方法将该消息发送到填写的URL上。具体的格式和讲解,见文档。再次感谢青龙老哥无私的分享。下面我对文本消息做个整理。

 <xml>
 <ToUserName><![CDATA[toUser]]></ToUserName>
 <FromUserName><![CDATA[fromUser]]></FromUserName> 
 <CreateTime>1348831860</CreateTime>
 <MsgType><![CDATA[text]]></MsgType>
 <Content><![CDATA[this is a test]]></Content>
 <MsgId>1234567890123456</MsgId>
 </xml>
参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgTypetext
Content文本消息内容
MsgId消息id,64位整型

接发流程是这样的 微信消息《--》微信服务器《--》你的服务器。微信服务器和你服务器之间的较量是通过xml进行的,所以你服务器接收和发送微信的过程就是已经解析和封装xml的过程。成为开发者后,在自己的服务端加上下面两个文件就能实现”被关注时自动回复“,详解见注释

<?php
//此类包含用到的微信信息的xml格式

$textType="<xml>
			<ToUserName><![CDATA[%s]]></ToUserName>
            <FromUserName><![CDATA[%s]]></FromUserName>
            <CreateTime>%s</CreateTime>
            <MsgType><![CDATA[%s]]></MsgType>
            <Content><![CDATA[%s]]></Content>
            <FuncFlag>0</FuncFlag>
            </xml>";


 ?>
回复信息的类

<?php
//装载信息模板
include_once("message_type.php");
//解析微信服务器发送来的xml信息
$messageStr = $GLOBALS["HTTP_RAW_POST_DATA"];

if(!empty($messageStr)){
    //生成信息对象
    $messageObj = simplexml_load_string($messageStr,'SimpleXMLElement',LIBXML_NOCDATA);
    //提取有用信息
    $fromUsername = $messageObj->FromUserName;
    $toUsername = $messageObj->ToUserName;
    $form_MsgType = $messageObj->MsgType;//从微信服务器获得的信息类型
    
    //事件信息
    if($form_MsgType=="event"){
        //获取事件类型
        $from_Event = $messageObj->Event;
        //被关注事件
        if($from_Event=="subscribe"){
            //拼装个xml格式的信息用于回复
            //方法-: 调用模板(message_type.php)用函数拼装,注意收信方和发信方交换了
            $msgType="text";
            $contentStr="谢谢你的关注!";
            $responseStr = sprintf($textType,$fromUsername,$toUsername,time(),$msgType,$contentStr);
            echo $responseStr;
        	exit;
           
            //方法二 也可以自己直接拼装个xml 以后的图文信息这两种方法也适合
            
            
        }
    }
    
    
}
else{
	echo "";
    exit;
}

?>













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值