微信公众平台开发接口PHP SDK
以前没接触过微信公众平台开发,前几天刚找到实习公司就要求我做一个微信公众平台的应用,于是乎开始学习微信公众平台开发接口的调用,看开发文档之后还是不知道从何入手,只好上网找入门资料,终于在方倍工作室找到了完整的SDK,理解了思路之后其实也挺简单的,无非就是进行用户、微信服务器、开发者服务器三者之间的通信。下面是我参考方倍工作室SDK之后之间写的一个SDK,主要是响应文本消息和CLICK按钮消息,获取用户基本信息,当然并没有包含所有的消息类型和事件。更完整的SDK请参考方倍工作室,链接:http://www.cnblogs.com/txw1958/p/weixin-php-sdk.html。
$token = 'qiduoyun';
$appid = 公众号appid;
$appsecret = 公众号appsecret;
$wechat = new Wechat($token,$appid,$appsecret);
if(!isset($_GET['echostr'])) {
$wechat->responseMsg();
} else {
$wechat->valid();
}
class Wechat
{
private $token;
private $appid;
private $appsecret;
public function __construct($token,$appid,$appsecret)
{
$this->token = $token;
$this->appid = $appid;
$this->appsecret = $appsecret;
}
//验证消息真实性
public function valid()
{
$echostr = $_GET['echostr'];
if($this->checkSignature()) {
echo $echostr;
exit;
}
}
//验证签名
private function checkSignature()
{
$token = $this->token;
$timestamp = $_GET['timestamp'];
$nonce = $_GET['nonce'];
$signature = $_GET['signature'];
$tmpArr = array($token,$timestamp,$nonce);
sort($tmpArr,SORT_STRING);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
if($tmpStr == $signature) {
return true;
} else {
return false;
}
}
//获取access_token
private function get_access_token($appid,$appsecret)
{
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" .
$appid . "&secret=" . $appsecret;
$output = file_get_contents($url);
$jsoninfo = json_decode($output,true);
$access_token = $jsoninfo['access_token'];
return $access_token;
}
//响应消息
public function responseMsg()
{
$postStr = $GLOBALS['HTTP_RAW_POST_DATA'];
if(!empty($postStr)) {
$postObj = simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA);
$RX_TYPE = trim($postObj->MsgType);
switch($RX_TYPE)
{
case 'text':
$result = $this->receiveText($postObj);
break;
case 'event':
$result = $this->receiveEvent($postObj);
break;
default:
$result = "unknown message type: " . $RX_TYPE;
break;
}
echo $result;
} else {
echo '';
exit;
}
}
//接收文本消息
private function receiveText($object)
{
switch($object->Content)
{
case '猜猜我是谁': //发送单图文消息:用户基本信息
//获取access_token
$access_token = $this->get_access_token($this->appid,$this->appsecret);
//获取用户信息
$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" .
$access_token . "&openid=" . $object->FromUserName . "&lang=zh_CN";
$output = file_get_contents($url);
$jsoninfo = json_decode($output,true);
if($jsoninfo['sex'] == 1) {
$sex = "男";
} else if($jsoninfo['sex'] == 2) {
$sex = "女";
} else {
$sex = "未知";
}
$content = array();
$content[] = array('Title' => "我知道你是谁!",'Description' => "昵称:" . $jsoninfo['nickname'] .
"\r\n" . "性别:" . $sex . "\r\n" . "国家:" . $jsoninfo['country'] . "\r\n" . "省份:" .
$jsoninfo['province'] . "\r\n" . "城市:" . $jsoninfo['city'],'PicUrl' => $jsoninfo['headimgurl'],
'Url' => '');
break;
default:
$content = '您发送的消息有误!';
break;
}
if(is_array($content)) {
if(isset($content[0]['PicUrl'])) {
$result = $this->transmitInfo($object,$content);
}
} else {
$result = $this->transmitText($object,$content);
}
return $result;
}
//接收事件推送
private function receiveEvent($object)
{
$content = "";
switch($object->Event)
{
case 'subscribe':
$content = "欢迎关注*****!";
break;
case 'unsubscribe':
$content = "取消关注";
break;
case 'CLICK':
switch($object->EventKey)
{
case '我是谁':
//获取access_token
$access_token = $this->get_access_token($this->appid,$this->appsecret);
//获取用户信息
$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" .
$access_token . "&openid=" . $object->FromUserName . "&lang=zh_CN";
$output = file_get_contents($url);
$jsoninfo = json_decode($output,true);
if($jsoninfo['sex'] == 1) {
$sex = "男";
} else if($jsoninfo['sex'] == 2) {
$sex = "女";
} else {
$sex = "未知";
}
$content = array();
$content[] = array('Title' => "我知道你是谁!",'Description' => "昵称:" . $jsoninfo['nickname'] .
"\r\n" . "性别:" . $sex . "\r\n" . "国家:" . $jsoninfo['country'] . "\r\n" . "省份:" .
$jsoninfo['province'] . "\r\n" . "城市:" . $jsoninfo['city'],'PicUrl' => $jsoninfo['headimgurl'],
'Url' => '');
break;
default:
$content = "该按钮暂时尚未添加事件!";
break;
}
break;
default:
$content = "对不起,目前暂不受理此事件!";
break;
}
if(is_array($content)) {
if(isset($content[0]['PicUrl'])) {
$result = $this->transmitInfo($object,$content);
}
} else {
$result = $this->transmitText($object,$content);
}
return $result;
}
//发送文本消息
private function transmitText($object,$content)
{
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
return $result;
}
//发送单图文消息:用户基本信息
private function transmitInfo($object,$infoArray)
{
if(!is_array($infoArray)) {
return;
}
$itemTpl = "<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item> ";
$item_str = "";
foreach ($infoArray as $item){
$item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'],
$item['Url']);
}
$infoTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount>
<Articles> $item_str</Articles>
</xml>";
$result = sprintf($infoTpl, $object->FromUserName, $object->ToUserName, time(),
count($infoArray));
return $result;
}
}
微信公众平台开发接口PHP SDK的更多相关文章
- 微信公众平台开发接口PHP SDK完整版(转载)
<?php/* 方倍工作室 http://www.fangbei.org/ CopyRight 2015 All Rights Reserved*/ define("TOK ...
- 微信公众平台开发接口PHP SDK完整版
<?php /* 方倍工作室 http://www.fangbei.org/ CopyRight 2015 All Rights Reserved */ define("TOKEN&q ...
- .Net实现微信公众平台开发接口(一) 之 “微信开发配置”
我们只要通过微信官方认证,成为开发者,才能实现微信提供的各种接口,否则即使调用了接口,微信也不会实现推送,功能也无法通过开发模式真正得到实现,所以需要正确配置微信信息,通过微信官方认证,成为开发者才可 ...
- .Net实现微信公众平台开发接口(二) 之 “获取access_token”
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token. 接口调用请求说明 http请求方式: GET https://api.weixin.qq.com/ ...
- 170303、PHP微信公众平台开发接口 SDK完整版
<?php /* 方倍工作室 http://www.fangbei.org/ CopyRight 2015 All Rights Reserved */ define("TOKEN&q ...
- .Net实现微信公众平台开发接口(三) 之 “信息回复”
对于每一个POST请求,开发者在响应包(Get)中返回特定XML结构,对该消息进行响应(现支持回复文本.图片.图文.语音.视频.音乐).请注意,回复图片等多媒体消息时需要预先上传多媒体文件到微信服务器 ...
- php的微信公众平台开发接口类
<?php define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest(); if ...
- 微信公众平台开发教程--方培工作室,PHP语言版本
准备工作 微信公众平台的注册 介绍如何注册一个微信公众账号. 入门教程 微信公众平台开发入门教程 内容:1.申请SAE作为服务器; 2.启用开发模式; 3.微信公众平台PHP SDK; 4.接收发送消 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十七):个性化菜单接口说明
前不久微信上线了个性化菜单接口,Senparc.Weixin SDK也已经同步更新. 本次更新升级Senparc.Weixin.MP版本到v13.5.2,依赖Senparc.Weixin版本4.5.4 ...
随机推荐
- NA笔记
常用配置命令 mstsc 远程桌面控制指令(在运行中输入) cmd 运行 copy running-config start 正在启动文件 copy running-config startup-ci ...
- python之路模块与包
一.import加载的模块分为四个通用类别: 1 使用python编写的代码(.py文件) 2 已被编译为共享库或DLL的C或C++扩展 3 包好一组模块的包 4 使用C编写并链接到 ...
- jmeter测试HTTP请求
HTTP超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.(详情参考看一下百科) HTTP发送请求有GE ...
- 定时器(setTimeout和setInterval)调用带参函数失效解决方法
方法1:用匿名函数包裹 function test(str){ alert(str); } var a = "abcde" setTimeout(function(){ ...
- 西邮linux兴趣小组2014纳新免试题(五)
[第五关] 题目 http://final5.sinaapp.com/ 关注西邮Linux微信平台,得到一个名为a的文件 分析 分析文件a 需要反汇编,拿IDA上,打开后发现key_function及 ...
- 转换时间对象和字符串对象&添加时间
/* *基本思路,将字符串时间转化为时间对象,通过毫秒数来加减时间,然后在转化为字符串输出 */ //转化字符时间yy-mm-dd hh:mm:ss 为时间对象 使用split进行字符串的分割,取 ...
- SSM之框架整合
前言 SSM框架,即Spring + Spring MVC + MyBatis的整合框架集,是继SSH后比较主流的Java EE企业级框架,采用标准的MVC模式,项目结构与微软的ASP.NET MVC ...
- C++移动构造函数以及move语句简单介绍
C++移动构造函数以及move语句简单介绍 首先看一个小例子: #include <iostream> #include <cstring> #include <cstd ...
- Qt のEXecl
http://blog.csdn.net/czyt1988/article/details/52121360 OK http://bbs.csdn.net/topics/39184 ...
- HTML 简述
1.本页超链接 <a href="#t">查看 Chapter 4.</a> <a name="t">Test</a& ...