1. 程式人生 > >openId導致的微信中“下單賬號和支付賬號不一致”原因及解決辦法

openId導致的微信中“下單賬號和支付賬號不一致”原因及解決辦法

圖1

       出現的問題如圖1所示,出現問題的場景是使用者A分享某個公益專案的連結到微信朋友圈,使用者B開啟這個連結準備捐款時就出現上面的問題。

       在網上查詢相關的問題,大多語焉不詳,給人的感覺好像是微信自身的問題。

       如果只是單獨分析這個錯誤提示,可以推斷應該是使用者A的相關資訊通過分享的方式被帶出去了,在B開啟時使用的是A的相關資訊。首先可以排除快取的問題,因為快取是存在本地的,不會在分享時被攜帶出去。那有重大嫌疑的就是openId了,因為使用者支付之前要授權,授權後微信會把當前使用者的openId拼接在url後,然後重新載入當前頁面,既然如此,會不會是openId被分享出去了呢?

       分享連結的url地址如下所示,發現openId確實在url地址中。

       分析程式:
/**
 * 初始化微信使用者資料
 */
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;
}
程式碼片段1        上面的程式就是圖1頁面的微信授權程式碼,從程式中分析可以知道,使用者A第一次開啟圖1中的頁面,按照初始化流程,先判斷window.user.opneId,如果未定義,就從url取openId,如果沒有,就呼叫微信授權,微信授權完後,把openId以引數的形式拼接在url地址後面,然後重新載入頁面一次,把openId存入cookie,在程式碼片段1中是“addCookie("openId"getQueryString("openId"), 168);”。如果這個帶有使用者A的openId頁面被分享出去,使用者B開啟這個頁面當然就會提示“下單賬號與支付賬號不一致”了。
問題已經定位,下面繼續分析帶來這個問題的原因。    在頁面js程式碼中,初始化分享按鈕的程式碼如下:
/**
 * 初始化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 =

ECSHOPtransport.jsjquery的沖突的簡單解決辦法

order adding fun ring func 資源 代碼 spa pac ECSHOP中transport.js和jquery的沖突的簡單解決辦法 一流資源網近日在ECSHOP網站加入了幾個JS特效代碼,在谷歌、火狐下正常,在各版本IE下都不常,左思不得其解。

關於小程序更新內容後手機上能及時顯示的辦法

alt show tro 編譯 span display title 微信 手機   這幾天一直在做微信小程序的二次開發,每天都要發布程序,但是發布之後微信上查看小程序和以前的一模一樣,絲毫沒有改變,但是我再本地上卻改變了,而且沒有開的不校驗合法域名那個。這是為啥呢????

全網最詳細的再次或多次格式化導致namenode的ClusterIDdatanode的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的原因解決辦法

今日小哥趁著暑假,在外面實習租了個房,用了房裡的網線打算對著電腦繼續大戰的時候,發現提示入標題所示錯誤,在網上百度和去微信社群找都沒找到原因,最後發現原因是計算機網路系統連結的錯誤,也就是出租屋裡網線的鍋。解決辦法,在發現問題後小哥只能找解決辦法,後來買了一臺路由器試試看能不

關於IEFirefox兼容性問題解決辦法

解決辦法 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會閃現出{{}},當時測試問我有沒有解決辦法