• 微信订阅号 获取用户基本信息,登录及 php


    <?php
    
    //echo file_get_contents("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx20122233338996&secret=67911111111111111111111146fb11113");
    //die;
    
    $testObj = new Test();
    $_SESSION = '';
    if($testObj->checkSignature()){
    if(!empty($_SESSION['openid'])){
    $uinfo = file_get_contents("https://api.weixin.qq.com/cgi-bin/user/info?access_token=hwu2rSeVQ1222222222222222222222226nEojpAbiqtY6hIB_fvEm333333333333337dbeRhL-V9hnzzLWwhXLnrTNokyROJiACAEBW&openid=".$_SESSION['openid']);
    echo $uinfo;
    }else{
    //session为空的话
    $testObj->responseMsg();
    }
    
    }else{
    
    //    $testObj->valid();
    }
    
    
    class Test
    {
    /**
    * 绑定url、token信息
    */
    public function valid(){
    $echoStr = $_GET["echostr"];
    if ($this->checkSignature()) {
    echo $echoStr;
    }
    exit();
    }
    /**
    * 检查签名,确保请求是从微信发过来的
    */
    public function checkSignature()
    {
    //获得参数 signature nonce token timestamp echostr
    $nonce = $_GET['nonce'];
    $token = 'dxxxxxxxxx';
    $timestamp = $_GET['timestamp'];
    $echostr = $_GET['echostr'];
    $signature = $_GET['signature'];
    //形成数组,然后按字典序排序
    $array = array();
    $array = array($nonce, $timestamp, $token);
    sort($array);
    //拼接成字符串,sha1加密 ,然后与signature进行校验
    $str = sha1( implode( $array ) );
    if( $str == $signature){
    return true;
    }else{
    return false;
    }
    }
    
    /**
    * 接收消息,并自动发送响应信息
    */
    public function responseMsg(){
    //验证签名
    if ($this->checkSignature()){
    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
    //    $this->log_request_info();
    
    //提取post数据
    if (!empty($postStr)){
    $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
    $fromUsername = $postObj->FromUserName;//发送人
    $toUsername = $postObj->ToUserName;//接收人
    $MsgType = $postObj->MsgType;//消息类型
    $MsgId = $postObj->MsgId;//消息id
    $time = time();//当前时间做为回复时间
    
    //如果是文本消息(表情属于文本信息)
    if($MsgType == 'text'){
    $content = trim($postObj->Content);//消息内容
    if(!empty( $content )){
    
    //如果文本内容是图文,则回复图文信息,否则回复文本信息
    if($content == "图文"){
    
    //回复图文消息,ArticleCount图文消息个数,多条图文消息信息,默认第一个item为大图
    $ArticleCount = 2;
    $newsTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[%s]]></MsgType>
    <ArticleCount>%s</ArticleCount>
    <Articles>
    <item>
    <Title><![CDATA[%s]]></Title>
    <Description><![CDATA[%s]]></Description>
    <PicUrl><![CDATA[%s]]></PicUrl>
    <Url><![CDATA[%s]]></Url>
    </item>
    <item>
    <Title><![CDATA[%s]]></Title>
    <Description><![CDATA[%s]]></Description>
    <PicUrl><![CDATA[%s]]></PicUrl>
    <Url><![CDATA[%s]]></Url>
    </item>
    </Articles>
    </xml>";
    $resultStr = sprintf($newsTpl, $fromUsername, $toUsername, $time, 'news',
    $ArticleCount,'我是图文信息','我是描述信息','http://www.test.com/DocCenterService/image?photo_id=236',
    'http://www.baidu.com','正式开通上线','描述2','http://jn.test.com/ac/skins/img/upload/img/20131116/48171384568991509.png',
    'http://www.jd.com');
    echo $resultStr;
    $this->log($resultStr);
    }else{
    //回复文本信息
    $textTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[%s]]></MsgType>
    <Content><![CDATA[%s]]></Content>
    <FuncFlag>0</FuncFlag>
    </xml>";
    $contentStr = '你发送的信息是:接收人:'.$toUsername.',发送人:'.$fromUsername.',消息类型:'.$MsgType.',消息内容:'.$content.' www.icity365.com';
    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, 'text', $contentStr);
    echo $resultStr;
    $this->log($resultStr);
    }
    }else{
    echo "Input something...";
    $this->log($resultStr);
    }
    
    //如果是图片消息
    }elseif ($MsgType == 'image'){
    $MediaId = $postObj->MediaId;//图片消息媒体id,可以调用多媒体文件下载接口拉取数据。
    $imageTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[%s]]></MsgType>
    <Image>
    <MediaId><![CDATA[%s]]></MediaId>
    </Image>
    </xml>";
    $resultStr = sprintf($imageTpl, $fromUsername, $toUsername, $time, $MsgType, $MediaId);
    echo $resultStr;
    $this->log("自动响应图片信息");
    $this->log($resultStr);
    
    //如果是视频
    }else if($MsgType == 'video'){
    $MediaId = $postObj->MediaId;//视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
    $ThumbMediaId = $postObj->ThumbMediaId;//视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
    $videoTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[%s]]></MsgType>
    <Video>
    <MediaId><![CDATA[%s]]></MediaId>
    <ThumbMediaId><![CDATA[%s]]></ThumbMediaId>
    <Title><![CDATA[%s]]></Title>
    <Description><![CDATA[%s]]></Description>
    </Video>
    </xml>";
    $resultStr = sprintf($videoTpl, $fromUsername, $toUsername, $time, $MsgType, $MediaId,$ThumbMediaId,'我是标题','我是描述');
    echo $resultStr;
    $this->log("自动响应视频信息".$ThumbMediaId);
    $this->log($resultStr);
    
    //如果是地理位置
    }else if($MsgType == 'location'){
    $Location_X = $postObj->Location_X;//维度
    $Location_Y = $postObj->Location_Y;//经度
    $Scale = $postObj->Scale;//地图缩放大小
    $Label = $postObj->Label;//地里位置信息
    
    //回复文本信息
    $textTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[%s]]></MsgType>
    <Content><![CDATA[%s]]></Content>
    <FuncFlag>0</FuncFlag>
    </xml>";
    $msgType = "text";
    $contentStr = '经度:'.$Location_Y.',维度:'.$Location_X.',地图缩放大小'.$Scale.',地理位置信息:'.$Label;
    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
    echo $resultStr;
    $this->log($resultStr);
    
    //如果是事件
    }else if($MsgType == 'event'){
    
    $Event = $postObj->Event;
    
    //subscribe(关注,也叫订阅)
    if($Event == 'subscribe'){
    
    $EventKey = $postObj->EventKey;//事件KEY值,qrscene_为前缀,后面为二维码的参数值
    
    //未关注时,扫描二维码
    if(!empty($EventKey)){
    $Ticket = $postObj->Ticket;//二维码的ticket,可用来换取二维码图片
    $this->log($fromUsername.'扫描二维码关注!EventKey='.$EventKey.',Ticket='.$Ticket);
    }else{
    $this->log($fromUsername.'关注我了!');
    }
    
    //unsubscribe(取消关注)
    }elseif ($Event == 'unsubscribe'){
    $this->log($fromUsername.'取消关注我了!');
    
    //已关注时,扫描二维码事件
    }elseif($Event == 'SCAN' || $Event == 'scan'){
    $EventKey = $postObj->EventKey;//事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id
    $Ticket = $postObj->Ticket;//二维码的ticket,可用来换取二维码图片
    $this->log($fromUsername.'关注我了!EventKey='.$EventKey.',Ticket='.$Ticket);
    
    //菜单点击事件
    }elseif($Event == 'CLICK'){
    $EventKey = $postObj->EventKey;//事件KEY值,与自定义菜单接口中KEY值对应
    //回复文本信息
    $textTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[%s]]></MsgType>
    <Content><![CDATA[%s]]></Content>
    <FuncFlag>0</FuncFlag>
    </xml>";
    //    $uinfo = file_get_contents("https://api.weixin.qq.com/cgi-bin/user/info?access_token=hwu2rSeVQay064G3e6k1111111111111111AbiqtY6hIB_fv111111111111111117dbeRhL-V9hnzzLWwhXLnrTNokyROJiACAEBW&openid=".$postObj->FromUserName);
    
    //    $uinfo = '';
    $_SESSION['openid'] = $postObj->FromUserName;
    $contentStr = '你点击了菜单,菜单项key='.$EventKey.'and 你的openid是'.$postObj->FromUserName;
    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, 'text', $contentStr);
    echo $resultStr;
    $this->log($resultStr);
    
    //其他事件类型
    }else{
    $this->log('事件类型:'.$Event);
    }
    
    //其他消息类型,链接、语音等
    }else{
    //回复文本信息
    $textTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[%s]]></MsgType>
    <Content><![CDATA[%s]]></Content>
    <FuncFlag>0</FuncFlag>
    </xml>";
    $contentStr = '消息类型:'.$MsgType.'我们还没做处理。。。。【】';
    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, 'text', $contentStr);
    echo $resultStr;
    $this->log($resultStr);
    }
    
    }else {
    echo "";
    exit;
    }
    }else{
    $this->log("验证签名未通过!");
    }
    }
    /**
    * 记录请求信息
    */
    function log_request_info() {
    $post = '';
    foreach($_POST as $key => $value) {
    $post = $post.$key.' : '.$value.' , ';
    }
    $get = '';
    foreach($_GET as $key => $value) {
    $get = $get.$key.' : '.$value.' , ';
    }
    $this->log("get信息:".$get);
    $this->log("post信息:".$post);
    }
    /**
    * 记录日志
    * @param $str
    * @param $mode
    */
    function log($str){
    echo $str;die;
    $mode='a';//追加方式写
    $file = "log.txt";
    $oldmask = @umask(0);
    $fp = @fopen($file,$mode);
    @flock($fp, 3);
    if(!$fp)
    {
    Return false;
    }
    else
    {
    @fwrite($fp,$str);
    @fclose($fp);
    @umask($oldmask);
    Return true;
    }
    }
    }
    
    ?>
  • 相关阅读:
    Hive介绍和Hive环境搭建
    数学【p1658】 购物
    背包【p1858】 多人背包(次优解 or 第k优解)
    Manacher【p4555】 [国家集训队]最长双回文串
    Manacher【p1659】 [国家集训队]拉拉队排练
    数学【p2117】 小z的矩阵
    数学【p2613】 【模板】有理数取余(费马小定理)
    贪心+数学【p3156】 [CQOI2011]分金币 ([HAOI2008]糖果传递)
    线段树【 bzoj3132 】【p4145 】上帝造题的七分钟2 / 花神游历各国
    ST表【p1311】 选择客栈
  • 原文地址:https://www.cnblogs.com/zongsir/p/7831303.html
Copyright © 2020-2023  润新知