• 首页
  • 前端
    • HTML
    • CSS
    • Javascript
    • XML
    • AJAX
  • 前端框架
    • BootStrap
    • Jquery
  • PHP
    • 语法
    • 核心
    • 面向对象
    • PHP7
    • Socket
    • Swoole
  • 数据库
    • Mysql
    • Redis
    • Memcache
    • MongoDB
  • 优化
    • 优化方案
    • 页面静态化
    • Nginx
  • 后台框架与实战
    • Smarty
    • 源码Blog
    • TP3.2
    • TP3.2商城
    • TP5.0
    • TP5.0商城
    • Laravel
    • Laravel在线教育平台
    • Yii
    • Yii手机直播
    • CodeIgniter
    • Yaf
  • 移动开发
    • 微信公众号
    • 混合APP
  • 二次开发
    • DedeCMS
  • Linux
    • 基本操作
    • 环境搭建
  • 版本控制
    • GIT
    • SVN
  • Node.js
  • 资料库
没有结果
查看所有结果
  • 首页
  • 前端
    • HTML
    • CSS
    • Javascript
    • XML
    • AJAX
  • 前端框架
    • BootStrap
    • Jquery
  • PHP
    • 语法
    • 核心
    • 面向对象
    • PHP7
    • Socket
    • Swoole
  • 数据库
    • Mysql
    • Redis
    • Memcache
    • MongoDB
  • 优化
    • 优化方案
    • 页面静态化
    • Nginx
  • 后台框架与实战
    • Smarty
    • 源码Blog
    • TP3.2
    • TP3.2商城
    • TP5.0
    • TP5.0商城
    • Laravel
    • Laravel在线教育平台
    • Yii
    • Yii手机直播
    • CodeIgniter
    • Yaf
  • 移动开发
    • 微信公众号
    • 混合APP
  • 二次开发
    • DedeCMS
  • Linux
    • 基本操作
    • 环境搭建
  • 版本控制
    • GIT
    • SVN
  • Node.js
  • 资料库
没有结果
查看所有结果
没有结果
查看所有结果

微信公众号(二)CURL、自定义菜单、事件推送、多媒体上传、客服消息接口、群发消息接口

Mr.Lee 由 Mr.Lee
2018年5月19日
在 微信公众号, 移动端开发
0
微信公众号(三)带参数的二维码接口、LBS 接口、语音识别、图灵机器人、网页授权接口(Oauth2.0)、微信 JSSDK 接口、扫码抽奖、授权登录
0
分享
7
浏览

移动端开发(微信开发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);

标签: CURL事件推送多媒体上传客服消息接口群发消息接口自定义菜单
上一篇文章

微信公众号(三)带参数的二维码接口、LBS 接口、语音识别、图灵机器人、网页授权接口(Oauth2.0)、微信 JSSDK 接口、扫码抽奖、授权登录

下一篇文章

微信公众号(一)服务号与订阅号、编辑模式和开发模式、接口开发、TOKEN、微信六大接口、阿里云服务器

下一篇文章
微信公众号(三)带参数的二维码接口、LBS 接口、语音识别、图灵机器人、网页授权接口(Oauth2.0)、微信 JSSDK 接口、扫码抽奖、授权登录

微信公众号(一)服务号与订阅号、编辑模式和开发模式、接口开发、TOKEN、微信六大接口、阿里云服务器

发表回复 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Search

没有结果
查看所有结果

About Me

个人随笔

Winston Lee

Programmer

Hello & welcome to my blog! My name is Winston Lee and am a programmer and am keen on sharing.

Winston Lee

About Me

Hello & welcome to my blog! My name is Winston Lee and am a programmer and am keen on sharing.

Categories

  • AJAX
  • BootStrap
  • CodeIgniter
  • CSS
  • DedeCMS
  • GIT
  • HTML
  • Javascript
  • Jquery
  • Laravel
  • Laravel在线教育平台
  • Linux
  • Memcache
  • MongoDB
  • MVC
  • Mysql
  • Nginx
  • Node
  • PDO
  • PHP
  • PHP7
  • PHP基本语法
  • PHP核心编程
  • Redis
  • Smarty
  • Socket
  • SVN
  • Swoole
  • TP3.2
  • TP3.2商城
  • TP5.0
  • TP5.0商城
  • XML
  • Yaf
  • Yii
  • Yii手机直播
  • 二次开发
  • 优化方案
  • 前端技术
  • 前端框架
  • 后台框架
  • 基本操作
  • 微信公众号
  • 数据库
  • 未分类
  • 混合APP
  • 源码Blog项目
  • 版本控制
  • 环境搭建
  • 移动端开发
  • 网站优化
  • 资料
  • 面向对象
  • 面向对象编程
  • 页面静态化

Tags

DOM Json RBAC 事件 传参 函数 分页 判断语句 匿名函数 变量 图片上传 存储过程 安装 对象 封装 属性 接口 控制器 数据库操作 数据类型 数据表 数组 文件上传 无刷新分页 权限 标签 模型 正则 流程控制 目录结构 算法 类 索引 继承 缩略图 表关系 视图 路由 运算符 选择器 递归 配置 错误处理 页面静态化 验证码
  • 首页
  • 前端
  • 前端框架
  • PHP
  • 数据库
  • 优化
  • 后台框架与实战
  • 移动开发
  • 二次开发
  • Linux
  • 版本控制
  • Node.js
  • 资料库

沪公网安备31011502400873 | 沪ICP备2024050435号-3

没有结果
查看所有结果
  • 首页
  • 前端
    • HTML
    • CSS
    • Javascript
    • XML
    • AJAX
  • 前端框架
    • BootStrap
    • Jquery
  • PHP
    • 语法
    • 核心
    • 面向对象
    • PHP7
    • Socket
    • Swoole
  • 数据库
    • Mysql
    • Redis
    • Memcache
    • MongoDB
  • 优化
    • 优化方案
    • 页面静态化
    • Nginx
  • 后台框架与实战
    • Smarty
    • 源码Blog
    • TP3.2
    • TP3.2商城
    • TP5.0
    • TP5.0商城
    • Laravel
    • Laravel在线教育平台
    • Yii
    • Yii手机直播
    • CodeIgniter
    • Yaf
  • 移动开发
    • 微信公众号
    • 混合APP
  • 二次开发
    • DedeCMS
  • Linux
    • 基本操作
    • 环境搭建
  • 版本控制
    • GIT
    • SVN
  • Node.js
  • 资料库

沪公网安备31011502400873 | 沪ICP备2024050435号-3