微信公眾號開發——伺服器配置及token驗證

kewlgrl發表於2018-06-23

[前言]:因為自己第一次配置開發者模式是2015年底,當時是SAE的應用,現在申請了一個阿里雲的伺服器,根據官方文件嘗試一晚上無果,自己又找資料成功完成啟用微信公眾號後臺開發者模式的伺服器設定。

一、前提

1、購買一臺雲伺服器

        必須要有公網IP,可以沒有域名,我選擇安裝的是CentOS 7.5的系統。(這裡我是用的最後一個月的學生優惠9.9買了臺阿里雲玩玩);

2、配置安全組


新增一條可以訪問80埠的安全規則。

3、遠端連線

(1)在阿里雲的管理平臺上直接登入


使用者名稱預設root

密碼是購買的時候設定的使用者密碼,忘記的話可以在控制檯重置密碼。

(2)使用Xshell、SecureCRT、Putty等軟體遠端登入

這裡推薦使用Xshell,使用者名稱密碼同上。

4、搭建服務

以下是遠端登入後,在命令列中操作。全部在命令列中操作完成的。

(1)安裝python2.7以上版本

      CentOS7.2自帶python2.7.5,readline-devel 如果沒有安裝的話,會造成進入python直譯器上下左右回退鍵都輸入不正常。

yum install -y readline-devel

如果缺少openssl-devel的話,訪問https會無法工作。

yum install -y openssl-devel

下載

cd /tmp
wget https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tar.xz

解壓縮

tar -xJvf Python-2.7.12.tar.xz

編譯

cd Python-2.7.12/
./configure --prefix=/usr/local/python2.7
make
make install

連結

ln -s /usr/local/python2.7/bin/python2.7 /usr/local/bin/python

由於系統自帶的python路徑是/usr/bin/python。PATH中,/usr/local/bin比/usr/bin靠前,所以當你輸入python,系統會自動啟動你安裝的python2.7.12。

echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

 在python指令碼中,你可以使用env來搜尋python

#!/bin/env python

這樣,CentOS7.2呼叫的也是你安裝的2.7.12。好處是當你在別的環境裡執行,不需要改第一行也能執行。當然你也可以使用絕對路徑:

#!/usr/local/bin/python

這樣當在別的環境中執行,你需要用sed把第一行的路徑替換下。

(2)安裝web.py

先安裝 easy install:

yum install python-setuptools

安裝完成,輸入:

easy_install web.py

(3)安裝libxml2, libxslt, lxml python

yum install libxml2
yum install libxslt
yum install lxml python

(4)編輯程式碼,如果不懂python 語法,請到python官方文件查詢說明。

vim main.py

點選“i”,進入編輯模式,輸入以下程式碼:

# -*- coding: utf-8 -*-
# filename: main.py
import web

urls = (
    '/wx', 'Handle',
)

class Handle(object):
    def GET(self):
        return "hello, this is a test"

if __name__ == '__main__':
    app = web.application(urls, globals())
    app.run()

點選“ESC”,退出編輯模式,輸入“:wq”,退出編輯器並儲存。

(5)開啟服務

如果出現“socket.error: No socket could be created“錯誤資訊,可能為80埠號被佔用,可能是沒有許可權,請自行查詢解決辦法。如果遇見其他錯誤資訊,請到web.py官方文件,學習webpy 框架3執行命令:

sudo python main.py 80 

(6)測試

在瀏覽器輸入http://外網IP:80/wx,可以看到類似於如下的頁面:


這表明一個簡單的web應用已搭建完成。

5、部署LAMP

        即Linux+Apache+MySQL/MariaDB+Perl/PHP/Python,

參考阿里雲官方文件

https://help.aliyun.com/document_detail/50774.html?spm=5176.doc52954.6.722.t92kLG

完成LAMP的部署;

6、修改index.php

程式碼參考官方文件:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319

如下:

<?php    
/**   
  * wechat php test   
  */    
    
//define your token    
define("TOKEN", "weixin");    
$wechatObj = new wechatCallbackapiTest();    
$wechatObj->valid();    
    
class wechatCallbackapiTest    
{    
    public function valid()    
    {    
        $echoStr = $_GET["echostr"];    
    
        //valid signature , option    
        if($this->checkSignature()){    
            echo $echoStr;    
            exit;    
        }    
    }    
    
    public function responseMsg()    
    {    
        //get post data, May be due to the different environments    
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];    
    
        //extract 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(!empty( $keyword ))    
                {    
                    $msgType = "text";    
                    $contentStr = "Welcome to wechat world!";    
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);    
                    echo $resultStr;    
                }else{    
                    echo "Input something...";    
                }    
    
        }else {    
            echo "";    
            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;    
        }    
    }    
}    
    
?>    
其中:
define("TOKEN", "weixin");   

第7行是使用者定義的“token”,需要與下面將會提及的令牌(Token)相同。

安裝Linux/Unix同Windows進行ZModem檔案傳輸的命令列工具:

yum install lrzsz

完成後在命令列中輸入“rz”,選擇本地檔案並上傳。

想要刪除檔案輸入:

rm -f 檔名

從伺服器下載檔案的命令是:

sz 檔名
我在使用putty的時候rz一直無法完成上傳,換用Xshell順利解決。

二、公眾號開發資訊

1、啟用開發者密碼(AppSecret)


直接掃碼完成驗證,開啟後儲存好密碼即可。

2、IP白名單

將自己的雲伺服器的公網IP地址新增到IP白名單中。

三、伺服器配置

填寫完畢後,提交即可完成伺服器配置的啟用。

相關文章