微信公众号
账号注册
微信公众平台的地址
https://mp.weixin.qq.com/“>https://mp.weixin.qq.com
注:每个邮箱智能申请一种账号,服务号,公众号,企业号
公众账号的使用模式
主要分为编辑模式和开发者模式
编辑模式
编辑模式的简单应用
在使用编辑模式前,需要首先调左侧开发者中心功能中,将开发者模式停用
进入公众平台下,首页左侧的功能菜单下都是编辑模式的一些功能
例如:自动回复功能
开发者模式
开发者模式的应用
接入API接口的步骤
1. 填写服务器的URL和token
注:只支持80端口
2. 验证服务器地址有效性
* 将token,timestamp,nonce三个参数进行字典序排序
* 将三个参数字符串拼接成一个字符串进行sha1加密
* 将加密后的字符串和signature进行对比,标识该请求来源于微信
基本配置
URL 公网的ip或者域名,指向是验证服务器地址有效性文件
Token 与之对应即可
EncodingAESKey 随机生成
消息加密方式 选择兼容模式
验证代码如下:
<?php
//1. 将token,timestamp,nonce三个参数按字典序排序
$timestamp = $_GET['timestamp'];
$nonce = $_GET['nonce'];
$token = 'weixin';//和平台添加的token一致
$signature = $_GET['signature'];
$array = array($timestamp, $nonce, $token);
sort($array);//排序
//2. 将三个字符串合并成一个字符串并且用sha1加密
$tmpStr = implode('', $array);//拼接
$tmpStr = sha1($tmpStr);//加密
//3. 将加密后的字符串和signature对比,判断该请求是否来源于微信
if($tmpStr == $signature){//对比
echo $_GET['echostr'];
exit;
}
注意:thinkphp5中token验证需要关闭debug模式
消息推送
消息推送和开放平台验证的地址一致,不同的是,验证url地址是第一次请求,结果返回echostr,关注和其他访问信息算是第一次以后,没有echostr的返回信息。
1. 获取微信推送的post信息
2. 处理消息类型,返回格式为xml,需要转换成对象
//1.获取微信推送的post信息
$postArr = $GLOBALS['HTTP_RAW_POST_DATA'];
//2. 处理消息类型,返回格式为xml,需要转换成对象
$postObj = simplexml_load_string($postArr);
if($tmpStr == $signature && $_GET['echostr']){//对比//只有第一次验证的时候会传echostr这个值,其他的验证不会传
echo $_GET['echostr'];
exit;
}else{
//返回消息的方法
}
关注公众号消息推送
如下是微信推送的post信息,由MsgType和Event来判断是否是关注信息
/*<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
</xml>*/
如果是文本信息,由MsgType和Content来判断信息并且返回相关信息
/*<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>*/
纯文本信息
/**
* 发送文本信息
* @param $toUserName
* @param $fromUserName
* @param $content
* @return string
*/
public function getMsg($toUserName, $fromUserName, $content){
$templete = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$info = sprintf($templete, $toUserName, $fromUserName, time(), $content);
return $info;
}
图文信息
/**
* 发送图文信息
* @param $toUserName
* @param $fromUserName
* @param $arr
* @return string
*/
public function getPicture($toUserName, $fromUserName, $arr){
$templete = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>%s</ArticleCount>
<Articles>";
$templete = sprintf($templete, $toUserName, $fromUserName, time(), count($arr));
foreach ($arr as $k => $v){
$info = "<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>";
$templete .= sprintf($info, $v['title'], $v['desc'], $v['picUrl'], $v['url']);
}
$templete .= "</Articles>
</xml>";
return $templete;
}
access_token
获取access_token,保存到session中
/**
* 获取access_token
* @return mixed
*/
public function getWxAccessToken(){
//将access_token保存再session/cookie中
if($_SESSION['access_token'] && $_SESSION['expire_time'] > time()){
//如果access_token再session中没有过期
return $_SESSION['access_token'];
}else{
//如果access_token不存在或者过期
$appid = 'wx1fab8bfe534b7843';
$appsecret = 'c7640ec02d5115bef4573d9f656c9424';
$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret;
$res = $this->httpCurl($url, 'get', 'json');
$access_token = $res['access_token'];
$_SESSION['access_token'] = $access_token;
$_SESSION['expire_time'] = time() + 7000;
return 'nihao';
}
}
curl
请求地址
/**
* curl的使用
* @param $url 请求地址
* @param string $type 请求类型,get和post
* @param string $res 请求结果,默认返回json类型
* @param string $arr 请求参数,post的body,默认空
* @return mixed
*/
public function httpCurl($url, $type='get', $res='json', $arr=''){
//1.初始化curl
$ch = curl_init();
//2. 设置curl参数
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if($type == 'post'){
curl_setopt($ch, CURLOPT_PORT, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $arr);
}
//3. 采集
$output = curl_exec($ch);
//4. 关闭
curl_close($ch);
if($res == 'json'){
return json_decode($output, true);
}
}