移动端开发(微信开发2)
复习
什么是微信:就是聊天工具
什么是公众号:企业或个人组织管理其粉丝的应用工具
什么是公众平台:管理公众号数据的后台
编辑模式运营: 通过微信提供的后台管理数据
开发者模式运营: 通过自己开发的后台管理数据
公众号常用的功能:自动回复(关注回复、关键字回复)、自定义菜单等
订阅号和服务号的区别:服务号功能更强大,但是必须有营业执照才能注册。
︴更改公众平台测试帐号
说明
因为注册的是订阅号,很多高级接口无法测试学习,所以使用微信官方提供的测试帐号,可以体验并测试微信公众平台所有高级接口。
步骤
步骤1:登录微信公众平台,点击左侧菜单后进入公众测试平台
步骤2:微信扫码登录
步骤3:配置测试账号(公众号)开发者模式
脚下留心:配置好后,需要关注测试账号(公众号)才可以进行高级接口试用
一、PHP中的cURL库
1、cURL库
说明:cURL 是一个功能强大的PHP库。
作用:使用cURL实现Get和Post请求的方法,常用于数据采集或接口请求等
cURL四步骤
- 步骤1:初始化curl,使用函数curl_init()
- 步骤2:配置,使用函数curl_setopt()
- 步骤3:发送请求,使用函数curl_exec()
- 步骤4:关闭请求,使用函数curl_close()
使用cURL发送get请求
<?php
//1.初始化curl,说明: curl http 简写 ch
$ch = curl_init();
//2.配置
//2.1配置请求地址(默认get请求)
curl_setopt($ch, CURLOPT_URL, 请求地址?参数1=值1&参数2=值2);
//2.2配置数据响应方式(1.默认直接输出,2.复制给变量不输出)
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//3.发送http请求
$data = curl_exec($ch);
//4.关闭
curl_close($ch);
4、使用cURL发送post请求
<?php
//1.初始化curl,说明: curl http 简写 ch
$ch = curl_init();
//2.配置
//2.1配置请求地址(默认get请求)
curl_setopt($ch, CURLOPT_URL, 请求地址?参数1=值1&参数2=值2);
//2.2配置数据响应方式(1.默认直接输出,2.复制给变量不输出)
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//2.3设置请求方式
curl_setopt($ch, CURLOPT_POST, true);
//2.4设置POST请求数据(post fields)
$arrData = [
‘uname’ => ‘陈总’,
‘pwd’ => 123
];
curl_setopt($ch, CURLOPT_POSTFIELDS, $arrData);
//3.发送http请求
$data = curl_exec($ch);
//4.关闭
curl_close($ch);
■ 案例:请求api接口
1)笑话接口
http://japi.juhe.cn/joke/content/text.from?key=2ca3e19979fadf2279ac6a036669f5ad&page=1&pagesize=10
2)代码
<?php
// 请求接口:http://japi.juhe.cn/joke/content/text.from?key=您申请的KEY&page=1&pagesize=10
//1.初始化
$ch = curl_init();
//2.配置
//2.1设置请求地址
curl_setopt($ch, CURLOPT_URL, ‘http://japi.juhe.cn/joke/content/text.from?key=2ca3e19979fadf2279ac6a036669f5ad&page=1&pagesize=10’);
//2.2数据流不直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//3.发送请求
$data = curl_exec($ch);
//4.释放资源
curl_close($ch);
//语法:json_encode(数组) 转化为json数据
//语法:json_decode(json数据,参数2)
//说明:将数据转化为数组或者对象,(参数2:true-数组,false-对象,默认)
// $data = iconv(‘utf-8’, ‘gbk’, $data);
// var_dump($data);die;
$data = json_decode($data, true);
echo ‘<pre>’;
print_r($data);
■ 案例:采集网站数据
场景:公司网站开发完毕,没有数据,如果不添加数据丑用户体验度不高,但是手动添加工程浩大费事
解决:http://bbs.itheima.com/forum-393-1.html 采集最新活动
采集表示抓取指定网站数据(注:数据采集就是抓取别人网站的数据保存自己的数据库)
代码
<?php
//1.初始化
$ch = curl_init();
//2.配置
//2.1设置请求地址
curl_setopt($ch, CURLOPT_URL, ‘http://bbs.itheima.com/forum-393-1.html’);
//2.2数据流不直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//3.发送请求
$data = curl_exec($ch);
//4.释放资源
curl_close($ch);
// var_dump($data);
//语法:preg_match(正则表达式, 待匹配的数据)
//语法:preg_match_all(正则表达式, 待匹配的数据, 匹配的结果)
//待匹配的数据标识<a href=”thread-345001-1-1.html” onclick=”atarget(this)” class=”s xst”>论坛改版签到不变,签到福利兑换接着走起来!</a>
//[123] 只匹配1或者2或者3
//[^123] 不匹配1或2或3
//[^>]* 表示匹配不等于>的字符任意次数
preg_match_all(‘/<a[^>]* class=”s xst”>(.*)<\/a>/’, $data, $rs);
echo ‘<pre>’;
print_r($rs);
︴封装
<?php
//1.单独完成功能
//2.随便写一个空方法
//3.将刚单独写好的功能放到方法中
//4.找需要传递的参数,定义成形参
/**
* PHP发送请求
* @param string $api 接口地址
* @param array $postData POST请求数据
*/
function httpRequest($api, $postData = array())
{
//1.初始化
$ch = curl_init();
//2.配置
//2.1设置请求地址
curl_setopt($ch, CURLOPT_URL, $api);
//2.2数据流不直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//2.3POST请求
if ($postData) {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
}
//curl注意事项,如果发送的请求是https,必须要禁止服务器端校检SSL证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//3.发送请求
$data = curl_exec($ch);
//4.释放资源
curl_close($ch);
return $data;
}
二、获取接口调用凭证access_token
1、说明
2、接口说明
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
3、使用curl库获取access_token
<?php
$apiData = [
‘appid’ => ‘wx56e3e3d75414b3d0’,
‘secret’ => ‘f8ec8178c6dda48d1cb25c07304eff44’
];
$api = ‘https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&’.http_build_query($apiData);
$data = httpRequest($api);
echo $data[‘access_token’];
/**
* PHP发送请求
* @param string $api 接口地址
* @param array $postData POST请求数据
*/
function httpRequest($api, $postData = array())
{
//1.初始化
$ch = curl_init();
//2.配置
//2.1设置请求地址
curl_setopt($ch, CURLOPT_URL, $api);
//2.2数据流不直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//2.3POST请求
if ($postData) {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
}
//curl注意事项,如果发送的请求是https,必须要禁止服务器端校检SSL证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//3.发送请求
$data = curl_exec($ch);
//4.释放资源
curl_close($ch);
return json_decode($data, true);
}
︴封装方法保存access_token
/**
* 获取access_token
* @see https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
* @return string
*/
function getToken() {
$apiData = [
‘appid’ => ‘wx56e3e3d75414b3d0’,
‘secret’ => ‘f8ec8178c6dda48d1cb25c07304eff44’
];
$api = ‘https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&’.http_build_query($apiData);
$data = httpRequest($api);
return $data[‘access_token’];
}
三、微信的自定义菜单
说明
在微信中,自定义菜单拥有缓存,其生效时间默认为24小时,如果想实时查看到创建或删除效果,我们可以取消关注公众平台并再次关注即可。
2、自定义菜单的创建接口
接口
参数分析
2)代码
<?php
//1.定义接口
$api = ‘https://api.weixin.qq.com/cgi-bin/menu/create?access_token=’.getToken();
//2.定义接口数据
$postData = <<<STR
{
“button”:[
{
“type”:”click”,
“name”:”程程”,
“key”:”V1001_TODAY_MUSIC”
},
{
“name”:”啊第三方”,
“sub_button”:[
{
“type”:”view”,
“name”:”搜索”,
“url”:”http://www.soso.com/”
},
{
“type”:”click”,
“name”:”赞一下我们”,
“key”:”V1001_GOOD”
}
]
}
]
}
STR;
//3.发送请求
$data = httpRequest($api, $postData);
var_dump($data);
/**
* 获取access_token
* @see https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
* @return string
*/
function getToken() {
$apiData = [
‘appid’ => ‘wx56e3e3d75414b3d0’,
‘secret’ => ‘f8ec8178c6dda48d1cb25c07304eff44’
];
$api = ‘https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&’.http_build_query($apiData);
$data = httpRequest($api);
return $data[‘access_token’];
}
/**
* PHP发送请求
* @param string $api 接口地址
* @param array $postData POST请求数据
*/
function httpRequest($api, $postData = array())
{
//1.初始化
$ch = curl_init();
//2.配置
//2.1设置请求地址
curl_setopt($ch, CURLOPT_URL, $api);
//2.2数据流不直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//2.3POST请求
if ($postData) {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
}
//curl注意事项,如果发送的请求是https,必须要禁止服务器端校检SSL证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//3.发送请求
$data = curl_exec($ch);
//4.释放资源
curl_close($ch);
return json_decode($data, true);
}
3、自定义菜单事件推送
- 场景:创建微信自定义菜单,如果type=click点击没反映
- 解决:wx.php增加判断
- 代码:
4、自定义菜单删除接口
1)接口
2)代码
<?php
//1.定义接口
$api = ‘https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=’.getToken();
//2.发送请求
$data = httpRequest($api);
var_dump($data);
/**
* 获取access_token
* @see https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
* @return string
*/
function getToken() {
$apiData = [
‘appid’ => ‘wx56e3e3d75414b3d0’,
‘secret’ => ‘f8ec8178c6dda48d1cb25c07304eff44’
];
$api = ‘https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&’.http_build_query($apiData);
$data = httpRequest($api);
return $data[‘access_token’];
}
/**
* PHP发送请求
* @param string $api 接口地址
* @param array $postData POST请求数据
*/
function httpRequest($api, $postData = array())
{
//1.初始化
$ch = curl_init();
//2.配置
//2.1设置请求地址
curl_setopt($ch, CURLOPT_URL, $api);
//2.2数据流不直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//2.3POST请求
if ($postData) {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
}
//curl注意事项,如果发送的请求是https,必须要禁止服务器端校检SSL证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//3.发送请求
$data = curl_exec($ch);
//4.释放资源
curl_close($ch);
return json_decode($data, true);
}
删除之后重新关注公众号,发现打开直接是聊天窗口
︴wx.php
<?php
/**
* wechat php test
*/
//define your token
define(“TOKEN”, “itcast”);
$wechatObj = new wechatCallbackapiTest();
// $wechatObj->valid();
$wechatObj->responseMsg();
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)){
/* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
the best way is to check the validity of xml by yourself */
libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($postStr, ‘SimpleXMLElement’, LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$time = time();
//——————–
if ($postObj->MsgType == ‘event’) {
if ($postObj->Event == ‘CLICK’) {
$this->sendText($fromUsername, $toUsername, ‘坏蛋,别点我’);
}
} else {
$this->sendText($fromUsername, $toUsername, ‘php12’);
}
}else {
echo “”;
exit;
}
}
/**
* 响应音乐消息
* @param string $fromUsername 接受者
* @param string $toUsername 发送者
* @param string $title 标题
* @param string $desc 描述
* @param string $musicUrl 音乐互联网地址(.mp3)
* @param string $ThumbMediaId 封面
* @param return
*/
private function sendMusic($fromUsername, $toUsername, $title=’摇一摇歌声’, $desc=’甜美型,那是骗你的’, $musicUrl=’http://47.91.211.137/zxk/music.mp3′, $ThumbMediaId=’t96tqk6yOa_patBRMJNme_zrt3mlbKWCSZtXy5LMuSV8CZF58jXG5pRP67Xnciyb’) {
$tpl = ‘<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
<Music>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<MusicUrl><![CDATA[%s]]></MusicUrl>
<HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
<ThumbMediaId><![CDATA[%s]]></ThumbMediaId>
</Music>
</xml>’;
echo sprintf($tpl, $fromUsername, $toUsername, time(), $title, $desc, $musicUrl, $musicUrl, $ThumbMediaId);
die;
}
/**
* 响应文本消息
* @param string $fromUsername 接受者
* @param string $toUsername 发送者
* @param string $content 发送的内容
* @param return
*/
private function sendText($fromUsername, $toUsername, $content) {
$textTpl = ‘<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>’;
echo sprintf($textTpl, $fromUsername, $toUsername, time(), $content);
die;
}
/**
* 响应图片消息
* @param string $fromUsername 接受者
* @param string $toUsername 发送者
* @param string $MediaId 媒体ID(https://mp.weixin.qq.com/debug 先回去access_token 然后获取MediaId)
* @param return
*/
private function sendImage($fromUsername, $toUsername, $MediaId = ‘G3P8hP2UXqozqUrOpt6rkfC2LEykkeD4OGTPBUyjVFgrGy0-C1yOR3Bvg0vSalic’)
{
//响应图片的xml报文
$tpl = ‘<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image><MediaId><![CDATA[%s]]></MediaId></Image>
</xml>’;
//脚下留心:MediaId是需要通过接口获取的,明天详细讲解,今天通过工具获取
//https://mp.weixin.qq.com/debug 查看MediaId(G3P8hP2UXqozqUrOpt6rkfC2LEykkeD4OGTPBUyjVFgrGy0-C1yOR3Bvg0vSalic)
echo sprintf($tpl, $fromUsername, $toUsername, time(), $MediaId);
die;
}
/**
* 响应视频消息
* @param string $fromUsername 接受者
* @param string $toUsername 发送者
* @param string $MediaId 媒体ID(https://mp.weixin.qq.com/debug 先回去access_token 然后获取MediaId)
* @param return
*/
private function sendVideo($fromUsername, $toUsername, $MediaId = ‘8pudm18nSyQ5vBO8fCKQ_ucHm9BKTUtTDjfoLNYfoev_B1JY-hJ-E1mk5BncLCtm’)
{
$tpl = ‘<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA]></MsgType>
<Video>
<MediaId><![CDATA[%s]]></MediaId>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
</Video>
</xml>’;
echo sprintf($tpl, $fromUsername, $toUsername, time(), $MediaId, ‘陈恒那些事’, ‘大战三百回合’);
}
private function checkSignature()
{
// you must define TOKEN by yourself
if (!defined(“TOKEN”)) {
throw new Exception(‘TOKEN is not defined!’);
}
$signature = $_GET[“signature”];
$timestamp = $_GET[“timestamp”];
$nonce = $_GET[“nonce”];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
// use SORT_STRING rule
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}
?>
四、多媒体文件上传接口
1、为什么需要多媒体文件上传接口
回顾回复消息接口,图片回复接口、语音回复接口、视频回复接口,这三个接口在开发时都需要提供一个参数MediaId,在应用中,如果想获取MediaId就必须使用多媒体文件上传接口。
2、分析多媒体文件上传接口
3、编写php代码,实现素材上传
<?php
//1.定义接口
$apiData = array(
‘access_token’=>getToken(),
‘type’=>’image’
);
$api = ‘https://api.weixin.qq.com/cgi-bin/media/upload?’.http_build_query($apiData);
//2.发送请求
$filePath = dirname(__FILE__) . DIRECTORY_SEPARATOR .’zhujiao.jpg’; //脚下留心:window不区分\/但linux只支持 /
//$postData = array(‘media’ => ‘@’.$filePath); //脚下留心:PHP版本低于5.5
$postData = array(‘media’ => new Curlfile($filePath)); //脚下留心:PHP版本高于5.5
$data = httpRequest($api, $postData);
var_dump($data);
/**
* 获取access_token
* @see https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
* @return string
*/
function getToken() {
$apiData = array(
‘appid’ => ‘wx56e3e3d75414b3d0’,
‘secret’ => ‘f8ec8178c6dda48d1cb25c07304eff44’
);
$api = ‘https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&’.http_build_query($apiData);
$data = httpRequest($api);
return $data[‘access_token’];
}
/**
* PHP发送请求
* @param string $api 接口地址
* @param array $postData POST请求数据
*/
function httpRequest($api, $postData = array())
{
//1.初始化
$ch = curl_init();
//2.配置
//2.1设置请求地址
curl_setopt($ch, CURLOPT_URL, $api);
//2.2数据流不直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//2.3POST请求
if ($postData) {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
}
//curl注意事项,如果发送的请求是https,必须要禁止服务器端校检SSL证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//3.发送请求
$data = curl_exec($ch);
//4.释放资源
curl_close($ch);
return json_decode($data, true);
}
︴封装
function getMediaId($filePath) {
//1.定义接口
$apiData = array(
‘access_token’ => getToken(),
‘type’=>’image’
);
$api = ‘https://api.weixin.qq.com/cgi-bin/media/upload?’.http_build_query($apiData);
//2.发送请求
//$filePath = dirname(__FILE__) . DIRECTORY_SEPARATOR .’zhujiao.jpg’; //脚下留心:window不区分\/但linux只支持 /
if(version_compare(PHP_VERSION,’5.5.0′,'<‘)) {
//脚下留心:PHP版本低于5.5
$postData = array(‘media’ => ‘@’.$filePath);
} else {
//脚下留心:PHP版本高于5.5
$postData = array(‘media’ => new Curlfile($filePath));
}
$data = httpRequest($api, $postData);
return $data[‘media_id’];
// var_dump($data);
}
五、封装Wechat.class.php类文件
1、为什么需要Wechat.class.php类文件
答:随着时间的推移,wx.php中的功能也越来越复杂,为了简化wx.php(微信官方SDK)中的相关操作,我们可以把一些常用的功能如获取access_token/curl库封装在一个类中。
2、封装Wechat.class.php类文件
<?php
define(‘APPID’, ‘wx56e3e3d75414b3d0’);
define(‘APPSECRET’, ‘f8ec8178c6dda48d1cb25c07304eff44’);
class Wechat
{
/**
* 获取access_token
* @see https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
* @return string
*/
protected function getToken()
{
$apiData = array(
‘appid’ => APPID,
‘secret’ => APPSECRET
);
$api = ‘https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&’.http_build_query($apiData);
$data = $this->httpRequest($api);
return $data[‘access_token’];
}
/**
* 上传媒体文件
* @see https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738726
* @return string
* 注:
* 图片(image): 2M,支持PNG\JPEG\JPG\GIF格式
* 语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
* 视频(video):10MB,支持MP4格式
* 缩略图(thumb):64KB,支持JPG格式
*/
protected function getMediaId($filePath)
{
//1.定义接口
$apiData = array(
‘access_token’ => $this->getToken(),
‘type’=>’image’
);
$api = ‘https://api.weixin.qq.com/cgi-bin/media/upload?’.http_build_query($apiData);
//2.发送请求
//$filePath = dirname(__FILE__) . DIRECTORY_SEPARATOR .’zhujiao.jpg’; //脚下留心:window不区分\/但linux只支持 /
if(version_compare(PHP_VERSION,’5.5.0′,'<‘)) {
//脚下留心:PHP版本低于5.5
$postData = array(‘media’ => ‘@’.$filePath);
} else {
//脚下留心:PHP版本高于5.5
$postData = array(‘media’ => new Curlfile($filePath));
}
$data = $this->httpRequest($api, $postData);
return $data[‘media_id’];
// var_dump($data);
}
/**
* PHP发送请求
* @param string $api 接口地址
* @param array $postData POST请求数据
*/
private function httpRequest($api, $postData = array())
{
//1.初始化
$ch = curl_init();
//2.配置
//2.1设置请求地址
curl_setopt($ch, CURLOPT_URL, $api);
//2.2数据流不直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//2.3POST请求
if ($postData) {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
}
//curl注意事项,如果发送的请求是https,必须要禁止服务器端校检SSL证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//3.发送请求
$data = curl_exec($ch);
//4.释放资源
curl_close($ch);
return json_decode($data, true);
}
/**
* 响应音乐消息
* @param string $fromUsername 接受者
* @param string $toUsername 发送者
* @param string $title 标题
* @param string $desc 描述
* @param string $musicUrl 音乐互联网地址(.mp3)
* @param string $ThumbMediaId 封面
* @param return
*/
protected function sendMusic($fromUsername, $toUsername, $title=’摇一摇歌声’, $desc=’甜美型,那是骗你的’, $musicUrl=’http://47.91.211.137/zxk/music.mp3′, $ThumbMediaId=’t96tqk6yOa_patBRMJNme_zrt3mlbKWCSZtXy5LMuSV8CZF58jXG5pRP67Xnciyb’) {
$tpl = ‘<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
<Music>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<MusicUrl><![CDATA[%s]]></MusicUrl>
<HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
<ThumbMediaId><![CDATA[%s]]></ThumbMediaId>
</Music>
</xml>’;
echo sprintf($tpl, $fromUsername, $toUsername, time(), $title, $desc, $musicUrl, $musicUrl, $ThumbMediaId);
die;
}
/**
* 响应文本消息
* @param string $fromUsername 接受者
* @param string $toUsername 发送者
* @param string $content 发送的内容
* @param return
*/
protected function sendText($fromUsername, $toUsername, $content) {
$textTpl = ‘<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>’;
echo sprintf($textTpl, $fromUsername, $toUsername, time(), $content);
die;
}
/**
* 响应图片消息
* @param string $fromUsername 接受者
* @param string $toUsername 发送者
* @param string $MediaId 媒体ID(https://mp.weixin.qq.com/debug 先回去access_token 然后获取MediaId)
* @param return
*/
protected function sendImage($fromUsername, $toUsername, $MediaId = ‘G3P8hP2UXqozqUrOpt6rkfC2LEykkeD4OGTPBUyjVFgrGy0-C1yOR3Bvg0vSalic’)
{
//响应图片的xml报文
$tpl = ‘<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image><MediaId><![CDATA[%s]]></MediaId></Image>
</xml>’;
//脚下留心:MediaId是需要通过接口获取的,明天详细讲解,今天通过工具获取
//https://mp.weixin.qq.com/debug 查看MediaId(G3P8hP2UXqozqUrOpt6rkfC2LEykkeD4OGTPBUyjVFgrGy0-C1yOR3Bvg0vSalic)
echo sprintf($tpl, $fromUsername, $toUsername, time(), $MediaId);
die;
}
/**
* 响应视频消息
* @param string $fromUsername 接受者
* @param string $toUsername 发送者
* @param string $MediaId 媒体ID(https://mp.weixin.qq.com/debug 先回去access_token 然后获取MediaId)
* @param return
*/
protected function sendVideo($fromUsername, $toUsername, $MediaId = ‘8pudm18nSyQ5vBO8fCKQ_ucHm9BKTUtTDjfoLNYfoev_B1JY-hJ-E1mk5BncLCtm’)
{
$tpl = ‘<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA]></MsgType>
<Video>
<MediaId><![CDATA[%s]]></MediaId>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
</Video>
</xml>’;
echo sprintf($tpl, $fromUsername, $toUsername, time(), $MediaId, ‘陈恒那些事’, ‘大战三百回合’);
}
}
让wx.php中的wechatCallbackapiTest类继承Wechat类
<?php
require ‘./Wechat.class.php’;
/**
* wechat php test
*/
//define your token
define(“TOKEN”, “itcast”);
class wechatCallbackapiTest extends Wechat
{
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)){
/* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
the best way is to check the validity of xml by yourself */
libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($postStr, ‘SimpleXMLElement’, LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$type = trim($postObj->MsgType);
$time = time();
switch ($type) {
case ‘text’:
if ($keyword == ‘来图片’) {
$filePath = dirname(__FILE__) . DIRECTORY_SEPARATOR .’zhujiao.jpg’;
$this->sendImage($fromUsername, $toUsername, $this->getMediaId($filePath));
} else {
$this->sendText($fromUsername, $toUsername, ‘陈总’);
}
break;
default:
$this->sendText($fromUsername, $toUsername, ‘兄弟,不在服务器’);
# code…
break;
}
}else {
echo “”;
exit;
}
}
private function checkSignature()
{
// you must define TOKEN by yourself
if (!defined(“TOKEN”)) {
throw new Exception(‘TOKEN is not defined!’);
}
$signature = $_GET[“signature”];
$timestamp = $_GET[“timestamp”];
$nonce = $_GET[“nonce”];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
// use SORT_STRING rule
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}
$wechatObj = new wechatCallbackapiTest();
//脚下留心:
//如果通信不成功
//解决思路:
//1.检查URL是否能正常访问
//2.检查调用的是否是valid方法
//$wechatObj->valid();
$wechatObj->responseMsg();
六、客服消息接口
1、什么是客服消息接口
2、分析客服消息接口
︴发送文本消息
<?php
require ‘Wechat.class.php’;
$Wechat = new Wechat;
$api = “https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=”.$Wechat->getToken();
$postData = <<<STR
{
“touser”:”oPOJgwXPeavENw-hHUdZhjz_P8sk”,
“msgtype”:”text”,
“text”:
{
“content”:”靠你青蛙”
}
}
STR;
//脚下留心:OPENID是用户和公众号之间的唯一表示
$data = $Wechat->httpRequest($api, $postData);
var_dump($data);
︴发送图文消息
<?php
require ‘Wechat.class.php’;
$Wechat = new Wechat;
$api = “https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=”.$Wechat->getToken();
// $postData = <<<STR
// {
// “touser”:”oPOJgwXPeavENw-hHUdZhjz_P8sk”,
// “msgtype”:”text”,
// “text”:
// {
// “content”:”靠你青蛙”
// }
// }
// STR;
$filePath = dirname(__FILE__) . DIRECTORY_SEPARATOR .’zhujiao.jpg’;
$postData = array(
“touser” => “oPOJgwUiVGmM4Vmt3H3YDRBCoJYI”,
“msgtype” => “image”,
“image” => array(
“media_id” => $this->getMediaId($filePath)
)
);
//脚下留心:OPENID是用户和公众号之间的唯一表示
$data = $Wechat->httpRequest($api, json_encode($postData));
var_dump($data);
︴产品化
七、群发消息接口
1、什么是群发消息接口
2、接口说明
使用php代码实现群发功能
<?php
require ‘Wechat.class.php’;
$Wechat = new Wechat;
$api = “https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=”.$Wechat->getToken();
$postData = ‘{
“touser”:[
“oPOJgwUiVGmM4Vmt3H3YDRBCoJYI”,
“oPOJgwXPeavENw-hHUdZhjz_P8sk”,
“oPOJgwbZ6m5mwBKzQZFb2alSLr0s”
],
“msgtype”: “text”,
“text”: { “content”: “美国大片:下载.com”}
}’;
//脚下留心:OPENID是用户和公众号之间的唯一表示
$data = $Wechat->httpRequest($api, json_encode($postData));
var_dump($data);