1. 程式人生 > >微信公眾號開發--微信JS-SDK分享到朋友圈和分享給朋友

微信公眾號開發--微信JS-SDK分享到朋友圈和分享給朋友

之前寫過一篇使用微信JS-SDK來實現掃一掃功能的部落格

在該部落格裡介紹了微信JS-SDK的基本用法,其中包括以下幾個步驟

這裡寫圖片描述

還詳細介紹了通過config介面注入許可權驗證配置以及簽名演算法實現的Java版本

前兩天在做微信分享的時候發現按照以前的思路每次都不能正確獲取“分享到朋友圈”按鈕點選狀態及自定義分享內容介面,而是必須通過一個按鈕先點選幫點事件,然後才能獲取“分享到朋友圈”按鈕點選狀態及自定義分享內容介面。

回顧一下以前掃一掃的js程式碼

下面是wx.config的主程式碼

    <script type="text/javascript">
        $(function
() {
var timestamp = $("#timestamp").val();//時間戳 var nonceStr = $("#noncestr").val();//隨機串 var signature = $("#signature").val();//簽名 wx.config({ debug : true, // 開啟除錯模式,呼叫的所有api的返回值會在客戶端alert出來,若要檢視傳入的引數,可以在pc端開啟,引數資訊會通過log打出,僅在pc端時才會列印。 appId : 'wx622ca8545e5c354b'
, // 必填,公眾號的唯一標識 timestamp : timestamp, // 必填,生成簽名的時間戳 nonceStr : nonceStr, // 必填,生成簽名的隨機串 signature : signature,// 必填,簽名,見附錄1 jsApiList : [ 'scanQRCode' ] // 必填,需要使用的JS介面列表,所有JS介面列表見附錄2 }); });
</script>

下面是掃一掃的程式碼

前提是有一個

<button id="scanQRCode">掃碼</button>
        $("#scanQRCode").click(function() {
            wx.scanQRCode({
                needResult : 1,
                desc : 'scanQRCode desc',
                success : function(res) {
                    //掃碼後獲取結果引數:htpp://xxx.com/c/?6123,擷取到url中的防偽碼後,賦值給Input
                    var url = res.resultStr;
                    /* var tempArray = url.split('?');
                    var tempNum = tempArray[1]; */
                    if(url.indexOf(",")>=0){
                        var tempArray = url.split(',');
                        var tempNum = tempArray[1];
                        $("#id_securityCode_input").val(tempNum);
                    }else{
                    $("#id_securityCode_input").val(url);
                    }

                }
            });
        });

以上程式碼完全沒有問題,但是當我配置獲取“分享到朋友圈”按鈕點選狀態及自定義分享內容介面的時候卻始終不能成功

解決方案

原來是wx.config執行需要時間,而我們把掃一掃放在外面完全沒影響。是因為,我們點選掃碼的時候wx.config已經載入好了,而我之前的點選一下再分享和掃碼是一個道理,為了不讓使用者點選一下再分享需要將我上面講的微信JS-SDK使用步驟中的第四步用到

這裡寫圖片描述

下面是官方的解釋

步驟四:通過ready介面處理成功驗證

wx.ready(function(){

// config資訊驗證後會執行ready方法,所有介面呼叫都必須在config介面獲得結果之後,config是一個客戶端的非同步操作,所以如果需要在頁面載入時就呼叫相關介面,則須把相關介面放在ready函式中呼叫來確保正確執行。對於使用者觸發時才呼叫的介面,則可以直接呼叫,不需要放在ready函式中。
});

上面的描述給出了我之前的掃碼可以成功而分享不能成功的合理解釋。

像點選掃碼這樣的事件屬於

對於使用者觸發時才呼叫的介面,則可以直接呼叫,不需要放在ready函式中。

而對於分享事件屬於

如果需要在頁面載入時就呼叫相關介面,則須把相關介面放在ready函式中呼叫來確保正確執行

下面就來看一下正確的獲取“分享到朋友圈”按鈕點選狀態及自定義分享內容介面的使用方法

    <script type="text/javascript">
        $(function() {
            var timestamp = $("#timestamp").val();//時間戳
            var nonceStr = $("#noncestr").val();//隨機串
            var signature = $("#signature").val();//簽名
            wx.config({
                debug : true, // 開啟除錯模式,呼叫的所有api的返回值會在客戶端alert出來,若要檢視傳入的引數,可以在pc端開啟,引數資訊會通過log打出,僅在pc端時才會列印。
                appId : 'wx622ca8545e5c354b', // 必填,公眾號的唯一標識
                timestamp : timestamp, // 必填,生成簽名的時間戳
                nonceStr : nonceStr, // 必填,生成簽名的隨機串
                signature : signature,// 必填,簽名,見附錄1
                jsApiList : [ 'scanQRCode','onMenuShareAppMessage' ]
            // 必填,需要使用的JS介面列表,所有JS介面列表見附錄2
            });

            wx.ready(function(){
                // 分享事件必須放在這裡
                wx.onMenuShareAppMessage({
                      title: '這是一個測試的標題',
                      desc: '這個是分享奧朋友圈的描述資訊',
                      link: 'http://www.baidu.com',
                      imgUrl: 'https://www.baidu.com/img/bd_logo1.png',
                      trigger: function (res) {
                        // 不要嘗試在trigger中使用ajax非同步請求修改本次分享的內容,因為客戶端分享操作是一個同步操作,這時候使用ajax的回包會還沒有返回
                        // alert('使用者點擊發送給朋友');
                      },
                      success: function (res) {
                          alert('分享成功');
                      },
                      cancel: function (res) {
                        alert('你沒有分享');
                      },
                      fail: function (res) {
                        alert(JSON.stringify(res));
                      }
                    });
                    //alert('已註冊獲取“傳送給朋友”狀態事件');
            });
        });
    </script>

完整的分享到朋友圈和朋友的js程式碼

<script type="text/javascript">
        $(function() {
            var timestamp = $("#timestamp").val();//時間戳
            var nonceStr = $("#noncestr").val();//隨機串
            var signature = $("#signature").val();//簽名
            wx.config({
                debug : false, // 開啟除錯模式,呼叫的所有api的返回值會在客戶端alert出來,若要檢視傳入的引數,可以在pc端開啟,引數資訊會通過log打出,僅在pc端時才會列印。
                appId : 'wx622ca8545e5c354b', // 必填,公眾號的唯一標識
                timestamp : timestamp, // 必填,生成簽名的時間戳
                nonceStr : nonceStr, // 必填,生成簽名的隨機串
                signature : signature,// 必填,簽名,見附錄1
                jsApiList : [ 'scanQRCode','onMenuShareAppMessage','onMenuShareTimeline' ]
            // 必填,需要使用的JS介面列表,所有JS介面列表見附錄2
            });

            wx.ready(function(){
                // wx.hideOptionMenu();
                wx.onMenuShareTimeline({
                    title: '這是一個測試的標題--程高偉的部落格',
                    link: 'http://blog.csdn.net/frankcheng5143',
                    imgUrl: 'http://avatar.csdn.net/E/B/6/1_frankcheng5143.jpg',
                    success: function () { 
                        // 使用者確認分享後執行的回撥函式
                         alert('分享到朋友圈成功');
                    },
                    cancel: function () { 
                        // 使用者取消分享後執行的回撥函式
                         alert('你沒有分享到朋友圈');
                    }
                });
                wx.onMenuShareAppMessage({
                      title: '這是一個測試的標題--百度',
                      desc: '這個是要分享內容的一些描述--百度一下,你就知道',
                      link: 'http://www.baidu.com',
                      imgUrl: 'https://www.baidu.com/img/bd_logo1.png',
                      trigger: function (res) {
                        // 不要嘗試在trigger中使用ajax非同步請求修改本次分享的內容,因為客戶端分享操作是一個同步操作,這時候使用ajax的回包會還沒有返回
                      },
                      success: function (res) {
                          alert('分享給朋友成功');
                      },
                      cancel: function (res) {
                        alert('你沒有分享給朋友');
                      },
                      fail: function (res) {
                        alert(JSON.stringify(res));
                      }
                    });
            });
        });
</script>

關於繫結域名和簽名演算法參考

效果

通過選單進入頁面

這裡寫圖片描述

進入後呈現的頁面

這裡寫圖片描述

點擊發送給朋友

這裡寫圖片描述

出現我們在js中設定的分享內容

這裡寫圖片描述

分享成功執行的方法

這裡寫圖片描述

分享成功的頁面

這裡寫圖片描述

使用者點選取消,沒有分享時的方法

這裡寫圖片描述

分享到朋友圈的頁面

這裡寫圖片描述

分享成功和沒有分享和上面的效果一樣

參考文獻

相關推薦

公眾開發--JS-SDK分享朋友分享朋友

之前寫過一篇使用微信JS-SDK來實現掃一掃功能的部落格 在該部落格裡介紹了微信JS-SDK的基本用法,其中包括以下幾個步驟 還詳細介紹了通過config介面注入許可權驗證配置以及簽名演算法實現的Java版本 前兩天在做微信分享的時候發現按照以前的

公眾開發--JS-SDK掃一掃功能

首先請閱讀微信JS-SDK說明文件,瞭解微信JS的相關說明。 根據官方的使用步驟,關鍵的有以下幾步 繫結域名(很關鍵) 引入JS檔案(很簡單) 通過config介面注入許可權驗證配置(很重要) 通過ready介面處理成功驗證(還沒用到) 通過error介面

公眾開發 —— 網頁授權小記

微信授權 簡要流程 進入(首頁)頁面 -> 請求資料 -> 401,需要使用者資訊 -> 前端發起 微信授權 -> 使用者確定授權 -> 微信重定向到回撥地址 -> 獲取code,通過code換取網頁授權access_token,生成token -> 跳轉至剛剛的

公眾開發中遇到的問題——支付回撥,分享,獲取openId(三)

微信的統一下單介面(https://api.mch.weixin.qq.com/pay/unifiedorder)中,下單時,有這樣一個引數:notify_url,該引數是為接收微信支付非同步通知回撥的地址,通知url必須為直接可訪問的url,不能攜帶引數。之前我做回撥的時

公眾開發---支付之H5頁面WAP端接入

更新:2015年12月3日微信提供 Wap 支付, 開發者文件:【微信支付】開發者文件 1.前言 公司是通過支付寶和微信支付那塊內容獲取收入,app端已經接入成功,現在要做WAP端。需要頁面和後臺介面一起來實現。 2.介面接入 因為微信支付版本更新了,網上

公眾開發---介面素材管理

素材管理介面:/*臨時素材幾點注意:1.對於臨時素材,每個素材(media_id)會在開發者上傳或粉絲髮送到微信伺服器3天后自動刪除(所以使用者傳送給開發者的素材,若開發者需要,應儘快下載到本地),以節省伺服器資源(對於使用者上傳的臨時素材,我們是不是得有事件來記錄到表中?

公眾開發-----模板訊息介面-----傳送模板訊息

傳送模板訊息 介面呼叫請求說明 http請求方式: POST https://api.weixin.qq.com/cgi-bin/message/template/send?access_toke

公眾開發--------支付

前言公司最近接了個專案,該專案需要用到微信支付模組。本想簡單點處理直接前端發起支付,後端回撥接收。但前端不知道出了什麼問題,一直無法成功調起微信支付。無奈只好轉後臺來做。開發流程1、先在微信支付 商家裡配置授權目錄,如果你的授權目錄是http://www.xxx.com/we

關於公眾開發-支付-無法支付的問題

前提:由於涉及公司業務,部分核心程式碼無法展示,這裡僅僅是聊一下如何解決微信公眾號支付無法支付的解決方案。問題:微信公眾號平臺支付失敗。頁面:大致頁面就是下面這張圖片(引自《公眾號支付開發者文件》中的"公眾號支付"-"場景介紹")所展示的那樣,可以選擇充值金額,可以點選立即充

公眾開發---企業付款個人

   以下有關微信支付中企業付款的介紹及編碼參考自微信支付開發文件,網址:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1,如圖所示      企業付款,提供企業向用戶付款的功能

【Node.js+Express公眾開發】第一步:服務搭建及接入

一、前言 此前微信開發,都比較依賴後端。然而有時候後端小夥伴特別忙,最近又學習了一下node的基礎知識,索性就想著自己用node整一遍。 本教程環境為linux系統centOs7系統 二、準備工作 1. 伺服器 伺服器我使用的是搬瓦工的,目前19.9美元那款,網上有

【Node.js+Express公眾開發】第二步:編寫獲取access_token介面

一、構建一個介面 從上一篇文章中,仔細觀察一下目錄結構,不難發現,routes路由這塊,就是我們放node服務定義放置路由的目錄,原本生成了一個users檔案,暫時用處不大,我們便可以直接更改這個路由。如圖,分別更改一個getAccessToken.js。 然後我

公眾開發-003 調取js時簽名失敗

該文是自己做公眾號開發簽名時遇到的坑,給大家做以下介紹:1):首先設定我的js安全域名,如下圖3):簽名:參與簽名的欄位包括noncestr(隨機字串), 有效的jsapi_ticket, timestamp(時間戳), url(當前網頁的URL,不包含#及其後面部分) 。對

公眾開發 自定義分享 從前臺到Java後臺 呼叫JS介面分享朋友

20180811寫在前面的話 有很多人遇到問題之後問我,結果大多數是因為配置問題,所以請詳細閱讀前面的配置步驟。 20181016注意事項 文中原始碼下載地址 上面這個地址是我當時做的整個專案的原始碼,包含了一些業務在裡面,用的是SSM框架,現在寫了一

公眾開發《三》JS-SDK之地理位置的獲取,整合百度地圖實現線上地圖搜尋

本次講解微信開發第三篇:獲取使用者地址位置資訊,是非常常用的功能,特別是服務行業公眾號,尤為需要該功能,本次講解的就是如何呼叫微信JS-SDK介面,獲取使用者位置資訊,並結合百度地鐵,實現線上地圖搜尋,與線上導航。 在這貼上上二篇博文連結,方便大家訪問: 1.何為J

公眾開發《四》使用JS-SDK實現手機圖片上傳,支援壓縮、預覽。並下載圖片到自身伺服器

在這貼上上三篇博文連結,方便大家查閱互相學習: 本次講解微信開發第四篇:呼叫微信JS-SDK實現上傳手機圖片到伺服器,是非常常見的功能。如我們看到的使用者上傳頭像 下面是本次要實現的效果圖,支援預覽,壓縮上傳(自帶,可引數控制) 1.準備工作:工欲善其事,必先利其

公眾開發筆記1(nodejs開發的)

.post err log 加密 課堂 是我 targe 分享 gty 本篇記錄了微信公眾號開發的一些筆記 一、微信服務器與我們服務器的交流 微信開發者擁有自己的服務器,在我們服務器上可以與微信服務器進行交流。既然可以交流,那就必定需要前提條件(微信認證),也就是說,只有自

公眾開發

weixin 後來 方式 發送請求 菜單 ml2 發現 格式 ejs 一、微信服務器與我們服務器的交流 微信開發者擁有自己的服務器,在我們服務器上可以與微信服務器進行交流。既然可以交流,那就必定需要前提條件(微信認證),也就是說,只有自己的服務器與微信服務器進行認證通過後,

公眾開發教程 小程序

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

公眾開發--獲取用戶息中文亂碼的解決方案

其中 utf-8 == font zzu 解決 col class api 在微信開發中我們會經常需要獲取用戶的信息。 微信給我們提供了獲取用戶信息的api, 地址為 https://api.weixin.qq.com/cgi-bin/user/info?access_t