国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

網(wǎng)頁程序遷移至微信小程序web-view詳解

AlphaGooo / 3561人閱讀

摘要:網(wǎng)頁引入網(wǎng)頁發(fā)起支付由后臺(tái)返回,主要是需要統(tǒng)一下單平臺(tái)的微信支付頁面支付參數(shù)錯(cuò)誤,請(qǐng)稍后重試支付成功支付失敗支付錯(cuò)誤分享功能小程序直接分享的所在的頁面,如果需要加上頁面參數(shù),那我們就需要處理一下了。

小程序現(xiàn)在越來越流行,但是公司的很多項(xiàng)目都是用網(wǎng)頁寫的,小程序語法不兼容原生網(wǎng)頁,使得舊有項(xiàng)目遷移至小程序代價(jià)很高;
小程序之前開放了webview功能,可以說是網(wǎng)頁應(yīng)用的一大福音了,但是微信的webview有一些坑,這篇文章就是列舉一下我在開發(fā)過程中遇到的一些問題以及我找到的一些解決方案。

遇到的問題

openid登錄問題

webview動(dòng)態(tài)src

支付功能

分享功能

掃描普通二維碼跳轉(zhuǎn)特定頁面

返回按鈕缺失問題

openid登錄問題

微信webview的使用方法很簡(jiǎn)單,只要如下設(shè)置src就可以展示具體的網(wǎng)站了。



微信環(huán)境里的很多網(wǎng)頁都是用頁面要實(shí)現(xiàn)網(wǎng)站的登錄功能,只要把登錄的信息,比如openid或者其他信息拼接到src里就好了。
這里有個(gè)問題,公眾號(hào)的賬號(hào)體系一般是以openid來判斷唯一性的,小程序是可以獲取openid的,但是小程序的openid和原公眾號(hào)之類的openid是不一樣的,需要將原先的openid賬號(hào)體系升級(jí)為unionid賬號(hào)體系。

以下是微信對(duì)unionid的介紹

獲取用戶基本信息(UnionID機(jī)制)

在關(guān)注者與公眾號(hào)產(chǎn)生消息交互后,公眾號(hào)可獲得關(guān)注者的OpenID(加密后的微信號(hào),每個(gè)用戶對(duì)每個(gè)公眾號(hào)的OpenID是唯一的。對(duì)于不同公眾號(hào),同一用戶的openid不同)。公眾號(hào)可通過本接口來根據(jù)OpenID獲取用戶基本信息,包括昵稱、頭像、性別、所在城市、語言和關(guān)注時(shí)間。
請(qǐng)注意,如果開發(fā)者有在多個(gè)公眾號(hào),或在公眾號(hào)、移動(dòng)應(yīng)用之間統(tǒng)一用戶帳號(hào)的需求,需要前往微信開放平臺(tái)(open.weixin.qq.com)綁定公眾號(hào)后,才可利用UnionID機(jī)制來滿足上述需求。

UnionID機(jī)制說明:

開發(fā)者可通過OpenID來獲取用戶基本信息。特別需要注意的是,如果開發(fā)者擁有多個(gè)移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號(hào),可通過獲取用戶基本信息中的unionid來區(qū)分用戶的唯一性,因?yàn)橹灰峭粋€(gè)微信開放平臺(tái)帳號(hào)下的移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號(hào),用戶的unionid是唯一的。換句話說,同一用戶,對(duì)同一個(gè)微信開放平臺(tái)下的不同應(yīng)用,unionid是相同的。

做完以上步驟,就可以調(diào)用小程序api wx.getUserInfo() 來獲取用戶信息了,此步驟需要進(jìn)行后臺(tái)信息解密過程,在此就不再贅述,結(jié)合小程序api文檔操作就好。

獲取到unioid之后,將unionid信息拼接到src就可以進(jìn)行網(wǎng)頁登錄操作了(前提是網(wǎng)頁可以用跳轉(zhuǎn)鏈接的方式登錄,類似公眾號(hào)頁面獲取openid的形式)。

webview動(dòng)態(tài)src

微信的webview有個(gè)坑的地方,不會(huì)動(dòng)態(tài)的監(jiān)聽src的變化,這就造成了一個(gè)問題,要通過改變src實(shí)現(xiàn)頁面跳轉(zhuǎn)就不可以了。
我嘗試了一些方法之后,找到了一個(gè)解決方案:

微信webview在頁面load的時(shí)候會(huì)加載一次webview,我們就利用這個(gè)特性來實(shí)現(xiàn)動(dòng)態(tài)src問題。

首先把要跳轉(zhuǎn)的鏈接信息設(shè)置成全局變量,要改變src的時(shí)候,先把要src以’?‘拆分為鏈接和參數(shù)兩部分,存入全局函數(shù),再調(diào)用onLoad就可以實(shí)現(xiàn)webview刷新了。

頁面跳轉(zhuǎn)時(shí),我們也需要src的動(dòng)態(tài)刷新,所以要把鏈接信息存入全局函數(shù);頁面跳轉(zhuǎn)時(shí),onShow函數(shù)會(huì)被調(diào)用,這時(shí)候再調(diào)用一次onLoad就可以了。

data: {
    url: "",
    loaded: false
}
// 小程序js里的onLoad函數(shù)可以寫成這樣
onLoad: function () {
    this.setData({
      url: getApp().globalData.urlToken + "?" +  getApp().globalData.urlData
    })
},
changUrl: function () {
    getApp().globalData.urlToken = "https://www.example.com"
    getApp().globalData.urlToken = "a=1&b=2"
    // 直接調(diào)用onLoad,就會(huì)實(shí)現(xiàn)src的刷新
    this.onLoad()
},
onShow: function () {
    if (!this.data.loaded) {
      // 第一次不運(yùn)行
      this.setData({
        loaded: true
      })
      return
    }
    // 直接調(diào)用onLoad,就會(huì)實(shí)現(xiàn)src的刷新
    this.onLoad()
  }

// wxml可以寫成這樣
支付功能

webview里面可以通過jssdk來實(shí)現(xiàn)一些小程序功能,但不能直接調(diào)用小程序的支付功能,這時(shí)候我們就需要轉(zhuǎn)變一下策略了:

在網(wǎng)頁里引入微信jssdk

在網(wǎng)頁需要發(fā)起支付的地方,調(diào)用跳轉(zhuǎn)頁面的接口,控制小程序跳轉(zhuǎn)到小程序的支付頁面(這個(gè)要在小程序里多帶帶寫的),跳轉(zhuǎn)的時(shí)候,需要把訂單的一些信息都拼接到鏈接里,訂單信息由后臺(tái)返回,需要通過微信支付系統(tǒng)的統(tǒng)一下單接口,具體參看支付文檔。

跳轉(zhuǎn)到小程序支付頁面后,由小程序頁面發(fā)起支付,支付完成后跳轉(zhuǎn)回webview頁面,通過之前設(shè)置的動(dòng)態(tài)src,控制webview跳轉(zhuǎn)到特定的頁面。

// 網(wǎng)頁引入jssdk

// 網(wǎng)頁發(fā)起支付
wx.miniProgram.navigateTo({
    // payData由后臺(tái)返回,主要是需要統(tǒng)一下單平臺(tái)的prepay_id
    url: "../pay/index?data=" + encodeURIComponent(JSON.stringify(payData))
})
// 微信支付頁面
onLoad: function (option) {
    let page = this
    try {
      let data = JSON.parse(option.data)
      if (!data || !data.prepay_id) {
        console.error("支付參數(shù)錯(cuò)誤,請(qǐng)稍后重試", data)
      }
      wx.requestPayment({
        timeStamp: "" + data.timestamp,
        nonceStr: data.nonceStr,
        package: "prepay_id=" + data.prepay_id,
        paySign: data.paySign,
        signType: data.signType,
        success: function (res) {
          getApp().globalData.urlToken = `paySuccess.html`
          // 支付成功
          getApp().globalData.urlData = "data=paySuccessData"
          wx.navigateTo({
            url: "/page/home/index",
          })
        },
        fail: function (res) {
          getApp().globalData.urlToken = `payError.html`
          // 支付失敗
          getApp().globalData.urlData = "data=payErrorData"
          wx.navigateTo({
            url: "/page/home/index",
          })
        },
        complete: function (res) {
        }
      })
    } catch (e) {
      console.error("支付錯(cuò)誤", e)
    }
  }
分享功能

小程序直接分享的webview所在的頁面,如果需要加上頁面參數(shù),那我們就需要處理一下了。

webview內(nèi)是不能直接發(fā)起分享的,需要先用wx.miniProgram.postMessage接口,把需要分享的信息,推送給小程序;推送給小程序的信息不是實(shí)時(shí)處理的,而是用戶點(diǎn)擊了分享按鈕之后,小程序才回去讀取的,這就要求每個(gè)需要分享的頁面再進(jìn)入的時(shí)候就發(fā)起wx.miniProgram.postMessage推送分享信息給小程序。

小程序頁面通過bindmessage綁定的函數(shù)讀取post信息,分享的信息會(huì)是一個(gè)列表,我們?nèi)∽詈笠粋€(gè)分享就好,把分享信息處理好,存到data里面以便下一步onShareAppMessage調(diào)用。

用戶點(diǎn)擊分享時(shí),會(huì)觸發(fā)onShareAppMessage函數(shù),在里面設(shè)置好對(duì)應(yīng)的分享信息就好了。

onload函數(shù)有一個(gè)option參數(shù)的,可以讀取頁面加載時(shí)url里帶的參數(shù),這時(shí)要對(duì)原先的onload函數(shù)進(jìn)行改造,實(shí)現(xiàn)從option里讀取鏈接信息。

// 網(wǎng)頁wx.miniProgram.postMessage
wx.miniProgram.postMessage({
  data: {
    link: shareInfo.link,
    title: shareInfo.title,
    imgUrl: shareInfo.imgUrl,
    desc: shareInfo.desc
  }
})
// 小程序index wxml設(shè)置

// 小程序index js
bindGetMsg: function (e) {
    if (!e.detail) {
      return
    }
    let list = e.detail.data
    if (!list || list.length === 0) {
      return
    }
    let info = list[list.length - 1]
    if (!info.link) {
      console.error("分享信息錯(cuò)誤", list)
      return
    }
    let tokens = info.link.split("?")
    this.setData({
      shareInfo: {
        title: info.title,
        imageUrl: info.imgUrl,
        path: `/page/index/index?urlData=${encodeURIComponent(tokens[1])}&urlToken=${tokens[0]}`
      }
    })
},
onShareAppMessage: function (res) {
    if (res.from === "button") {
      // 來自頁面內(nèi)轉(zhuǎn)發(fā)按鈕
      console.log(res.target)
    }
    let that = this
    return {
      title: that.data.shareInfo.title,
      path: that.data.shareInfo.path,
      imageUrl: that.data.shareInfo.imageUrl,
      success: function (res) {
        // 轉(zhuǎn)發(fā)成功
      },
      fail: function (res) {
        // 轉(zhuǎn)發(fā)失敗
      }
    }
},
onLoad: function (option) {
    if (option.urlToken) {
      getApp().globalData.urlToken = option.urlToken
    }
    if (option.urlData) {
      getApp().globalData.urlData = option.urlData
    }
    this.setData({
      url: getApp().globalData.urlToken + "?" +  getApp().globalData.urlData
    })
},
掃描普通二維碼跳轉(zhuǎn)特定頁面

除了分享功能之外,小程序還可以通過配置,實(shí)現(xiàn)掃描普通二維碼跳轉(zhuǎn)特定頁面的功能。

以下是微信對(duì)此功能的介紹

為了方便小程序開發(fā)者更便捷地推廣小程序,兼容線下已有的二維碼,微信公眾平臺(tái)開放掃描普通鏈接二維碼跳轉(zhuǎn)小程序能力。
功能介紹
普通鏈接二維碼,是指開發(fā)者使用工具對(duì)網(wǎng)頁鏈接進(jìn)行編碼后生成的二維碼。
線下商戶可不需更換線下二維碼,在小程序后臺(tái)完成配置后,即可在用戶掃描普通鏈接二維碼時(shí)打開小程序,使用小程序的功能。
對(duì)于普通鏈接二維碼,目前支持使用微信“掃一掃”或微信內(nèi)長(zhǎng)按識(shí)別二維碼跳轉(zhuǎn)小程序.

二維碼規(guī)則
根據(jù)二維碼跳轉(zhuǎn)規(guī)則,開發(fā)者需要填寫需要跳轉(zhuǎn)小程序的二維碼規(guī)則。要求如下:

二維碼規(guī)則的域名須通過ICP備案的驗(yàn)證。

支持http、https、ftp開頭的鏈接(如:http://wx.qq.com、https://wx.qq.com/mp/、https://wx.qq.com/mp?id=123)。

一個(gè)小程序帳號(hào)可配置不多于10個(gè)二維碼前綴規(guī)則。

前綴占用規(guī)則

開發(fā)者可選擇是否占用符合二維碼匹配規(guī)則的所有子規(guī)則。如選擇占用,則其他帳號(hào)不可申請(qǐng)使用滿足該前綴匹配規(guī)則的其他子規(guī)則。

如:若開發(fā)者A配置二維碼規(guī)則:https://wx.qq.com/mp?id=123,并選擇“占用所有子規(guī)則“,其他開發(fā)者將不可以配置滿足前綴匹配的子規(guī)則如https://wx.qq.com/mp?id=1234。

我推薦的方式
webview實(shí)現(xiàn)方式

設(shè)置跳轉(zhuǎn)功能小程序后臺(tái)就可以設(shè)置,鏈接是分為四部分,路https://www.example.com/wxmin...。

https://www.example.com 域名
/wxmini/ 小程序前置規(guī)則,需要在服務(wù)器上建一個(gè)文件夾,并且把驗(yàn)證文件放在文件夾線
home.html 需要跳轉(zhuǎn)的網(wǎng)頁頁面
a=1 跳轉(zhuǎn)頁面的參數(shù)

對(duì)onload函數(shù)再進(jìn)行處理,實(shí)現(xiàn)普通二維碼跳轉(zhuǎn)。

// 對(duì)index onLoad在進(jìn)行處理
onLoad: function (option) {
    this.resetOption(option)
    if (option.urlToken) {
      getApp().globalData.urlToken = option.urlToken
    }
    if (option.urlData) {
      getApp().globalData.urlData = option.urlData
    }
    this.setData({
      url: getApp().globalData.urlToken + "?" +  getApp().globalData.urlData
    })
},
resetOption: function (option) {
    if (!option) {
      return
    }
    if (option.q) {
      option.q = decodeURIComponent(option.q)
      if (option.q.indexOf("https://www.example.com/wxmini/") == -1) {
        return
      }
      let tmp = option.q.replace("/wxmini", "")
      let tmps = tmp.split("?")
      option.urlToken = tmps[0]
      option.urlData = tmps[1]
    } else {
      option.urlData = decodeURIComponent(option.urlData)
    }
}
返回按鈕缺失問題

如果web頁面是在第一個(gè)頁面的話,這時(shí)候會(huì)有一個(gè)問題,小程序的返回按鈕就沒有了,webview無法使用微信的返回按鈕了,這時(shí)候只要在webview頁面前多加一個(gè)跳轉(zhuǎn)頁面就好了(第一個(gè)頁面也可以設(shè)置成獲取用戶權(quán)限的頁面,不過我感覺這樣體驗(yàn)不好,也不是所有頁面都要用戶獲取了權(quán)限才可以使用)

最終的頁面層級(jí)
"pages": [
    "page/index/index", // 首頁,處理onload里的option內(nèi)容,為了返回按鈕設(shè)置的
    "page/home/index", // webview所在的頁面
    "page/auth/index", // 獲取用戶權(quán)限的頁面
    "page/pay/index", // 支付頁面
    "page/error/index" // 錯(cuò)誤信息頁面
  ],
參考鏈接

webview文檔

小程序unionid介紹

unionid獲取方式

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/52743.html

相關(guān)文章

  • 網(wǎng)頁程序遷移至微信小程序web-view詳解

    摘要:網(wǎng)頁引入網(wǎng)頁發(fā)起支付由后臺(tái)返回,主要是需要統(tǒng)一下單平臺(tái)的微信支付頁面支付參數(shù)錯(cuò)誤,請(qǐng)稍后重試支付成功支付失敗支付錯(cuò)誤分享功能小程序直接分享的所在的頁面,如果需要加上頁面參數(shù),那我們就需要處理一下了。 小程序現(xiàn)在越來越流行,但是公司的很多項(xiàng)目都是用網(wǎng)頁寫的,小程序語法不兼容原生網(wǎng)頁,使得舊有項(xiàng)目遷移至小程序代價(jià)很高; 小程序之前開放了webview功能,可以說是網(wǎng)頁應(yīng)用的一大福音了,但...

    junbaor 評(píng)論0 收藏0
  • 「前端早讀君009」快速小程序開發(fā)之微信小程序內(nèi)嵌 H5

    摘要:前言微信小程序中可以直接運(yùn)行頁面,這一新組件的產(chǎn)生,可能直接導(dǎo)致小程序數(shù)量迎來一波高峰。微信小程序配置系列問題配置域名業(yè)務(wù)域名中配置的就是小程序以及和中引用的域名。 今日勵(lì)志語 要接受自己行動(dòng)所帶來的責(zé)任而非自己成就所帶來的榮耀。 前言 微信小程序中可以直接運(yùn)行 web 頁面,這一新組件 web-view 的產(chǎn)生,可能直接導(dǎo)致小程序數(shù)量迎來一波高峰。本篇博文將從業(yè)務(wù)選型,微信小程序后臺(tái)...

    wh469012917 評(píng)論0 收藏0
  • 總結(jié)開發(fā)過程踩到的坑(五)(小程序篇)

    摘要:最近開始接觸了小程序的開發(fā),由于時(shí)間問題,文檔閱讀的并不完備,也踩了很多坑。的使用微信小程序不支持原生頁面跳轉(zhuǎn),包括和,若要跳轉(zhuǎn)小程序應(yīng)用內(nèi)頁面,需要使用,詳見。參考文獻(xiàn)微信小程序開發(fā)者文檔 最近開始接觸了小程序的開發(fā),由于時(shí)間問題,文檔閱讀的并不完備,也踩了很多坑。不得不說,微信的野心真是越來越大了,但是它超高的流量注定了它有這個(gè)資本。 原文地址:mini programs 目...

    young.li 評(píng)論0 收藏0
  • 總結(jié)開發(fā)過程踩到的坑(五)(小程序篇)

    摘要:最近開始接觸了小程序的開發(fā),由于時(shí)間問題,文檔閱讀的并不完備,也踩了很多坑。的使用微信小程序不支持原生頁面跳轉(zhuǎn),包括和,若要跳轉(zhuǎn)小程序應(yīng)用內(nèi)頁面,需要使用,詳見。參考文獻(xiàn)微信小程序開發(fā)者文檔 最近開始接觸了小程序的開發(fā),由于時(shí)間問題,文檔閱讀的并不完備,也踩了很多坑。不得不說,微信的野心真是越來越大了,但是它超高的流量注定了它有這個(gè)資本。 原文地址:mini programs 目...

    Cympros 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<