【服务号】微信服务号开发-token验证


腾讯云服务器,Windows Server 2012 R2 标准版 64位中文版,用java完成验证,但是前期用的php,所以包含一点php的东西。

以下为目录:

1.本地连接到腾讯云服务器

2.腾讯云开端口

3.url的格式

4.访问服务器里java工程的话服务器中要下的软件

5.关iis

6.php部分(一个验证服务器被访问的代码及两个验证token的代码)


1.本地连接到腾讯云服务器

腾讯云申请成功后,密码、用户名、内外网ip都是以站内信发给用户的。

点击 开始-运行,输入 “mstsc”命令,打开远程桌面对话框
输入框内输入 服务器外网ip,点击“连接”
弹出的登录点使用其他账户,用自己服务器的用户名和密码,即可远程登录。
连接之前有个详细信息可点,里面勾选一个本地硬盘,服务器上也可以看到本地硬盘上的所有东西,不想再服务器上看到这个硬盘的话,下次连接时再点开详细信息取消那个硬盘的勾选就可以了。
代码文件等想从自己电脑上挪到服务器上一份,直接复制粘贴就好。

2.腾讯云开端口

用腾讯云的话为了安全需要自己开端口 。登录腾讯云企业云之后显示如下界面

点云服务器,左边栏点安全组,新建,关联实例(云主机)后入站规则出战规则都改一下,点添加规则放开相应端口。


3.url的格式
微信开发文档里一直强调,url格式为 http://外网ip:端口号/wx 或者 https://外网ip:端口号/wx 开始的时候漏加了端口号,提交显示验证失败,后来加了端口号显示系统发生错误。后来才知道,url不能这么写,而且格式没那么严格,不用或者说不能分毫不差。以php为例,www里那么多.php文件,谁知道你点了提交是希望用哪一个呢。所以url里要有工程名。比如http://1.1.1.1:80/wx.php才行。 最后成功时候(以ava工程验证)的url填的是:
token为: weixin
java工程为:链接:https://pan.baidu.com/s/1aH6IHmABEszonMPSnz4BBw 密码:dtf4

4.访问服务器里java工程的话服务器中要下的软件
php代码想在服务器里能被外面看到,要下载phpstudy,把需要的,php文件放在www文件夹下,j同样ava也要下东西,叫tomcat,把需要的工程放在webapps文件夹里。(webapps里有个ROOT文件夹,比如在里面建一个名为a的文件夹,放进去一张名为a.png的图片,在自己电脑的浏览器里输入 外网ip/a/a.png即可打开图片)。
tomcat免配路径安装文件为 链接:https://pan.baidu.com/s/1IcRvb_ni1xPY7YBXctsc6g 密码:t0zg
安完之后就可以通过自己电脑的浏览器输入 外网ip 显示如下界面:


说明服务器可以访问。
phpstudy本身像一个集成环境,安完phpstudy自带 apache和mysql,也不用自己安php环境,但是java需要先安java环境再安tomcat,因为安tomcat过程中有两次要求选择文件夹的时候,第一次选择java环境的安装文件夹下的jre文件夹,第二次才是tomcat的安装文件夹(要求全空文件夹)。
安完tomcat,如果没打开可以点击bin文件夹下的startup.bat 出现类似命令提示符的黑底对话框以及很多行字符,不用管,就自己打开了,然后右下角任务栏有一个

中间那个绿色为打开,红色为关闭。右键可以选择开启关闭或退出。(据说点bin文件夹下的Tomcat9.exe也可以打开)

5.关iis

按腾讯云官网教程(https://cloud.tencent.com/document/product/213/2755)开了iis之后发现每次自己电脑输入外网ip界面总是iis的推广(据说是优先级问题),所以想关。觉得再重装系统里边东西都重下太浪费时间了,毕竟一个180m的eclipse除了一堆下载失败的时候,顺利的那次也花了半个多小时。于是准备逆着教程来。
打开服务器管理器,点左边栏的iis,右上角有个管理,点开选删除角色或功能。安的时候选过web服务器,刚弹出对话框发现web服务器前边供选择的小方框里有个黑点,别的有的是黑点有的是对号,点web服务器前边的黑点,小方框变成了未选中,再点一次变成对号,这时候发现下一步可选,删除依然是黑色,而且开的时候选过CGI,关的时候没找着。于是没点别的小方框,点了下一步,发现删除可选,点删除,发现删的是web服务器和CGI(其他当时标着小对号的很安全,所以删的时候点都别点),删完重启,发现服务器管理器左边栏没有iis了,关闭成功。

6.php部分(一个验证服务器被访问的代码及两个验证token的代码)

意外获得了一个php代码,名为wx.php,url写成http://外网ip:80/wx.php时,点提交,会在www文件夹里生成一个log.xml,用notepad++看里面有ip,查了下是来自腾讯的。跑题了这都是细节,可以通过这个php文件验证服务器能被访问。
<?php
/*
    方倍工作室 http://www.cnblogs.com/txw1958/
    CopyRight 2013 www.doucube.com  All Rights Reserved
*/
traceHttp();

define("TOKEN", "weixin");
$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);
            $fromUsername = $postObj->FromUserName;
            $toUsername = $postObj->ToUserName;
            $keyword = trim($postObj->Content);
            $time = time();
            $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>";
            if($keyword == "?" || $keyword == "?")
            {
                $msgType = "text";
                $contentStr = date("Y-m-d H:i:s",time());
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                echo $resultStr;
            }
        }else{
            echo "";
            exit;
        }
    }
}

function traceHttp()
{
    logger("\n\nREMOTE_ADDR:".$_SERVER["REMOTE_ADDR"].(strstr($_SERVER["REMOTE_ADDR"],'101.226')? " FROM WeiXin": "Unknown IP"));
    logger("QUERY_STRING:".$_SERVER["QUERY_STRING"]);
}
function logger($log_content)
{
    if(isset($_SERVER['HTTP_APPNAME'])){   //SAE
        sae_set_display_errors(false);
        sae_debug($log_content);
        sae_set_display_errors(true);
    }else{ //LOCAL
        $max_size = 500000;
        $log_filename = "log.xml";
        if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);}
        file_put_contents($log_filename, date('Y-m-d H:i:s').$log_content."\r\n", FILE_APPEND);
    }
}
?>
后来验证方式改成了php的,因为发现我的tomcat和phpstudy不能随时开,然而我的小伙伴要用php写服务器,所以,php版token验证如下:
<?php
//获得参数 signature nonce token timestamp echostr
    $nonce     = $_GET['nonce'];
    $token     = 'weixin';
    $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 && $echostr ){
        //第一次接入weixin api接口的时候
        echo  $echostr;
        exit;
    }
	?>

其中ob_clean();用来保证echoStr之后无其他字符产生。


以及一个小坑,服务器上新装的最新版phpstudy,mysql一直开启不了。安了vc9 vc11 vc14 还是不行。打开服务,找到Mysql右键点击开启,mysql服务开启了。


发布了12 篇原创文章 · 获赞 15 · 访问量 9586

猜你喜欢

转载自blog.csdn.net/wind_day/article/details/79490477