讲师中心 微信公众号
AI工具推荐 视频效率加速

微信后台代码,获取用户昵称

夜敏吖_5146

夜敏吖_5146

发布时间:2016-05-26 08:18:45

|

2605人浏览过

|

来源于php中文网

原创

[PHP]代码    

<?php

define("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 $echoStr;
            exit;
        }
    }
    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 ){
            return true;
        }else{
            return false;
        }
    }
	//消息处理
	//仅实现了文本消息和推送事件
    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);
					break;
				case "image":
					$resultStr = $this->receiveImage($postObj);
					break;
				case "location":
					$resultStr = $this->receiveLocation($postObj);
					break;
				case "voice":
					$resultStr = $this->receiveVoice($postObj);
					break;
				case "video":
					$resultStr = $this->receiveVideo($postObj);
					break;
				case "link":
					$resultStr = $this->receiveLink($postObj);
					break;
				case "event":
					$resultStr = $this->receiveEvent($postObj);
					break;
				default:
					$resultStr = "unknow msg type: ".$RX_TYPE;
					break;
			}
			echo $resultStr;
		}else {
			echo "";
			exit;
		}
	}

	function receiveText($object)
    {
        $funcFlag = 0;
        $contentStr = $this->get_name($object).",你发送的是文本,内容为:".$object->Content;
        $resultStr = $this->transmitText($object, $contentStr, $funcFlag);
        return $resultStr;
    }
    
    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->FromUserName;
		//拼成获取用户信息的SSL get方式的API链接
		$infourl="https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$access_token."&openid=".$openid."&lang=zh_CN";
		$result=$this->https_get($infourl);
	    //var_dump($result);
		//echo $result;
		$utfresult=utf8_encode($result);
		$mm=json_decode($result,true);
		return trim($mm['nickname']);
    }
    
    
public function newtoken()
{
//$appid="wx2b558d720b186565";//此为ipad mini账号对应的appid
//$appsecret="fe9f74ef9abf75a63d6750e365d49cad";//此为ipad mini账号对应的secret

$appid="wx66c888ff7a867359";//此为iphone对应的appid
$appsecret="fad178aa420ceef67e16dd6a4812e6dc";//此为iphone账号对应的secret
$access_token_url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
//echo $access_token_url;
$access_json=$this->https_get($access_token_url);
    //$access_json='{"access_token":"sXr18Q9qklWbLFuBAi5w6B-kWeXVXW2dtHwb53Iy2wdgnebSDFs8r4NwT8uTafgB6rMXc00lsE5HayE28N9-KTHv5HyHG8b8UFxsvLBNgAU","expires_in":7200}';
    //echo $access_json;
$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 $time;
    $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 "<br><br><br><br><br>".$lasttime;
    //生成现在的时间,时间戳
    $timenow=time();
    
    //如果现在的时间减去最后一次存储的时间戳,如果小于7100,则再次sql,获取已经存储到表的token,若不是,则新生成token,并存储到数据库
    if($timenow-$lasttime<7100){
        $tokenread=$mm['token'];
		return $tokenread;
		//echo "<br><br><br><br><br>".$tokenread;
    }else{
        $newtoken=$this->newtoken();
        $this->savetoken($newtoken);
        $tokenread=$newtoken;
		return $tokenread;
    }
}
    
}

    
    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 $result;
	}

	private function receiveEvent($object)
    {
        $contentStr = "";
        switch ($object->Event)
        {
            case "subscribe":
                //$uername=json_decode($object,true);
                $contentStr = "欢迎你!".$this->get_name($object);
            //当用户订阅后,需要存储下所有用户的信息,openid,昵称,地址等等;
            //调用存储 函数,需要新创建。。。。
                break;
            case "unsubscribe":
                $contentStr = "";
                break;
            case "CLICK":
                switch ($object->EventKey)
                {
					case NO_OAUTH2:
						//$contentStr = NO_OAUTH2;
						$contentStr = "[<a href='http://www.xxx.com/weixin/courseCenter.php?wx_openid=" . $object->FromUserName . "'>我的课堂</a>] 
						[<a href='http://www.xxx.com/weixin/orderList.php?wx_openid=" . $object->FromUserName . "'>订单记录</a>]";
						break;
					case "Oauth2":
						$contentStr = $this->toAuthMsg();
						break;
                    default:
                        $contentStr = "你点击了菜单: ".$object->EventKey;
                        break;
                }
                break;
            default:
                $contentStr = "receive a new event: ".$object->Event;
                break;
        }
        $resultStr = $this->transmitText($object, $contentStr);

		if($contentStr == NO_OAUTH2){
			header("location: http://www.php.cn/" . $object->FromUserName);
			exit;
		}

        return $resultStr;
    }

	private function transmitText($object, $content, $flag = 0)
    {
        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>%d</FuncFlag>
</xml>";
        $resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $flag);
        return $resultStr;
    }

	private function toAuthMsg()
    {
        $resultStr = "<a href='https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx834404c1d1dbb5ec&redirect_uri=http://www.php.cn/'>马上绑定</a>";
        return $resultStr;
    }
}
?>

                   

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载

                   

相关文章

微信app下载
微信app下载

微信是一款手机通信软件,支持通过手机网络发送语音短信、视频、图片和文字。微信可以单聊及群聊,还能根据地理位置找到附近的人,带给大家全新的移动沟通体验,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

20

2026.10.10

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

20

2026.10.10

Kratos框架Protobuf接口定义与代码生成合集
Kratos框架Protobuf接口定义与代码生成合集

本专题讲解Kratos框架接口定义体系,涵盖proto编写规范、proto add/client/server生成命令、http注解路由、validate校验、OpenAPI文档生成、跨服务proto复用与兼容性设计。

0

2026.10.10

C++虚函数怎么定义和调用
C++虚函数怎么定义和调用

C++虚函数是实现运行时多态的重要机制。本专题从virtual关键字的基本用法入手,介绍基类与派生类之间的函数重写、基类指针调用派生类方法,以及动态绑定的执行过程,帮助初学者掌握虚函数的核心语法。

20

2026.10.10

C++类与对象的封装方法教程
C++类与对象的封装方法教程

C++封装是面向对象编程的核心特性之一,通过类将数据与操作数据的函数组织在一起,并利用访问权限控制外部访问。本专题介绍类的定义、成员变量、成员函数以及public、private和protected的使用方法,帮助初学者掌握封装的基本原理。

20

2026.10.10

C++构造函数定义与调用方法
C++构造函数定义与调用方法

C++构造函数用于初始化类对象,是面向对象编程的重要基础。本专题从构造函数的定义、声明和调用入手,介绍默认构造函数、带参数构造函数、拷贝构造函数及成员初始化列表,帮助初学者掌握对象创建与初始化的基本方法。

20

2026.10.10

Kratos框架零基础入门教程
Kratos框架零基础入门教程

本专题整理Kratos框架入门内容,涵盖Go环境准备、kratos CLI安装升级、new命令创建项目、目录结构分层说明、服务启动与双协议端口、依赖下载报错排查,帮助开发者快速跑通第一个Kratos框架微服务应用。

20

2026.10.10

C++条件判断语句怎么写
C++条件判断语句怎么写

C++条件判断是控制程序执行流程的重要基础。本专题介绍if、if-else、else if和switch等常见分支语句,结合条件表达式、比较运算符与代码示例,帮助初学者掌握不同场景下的判断逻辑。

0

2026.10.10

C++变量怎么声明和赋值
C++变量怎么声明和赋值

C++变量是编写程序和存储数据的基础。本专题围绕变量声明、定义、初始化、赋值和类型选择等内容展开,帮助初学者理解不同变量的用法,并掌握在实际代码中定义和使用变量的方法。

20

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn