1. 程式人生 > >快遞Api介面 & 微信公眾號開發流程

快遞Api介面 & 微信公眾號開發流程

之前的文章,已經分析過快遞Api介面可能被使用的需求及場景;今天呢,簡單給大家介紹一下微信公眾號中怎麼來使用快遞Api介面,來完成我們的需求和業務場景。

開發語言Nodejs,其中用到了Neo4j圖形資料庫

準備工作

首先,需要到微信公眾平臺註冊賬號
選擇賬號型別介面如下:
此處輸入圖片的描述
選擇訂閱號或伺服器都可以,本文是使用訂閱號進行展開描述。開發微信小程式的選擇小程式即可,不過暫時不對個人開發,只能呵呵了。
選擇之後,根據註冊流程,一步步填寫驗證即可。
此處輸入圖片的描述
註冊完成後,到微信公眾平臺登陸即可。

登陸成功,如下介面:
此處輸入圖片的描述

本文使用的開發語言是Nodejs,所以需要你安裝Nodejs,請到

官方網站下載。
注:如需其他的開發語言,會考慮新增或修改開發語言。

開發工具:WebStorm

公眾號配置

個人資訊的設定,點選左側選單中的公眾號設定方可設定,不過,對於公眾號的資訊會有所限制。
我們需要根據使用者傳送給公眾號的內容,返回不同的資訊;當然,微信公眾號是提供自動回覆功能,但由於自動回覆返回內容規定,然而無法滿足我們的需求;所以,我們需要自己伺服器對接微信公眾平臺,然後我們根據使用者傳送的內容,響應不同的資料。
故而:
配置公眾號開發,點選左側選單中的基本配置,如下:
此處輸入圖片的描述

修改配置:
此處輸入圖片的描述
配置完成後,點選啟用;我們就可以搭建自己的後臺來接收微信伺服器給我們傳送的訊息資料。
點選啟動之前,我們需先啟動我們伺服器與微信的繫結服務;因為啟動時候,微信會給指定的伺服器地址傳送驗證請求。

繫結服務程式碼

我這裡監聽的是8064埠,具體監聽那個埠由你自己決定,8064埠是由Nginx轉發到Nodejs服務上的,具體Nginx的配置,請百度。

var http = require("http");
var route = require("./lib/route");
var routemap = require("./routemap");
var i = 1;
http.createServer(
    function (request, response) {
        route(routemap, request.url, request, response
); i++; console.log("The Bind server has been accessed " + i); if (response.asynchronous == null) { response.end(); } }).listen(8064); console.log("The Bind server is running.");

接著,路由對映:

var requestHandlers = require("./requestHandlers");

var routemap = {
    "get": {
        //        "/": requestHandlers.test
        "/": requestHandlers.bind
    },
    "post": {
        "/": requestHandlers.message
//        "/": requestHandlers.weixinuser
    },
    "put": {
    },
    "del": {
    }
};

module.exports = routemap;

具體介面呼叫位置:

var requestHandlers = {};

var globaldata = root.globaldata;

var bind = require('./handlers/bind');

requestHandlers.bind = function (request, response, pathObject, data) {
    if (data == null) {
        response.write(JSON.stringify({"提示資訊": "bind server 執行正常", b: 2}));
    }
    else {
        bind.message(data, response);
    }
};

繫結介面實現部分:

var bind = {};

var push = require('../lib/push');

bind.message = function (data, response) {
    response.asynchronous = 1;
    var echostr = data.echostr;

    var timestamp = data.timestamp;
    var nonce = data.nonce;
    var signature = data.signature;

    var token = "14890991002";
    if (checkSignature(token, timestamp, nonce, signature) == true) {
       response.write(echostr);//驗證成功,返回echostr
       response.end();
    }else{//驗證失敗就隨便響應即可
        response.write("忠實於共產黨");
        response.end();
    }
}

var sha1 = require('./../tools/sha1');
function checkSignature(token, timestamp, nonce, signature) {

    var strings = [timestamp , nonce , token];
    var sortedStrings = strings.sort();
    var string = sortedStrings.join().replace(/,/g, "");
    var signatureSHA = sha1.hex_sha1(string);
    if (signatureSHA == signature) {
        return true;
    }
    else {
        return false;
    }
}

module.exports = bind;

注:checkSignature是驗證微信訊息是否正確的一個方法,其它語法的驗證Demo請看微信公眾號官方提供的例項。另外注意,程式碼中用的token必須和微信配置token一致。

到此,當你點選啟動的時候,微信公眾號就會顯示繫結成功。

根據訊息響應不同內容

首先,當用戶關注公眾號的時候也會推送訊息,根據openid判斷此使用者是否關注過或重新關注;給使用者響應類似謝謝關注的訊息。
1.解析微信傳送給我們的xml檔案,解析出訊息的型別;
2.如果是訂閱訊息型別,收集需要響應的內容
3.選擇響應的訊息型別,文字或圖片等等
4.把收集的內容變成微信xml格式的內容格式
5.響應xml內容給微信

xml定義的格式是:

    <xml>
        <ToUserName>
            <![CDATA[gh_c6cd8a443586]]>
        </ToUserName>
        <FromUserName>
            <![CDATA[oeFW0juS8FCHZN6VAGYN6MCdyBxo]]>
        </FromUserName>
        <CreateTime>1369204090</CreateTime>
        <MsgType>
            <![CDATA[text]]>
        </MsgType>
        <Content>
            <![CDATA[金三角地]]>
        </Content>
        <MsgId>5880686788099440738</MsgId>
    </xml>

如果使用者已經關注公眾號,我們需要根據使用者給公眾號傳送內容在我們的伺服器上進行匹配,檢視當前關鍵字是否有所關聯;如有關聯,響應相應的文字或圖文等即可。
下面是之前寫的測試程式碼,僅供參考:

var message = {};

var serverSetting = root.globaldata.serverSetting;

var neo4j = require('neo4j');
var db = new neo4j.GraphDatabase(serverSetting.neo4jUrl);

var parser = require('./../tools/sax2json');
var base64 = require('./../tools/base64');
var replyTemplate = require('./../tools/replyTemplate');
var ajax = require('./../lib/ajax.js');
var vm = require('vm');
var http = require('http');
var scriptPool = {};
var redis = require("redis");
var saveClient = redis.createClient();

var debug = serverSetting.debug;

message.message = function (data, getParam, response) {
    response.asynchronous = 1;

    var timestamp = getParam.timestamp;
    var nonce = getParam.nonce;
    var signature = getParam.signature;

    var now = new Date();

    if (checkSignature(token, timestamp, nonce, signature) == false) {
      response.write("忠實於共產黨");//驗證失敗就隨便響應即可
        response.end();
        return;
    }

    for (var key in data) {
        var messageXML = key;
        parser.toJson(messageXML, function (error, messageJSON) {
        var messageData = messageJSON.XML;
            next(messageData);
        });
    }


    function next(messageData) {
        var message;
        resolveMessage(messageData);

        function resolveMessage(messageData) {
            message = {
                type: messageData.MSGTYPE,
                MsgId: messageData.MSGID,
                text: {
                    content: messageData.CONTENT
                },
                image: {
                    picUrl: messageData.PICURL
                },
                location: {
                    location_X: messageData.LOCATION_X,
                    location_Y: messageData.LOCATION_Y,
                    scale: messageData.SCALE,
                    label: messageData.LABEL
                },
                link: {
                    title: messageData.TITLE,
                    description: messageData.DESCRIPTION,
                    url: messageData.URL
                },
                event: {
                    eventType: messageData.EVENT,
                    EventKey: messageData.EVENTKEY
                },
                CreateTime: now.getTime(),
                MsgType:"from"
            };
        }

        var reply;
        resolveReply();

        function resolveReply() {
            reply = {
                ToUserName: "",
                FromUserName: "",
                CreateTime: now.getTime(),
                type: "text",
                text: {
                    content: ""
                },
                music: {
                    Title: "我的音樂",
                    Description: "我的音樂很好聽",
                    MusicUrl: "http://124.202.164.17/download/24482991/31451002/1/mp3/107/128/1320945678443_384/LS9MDWtPO6z7yvJnA9bg==.mp3",
                    HQMusicUrl: "http://124.202.164.17/download/24482991/31451002/1/mp3/107/128/1320945678443_384/LS9MDWtPO6z7yvJnA9bg==.mp3"
                },
                news: {
                    ArticleCount: 2,
                    Articles: [
                        {
                            Title: "擁護共產黨的領導",
                            Description: "踐行中國夢",
                            PicUrl: "http://www.baidu.com/img/bdlogo.gif",
                            Url: "http://www.baidu.com/img/bdlogo.gif"
                        },
                        {
                            Title: "擁護共產黨的路線",
                            Description: "實現中國夢",
                            PicUrl: "http://www.baidu.com/img/bdlogo.gif",
                            Url: "http://www.baidu.com/img/bdlogo.gif"
                        }
                    ]
                },
                log: "【公眾賬號管理工具.】\n",
                MsgType:"reply"
            };
        }
        if(message.event.eventType == "subscribe"){//新使用者
                //todo 給使用者傳送類似關注資訊
        }else{
            //todo根據使用者傳送的關鍵字響應不同的內容
        }
}

var sha1 = require('./../tools/sha1');
function checkSignature(token, timestamp, nonce, signature) {

    var strings = [timestamp , nonce , token];
    var sortedStrings = strings.sort();
    var string = sortedStrings.join().replace(/,/g, "");
    var signatureSHA = sha1.hex_sha1(string);
    if (signatureSHA == signature) {
        return true;
    }
    else {
        return false;
    }
}

module.exports = message;

可能程式碼執行存在問題,僅供參考提供整體流程,謝謝。

注:以上資料及資訊,純屬個人統計或其他來源得知,如有出現誤差和錯誤,敬請諒解,謝謝。
ps:如有其它介面網站想再次新增貴公司介面的對比或其他資訊及情況,請聯絡:QQ:2836989389