openId導致的微信中“下單賬號和支付賬號不一致”原因及解決辦法
圖1
出現的問題如圖1所示,出現問題的場景是使用者A分享某個公益專案的連結到微信朋友圈,使用者B開啟這個連結準備捐款時就出現上面的問題。
在網上查詢相關的問題,大多語焉不詳,給人的感覺好像是微信自身的問題。
如果只是單獨分析這個錯誤提示,可以推斷應該是使用者A的相關資訊通過分享的方式被帶出去了,在B開啟時使用的是A的相關資訊。首先可以排除快取的問題,因為快取是存在本地的,不會在分享時被攜帶出去。那有重大嫌疑的就是openId了,因為使用者支付之前要授權,授權後微信會把當前使用者的openId拼接在url後,然後重新載入當前頁面,既然如此,會不會是openId被分享出去了呢?
分享連結的url地址如下所示,發現openId確實在url地址中。
分析程式:程式碼片段1 上面的程式就是圖1頁面的微信授權程式碼,從程式中分析可以知道,使用者A第一次開啟圖1中的頁面,按照初始化流程,先判斷window.user.opneId,如果未定義,就從url取openId,如果沒有,就呼叫微信授權,微信授權完後,把openId以引數的形式拼接在url地址後面,然後重新載入頁面一次,把openId存入cookie,在程式碼片段1中是“addCookie("openId", getQueryString("openId"), 168);”。如果這個帶有使用者A的openId頁面被分享出去,使用者B開啟這個頁面當然就會提示“下單賬號與支付賬號不一致”了。/** * 初始化微信使用者資料 */ function initWeiXinUser () { if(!window.user.openId) { if(!getQueryString("openId")) { if (window.location.href.indexOf("from") > -1){ // 如果當前頁面是分享頁面,將分享標誌儲存起來,微信授權只會保留一個引數 sessionStorage.setItem('sharedPage', 1); } wxOAuth(); } else { $.ajax({ type : "GET", url : window._l.cfg.apiPrefix + "loveUser/getLoveUserByOpenId", dataType : "jsonp", jsonpCallback : "callBack", jsonp : "callBackParam", data : { openId : getQueryString("openId") }, success : function (result) { if(result.code == 0) { // 新增cookie,7天過期 addCookie("openId", getQueryString("openId"), 168); //window.location.reload(); if (sessionStorage.getItem('sharedPage')) { window.location.href = window.location.href + "&from="; } else { window.location.reload(); } } } }); } } return; }
/**
* 初始化APP右上角的分享按鈕資料
*/
function initNativeShareBtn(project) {
var shareInfo = {
title : "我支援【" + project.projectTitle + "】微兔公益籌款,捐款或轉發都是獻愛心!",
desc : project.description,
imgUrl : window._l.cfg.imgPrefix + project.topImg,
url : window.location.href
};
initAppShareBtn(shareInfo);
}
程式碼片段2
從上面程式碼可以知道,問題的根源就是“url: window.location.href”。
要解決這個問題,很簡單,只要window.location.href中有openId,就應該把這個引數濾除,修改後程式碼如下:
/**
* 過濾掉分享出去地址中不需要帶的引數
* @param s
* @returns {XML|string|void}
*/
function shareUrlParamsFilter(s) {
// 過濾掉pay,openId引數
return s.replace(/&pay=\w+/, "").replace(/[(\?)|(&)]openId=.*/, "");
}
/**
* 初始化APP右上角分享按鈕
* @param shareInfo
*/
function initAppShareBtn(shareInfo) {
var shareInfoTmp = shareInfo;
var urlTmp = shareUrlParamsFilter(shareInfo.url); // 分享前過濾掉當前使用者的openId,防止微信中出現“下單賬號和支付賬號不一致的問題”。
shareInfoTmp.url = urlTmp;
if(isV2gogoApp()) {
var v2gogoapp = getV2gogoAppFromSession();
if(v2gogoapp.os == "Android") {
AndroidJSListener.onShareInfo(JSON.stringify(shareInfoTmp));
} else if(v2gogoapp.os == "iOS") {
connectWebViewJavascriptBridge(function(bridge) {
bridge.init(function(message, responseCallback) {});
bridge.callHandler("onShareInfo", JSON.stringify(shareInfoTmp), function(response) {});
});
}
} else if (isWeiXin()) {
wxConfig(shareInfoTmp);
}
}
這樣就解決這個問題了。需要注意的是ECMAScript中所有函式的引數都是按值傳遞的,在函式initAppShareBtn()中“shareInfo.url”是以形參的形式傳入函式“shareUrlParamFilter()”的。如果函式“shareUrlParamFilter()”沒有返回值,物件shareInfo的url屬性在函式“shareUrlParamFilter()”不會被改變,因為ECMAScript中所有函式的引數都是按值傳遞的,這是和C語言不同的地方。
相關推薦
openId導致的微信中“下單賬號和支付賬號不一致”原因及解決辦法
圖1 出現的問題如圖1所示,出現問題的場景是使用者A分享某個公益專案的連結到微信朋友圈,使用者B開啟這個連結準備捐款時就出現上面的問題。 在網上查詢相關的問題,大多語焉不
用cmd執行記事本寫的java檔案,以及jdk版本和執行版本不一致原因及其解決辦法
1.首先新建一個記事本,檔名改為Welcome.java拓展名也要改!(屬性裡面改為顯示拓展名,這樣才可以通過重新命名的方式改檔案個格式) public class Welcome{ public static void main(String[] args){ System.out.pr
推廣域名被微信中被攔截、封殺、遮蔽的原因以及解決方案
科普: 域名被微信封殺,顯示的是連結無法訪問; 域名被微信攔截,是跟淘寶一樣-如需瀏覽,請長按網址複製後使用瀏覽器訪問。域名被微信遮蔽,顧名思義,遮蔽,肯定是看不到!!域名被信封,確實很多因素有關,簡單列舉下: 1、微信規定域名要備案,並且要加白名單,新買的域名沒做站就被封,應該是搶的剛被人放棄的域
.NET Core 3.0 System.Text.Json 和 Newtonsoft.Json 行為不一致問題及解決辦法
行為不一致 .NET Core 3.0 新出了個內建的 JSON 庫, 全名叫做尼古拉斯 System.Text.Json - 效能更高佔用記憶體更少這都不是事... 對我來說, 很多或大或小的專案能少個第三方依賴項, 還能規避多個依賴項的依賴 Newtonsoft.Json 版本不一致的問題, 是件極美的
微信中通過頁面(H5)直接打開本地app的解決方案
ids 支持 完全 系統默認 domain rdquo bili 通過 解決 簡述 微信中通過頁面直接打開app分為安卓版和IOS版,兩個的實現方式是完全不同的。 安卓版實現:使用騰訊的應用寶,只要配置了“微下載”之後,打開鏈接騰訊會幫你判斷本地
微信內建瀏覽器和支付寶內建瀏覽器 進行防止返回,返回跳轉到指定頁面
//防止返回歷史記錄 pushHistory(); function pushHistory() { var state = { title: "title", url: "#" }; window.history.pushState(sta
Android呼叫微信掃一掃和支付寶掃一掃
微信在自己的應用中開啟微信掃一掃程式碼:private void toWeChatScan() { try { //利用Intent開啟微信 Uri uri =
ECSHOP中transport.js和jquery的沖突的簡單解決辦法
order adding fun ring func 資源 代碼 spa pac ECSHOP中transport.js和jquery的沖突的簡單解決辦法 一流資源網近日在ECSHOP網站加入了幾個JS特效代碼,在谷歌、火狐下正常,在各版本IE下都不常,左思不得其解。
關於微信小程序更新內容後手機上不能及時顯示的辦法
alt show tro 編譯 span display title 微信 手機 這幾天一直在做微信小程序的二次開發,每天都要發布程序,但是發布之後微信上查看小程序和以前的一模一樣,絲毫沒有改變,但是我再本地上卻改變了,而且沒有開的不校驗合法域名那個。這是為啥呢????
全網最詳細的再次或多次格式化導致namenode的ClusterID和datanode的ClusterID之間不一致的問題解決辦法(圖文詳解)
rwx log bsp 挖掘 fail tro listener 大數 www. 不多說,直接上幹貨! java.io.IOException: Incompatible clusterIDs in /opt/modules/ha
NER 中word數量和tag數量不一致解決方案以及tf.string_split用法
句子中有中文空格 而tf.string_split(source, delimiter=’ ‘)預設是英文空格 導致NER 中word數量和tag數量不一致。 tf.string_split(source, delimiter=' ') source是一維陣列,用於將一組字串
解決BootStrap輪播圖片中圖片大小和父div不一致問題
問題出現 其實這個問題相當簡單,自己鼓搗好久,才發現還是自己基本功不紮實,當圖片的大小出現在原生的bootstrap類屬性限定中,圖片會按照自己的大小進行佈局,這樣就會出現圖片小於父div的情況,如下圖所示: 問題解決 找出圖片所屬類,更改類的屬性為blo
微信小程式tabBar 底部選單欄不顯示的問題解決
問題闡述: 在寫微信小程式時需要用到tabBar這個功能,但是在app.json檔案中寫好pages和tabBar儲存重新整理編譯後,預覽頁面中沒有顯示底部tab "pages": [ "pages/index/index", "pages/todo/todo",
判斷是微信內建瀏覽器還是支付寶內建瀏覽及微信/支付寶內開啟的頁面退回到微信/支付寶
首先我們需要,判斷當前使用者是從微信或者支付進入的頁面; var isAliOrWx = function() { var typeBower = ''; var browser = { versions: function() {
環信libHyphenateSDK.a和支付寶libcrypto.a衝突問題解決辦法
專案中需要繼承支付寶和環信,編譯的時候沒有錯誤,但是在執行的時候報了duplicate symbol錯誤,從錯誤提示中發現新版的環信sdk中的靜態庫libHyphenateSDK.a與支付寶中的靜態庫libcrypto.a衝突了,這兩個靜態庫中存在相同的物件檔案(.
關於微信小程式提示Error ECONNECT 或者Socket HandUp的原因及解決辦法
今日小哥趁著暑假,在外面實習租了個房,用了房裡的網線打算對著電腦繼續大戰的時候,發現提示入標題所示錯誤,在網上百度和去微信社群找都沒找到原因,最後發現原因是計算機網路系統連結的錯誤,也就是出租屋裡網線的鍋。解決辦法,在發現問題後小哥只能找解決辦法,後來買了一臺路由器試試看能不
關於IE和Firefox兼容性問題及解決辦法
解決辦法 select 警告 性問題 strong 多個 obj style 高度 1、//window.eventIE:有window.event對象FF:沒有window.event對象。可以通過給函數的參數傳遞event對象。如onmousemove=doMouseM
jquery ajax success 函數 異步調用方法中不能給全局變量賦值的原因及解決辦法
tex span var getc res syn ucc 解決辦法 asp 在調用一個jquery的ajax方法時我們有時會需要該方法返回一個值或者給某個全局變量賦值,可是我們發現程序執行完後並沒有獲取到我們想要的值,這時很有可能是因為你用的是ajax的異步調用async
JS中字串中帶有括號,正則不能識別的解決辦法
需求:將字串中帶有下列關鍵詞的欄位全部高亮顯示 var str = "阿里巴巴(中國)網路技術有限公司深圳辦事處";//字串 var keyword = "阿里巴巴(中國)網路技術有限公司";//關鍵詞 var reg =keyword .replace(/\(/g,"\\(").rep
vue在html中出現{{}}原因及解決辦法
在剛開始接觸vue的時候,我們都是直接用<script>引入vue.js使用。沒有藉助vue-cli腳手架來構建專案。 對於一個初學者來說,跟著文件慢慢搬磚,使用vue進行資料繫結。 記得在最開始使用vue寫公司專案的時候,在頁面初始化化是,THML會閃現出{{}},當時測試問我有沒有解決辦法