国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

微信公眾平臺(tái)SDK

2019-11-17 03:23:48
字體:
供稿:網(wǎng)友

微信公眾平臺(tái)SDK

微信公眾平臺(tái)網(wǎng)址:https://mp.weixin.QQ.com/

服務(wù)號(hào)說明:給企業(yè)和組織提供更強(qiáng)大的業(yè)務(wù)服務(wù)與用戶管理能力,幫助企業(yè)快速實(shí)現(xiàn)全新的公眾號(hào)服務(wù)平臺(tái)。

.NETSDK: Loogn.WeiXinSDK(net2.0源碼,下面代碼只是大概,不太正確,請(qǐng)自行下載源碼)

由于本人用的還是NOKIA-C5,沒用過微信,對(duì)微信的了解肯定沒你多,但公司有需求,只好硬著頭皮直接看接口文檔了。

看后發(fā)現(xiàn)也挺有意思的,一個(gè)很有用的作用就是,當(dāng)用戶給公眾賬號(hào)發(fā)消息時(shí),程序可以根據(jù)用戶發(fā)的內(nèi)容自動(dòng)回復(fù)用戶,比如給一個(gè)物流公司的公眾賬號(hào)發(fā)個(gè)運(yùn)單號(hào),

對(duì)方自動(dòng)回復(fù)你這個(gè)運(yùn)單號(hào)的物流詳細(xì),感覺挺酷!為了說明方便,先給出申請(qǐng)好的公眾賬號(hào)信息:

下圖為表示上面查看物流詳細(xì)的消息流程(虛線的編號(hào)表示流程的順序):

微信會(huì)向你的URL發(fā)送兩大類消息:

一是用戶的一般消息,如上面用戶發(fā)的運(yùn)單號(hào);

二是用戶的行為(即文檔中說的事件) ,如用戶關(guān)注了你的公眾賬號(hào)、掃描了公眾賬號(hào)的二維碼、點(diǎn)擊了你自定義的菜單等。

你的URL就可以根據(jù)收到的消息類型和內(nèi)容做出回應(yīng)以實(shí)現(xiàn)強(qiáng)大的業(yè)務(wù)服務(wù),如上面返回的物流詳細(xì)。消息全部是以xml格式傳遞,而SDK做的就是把XML轉(zhuǎn)換成.NET對(duì)象,以方便你編寫業(yè)務(wù)邏輯。消息的框架類圖表示為(點(diǎn)擊查看包括子類的全圖):

首先有個(gè)消息基類,然后是收到的消息(RecEventBaseMsg)和回復(fù)的消息(ReplyBaseMsg),上面說了,收到的消息分兩大類,即一般消息(RecBaseMsg)和事件消息(EventBaseMsg),收到的消息類型用枚舉表示可以是:

其他的類型不說,而當(dāng)MsgType為Event時(shí),消息便是EventBaseMsg的子類了,所有EventBaseMsg的子類的MsgType都是Event,所以EventBaseMsg類型又有個(gè)EventType來區(qū)分不同的事件,如果你看過接口文檔,你應(yīng)該知道,它的事件類型對(duì)我們判斷到底是哪個(gè)事件不太友好,掃描二維碼事件分了用戶已關(guān)注和未關(guān)注兩種情況,已關(guān)注時(shí)EvenType是scan,未關(guān)注時(shí)EventType是subscribe,而用戶關(guān)注事件的EventType也是subscribe,所以SDK里又加了個(gè)MyEventType:

現(xiàn)在消息的流程基本清楚了,調(diào)用SDK回復(fù)消息如下:

using System.Web;using Loogn.WeiXinSDK;using Loogn.WeiXinSDK.Message;namespace WebTest{    /// <summary>    /// 微信->服務(wù)器配置URL    /// </summary>    public class WeiXinAPI : IHttpHandler    {        static string Token = "Token";//這里是Token不是access_Token        public void PRocessRequest(HttpContext context)        {            context.Response.ContentType = "text/plain";            var signature = context.Request["signature"];            var timestamp = context.Request["timestamp"];            var nonce = context.Request["nonce"];            if (WeiXin.CheckSignature(signature, timestamp, nonce, Token))//驗(yàn)證是微信給你發(fā)的消息            {                //根據(jù)注冊(cè)的消息、事件處理程序回復(fù),                //如果得到?jīng)]用注冊(cè)的消息或事件,會(huì)返回ReplyEmptyMsg.Instance,即GetXML()為string.Empty,符合微信的要求                var replyMsg = WeiXin.ReplyMsg();                var xml = replyMsg.GetXML();                //WriteLog(xml); //這里可以查看回復(fù)的XML消息                context.Response.Write(xml);            }            else            {                context.Response.Write("fuck you!");            }        }        static WeiXinAPI()        {            WeiXin.ConfigGlobalCredential("appid", "appSecret");            //注冊(cè)一個(gè)消息處理程序,當(dāng)用戶發(fā)"ABC",你回復(fù)“你說:ABC”;            WeiXin.RegisterMsgHandler<RecTextMsg>((msg) =>            {                return new ReplyTextMsg                {                    Content = "你說:" + msg.Content                    //FromUserName = msg.ToUserName,  默認(rèn)就是這樣,不用設(shè)置!                    //ToUserName = msg.FromUserName,  默認(rèn)就是這樣,不用設(shè)置!                    //CreateTime = DateTime.Now.Ticks     默認(rèn)就是這樣,不用設(shè)置!                };            });            //注冊(cè)一個(gè)用戶關(guān)注的事件處理程序,當(dāng)用戶關(guān)注你的公眾賬號(hào)時(shí),你回復(fù)“Hello!”            WeiXin.RegisterEventHandler<EventAttendMsg>((msg) =>            {                return new ReplyTextMsg                {                    Content = "Hello !"                };            });            //還可以繼續(xù)注冊(cè)你感興趣的消息、事件處理程序        }        public bool IsReusable        {            get            {                return false;            }        }    }}

SDK包含了除(OAuth2.0網(wǎng)頁授權(quán))的所有接口的封裝,類名及方法名都很明顯,這里就不一一演示,有興趣的朋友可以下載dll自行測(cè)試,這是一張付費(fèi)認(rèn)證過的接口圖:

接下來談?wù)剬?shí)現(xiàn)的幾個(gè)細(xì)節(jié):

一、憑據(jù)(access_token)過期

“access_token是公眾號(hào)的全局唯一票據(jù),公眾號(hào)調(diào)用各接口時(shí)都需使用access_token。正常情況下access_token有效期為7200秒,重復(fù)獲取將導(dǎo)致上次獲取的access_token失效。公眾號(hào)可以使用AppID和AppSecret調(diào)用本接口來獲取access_token。AppID和AppSecret可在開發(fā)模式中獲得(需要已經(jīng)成為開發(fā)者,且?guī)ぬ?hào)沒有異常狀態(tài))。”

根據(jù)文檔上說的,我們可以想到用緩存(不可能每次用每次取吧!),緩存代碼是很簡(jiǎn)單的,主要是在這種情況下要能想到用緩存,下面是非完整代碼:

using System;using System.Collections.Generic;namespace Loogn.WeiXinSDK{    /// <summary>    /// 憑據(jù)    /// </summary>    [Serializable]    class Credential    {        public string access_token { get; set; }        /// <summary>        /// 過期秒數(shù)        /// </summary>        public int expires_in { get; set; }        [NonSerialized]        public DateTime add_time;        static Dictionary<string, Credential> creds = new Dictionary<string, Credential>();        static string TokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";        internal static Credential GetCredential(string appId, string appSecret)        {            Credential cred = null;            if (creds.TryGetValue(appId, out cred))            {                if (cred.add_time.AddSeconds(cred.expires_in - 30) < DateTime.Now)                {                    creds.Remove(appId);                    cred = null;                }                else                {                    return cred;                }            }            var json = Util.HttpGet2(string.Format(TokenUrl, appId, appSecret));            cred = Util.JsonTo<Credential>(json);            creds[appId] = cred;            return cred;        }    }}

二、錯(cuò)誤碼信息

上面說到得到憑據(jù)的代碼不完整就是因?yàn)闆]有處理可能返回的錯(cuò)誤碼,微信錯(cuò)誤碼以json格式返回,如:

{"errcode":40013,"errmsg":"invalid appid"}

大部分由我們主動(dòng)調(diào)用的接口都有可能返回錯(cuò)誤碼,錯(cuò)誤碼格式與正常返回的數(shù)據(jù)格式完全不一樣,在SDK里,我是這樣處理的,先定義好錯(cuò)誤碼的模型類,我這里叫ReturnCode,是因?yàn)殄e(cuò)誤碼里還包含一個(gè){"errcode":0,"errmsg":"ok"}的請(qǐng)求成功的情況:

    public class ReturnCode    {        public int errcode { get; set; }        public string errmsg { get; set; }        public override string ToString()        {            return "{ /"errcode/":" + errcode + ",/"errmsg/":/"" + errmsg + "/"}";        }    }

定義有錯(cuò)誤碼的返回消息類時(shí)我們就可以包含一個(gè)ReturnCode類型的屬性了,如創(chuàng)建二維碼接口:

    public class QRCodeTicket    {        public string ticket { get; set; }        public int expire_seconds { get; set; }        public ReturnCode error { get; set; }    }

從返回的json到QRCodeTicket對(duì)象的代碼大概就是這樣(其他的也是類似):

            var json = Util.HttpPost2(url, data);            if (json.IndexOf("ticket") > 0)            {                return Util.JsonTo<QRCodeTicket>(json);            }            else            {                QRCodeTicket tk = new QRCodeTicket();                tk.error = Util.JsonTo<ReturnCode>(json);                return tk;            }

所以用SDK調(diào)用接口后,得到的對(duì)象就可輕松判斷了:

            var qrcode = WeiXin.CreateQRCode(true, 23);            if (qrcode.error == null)            {                //返回錯(cuò)誤,可以用qrcode.error查看錯(cuò)誤消息            }            else            {                 //返回正確,可以操作qrcode.ticket            }

三、反序列化

微信接口返回的json有時(shí)候?qū)ξ覀冇成涞綄?duì)象并不太直接(json格式太靈活了!),比如創(chuàng)建分組成功后返回的json:

{    "group": {        "id": 107,         "name": "test"    }}

如果想直接用json通過反序列化得到對(duì)象,那么這個(gè)對(duì)象的類的定義有可能會(huì)是這樣:

    public class GroupInfo    {        public Group group { get; set; }        public class Group        {            public int id { get; set; }            public string name { get; set; }        }    }

訪問的時(shí)候也會(huì)是gp.group.name,所以我說不太直接,我們想要的類的定義肯定是只有上面那個(gè)子類的樣子:

    public class GroupInfo    {            public int id { get; set; }            public string name { get; set; }    }

如果微信接口返回的是這樣:

    {        "id": 107,         "name": "test"    }

就再好不過了,但人家的代碼,我們修改不了,我們只有自己想辦法.

1,要簡(jiǎn)單類,2不手動(dòng)分析json(如正則),3,不想多定義一個(gè)類,你有想到很好的方法嗎?如果有可以回復(fù)給我,而我選擇用字典來做中間轉(zhuǎn)換。

因?yàn)?strong>基本所有的json格式都可以反序列化為字典(嵌套字典,嵌套字典集合等),比如上面微信返回的json就可以用以下的類型來表示:

Dictionary<string, Dictionary<string, object>>

json--->dict--->GroupInfo

var dict = Util.JsonTo<Dictionary<string, Dictionary<string, object>>>(json);var gi = new GroupInfo();var gpdict = dict["group"];gi.id = Convert.ToInt32(gpdict["i
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 共和县| 乳山市| 颍上县| 景泰县| 武城县| 正定县| 乐陵市| 雅江县| 隆化县| 东至县| 高青县| 明溪县| 广饶县| 龙胜| 天等县| 武城县| 贞丰县| 武功县| 当阳市| 泽州县| 襄城县| 石嘴山市| 大新县| 安塞县| 西城区| 定陶县| 临潭县| 句容市| 廉江市| 凤凰县| 泾阳县| 余江县| 崇左市| 建始县| 隆化县| 海盐县| 阿拉尔市| 绥棱县| 六安市| 万荣县| 阿拉尔市|