在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML5  HTML/ 前兩天剛剛做了微信分享自定義logo和文字,做個標(biāo)記,從零開始記錄

前兩天剛剛做了微信分享自定義logo和文字,做個標(biāo)記,從零開始記錄

首先要有一個認(rèn)證過的公眾號,才會有權(quán)限

clipboard.png

打開微信的jsskd 使用說明

在頁面中引入微信的js文件

clipboard.png

http://res.wx.qq.com/open/js/...

引入后
配置config

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

});
詳細(xì)說一下怎么獲取每一個屬性
debug 為true的時候方便找錯,提示你的錯誤信息
appId 就是你公眾號的id
timestamp 就是一個隨機(jī)的時間戳,溫馨提示時間戳最多為10位,當(dāng)時因?yàn)檫@個問題找了半天
nonceStr 就是一個隨機(jī)字符串
signature 簽名,最麻煩的
要獲取簽名 先要獲取 access_token (有效期7200秒,開發(fā)者必須在自己的服務(wù)全局緩存access_token ):
access_token通過接口獲取
https請求方式: GET

https://api.weixin.qq.com/cgi...
appid 是你自己的id,secret是你自己的秘鑰

clipboard.png

正常情況下,微信會返回下述JSON數(shù)據(jù)包給公眾號:

{"access_token":"ACCESS_TOKEN","expires_in":7200}

clipboard.png

錯誤時微信會返回錯誤碼等信息,JSON數(shù)據(jù)包示例如下(該示例為AppID無效錯誤):

{"errcode":40013,"errmsg":"invalid appid"}

clipboard.png

記得獲取完 access_token 要配置白名單 不然會報錯 40094,白名單可以配置多個,用回車 隔開

clipboard.png

第一步拿到的access_token 采用http GET方式請求獲得jsapi_ticket(有效期7200秒,開發(fā)者必須在自己的服務(wù)全局緩存jsapi_ticket)

https://api.weixin.qq.com/cgi...

access_token 是你剛剛獲取到的 access_token,type是固定的
成功返回如下JSON:

 {
  "errcode":0,
  "errmsg":"ok",
  "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8- 
  41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
  "expires_in":7200
 }

獲得jsapi_ticket之后,就可以生成JS-SDK權(quán)限驗(yàn)證的簽名了。簽名算法建議放在后臺來實(shí)現(xiàn)

簽名生成規(guī)則如下:參與簽名的字段包括noncestr(隨機(jī)字符串), 有效的jsapi_ticket, timestamp(時間戳), url(當(dāng)前網(wǎng)頁的URL,不包含#及其后面部分) 。對所有待簽名參數(shù)按照字段名的ASCII 碼從小到大排序(字典序)后,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串string1。這里需要注意的是所有參數(shù)名均為小寫字符。對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. 對所有待簽名參數(shù)按照字段名的ASCII 碼從小到大排序(字典序)后,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串string1:

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

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

   0f9de62fce790f9a083d5c99e95740ceb90c27ed

注意事項(xiàng)
1.簽名用的noncestr和timestamp必須與wx.config中的nonceStr和timestamp相同。

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

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

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

常見的報錯
調(diào)用config 接口的時候傳入?yún)?shù) debug: true 可以開啟debug模式,頁面會alert出錯誤信息。以下為常見錯誤及解決方法:

1.invalid url domain當(dāng)前頁面所在域名與使用的appid沒有綁定,請確認(rèn)正確填寫綁定的域名,僅支持80(http)和443(https)兩個端口,因此不需要填寫端口號(一個appid可以綁定三個有效域名,見 ]目錄1.1.1)。

2.invalid signature簽名錯誤。建議按如下順序檢查:

1.確認(rèn)簽名算法正確,可用http://mp.weixin.qq.com/debug... 頁面工具進(jìn)行校驗(yàn)。

2.確認(rèn)config中nonceStr(js中駝峰標(biāo)準(zhǔn)大寫S), timestamp與用以簽名中的對應(yīng)noncestr, timestamp一致。

3.確認(rèn)url是頁面完整的url(請?jiān)诋?dāng)前頁面alert(location.href.split('#')[0])確認(rèn)),包括'http(s)://'部分,以及'?'后面的GET參數(shù)部分,但不包括'#'hash后面的部分。

4.確認(rèn) config 中的 appid 與用來獲取 jsapi_ticket 的 appid 一致。

5.確保一定緩存access_token和jsapi_ticket。

6.確保你獲取用來簽名的url是動態(tài)獲取的,動態(tài)頁面可參見實(shí)例代碼中php的實(shí)現(xiàn)方式。如果是html的靜態(tài)頁面在前端通過ajax將url傳到后臺簽名,前端需要用js獲取當(dāng)前頁面除去'#'hash部分的鏈接(可用location.href.split('#')[0]獲取,而且需要encodeURIComponent),因?yàn)轫撁嬉坏┓窒?,微信客戶端會在你的鏈接末尾加入其它參?shù),如果不是動態(tài)獲取當(dāng)前鏈接,將導(dǎo)致分享后的頁面簽名失敗。

3.the permission value is offline verifying這個錯誤是因?yàn)閏onfig沒有正確執(zhí)行,或者是調(diào)用的JSAPI沒有傳入config的jsApiList參數(shù)中。建議按如下順序檢查:

1.確認(rèn)config正確通過。

2.如果是在頁面加載好時就調(diào)用了JSAPI,則必須寫在wx.ready的回調(diào)中。

3.確認(rèn)config的jsApiList參數(shù)包含了這個JSAPI。

4.permission denied該公眾號沒有權(quán)限使用這個JSAPI,或者是調(diào)用的JSAPI沒有傳入config的jsApiList參數(shù)中(部分接口需要認(rèn)證之后才能使用)。

5.function not exist當(dāng)前客戶端版本不支持該接口,請升級到新版體驗(yàn)。

6.為什么6.0.1版本config:ok,但是6.0.2版本之后不ok(因?yàn)?.0.2版本之前沒有做權(quán)限驗(yàn)證,所以config都是ok,但這并不意味著你config中的簽名是OK的,請?jiān)?.0.2檢驗(yàn)是否生成正確的簽名以保證config在高版本中也ok。)

7.在iOS和Android都無法分享(請確認(rèn)公眾號已經(jīng)認(rèn)證,只有認(rèn)證的公眾號才具有分享相關(guān)接口權(quán)限,如果確實(shí)已經(jīng)認(rèn)證,則要檢查監(jiān)聽接口是否在wx.ready回調(diào)函數(shù)中觸發(fā))

8.服務(wù)上線之后無法獲取jsapi_ticket,自己測試時沒問題。(因?yàn)閍ccess_token和jsapi_ticket必須要在自己的服務(wù)器緩存,否則上線后會觸發(fā)頻率限制。請確保一定對token和ticket做緩存以減少2次服務(wù)器請求,不僅可以避免觸發(fā)頻率限制,還加快你們自己的服務(wù)速度。目前為了方便測試提供了1w的獲取量,超過閥值后,服務(wù)將不再可用,請確保在服務(wù)上線前一定全局緩存access_token和jsapi_ticket,兩者有效期均為7200秒,否則一旦上線觸發(fā)頻率限制,服務(wù)將不再可用)。

9.uploadImage怎么傳多圖(目前只支持一次上傳一張,多張圖片需等前一張圖片上傳之后再調(diào)用該接口)

10.沒法對本地選擇的圖片進(jìn)行預(yù)覽(chooseImage接口本身就支持預(yù)覽,不需要額外支持)

11.通過a鏈接(例如先通過微信授權(quán)登錄)跳轉(zhuǎn)到b鏈接,invalid signature簽名失?。ê笈_生成簽名的鏈接為使用jssdk的當(dāng)前鏈接,也就是跳轉(zhuǎn)后的b鏈接,請不要用微信登錄的授權(quán)鏈接進(jìn)行簽名計(jì)算,后臺簽名的url一定是使用jssdk的當(dāng)前頁面的完整url除去'#'部分)

12.出現(xiàn)config:fail錯誤(這是由于傳入的config參數(shù)不全導(dǎo)致,請確保傳入正確的appId、timestamp、nonceStr、signature和需要使用的jsApiList)

13.如何把jsapi上傳到微信的多媒體資源下載到自己的服務(wù)器(請參見文檔中uploadVoice和uploadImage接口的備注說明)

14.Android通過jssdk上傳到微信服務(wù)器,第三方再從微信下載到自己的服務(wù)器,會出現(xiàn)雜音(微信團(tuán)隊(duì)已經(jīng)修復(fù)此問題,目前后臺已優(yōu)化上線)

15.綁定父級域名,是否其子域名也是可用的(是的,合法的子域名在綁定父域名之后是完全支持的)

16.在iOS微信6.1版本中,分享的圖片外鏈不顯示,只能顯示公眾號頁面內(nèi)鏈的圖片或者微信服務(wù)器的圖片,已在6.2中修復(fù)

17.是否需要對低版本自己做兼容(jssdk都是兼容低版本的,不需要第三方自己額外做更多工作,但有的接口是6.0.2新引入的,只有新版才可調(diào)用)

18.該公眾號支付簽名無效,無法發(fā)起該筆交易(請確保你使用的jweixin.js是官方線上版本,不僅可以減少用戶流量,還有可能對某些bug進(jìn)行修復(fù),拷貝到第三方服務(wù)器中使用,官方將不對其出現(xiàn)的任何問題提供保障,具體支付簽名算法可參考 JSSDK微信支付一欄)

19.目前Android微信客戶端不支持pushState的H5新特性,所以使用pushState來實(shí)現(xiàn)web app的頁面會導(dǎo)致簽名失敗,此問題已在Android6.2中修復(fù)

20.uploadImage在chooseImage的回調(diào)中有時候Android會不執(zhí)行,Android6.2會解決此問題,若需支持低版本可以把調(diào)用uploadImage放在setTimeout中延遲100ms解決

21.require subscribe錯誤說明你沒有訂閱該測試號,該錯誤僅測試號會出現(xiàn)

22.getLocation返回的坐標(biāo)在openLocation有偏差,因?yàn)間etLocation返回的是gps坐標(biāo),openLocation打開的騰訊地圖為火星坐標(biāo),需要第三方自己做轉(zhuǎn)換,6.2版本開始已經(jīng)支持直接獲取火星坐標(biāo)

23.查看公眾號(未添加): "menuItem:addContact"不顯示,目前僅有從公眾號傳播出去的鏈接才能顯示,來源必須是公眾號

24.ICP備案數(shù)據(jù)同步有一天延遲,所以請?jiān)诘诙战壎?/p>

因?yàn)殡S機(jī)字符串和時間戳要和算法的保持一致,所以我是用了后臺返回給我的,
每次分享微信客戶端都會在你的鏈接后面加上參數(shù),表示這是第二次分享的,
一旦加入?yún)?shù)會導(dǎo)致我們的簽名失敗。當(dāng)時我也是很絕望啊,在網(wǎng)上找了很多的例子都沒有能實(shí)質(zhì)性的解決這個問題,最后解決方案是
我每次會把當(dāng)前的url傳遞給后臺,后臺每次都在生成簽名,但是7200秒生成的簽名是不會變的,感覺可行,立馬實(shí)施起來

附上源碼

      Weixin(){
                console.log(window.location.href.split('#')[0]);
                let encodeURIComponen=encodeURIComponent(window.location.href.split('#')[0]);
                   const data={jssdkUrl:encodeURIComponen};
                   console.log(data);
                                   axios.post("./api/getSignature",data,{
                                       headers: {
                                           "Content-Type": "application/json",
                                            "Accept":"application/json"
                                       }
                                   }).then((response) => {
                                       //success
                                       console.log(response);
                                       const jssdk=response.data.data;
                                        wx.config({
                                                debug: false, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會通過log打出,僅在pc端時才會打印。
                                                appId: jssdk.appId, // 必填,公眾號的唯一標(biāo)識
                                                timestamp: jssdk.timestamp, // 必填,生成簽名的時間戳
                                                nonceStr:jssdk.nonceStr, // 必填,生成簽名的隨機(jī)串
                                                signature: jssdk.signature,// 必填,簽名
                                                jsApiList: [
                                                    "onMenuShareTimeline",
                                                    "onMenuShareAppMessage"
                                                ] // 必填,需要使用的JS接口列表
                                            });
                                //分享
                            wx.ready(function(){
                                 // 微信分享的數(shù)據(jù)  
                                    //分享給朋友圈
                                        wx.onMenuShareTimeline({
                                        title: '', // 分享標(biāo)題
                                        link: window.location.href.split('#')[0], // 分享鏈接,該鏈接域名或路徑必須與當(dāng)前頁面對應(yīng)的公眾號JS安全域名一致
                                        imgUrl: '', // 分享圖標(biāo)
                                        success: function () {
                                        // 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù)
                                        console.log("分享成功");
                                    },cancel: function () {
                                            // 用戶取消分享后執(zhí)行的回調(diào)函數(shù)
                                             console.log("分享失敗");
                                            }
                                        });
                                    //分享給朋友
                                    wx.onMenuShareAppMessage({    
                                    title: '', // 分享標(biāo)題
                                    desc: '', // 分享描述
                                    link: window.location.href.split('#')[0], // 分享鏈接,該鏈接域名或路徑必須與當(dāng)前頁面對應(yīng)的公眾號JS安全域名一致
                                    imgUrl: '', // 分享圖標(biāo)
                                    type: 'link', // 分享類型,music、video或link,不填默認(rèn)為link
                                    success: function () {
                                    // 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù)
                                      console.log("分享成功");
                                    },
                                    cancel: function () {
                                    // 用戶取消分享后執(zhí)行的回調(diào)函數(shù)
                                     console.log("分享失敗");
                                    }
                                    });
                            })
                                   }, (error) => {
                                       console.log(error)
                                   });
        },

雖然這個這段代碼符合很多大部分的場景,但是畢竟不是萬金油,還是要看你的場景
成長的路上總是坎坎坷坷...

回答
編輯回答
魚梓

這個應(yīng)該發(fā)成文章而不是問題吧

2017年9月23日 18:38