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 相关文章推荐
php gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
May 15 PHP
mysqli_set_charset和SET NAMES使用抉择及优劣分析
Jan 13 PHP
php中{}大括号是什么意思
Dec 01 PHP
跟我学Laravel之快速入门
Oct 15 PHP
php中字符串和正则表达式详解
Oct 23 PHP
PHP图片处理之图片旋转和图片翻转实例
Nov 19 PHP
php版微信公众平台开发之验证步骤实例详解
Sep 23 PHP
PHPCMS2008广告模板SQL注入漏洞修复
Oct 11 PHP
laravel如何开启跨域功能示例详解
Aug 31 PHP
学习thinkphp5.0验证类使用方法
Nov 16 PHP
Smarty模板类内部原理实例分析
Jul 03 PHP
PHP fopen中文文件名乱码问题解决方案
Oct 28 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
深入解析php模板技术原理【一】
2008/01/10 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
2016/11/09 PHP
php的对象传值与引用传值代码实例讲解
2021/02/26 PHP
Jquery数独游戏解析(一)-页面布局
2010/11/05 Javascript
JQury slideToggle闪烁问题及解决办法
2011/07/05 Javascript
jQuery怎么解析Json字符串(Json格式/Json对象)
2013/08/09 Javascript
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
关于Javascript加载执行优化的研究报告
2014/12/16 Javascript
原生js结合html5制作小飞龙的简易跳球
2015/03/30 Javascript
vue组件如何被其他项目引用
2017/04/13 Javascript
深入探究AngularJs之$scope对象(作用域)
2017/07/20 Javascript
Mint UI 基于 Vue.js 移动端组件库
2017/11/07 Javascript
webpack打包js的方法
2018/03/12 Javascript
微信小程序实现美团菜单
2018/06/06 Javascript
JS+HTML实现的圆形可点击区域示例【3种方法】
2018/08/01 Javascript
VUE中使用HTTP库Axios方法详解
2020/02/05 Javascript
基于vue3.0.1beta搭建仿京东的电商H5项目
2020/05/06 Javascript
Windows下Python2与Python3两个版本共存的方法详解
2017/02/12 Python
python实现识别手写数字 python图像识别算法
2020/03/23 Python
Python常见字符串操作函数小结【split()、join()、strip()】
2018/02/02 Python
深入flask之异步非堵塞实现代码示例
2018/07/31 Python
pyinstaller还原python代码过程图解
2020/01/08 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
利用HTML5画出一个坦克的形状具体实现代码
2013/06/20 HTML / CSS
送给他或她的礼物:FUN.com
2018/08/17 全球购物
美国NBA官方商店:NBA Store
2019/04/12 全球购物
Clarks其乐鞋荷兰官网:Clarks荷兰
2019/07/05 全球购物
搞笑车尾标语
2014/06/23 职场文书
党员自我剖析材料
2014/08/31 职场文书
优秀员工事迹材料
2014/12/20 职场文书
第一军规观后感
2015/06/12 职场文书
团支部组织委员竞选稿
2015/11/21 职场文书
Sql Server之数据类型详解
2022/02/28 SQL Server
SQL Server数据库查询出现阻塞之性能调优
2022/04/10 SQL Server
Ruby处理YAML和json数据
2022/04/18 Ruby