0.作者前言
本文针对人群是有一定开发基础的人员,可以比较快的帮助你了解和学习微信开发.
其次是本文作者本次书写,全部采用的是个人的订阅号,假如是正常的开发流程,可能会存在不同,请读者注意.
本文代码部分主要提供的是关键代码,非关键代码因人而异,需要读者自行补充,请注意.
今天文章下面对一些方法进行了封装,虽然在公司里面,这些都是由后台来对这些任务完成,但是身为一个有理想,有抱负的前端,我们会肯定是有必要的,对吧.而且微信开发很多时候,也是直接由前端来开发完成的.
最后,如果喜欢本文,请关注我呦. 2016年05月31日
1.基本认知
- 订阅号
- 公众号
- 企业号
具体内容请参考 微信公众平台注册步骤示例图(企业)
咱们只需要明白下面这个图的内容。
2. 开发前准备
-
申请一个微信公众号
我们选择了
之后我们首先需要去配置一下接口.
之后我们就可以去修改我们的token.
之后我们需要前往
开发–> 开发者工具 –> 开始开发 –> 接入指南
可以直接点击 接入指南
找到 PHP示例代码下载去进行下载.
我这里帮大家偷个懒 PHP 示例代码下载
下载之后我们需要去进行解压缩,将解压缩之后的文件名称去进行一下修改,例如可以改成 wx.php.
之后我们打开php , 去将里面的内容 token 去进行更改.
之后我们将其从新压缩,压缩完成之后我们需要打开我们的新浪云去管理我们的 PHP 文件.
首先,使用新浪云首先需要进行新浪云的注册以及实名认证,这里相信大家都能弄明白.
只是额外提一点,新浪云是需要消耗云豆的,而新手注册会赠送200云豆,以后则需要自己去购买了.
但是如果是好友邀请,你除了当前的200之外,应该,注意是应该会额外赠送你200云豆,所以咯,小伙伴们如果不嫌弃,可以直接用我下面的注册链接,这样你应该就能获得 400 云豆了.
在我们注册之后,我们就需要开始去创建我们新的应用了.
这里需要注意, PHP 的版本不要选太高,否则会影响后面的内容.
创建了空应用之后,我们就可以在这里找到我们刚才创建的应用了,点击上面的应用名称.
找到应用中的代码管理,之后选择右侧的上传代码.
这时候发现,提示代码上传只支持 zip, gz, tar.gz 三种格式.
这时候就可以把我们刚才特意打包好的应用去上传上去了.
上传之后,我们也可以在上传代码的边上找到编辑代码.
之后直接在编辑代码中去更改我们的 PHP 文件了.
还记得我们刚才在边上有一个链接么?
这时候我们就可以将刚才的链接去直接复制过去,回到微信开发接口这边,把刚才的 URL 填写进去.
但是需要注意,我们需要将链接补全完毕,
也就是将刚才的路径去做一个更改,将地址和文件名串联在一起,之后回到刚才的接口中,可以去做 URL 的添加,但是需要注意,需要在前面添加上 HTML 协议.
至此,我们已经获取了 我们的接口,接下来就正式进入微信开发.
3.获取access_token
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。
以上话术出自 获取access_token
这里主要就是看看你刚才去生成的 APPID 和 APPSECRET 能否正常的获取.
这里我们可以直接现在网页中去尝试一下,看看能否获取数据.
这里把刚才的APPID 等填写进去,如果成功的话,我们应该就能看见我们的 access_token 了.
http请求方式:
GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
这块代码是固定的,可以直接粘贴.
可是我现在只是在网页中获取出来了,我们要是在程序中怎么去获取呢?难道用 AJAX ? 当然不是,这时候我们需要使用 PHP 去获取.
<?php
$appid = "**********这里书写自己的 id*********";
$appsecret = "**********这里书写自己的secret*********";
$api = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}}&secret={$appsecret}";
$json = file_get_contents($api);
// 这种可以进行获取,但是数据不稳定,所以不推荐使用
// 微信官方推荐使用的方法是 curl,
// 我们可以新建一个 PHP,去 打印一下 phpinfo();
// 之后在网页中去查询一下是否有 curl 这个内容
echo $json;
?>
如果我们验证之后确实存在,我们就可以去使用微信提供的方式.
<?php
$appid = "**********这里书写自己的 id*********";
$appsecret = "**********这里书写自己的secret*********";
$api = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}}&secret={$appsecret}";
//$json = file_get_contents($api);
// 这种可以进行获取,但是数据不稳定,所以不推荐使用
// 微信官方推荐使用的方法是 curl,
// 我们可以新建一个 PHP,去 打印一下 phpinfo();
// 之后在网页中去查询一下是否有 curl 这个内容
// echo phpinfo();//比file_get_contents稳定且能发送post请求
function httpGet($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500);
// 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
// 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
// curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
// 这里进行注释是因为这里是进行 token 去进行验证
// 防止其他人恶意刷内容
// 这里因为是本地测试,所以注释一下,正式上线的时候还是需要注释开的
curl_setopt($curl, CURLOPT_URL, $url);
$res = curl_exec($curl);
curl_close($curl);
return $res;
}
$json = httpGet($api);
echo $json;
?>
此段代码可以在 微信JS-SDK中查询到.
这时候我们应该就能够获取我们的 token 了,但是我们现在还需要将其从新获取出来,我们可以将其转换为一个数组,之后从新获取我们的 access_token.
<?php
$appid = "**********这里书写自己的 id*********";
$appsecret = "**********这里书写自己的secret*********";
$api = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}}&secret={$appsecret}";
function httpGet($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
// curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
curl_setopt($curl, CURLOPT_URL, $url);
$res = curl_exec($curl);
curl_close($curl);
return $res;
}
$str = httpGet($api);
// 第二个参数设置为 true ,返回值改为数组
$arr = json_decode($str,true);
print_r($arr);
$accessToken = $arr["assess_token"];
?>
我们已经获取了具体的 access_token, 之后我们就可以存入我们的数据库中,每次使用的时候去进行一个判断,如果是旧的就去获取新的替换它.
这里不对数据库操作做更多说明,这个完全看自己习惯,
只是补充一点, token 的 类型要是 TEXT ,time 的类型最好是 VARCHAR.
之后回到代码部分,这时候我们会首先去连接一下我们刚才的数据库.
具体连接数据库请自行操作.
之后我们就去通过数据库操作去获取到我们的 token.
<?php
$appid = "**********这里书写自己的 id*********";
$appsecret = "**********这里书写自己的secret*********";
function httpGet($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
// curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
curl_setopt($curl, CURLOPT_URL, $url);
$res = curl_exec($curl);
curl_close($curl);
return $res;
}
$str = httpGet($api);
function getToken(){
global $appid;
global $appsecret;
$api = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}}&secret={$appsecret}";
// 第二个参数设置为 true ,返回值改为数组
$arr = json_decode($str,true);
// print_r($arr);
$accessToken = $arr["assess_token"];
return $accessToken;
}
$sql = "SELECT * FROM token";
$result = mysql_query($sql);
if (mysql_num_rows($result) > 0) {
//我们判断时间是否过期
$row = mysql_fetch_assoc($result);
$time = $row["time"];
$nowTime = time();
// 因为刚才微信默认的有效时间是7200秒(2小时)
if ($nowTime - $time > 7200) {
// 过期了,从新获取并更新数据库
$token = getToken();
$time = time();
$sql = "UPDATE token SET token=‘{$token}‘,time=‘$time‘";
mysql_query($sql);
if (mysql_affected_rows() > 0) {
echo "更新成功";
}
else{
echo "更新失败";
}
}
else{
// 没过期
$token = $row["token"];
}
echo $token;
}
else{
//没有的话,就直接去插入
$sql = "INSERT INTO token(id,token,time) VALUES (NULL,‘{$accessToken}‘,‘{$time}‘)";
mysql_query($sql);
if (mysql_insert_id() > 0) {
echo "插入成功";
}
else{
echo "插入失败";
}
}
echo $token;
?>
4.获取微信服务器IP地址
如果公众号基于安全等考虑,需要获知微信服务器的IP地址列表,以便进行相关限制,可以通过该接口获得微信服务器IP地址列表或者IP网段信息。
以上话术出自 获取微信服务器IP地址
http请求方式:
GET https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN
这里我们首先可以先来获取一下微信的服务器列表.
// 获取微信服务器列表
function getIP($token){
$api = "https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token={$token}";
$json = http_get($api);
echo $json;
}
getIP($token);
我们再对其进行一下封装,
// 获取微信服务器列表
function getIP($token){
$api = "https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token={$token}";
$json = http_get($api);
$arr = json_decode($json,true);
return $arr["ip_list"];
}
$ip_List = getIP($token);
print_r($ip_List);
记得实际操作的时候,需要对获取到的数据进行一个验证,只有在获取到了对应的数据之后再进行下面的操作.
同样的操作,像我们想获取用户列表等内容,同样也是如此.
5.获取用户列表
公众号可通过本接口来获取帐号的关注者列表,关注者列表由一串OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的)组成。一次拉取调用最多拉取10000个关注者的OpenID,可以通过多次拉取的方式来满足需求。
以上话术出自 获取用户列表
http请求方式:
GET(请使用https协议) https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID
我们也可以对其进行一下封装.
// 第二个参数为可选参数
function getUserList($token,$nextOpendId = false){
if ($nextOpendId) {
$api = "https://api.weixin.qq.com/cgi-bin/user/get?access_token={$token}&next_openid={$nextOpendId}";
}
else{
$api = "https://api.weixin.qq.com/cgi-bin/user/get?access_token={$token}";
}
$json = httpGet($api);
echo $json;
// $arr = json_decode($json,true);
}
getUserList($token);
// 用这个方法可以获取到我们的内容是从哪个位置开始
// 例如假如有 100个人,我们给定的是 第50 个人的 token, 返回的应该是 51 - 100
// getUserList($token,"用户的 token 内容");
这时候我们就可以对其进行一下打印,打印之后就可以看到我们的想要的用户列表了.
6.获取用户详细信息
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。
请注意,如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求。
上方出自 微信公众平台说明 获取用户基本信息(UnionID机制)
http请求方式:
GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
//获取用户详细信息
function getUserInfo($token,$userOpenId){
$api = "http请求方式: GET https://api.weixin.qq.com/cgi-bin/user/info?access_token={$token}}&openid={$userOpenId}}&lang=zh_CN";
$json = httpGet($api);
$arr = json_decode($json,true);
return $arr;
}
getUserList($token,"用户的 token 内容");
$userInfo = getUserInfo($token,"某一用户的 token");
// 获取用户信息
print_r($userInfo);
// 获取用户头像
echo "<img src = ‘".$userInfo["headimgurl"]."‘>";
7.长链接转短链接接口
在今天文章最后,我们再来给大家演示一个 post 接口的写法.
将一条长链接转成短链接。
主要使用场景: 开发者用于生成二维码的原链接(商品、支付二维码等)太长导致扫码速度和成功率下降,将原长链接通过此接口转成短链接再生成二维码将大大提升扫码速度和成功率。
上述话语出自 长链接转短链接接口
http请求方式:
POST https://api.weixin.qq.com/cgi-bin/shorturl?access_token=ACCESS_TOKEN
以上请求网址是固定的,可以直接替换.
function httpPost($data,$url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_USERAGENT, ‘Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)‘);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$tmpInfo = curl_exec($ch);
if (curl_errno($ch)) {
return curl_error($ch);
}
curl_close($ch);
return $tmpInfo;
}
function longToShort($token,$url){
$api = "https://api.weixin.qq.com/cgi-bin/shorturl?access_token={$token}";
// 这里直接采用官网提供的url 了
$data = ‘{"action":"long2short","long_url":"‘$url.‘"}‘;
$json = httpPost($data,$api);
// echo $json;
return json_decode($json,true);
}
longToShort($token,"https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443433600&token=&lang=zh_CN");
print_r($arr);
这时候我们可以去打印一下现在的URL ,这时候我们就不必使用之前的非常长的接口内容了,而可以直接去使用我们缩短的网址了.
同时这个函数不仅仅可以用在此处,其余时候也可以直接去使用.