openId导致的微信中“下单账号和支付账号不一致”原因及解决办法
来源:互联网 发布:文网文添加域名 编辑:程序博客网 时间:2024/05/20 01:35
图1
出现的问题如图1所示,出现问题的场景是用户A分享某个公益项目的链接到微信朋友圈,用户B打开这个链接准备捐款时就出现上面的问题。
在网上查找相关的问题,大多语焉不详,给人的感觉好像是微信自身的问题。
如果只是单独分析这个错误提示,可以推断应该是用户A的相关信息通过分享的方式被带出去了,在B打开时使用的是A的相关信息。首先可以排除缓存的问题,因为缓存是存在本地的,不会在分享时被携带出去。那有重大嫌疑的就是openId了,因为用户支付之前要授权,授权后微信会把当前用户的openId拼接在url后,然后重新加载当前页面,既然如此,会不会是openId被分享出去了呢?
分享链接的url地址如下所示,发现openId确实在url地址中。
https://love.v2gogo.com/love/html/project.html?id=94146db13ed84f4fb95503ab775c221a&openId=oHyZmt7E-WViyjeEjEFqlgMiS81o&from=singlemessage&isappinstalled=0
分析程序:
/** * 初始化微信用户数据 */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语言不同的地方。
0 0
- openId导致的微信中“下单账号和支付账号不一致”原因及解决办法
- USER_LOGONID_DUP 请检查收款账号是不是自己的签约支付宝账号。 原因及处理
- 微信公账号支付:签名验证失败的解决办法
- Frameset导致Cookies和Session丢失的原因及解决办法
- Frameset导致Cookies和Session丢失的原因及解决办法
- Frameset导致Cookies和Session丢失的原因及解决办法
- 一个支付账号绑定两个应用的问题(支付宝和微信支付)
- Django忘记管理员账号和密码的解决办法
- XP系统下,任务管理器中账号与登录账号不一致
- 苹果账号支付流程
- oracle默认账号和密码及账号解锁方法
- LINUX 下的账号管理
- android下保存用户账号密码和读取账号密码
- 有openid的情况下 调起微信支付
- 自动更新 ishadowsocks 提供的免费账号的账号及密码
- 导致数据库中数据不一致的原因
- 导致数据库中数据不一致的原因
- 导致数据库中数据不一致的原因
- java各大排序算法总结
- Vue.js——60分钟webpack项目模板快速入门【8】
- 二叉树的非递归遍历
- 《自控力》阅读笔记二
- Vue.js——vue-router 60分钟快速入门【9】
- openId导致的微信中“下单账号和支付账号不一致”原因及解决办法
- Codeforces Round #370 (Div. 2)
- Vert.x - Java 的新领土
- Aurora一些使用过程中碰到的问题
- POJ 2513 字典树+一笔画问题
- Could not get lock
- 浅析Java集合类源码(一)--- Vector, ArrayList, LinkedList
- 四位数字插空格
- 酷酷的CSS3三角形运用