腾讯云服务器,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填的是:
http://外网ip/weixin_1/CoreServlet weixin_1为工程名
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服务开启了。