1. 程式人生 > >微信小程式web-view公眾號與小程式支付的切換使用

微信小程式web-view公眾號與小程式支付的切換使用

微信小程式web-view公眾號與小程式支付間的切換使用

        最近小程式開放了新功能,支援內嵌網頁。html寫的網頁,官網,網站,執行在瀏覽器上的,有域名的那種,可以內嵌到小程式裡了!

那麼這意味著什麼呢?你還需要開發獨立開發官網小程式嗎?之前的微信公眾號功能大部分也可以直接通過小程式webview實現了。
這幾天剛好公司也有這方面的需求,懷著激動心情的我開始了踩坑之旅。

     開發之前我們需要把需要的環境配置好,這裡就引用官方的介紹了————

1. 開發者登入小程式後臺,選擇設定-開發設定-業務域名,新增配置域名模組。目前小程式內嵌網頁能力暫不開放給個人型別帳號和海外型別帳號。
2.配置的業務域名必須時https

那麼配置好後,馬上可以進入開發啦!
這裡寫圖片描述

  頁面中引入公眾號的首頁,小程式端的程式碼不是很多,主要的是後臺進行結合。

1.在後端新增一個小程式的入口方法,
/**
 * 小程式第一次入口
 * @return
 */
public String wxIndex(){//返回首頁
    sessions=request.getSession().getId();
    return "home";
}

這裡我沒有做任何的處理,這個專案首頁是不用登陸的,直接返回首頁;來到這一步時我們發現之前公眾號後臺儲存在session中的資訊獲取不到,使用後發現小程式每次請求sessionId

都會發生改變,這樣後臺無法使用session儲存資料。

解決方案:

小程式第一次請求後臺返回一個sessionId,之後小程式在引數或header中帶入這個sessionId,後臺使用這個session來處理。注意session銷燬以及過期設定。

wx.login({
  success: function (res) {        wx.getSetting({
      success(setRes) {
        // 判斷是否已授權  
        if (!setRes.authSetting['scope.userInfo']) {
          // 授權訪問  
          wx.authorize({
            scope: 'scope.userInfo',
            success() {
              //獲取使用者資訊  
              wx.getUserInfo({
                lang: "zh_CN",
                success: function (userRes) {
                  // var session_id= wx.getStorageSync('JSESSIONID');
                  //發起網路請求  
                  wx.request({
                    url: 'https://www.ulin5.com/vip/buser-bind-mobile_wxXiaoChengXuLogin.html',
                    data: {
                      code: res.code,
                      encryptedData: userRes.encryptedData,
                      iv: userRes.iv
                    },
                    header: {
                      "Content-Type": "application/x-www-form-urlencoded"
                    },
                    method: 'POST',
                    //服務端的回掉  
                    success: function (result) {
                      console.log(result)
                      // var session_id = wx.getStorageSync('JSESSIONID');//本地取儲存的sessionID  
                      // if (session_id == null || session_id == "") {
                        wx.setStorageSync('JSESSIONID', result.data.sessionId) //如果本地沒有就說明第一次請求 把返回的session id 存入本地  

                      // }
                      console.log(result.data.openId)
                      getApp().openid = result.data.openId
                      // var data = result.data.result;
                      // data.expireTime = nowDate + EXPIRETIME;
                      // wx.setStorageSync("userInfo", data);
                      // userInfo = data;
                    }
                  })
                }
              })
            }
          })
          })
 把小程式所需要的openid和unionid拿到,由於公眾號的openid   和小程式的openid不同,所以這需要用到unionid。
換句話說,同一使用者,對同一個微信開放平臺帳號下的不同應用,UnionID是相同的。
此前的OpenID機制,每個微訊號對應每個公眾號只有唯一的OpenID,所以不同微信公眾號之間是不能共享使用者的,現在有了UnionID就可以了。
   前面說到小程式每次請求的sessionId不同,所以通過sessionId可以獲取到我們儲存的資料資訊。
   注意Servlet2.1之後不支援SessionContext裡面getSession(String id)方法。
   我這裡通過HttpSessionListener監聽器和全域性靜態map自己實現一個SessionContext。
public class MySessionContext {

 private static HashMap mymap = new HashMap();

    public static synchronized void AddSession(HttpSession session) {
        if (session != null) {
            mymap.put(session.getId(), session);
        }
    }

    public static synchronized void DelSession(HttpSession session) {
        if (session != null) {
            mymap.remove(session.getId());
        }
    }

    public static synchronized HttpSession getSession(String session_id) {
        if (session_id == null)
        return null;
        return (HttpSession) mymap.get(session_id);
    }
    }
        public class SessionListener implements HttpSessionListener {
/*public static Map userMap = new HashMap();  */
/*private   MySessionContext myc=MySessionContext.getInstance();  */

@Override
public void sessionCreated(HttpSessionEvent arg0) {
    /*myc.AddSession(arg0.getSession()); */
    MySessionContext.AddSession(arg0.getSession());
}

@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
    HttpSession session = arg0.getSession();  
    /*myc.DelSession(session);*/
     MySessionContext.DelSession(session);
}

}

web.xml新增一個監聽器:

<listener>  
<listenerclass>com.common.util.SessionListener</istener-class>  
</listener>  

根據sessionId獲取Session物件:

String sessionId = request.getParameter("sessionId");

HttpSession session = MySessionContext.getSession(sessionId);

寫到這裡已經算是完成一半了,只要在後臺加一個處理小程式進來的方法,把所需要的使用者資訊儲存到資料庫中。
我們不需要改變以前寫好處理公眾號的任何程式碼(根據專案進行整合),
public String wxLogin(){//java後端
String Code = request.getParameter("code");// 登陸狀態碼
    String typeDate = request.getParameter("encryptedData");// 使用者加密資訊,用於解密獲取unionid
    String iv = request.getParameter("iv");// 解密金鑰
    String OPENID_URL = "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret"
            + "=SECRET&js_code=JSCODE&grant_type=authorization_code";// 獲取openid的地址
    UserInfo userInfo = null;
    String url = OPENID_URL.replace("APPID", Pkcs7Encoder.APPID)
            .replace("SECRET", Pkcs7Encoder.APPSECRET)
            .replace("JSCODE", Code);
    JSONObject jsonObject = null;
    jsonObject = Pkcs7Encoder.doGetStr(url);// 調取Get提交方法
    String OpenId = jsonObject.getString("openid"); // 獲取openid
    /*
     * ResourceBundle resource = ResourceBundle.getBundle("weixin");
     * //讀取屬性檔案
     */String requestUrl = "https://api.weixin.qq.com/sns/jscode2session"; // 請求地址
    /* String wxUserInfo=Pkcs7Encoder.sendPost(requestUrl, requestUrlParam); */
    // 獲取會話金鑰(session_key)
    String session_key = jsonObject.getString("session_key");   
    ....     //通過邏輯程式碼儲存我們需要的資訊
}
  接下來到最重要的環節了,到了我們最期待的支付環節了。由於web-view目前還不支援支付介面。
  我們需要判斷是否執行在小程式環境中進行支付的互換,從而實現支付功能。

<script type="text/javascript"src="https://res.wx.qq.com/open/js/jweixin-1.3.0.js"></script>

在網頁內可通過window.__wxjs_environment變數判斷是否在小程式環境。


// web-view下的頁面內
wx.ready(function() {
console.log(window.__wxjs_environment === 'miniprogram') // true
})

例如:

  var isWxMini = window.__wxjs_environment ===       'miniprogram';
    if (isWxMini) {//判斷是否在微信小程式環境中呼叫支付介面
    $("#wxloading").hide();
    var jumpUrl = encodeURIComponent(window.location)
    //把要用到的引數傳到小程式中進行支付
    var path = '/pages/pay/pay?jhNum='+jhNum+'&cproType='+cproType+'&zcProId='+zcProId+'&url='+url+'&cproId='+cproId+'&esOrderc='+esOrderc;
    wx.miniProgram.navigateTo({
        url: path
    })

}else{//公眾號支付
window.location.href="/vip/buy-group_saveJoinPt.html?cproId="+cproId+"&jhNum="+jhNum+"&cproType="+cproType+"&zcProId="+zcProId+"&esOrderc="+esOrderc;
}

小程式pay資料夾下新建pay.js和pay.wxml

 pay.js
          Page({
  onLoad: function (options) {
  console.log(options)
    // 獲取網頁傳過來的值
 // TODO 用es6解構來獲取值TODO
var jhNum = options.jhNum
var cproType = options.cproType
var zcProId = options.zcProId
var cproId = options.cproId
var esOrderc = options.esOrderc
// var jumpUrl = decodeURIComponent(options.jumpUrl)
var tourl=options.url
// console.log(tourl)
var openid = getApp().openid
console.log(openid)
var session_id = wx.getStorageSync('JSESSIONID')//本地取儲存的sessionID
// console.log('----------sessionid' + session_id+'-----------------')
wx.request({
  url: tourl,
  data: {
    openid: openid,
    jhNum: jhNum,
    cproType: cproType,
    zcProId: zcProId,
    cproId: cproId,
    esOrderc: esOrderc
  },
  header: {
    "Content-Type": "application/x-www-form-urlencoded",
    'Cookie': 'JSESSIONID=' + session_id
  },
  method: 'POST',
  success: function (res){
    console.log(res)
    wx.requestPayment({
      'timeStamp': res.data.timeStamp,
      'nonceStr': res.data.nonceStr,
      'package': res.data.package,
      'signType': 'MD5',
      'paySign': res.data.sign,
      'success': function (res) {
        console.log('支付成功')
         wx.navigateBack() //返回會上個頁面
      },
      'fail': function (res) {
        console.log('支付失敗')
          wx.navigateBack() //返回會上個頁面
      }
    })
  }
})
}
})
到這基本上已經完成,個人感覺這種實現方式在使用者體驗度上並不是很友好,但是基本的功能都可以實現。
相信官方也會對webview更進一步的優化。能在webview中直接呼叫支付的介面。
如果大家有更好的實現思路,千萬別忘了告訴我哦。
由於作者還是個工作不到一年的小菜。在程式碼編寫上還有很多的不足,歡迎大家指正。
這也是我的第一篇部落格,嗯嗯嗯還是有點小激動。^_^

相關推薦

程式web-view公眾程式支付切換使用

微信小程式web-view公眾號與小程式支付間的切換使用 最近小程式開放了新功能,支援內嵌網頁。html寫的網頁,官網,網站,執行在瀏覽器上的,有域名的那種,可以內嵌到小程式裡了! 那麼這意味著什麼呢?你還需要開發獨立開發官網小程式嗎?之前

WiFi強制關註公眾怎樣實現?如何要求關註公眾上網?

網關 微信認證微信WiFi的默認流程,已經從最初的“關註公眾號”變成了目前的“打開公眾號”。應該說,“打開公眾號但是不強制關註“其實是一個更加人性化的做法;因為任何誘導/強制關註,都會影響最終用戶的體驗和公正性原則;長遠來看會影響公眾號的發展。微信WiFi如下圖:在《微信公眾平臺運營規範》中,也明文禁止誘導關

asp模板消息用於公眾推送消息給用戶asp源碼

open bsp send key 找我 mes image img col <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%><% session.codepage=936Response.Charset = "GB2312"

Chrome獲取授權,調試公眾頁面

sta esp safari tab 通過 測試 ron 準備就緒 stat 1.目的 你可能遇到過這種情況,在微信中打開公眾號是這樣的。 復制鏈接,在chrome中

網頁授權和部分公眾介面接入(詳細流程介紹)

一、微信網頁授權登入 官方文件:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842  1、前提描述:       a、準備條件:測試公眾號的申請,入口:https://mp.weixin

php掃碼登入和公眾登入

/** * 微信授權登入 * @param Request * @return [json] */ public function wxSignin(Request $request) { $code = $request->input('

程式web-view元件

小程式web-view元件   不久前微信小程式釋出了web-view元件,這個訊息在各個圈裡引起不小的漣漪。近期正好在做小程式的專案,便研究了一下這個讓大家充滿期待的元件。   1,web-view這個元件是什麼鬼? 官網的介紹:web-view 元件是一個

程式web-view例項

微信小程式web-view例項 index.js //index.js //獲取應用例項 const app = getApp() Page({ /** * 頁面的初始資料 */ data: { },

程式--Web-View重新整理Html頁面(改)

最近進行小程式開發,因為主體上是複用了公眾號的內容,所有采用了Web-View載入H5的方式進行,其中有一個需求是連線藍芽裝置收集資料並上傳到後臺,點選H5中的按鈕,進入到藍芽採集頁面,然後在採集完資料後,跳回H5頁面並重新整理。 在H5中呼叫wx.miniProgram.navigateT

RhaPHP v1.5.8 釋出,公眾程式開發 PHP 框架

   RhaPHP微信平臺管理系統,支援多公眾號管理,小程式開發,APP介面開發,平臺獨立且快速簡潔易用。靈活的擴充套件應用機制,具有容易上手,幾乎融合微信介面,簡單的呼叫對二次開發與開發擴充套件應用模組大大提高開發效率,降低企業商家運營成本。擴充套件應用模組化,機制靈活,程

統一公眾程式、APP的使用者資訊

 上次接手一個專案需要整合公眾號、小程式以及APP的使用者,查閱了微信文件以及一些作者的文章,中間踩了不少坑,在此記錄一下解決的流程。 要點  實現統一資訊的有以下幾點:  1. 在微信開放平臺繫結需要統一資訊的應用;  2. 公眾號採用以snsapi_userinfo為scope發起的網頁授權,小程式使用w

如何在 [[公眾]]新增程式卡片

參考官方Demo 進入公眾號,選擇「關聯小程式」後,微信公眾號運營者用手機掃碼進行認證,並輸入小程式的 AppID 即可。騰訊地圖+小程式appID:wx7643d5f831302ab0 在這裡,可以選擇是否要把小程式放到公眾號資料頁,以及是否要給公

程式web-view用法

昨天晚上小程式有釋出了一個新版本啦,不知道各位小夥伴有沒有看,由於業務需要,我今早一來就進行了實驗進行試用,就是簡單的呼叫起來。但是在呼叫起來的時候因為文件寫的不夠細,所以還是遇到了幾個問題。寫一篇文章,希望對剛剛開始想要調起web-view的小夥伴有幫助。 首先是域名的問

程式可以開啟公眾文章

微信今日晚間釋出訊息,宣佈微信小程式基礎能力、開發者工具全面升級,新增多項能力。基礎功能方面:1、小程式新增開啟公眾號文章功能。可以開啟已關聯公眾號的文章,不過文章內暫不支援讚賞、廣告、關注公眾號等。2、為提升服務質量,小程式新增“意見反饋”元件。使用者可以在小程式內或小程式

TP3.2校驗公眾程式 伺服器地址

1、在TP3.2裡面,寫一個控制器,用來校驗微信公眾號、小程式的伺服器地址 1.<?php  2.namespace Home\Controller;  3.use Think\Control

程式 web-view 在ios顯示空白頁面

  最近遇到的一個問題,小程式使用web-view連結到H5頁面,業務域名已經配置過了,在安卓系統上也是沒有問題,只有ios不能正常顯示,出現空白頁面。在網上幾番查詢後,沒有效果。   首先下載了safari的windows版(原晾我沒有蘋果本),開啟H5頁面發現js報錯,

程式web-view使用

一.基本使用 二.API的使用 1.獲取是否是小程式環境 官方給了2種方式 但是,這2種在非小程式環境下是不會執行的,這個是比較容易被忽略的, 關於小程式環境特有的邏輯,要在下面

程式--Web-View重新整理Html頁面

最近進行小程式開發,因為主體上是複用了公眾號的內容,所有采用了Web-View載入H5的方式進行,其中有一個需求是連線藍芽裝置收集資料並上傳到後臺,點選H5中的按鈕,進入到藍芽採集頁面,然後在採集完資料後,跳回H5頁面並重新整理。 在H5中呼叫wx.miniProgram.n

程式web-view 元件

1 web-view 是一個可以用來承載網頁的容器,會自動鋪滿整個小程式頁面2 需要在小程式後臺設定載入的頁面域名3 無法記載不在業務域名裡的網站資訊,就算是在業務域名裡使用iframe也不可以4 小程式和服務號之間是單向通訊,可以跳轉到同一服務號的其他小程式5 官方的提示

程式web-view裡的https被識別為http

微信近年出了個“小程式”的功能,類似於巢狀在wx裡的app web-view支援嵌入網頁到小程式裡頭,前提是該網頁是在自己開通了ssl的伺服器裡。該站需要開通ssl,還要上傳一個驗證檔案到該網站的根目錄,才能實現小程式“業務域名”的新增。 剛剛需要將一個wq