人人商城小程序用戶授權問題

問題:在微擎的人人商城的小程序裏面,會出現用戶反覆授權不成功的情況

分析:授權的流程是,一個未進入過小程序界面的用戶進入界面後,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之類的,跟業務代碼沒得太大關係,不知道怎麼辦把錯誤黏貼拿去百度.

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章