微信公众平台借口怎么公众号获取用户微信号的昵称,求php代码

微信会员注册机制【带源码】:网页授权,得到code后在当前页面获取openid,js+php实现跨域请求 - 推酷
微信会员注册机制【带源码】:网页授权,得到code后在当前页面获取openid,js+php实现跨域请求
开发情景:
需要引导微信公众平台用户点击链接进入注册页面,在注册页面需要获取用户微信的openid。技术核心是需要借助网页授权,并且在得到授权code时通过js立刻获取openid。
网上关于网页授权后一步步获取openid的文章大多是理论步骤的解说,落实到代码上具体怎么尽可能快的拿到openid的内容很少。笔者十分愤怒,决定写下代码和大家分享
这个过程需要一个前端页面代码和一个后端辅助程序,我这里前端是html+js,后端是php。
直接上代码,代码里注释解释的比较清楚:
前端:index.html
&!DOCTYPE HTML PUBLIC &-//W3C//DTD HTML 4.01//EN& &http://www.w3.org/TR/html4/strict.dtd&;&
&meta http-equiv=&Content-Type& content=&text/ charset=UTF-8& /&
&meta name=&viewport& content=&width=device-width,height=device-height,inital-scale=1.0,maximum-scale=1.0,user-scalable=&&
&meta name=&apple-mobile-web-app-capable& content=&yes&&
&meta name=&apple-mobile-web-app-status-bar-style& content=&black&&
&meta name=&format-detection& content=&telephone=no&&
&title&会员注册&/title&
&script type=&text/javascript& src=&jquery.js&&&/script&
&script type=&text/javascript&&
function callback(result) {
alert('cucess');
alert(result);
//输出openid
function getQueryString(name) {
var reg = new RegExp(&(^|&)& + name + &=([^&]*)(&|$)&, &i&);
var r = window.location.search.substr(1).match(reg);
if (r != null) return unescape(r[2]);
var code = getQueryString(&code&);
async: false,
url: &/oauth2.php&, //这是我的服务端处理文件php的
type: &GET&,
//下面几行是jsoup,如果去掉下面几行的注释,后端对应的返回结果也要去掉注释
// dataType: 'jsonp',
// jsonp: 'callback', //jsonp的值自定义,如果使用jsoncallback,那么服务器端,要返回一个jsoncallback的值对应的对象.
// jsonpCallback:'callback',
data: {code:code}, //传递本页面获取的code到后台,以便后台获取openid
timeout: 5000,
success: function (result) {
callback(result);
error: function (jqXHR, textStatus, errorThrown) {
alert(textStatus);
下面是服务端对应的代码,oauth2.php
$code = $_GET['code'];//前端传来的code值
$appid = &xxxxxxxxxxxxxxxx&;
$appsecret = &xxxxxxxxxxxxxxxxxxxxxx&;
//获取openid
$url = &https://api./sns/oauth2/access_token?appid=$appid&secret=$appsecret&code=$code&grant_type=authorization_code&;
$result = https_request($url);
$jsoninfo = json_decode($result, true);
$openid = $jsoninfo[&openid&];//从返回json结果中读出openid
$callback=$_GET['callback'];
// echo $callback.&({result:'&.$openid.&'})&;
echo $ //把openid 送回前端
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);
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致网站建设、切图、企业建站、微信开发 联系QQ: tel:
PHP微信开发之获取access_token
围观4599次
编辑日期:
在做时是不可避免的,很多微信接口都需要access_token,这里码农小兵就分享一下在web开发中使用PHP如何获取access_token。
首先看看微信官方文档的说明。
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
公众平台的API调用所需的access_token的使用及生成方式说明:
1、为了保密appsecrect,第三方需要一个access_token获取和刷新的中控服务器。而其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则会造成access_token覆盖而影响业务;
2、目前access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器对外输出的依然是老access_token,此时公众平台后台会保证在刷新短时间内,新老access_token都可用,这保证了第三方业务的平滑过渡;
3、access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。
公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在微信公众平台官网-开发者中心页中获得(需要已经成为开发者,且帐号没有异常状态)。注意调用所有微信接口时均需使用https协议。
接口调用请求说明
http请求方式: GET
https://api./cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
grant_type
获取access_token填写client_credential
第三方用户唯一凭证
第三方用户唯一凭证密钥,即appsecret
正常情况下,微信会返回下述JSON数据包给公众号:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
access_token
获取到的凭证
expires_in
凭证有效时间,单位:秒
错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):
{"errcode":40013,"errmsg":"invalid appid"}
接下来就上PHP的具体实现方式。
access_token是通过get方式的来取的,所以我们要构建一下curl_get函数,以获取返回结果
function curlGet($url){
$ch = curl_init();
$header = "Accept-Charset: utf-8";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 ( 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);
$temp = curl_exec($ch);
/**********获取access_token(基础版)***************/
function getAccessToken($appid,$appsecret){
$url_get='https://api./cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$
$json=$this-&json_decode(curlGet($url_get));
$access_token=$json-&access_
由于asscess_token的过期时间只有7200秒,而接口调用次数是有限制的,所有我们可以把获取asscess_token的函数改进一下,把它存进数据库,然后再进行过期判断。
如果asscess_token还未过期,则直接调用;
如果已过期则获取asscess_token并更新数据库,以务下次使用;
function checkAccessToken($appid,$appsecret){
$condition = array('appid'=&$appid,'appsecret'=&$appsecret);
$access_token_set=M('AccessToken')-&where($condition)-&find();//获取数据
if($access_token_set){
//检查是否超时,超时了重新获取
if($access_token_set['AccessExpires']&time()){
//未超时,直接返回access_token
return $access_token_set['access_token'];
//已超时,重新获取
$url_get='https://api./cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$
$json=json_decode(curlGet($url_get));
$access_token=$json-&access_
$AccessExpires=time()+intval($json-&expires_in);
$data['access_token']=$access_
$data['AccessExpires']=$AccessE
$result = M('AccessToken')-&where($condition)-&save($data);//更新数据
if($result){
return $access_
return $access_
/*数据库中无$appid,$appsecret对应的记录需要再做处理,如插入到数据库
return 0;*/
声明:示例使用thinkphp开发。
本文固定链接:
转载请注明:
作者:码农一号
这个作者貌似有点懒,什么都没有留下。
如果您觉得这篇文章有用处,请支持作者!鼓励作者写出更好更多的文章!
您可能还会对这些文章感兴趣!
(C)码农小兵 devdo.net
| Theme devdo微信公众平台开发 JS-SDK开发(图像接口实例) - 博客 - 水墨寒的博客微信公众平台开发 JS-SDK开发(图像接口实例)作者:阅读:35428更新于 22:53
本文并非是对的复制,而是通过一个简单的例子来更深入的了解使用微信JS-SDK,具体文档请参考官方说明文档《》。微信公众平台面向开发者开放微信内网页开发工具包(微信JS-SDK),通过微信JS-SDK提供的11类接口集,开发者不仅能够在网页上使用微信本身的拍照、选图、语音、位置等基本能力,还可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。微信JS-SDK提供的11类接口(分享接口、图像接口、音频接口、智能接口、设备信息、界面操作、地理位置、微信扫一扫、微信小店、微信卡券、微信支付)在使用方式上完全相同,唯一需要注意的是,这11类接口并不是都开放的,有些接口非认证用户是没有权限的,比如分享接口,小店接口、卡券接口、支付接口则必须通过微信认证后才能使用。具体权限问题可参考你的。
开放必须项
开发者ID (应用ID和应用密匙)
在公众号(服务号)设置——功能设置(JS接口安全域名)中填写已备案的域名
服务器环境
简单的后台知识,如PHP
本文将通过PHP(只会PHP)来演示图像接口(其他接口使用方式相似)
首先在微信开发者平台下载它的,链接中包含php、java、nodejs以及python的示例代码供第三方参考,这里使用php包。我把php文件夹重命名为weixin放在网站根目录下,如图:
这里我们只修改sample.php.代码如下:
//设置报错级别,忽略警告,设置字符
error_reporting(E_ALL || ~E_NOTICE);
header("Content-type:text/ charset=utf-8");
require_once "jssdk.php";
$jssdk = new JSSDK("AppID", "AppSecret");
$signPackage = $jssdk-&GetSignPackage();
&!DOCTYPE html&
&html lang="en"&
&meta charset="UTF-8"&
&!--因为在手机中,所以添加viewport--&
&meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"&
&title&微信测试&/title&
&button id="weixin" style="display:margin: 2em auto"&微信接口测试&/button&
&script src="http://res./open/js/jweixin-1.0.0.js"&&/script&
wx.config({
debug: true, //调试阶段建议开启
appId: '&?php echo $signPackage["appId"];?&',
timestamp: &?php echo $signPackage["timestamp"];?&,
nonceStr: '&?php echo $signPackage["nonceStr"];?&',
signature: '&?php echo $signPackage["signature"];?&',
jsApiList: [
* 所有要调用的 API 都要加到这个列表中
* 这里以图像接口为例
"chooseImage",
"previewImage",
"uploadImage",
"downloadImage"
var btn = document.getElementById('weixin');
wx.ready(function () {
// 在这里调用 API
btn.onclick = function(){
wx.chooseImage ({
success : function(res){
var localIds = res.localI
// 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
然后将weixin目录上传到你的服务器上,该服务器域名必须和你在微信设置中的域名一致。我上传到了根目录,通过firefox提供的页面二维码功能,在微信上扫一扫即可测试。截图如下:
图1-4分别为一进去(因为开启了debug),所以会显示你成功调用接口;图二表示点击了按钮后,将弹出微信拍照或者从照片中选择;图三是我点击了从手机相册中选择后调出你的手机相册列表;图四是我选择了其中某一张照片,点击完成后返回的该照片信息(图片的本地ID)
接着,来测试一下上传接口,修改HTML代码如下:
&button id="weixin" style="display:margin: 2em auto"&微信接口测试&/button&
&button id="upload" style="display:margin: 2em auto"&上传接口测试&/button&
&button id="getServices" style="display:margin: 2em auto"&获取已上传的图片&/button&
&script src="http://res./open/js/jweixin-1.0.0.js"&&/script&
wx.config({
debug: true, //调试阶段建议开启
appId: '&?php echo $signPackage["appId"];?&',
timestamp: &?php echo $signPackage["timestamp"];?&,
nonceStr: '&?php echo $signPackage["nonceStr"];?&',
signature: '&?php echo $signPackage["signature"];?&',
jsApiList: [
* 所有要调用的 API 都要加到这个列表中
* 这里以图像接口为例
"chooseImage",
"previewImage",
"uploadImage",
"downloadImage"
var btn = document.getElementById('weixin');
//定义images用来保存选择的本地图片ID,和上传后的服务器图片ID
var images = {
localId: [],
serverId: []
wx.ready(function () {
// 在这里调用 API
btn.onclick = function(){
wx.chooseImage ({
success : function(res){
images.localId = res.localI
//保存到images
// 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
document.getElementById('upload').onclick = function(){
var i = 0, len = images.localId.
function wxUpload(){
wx.uploadImage({
localId: images.localId[i], // 需要上传的图片的本地ID,由chooseImage接口获得
isShowProgressTips: 1, // 默认为1,显示进度提示
success: function (res) {
//将上传成功后的serverId保存到serverid
images.serverId.push(res.serverId);
if(i & len){
wxUpload();
wxUpload();
document.getElementById('getServices').onclick = function(){
alert(images.serverId);
重新上传到服务器,刷新Firefox,生成新二维码,微信扫描,截图如下
图1是修改后的页面;图2是点击上传按钮后的loading提示(isShowProgressTips: 1, // 默认为1,显示进度提示);图3是上传成功后返回的该图片的serverId;图4是点击获取已上传的图片按钮后返回的已上传的图片的信息;上传图片有效期3天,可用微信多媒体接口下载图片到自己的服务器,此处获得的 serverId 即 media_id
通过以上两个简单的例子,基本可以掌握微信JS-SDK的使用方法。11个接口使用方式基本相同,你可以一一尝试。官方的说明是:
通过ready接口处理成功验证
通过error接口处理失败验证
所有接口通过wx对象(也可使用jWeixin对象)来调用,参数是一个对象,除了每个接口本身需要传的参数之外,还有以下通用参数:
success:接口调用成功时执行的回调函数。
fail:接口调用失败时执行的回调函数。
complete:接口调用完成时执行的回调函数,无论成功或失败都会执行。
cancel:用户点击取消时的回调函数,仅部分有用户取消操作的api才会用到。
trigger: 监听Menu中的按钮点击时触发的方法,该方法仅支持Menu中的相关接口。
具体可参考官方API。
&延伸阅读&发布观点加载更多...微信后台代码,获取用户昵称
微信后台代码,自动更新access token,并存储到数据库,从而利用access token,在用户关注或发送消息时,获取用户昵称等信息&?phpdefine("TOKEN","weixin");define("NO_OAUTH2","noOauth2");$wechatObj = new wechatCallbackapiTest();if (isset($_GET['echostr'])) {$wechatObj->valid();}else{$wechatObj->responseMsg();}class wechatCallbackapiTest{//微信来源验证 public function valid(){ $echoStr = $_GET["echostr"];if($this->checkSignature()){ echo $echoS}} private function checkSignature(){ $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce);sort($tmpArr); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){}else{}}//消息处理//仅实现了文本消息和推送事件 public function responseMsg(){$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];if (!empty($postStr)){$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);$RX_TYPE = trim($postObj->MsgType);switch ($RX_TYPE){case"text":$resultStr = $this->receiveText($postObj);case"image":$resultStr = $this->receiveImage($postObj);case"location":$resultStr = $this->receiveLocation($postObj);case"voice":$resultStr = $this->receiveVoice($postObj);case"video":$resultStr = $this->receiveVideo($postObj);case"link":$resultStr = $this->receiveLink($postObj);case"event":$resultStr = $this->receiveEvent($postObj);default:$resultStr ="unknow msg type:".$RX_TYPE;}echo $resultS}else {echo"";}}function receiveText($object){ $funcFlag = 0; $contentStr = $this->get_name($object).",你发送的是文本,内容为:".$object->C $resultStr = $this->transmitText($object, $contentStr, $funcFlag); return $resultS} public function get_name($object){$access_token=$this->readtoken(); //这里需要解决access_token 2个小时有效期的问题,//一个思路是,新定义一个函数,只要一调用这个函数,则查找数据库上一个access_token生成的时间,对比现在的时间//若超过2个小时,则用get方式获取新的access_token,并返回新的access_token,且存储到数据库中;//若不到2个小时,则把数据库中已经存储的最新的access_token提取并返回;$openid=$object->FromUserN//拼成获取用户信息的SSL get方式的API链接$infourl="https://api./cgi-bin/user/info?access_token=".$access_token."&openid=".$openid."&lang=zh_CN";$result=$this->https_get($infourl);//var_dump($result);//echo $$utfresult=utf8_encode($result);$mm=json_decode($result,true);return trim($mm['nickname']);}public function newtoken(){//$appid="wx2b558d720b186565";//此为ipad mini账号对应的appid//$appsecret="fe9f74ef9abf75a63dcad";//此为ipad mini账号对应的secret$appid="wx66c888ff7a867359";//此为iphone对应的appid$appsecret="fad178aa420ceef67e16dd6a4812e6dc";//此为iphone账号对应的secret$access_token_url="https://api./cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$//echo $access_token_$access_json=$this->https_get($access_token_url);//$access_json='{"access_token":"sXr18Q9qklWbLFuBAi5w6B-kWeXVXW2dtHwb53Iy2wdgnebSDFs8r4NwT8uTafgB6rMXc00lsE5HayE28N9-KTHv5HyHG8b8UFxsvLBNgAU","expires_in":7200}'; //echo $access_$access=json_decode($access_json,true);//var_dump($access);//echo $access_array['access_token'];return $access['access_token'];}public function savetoken($token){$host=""; //数据库服务器名称$user=""; // 连接数据库用户名$pw=""; // 连接数据库密码$db=""; // 数据库的名字//连接到mysql数据库$conn=mysql_connect($host,$user,$pw);//mysql_query("set names 'utf8'");if ($conn) { mysql_select_db ($db);//mysql_set_charset("gbk"); //$sql ="select * from token";$time=time();//$token=newtoken(); //echo $ $sql="insert into token (time,token) VALUES ('$time','$token')"; $result = mysql_query($sql) or die("Invalid query:". mysql_error());//$mm=mysql_fetch_array($result);//var_dump($mm);mysql_free_result($result);} else { echo"数据库连接KO";}}public function readtoken(){$host=""; //数据库服务器名称$user=""; // 连接数据库用户名$pw=""; // 连接数据库密码$db=""; // 数据库的名字//连接到mysql数据库$conn=mysql_connect($host,$user,$pw);//数据库输出编码 应该与你的数据库编码保持一致//mysql_query("set names 'utf8'");if ($conn) {//选择数据库mysql_select_db($db);//mysql_set_charset("gbk"); //在token这个表里,按照time列降序排序,取出time列的第一个值(即limit 1) $sql ="select time,token from token order by time desc limit 1";//执行sql语句 $result = mysql_query ($sql) or die("Invalid query:". mysql_error());//获取执行后的结果,以数组保存到变量¥mm中$mm=mysql_fetch_array($result);mysql_free_result($result);//用列的表头访问数组,得到最后一次存储的时间戳$lasttime=$mm['time']; //echo"".$//生成现在的时间,时间戳$timenow=time();//如果现在的时间减去最后一次存储的时间戳,如果小于7100,则再次sql,获取已经存储到表的token,若不是,则新生成token,并存储到数据库if($timenow-$lasttime<7100){$tokenread=$mm['token'];return $//echo"".$}else{$newtoken=$this->newtoken();$this->savetoken($newtoken);$tokenread=$return $}}} public function https_get($url){ $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 $}private function receiveEvent($object){ $contentStr =""; switch ($object->Event){ case"subscribe"://$uername=json_decode($object,true); $contentStr ="欢迎你!".$this->get_name($object);//当用户订阅后,需要存储下所有用户的信息,openid,昵称,地址等等; //调用存储 函数,需要新创建。。。。 case"unsubscribe": $contentStr =""; case"CLICK": switch ($object->EventKey){case NO_OAUTH2://$contentStr = NO_OAUTH2;$contentStr ="[] []";case"Oauth2":$contentStr = $this->toAuthMsg();default: $contentStr ="你点击了菜单:".$object->EventK}default: $contentStr ="receive a new event:".$object->E} $resultStr = $this->transmitText($object, $contentStr);if($contentStr == NO_OAUTH2){header("location: /weixin/courseCenter.php?wx_openid=". $object->FromUserName);} return $resultS}private function transmitText($object, $content, $flag = 0){ $textTpl ="
最新教程周点击榜
微信扫一扫

我要回帖

更多关于 微信公众号 用户昵称 的文章

 

随机推荐