微信分享網頁的實現


微信分享網頁的實現

 

在微信中分享某個網頁,如果不調用微信的接口,分享的網頁會默認顯示。默認的標題是網頁的title,圖片會默認選取網頁中大於300*300的圖片,如果圖片小,取不到圖片,在微信中會顯示默認的灰色圖案。網頁的簡介部分會默認為網頁的鏈接。調用微信的接口以后,分享的標題、圖片、簡介都可以自定義設置。下面結合在項目中的開發實踐,簡要總結一下如何進行微信接口的調用,實現自定義網頁分享。

調用微信接口,就是進行微信公眾平台的開發,主要參考微信公眾平台技術文檔,https://mp.weixin.qq.com/wiki,這是微信官方文檔,里面講的很詳細,也有一些示例程序。

一  前期准備工作

進行微信公眾平台開發,需要做一些前期准備工作。首先需要有一個服務器,可以在網上申請,還要為這台服務器上面開發的網站申請一個域名,域名必須通過審查,也就是在網上輸入域名能夠訪問你的網站。域名准備好之后還要向微信申請一個公眾號,這個公眾號可以是訂閱號也可以是服務號(訂閱號側重內容的傳播、宣傳,服務號側重於向用戶提供服務),根據公司的業務確定。如果是前期開發,我們可以申請一個測試賬號,測試賬號功能比較全,測試功能實現之后,可以再替換為實際使用的訂閱號或者服務號。此處以測試號為例介紹。

二 微信公眾平台開發

有了域名和測試號,說明前期准備工作完成了,下面就可以進行微信平台的開發了。總體的原理是開發服務器程序向微信服務器提交一些驗證信息,包括域名,測試號信息(以Token代表),微信服務器會返回給開發服務器一個簽名,開發服務器也根據微信公眾平台的規則生成簽名,如果和微信服務器返回的簽名相同,則微信服務器允許開發服務器接入微信服務器,調用微信的接口,實現微信公眾平台開發。

1  接入微信公眾平台

登錄測試號以后,在測試號管理中修改接口配置信息,其中URL填寫開發服務器的微信后台處理程序url,如http://www.xxxx.com/WeiXinSDK/CoreServlet,Token可隨意設置,需要和程序中保持一致即可。比如設置為zkyc。配置提交后如果CoreServlet程序正確,就會顯示配置成功。

其執行過程是,測試號配置完成后點擊提交,也就是向微信服務器提交信息,然后微信服務器將發送GET請求到填寫的服務器地址URL(http://www.xxxx.com/WeiXinSDK/CoreServlet)上, GET請求攜帶四個參數:signature、timestamp、nonce、echostr ,開發者通過檢驗signature對請求進行校驗,校驗步驟如下:

1)將token、timestamp、nonce三個參數進行字典序排序

2)將三個參數字符串拼接成一個字符串進行sha1加密

3)開發者獲得加密后的字符串可與signature對比,標識該請求來源於微信

若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,接入生效, 成為開發者成功,否則接入失敗。

具體代碼參考WeiXinSDK的java代碼。

這一步接入成功,說明利用這個測試號,對這個網站可以進行微信公眾平台開發,但是針對於網站中不同的網頁,如果調用微信接口,還是需要微信的驗證。

2  后台程序

針對某個網頁的微信驗證,驗證順序是根據appID和appSecret這兩個參數(這兩個參數由測試號提供),調用微信api(https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appID+"&secret="+appSecret)獲得access_token,根據access_token得到jsapi_ticket,注意jsapi_ticket需要緩存,這個參數有效期是7200秒,由於獲取jsapi_ticket的api調用次數非常有限,頻繁刷新jsapi_ticket會導致api調用受限,影響自身業務,開發者必須在自己的服務全局緩存jsapi_ticket 。再根據jsapi_ticket、timestamp(時間戳)、noncestr(隨機串)、url(網頁的url)這四個參數獲取signature。

具體代碼參考Openinf的java代碼。

3  前端javascript程序

要先在js文件中引入微信的js,

<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

利用ajax從后台/Openinf/WxServlet取出timestamp、nonceStr、signature,然后和微信wx.config中的對應參數進行比較,如果相同,則就可以調用微信的接口了,jsApiList是調用接口的列表。

var url1 =location.href.split('#')[0];

     $.ajax({

           url: '/Openinf/WxServlet',

           async: false,

           data: { "url": url1 },

           dataType: 'text',

           success: function(data) {

                 var data1 = eval("(" + data + ")");

                 var timestamp = data1.timestamp;

                 var nonceStr = data1.nonceStr;

                 var signature = data1.signature;       

                 wx.config({

                      debug: false,

                      appId: "wx728fexxxxxxxxd9b",

                      timestamp: timestamp,

                      nonceStr: nonceStr,

                      signature: signature,

                      jsApiList: ['checkJsApi', 'onMenuShareTimeline', 'onMenuShareAppMessage']

                 });

 

                 wx.ready(function() {

                      // config信息驗證后會執行ready方法,所有接口調用都必須在config接口獲得結果之后,config是一個客戶端的異步操作,所以如果需要在頁面加載時就調用相關接口,則須把相關接口放在ready函數中調用來確保正確執行。

                      //對於用戶觸發時才調用的接口,則可以直接調用,不需要放在ready函數中。

                      wx.checkJsApi({

                            jsApiList: [

                                 'onMenuShareTimeline',

                                 'onMenuShareAppMessage'

                            ],

                            success: function(res) {

//                               alert(JSON.stringify(res));

                            }

                      });

 

                      //分享到朋友圈

                      wx.onMenuShareTimeline({

                            title: articleTitle, // 分享標題

                            link: url1, // 分享鏈接

                            imgUrl: articlePic, // 分享圖標

                            desc: articleBrief,

                            success: function() {                

//                               alert("分享到朋友圈成功.");

                            },

                            cancel: function() {

                                 // 用戶取消分享后執行的回調函數

                            }

                      });

 

                      //獲取“分享給朋友”按鈕點擊狀態及自定義分享內容接口

                      wx.onMenuShareAppMessage({

                            title: articleTitle, // 分享標題

                            desc: articleBrief, // 分享描述

                            link: url1, // 分享鏈接

                            imgUrl: articlePic, // 分享圖標

                            type: "", // 分享類型,music、video或link,不填默認為link

                            dataUrl: "", // 如果type是music或video,則要提供數據鏈接,默認為空

                            success: function() {

                                 // 用戶確認分享后執行的回調函數

//                               alert('已分享');

                            },

                            cancel: function() {

                                 // 用戶取消分享后執行的回調函數

                            }

                      });

                 });

 

                 wx.error(function(res) {

                      // config信息驗證失敗會執行error函數,如簽名過期導致驗證失敗,具體錯誤信息可以打開config的debug模式查看,也可以在返回的res參數中查看,對於SPA可以在這里更新簽名。

                      alert("驗證失敗");

 

                 });

           }

     });

其中url1也就是網頁的url,是取#號之前的值。

三  其他說明

    微信平台開發中,需要接入公網才能夠進行測試。微信提供了微信測試工具,也提供了一些測試接口,如果程序不能達到預期效果,或者報錯,可以用微信提供的測試接口進行驗證,也可以使用測試工具進行調試。

在開發階段,可以將wx.config中的debug設置為true,這樣微信就會一直有反饋信息,容易我們進行調試,調試完成后再把debug設為false。

如果比較順利的通過測試號調試出預期的分享結果,就可以把測試號換為公司的訂閱號或者服務號,程序中主要替換appID和appSecret這兩個參數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM