記一次使用vue+typescript做微信公眾號網(wǎng)頁分享的坑

需求場景
這個微信網(wǎng)頁是一個用戶測試的活動。開始測試之前需授權(quán)獲取用戶信息,所以新建一個firstPage頁面作為/頁面來判斷需不需要授權(quán)。如果測試完成分享給用戶,用戶看到的是分享人的結(jié)果頁面,這個頁面是不需要授權(quán)的。掃描其中的二維碼開始測試才需要授權(quán)。所以在前端路由里傳一個query 的參數(shù)。根據(jù)這個參數(shù)(this.$route.query.xxx)判斷,用戶打開的是結(jié)果頁(不需授權(quán))還是測試頁(需授權(quán))。

流程

wx-liuc.png

綁定域名
wx-js.png

引入JS文件

import wx from 'wx-sdk-ts'    
  • vue-cli2.0 引入的是
import wx from'weixin-js-sdk'

通過config接口注入權(quán)限驗證配置

所有需要使用JS-SDK的頁面必須先注入配置信息,否則將無法調(diào)用(同一個url僅需調(diào)用一次,對于變化url的SPA的web app可在每次url變化時進行調(diào)用)

  • 所以獲取微信配置的代碼寫在App.vue文件里。created鉤子函數(shù)里調(diào)用一次。watch到route變化時也調(diào)用一次。
  • 分享給好友的結(jié)果頁,里面動態(tài)生成的二維碼url需攜帶當前用戶的信息。以便在授權(quán)頁面拿到分享人的信息。為了方便,授權(quán)頁面最好獨立寫到一個文件里 page_relation.vue

記錄開發(fā)過程中幾個坑

  • 如果項目采用非history模式(vue-router默認 hash 模式 ),則需要去掉url上#后的部分傳給后端換取微信簽名.
  • 授權(quán)這里由后端處理。授權(quán)完成后由后端將頁面重定向到指定頁面.
let url = encodeURIComponent(
      " http://xxx.cn/h5/migrationQuiz/auth?router_path=home&fromwxuser="
    );
    
    url = url + userId;
    window.location.href =
      "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx6e8235ac81ee7570&redirect_uri=" +
      url +
      "&response_type=code&scope=snsapi_userinfo&state=STATE&connect_redirect=1#wechat_redirect";

這里注意:因為前端路由是帶#的。比如重定向后跳轉(zhuǎn)的頁面是:http://xxx.cn?id=xxx#/home 這個時候如果直接給后端這個地址,發(fā)現(xiàn)這個頁面是找不到的。在這個項目中后端在路由里傳入了一個router_path的參數(shù)。我要重定向到#/home頁面,就在地址中加上router_path=home即可。另外附上后端nodejs代碼??吹竭@個,大家應該不難懂了。

shouquan.png

  • 另外,為了方便前端測試,我們可愛的后端還兼容了本地配置的域名,參照如下代碼
 let debug_redirect_url = encodeURIComponent("www.example.com");

 let url = encodeURIComponent(
 " http://xxx.cn/h5/migrationQuiz/auth?debug_redirect_url=" +
  debug_redirect_url +
  "&router_path=home&fromwxuser="
  );

如上,本地開發(fā)配置的域名為:www.example.com
這里注意:為了能夠正常使用開發(fā)者工具調(diào)試,配置的域名應在公眾號JS接口安全域名下。

  • 分享給好友、分享到朋友圈時,發(fā)現(xiàn)左小角的圖標找不到。正確做法時將這些圖片放到服務器上。url使用服務器的鏈接。
  • 分享的link,根據(jù)分享后用戶需要看到的內(nèi)容而定,需要在子組件將link,emit到App.vue里進行獲取。
    本項目中用戶測試完成的結(jié)果頁result.vue頁面里,需將分享鏈接發(fā)送給 App.vue。其他情況下sharelink默認為網(wǎng)站的初始頁。
  • 打包到服務器時發(fā)現(xiàn)文件都404,在vue-cli2.0的處理方式是:
build -> config -> index.js -> build{} -> assetsPublicPath: './'
1.png

由于本項目中用到了vuecli3+typescript: 所以相應的配置如下:


2.png
  • 由于本項目最后生成的結(jié)果頁是一個html頁面。而產(chǎn)品的需求是,在最終的結(jié)果頁面,可以長按保存成圖片,也就是要在前端將h5頁面生成一張圖片。用到了html2canvas。具體使用方式參見代碼。在處理這個功能的時候,也遇到了一個大坑。參照如圖所示:


    canvas.png

    就是因為最終要生成的圖片有用戶的微信頭像,跨域了,不得不說,微信還是很坑的。最終后端給的解決方案是:
    將用戶的微信頭像改成通過我們這邊h5的服務器來獲取,然后再發(fā)給前端頭像地址,改成用我們的服務器的地址。
    至此,這個項目就算完工了。

最后

由于本項目使用微信開發(fā)者工具進行本地測試,需配置本地域名(www.example.com),且配置的域名應在公眾號JS接口安全域名下。測試過程中使用到了nginx,所以附上nginx的配置代碼。

  • 找到本地host文件
    windows系統(tǒng):C:\Windows\System32\drivers\etc
127.0.0.1   localhost
127.0.0.1   www.example.com
  • nginx開機:
start nginx
  • 重啟nginx
nginx -s reload
  • 配置nginx: D:\nginx-1.14.0\nginx-1.14.0\conf\nginx.conf
server {
        listen       80;
        server_name  www.example.com;
        // 跨域配置
        location ^~ /h5/ {
            proxy_pass http://xxx.cn;
        }
        // 代理到本地
        location / {
            proxy_pass http://localhost:52152;
        }
        # location / {
        #     root   html;
        #     index  index.html index.htm;
        # }
    }

其他情況請參考幾篇不錯的文章:
https://juejin.im/post/5aef2db3f265da0b9c10899e
http://www.itdecent.cn/p/1a35e1dbe1ad
另附本項目github地址:https://github.com/clara222/wxh5

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,983評論 25 709
  • 實用框架以及工具 UI組件 開發(fā)框架 實用庫 服務端 輔助工具 應用實例 Demo示例 UI組件 Element-...
    丶溫瞳閱讀 3,273評論 1 14
  • 1,缺啥補啥,怕啥練啥; 2,一切為我所用,所用為團隊家; 3,我想變,我要變,我不得不變,我會變得越來越好。 今...
    王全峰閱讀 248評論 0 0
  • 2017.4.29-30 周六-日 這是九兒的第一次露營,也是我“人生”的第一次。 坦白來講,這并不是一次完美的旅...
    山間竹音閱讀 673評論 1 0
  • 作為家長,我們要做的不僅僅是讓孩子擁有一個比較好的家庭環(huán)境,還要真正去了解孩子的生活,知道什么才是他們真正需要的。...
    迭達_閱讀 823評論 0 1

友情鏈接更多精彩內(nèi)容