博客 / 詳情

返回

前後端分離的項目微信 js-sdk 自定義分享鏈接

最近有點記不清微信 sdk 操作步驟了,藉着項目做到自定義分享鏈接的模塊,重温記錄下過程心得。

前後端分離的項目,綁定域名、獲取 appId 等操作就由後端同事完成,這裏只記錄前端所需的工作。

自定義分享鏈接過程

開發工具

只需微信 web 開發者工具,通過它可以非常容易地定位問題:它會打印所引用的 appId、接口是否可用等;也能點擊模擬分享。無需一次次拿起手機測試。

clipboard.png

js-sdk 引入方式

有兩種引入方式:

  • script 標籤引用
  • 模塊化引用

由於做的是 vue 項目,通過模塊化引用比較符合規範。

// 安裝庫
npm install --save-dev weixin-js-sdk

// 項目引用
import wx from 'weixin-js-sdk'

與後端的交互

這時候,後端同事需要給你微信要求驗證的東西,分別是 appId、timestamp、nonceStr、signature 以及 分享出去的鏈接路徑

需要注意鏈接路徑,要使用後端返回的帶身份信息的鏈接(需要分享信息的話)。

操作: 前端傳過去當前域名給後端簽名,基於當前域名加上指定路徑生成上述信息,後端返回信息。

代碼:

methods: {
  getWeixinConfig() {
    getWxConfig({  // api.js 裏定義的獲取數據接口
        url: location.href.split('#')[0]  // 傳遞當前域名
    }, (data) = > {
        this.config = data;
        this.setWxConfig(data);  // 傳遞返回的數據
    }, (failed) = > {
        // do something
    })
},
setWxConfig(val) {
    let that = this;
    wx.config({
        debug: true, // 開啓調試模式,調用的所有api的返回值會在客户端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時才會打印。使用微信開發者工具可以不打開。
        appId: val.appId, // 必填,公眾號的唯一標識
        timestamp: val.timestamp, // 必填,生成簽名的時間戳,注意是以秒為單位
        nonceStr: val.nonceStr, // 必填,生成簽名的隨機串
        signature: val.signature, // 必填,簽名
        jsApiList: [ // 必填,需要使用的JS接口列表
          'checkJsApi',
          'onMenuShareTimeline',
          'onMenuShareAppMessage',
          'onMenuShareQQ',
          'onMenuShareWeibo'
        ] 
    });
    let share_config = {  // 抽取共同的設置
        imgUrl: location.origin + '/buyer_static/img/share.png', //分享卡片的圖標,默認當相對路徑處理,所以使用絕對路徑的的話,“http://”協議前綴必須在。
        desc: "越來越多的人,xxxxxx~", //摘要,如果分享到朋友圈的話,不顯示摘要。
        title: '我剛剛xxxxx', // 分享卡片標題
        link: val.inviteLink, // 分享出去後的鏈接,這裏是返回的鏈接。注意:不能包含 '#' 以及後面的內容!!
        success: function () { 
            // 分享成功後的回調函數
        },
        cancel: function () {
            // 用户取消分享後執行的回調函數
        }
        // 還有其他幾種回調函數,詳見官網文檔
    };
    wx.ready(function () {  // 設置好後,在 ready 函數裏調用分享方法,傳入設置
        wx.onMenuShareAppMessage(share_config); //分享給好友
        wx.onMenuShareTimeline(share_config); //分享到朋友圈
        wx.onMenuShareQQ(share_config); //分享給手機QQ
        wx.onMenuShareWeibo(share_config);  // 分享到微博
    });
    wx.error(function (res) { 
        // 通過error接口統一處理失敗驗證
        // config信息驗證失敗會執行error函數
    });
    wx.checkJsApi({  // 檢測所使用的 api 是否可用
        jsApiList: [ // 需要檢測的JS接口列表,所有JS接口列表見附錄2
         'onMenuShareTimeline',
         'onMenuShareAppMessage',
         'onMenuShareQQ',
         'onMenuShareWeibo'
        ],
        success: function (res) {
            // 以鍵值對的形式返回,可用的api值true,不可用為false
            // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
        }
    });
}
},
created() {
    // 本地開發不需要驗證
    if (process.env.NODE_ENV === 'production') {
        // 進入頁面時獲取、設置配置
        this.getWeixinConfig()
    }
}

常見問題

注意:以下內容都基於微信管理後台已經綁定前端傳過去的域名 到 appId 上。

1、返回 40001 code

 源頭:accessToken 過期
 
 原因:accessToken 是通過 appId 和 appSecret 運算得到的,用於生成jsapi_ticket -> 生成後面需要的 noncestr、timestamp 等
 
 內容。 accessToken 默認 2 小時後過期,即正常情況下,後台 2 小時請求一次即可。但是,如果在其他地方調用同一套 appId 和 
 
 appSecret 再次生成 accessToken,前一個就會在 5 分鐘內過期,導致驗證失敗。
 
 解決方法: 後端必須在自己的服務全局緩存 access_token 和 jsapi_ticket。
 

2、ios 下分享卡片不顯示縮略圖,而分享到朋友圈或者使用安卓分享都沒有問題。

源頭:縮略圖路徑有問題

原因:縮略圖路徑包含了中文。

解決方法:將中文重命名為英文; 或使用 encodeURI(imgUrl) 處理圖片路徑。

另有一個説法是分享的內容包含敏感詞,但我測試了一下沒發現問題,也提一下給後來人做個參考。可能的敏感詞有: 元、現金、紅包 等。

測試方法: 將標題和內容都換成數字,測試是否顯示縮略圖。

3、不能自定義分享按鈕

願景:頁面自定義分享按鈕,點擊調用分享功能。

結論:做不到,微信不允許。

4、其他常見問題,見 js-sdk 文檔底部附錄5的説明。

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.