玩一玩微信公眾號開發(一) 接入系統

一開始我準備學一學微信開發。后來看了一下文檔,需要自己搭服務器進行接口對調。有點麻煩所以就沒繼續學下去。現在學習過了Kotlin、Spring Boot很多東西,感覺可以比較方便的進行開發了。今天就來回過頭學習一下。

準備工作

申請公眾號

首先說明一下,有兩個微信相關平臺,微信公眾平臺和微信開放平臺。公眾平臺是我們運營微信號的主要地方,我們要想申請訂閱號、公眾號等都需要到這個平臺進行申請。微信開放平臺則是針對開發者的,我們可以在這里申請第三方平臺等,然后和公眾號進行對接。如果需要測試號的話也可以在這里申請。

這里因為是我自己主要玩玩,所以工具全部挑自己最喜歡的。編程語言我選擇Kotlin,開發框架使用Spring Boot,IDE使用Intellij IDEA。剩下的想到再說。

首先第一步就是申請微信公眾號了。我們去微信公眾平臺申請一個公眾號。由于我是個人性質的,只能申請個人訂閱號。申請過程很簡單,照著騰訊的說明來就行了。

申請完成之后會進入到公眾號頁面,我們可以可以在這里進行各種設置。公眾號發布信息也可以直接在這里手動發布。這樣即使沒有任何編程經驗的人也可以運營自己的公眾號。當然既然我們是公眾號開發,那么肯定要用程序來實現這些功能了。在頁面左部最下面就是開發相關資源了。開發者工具包含了幾個很有用的工具,以后會很有用。

開發頁面

花生殼建立內網映射

要接入微信系統的話需要提供一個公網地址,然后將該地址填入微信公眾號,這樣當用戶通過公眾號執行相應動作的時候,微信官方就會將請求發送到該地址上。我們就可以使用程序自動處理了。

當然,如果擁有一個自己的服務器,那是最好不過的了。原來騰訊云和阿里云也有提供學生優化,在校大學生可以用非常實惠的價格購買到云服務器。不過現在政策改了,不管是哪個都需要搶了。而且現在我也畢業了,弄不到這東西了。所以只能使用另外一種方式,那就是使用自己本機電腦當作服務器。

但是本機電腦并沒有公網地址,無法從外部接受請求。所以我們還需要一種方式將外網請求映射到本機上。所以我們需要使用nat123或者花生殼這樣的端口映射工具。這些端口映射工具的原理也很簡單,我們注冊申請之后它會給我們分配一個免費的二級域名。然后我們在電腦本機打開它的映射工具,這樣當用戶通過二級域名訪問的時候,就會映射到我們本機端口上。

其實nat123感覺要比花生殼穩定一些,不過由于花生殼程序的界面更漂亮。所以我還是決定使用花生殼。花生殼的注冊還是很早以前的了。我記得如果需要使用端口映射好像還需要支付1塊錢激活這個功能。

然后我們設置一個內網穿透。內網地址隨便寫,不過由于一般開發web程序都是在8080上開發,所以這里也直接填寫8080就行了。當然如果要保證服務一直可用,電腦必須打開并啟動花生殼。所以我的個人公眾號嘛,當電腦關了的時候肯定就不能用了。

內網穿透

建立Spring Boot項目

準備工作的最后一步就是建立一個項目了。使用Intellij IDEA也非常簡單。如果想使用Java以及Maven的話也可以在這里方便的設置。

新建項目

這樣,所有準備工作就都做完了。

接入微信平臺

輸入驗證信息

要開發公眾號,第一件事情就是接入平臺了。先來看看微信公眾平臺開發文檔。找到左邊的接入指南。這將是我們參考的文檔。

首先先進入微信公眾平臺,點擊左下的基本配置。然后設置URL、Token、EncodingAESKey等信息。URL就是我們用花生殼配置的公網地址。Token是一個我們設置的字符串,將在后面web程序中使用。EncodingAESKey是消息加密的密鑰,自動生成一個就行。設置完成之后,別忙著點提交。先來配置一下服務端。

服務器驗證

服務端也就是我們的web項目了。由于服務器端需要使用剛才我們設置的token,所以我們需要保存該token。token可以硬編碼在程序中,不過更好的方式就是使用配置文件了。所以我們打開application.properties。輸入類似下面的配置。yitian.study.weixin.server.token用于保存token,當然你可以設置自己的屬性名和token。

spring.output.ansi.enabled=always
yitian.study.weixin.server.token=weixintoken
logging.level.yitian.study=debug

我們需要在程序中按照微信的要求對請求進行校驗,只有驗證通過之后才能請求消息。在驗證的時候,微信會向我們填寫的URL發送一個GET請求,包含signature、timestamp、nonce和echostr四個參數。然后按照下面的規則校驗。

1)將token、timestamp、nonce三個參數進行字典序排序
2)將三個參數字符串拼接成一個字符串進行sha1加密
3)將加密后的字符串與signature對比,相同時返回echostr

這個功能可以寫成一個服務。如果不熟悉Kotlin的話也沒事,這語法雖然看著和Java很不一樣,但是其實也就是一個類,包含了verify方法,在verify方法中對幾個參數進行驗證。token參數由Spring的@Value注解從配置文件中讀取,由于Kotlin的內插字符串語法和Spring的SpringEl語法沖突了,所以這里還需要對@Value注解中的美元符號進行轉義。為了驗證程序輸出,這里還順便打印了日志。

@Service
class WeixinVerificationService(
        @Value("\${yitian.study.weixin.server.token}") val token: String
) {
    private val logger = LoggerFactory.getLogger(WeixinVerificationService::class.java)

    fun verify(signature: String
               , timestamp: String
               , nonce: String
               , echostr: String): String {

        logger.debug("signature=$signature,timestamp=$timestamp,token=$token,nonce=$nonce,echostr=$echostr")

        val list = listOf(timestamp, nonce, token)
                .sorted()
        val str = list.joinToString(separator = "")

        val result = Hashing.sha1().hashString(str, Charsets.UTF_8)

        if (result.toString() == signature) {
            return echostr
        } else {
            return ""
        }
    }
}

由于JDK好像沒有自帶Sha1加密類。所以我又引入了Guava庫。如果使用Gradle的話添加下面的依賴即可。

compile group: 'com.google.guava', name: 'guava', version: '21.0'

當然僅僅一個服務是不夠的。我們還需要控制器來處理請求。所以下面來定義一個控制器。上面的服務使用了@Service注解,所以我們可以直接把它注入到控制器中。

@RestController
class MainController(
        private @Autowired val weixinVerificationService: WeixinVerificationService) {


    @RequestMapping("/")
    fun validateServer(@RequestParam signature: String
                       , @RequestParam timestamp: String
                       , @RequestParam nonce: String
                       , @RequestParam echostr: String): String {
        return weixinVerificationService.verify(signature, timestamp, nonce, echostr)
    }
}

寫好控制器之后,啟動Spring Boot程序。先在瀏覽器中輸入在花生殼申請的域名,查看一下解析是否成功。如果出現了一個錯誤頁面的話說明解析沒有問題。然后回到剛剛的微信公眾平臺,確認信息之后點擊提交。微信會向我們的服務器發送請求。驗證通過之后,我們即成功接入了微信。

如果出現Token驗證錯誤,那就是說明可能我們服務器端的token和在這里設置的token不同,導致最終生成的字符串不一致。如果提示URL超時,可能是花生殼解析的問題,檢查花生殼解析或者稍等一會通常可以解決問題。

成功之后,我們就完成了微信開發的第一步!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容