1、配置相关服务器

(1) 如下,把自己的服务器ip白名单配置上;

(2) 开始配置令牌,配置令牌时先需要把现成的代码放到自己的服务器上面,代码里面包含自己的设置的令牌号码,这样才可以配置成功。

    注意:下面这个代码在配置好后,即可从服务器上面删除代码或者把index.php改一个名字。

        url必须是完整的url,比如   http://118.78.176.74/weixin/index.php

<?php
/**
* wechat php test
* update time: 20141008
*/ //define your token
//下面的即是你设置的token令牌
define("TOKEN", "zj123456");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid(); 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)) { $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, SORT_STRING);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr); if ($tmpStr == $signature) {
return true;
} else {
return false;
}
}
}

2、配置ok后,接下来就可以实现相关的微信公众号相关功能,比如说自动回复机器人。

代码包含3部分,当然,自动回复机器人,下面的代码有些用不到。

  (1) 、index.php

  

<?php
define("APPID","xxxxxxx");
define("APPSECRET","xxxxxx");
define("TOKEN","zj123456"); require("./wechat.inc.php");
$wechat = new WeChat(APPID,APPSECRET,TOKEN);
$wechat->responseMsg();
?>

  (2)、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, $headers = null)
{
$ch = curl_init(); //初始化
curl_setopt($ch, CURLOPT_URL, $curl); //设置访问的URL
// curl_setopt($ch, CURLOPT_HEADER, false); //设置不需要头信息
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
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>';
$access_token = $this->_getAccesstoken();
$userInfo = $this->getUserinfo($access_token, $postObj->FromUserName);
$str = sprintf($tpltext, $postObj->FromUserName, $postObj->ToUserName, time(), '欢迎您关注' . 'Geroge Zhang' . '的世界!');
//还可以保存用户的信息到数据库
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_add = "question=" . $keyword;
// $appcode = "2fd264cdc7914b308e51ab986f73fb86";
// $headers = array();
// array_push($headers, "Authorization:APPCODE " . $appcode);
// $contentStr = $this->_request("http://jisuznwd.market.alicloudapi.com/iqa/query?question=" . $data_add, false, "GET", '', $headers);
$data_add = urlencode($keyword);
$contentStr = $this->_request("http://api.qingyunke.com/api.php?key=free&appid=0&msg=" . $data_add, false, "GET", '', '');
$contentStr = json_decode($contentStr, true);
if ($contentStr['result'] == 0) {
$contentStr = $contentStr['content'];
}
if ($keyword == "hello") {
$contentStr = "你好";
} 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;
}
} /**
* 获取用户昵称
* @param access_token 前面函数_getAccesstoken已经实现
* @param openid 即FromUserName这个参数
* url $urlid = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN';
* return userInfo
*/
public function getUserinfo($access_token, $openid)
{
$urlid = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token=' . $access_token . '&openid=' . $openid . '&lang=zh_CN';
$userInfo = $this->_request($urlid);
return $userInfo;
}
}
注意:想要获取用户信息必须是认证过了的订阅号或者服务号!
 
综上,把如上三个文件,放到你的配置的服务器上面,即可实现自动回复机器人功能!

注意:还有其他生成二维码功能等,后续讨论~

  

php微信公众号开发入门小教程的更多相关文章

  1. C#微信公众号开发入门教程

    首先打开开发文档: 微信公众号开发者文档:http://mp.weixin.qq.com/wiki/home/index.html 一.创建测试账号 可以先申请一个开发者测试账号

  2. 微信公众号开发系统入门教程(公众号注册、开发环境搭建、access_token管理、Demo实现、natapp外网穿透)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/a1786223749/article/ ...

  3. C#微信公众号开发系列教程三(消息体签名及加解密)

    http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...

  4. 微信公众号开发系列教程一(调试环境部署续:vs远程调试)

    http://www.cnblogs.com/zskbll/p/4080328.html 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试 ...

  5. C#微信公众号开发系列教程二(新手接入指南)

    http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...

  6. C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  7. C#微信公众号开发系列教程五(接收事件推送与消息排重)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  8. C#微信公众号开发系列教程四(接收普通消息)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  9. 微信公众号开发上传图文素材带有卡片小程序报错:errcode=45166,errmsg = invalid content hint

    微信公众号开发自从支持允许在群发图文中插入小程序,方便了小程序的运营及推广.最近在三方服务开发中,要支持图文素材插入小程序遇到了一个很是棘手的问题.官方给出的插入小程序的示例支持文字.图片.卡片.如下 ...

随机推荐

  1. Windows Server 2016-Nano Server介绍

    WindowsServer 2016 提供了新的安装选项:Nano Server.Nano Server 是针对私有云和数据中心进行优化的远程管理的服务器操作系统. 类似于 Windows Serve ...

  2. ubuntu 安装FoxitReader福昕阅读器(转载)

    虽然不怎么用Ubuntu来看文档,但是偶尔还是需要看一下的.而Ubuntu自带的打开PDF的软件真的看着很难受,装一个跨平台的福昕好了. 首先,下载.可以官网下载:福昕官网 不过晚上不知道网络抽风还是 ...

  3. LeetCode算法题-Number of Boomerangs(Java实现)

    这是悦乐书的第231次更新,第244篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第98题(顺位题号是447).给定平面中的n个点都是成对不同的,"回旋镖&qu ...

  4. git使用命令行拉取远程代码仓库中的分支至本地

    1.本地创建文件夹用于存放拉取的代码 2.执行git init初始化文件夹 3.与远程代码仓库建立连接 git remote add origin git@github.com.wuylin/noth ...

  5. Django forms 关于select和checkbox设置初始选中值

    Django的forms和models一样很牛逼.他有两种功能,一是生成form表单,还有就是form表单的验证. 这里主要说一下生成form表单时经常用到的需要设置 初始值 / 默认值 的情况. 1 ...

  6. ubuntu下安裝sogou拼音

    方法/步骤 打开搜狗输入法Linux版的官网http://pinyin.sogou.com/linux/?r=pinyin,并下载你需要的版本,这里选择64位版. 在Ubuntu14.01下可以直接点 ...

  7. VS code常用的几个插件

    VScode是一个我最近才开始用的编辑器,在此列几个自己在用的插件,以备换机时的需要. auto close tagbeautify css/sass/scss/lessone dark themes ...

  8. 设计模式のSingleton Pattern(单例模式)----创建模式

    单例模式没有什么好讲的,我们 举个例子 #region 单例定义 /// <summary> /// 类单例 /// </summary> private static Win ...

  9. mongoDB2.6,java使用具体解释

    本文使用的环境是:win7_64+Eclipse+maven 一.准备工作 下载java驱动包 驱动包下载地址:http://mvnrepository.com/artifact/org.mongod ...

  10. centos7下kubernetes(3。部署kubernetes)

    环境:三个centos7 K8s2是Master;K8s1是node1:K8s3是node2 官方文档:https://kubernetes.io/docs/setup/independent/ins ...