欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

微信公众号开发(入门级)

程序员文章站 2024-01-24 08:59:40
...

微信公众平台提供了,订阅号,服务号,企业号,小程序供开发者选择。(具体看官方文档)

注册时使用邮箱,一个邮箱注册一个公众号,注册成功后可更改。

客户端(用户) 向微信服务器发送消息,我们希望获取到这个消息,就需要自己的服务器和微信服务器建立联系。

以新浪云为例。

创建应用后,得到一个域名

建立联系:使用Token

index.php


<?php


/**  * wechat php test  */
//define your token
define("TOKEN", "在微信公众平台设置的token");
$wechatObj = new wechatCallbackapiTest();

//调用对象下的一个成员方法
$wechatObj->valid();

//$wechatObj->responseMsg();
class wechatCallbackapiTest{
	public function valid()   {
		//获得get方式 传过来的 echostr
        $echoStr = $_GET["echostr"];        
		//valid signature , option     
		
		//调用了类里面的成员方法 checkSignature
		if($this->checkSignature()){       
			echo $echoStr;        
			exit;      
		}    
	}  
		private function checkSignature(){ 
			//检测Token 是否定义,若没,抛出一个异常
			
			if(!defined("TOKEN")){
				throw new Exception('TOKEN is not defined!');
			}
			
			//签名,微信的服务器端,发过来的签名
			//重点就是对比,我们产生的签名和微信传过来的是否一致
			$signature = $_GET["signature"];  
				
			//unix时间戳 time() 得到服务器端穿过来的unix时间戳
			$timestamp = $_GET["timestamp"]; 
			//随机的字符串
			$nonce = $_GET["nonce"];
			
			//将常量TOKEN 赋值给 $token
			$token = TOKEN;
			//将常量TOKEN 放入到以个数组
			$tmpArr = array($token, $timestamp, $nonce); 
			
			//将 $tmpArr这个数组的值,视为字符串进行排序
			sort($tmpArr,SORT_STRING);
			//implode 将数组里的值 按照指定的 字符串连接起来
			$tmpStr = implode( $tmpArr );
			$tmpStr = sha1( $tmpStr );
			
			
			if( $tmpStr == $signature ){
				return true; }
				
				else{return false; } 
				
		} 
				
	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;        
		}    
	}
		
}	
?>

若验证成功,会提示token配置成功。

检验:将 

$wechatObj->valid();

注释

$wechatObj->responseMsg();

向公众号发送消息。

回复 

Welcome to wechat world!
即证明成功

2.使用微信公众平台提供的接口

使用接口之前,需要access_token 这个凭证。该凭证根据appid 和appsecret 生成。

每个凭证有效时间为7200s,每天获取有次数限制,需要我们保存。

两种方式,存入txt文件;使用memocache(SAE提供了该服务)

注:更换公众号时,需要清空memocache。

mem.php

<?php

	//header("Content-type: text/html; charset=utf-8"); 
	
	define('APP_ID','你的APPId');
	define('APP_SECRET','你的secret');
	
	function mem_token(){
		$mmc = new Memcached(); //使用本应用Memcache	
		$token = $mmc ->get('token');	
		//empty 如果为nul 返回真,	
		//如果token 存在为 false ,进行一次非操作 true == 输出token
		// true 
		if(!empty($token)){
			
			//输出token
			//echo '存在'.$token;
			return $token;
		} else {
			$token = get_token();
			
			$mmc ->set('token',$token,7000);
			
		}
		
		return $token;
	}
	function get_token(){
		
		$ch = curl_init();

		$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.APP_ID.'&secret='.APP_SECRET;

		//基于CURL, 定义请求地址
		curl_setopt($ch,CURLOPT_URL,$url);
		//将请求的结果,在之后赋给 $output
		curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

		//header 头不可见,不给用户看
		curl_setopt($ch,CURLOPT_HEADER,0);

		curl_setopt($ch,CURLOPT_TIMEOUT,10);

		$output = curl_exec($ch);

		curl_close($ch);

		$obj = json_decode($output,true);

		//json_decode
		//打印输出并且显示对应的类型和长度
		//var_dump($obj['access_token']);
		
		//返回access_token
		//return $token;
		return $obj['access_token'];
	}

?>

需要获得当前access_token,在当前php文件中加

include 'mem.php';

mem_token();

第一次写,可能有误。


相关标签: 微信公众号开发