问题:在微擎的人人商城的小程序里面,会出现用户反复授权不成功的情况
分析:授权的流程是,一个未进入过小程序界面的用户进入界面后,wx.getUserinfo会获取用户的openid创建一个用户,并且存在cache里面,然后再点进入这个会员中心界面,会判断你的这个用户是无效的,然后进入授权界面,授权界面授权后,在进入首页,首页再会调用wxapp.auth这个api接口去修改这个openid的会员昵称,图片等信息
关键点:后台数据库中,shop_member表中,存在一部分为sns_wa_sns_wa_xxxxx这一类的openid,这一类的openid是错误的,导致这一部分用户就一直重复在首页更新数据更新不了,进入用户后,再授权,授权进入首页还是没法更新 这样一种死循环的情况
注意:如果你的数据库中不存在sns_wa_sns_wa_xxx之类的前缀重复openid的话,那么跟下面的解决方案没得太大关系.
死循环的原因:用户进入小程序首页授权后,创建了一个sns_wa_xxx的openid并且存入了缓存,然后再一次进入首页的时候,会触发check()方法,check方法会把这个sns_wa_xxx再加上sns_wa前缀,组成了sns_wa_sns_wa_xxx的openid来查询,查询不到,然后后面又会触发什么auth方法验证,然后就导致了一系列的错误.
解决关键点:
addons\ewei_shopv2\plugin\app\core\mobile\wxapp.php(这个是小程序调用的方法API后台接口) 在这个里面有两个function,一个是auth()->更新和创建用户的方法,另一个是check()->检查会员数据有效性的方法
auth()方法排除重复的sns_wa前缀
check()方法排除重复的sns_wa前缀
//更新:
//注:小程序中pages/messages/auth/index.js 这个是用户的授权js
//注:如果对于js比较熟悉的话,可以直接修改小程序的授权页面,用授权页面获取到用户的openid,nickename之类的信息后,然后写一个API接口来验证你的信息是否注册,注册过就不管,把个人昵称和头像更新一下.
修改这个pages/messages/auth/index.js
var t = getApp();
var e = require("../../../utils/core.js");//先加载require.js组件
//修改bind 方法 在bind中如果获取到了用户信息,就直接传参到借口
bind: function() {
var t = this, e = setInterval(function() {
wx.getSetting({
success: function(n) {
var a = n.authSetting["scope.userInfo"];
//微信调用用户信息的api接口
wx.getUserInfo({
success:function(info){
var userinfo=info.userInfo;
//console.log(userinfo);
var params={
data: userinfo,
iv: info.iv,
};
//调用下面的js方法
var res_code=update_info(params);
//方法成功,回到用户界面
if(res_code==1){
wx.navigateTo({
url: 'pages/member/index/index',
})
}
}
});
//这里的update_info的js方法 作用是获取到了用户信息后,调用PHP的api接口,传递用户参数,然后php获取用户参数后根据openid更新member表的用户信息
function update_info(params){
e.get("wxapp/update_info",params,function(res){
return res.code;
})
}
//相关的PHP后台接口方法(文件地址:addons\ewei_shopv2\plugin\app\core\mobile\wxapp.php 接口调用时就用wxapp/update_info)
// 微信小程序更新个人信息(头像,昵称,等等)
public function update_info(){
global $_GPC;
global $_W;
$openid=$_GPC['openid'];
$data = $_GPC["data"];
$return_data=array();
$member=m('member')->getMember($openid);
if($member['nickname']===$data['nickName']){
$return_data=array("code"=>1,"msg"=>"数据一样,无需修改");
app_json($return_data,$member['openid']);
}
//如果存在用户信息不为空,且得到的用户信息和数据库信息不匹配,进行更新
if(!empty($member)&&strlen($data['avatarUrl'])>1&&$data['nickName']!==$member['nickname']){
$updateData = array(
'nickname' =>$data['nickName'],
'avatar' =>$data['avatarUrl'],
'gender'=>$data['gender']
);
pdo_update('ewei_shop_member', $updateData, array('id' => $member['id'], 'uniacid' => $member['uniacid']));
$data['id'] = $member['id'];
$data['uniacid'] = $member['uniacid'];
$return_data=array("code"=>1,"msg"=>"修改成功");
}else{
$return_data=array("code"=>0,"msg"=>"无数据或者其他错误,修改失败");
}
注:有些朋友问页面弹框出现了check sign fail怎么办,但凡是进入页面后弹微信自带的那种提示框,一般都是配置问题,请检查你的config文件中的什么appid,appsecret之类的,跟业务代码没得太大关系,不知道怎么办把错误黏贴拿去百度.