微信小程式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