php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)


Posted in PHP onNovember 28, 2016

怎么调用微信高级接口

微信高级接口和微信普通接口的区别

后台服务器可以调用微信的接口与微信用户进行讯息的通信,这样的行为就是在调用微信的接口,这些接口是基础接口,你不需要任何付费行为或者身份认证行为就可以调用。但是有一些高级接口,你的微信公众号必须达到一定的权限如通过微信认证才能调用自定义菜单、微信支付等高级功能。
不过微信公众帐号的测试号系统可以应用这些高级接口(微信支付等涉及交易的接口除外)。

微信高级接口的调用

微信高级接口的调用需要先调用一个token_access接口,只有先调用这个接口才能调用其它高级接口。
如下:连通高级接口示意图

php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)

调用token_access需要用到appID和appsecreset(在微信公众号平台开发(一)中已经讲述这两者的由来)

调用代码如下

<?php
$appid = "wxbad0b4x543aa0b5e";
$appsecret = "ed222a84da15cd24c4bdfa5d9adbabf2";
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret";
//下面是一个cURL会话过程,通过这个会话可以返回一段字符串{"access_token":"NU7Kr6v9L9TQaqm5NE3OTPctTZx797Wxw4Snd2WL2HHBqLCiXlDVOw2l-Se0I-WmOLLniAYLAwzhbYhXNjb"}
这就是我们要获得的Access Token了。在调用高级功能接口的时候就靠它。这个过程用的时候直接引用就好,不需要深究,这个cURL系统相关函数有点多而且复杂。

$ch = curl_init();//初始化
curl_setopt($ch, CURLOPT_URL, $url);//与url建立对话
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //进行配置
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //进行配置
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//进行配置
$output = curl_exec($ch);//执行对话,获取接口数据Access Token
curl_close($ch);//关闭会话
$jsoninfo = json_decode($output, true);//解码接口数据,将json格式字符串转换成php变量或数组。默认是变量,加true后是数组。
$access_token = $jsoninfo["access_token"];

?>

调用微信高级接口

1)、调用自定义菜单功能

//创建一个自定义菜单的json字符串
 $jsonmenu = '{
  "button":[
  {
   "name":"关于我们",
   "sub_button":[
   {
    "type":"click",
    "name":"公司简介",
    "key":"公司简介"
   },
   {
    "type":"click",
    "name":"社会责任",
    "key":"社会责任"
   },
   {
    "type":"click",
    "name":"联系我们",
    "key":"联系我们"
   }]
  },
  {
   "name":"产品服务",
   "sub_button":[
   {
    "type":"click",
    "name":"微信平台",
    "key":"微信平台"
   },
   {
    "type":"click",
    "name":"微博应用",
    "key":"微博应用"
   },
   {
    "type":"click",
    "name":"手机网站",
    "key":"手机网站"
   }]
  },
  {
   "name":"技术支持",
   "sub_button":[
   {
    "type":"click",
    "name":"文档下载",
    "key":"文档下载"
   },
   {
    "type":"click",
    "name":"技术社区",
    "key":"技术社区"
   },
   {
    "type":"click",
    "name":"服务热线",
    "key":"服务热线"
   }]
  }]
 }';

 $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token;//接口地址
$result = https_request($url, $jsonmenu);//与接口建立会话
var_dump($result);

function https_request($url,$data = null){
 $curl = curl_init();
 curl_setopt($curl, CURLOPT_URL, $url);
 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
 if (!empty($data)){
  curl_setopt($curl, CURLOPT_POST, 1);
  curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
 }
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 $output = curl_exec($curl);
 curl_close($curl);
 return $output;
}
//把这段代码加入到上面的调用Access Token接口的代码中就可以实现在微信公众号界面添加菜单的功能。

当我们为微信公众号添加菜单后怎么样设置点击菜单时会出现相应的效果呢?
这里涉及到另一种xml类型的数据传递:

<xml>
<ToUserName><![CDATA[gh_82479813ed64]]></ToUserName>
<FromUserName><![CDATA[ojpX_jig-gyi3_Q9fHXQ4rdHniQs]]></FromUserName>
<CreateTime>1392297442</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[CLICK]]></Event>
<EventKey><![CDATA[公司简介]]></EventKey>
</xml>
//上面是点击click菜单的数据传递类型,数据会发送给后台服务器,然后服务器做出响应。

菜单类型有多种,xml类型差别,详细情况可以在微信公众号平台上查看相应文档。

*这里要说明的是只要你有微信公众号的appID和appsecret,在任何服务器空间运行这段php代码都可以进入微信服务器调用相应功能,不一定非要在进行了token验证的服务器下运行。token验证是为了后台服务器进行判断数据来源是否是来自微信服务器,与调用微信服务器的高级接口并没有多大的关联。
php文件一定要在服务器运行才会产生效果。

其它高级接口的调用都同调用自定义菜单一样。

2)、调用客服接口

当微信用户主动发消息 给微信公众帐号的时候(包括发送信息、单击自定义菜单click事件、订阅事件、扫描二维码、支付成功事件)微信会把消息数据推送给开发者。开发者在一段时间内可以调用客服接口消息,通过post一个JSON数据包来发送消息给用户。

$access_token = "nFX6GFsspSLBKJLgMQ3kj1YM8_FchRE7vE2ZOIlmfiCOQntZKnBwuOen2GCBpFHBYS4QLGX9fGoVfA36tftME2sRiYsKPzgGQKU-ygU7x8cgy_1tlQ4n1mhSumwQEGy6PK6rdTdo8O8GROuGE3Hiag";

$openid = "o7Lp5t6n59DeX3U0C7Kric9qEx-Q";//微信用户都有一个openID

下图所示即为openID的获取方式。

php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)

$data = '{
 "touser":"'.$openid.'",
 "msgtype":"text",
 "text":
 {
   "content":"Hello World"
 }
}';//通过基础消息接口发送的数据是XML格式的,但是调用客服接口发送的数据是json数据格式,更易传输。 
$url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$access_token;
$result = https_request($url,$data);
var_dump($result);

function https_request($url,$data)
{
 $curl = curl_init();
 curl_setopt($curl, CURLOPT_URL, $url); 
 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
 curl_setopt($curl, CURLOPT_POST, 1);
 curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 $result = curl_exec($curl);
 if (curl_errno($curl)) {
  return 'Errno'.curl_error($curl);
 }
 curl_close($curl);
 return $result;
}

客服接口发送图文消息、音乐消息、视频消息具体格式请参看微信公众平台上的开发帮助文档。
客服接口可以和消息接口混合使用。

这里大家可能不明白既然可以直接通过被动响应消息的接口发送xml数据给用户,为什么还需要这样一个客服接口?可以这样理解,被动响应消息是一次性的只能回复一次相同的消息。如你向一个音乐平台输入一个歌星名称,通过被动响应方式发送的消息永远只会回复你一首相同的歌。但是通过客服接口方式可以每次回复不同的 歌曲,这涉及到MySQL数据库。

再简单一点,一个查看快递包括地址的微信公众平台。你每次输入同一个订单编号,后台却能够回复订单每次所在的位置(针对同样的文本却可以做出不同的回应)就像是人工回复一样,这就是客服接口 。

3)、生成二维码接口

二维码类型分两种,分别是临时二维码eh 和永久二维码,前者与过期时间,最长是1800s。
生成二维码你需要调用3个接口,
第一个是access_token
第二个是生成ticket接口
第三个是通过第二个接口生成的ticket来换取二维码图片。

$access_token = " xDx0pD_ZvXkHM3oeu5oGjDt1_9HxlA-9g0vtR6MZ-v4r7MpvZYC4ee4OxN97Lr4irkPKE94tzBUhpZG_OvqAC3D3XaWJIGIn0eeIZnfaofO1C3LNzGphd_rEv3pIimsW9lO-4FOw6D44T3sNsQ5yXQ";//假定获取的ACCESS TOKEN为这段代码。

//临时二维码
$qrcode = '{"expire_seconds": 1800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 10000}}}';
//永久二维码
$qrcode = '{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 1000}}}';

$url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=$access_token";//创建ticket接口
$result = https_request($url,$qrcode);
$jsoninfo = json_decode($result, true);
$ticket = $jsoninfo["ticket"];

function https_request($url, $data = null){
 $curl = curl_init();
 curl_setopt($curl, CURLOPT_URL, $url);
 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
 if (!empty($data)){
  curl_setopt($curl, CURLOPT_POST, 1);
  curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
 }
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 $output = curl_exec($curl);
 curl_close($curl);
 return $output;
}


$ticket = "gQHi8DoAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL0UweTNxNi1sdlA3RklyRnNKbUFvAAIELdnUUgMEAAAAAA==";//获取ticket的字符串

$url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=".urlencode($ticket);//ticket对面二维码图片代码。
$imageInfo = downloadWeixinFile($url);

$filename = "qrcode.jpg";
$local_file = fopen($filename, 'w');
if (false !== $local_file){
 if (false !== fwrite($local_file, $imageInfo["body"])) {
  fclose($local_file);
 }
}

function downloadWeixinFile($url)
{
 $ch = curl_init($url);
 curl_setopt($ch, CURLOPT_HEADER, 0); 
 curl_setopt($ch, CURLOPT_NOBODY, 0); //只取body头
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 $package = curl_exec($ch);
 $httpinfo = curl_getinfo($ch);
 curl_close($ch);
 return array_merge(array('body' => $package), array('header' => $httpinfo)); 
}

在服务器空间运行这段代码,浏览器会生成一张二维码图片。

获取非微信功能接口,比如获取交通信息、天气预报。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
JS中encodeURIComponent函数用php解码的代码
Mar 01 PHP
全新的PDO数据库操作类php版(仅适用Mysql)
Jul 22 PHP
PHP与Java进行通信的实现方法
Oct 21 PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
Nov 11 PHP
Yii实现MySQL多数据库和读写分离实例分析
Dec 03 PHP
php检索或者复制远程文件的方法
Mar 13 PHP
Yii框架实现的验证码、登录及退出功能示例
May 20 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
php封装的mongodb操作类代码
Aug 06 PHP
PHP实现的折半查询算法示例
Oct 09 PHP
如何在Laravel5.8中正确地应用Repository设计模式
Nov 26 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
Aug 30 PHP
php微信公众平台交互与接口详解
Nov 28 #PHP
php微信公众号开发模式详解
Nov 28 #PHP
jQuery+php简单实现全选删除的方法
Nov 28 #PHP
PHP中的use关键字及文件的加载详解
Nov 28 #PHP
php连接微软MSSQL(sql server)完全攻略
Nov 27 #PHP
php源码之将图片转化为data/base64数据流实例详解
Nov 27 #PHP
PHP使用curl函数发送Post请求的注意事项
Nov 26 #PHP
You might like
通过文字传递创建的图形按钮
2006/10/09 PHP
初识PHP中的Swoole
2016/04/05 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
PHP迭代器和生成器用法实例分析
2019/09/28 PHP
禁止JQuery中的load方法装载IE缓存中文件的方法
2009/09/11 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
用表格输出1-1000之间的数字实现代码(附特效)
2013/04/21 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/20 Javascript
jQuery控制TR显示隐藏的三种常用方法
2014/08/21 Javascript
JavaScript实现当网页加载完成后执行指定函数的方法
2015/03/21 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
基于jQuery实现交互体验社会化分享代码附源码下载
2016/01/04 Javascript
基于vuejs+webpack的日期选择插件
2020/05/21 Javascript
Node.js数据库操作之连接MySQL数据库(一)
2017/03/04 Javascript
Vuejs入门教程之Vue生命周期,数据,手动挂载,指令,过滤器
2017/04/19 Javascript
详解vue express启动数据服务
2017/07/05 Javascript
JavaScript中字符串的常用操作方法及特殊字符
2018/03/18 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
2018/08/18 Javascript
用Object.prototype.toString.call(obj)检测对象类型原因分析
2018/10/11 Javascript
详解用JS添加和删除class类名
2019/03/25 Javascript
jquery图片预览插件实现方法详解
2019/07/18 jQuery
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
2020/02/21 Javascript
python模块之StringIO使用示例
2015/04/08 Python
在Python的Tornado框架中实现简单的在线代理的教程
2015/05/02 Python
python 类详解及简单实例
2017/03/24 Python
python链接oracle数据库以及数据库的增删改查实例
2018/01/30 Python
Python实现多线程下载脚本的示例代码
2020/04/03 Python
详解用selenium来下载小姐姐图片并保存
2021/01/26 Python
18岁生日感言
2014/01/12 职场文书
商务英语专业求职信范文
2014/01/28 职场文书
预防职务犯罪警示教育心得体会
2016/01/15 职场文书
2019预备党员转正申请书模板2篇!
2019/08/07 职场文书
浅谈MySQL表空间回收的正确姿势
2021/10/05 MySQL