一起学习网,一个一起免费的织梦建站教程资源共享和seo自学、黑帽seo技术学习交流的学习网站,www.17xuexiwang.com,一起学习,共同进步!

php微信开发

时间:2016-06-12 20:12   文章来源:一起学习网   访问次数:

  微信开发

  1. 微信账号分类:服务号、订阅号、企业号。账号类型根据服务的类型来选择。同时账号类型决定微信平台提供的权限。

  2. 微信测试号

  2.1 申请微信测试号

  进入网页:http://mp.weixin.qq.com/wiki/home/

 申请微信测试号

  然后看到点击申请,手机扫描二维码登录。

  点击“确认登录”后:

 

  3. Access token

  access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。

  请求方式1(客户端):

accsee_token

  请求方式2(服务器):

  access_token

  获取access token 方法(三种)。

  1.通过url来获取:

  用浏览器访问地址:

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxa54f644e26b383ac&secret=0707c3f027d498d1b558addeca8eabc4

  会看到信息:

  访问结果

  2.通过微信平台获取:

  打开微信开发文档选择:

  微信平台获取

  再选择:

  

  看到页面:

  

  点击“检查问题”得到:

  

  3.编写PHP程序来获取

  学习了解cURL函数库:

  cURL:PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。libcurl目前支持http、https、ftp、 gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证。

  编写程序curl.php:

<?php 
function _request($curl, $https=true, $method='get', $data=null){
	$ch = curl_init();//初始化
	curl_setopt($ch, CURLOPT_URL, $curl);//设置访问的URL
	curl_setopt($ch, CURLOPT_HEADER, false);//设置不需要头信息
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//只获取页面内容,但不输出
	if($https){
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//不做服务器认证
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//不做客户端认证
	}
	if($method == 'post'){
		curl_setopt($ch, CURLOPT_POST, true);//设置请求是POST方式
		curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//设置POST请求的数据
	}
	$str = curl_exec($ch);//执行访问,返回结果
	curl_close($ch);//关闭curl,释放资源
	return $str;
}
echo  _request("http://www.baidu.com");
?>

  看到结果:

 

  改进curl.php用于获取access token:

  

<?php 
function _request($curl, $https=true, $method='get', $data=null){
	$ch = curl_init();//初始化
	curl_setopt($ch, CURLOPT_URL, $curl);//设置访问的URL
	curl_setopt($ch, CURLOPT_HEADER, false);//设置不需要头信息
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//只获取页面内容,但不输出
	if($https){
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//不做服务器认证
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//不做客户端认证
	}
	if($method == 'post'){
		curl_setopt($ch, CURLOPT_POST, true);//设置请求是POST方式
		curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//设置POST请求的数据
	}
	$str = curl_exec($ch);//执行访问,返回结果
	curl_close($ch);//关闭curl,释放资源
	return $str;
}

function _getAccesstoken(){
	$file = './accesstoken';
	if(file_exists($file)){
		$content = file_get_contents($file);
		$content = json_decode($content);
		if(time()-filemtime($file)<$content->expires_in)
			return $content->access_token;
	}
	$content = _request("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxa54f644e26b383ac&secret=0707c3f027d498d1b558addeca8eabc4");
	file_put_contents($file, $content);
	$content = json_decode($content);
	return $content->access_token;
}
echo _getAccesstoken();  
?>

  4. 封装WeChat类

  

<?php 
class WeChat{
	private $_appid;
	private $_appsecret;
	private $_token;
	
	public function __construct($appid,$appsecret,$token){
		$this->_appid = $appid;
		$this->_appsecret = $appsecret;
		$this->_token = $token;
	}

	private function _request($curl, $https=true, $method='get', $data=null){
		$ch = curl_init();//初始化
		curl_setopt($ch, CURLOPT_URL, $curl);//设置访问的URL
		curl_setopt($ch, CURLOPT_HEADER, false);//设置不需要头信息
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//只获取页面内容,但不输出
		if($https){
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//不做服务器认证
			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//不做客户端认证
		}
		if($method == 'post'){
			curl_setopt($ch, CURLOPT_POST, true);//设置请求是POST方式
			curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//设置POST请求的数据
		}
		$str = curl_exec($ch);//执行访问,返回结果
		curl_close($ch);//关闭curl,释放资源
		return $str;
	}

	private function _getAccesstoken(){
		$file = './accesstoken';
		if(file_exists($file)){
			$content = file_get_contents($file);
			$content = json_decode($content);
			if(time()-filemtime($file)<$content->expires_in)
				return $content->access_token;
		}
		$content = _request("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->_appid."&secret=".$this->_appsecret);
		file_put_contents($file, $content);
		$content = json_decode($content);
		return $content->access_token;
	}
}
?>

  5. 二维码

  什么是二维码:

  二维码称为QR code(Quick Response Code),目前有2种类型的二维码:

  1、临时二维码,是有过期时间的,最长可以设置为在二维码生成后的7天(即604800秒)后过期,但能够生成较多数量。临时二维码主要用于帐号绑定等不要求二维码永久保存的业务场景

  2、永久二维码,是无过期时间的,但数量较少(目前为最多10万个)。永久二维码主要用于适用于帐号绑定、用户来源统计等场景。

  二维码获得:

  分两步骤:

  1、获取ticket

  getticket.php

<?php 
define("APPID","wxa54f644e26b383ac");
define("APPSECRET","0707c3f027d498d1b558addeca8eabc4");
define("TOKEN","");

require("./wechat.inc.php");
$wechat = new WeChat(APPID,APPSECRET,TOKEN);
echo $wechat->_getTicket(604800,"temp",8);
?>

  Wechat类中添加方法:

  

public function _getTicket($expires_secords = 604800, $type = "temp", $scene = 1){ 
		 if($type == "temp"){
			$data = '{"expire_seconds":'.$expires_secords.', "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": '.$scene.'}}}';
			return $this->_request("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$this->_getAccesstoken(),true, "post", $data);
		 } else {
			 $data = '{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": '.$scene.'}}}';
			return $this->_request("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$this->_getAccesstoken(),true, "post", $data);
		 }
	}

  结果:

 

  2、通过ticket获取二维码

  

  编写getqrcode.php

  

<?php 
define("APPID","wx38bd235f68377184");
define("APPSECRET","6412760a13e439310695db74fc900ba9");
define("TOKEN","");
header("content-type:image/jpeg");
require("./wechat.inc.php");
$wechat = new WeChat(APPID,APPSECRET,TOKEN);
echo $wechat->_getQRCode(604800,"temp",66);//临时二维码,有效期是7天,场景id是6
//echo $wechat->_getQRCode(604800,"forever",8);//永久二维码,场景id是8
?>

  修改wechat类,添加_getQRCode方法:

  

public function _getQRCode($expires_secords,$type,$scene){
		$content = json_decode($this->_getTicket($expires_secords,$type,$scene));
		$ticket = $content->ticket;
		$image = $this->_request("https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=".urlencode($ticket)
		);
		//$file = "./".$type.$scene.".jpg";// 可以将生成的二维码保存到本地,便于使用
		//file_put_contents($file, $image);//保存二维码
		return $image;
	}

  例子:

  直接访问目录下的getqrcode.php,会生成一个二维码。

  6. 搭建微信平台服务器

  微信的主要流程:

  

  在微信开发文档页设置:

  

  

  连接企业服务器:

  Ftp连接工具连接服务器

  打开微信开发文档,向下拉看到:

  

  选择“下载”:

 

  解压:

  

  编辑以上文件并保存为index.php:

 

  上传index.php到企业服务器,提交以下:

  

  配置成功。

  注意:该index.php只用一次,在第一次配置的时候使用。注意保存该index.php,以便以后修改url或token时使用。

  7. 处理文本信息

  

  查看xml格式:

  

  回复:

 

  XML格式:

  

  效果:

  

  8. 制作聊天功能

  使用小逗比的网站:http://www.xiaodoubi.com/chat.php

  修改wechat类:

  

  上传wechat到企业服务器,访问的效果:

  

  9. 改进wechat类

  添加文本的处理和图像的处理,修改wechat类中的responseMsg方法如下:

  

public function responseMsg()
    {
		//get post data, May be due to the different environments
		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//获得用户发送信息
		$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
		switch($postObj->MsgType){
			case 'text':
				$this->_doText($postObj);
				break;
			case 'image':
				$this->_doImage($postObj);
				break;
			case 'voice':
				$this->_doVoice($postObj);
				break;
			case 'video':
				$this->_doVideo($postObj);
				break;
			case 'location':
				$this->_doLocation($postObj);
				break;
			case 'shortvideo':
				$this->_doShortVideo($postObj);
				break;
			case 'link':
				$this->_doLink($postObj);
			default: exit;
		}
	}

  修改_doText方法进行文本处理

 

private function _doText($postObj){
		$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 ))
		{
			$data = "chat=".$keyword;
			$contentStr = $this->_request("http://www.xiaodoubi.com/bot/chat.php",false,"post",$data);
			if($keyword == "hello")
				$contentStr = "Welcome to wechat  PHP 39 world!";
			if($keyword == "PHP")
				$contentStr = "最流行的网页编程语言!";
			if($keyword == "JAVA")
				$contentStr = "较流行的网页编程语言!";
			$msgType = "text";
			$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
			echo $resultStr;
		}
        exit;	
	}

  图像的简单处理_doimage方法:

  

private function _doImage($postObj){
		$tpltext='<xml>
		<ToUserName><![CDATA[%s]]></ToUserName>
		<FromUserName><![CDATA[%s]]></FromUserName>
		<CreateTime>%s</CreateTime>
		<MsgType><![CDATA[text]]></MsgType>
		<Content><![CDATA[%s]]></Content>
		</xml>';
		$str = sprintf($tpltext,$postObj->FromUserName,$postObj->ToUserName,time(),'您发送的图片在'.$postObj->PicUrl."。");
		echo $str;
	}

  10. 事件的处理

  关注与取消关注

  

  

  在wechat类中写_doSubscribe()方法:

  

private function _doSubscribe($postObj){
		$tpltext = '<xml>
		<ToUserName><![CDATA[%s]]></ToUserName>
		<FromUserName><![CDATA[%s]]></FromUserName>
		<CreateTime>%s</CreateTime>
		<MsgType><![CDATA[text]]></MsgType>
		<Content><![CDATA[%s]]></Content>
		</xml>';
		$str = sprintf($tpltext,$postObj->FromUserName,$postObj->ToUserName,time(),'欢迎您关注PHP Weixin39 世界!');
		//还可以保存用户的信息到数据库
		echo $str;
		
	}

  写_doEvent()方法用于处理事件

 

private function _doEvent($postObj){ //事件处理
		switch($postObj->Event){
			case  'subscribe': //订阅
				$this->_doSubscribe($postObj);
				break;
			case 'unsubscribe': //取消订阅
				$this->_doUnsubscribe($postObj);
				break;
			default:;
		}
	}

  结果:

  

  11. 添加菜单

  使用微信开发文档页面提供的工具:

  

  

  填写accesstoken和body(包含是菜单的json的数据)

  

  在手机上课查看: 

附上WeChat.inc.php类

<?php 

class WeChat{
	private $_appid;
	private $_appsecret;
	private $_token;
	
	public function __construct($appid,$appsecret,$token){
		$this->_appid = $appid;
		$this->_appsecret = $appsecret;
		$this->_token = $token;
	}
	
	/**
		*_request():发出请求
		*@curl:访问的URL
		*@https:安全访问协议
		*@method:请求的方式,默认为get
		*@data:post方式请求时上传的数据
	**/
	private function _request($curl, $https=true, $method='get', $data=null){
		$ch = curl_init();//初始化
		curl_setopt($ch, CURLOPT_URL, $curl);//设置访问的URL
		curl_setopt($ch, CURLOPT_HEADER, false);//设置不需要头信息
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//只获取页面内容,但不输出
		if($https){
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//不做服务器认证
			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//不做客户端认证
		}
		if($method == 'post'){
			curl_setopt($ch, CURLOPT_POST, true);//设置请求是POST方式
			curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//设置POST请求的数据
		}
		$str = curl_exec($ch);//执行访问,返回结果
		curl_close($ch);//关闭curl,释放资源
		return $str;
	}
	
	/**
		*_getAccesstoken():获取access token
	**/
	private function _getAccesstoken(){
		$file = './accesstoken'; //用于保存access token
		if(file_exists($file)){ //判断文件是否存在
			$content = file_get_contents($file); //获取文件内容
			$content = json_decode($content);//json解码
			if(time()-filemtime($file)<$content->expires_in) //判断文件是否过期
				return $content->access_token;//返回access token
		}
		$content = $this->_request("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->_appid."&secret=".$this->_appsecret); //获取access token的json对象
		file_put_contents($file, $content); //保存json对象到指定文件
		$content = json_decode($content);//进行json解码
		return $content->access_token;//返回access token
	}
	
	/** 
		*_getTicket():获取ticket,用于以后换取二维码
		*@expires_secords:二维码有效期(秒)
		*@type :二维码类型(临时或永久)
		*@scene:场景编号
	**/
	public function _getTicket($expires_secords = 604800, $type = "temp", $scene = 1){ 
		 if($type == "temp"){//临时二维码的处理
			 $data = '{"expire_seconds":'.$expires_secords.', "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": '.$scene.'}}}';//临时二维码生成所需提交数据
			return $this->_request("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$this->_getAccesstoken(),true, "post", $data);//发出请求并获得ticket
		 } else { //永久二维码的处理
			 $data = '{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": '.$scene.'}}}';//永久二维码生成所需提交数据
			return $this->_request("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$this->_getAccesstoken(),true, "post", $data);//发出请求并获得ticket
		 }
	}
	
	/**
		*_getQRCode():获取二维码
		*@expires_secords:二维码有效期(秒)
		*@type:二维码类型
		*@scene:场景编号
	**/
	public function _getQRCode($expires_secords,$type,$scene){
		$content = json_decode($this->_getTicket($expires_secords,$type,$scene));//发出请求并获得ticket的json对象
		$ticket = $content->ticket;//获取ticket
		$image = $this->_request("https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=".urlencode($ticket)
		);//发出请求获得二维码图像
		//$file = "./".$type.$scene.".jpg";// 可以将生成的二维码保存到本地,便于使用
		//file_put_contents($file, $image);//保存二维码
		return $image;
	}
	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"];//获得用户发送信息
		$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
		switch($postObj->MsgType){
			case 'event':
				$this->_doEvent($postObj);
				break;
			case 'text':
				$this->_doText($postObj);
				break;
			case 'image':
				$this->_doImage($postObj);
				break;
			case 'voice':
				$this->_doVoice($postObj);
				break;
			case 'video':
				$this->_doVideo($postObj);
				break;
			case 'location':
				$this->_doLocation($postObj);
				break;
			default: exit;
		}
	}
	
	private function _doEvent($postObj){ //事件处理
		switch($postObj->Event){
			case  'subscribe': //订阅
				$this->_doSubscribe($postObj);
				break;
			case 'unsubscribe': //取消订阅
				$this->_doUnsubscribe($postObj);
				break;
			default:;
		}
	}
	
	private function _doSubscribe($postObj){
		$tpltext = '<xml>
					<ToUserName><![CDATA[%s]]></ToUserName>
					<FromUserName><![CDATA[%s]]></FromUserName>
					<CreateTime>%s</CreateTime>
					<MsgType><![CDATA[text]]></MsgType>
					<Content><![CDATA[%s]]></Content>
					</xml>';
		$str = sprintf($tpltext,$postObj->FromUserName,$postObj->ToUserName,time(),'欢迎您关注PHP Weixin39 世界!');
		//还可以保存用户的信息到数据库
		echo $str;
		
	}
	
	private function _doUnsubscribe($postObj){
		;//把用户的信息从数据库中删除
	}
	
	private function _doText($postObj){
		$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 ))
		{
			$data = "chat=".$keyword;
			$contentStr = $this->_request("http://www.xiaodoubi.com/bot/chat.php",false,"post",$data);
			if($keyword == "hello")
				$contentStr = "Welcome to wechat  PHP 39 world!";
			if($keyword == "PHP")
				$contentStr = "最流行的网页编程语言!";
			if($keyword == "JAVA")
				$contentStr = "较流行的网页编程语言!";
			$msgType = "text";
			$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
			echo $resultStr;
		}
        exit;	
	}
		
	private function _doImage($postObj){
		$tpltext='<xml>
				<ToUserName><![CDATA[%s]]></ToUserName>
				<FromUserName><![CDATA[%s]]></FromUserName>
				<CreateTime>%s</CreateTime>
				<MsgType><![CDATA[text]]></MsgType>
				<Content><![CDATA[%s]]></Content>
				</xml>';
		$str = sprintf($tpltext,$postObj->FromUserName,$postObj->ToUserName,time(),'您发送的图片在'.$postObj->PicUrl."。");
		echo $str;
	}
		
	private function checkSignature()
	{
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
		$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;
		}
	}
}
?>

自动回复消息index.php
<?php 
define("APPID","wxa54f644e26b383ac");
define("APPSECRET","0707c3f027d498d1b558addeca8eabc4");
define("TOKEN","17xue");

require("./wechat.inc.php");
$wechat = new WeChat(APPID,APPSECRET,TOKEN);
$wechat->responseMsg();
?>
验证时用的index.php
<?php 
define("APPID","wxa54f644e26b383ac");
define("APPSECRET","0707c3f027d498d1b558addeca8eabc4");
define("TOKEN","17xue");

require("./wechat.inc.php");
$wechat = new WeChat(APPID,APPSECRET,TOKEN);
$wechat->valid();
?>

本文为一起学习网原创文章,如想转载,请注明原文网址,注明出处;否则,禁止转载;谢谢配合!

上一篇:php中的curl使用方法
下一篇:Apache虚拟主机多站点配置