當(dāng)前位置:首頁(yè) > IT技術(shù) > 微信平臺(tái) > 正文

C#開(kāi)發(fā)微信門戶及應(yīng)用(39)--使用微信JSSDK實(shí)現(xiàn)簽到的功能
2021-07-25 20:34:24

C#開(kāi)發(fā)微信門戶及應(yīng)用(39)--使用微信JSSDK實(shí)現(xiàn)簽到的功能

隨著微信開(kāi)逐步開(kāi)放更多JSSDK的接口,我們可以利用自定義網(wǎng)頁(yè)的方式來(lái)調(diào)用更多微信的接口,實(shí)現(xiàn)我們更加豐富的界面功能和效果,例如我們可以在頁(yè)面中調(diào)用各種手機(jī)的硬件來(lái)獲取信息,如攝像頭拍照,GPS信息、掃描二維碼等等,本篇介紹如何利用這些JSSDK接口實(shí)現(xiàn)簽到的功能,其中簽到需要報(bào)送地理坐標(biāo)和地址,調(diào)用攝像頭實(shí)時(shí)拍照,以及獲取當(dāng)前用戶的相關(guān)信息等等。

隨著微信開(kāi)逐步開(kāi)放更多JSSDK的接口,我們可以利用自定義網(wǎng)頁(yè)的方式來(lái)調(diào)用更多微信的接口,實(shí)現(xiàn)我們更加豐富的界面功能和效果,例如我們可以在頁(yè)面中調(diào)用各種手機(jī)的硬件來(lái)獲取信息,如攝像頭拍照,GPS信息、掃描二維碼等等,本篇介紹如何利用這些JSSDK接口實(shí)現(xiàn)簽到的功能,其中簽到需要報(bào)送地理坐標(biāo)和地址,調(diào)用攝像頭實(shí)時(shí)拍照,以及獲取當(dāng)前用戶的相關(guān)信息等等。

1、JSSDK的說(shuō)明

微信JS-SDK是微信公眾平臺(tái)面向網(wǎng)頁(yè)開(kāi)發(fā)者提供的基于微信內(nèi)的網(wǎng)頁(yè)開(kāi)發(fā)工具包。通過(guò)使用微信JS-SDK,網(wǎng)頁(yè)開(kāi)發(fā)者可借助微信高效地使用拍照、選圖、語(yǔ)音、位置等手機(jī)系統(tǒng)的能力,同時(shí)可以直接使用微信分享、掃一掃、卡券、支付等微信特有的能力,為微信用戶提供更優(yōu)質(zhì)的網(wǎng)頁(yè)體驗(yàn)。

目前JSSDK支持的接口分類包括下面幾類:基礎(chǔ)接口、分享接口、圖像接口、音頻接口、智能接口、設(shè)備信息、地理位置、搖一搖周邊、界面操作、微信掃一掃、微信小店、微信卡券、微信支付,隨著微信功能的全部整合,估計(jì)更多的接口會(huì)陸續(xù)開(kāi)放出來(lái)。

在微信的后臺(tái)進(jìn)入【開(kāi)發(fā)者文檔】模塊,我們可以看到對(duì)應(yīng)的JSSDK的功能分類和介紹,如下所示。

C#開(kāi)發(fā)微信門戶及應(yīng)用(39)--使用微信JSSDK實(shí)現(xiàn)簽到的功能_微信公眾平臺(tái)及門戶應(yīng)用

從右側(cè)我們可以詳細(xì)看到各個(gè)接口的使用說(shuō)明,基本上JSSDK的使用方法都類似,因此調(diào)試通過(guò)并掌握其中一兩個(gè),其他的也就依葫蘆畫瓢,照著做就可以了。

1)JSSDK使用步驟

步驟一:綁定域名

先登錄微信公眾平臺(tái)進(jìn)入“公眾號(hào)設(shè)置”的“功能設(shè)置”里填寫“JS接口安全域名”。如下所示,在公眾平臺(tái)進(jìn)行設(shè)置。

C#開(kāi)發(fā)微信門戶及應(yīng)用(39)--使用微信JSSDK實(shí)現(xiàn)簽到的功能_微信公眾平臺(tái)及門戶應(yīng)用_02

備注:登錄后可在“開(kāi)發(fā)者中心”查看對(duì)應(yīng)的接口權(quán)限。

?

步驟二:引入JS文件

在需要調(diào)用JS接口的頁(yè)面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.0.0.js

如需使用搖一搖周邊功能,請(qǐng)引入 http://res.wx.qq.com/open/js/jweixin-1.1.0.js

備注:支持使用 AMD/CMD 標(biāo)準(zhǔn)模塊加載方法加載

當(dāng)然,我們一般編輯頁(yè)面,為了方便實(shí)現(xiàn)更多的效果,可能還會(huì)引入其他JS,如JQuery的類庫(kù)等等。還有,我們還可以基于WeUI的jquery-weui類庫(kù),實(shí)現(xiàn)更加豐富的功能,如下是我們案例代碼里面的JS引用。

    <script src="~/Content/wechat/jquery-weui/lib/jquery-2.1.4.js"></script>
    <script src="~/Content/wechat/jquery-weui/js/jquery-weui.js"></script>
    <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"></script>

?

步驟三:通過(guò)config接口注入權(quán)限驗(yàn)證配置

所有需要使用JS-SDK的頁(yè)面必須先注入配置信息,否則將無(wú)法調(diào)用(同一個(gè)url僅需調(diào)用一次,對(duì)于變化url的SPA的web app可在每次url變化時(shí)進(jìn)行調(diào)用,目前Android微信客戶端不支持pushState的H5新特性,所以使用pushState來(lái)實(shí)現(xiàn)web app的頁(yè)面會(huì)導(dǎo)致簽名失敗,此問(wèn)題會(huì)在Android6.2中修復(fù))。

wx.config({
    debug: true, // 開(kāi)啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來(lái),若要查看傳入的參數(shù),可以在pc端打開(kāi),參數(shù)信息會(huì)通過(guò)log打出,僅在pc端時(shí)才會(huì)打印。
    appId: '', // 必填,公眾號(hào)的唯一標(biāo)識(shí)
    timestamp: , // 必填,生成簽名的時(shí)間戳
    nonceStr: '', // 必填,生成簽名的隨機(jī)串
    signature: '',// 必填,簽名,見(jiàn)附錄1
    jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表見(jiàn)附錄2

});

以上的配置就是JSSDK的核心所在,里面需要配置好對(duì)應(yīng)的appid,還有timestamp,nonceStr這些都沒(méi)有特別之處,最值得注意的是signature的實(shí)現(xiàn)機(jī)制,這樣我們?cè)诤笈_(tái)生成好對(duì)應(yīng)的值,賦給JS頁(yè)面就可以了,這樣也是最為安全的做法。

如下代碼是我們實(shí)際項(xiàng)目里面,在Asp.net的視圖頁(yè)面里面的HTML代碼,如下所示。

    <script language="javascript">
    var appid = '@ViewBag.appid';
    var noncestr = '@ViewBag.noncestr';
    var signature = '@ViewBag.signature';
    var timestamp = '@ViewBag.timestamp';

        wx.config({
            debug: false,
            appId: appid, // 必填,公眾號(hào)的唯一標(biāo)識(shí)
            timestamp: timestamp, // 必填,生成簽名的時(shí)間戳
            nonceStr: noncestr, // 必填,生成簽名的隨機(jī)串
            signature: signature, // 必填,簽名,見(jiàn)附錄1
            jsApiList: [
               'checkJsApi',
               'onMenuShareTimeline',
               'onMenuShareAppMessage',
               'onMenuShareQQ',
               'onMenuShareWeibo',
               'onMenuShareQZone',
               'hideMenuItems',
               'showMenuItems',
               'hideAllNonBaseMenuItem',
               'showAllNonBaseMenuItem',
               'translateVoice',
               'startRecord',
               'stopRecord',
               'onVoiceRecordEnd',
               'playVoice',
               'onVoicePlayEnd',
               'pauseVoice',
               'stopVoice',
               'uploadVoice',
               'downloadVoice',
               'chooseImage',
               'previewImage',
               'uploadImage',
               'downloadImage',
               'getNetworkType',
               'openLocation',
               'getLocation',
               'hideOptionMenu',
               'showOptionMenu',
               'closeWindow',
               'scanQRCode',
               'chooseWXPay',
               'openProductSpecificView',
               'addCard',
               'chooseCard',
               'openCard'
            ]
        });

?

步驟四:通過(guò)ready接口處理成功驗(yàn)證

wx.ready(function(){
    // config信息驗(yàn)證后會(huì)執(zhí)行ready方法,所有接口調(diào)用都必須在config接口獲得結(jié)果之后,config是一個(gè)客戶端的異步操作,所以如果需要在頁(yè)面加載時(shí)就調(diào)用相關(guān)接口,
//則須把相關(guān)接口放在ready函數(shù)中調(diào)用來(lái)確保正確執(zhí)行。對(duì)于用戶觸發(fā)時(shí)才調(diào)用的接口,則可以直接調(diào)用,不需要放在ready函數(shù)中。 });

這個(gè)ready的接口,也就是在頁(yè)面順利加載完畢后的處理內(nèi)容了,一般我們需要做很多操作,都是需要在頁(yè)面加載完畢后才能調(diào)用相關(guān)的對(duì)象進(jìn)行賦值、處理等操作。

例如我們?cè)陧?yè)面ready后,獲取對(duì)應(yīng)的GPS坐標(biāo)等操作,可以用下面的JS代碼實(shí)現(xiàn)。

        wx.ready(function () {
            wx.getLocation({
                type: 'wgs84', // 默認(rèn)為wgs84的gps坐標(biāo),如果要返回直接給openLocation用的火星坐標(biāo),可傳入'gcj02'
                success: function (res) {
                    var latitude = res.latitude; // 緯度,浮點(diǎn)數(shù),范圍為90 ~ -90
                    var longitude = res.longitude; // 經(jīng)度,浮點(diǎn)數(shù),范圍為180 ~ -180。
                    var speed = res.speed; // 速度,以米/每秒計(jì)
                    var accuracy = res.accuracy; // 位置精度
                    $("#lblLoacation").text(latitude + "," + longitude);
                }
            });
        });

?

步驟五:通過(guò)error接口處理失敗驗(yàn)證

wx.error(function(res){
    // config信息驗(yàn)證失敗會(huì)執(zhí)行error函數(shù),如簽名過(guò)期導(dǎo)致驗(yàn)證失敗,具體錯(cuò)誤信息可以打開(kāi)config的debug模式查看,
    // 也可以在返回的res參數(shù)中查看,對(duì)于SPA可以在這里更新簽名。
});

這個(gè)error接口也就是用來(lái)處理異常信息的,一般情況下可以在這里提示用戶出現(xiàn)的錯(cuò)誤。

?

2)、簽名算法

簽名生成規(guī)則如下:參與簽名的字段包括noncestr(隨機(jī)字符串), 有效的jsapi_ticket, timestamp(時(shí)間戳), url(當(dāng)前網(wǎng)頁(yè)的URL,不包含#及其后面部分) 。對(duì)所有待簽名參數(shù)按照字段名的ASCII 碼從小到大排序(字典序)后,使用URL鍵值對(duì)的格式(即key1=value1&key2=value2…)拼接成字符串string1。這里需要注意的是所有參數(shù)名均為小寫字符。對(duì)string1作sha1加密,字段名和字段值都采用原始值,不進(jìn)行URL 轉(zhuǎn)義。

即signature=sha1(string1)。 示例:

noncestr=Wm3WZYTPz0wzccnW

jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg

timestamp=1414587457

url=http://mp.weixin.qq.com?params=value

?

步驟1. 對(duì)所有待簽名參數(shù)按照字段名的ASCII 碼從小到大排序(字典序)后,使用URL鍵值對(duì)的格式(即key1=value1&key2=value2…)拼接成字符串string1:

jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW&timestamp=1414587457&url=http://mp.weixin.qq.com?params=value

?

步驟2. 對(duì)string1進(jìn)行sha1簽名,得到signature:

0f9de62fce790f9a083d5c99e95740ceb90c27ed

?

注意事項(xiàng)

1.簽名用的noncestr和timestamp必須與wx.config中的nonceStr和timestamp相同。

2.簽名用的url必須是調(diào)用JS接口頁(yè)面的完整URL。

3.出于安全考慮,開(kāi)發(fā)者必須在服務(wù)器端實(shí)現(xiàn)簽名的邏輯。

如出現(xiàn)invalid signature 等錯(cuò)誤詳見(jiàn)附錄5常見(jiàn)錯(cuò)誤及解決辦法。

以上就是JSSDK總體的使用流程,雖然看起來(lái)比較抽象,但是基本上也就是這些步驟了。

?

上面的過(guò)程是具體的參數(shù)處理邏輯,我們要對(duì)應(yīng)到C#代碼的簽名實(shí)現(xiàn),需要對(duì)幾個(gè)變量進(jìn)行處理,下面是對(duì)應(yīng)的生成noncestr、timestamp、以及簽名等操作的代碼。

        /// <summary>
        /// 生成時(shí)間戳,標(biāo)準(zhǔn)北京時(shí)間,時(shí)區(qū)為東八區(qū),自1970年1月1日 0點(diǎn)0分0秒以來(lái)的秒數(shù)
        /// </summary>
        /// <returns>時(shí)間戳</returns>
        private static string GetTimeStamp()
        {
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return Convert.ToInt64(ts.TotalSeconds).ToString();
        }

        /// <summary>
        /// 生成隨機(jī)串,隨機(jī)串包含字母或數(shù)字
        /// </summary>
        /// <returns>隨機(jī)串</returns>
        private static string GetNonceStr()
        {
            return Guid.NewGuid().ToString().Replace("-", "");
        }

還有我們要實(shí)現(xiàn)JSSDK簽名的處理,必須先根據(jù)幾個(gè)變量,構(gòu)建好URL字符串,具體的處理過(guò)程,我們可以把它們逐一放在一個(gè)Hashtable里面,如下代碼所示。

        /// <summary>
        /// 獲取JSSDK所需要的參數(shù)信息,返回Hashtable結(jié)合
        /// </summary>
        /// <param name="appId">微信AppID</param>
        /// <param name="jsTicket">根據(jù)Token獲取到的JSSDK ticket</param>
        /// <param name="url">頁(yè)面URL</param>
        /// <returns></returns>
        public static Hashtable GetParameters(string appId, string jsTicket, string url)
        {
            string timestamp = GetTimeStamp();
            string nonceStr = GetNonceStr();

            // 這里參數(shù)的順序要按照 key 值 ASCII 碼升序排序  
            string rawstring = "jsapi_ticket=" + jsTicket + "&noncestr=" + nonceStr + "&timestamp=" + timestamp + "&url=" + url + "";

            string signature = GetSignature(rawstring);
            Hashtable signPackage = new Hashtable();
            signPackage.Add("appid", appId);
            signPackage.Add("noncestr", nonceStr);
            signPackage.Add("timestamp", timestamp);
            signPackage.Add("url", url);
            signPackage.Add("signature", signature);
            signPackage.Add("jsapi_ticket", jsTicket);
            signPackage.Add("rawstring", rawstring);

            return signPackage;
        }

我們注意到URL參數(shù)的字符串組合:

string rawstring = "jsapi_ticket=" + jsTicket + "&noncestr=" + nonceStr + "&timestamp=" + timestamp + "&url=" + url + "";

這里我們拼接好URL參數(shù)后,就需要使用簽名的規(guī)則來(lái)實(shí)現(xiàn)簽名的處理了,簽名的代碼如下所示,注釋代碼和上面代碼等同。

        /// <summary>
        /// 使用SHA1哈希加密算法生成簽名
        /// </summary>
        /// <param name="rawstring">待處理的字符串</param>
        /// <returns></returns>
        private static string GetSignature(string rawstring)
        {
            return FormsAuthentication.HashPasswordForStoringInConfigFile(rawstring, "SHA1").ToLower();

            ////下面和上面代碼等價(jià)
            //SHA1 sha1 = new SHA1CryptoServiceProvider();
            //byte[] bytes_sha1_in = System.Text.UTF8Encoding.Default.GetBytes(rawstring);
            //byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in);
            //string signature = BitConverter.ToString(bytes_sha1_out);
            //signature = signature.Replace("-", "").ToLower();
            //return signature;
        }

這樣我們有了對(duì)應(yīng)的值后,我們就可以把它們的參數(shù)全部放在集合里面了供使用。

        /// <summary>
        /// 獲取用于JS-SDK的相關(guān)參數(shù)列表(該方法對(duì)accessToken和JSTicket都進(jìn)行了指定時(shí)間的緩存處理,多次調(diào)用不會(huì)重復(fù)生成)
        /// 集合里面包括jsapi_ticket、noncestr、timestamp、url、signature、appid、rawstring
        /// </summary>
        /// <param name="appid">應(yīng)用ID</param>
        /// <param name="appSecret">開(kāi)發(fā)者憑據(jù)</param>
        /// <param name="url">頁(yè)面URL</param>
        /// <returns></returns>
        public Hashtable GetJSAPI_Parameters(string appid, string appSecret, string url)
        {
            string accessToken = GetAccessToken(appid, appSecret);
            string jsTicket = GetJSAPI_Ticket(accessToken);

            return JSSDKHelper.GetParameters(appid, jsTicket, url);
        }

下面我們通過(guò)具體的代碼案例來(lái)介紹使用的過(guò)程。

?

2、簽到功能的實(shí)現(xiàn)處理

其實(shí)簽到,都可以在微信公眾號(hào)和企業(yè)號(hào)實(shí)現(xiàn),微信的企業(yè)號(hào)可能實(shí)現(xiàn)更佳一些,不過(guò)他們使用JSSDK的接口操作是一樣的,我們可以拓展過(guò)去就可以了。這里介紹微信公眾號(hào)JSSDK實(shí)現(xiàn)簽到的功能處理。

簽到的功能,我們希望記錄用戶的GPS位置信息,還有就是利用拍照功能,拍一個(gè)照片同時(shí)上傳到服務(wù)器,這樣我們就可以實(shí)現(xiàn)整個(gè)業(yè)務(wù)效果了。

首先我們來(lái)設(shè)計(jì)簽到的界面,代碼及效果如下所示。

C#開(kāi)發(fā)微信門戶及應(yīng)用(39)--使用微信JSSDK實(shí)現(xiàn)簽到的功能_微信公眾平臺(tái)及門戶應(yīng)用_03

界面預(yù)覽效果如下所示:

C#開(kāi)發(fā)微信門戶及應(yīng)用(39)--使用微信JSSDK實(shí)現(xiàn)簽到的功能_微信公眾平臺(tái)及門戶應(yīng)用_04

我們來(lái)看看微信JSSDK里面對(duì)于【獲取地理位置接口】的說(shuō)明:

wx.getLocation({
    type: 'wgs84', // 默認(rèn)為wgs84的gps坐標(biāo),如果要返回直接給openLocation用的火星坐標(biāo),可傳入'gcj02'
    success: function (res) {
        var latitude = res.latitude; // 緯度,浮點(diǎn)數(shù),范圍為90 ~ -90
        var longitude = res.longitude; // 經(jīng)度,浮點(diǎn)數(shù),范圍為180 ~ -180。
        var speed = res.speed; // 速度,以米/每秒計(jì)
        var accuracy = res.accuracy; // 位置精度
    }
});

以及圖形接口里面【拍照或從手機(jī)相冊(cè)中選圖接口】的說(shuō)明:

wx.chooseImage({
    count: 1, // 默認(rèn)9
    sizeType: ['original', 'compressed'], // 可以指定是原圖還是壓縮圖,默認(rèn)二者都有
    sourceType: ['album', 'camera'], // 可以指定來(lái)源是相冊(cè)還是相機(jī),默認(rèn)二者都有
    success: function (res) {
        var localIds = res.localIds; // 返回選定照片的本地ID列表,localId可以作為img標(biāo)簽的src屬性顯示圖片
    }
});

上傳圖片到微信服務(wù)器接口如下所示。

wx.uploadImage({
    localId: '', // 需要上傳的圖片的本地ID,由chooseImage接口獲得
    isShowProgressTips: 1, // 默認(rèn)為1,顯示進(jìn)度提示
    success: function (res) {
        var serverId = res.serverId; // 返回圖片的服務(wù)器端ID
    }
});

備注:上傳圖片有效期3天,可用微信多媒體接口下載圖片到自己的服務(wù)器,此處獲得的 serverId 即 media_id。

根據(jù)這幾個(gè)接口,我們來(lái)對(duì)它們進(jìn)行包裝,以實(shí)現(xiàn)我們的業(yè)務(wù)需求。根據(jù)我們的需要,我們對(duì)JSSDK接口進(jìn)行了調(diào)用,如下所示。

    <script language="javascript">
    var appid = '@ViewBag.appid';
    var noncestr = '@ViewBag.noncestr';
    var signature = '@ViewBag.signature';
    var timestamp = '@ViewBag.timestamp';

        wx.config({
            debug: false,
            appId: appid, // 必填,公眾號(hào)的唯一標(biāo)識(shí)
            timestamp: timestamp, // 必填,生成簽名的時(shí)間戳
            nonceStr: noncestr, // 必填,生成簽名的隨機(jī)串
            signature: signature, // 必填,簽名,見(jiàn)附錄1
            jsApiList: [
               'checkJsApi',
               'chooseImage',
               'previewImage',
               'uploadImage',
               'downloadImage',
               'getNetworkType',
               'openLocation',
               'getLocation'
            ]
        });

        wx.ready(function () {
            wx.getLocation({
                type: 'wgs84', // 默認(rèn)為wgs84的gps坐標(biāo),如果要返回直接給openLocation用的火星坐標(biāo),可傳入'gcj02'
                success: function (res) {
                    var latitude = res.latitude; // 緯度,浮點(diǎn)數(shù),范圍為90 ~ -90
                    var longitude = res.longitude; // 經(jīng)度,浮點(diǎn)數(shù),范圍為180 ~ -180。
                    var speed = res.speed; // 速度,以米/每秒計(jì)
                    var accuracy = res.accuracy; // 位置精度
                    $("#lblLoacation").text(latitude + "," + longitude);

                    //解析坐標(biāo)地址
                    var location = latitude + "," + longitude;
                    $.ajax({
                        type: 'GET',
                        url: '/JSSDKTest/GetAddress?location=' + location,
                        //async: false, //同步
                        //dataType: 'json',
                        success: function (json) {
                            $("#lblAddress").text(json);
                        },
                        error: function (xhr, status, error) {
                            $.messager.alert("提示", "操作失敗" + xhr.responseText); //xhr.responseText
                        }
                    });
                }
            });
            wx.getNetworkType({
                success: function (res) {
                    var networkType = res.networkType; // 返回網(wǎng)絡(luò)類型2g,3g,4g,wifi
                    $("#lblNetwork").text(networkType);
                }
            });
            
            chooseImage();
        });
    </script>

其中的chooseImage()是我們?cè)陧?yè)面開(kāi)始的時(shí)候,讓用戶拍照的操作,具體JS代碼如下所示。

        //拍照顯示
        var localIds;
        function chooseImage() {
            wx.chooseImage({
                count: 1, // 默認(rèn)9
                sizeType: ['original', 'compressed'], // 可以指定是原圖還是壓縮圖,默認(rèn)二者都有
                sourceType: ['camera'], // 可以指定來(lái)源是相冊(cè)還是相機(jī),默認(rèn)二者都有
                success: function (res) {
                    localIds = res.localIds; // 返回選定照片的本地ID列表,localId可以作為img標(biāo)簽的src屬性顯示圖片
                    $("#imgUpload").attr("src", localIds);
                }
            });
        }

但用戶使用攝像頭拍照后,就會(huì)返回一個(gè)res.localIds集合,因?yàn)槲覀兣恼找粋€(gè),那么可以把它直接賦值給圖片對(duì)象,讓它顯示當(dāng)前拍照的圖片。

拍照完成,我們單擊【簽到】應(yīng)該把圖片和相關(guān)的坐標(biāo)等信息上傳到服務(wù)器的,圖片首先是保存在微信服務(wù)器的,上傳圖片有效期3天,可用微信多媒體接口下載圖片到自己的服務(wù)器,此處獲得的 serverId 即 media_id。

為了實(shí)現(xiàn)我們自己的業(yè)務(wù)數(shù)據(jù),我們需要把圖片集相關(guān)信息存儲(chǔ)在自己的服務(wù)器,這樣才可以實(shí)現(xiàn)信息的保存,最后提示【簽到操作成功】,具體過(guò)程如下所示。

        //上傳圖片
        var serverId;
        function upload() {
            wx.uploadImage({
                localId: localIds[0],
                success: function (res) {
                    serverId = res.serverId;

                    //提交數(shù)據(jù)到服務(wù)器

                    //提示信息
                    $.toast("簽到操作成功");
                },
                fail: function (res) {
                    alert(JSON.stringify(res));
                }
            });
        }

另外,我們?yōu)榱藢?shí)現(xiàn)單擊圖片控件,實(shí)現(xiàn)重新拍照的操作,以及簽到的事件處理,我們對(duì)控件的單擊處理進(jìn)行了綁定,如下代碼所示。

        document.querySelector('#imgUpload').onclick = function () {
            chooseImage();
        };

        $(document).on("click", "#btnSignIn", function () {
            if (localIds == undefined || localIds== null) {
                $.toast('請(qǐng)先拍照', "forbidden");
                return;
            }
            //調(diào)用上傳圖片獲得媒體ID
            upload();
        });

C#開(kāi)發(fā)微信門戶及應(yīng)用(39)--使用微信JSSDK實(shí)現(xiàn)簽到的功能_微信公眾平臺(tái)及門戶應(yīng)用_05

如果對(duì)這個(gè)《C#開(kāi)發(fā)微信門戶及應(yīng)用》系列感興趣,可以關(guān)注我的其他文章,系列隨筆如下所示:

C#開(kāi)發(fā)微信門戶及應(yīng)用(39)--使用微信JSSDK實(shí)現(xiàn)簽到的功能

C#開(kāi)發(fā)微信門戶及應(yīng)用(38)--微信搖一搖紅包功能

C#開(kāi)發(fā)微信門戶及應(yīng)用(37)--微信公眾號(hào)標(biāo)簽管理功能

C#開(kāi)發(fā)微信門戶及應(yīng)用(36)--微信卡劵管理的封裝操作

C#開(kāi)發(fā)微信門戶及應(yīng)用(35)--微信支付之企業(yè)付款封裝操作

C#開(kāi)發(fā)微信門戶及應(yīng)用(34)--微信裂變紅包

C#開(kāi)發(fā)微信門戶及應(yīng)用(33)--微信現(xiàn)金紅包的封裝及使用

C#開(kāi)發(fā)微信門戶及應(yīng)用(32)--微信支付接入和API封裝使用

C#開(kāi)發(fā)微信門戶及應(yīng)用(31)--微信語(yǔ)義理解接口的實(shí)現(xiàn)和處理

C#開(kāi)發(fā)微信門戶及應(yīng)用(30)--消息的群發(fā)處理和預(yù)覽功能

C#開(kāi)發(fā)微信門戶及應(yīng)用(28)--微信“搖一搖·周邊”功能的使用和接口的實(shí)現(xiàn)

C#開(kāi)發(fā)微信門戶及應(yīng)用(27)-公眾號(hào)模板消息管理?

C#開(kāi)發(fā)微信門戶及應(yīng)用(26)-公眾號(hào)微信素材管理

C#開(kāi)發(fā)微信門戶及應(yīng)用(25)-微信企業(yè)號(hào)的客戶端管理功能

C#開(kāi)發(fā)微信門戶及應(yīng)用(24)-微信小店貨架信息管理

C#開(kāi)發(fā)微信門戶及應(yīng)用(23)-微信小店商品管理接口的封裝和測(cè)試

C#開(kāi)發(fā)微信門戶及應(yīng)用(22)-微信小店的開(kāi)發(fā)和使用

C#開(kāi)發(fā)微信門戶及應(yīng)用(21)-微信企業(yè)號(hào)的消息和事件的接收處理及解密?

C#開(kāi)發(fā)微信門戶及應(yīng)用(20)-微信企業(yè)號(hào)的菜單管理

C#開(kāi)發(fā)微信門戶及應(yīng)用(19)-微信企業(yè)號(hào)的消息發(fā)送(文本、圖片、文件、語(yǔ)音、視頻、圖文消息等)

C#開(kāi)發(fā)微信門戶及應(yīng)用(18)-微信企業(yè)號(hào)的通訊錄管理開(kāi)發(fā)之成員管理

C#開(kāi)發(fā)微信門戶及應(yīng)用(17)-微信企業(yè)號(hào)的通訊錄管理開(kāi)發(fā)之部門管理

C#開(kāi)發(fā)微信門戶及應(yīng)用(16)-微信企業(yè)號(hào)的配置和使用

C#開(kāi)發(fā)微信門戶及應(yīng)用(15)-微信菜單增加掃一掃、發(fā)圖片、發(fā)地理位置功能

C#開(kāi)發(fā)微信門戶及應(yīng)用(14)-在微信菜單中采用重定向獲取用戶數(shù)據(jù)

C#開(kāi)發(fā)微信門戶及應(yīng)用(13)-使用地理位置擴(kuò)展相關(guān)應(yīng)用

C#開(kāi)發(fā)微信門戶及應(yīng)用(12)-使用語(yǔ)音處理

C#開(kāi)發(fā)微信門戶及應(yīng)用(11)--微信菜單的多種表現(xiàn)方式介紹

C#開(kāi)發(fā)微信門戶及應(yīng)用(10)--在管理系統(tǒng)中同步微信用戶分組信息

C#開(kāi)發(fā)微信門戶及應(yīng)用(9)-微信門戶菜單管理及提交到微信服務(wù)器

C#開(kāi)發(fā)微信門戶及應(yīng)用(8)-微信門戶應(yīng)用管理系統(tǒng)功能介紹

C#開(kāi)發(fā)微信門戶及應(yīng)用(7)-微信多客服功能及開(kāi)發(fā)集成

C#開(kāi)發(fā)微信門戶及應(yīng)用(6)--微信門戶菜單的管理操作

C#開(kāi)發(fā)微信門戶及應(yīng)用(5)--用戶分組信息管理

C#開(kāi)發(fā)微信門戶及應(yīng)用(4)--關(guān)注用戶列表及詳細(xì)信息管理

C#開(kāi)發(fā)微信門戶及應(yīng)用(3)--文本消息和圖文消息的應(yīng)答

C#開(kāi)發(fā)微信門戶及應(yīng)用(2)--微信消息的處理和應(yīng)答

C#開(kāi)發(fā)微信門戶及應(yīng)用(1)--開(kāi)始使用微信接口

?

C#開(kāi)發(fā)微信門戶及應(yīng)用(39)--使用微信JSSDK實(shí)現(xiàn)簽到的功能_微信公眾平臺(tái)及門戶應(yīng)用_06主要研究技術(shù):代碼生成工具、會(huì)員管理系統(tǒng)、客戶關(guān)系管理軟件、病人資料管理軟件、Visio二次開(kāi)發(fā)、酒店管理系統(tǒng)、倉(cāng)庫(kù)管理系統(tǒng)等共享軟件開(kāi)發(fā)
專注于Winform開(kāi)發(fā)框架/混合式開(kāi)發(fā)框架、Web開(kāi)發(fā)框架、Bootstrap開(kāi)發(fā)框架、微信門戶開(kāi)發(fā)框架的研究及應(yīng)用。
??轉(zhuǎn)載請(qǐng)注明出處:
C#開(kāi)發(fā)微信門戶及應(yīng)用(39)--使用微信JSSDK實(shí)現(xiàn)簽到的功能_微信公眾平臺(tái)及門戶應(yīng)用_06撰寫人:伍華聰??
?

本文摘自 :https://blog.51cto.com/w

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >