最近帮别人搞微信小程序的时候发现微信小程序接口已经变化.然后顺便更新了下我博客的小程序.

 

起因

今天早上迭代小程序时候发现了通过小程序登陆自己博客,登陆后自己的名字永远显示'微信用户',头像也是一个灰色的,城市,国家这些信息都是没有的.

 

 

原因

 

微信在2021年4月13号对小程序接口做了变更,如果是4月13号之前发行的版本不受影响.

之后的版本受影响.

哪怕你小程序回退到4月13号之前发布的版本也没用.

 

小程序端调整

 

原来

是一次用户登陆授权即可,登陆后,只需要判断用户是否授权(scope.userInfo)即可.

然后可以无限次静默调用wx.getUserInfo获取用户(加密的)信息.

 

现在

 

因为接口变更wx.getUserInfo已经不再弹出授权信息,默认授权,而且不返回微信名字之类的信息.

此接口基本上废了.

 

小程序推出了新接口wx.getUserProfile代替.用法有变化.

1,完全无法静默调用.

2,无法通过onLaunch这种自动的页面函数中调用.

3,只能通过tap手势点击某个图片或者按钮之类的才能触发.

4,或许可以用wx.showToast之类的弹出提示中触发(不确定,极有可能不行).

 

 

调整点

1,删除授权信息获取判断关于scope.userInfo的.

原因有两点:
第一是接口变化,现在每次调用wx.getUserProfile获取用户信息都会弹出授权窗口,你无法静默方式获取用户信息了.
第二就是你无论如何获取scope.userInfo都只会返回True.

 

2,对原登陆代码进行改造,兼容

官方参考--> https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserProfile.html

 

3,注意点,wx.login和wx.getUserProfile有前后顺序.要先调用wx.login获取code先.

 

4,然后就是自己也要在小程序上缓存用户登陆的头像,用户的微信名字,避免下次还要授权.

 

WEB服务器端调整

此部分调整要看之前的逻辑.如果是依赖unionID的,服务器端可能就需要调整.

比如我博客就是完全靠unionID判断用户的.所以需要调整.

 

原来

因为原来unionId会在两个地方出现,一个是code换取session_key的时候,还有解密用户数据的时候.

 

现在

 

unionId相关

unionId还是会在code换取session_key的时候出现.

但是解密用户数据分两种情况.

1,微信用户是老微信版本:
不支持wx.getUserProfile接口,这样会解密出unionId(也就是上面上面那个图说的,没有用户名字,头像之类的)

 

2,通过wx.getUserProfile接口返回的情况:
这种情况解密的用户数据是不包括unionId的.只能通过code换取session_key的时候拿到unionId.

 

比较悲剧,我原来恰恰是通过解密用户数据获取unionId情况.

所以相关逻辑代码都要改.

原来我只是缓存了code以及对应的session_key,现在也要缓存对应的unionId或者openId了.

数据库都要加字段.

 

更新用户数据相关

更新用户数据也要考虑用户是老接口(wx.getUserInfo)还是新接口(wx.getUserProfile)的情况.

如果是老接口不更新用户新登陆的数据.

//适配新版的微信小程序,防止用户没有资料传入的情况下,更新用户数据
if ( ($rrs['nickName'] == '微信用户')  && ($rrs['city'] =='') && ($rrs['province'] =='')
&& ($rrs['country'] =='') ){

}else{
	$allow_field = array('nickName','openId','gender','language','city','province','country','avatarUrl');
	User::update($vrrs, ['unionId' => $unionid],$allow_field);
}

 

 

 

 

 

参考

 

https://viencoding.com/article/300

https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce88df04cb468bc52801