微信公共号网页开发基础知识2
2018-01-09 本文已影响0人
likeli
现在我们正式的进行微信端开发,我们微信公共号测试号都有了,但是我们要再手机上打开,或者在微信开发者工具上打开,所有我们要把代码放在线上才能使用
-
首先我们要有一个服务器,我用的是新浪云服务器,下面简单的介绍一下使用方法与步骤
3、创建新应用 ECBF58B2-4F79-4E73-8DAF-36A3214777B3.png
1、注册登陆新浪云
2、在用户中心找到控制台中的云应用SAE点击进去
4、点击域名进去找到应用中的代码管理 ,编辑代码
5、现在就可以编辑代码了
前面的基础步骤已完成,现在我们要做的就是重中之重了代码的编辑 -
微信网页授权
1、第一步:用户同意授权,获取code
2、第二步:通过code换取网页授权access_token
3、第三步:刷新access_token(如果需要)
在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),尤其注意:由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问
首先我们需要一个公共的PHP来进行函数处理<?php //连接数据的函数; function connect($arr){ $link = mysqli_connect($arr['DB_HOST'], $arr['DB_USER'], $arr['DB_PWD'], $arr['DB_NAME'],$arr['DB_PORT']); if(mysqli_errno($link)){ //echo mysqli_error($link); }else{ return $link; } } //操作数据库的添加函数; function add($arr,$link=null,$table=null){ $keys = ""; $value = ""; foreach($arr as $k=>$v){ $keys.=$k.","; if(is_string($v)){ $v = "'".$v."'"; } $value.=$v.","; } $keys = substr($keys, 0,strlen($keys)-1); $value = substr($value, 0,strlen($value)-1); // echo $keys."<hr>".$value; $sql = "INSERT INTO {$table} ({$keys}) VALUES ({$value})"; //echo $sql;die; //设置编码格式 mysqli_query($link, "set names utf8"); $res = mysqli_query($link, $sql); //添加数据的id值 ; $num = mysqli_insert_id($link); if($res && mysqli_affected_rows($link)){ return $num; }else{ return false; } } //操作数据库的更新操作; function update($arr,$link=null,$table=null,$where=NULL){ $where = $where==NULL?"":" WHERE ".$where; $str = ""; foreach($arr as $k=>$v){ if(is_string($v)){ $v = "'".$v."'"; } $str .= $k."=".$v.","; } $str = substr($str, 0,strlen($str)-1); $sql = "UPDATE {$table} SET {$str}".$where; mysqli_query($link, "set names utf8"); $res = mysqli_query($link, $sql); if($res && mysqli_affected_rows($link)){ return true; }else{ return false; } } //删除数据; function delete($table,$link=null,$where=null){ $where = $where==null?"":" WHERE ".$where; $sql = "DELETE FROM {$table}".$where; $res = mysqli_query($link, $sql); if($res && mysqli_affected_rows($link)){ return true; }else{ return false; } } //获取多条数据 function getlist($table,$link=null,$where=null){ $where = $where==null?"":" WHERE ".$where; $sql = "SELECT * FROM {$table}".$where; //设置编码格式 mysqli_query($link, "set names utf8"); $res = mysqli_query($link, $sql); while($data = mysqli_fetch_assoc($res)){ $arr[] = $data; } if($res && mysqli_num_rows($res)){ return $arr; }else{ return false; } } //获取一条数据; function getone($table,$link=null,$where=null){ //var_dump($link); $where = $where==null?"":" WHERE ".$where; $sql = "SELECT * FROM {$table}".$where; //设置编码格式 mysqli_query($link, "set names utf8"); $res = mysqli_query($link, $sql); if($res && mysqli_num_rows($res)){ $data = mysqli_fetch_assoc($res); return $data; }else{ return false; } } //get请求方式 //1.初始化curl //2.设置curl //3.执行curl //4.关闭curl 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); curl_setopt($curl, CURLOPT_URL, $url); $res = curl_exec($curl); curl_close($curl); return $res; } //php里面请求post接口的函数 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; } ?>
上面是封装的系统,现在对数据进行操作
include "common.php";
//用户获取code
$code = $_GET['code'];
//通过code获取access_token;
$url = "https://api.weixin.qq.com/sns/oauth2 /access_token?appid=wxdb15cc03e3b842f0& secret=d2e266f71b96ee4bc92e0ed65bb8655e&code=$code& grant_type=authorization_code";
$res = httpGet($url);
$data = json_decode($res, true);
$token = $data['access_token'];
$openid = $data['openid'];
下图为scope等于snsapi_userinfo时的授权页面:
4、第四步:拉取用户信息(需scope为 snsapi_userinfo)
如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。
http:GET(请使用https协议) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
openid 用户的唯一标识
lang 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
下面是通过代码执行可以得到以上参数
$url2 = "https://api.weixin.qq.com/sns/userinfo?access_token=$token&openid=$openid&lang=zh_CN";
$res2 = httpGet($url2);
$userinfo = json_decode($res2, true);
$nickname = $userinfo['nickname'];
$headurl = $userinfo['headimgurl'];
$openid = $userinfo['openid'];
//随机数
$score = mt_rand(1, 100);
下面进行对数据库进行设置
首先找到数据与缓存服务,如果不想花太多钱的话就选择共享型MySQL进行数据库操作
//连接数据库
//用户名 : SAE_MYSQL_USER
//密 码 : SAE_MYSQL_PASS
//主库域名 : SAE_MYSQL_HOST_M
//从库域名 : SAE_MYSQL_HOST_S
//端 口 : SAE_MYSQL_PORT
//数据库名 : SAE_MYSQL_DB
$arr['DB_HOST'] = SAE_MYSQL_HOST_M;
$arr['DB_USER'] = SAE_MYSQL_USER;
$arr['DB_PWD'] = SAE_MYSQL_PASS;
$arr['DB_NAME'] = SAE_MYSQL_DB;
$arr['DB_PORT'] = SAE_MYSQL_PORT;
$link = connect($arr);
//var_dump($link);
$addArr['nickname'] = $nickname;
$addArr['headurl'] = $headurl;
$addArr['openid'] = $openid;
$addArr['score'] = $score;
//判断数据库里面有没有相关数据
$result = getone("users", $link, "openid='{$openid}'");
if ($result) {
//已经存了 更新分数
$uparr["score"] = $score;
$re = update($uparr, $link, "users", "openid='{$openid}'");
if ($re) {
echo "更新成功";
} else {
echo "更新失败";
}
} else {
//没有存
$res = add($addArr, $link, "users");
if ($res) {
echo "添加成功";
} else {
echo "添加失败";
}
}
运行结果如下
B9413A75-6958-4DC9-8C61-DD567E12AC68.png
数据库资源如下 99180E0D-BDED-4D86-9814-49ED3201D948.png
现在把数据展现在页面上
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<table border="" >
<tr>
<th>昵称</th>
<th>头像</th>
<th>分数</th>
</tr>
<?php foreach($list as $key =>$val){?>
<tr>
<td><?php echo $val['nickname'] ?></td>
<td><img src="<?php echo $val['headurl'] ?>"/></td>
<td><?php echo $val['score'] ?></td>
</tr>
<?php } ?>
</table>
</body>
</html>
运行结果如下
C9E778F1-7D0C-4A40-B106-0903AD90C7FF.png
以上只是简单地操作,后面要继续进行深究