vue使用weixin-js-sdk實現(xiàn)拍照上傳圖片和從相冊選擇圖片(兼容ios和Android)

線上項目親測無bug,附上官方文檔 js-sdk說明文檔

環(huán)境準(zhǔn)備

首先打開終端執(zhí)行命令npm install weixin-js-sdk
可以在main.js文件中將其掛載到Vue原型上

Vue.prototype.wx=require('weixin-js-sdk')

或者可以直接在組件中使用

let wx = require('weixin-js-sdk')

以下示例是組件中單獨引入請知悉

開始

第一步

首先搭建基本的ui結(jié)構(gòu),這邊就直接上代碼了(只做示例,比較簡單)
html部分如下(使用了兩個vant組件,不懂的話可以查看vant官網(wǎng))

<template>
  <div class="container">
    <h2>身份證照片</h2>
    <p>請上傳本人有效身份證照片,拍攝時請保證身份證邊框完整</p>
    <div class="img_box">
      <div class="left_box" @click="boxClick('1')">
        <van-image width="150" height="75" :src="img1" />
        <div class="title_text">身份證正面照</div>
      </div>
      <div class="right_box" @click="boxClick('2')">
        <van-image width="150" height="75" :src="img2" />
        <div class="title_text">身份證反面照</div>
      </div>
    </div>
    <van-popup v-model="show" round position="bottom" :style="{ height: '30%' }">
      <div class="clickBtn" @click="goToFilm('camera')">拍攝</div>
      <div class="clickBtn" @click="goToFilm('album')">從相冊選擇</div>
      <div class="clickBtn" @click="show=false">取消</div>
    </van-popup>
  </div>
</template>

css部分如下

h2 {
  line-height: 60px;
  margin-left: 30px;
}
p {
  text-align: center;
}
.img_box {
  display: flex;
  justify-content: space-evenly;
  margin: 10px 0;
}
.title_text {
  text-align: center;
  margin-top: 15px;
  color: #87ceeb;
  font-size: 16px;
}
.clickBtn {
  height: 20%;
  display: flex;
  align-items: center;
  justify-content: center;
  border-bottom: 1px solid #ccc;
}

效果圖如下

ui效果圖

第二步

首先通過官方文檔的描述準(zhǔn)備必要的數(shù)據(jù)如下:

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

我這邊是和后端配合請求接口獲得
注意wx.config需要寫到created聲明周期鉤子函數(shù)中,頁面被創(chuàng)建的時候調(diào)用,然后依次調(diào)用wx.ready和wx.error
代碼片段如下:

configWxApi () {
      let myUrl = window.location.href.split("#")[0];
      this.wechatParamsByRequestComm(myUrl, 'getWxData', {}, (res) => {
        console.log('wechatData', res);
        wx.config({
          debug: false,
          appId: res.appId, //公眾號的唯一標(biāo)識
          timestamp: res.timestamp, //生產(chǎn)簽名時間戳
          nonceStr: res.noncestr, //生成簽名隨機(jī)串
          signature: res.signature, //簽名
          jsApiList: ['chooseImage', 'uploadImage', 'downloadImage', 'getLocalImgData'] //需要使用的接口列表
        });
        //config信息驗證后會執(zhí)行ready方法铁蹈,所有接口調(diào)用都必須在config接口獲得結(jié)果之后,config是一個客戶端的異步操作众眨,所以如果需要在頁面加載時就調(diào)用相關(guān)接口握牧,則須把相關(guān)接口放在ready函數(shù)中調(diào)用來確保正確執(zhí)行。對于用戶觸發(fā)時才調(diào)用的接口娩梨,則可以直接調(diào)用沿腰,不需要放在ready函數(shù)中。
        wx.ready(function () {
          console.log("ready")
        })
        wx.error(function (res) {
          console.log("失敗了", res);
          //  alert(res.errMsg);  // 正式環(huán)境記得關(guān)閉氨范āK塘!Eκ病措嵌!
          // config信息驗證失敗會執(zhí)行error函數(shù),如簽名過期導(dǎo)致驗證失敗芦缰,具體錯誤信息可以打開config的debug模式查看企巢,也可以在返回的res參數(shù)中查看,對于SPA可以在這里更新簽名饺藤。
        });
      })
    },

將configWxApi方法寫入cerated中即可
wechatParamsByRequestComm方法為獲取wx.config中參數(shù)的方法,可以配合后端完成

注意事項:
ios系統(tǒng)調(diào)用api的時候會有系統(tǒng)默認(rèn)彈窗,安卓則沒有,所以需要做好兼容處理

首先附上data代碼塊的數(shù)據(jù)

data () {
    return {
      show: false,//是否彈窗
      img1: 'https://img01.yzcdn.cn/vant/cat.jpeg',
      img2: 'https://img01.yzcdn.cn/vant/cat.jpeg',
      imgFlag: '',//點擊的是哪張圖片
      timer: null
    }
  },

當(dāng)點擊上傳圖片時,ios不需要調(diào)用咋自己的彈窗,Android則需要先調(diào)用咋自己寫的彈窗,兼容代碼如下
點擊安卓首先調(diào)用彈窗,然后再調(diào)用wx的api,蘋果直接調(diào)用wx的api(詳情見goToFilm方法)

this.isMobile()方法為判斷當(dāng)前是ios還是Android,安卓為1,ios為2

boxClick (flag) {
      console.log('flag: ', flag);
      console.log(this.isMobile());
      this.imgFlag = flag
      if (this.isMobile() == '1') {//安卓系統(tǒng)時候才會調(diào)用自己的彈窗,ios有默認(rèn)彈窗
        this.show = true
      } else if (this.isMobile() == '2') {//蘋果系統(tǒng)就直接調(diào)用方法,會有默認(rèn)彈窗
        this.goToFilm(['camera', 'album'])
      }
    },

重點來了,如下為調(diào)用wx api的方法
定時器可以加也可以不加

 goToFilm (sourceType) {
      this.show = false
      console.log(sourceType);
      wx.chooseImage({
        count: 1, // 默認(rèn)9
        sizeType: ['compressed'], // 可以指定是原圖還是壓縮圖包斑,默認(rèn)二者都有 ['original', 'compressed']
        sourceType: sourceType, // 可以指定來源是相冊還是相機(jī),默認(rèn)二者都有 ['album', 'camera']
        success: (res) => {
          let localIds = res.localIds;
          let localId = localIds[0]
          console.log('success成功回調(diào)res', res);

          this.timer = window.setTimeout(() => {
            wx.uploadImage({
              localId: localId, // 需要上傳的圖片的本地ID涕俗,由chooseImage接口獲得
              isShowProgressTips: 1, // 默認(rèn)為1,顯示進(jìn)度提示
              success: (res) => {
                let serverId = res.serverId; // 返回圖片的服務(wù)器端ID

                wx.downloadImage({
                  serverId: serverId, // 需要下載的圖片的服務(wù)器端ID神帅,由uploadImage接口獲得
                  isShowProgressTips: 1, // 默認(rèn)為1再姑,顯示進(jìn)度提示
                  success: (res) => {
                    let localId = res.localId; // 返回圖片下載后的本地ID

                    wx.getLocalImgData({
                      localId: localId,
                      success: (result) => {
                        console.log('result: ', result);
                        if (this.isMobile() == '2') {//蘋果系統(tǒng)
                          console.log('ios');
                          let imgSrc = result.localData;
                          if (this.imgFlag == '1') {
                            this.img1 = imgSrc
                          } else if (this.imgFlag == '2') {
                            this.img2 = imgSrc
                          }
                        } else if (this.isMobile() == '1') {//安卓系統(tǒng)
                          console.log('android');
                          let imgSrc = 'data:image/jpeg/png;base64,' + result.localData; // localData是圖片的base64數(shù)據(jù),可以用img標(biāo)簽顯示
                          if (this.imgFlag == '1') {
                            this.img1 = imgSrc
                          } else if (this.imgFlag == '2') {
                            this.img2 = imgSrc
                          }
                        }
                      },
                      fail: (err) => {

                        console.log('getLocalImgData失敗', err);
                      },
                      complete: () => {
                        window.clearTimeout(this.timer)
                        console.log('getLocalImgData接口調(diào)用完成');
                      }
                    });
                  }
                })
              }
            })
          }, 100);

        },

        fail: (err) => {
          console.log('chooseImage失敗', err);
        },

        complete: () => {
          console.log('chooseImage接口調(diào)用完成');
        }
      });
    },

制作不易,如果覺得用得上或者覺得我寫的還不錯的可以點個贊謝謝

結(jié)束

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末找御,一起剝皮案震驚了整個濱河市元镀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌霎桅,老刑警劉巖栖疑,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異滔驶,居然都是意外死亡遇革,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萝快,“玉大人锻霎,你說我怎么就攤上這事【句觯” “怎么了旋恼?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奄容。 經(jīng)常有香客問我冰更,道長,這世上最難降的妖魔是什么昂勒? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任蜀细,我火速辦了婚禮,結(jié)果婚禮上叁怪,老公的妹妹穿的比我還像新娘审葬。我一直安慰自己,他們只是感情好奕谭,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布涣觉。 她就那樣靜靜地躺著,像睡著了一般血柳。 火紅的嫁衣襯著肌膚如雪官册。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天难捌,我揣著相機(jī)與錄音膝宁,去河邊找鬼。 笑死根吁,一個胖子當(dāng)著我的面吹牛员淫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播击敌,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼介返,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了沃斤?” 一聲冷哼從身側(cè)響起圣蝎,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎衡瓶,沒想到半個月后徘公,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡哮针,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年关面,在試婚紗的時候發(fā)現(xiàn)自己被綠了坦袍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡缭裆,死狀恐怖键闺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情澈驼,我是刑警寧澤辛燥,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站缝其,受9級特大地震影響挎塌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜内边,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一榴都、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漠其,春花似錦嘴高、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至柴信,卻和暖如春套啤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背随常。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工潜沦, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绪氛。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓唆鸡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親枣察。 傳聞我的和親對象是個殘疾皇子喇闸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355