openId导致的微信中“下单账号和支付账号不一致”原因及解决办法

图1

       出现的问题如图1所示,出现问题的场景是用户A分享某个公益项目的链接到微信朋友圈,用户B打开这个链接准备捐款时就出现上面的问题。

       在网上查找相关的问题,大多语焉不详,给人的感觉好像是微信自身的问题。

       如果只是单独分析这个错误提示,可以推断应该是用户A的相关信息通过分享的方式被带出去了,在B打开时使用的是A的相关信息。首先可以排除缓存的问题,因为缓存是存在本地的,不会在分享时被携带出去。那有重大嫌疑的就是openId了,因为用户支付之前要授权,授权后微信会把当前用户的openId拼接在url后,然后重新加载当前页面,既然如此,会不会是openId被分享出去了呢?

       分享链接的url地址如下所示,发现openId确实在url地址中。

       分析程序:
[javascript] view plain copy
  1. /** 
  2.  * 初始化微信用户数据 
  3.  */  
  4. function initWeiXinUser () {  
  5.     if(!window.user.openId) {  
  6.         if(!getQueryString("openId")) {  
  7.             if (window.location.href.indexOf("from") > -1){         // 如果当前页面是分享页面,将分享标志存储起来,微信授权只会保留一个参数  
  8.                 sessionStorage.setItem('sharedPage', 1);  
  9.             }  
  10.             wxOAuth();  
  11.         } else {  
  12.             $.ajax({  
  13.                 type : "GET",  
  14.                 url : window._l.cfg.apiPrefix + "loveUser/getLoveUserByOpenId",  
  15.                 dataType : "jsonp",  
  16.                 jsonpCallback : "callBack",  
  17.                 jsonp : "callBackParam",  
  18.                 data : {  
  19.                     openId : getQueryString("openId")  
  20.                 },  
  21.                 success : function (result) {  
  22.                     if(result.code == 0) {  
  23.                         // 添加cookie,7天过期  
  24.                         addCookie("openId", getQueryString("openId"), 168);  
  25.                         //window.location.reload();  
  26.                         if (sessionStorage.getItem('sharedPage')) {  
  27.                             window.location.href = window.location.href + "&from=";  
  28.                         }  
  29.                         else {  
  30.                             window.location.reload();  
  31.                         }  
  32.                     }  
  33.                 }  
  34.             });  
  35.         }  
  36.     }  
  37.     return;  
  38. }  
代码片段1
       上面的程序就是图1页面的微信授权代码,从程序中分析可以知道,用户A第一次打开图1中的页面,按照初始化流程,先判断window.user.opneId,如果未定义,就从url取openId,如果没有,就调用微信授权,微信授权完后,把openId以参数的形式拼接在url地址后面,然后重新加载页面一次,把openId存入cookie,在代码片段1中是“addCookie("openId"getQueryString("openId"), 168);”。如果这个带有用户A的openId页面被分享出去,用户B打开这个页面当然就会提示“下单账号与支付账号不一致”了。
问题已经定位,下面继续分析带来这个问题的原因。
   在页面js代码中,初始化分享按钮的代码如下:
[javascript] view plain copy
  1. /** 
  2.  * 初始化APP右上角的分享按钮数据 
  3.  */  
  4. function initNativeShareBtn(project) {  
  5.   var shareInfo = {  
  6.     title : "我支持【" + project.projectTitle + "】微兔公益筹款,捐款或转发都是献爱心!",  
  7.     desc : project.description,  
  8.     imgUrl : window._l.cfg.imgPrefix + project.topImg,  
  9.     url : window.location.href  
  10.   };  
  11.   initAppShareBtn(shareInfo);  
  12. }  
代码片段2
       从上面代码可以知道,问题的根源就是“url: window.location.href”。
要解决这个问题,很简单,只要window.location.href中有openId,就应该把这个参数滤除,修改后代码如下:
[javascript] view plain copy
  1. /** 
  2.  * 过滤掉分享出去地址中不需要带的参数 
  3.  * @param s 
  4.  * @returns {XML|string|void} 
  5.  */  
  6. function shareUrlParamsFilter(s) {  
  7.     // 过滤掉pay,openId参数  
  8.     return s.replace(/&pay=\w+/, "").replace(/[(\?)|(&)]openId=.*/, "");  
  9. }  
  10.   
  11. /** 
  12.  * 初始化APP右上角分享按钮 
  13.  * @param shareInfo 
  14.  */  
  15. function initAppShareBtn(shareInfo) {  
  16.     var shareInfoTmp = shareInfo;  
  17.     var urlTmp = shareUrlParamsFilter(shareInfo.url);                // 分享前过滤掉当前用户的openId,防止微信中出现“下单账号和支付账号不一致的问题”。  
  18.     shareInfoTmp.url = urlTmp;  
  19.     if(isV2gogoApp()) {  
  20.         var v2gogoapp = getV2gogoAppFromSession();  
  21.         if(v2gogoapp.os == "Android") {  
  22.             AndroidJSListener.onShareInfo(JSON.stringify(shareInfoTmp));  
  23.         } else if(v2gogoapp.os == "iOS") {  
  24.             connectWebViewJavascriptBridge(function(bridge) {  
  25.                 bridge.init(function(message, responseCallback) {});  
  26.                 bridge.callHandler("onShareInfo", JSON.stringify(shareInfoTmp), function(response) {});  
  27.             });  
  28.         }  
  29.     } else if (isWeiXin()) {  
  30.         wxConfig(shareInfoTmp);  
  31.     }  
  32. }
        这样就解决这个问题了。需要注意的是ECMAScript中所有函数的参数都是按值传递的,在函数initAppShareBtn()中“shareInfo.url”是以形参的形式传入函数“shareUrlParamFilter()”的。如果函数“shareUrlParamFilter()”没有返回值,对象shareInfo的url属性在函数“shareUrlParamFilter()”不会被改变,因为ECMAScript中所有函数的参数都是按值传递的,这是和C语言不同的地方。

转载于:http://blog.csdn.net/yangzhen06061079/article/details/52549124

猜你喜欢

转载自blog.csdn.net/p_ython/article/details/79162897