之前其实写过一次微信号的简单开发,包括菜单自动回复拉取用户信息等简单的微信公众号的开发,今天又用到了,然后发现自己还是忘记了,看来记录下来是真的有必要的。我今天主要是写了拉取用户信息,所以我这比写的也就是拉取用户信息。
这里使用的还是TP的框架写的php代码进行开发的。
1.对使用的公众号进行基本配置
代码:
//微信验证
public function checkWechat(){
// $weixin=M("maiclub_weixin");
// $res=$weixin->select();
// foreach($res as $value){
// $token=$value["token"];
// }
define("TOKEN",'erdangjia');
// you must define TOKEN by yourself
if (!defined("TOKEN")) {
throw new Exception('TOKEN is not defined!');
}
$echoStr = $_GET["echostr"];
$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 ){
echo $echoStr;
responseMsgs();
return true;
}else{
return false;
}
}
这里主要注意token一样还有就是地址就可以
2.获取token
代码:
/****
获取Token
*****/
function getWeChatToken() {
// $token = S('access_token');
// $weixin=M("maiclub_weixin");
// $data=$weixin->select();
// foreach($data as $value){
// $appid=$value["appid"];
// $appsecret=$value['appsecret'];
//}
$appid="";
$appsecret=" ";
if (empty($token)) {
$res = file_get_contents('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $appid . '&secret=' . $appsecret);
$res = json_decode($res, true);
$token = $res['access_token'];
// 注意:这里需要将获取到的token缓存起来(或写到数据库中)
// 不能频繁的访问https://api.weixin.qq.com/cgi-bin/token,每日有次数限制
// 通过此接口返回的token的有效期目前为2小时。令牌失效后,JS-SDK也就不能用了。
// 因此,这里将token值缓存1小时,比2小时小。缓存失效后,再从接口获取新的token,这样
// 就可以避免token失效。
// S()是ThinkPhp的缓存函数,如果使用的是不ThinkPhp框架,可以使用你的缓存函数,或使用数据库来保存。
S('access_token', $token, 3000);
}
return $token;
}
这里要填写的appid和AppSecret 直接从公众平台的基本配置中复制出来就可以,关键我这边是已经写死了,事实上可以从数据库中调取,我只是为了自己尝试的时候方便所以才这么写的。
还有一点,我将这一段代码写到了 这边。我最开始第一次的时候是写到了config当中,然而写在这个里面比较的不合适,后来就改到了function当中。
这边设置好之后可以再控制器中
public function getWeixinToken(){
echo getWeChatToken();die();
}
利用这两行代码打印测试一下是不是可以大英出token 要是可以的话就是成功获取token。
3.拉取用户列表
1)拉取用户信息首先要获取用户的openid
代码:
//获取用户openid
function getOpenid(){
define("ACCESS_TOKEN",getWeChatToken());
$url="https://api.weixin.qq.com/cgi-bin/user/get?access_token=".ACCESS_TOKEN;
$res = https_request($url);
$data = json_decode($res,true);
$openid = $data['data']['openid'];
return $openid;
}
这段代码我依旧是作为方法写在了function当中的。
2)获取用户列表
代码:
//获取用户列表
public function getuserLists(){
if(checkLogin()){
$assignArr = array(
"leftWxManager" => 1,//是否选中
"leftgetuserLists" => 1,//基本信息是否选中
);
$role=I('session.role');
if($role != 0){
echo"<script>alert('您没有权限')</script>";
echo "<script>location.href= '../Index/index'</script>";
}else{
// dump(getOpenid());die();
$userModel=M('maiclub_user');
define("ACCESS_TOKEN",getWeChatToken());
foreach (getOpenid() as $val){
if($userModel->where("openid = '{$val}'")->find()){
//echo 1111;
}else{
$urlInfo="https://api.weixin.qq.com/cgi-bin/user/info?access_token=".ACCESS_TOKEN."&openid=".$val."&lang=zh_CN";
$resInfo = https_request($urlInfo,true);
$userLists=json_decode($resInfo,true);
$userModel->add($userLists);
//dump($userLists);
}
}
//die();
$records=I('cookie.records');
$search=I('post.search');
if($records == ''){
$records =10;
}
if($search==''){
$count = $userModel->count();// 查询满足要求的总记录数
$Page = new \Think\Page($count,$records);// 实例化分页类 传入总记录数和每页显示的记录数(10)
$show = $Page->show();// 分页显示输出
$userModel->create();
$data3=$userModel->limit($Page->firstRow.','.$Page->listRows)->select();
}else{
$data3=$userModel->where("nickname like '%{$search}%' || city like '%{$search}%' || province like '%{$search}%' || openid like '%{$search}%'")->select();
}
$this->assign('userWx',$data3);
$this->assign('num',$Page->listRows);
$this->assign('count',$count);
$this->assign('page',$show);// 赋值分页输出
$this->assign($assignArr);
$this->display();
}
}
}
这里就是获取用户列表同时还有个入库的过程,数据库中字段只要写了就可以成功入库,如果想要知道他具体能获取到哪些字段,字段分别是什么意思,一个可以打印代码中的$userLists(必须没有入库之前打印,也就是说,如果你入库一次了,第二次刷新打印只会有新关注的人,如果这段时间没有新的关注这里就会显示NULL),或者直接在微信公众平台的开发者手册中
这个里面也详细的写了每个字段的意思和有哪些字段。
以上应该就是拉取公众号关注的用户的全部内容。