1. 程式人生 > >微信公眾號開發教程(七)JSSDK-監聽分享朋友圈事件

微信公眾號開發教程(七)JSSDK-監聽分享朋友圈事件

作者:陳惠,叩丁狼教育高階講師。原創文章,轉載請註明出處。

微信JS-SDK是微信公眾平臺 面向網頁開發者提供的基於微信內的網頁開發工具包。

通過使用微信JS-SDK,網頁開發者可藉助微信高效地使用拍照、選圖、語音、位置等手機系統的能力,同時可以直接使用微信分享、掃一掃、卡券、支付等微信特有的能力,為微信使用者提供更優質的網頁體驗。

我們先來看一個生活中常見的例子:

抽獎活動.png

如圖所示的一個抽獎活動,抽獎次數有限,若次數使用完便不能再次參與抽獎,但是使用者分享到朋友圈之後,可增加一次抽獎機會,這樣便達到了宣傳的效果。

那我們應該怎麼去實現呢?
實際上思路比較簡單,就是監聽分享到朋友圈的事件,在分享成功之後給他增加1次抽獎機會,但是,分享到朋友圈是微信裡的功能,所以得使用微信提供的JSSDK才能完成。

實現步驟

一:繫結域名
在公眾號管理頁面,設定JS介面安全域名,表示該域名下的所有頁面,都擁有使用JSSDK的許可權。

圖片.png

二:頁面中引入JS檔案

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

三:通過config介面注入許可權驗證配置
所有需要使用JS-SDK的頁面必須先注入配置資訊,否則將無法呼叫JSSDK的相關API。

在頁面中新增這段js程式碼

 wx.config({
            debug: true
            appId: 'wx59687be81dd3d388', 
            timestamp: 1234567890, 
            nonceStr: 'wolfcode', 
            signature: '5c138e08a9d173c40c4e6280b02d008535bd17d8',
            jsApiList: ['onMenuShareTimeline'] 
});

引數介紹
debug:true為開啟除錯模式,呼叫的所有api的返回值會在客戶端alert出來,若是生產環境則設定為false
appId:必填,公眾號的唯一標識
timestamp:必填,時間戳
nonceStr:必填,隨機生成的字串
signature:必填,根據timestamp與nonceStr與jsapi_ticket按照某種演算法生成的簽名
jsApiList:必填,需要使用的JS介面許可權,如:使用分享朋友圈介面,則填入onMenuShareTimeline,其他介面的名稱可以在開發文件中找到。

jsapi_ticket:
生成簽名signature還需要一個叫jsapi_ticket的引數,jsapi_ticket是公眾號用於呼叫微信JS介面的臨時票據,可以通過基礎介面的access_token來獲取,有效期為7200秒,呼叫次數有限,所以在後臺也需要全域性快取jsapi_ticket。

程式碼:

     //獲取JSSDK的介面地址
    public static final String GET_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";

    /**
     * 獲取JSSDK的jsapi_ticket
     */
    public static void getJsapi_ticket(){
        //發起請求到指定的介面
        String result = HttpUtil.get(GET_TICKET_URL.replace("ACCESS_TOKEN",getAccessToken()));
        System.out.println(result);
    }

成功即返回如下JSON:

{
    "errcode":0,
    "errmsg":"ok",
    "ticket":"bxLdikRXVbTPdHFKA",
    "expires_in":7200
}

獲得jsapi_ticket之後,就可以生成JS-SDK許可權驗證的簽名了。

簽名演算法:
規則如下:參與簽名的欄位包括noncestr(隨機字串), 有效的jsapi_ticket, timestamp(時間戳), url(當前網頁的URL,不包含#及其後面部分) 。對所有待簽名引數按照欄位名的ASCII 碼從小到大排序(字典序)後,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字串string1。這裡需要注意的是所有引數名均為小寫字元。最後對string1作sha1加密,欄位名和欄位值都採用原始值,不進行URL 轉義。

注意事項:
1.簽名用的noncestr和timestamp必須與wx.config中的nonceStr和timestamp相同。
2.簽名用的url必須是呼叫JS介面頁面的完整URL。
3.出於安全考慮,開發者必須在伺服器端實現簽名的邏輯。

圖片.png

利用該工具,可以馬上獲取到簽名的結果,接下來我們把簽名拷貝到config中。

使用web開發者工具,開啟我們的抽獎頁面,可以看到ok的提示,代表權限注入成功。

圖片.png

此時檢視許可權列表,該頁面已經擁有onMenuShareTimeline分享朋友圈的介面操作許可權。

圖片.png

四:通過ready介面處理成功驗證
config許可權驗證成功後會執行ready方法,相反失敗會執行error方法,所有介面呼叫都必須在config介面獲得結果之後,因為config是一個非同步操作,所以如果需要在頁面載入時就呼叫相關介面,則須把相關介面放在ready函式中呼叫來確保正確執行。對於使用者觸發時才呼叫的介面,則可以直接呼叫,不需要放在ready函式中。

在ready中設定分享朋友圈相關功能

 wx.ready(function(){
            //分享到朋友圈介面
            wx.onMenuShareTimeline({
                title: '抽獎活動', // 分享時的標題
                link: 'http://huihui.mynatapp.cc/gift.html', // 分享時的連結,該連結域名或路徑必須與當前頁面對應的公眾號JS安全域名一致
                imgUrl: 'http://www.wolfcode.cn/img/wolfcode/logo.png', // 分享時顯示的圖示
                //使用者確認分享後執行的回撥函式
                success: function () {
                    //給使用者新增1次抽獎機會
                    playnum = 1;
                    $('.playnum').html(playnum);
                },
                //使用者取消分享後執行的回撥函式
                cancel: function () {
                    alert("取消分享");
                }
            });
        });

效果:

Untitled.gif

注意:
我們應該在伺服器端來實現簽名的邏輯,再把相關的引數值響應給頁面,前面主要是為了便於理解暫時直接用簽名工具生成好拷貝進去的。

在後臺計算簽名時演算法參考:

    /**
     * 計算jssdk-config的簽名
     * @param jsapi_ticket
     * @param timestamp
     * @param noncestr
     * @param url
     * @return
     */
    public static String getSignature(String jsapi_ticket,Long timestamp,String noncestr,String url ){
        //對所有待簽名引數按照欄位名的ASCII 碼從小到大排序(字典序)
        Map<String,Object> map = new TreeMap<>();
        map.put("jsapi_ticket",jsapi_ticket);
        map.put("timestamp",timestamp);
        map.put("noncestr",noncestr);
        map.put("url",url);
        //使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字串string1
        StringBuilder sb = new StringBuilder();
        Set<String> set = map.keySet();
        for (String key : set) {
            sb.append(key+"="+map.get(key)).append("&");
        }
        //去掉最後一個&符號
        String temp = sb.substring(0,sb.length()-1);
        //使用sha1加密
        String signature = SecurityUtil.SHA1(temp);
        return signature;
    }

相關推薦

公眾開發教程()JSSDK-分享朋友事件

作者:陳惠,叩丁狼教育高階講師。原創文章,轉載請註明出處。微信JS-SDK是微信公眾平臺 面向網頁開發者提供的基於微信內的網頁開發工具包。通過使用微信JS-SDK,網頁開發者可藉助微信高效地使用拍照、選圖、語音、位置等手機系統的能力,同時可以直接使用微信分享、掃一掃、卡券、支

公眾開發教程[017]-網頁開發-JSSDK

        我承接app和微信公眾號開發,如果有誰需要的話,可以惠顧我,謝謝. QQ: 40678884 微信: szuzsq ---------------------------------------------------------------------

公眾開發教程 小程序

微信開發 微信小程序PHP微信公眾平臺開發高級篇http://www.imooc.com/u/197650/courses?sort=publish微信小程序教程 。鏈接:http://pan.baidu.com/s/1slmAwDf 密碼:ciry微信公眾號開發教程 微信小程序

公眾開發教程[016]-網頁開發-樣式庫

        我承接app和微信公眾號開發,如果有誰需要的話,可以惠顧我,謝謝. QQ: 40678884 微信: szuzsq ---------------------------------------------------------------------

公眾開發教程(五)傳送模板訊息

作者:陳惠,叩丁狼教育高階講師。原創文章,轉載請註明出處。傳送模板訊息也叫業務通知,聽起來雖然有點陌生,但是在生活當中是經常見到的。這一次,我們直接來看個效果。如上圖所示,在我們的生活中,無論是微商城消費,還是日常生活消費,都可能收到這種提示,比如訂單通知,快遞狀態通知,銀行

公眾開發教程(六)獲取信使用者資訊-網頁授權

作者:陳惠,叩丁狼教育高階講師。原創文章,轉載請註明出處。在學習網頁授權之前,我們先來了解下這次的需求:我們的應用中有一個用來顯示個人資訊的頁面,當微信使用者在微信app中開啟這個頁面,希望可以獲取到該使用者的頭像,暱稱等資訊,並顯示到該頁面中。如下圖所示:如果使用者在微信客

公眾開發教程(二)訊息接收與響應處理

作者:陳惠,叩丁狼教育高階講師。原創文章,轉載請註明出處。上一篇文章我們已經實現了URL接入,接下來就可以利用微信官方的開發文件來實現不同的案例。(注意:若還沒有進行接入操作,請參考開發教程(一))實現思路接下來我們先開啟微信的開發文件,選擇“訊息管理”模組中的”接收普通訊息

公眾開發教程[013]-使用者管理

        我承接app和微信公眾號開發,如果有誰需要的話,可以惠顧我,謝謝. QQ: 40678884 微信: szuzsq ---------------------------------------------------------------------

公眾開發(四) -- 自定義分享樣式

1.微信的分享介面呼叫其實相當於是重寫了個介面,自定義的是分享樣式 2.位置還是右上角的三個點點 首先獲取jssdk 因為我的token是儲存在資料庫裡的,所以只要appid和token 沒有的話需要加一步獲取token值 <?php class JSSDK { priv

公眾開發系列三:響應關注和取關事件

一、實際需求              當我們關注某些微信公眾號的時候,有的公眾號會給我們回覆一條文字資訊。本節內容,我們就來實現如何在使用者關注公眾號後,由公眾號給使用者回覆一條文字資訊。同樣在使

公眾平臺開發教程(十) 訂閱與服務的區別

接口文檔 lpad 手機 全部 oauth2.0 spa 上傳 ima lsp 為了消除大家對訂閱號與服務號的疑問,特總結如下: 功能點 介紹 訂閱號 服務號 註冊 註冊賬號 個人信息 個人信息和企業相關信息 展示 在

公眾開發JSSDK

概述   微信JS-SDK是微信公眾平臺面向網頁開發者提供的基於微信內的網頁開發工具包。   通過使用微信JS-SDK,網頁開發者可藉助微信高效地使用拍照、選圖、語音、位置等手機系統的能力,同時可以直接使用微信分享、掃一掃、卡券、支付等微信特有的能力, 為微信使用者提供更優質的網頁體驗。   此文件面向

公眾平臺開發教程-公眾服務申請、認證(開通支付)-開發教程

微信公眾號服務號與訂閱號的區別 訂閱號: 1、每天可以發1次資訊,每次可以傳送8篇文章(資訊展示在微信公眾號摺疊檔案中) 2、不能申請微信支付功能 3、認證後才可以使用自定義選單功能 4、訂閱號適合:不需要支付功能,以為使用者提供諮詢資訊的企業。 服務號: 1、每月可以發4次資訊,每次可以傳送8

公眾平臺開發教程-申請公眾訂閱(服務)需要哪些材料

微信公眾號服務號與訂閱號的區別 訂閱號: 1、每天可以發1次資訊,每次可以傳送8篇文章(資訊展示在微信公眾號摺疊檔案中) 2、不能申請微信支付功能 3、認證後才可以使用自定義選單功能 4、訂閱號適合:不需要支付功能,以為使用者提供諮詢資訊的企業。 服務號: 1、每月可以發4次資訊,每次可以傳送8

公眾平臺開發教程-關於申請公眾訂閱(服務)的材料和流程

手機 開發 展示 公眾平臺開發 自定義 聯系 客服 申請微信公眾號 公眾 微信公眾號服務號與訂閱號的區別 訂閱號: 1、每天可以發1次信息,每次可以發送8篇文章(信息展示在微信公眾號折疊文件中) 2、不能申請微信支付功能 3、認證後才可以使用自定義菜單功能 4、訂閱號適合:

關於公眾開發呼叫jssdk介面以及騰訊地圖API

一,呼叫支付介面 1.必須引入許可權的js   <script src="js/jweixin-1.0.0.js"></script> 2.js部分的初始化配置 paymentAuthorization();//頁面支付許可權授權     // 點

公眾開發之如何使用JSSDK

微信開發交流群:148540125 歡迎留言、轉發 檢視公眾號是否有使用JSSDK的許可權 服務號、訂閱號可以通過登入微信公眾平臺檢視開發>介面許可權 使用JSSDK主要包括 1、判斷當前客戶端版本是否支援指定JS介面、 2、分享介面(微

公眾開發整理()--自定義選單查詢、刪除

1.查詢選單:get請求方式2.在工具類中新增訪問get請求常量URL建立查詢選單方法:public static int createMenu(String token,String menu) throws ParseException, IOException{int

公眾開發介面許可權與次數限制-開發教程13

我們在《玩轉微信公眾號》的視訊中, 已經知道公眾號分為訂閱號,服務號,應用號, 微信公眾號開發時, 每個公眾號型別會有不同的許可權。 比如在開發微信支付功能時, 只有微信服務號能夠

公眾開發--伺服器配置(傻瓜入門教程

<?php //定義TOKEN金鑰 define("TOKEN", "yeyu"); //例項化微信物件 $wechatObj = new wechatCallbackapiTest(); if(isset($_GET['echostr'])){ $wechatObj->valid();