(一)注册微信个人订阅号1,微信公众帐号注册的第   3  步是选择“类型”,它有3个值可供选择“订阅号”,“服务号”,“企业号”。我们可以选择订阅号,因为另外两个需要填写公司验证我们没有。2,微信公众帐号注册的第 4 步是信息登记我们也选择个人(二)开发模式的启用及配置
第一步:填写服务器配置
登录微信公众平台官网后,在公众平台后台管理页面 - 开发者中心页,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件 的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。 EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。
同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效,请开发者谨慎填写及选择。加解密方式的默认状态为明文模式,选择兼容模式和安全模式需要提前配置好相关加解密代码,详情请参考消息体签名及加解密部分的文档。
第二步:验证服务器地址的有效性
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数:
参数  描述
signature   微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp   时间戳
nonce   随机数
echostr     随机字符串
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
加密/校验流程如下:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
检验signature的PHP示例代码:
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;}
}PHP示例代码下载http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.20140819.zip将token值设置为你所需要的值,token可由开发者任意填写,用作生成签名。编辑完保存并关闭文件,将文件wx_sample.php 更改成自定义的名字,这里改为index.php(三分)析代码
完整代码如下:<?php
/*** wechat php test*///define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();class wechatCallbackapiTest
{public function valid(){$echoStr = $_GET["echostr"];//valid signature , optionif($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 dataif (!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 );if( $tmpStr == $signature ){return true;}else{return false;}}
}?>
3.1 整体分析
原始示例代码大致分为四个部分:
•   定义TOKEN
•   声明一个类 wechatCallbackapiTest
•   创建类wechatCallbackapiTest 的一个实例对象 $wechatObj
•   调用类的 valid() 方法。
3.2 详细分析
3.2.1 定义TOKEN
define("TOKEN", "weixin");
define 是用来给常量赋值的函数,这句话的意思是赋予“TOKEN”这个常量值为“weixin”。
TOKEN 是用来进行交互安全认证的,开发者可以随意定义,要和公众平台里设置的一样。
3.2.2 声明一个类
class wechatCallbackapiTest{
}
声明一个类 wechatCallbackapiTest,该类中包含有三个方法(函数)。
a. public function valid()
用于申请 成为开发者 时向微信发送验证信息。
b. public function responseMsg()
处理并回复用户发送过来的消息,也是用的最多的一个函数,几乎所有的功能都在这里实现。responseMsg 函数详解:$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
接收微信公众平台发送过来的用户消息,该消息数据结构为XML,不是php默认的识别数据类型,因此这里用了$GLOBALS['HTTP_RAW_POST_DATA']来接收,同时赋值给了$postStrif (!empty($postStr))
判断$postStr是否为空,如果不为空(接收到了数据),就继续执行下面的语句;如果为空,则跳转到与之相对应的else语句。$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
使用simplexml_load_string() 函数将接收到的XML消息数据载入对象$postObj中。这个严谨的写法后面还得加个判断是否载入成功的条件语句,不过不写也没事。$fromUsername = $postObj->FromUserName;
将对象$postObj中的发送消息用户的OPENID赋值给$fromUsername变量$toUsername = $postObj->ToUserName;
将对象$postObj中的公众账号的ID赋值给$toUsername变量$keyword = trim($postObj->Content);
trim() 函数从字符串的两端删除空白字符和其他预定义字符,这里就可以得到用户输入的关键词$time = time();
time() 函数返回当前时间的 Unix 时间戳,即自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。$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 ))
判断$keyword是否为空,不为空则继续执行下面的语句;如果为空,则跳转到与之相对应的else语句,即 echo "Input something...";$msgType = "text";
消息类型是文本类型$contentStr = "Welcome to wechat world!";
回复的消息内容$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
使用sprintf() 函数将格式化的数据写入到变量中去;
$fromUsername, $toUsername, $time, $msgType, $contentStr 分别顺序替换模板里“%s”位置,也即是“$resultStr”这个变量最后实际为:
<xml>
<ToUserName><![CDATA[$toUsername]]></ToUserName>
<FromUserName><![CDATA[$fromUsername]]></FromUserName>
<CreateTime>$time</CreateTime>
<MsgType><![CDATA[$msgType]]></MsgType>
<Content><![CDATA[$contentStr]]></Content>
<FuncFlag>0</FuncFlag>      //位0x0001被标志时,星标刚收到的消息。
</xml>
echo $resultStr;     //把回复的消息输出c. private function checkSignature()
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请求原样返回echostr参数内容,则接入生效,否则接入失败。
signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
加密/校验流程:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
3.2.3 创建实例对象
$wechatObj = new wechatCallbackapiTest();
3.2.4 调用类方法验证
$wechatObj->valid();
调用类的valid()方法执行接口验证,接口设置成功后将其注释掉。(四)订阅事件处理
一、简介
新用户关注微信公众平台,将产生一个订阅事件,即subscribe事件,默认代码中没有对这一事件进行相应回复处理。
在新用户关注公众平台后,可能想知道该平台提供了哪些功能,以及怎样使用该平台,通俗一点讲就是该平台的“使用说明书”。
本文将详细讲述对ubscribe事件的处理过程,回复相应信息提升交互性。s
二、思路分析
微信目前提供了五种消息类型,分别为:
•   文本消息(text);
•   图片消息(image);
•   地理位置消息(location);
•   链接消息(link);
•   事件推送(event);
接收到消息后,首先需要对消息类型做出判断,然后再针对不同类型的消息做出处理。在事件推送中,事件类型又分为三种,subscribe(订阅)、unsubscribe(取消订阅)、CLICK(自定义菜单点击事件),还需要再加一次判断;判断为subscribe事件后,根据设定好的欢迎消息,回复给用户。
三、判断消息类型$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$RX_TYPE = trim($postObj->MsgType);switch($RX_TYPE)
{case "text":$resultStr = $this->handleText($postObj);break;case "event":$resultStr = $this->handleEvent($postObj);break;default:$resultStr = "Unknow msg type: ".$RX_TYPE;break;
}说明:
$RX_TYPE = trim($postObj->MsgType);   得到消息类型;
case "text":$resultStr = $this->handleText($postObj);   使用handleText() 函数处理文本消息;
case "event":$resultStr = $this->handleEvent($postObj);   使用handleEvent() 函数处理事件推送;
四、判断事件类型switch ($object->Event)
{case "subscribe":$contentStr = "感谢您关注【卓锦苏州】"."\n"."微信号:zhuojinsz"."\n"."卓越锦绣,名城苏州,我们为您提供苏州本地生活指南,苏州相关信息查询,做最好的苏州微信平台。"."\n"."目前平台功能如下:"."\n"."【1】 查天气,如输入:苏州天气"."\n"."【2】 查公交,如输入:苏州公交178"."\n"."【3】 翻译,如输入:翻译I love you"."\n"."【4】 苏州信息查询,如输入:苏州观前街"."\n"."更多内容,敬请期待...";break;default :$contentStr = "Unknow Event: ".$object->Event;break;
}说明:
如果是subscribe事件,设定回复内容为“感谢您关注【卓锦苏州】...”;
五、完整代码<?php
/*** wechat php test*///define your token
define("TOKEN", "zhuojin");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->responseMsg();
//$wechatObj->valid();class wechatCallbackapiTest
{/*public function valid(){$echoStr = $_GET["echostr"];//valid signature , optionif($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 dataif (!empty($postStr)){$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);$RX_TYPE = trim($postObj->MsgType);switch($RX_TYPE){case "text":$resultStr = $this->handleText($postObj);break;case "event":$resultStr = $this->handleEvent($postObj);break;default:$resultStr = "Unknow msg type: ".$RX_TYPE;break;}echo $resultStr;}else {echo "";exit;}}public function handleText($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 )){$msgType = "text";$contentStr = "Welcome to wechat world!";$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);echo $resultStr;}else{echo "Input something...";}}public function handleEvent($object){$contentStr = "";switch ($object->Event){case "subscribe":$contentStr = "感谢您关注【卓锦苏州】"."\n"."微信号:zhuojinsz"."\n"."卓越锦绣,名城苏州,我们为您提供苏州本地生活指南,苏州相关信息查询,做最好的苏州微信平台。"."\n"."目前平台功能如下:"."\n"."【1】 查天气,如输入:苏州天气"."\n"."【2】 查公交,如输入:苏州公交178"."\n"."【3】 翻译,如输入:翻译I love you"."\n"."【4】 苏州信息查询,如输入:苏州观前街"."\n"."更多内容,敬请期待...";break;default :$contentStr = "Unknow Event: ".$object->Event;break;}$resultStr = $this->responseText($object, $contentStr);return $resultStr;}public function responseText($object, $content, $flag=0){$textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>%d</FuncFlag></xml>";$resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $flag);return $resultStr;}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 );if( $tmpStr == $signature ){return true;}else{return false;}}
}?>(五)简单的回复功能开发
一、简介
微信公众平台可以根据用户发送的信息进行判断,然后给出对应的回复,具有良好的交互性。下文将模拟简单的回复功能,根据这个案例,开发者也可以基本理解微信交互的原理,进行更深层次的开发。
二、思路分析
用户发送过来的文本信息,我们可以提取关键字,通过简单的 if...elseif...else... 实现。
关键代码如下:if($keyword=="你好"){$contentStr = "hello";
}elseif($keyword=="苏州"){$contentStr = "上有天堂,下有苏杭";
}else{$contentStr = "感谢您关注【卓锦苏州】 微信号:zhuojinsz";
}如果用户发送"你好",则回复"hello",如果用户发送"苏州",则回复"上有天堂,下有苏杭",其他信息,则回复你的欢迎词。
三、完整代码<?php
/*** wechat php test*///define your token
define("TOKEN", "zhuojin");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->responseMsg();
//$wechatObj->valid();class wechatCallbackapiTest
{/*public function valid(){$echoStr = $_GET["echostr"];//valid signature , optionif($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 dataif (!empty($postStr)){$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);$RX_TYPE = trim($postObj->MsgType);switch($RX_TYPE){case "text":$resultStr = $this->handleText($postObj);break;case "event":$resultStr = $this->handleEvent($postObj);break;default:$resultStr = "Unknow msg type: ".$RX_TYPE;break;}echo $resultStr;}else {echo "";exit;}}public function handleText($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 )){$msgType = "text";if($keyword=="你好"){$contentStr = "hello";}elseif($keyword=="苏州"){$contentStr = "上有天堂,下有苏杭";}else{$contentStr = "感谢您关注【卓锦苏州】 微信号:zhuojinsz";}$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);echo $resultStr;}else{echo "Input something...";}}public function handleEvent($object){$contentStr = "";switch ($object->Event){case "subscribe":$contentStr = "感谢您关注【卓锦苏州】"."\n"."微信号:zhuojinsz"."\n"."卓越锦绣,名城苏州,我们为您提供苏州本地生活指南,苏州相关信息查询,做最好的苏州微信平台。"."\n"."目前平台功能如下:"."\n"."【1】 查天气,如输入:苏州天气"."\n"."【2】 查公交,如输入:苏州公交178"."\n"."【3】 翻译,如输入:翻译I love you"."\n"."【4】 苏州信息查询,如输入:苏州观前街"."\n"."更多内容,敬请期待...";break;default :$contentStr = "Unknow Event: ".$object->Event;break;}$resultStr = $this->responseText($object, $contentStr);return $resultStr;}public function responseText($object, $content, $flag=0){$textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>%d</FuncFlag></xml>";$resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $flag);return $resultStr;}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 );if( $tmpStr == $signature ){return true;}else{return false;}}
}?>

(一)注册微信个人订阅号相关推荐

  1. 如何注册微信个人公众号,教程来啦!怎样注册微信个人公众订阅号

    我们大家在平时生活中出现的一些有趣的事情或者一些理解心得,想要表达给更多的人,我们就可以注册一个个人公众号,在个人公众号中来分享一些文章给需要的人阅读.那么下面小编就分享给大家如何注册微信个人订阅号. ...

  2. 微信「订阅号助手」 App 正式上线,请尽情吐槽!

    说了一年,有可能做了更久.现在微信「订阅号助手」 App 终于上线了,结果竟是这个. 打开微信订阅号助手 app,目前有邮箱登录和微信登陆两种方式,对于微信运营者来说,微信登陆无需输入账号密码,无疑是 ...

  3. ibm服务器报错代码大全_微信认证订阅号开发者模式服务器配置自定义菜单PHP独立完整版...

    ( 网络配图) 开发微信公众号时可能需要自己对接一些服务,所以会启用微信公众号服务器配置功能,开启后你会发现,公众号的部分基础功能都需要自己配置了,原生的不能使用了,其中就包括公众号底部菜单. 下面主 ...

  4. 微信个人订阅号简单实现在线收款

    微信个人订阅号实现在线收款 项目简介 环境准备 订阅号设置 核心代码 打赏链接的制作 在线演示 源码下载 项目简介 用计算机六进制从 000000 -111111,即 0到63 来表示易经中的64个卦 ...

  5. 注册微信公总号的方法与种类

    微信公众号选择时有三种,分别是订阅号.企业号.还有服务号,这三类也有分认证的和没认证的.认证的平台认证收费300元/年,我们只能注册不能认证的订阅号.注册个人订阅号步骤:先激活邮箱,然后选择订阅号,选 ...

  6. 微信的订阅号和服务号如何区分?

    微信5.0将对账号进行区分,以下为原文: "新版公众账号将分为两类:订阅号和服务号.订阅号每天一条,收拢至订阅号文件夹,不强制推送:服务号每月一条,消息-显示全部 ​ 微信公众平台上线于20 ...

  7. java微信个人订阅号发信息_微信个人公众号开发-java

    一:申请公众号 无聊的去申请一个个人公众号,试了下微信实现自定义菜单与自定义对话的一些基本功能,如果多花点时间,金钱(= =!)还是有不少功能可以使用,还是蛮有意思的. 废话不多说,先看一下申请的流程 ...

  8. 微信个人订阅号如何发布多篇文章

    大家好,今天我们来水一篇文章,很多小伙伴都不知道个人订阅号如何发布多篇文章的,发布一篇文章有时很鸡肋,今天我们一步步的进行更新! 一:登录微信公众平台mp.weixin.qq.com 二:点击首页的图 ...

  9. 微擎wxmicro.ctrl.php,苹果CMSV10对接微信公众订阅号方法

    苹果CMS是国内优秀的开源PHP建站系统,擅长电影程序.视频程序这一块,在主流建站系统中特色鲜明,以灵活.小巧.兼容性好.负载强等优点而深受许多站长的喜爱.让自然最喜欢的一点就是所有资源可以一键采集及 ...

最新文章

  1. redis 基于主从复制的 rce 利用方式
  2. 一、烧写最小linux系统
  3. “低端市场”?一线业务员这样看
  4. Windows2008+sqlserver2008集群安装(图文并貌)
  5. 利用bootstrap插件设置时间
  6. java限制在同一台电脑上只允许有一个用户登录系统
  7. Spring AOP 浅析
  8. Windows 8和CentOS 6.4(64)双系统硬盘安装教程
  9. solidity教程(三)高级 Solidity 理论
  10. win7专业版激活方案
  11. 跨省游开放首展,海峡旅博会和休闲旅博会将在厦门举行
  12. 区块链打击食品欺诈:以挪威三文鱼为例
  13. 微博平台的RPC服务化实践
  14. Neyman-Pearson 奈曼-皮尔逊决策分析
  15. 计算机怎么换桌面皮肤,如何更换电脑腾讯视频上的皮肤样式
  16. 健身运动燃烧脂肪的三个必要条件
  17. Apache基于域名、端口、IP的虚拟主机配置(Centos 6.5)
  18. dnf服务器炸团门票怎么找回,dnf补票小技巧 再也不怕掉线炸团制裁
  19. 终于有人把数据挖掘讲明白了
  20. ArcGIS API for JavaScript 报错Uncaught ReferenceError:define is not defined

热门文章

  1. PS字体加粗的小方法、、
  2. 申报市级瞪羚企业应具备的基本条件
  3. git报错 git libpng warning: iCCP以及fatal: Authentication failed for ‘https://git.weixin.qq.com‘
  4. Android10power有哪些功能,Android 功耗(10)---电流波形图(power monitor)
  5. 你要找的cocos面试答案都在这里了!
  6. 工业视觉_57:霍夫(Hough)直线识别,交点与夹角
  7. 说说filter这个css属性(网站置灰实现)
  8. 计算机安装Hp1005打印机,如何安装hp1005打印机驱动程序_安装步骤是什么
  9. 王者荣耀:从程序员的角度解密王者荣耀,专业术语把院长看懵了
  10. 快速云:云计算技术在计算机数据处理中的应用