禾匠4.4.8微信授权接口修复教程

 9659

有很多网友反应禾匠 4.4.8 获取用户信息失败,今天看了下源码,主要是因为微信修改了获取用户信息规则导致的。

见微信文档:https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce88df04cb468bc52801


废话不多说,看下如何解决吧。


前端部分

首先找到前端登录弹框的文件,文件位于:src/components/basic-component/app-layout/app-user-login/app-user-login.vue

登录按钮代码:

  1. <button class="login-btn"
  2.     :open-type="openType"
  3.     scope="userInfo"
  4.     @getAuthorize="getUserInfo"
  5.     @getuserinfo="getUserInfo"
  6.     @click="getUserInfoClick"
  7. >
  8. </button>

这个按钮写在一个条件编译判断里面,如果是5+小程序就会显示这个按钮,但是微信已经修改了规则,所以明显这个就有问题了。但是之前开发者的逻辑也不想进行太大的修改(主要是懒+避免出现乱七八糟的bug),所以我们修改代码如下:

  1. <!-- #ifndef MP-WEIXIN -->
  2. <button class="login-btn"
  3.     :open-type="openType"
  4.     scope="userInfo"
  5.     @getAuthorize="getUserInfo"
  6.     @getuserinfo="getUserInfo"
  7.     @click="getUserInfoClick"
  8. >
  9. </button>
  10. <!-- #endif -->
  11. <!-- #ifdef MP-WEIXIN -->
  12. <button class="login-btn"
  13.     scope="userInfo"
  14.     @getAuthorize="getUserInfo"
  15.     @getuserProfile="getUserProfile"
  16.     @click="getUserProfileClick"
  17. >
  18. </button>
  19. <!-- #endif -->

这里稍微调整了一下,如果是微信小程序则显示 getProfile 这个按钮,其他小程序平台还是显示原来那个按钮。接着我们新增两个方法来处理微信小程序端的点击事件。

  1.     getUserProfileClick(e) {
  2.         // #ifdef MP
  3.         this.$store.commit('user/showLoginModal', false);
  4.         const resolve = this.$user.getUserInfoResolve;
  5.         const reject = this.$user.getUserInfoReject;
  6.         this.$event.on(this.$const.EVENT_USER_LOGIN, true).then(() => {
  7.         this.$jump({
  8.             open_type: 'reload'
  9.         })
  10.     });
  11.     uni.getUserProfile({
  12.         desc: '用于完善会员资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
  13.         success: (res) => {
  14.             console.log(res)
  15.             if (res.errMsg !== 'getUserProfile:ok') {
  16.                 this.$store.commit('user/showLoginModal', true);
  17.                 return reject(res.errMsg);
  18.             } else {
  19.                 return resolve(res);
  20.             }
  21.         }
  22.     })
  23.       // #endif
  24. }

OK,登录弹窗这边就修改完成了,这边主要修改了微信小程序端获取用户信息的方式,以适应微信规则的调整。

接着处理一下登录那边的JS文件,文件位于:src/core/user.js

找到 getAccessToken() 方法(13行),这里主要修改一下提交的数据。因为之前是基于 getUserInfo 方法获取用户信息的,现在改成了 getUserProfile 数据格式发生了一些变化,所以这里也需要修改一下提交数据的格式。

在 uni.login 的 success 回调里面,修改就行了:

  1. let data
  2. // #ifdef MP-WEIXIN
  3. data = {
  4.     encryptedData: userInfoResult.encryptedData,
  5.     iv: userInfoResult.iv,
  6.     rawData: userInfoResult.rawData,
  7.     signature: userInfoResult.signature,
  8.     code: loginResult.code,
  9. };
  10. // #endif
  11. // #ifndef MP-WEIXIN
  12. data = {
  13.     encryptedData: userInfoResult.detail.encryptedData,
  14.     iv: userInfoResult.detail.iv,
  15.     rawData: userInfoResult.detail.rawData,
  16.     signature: userInfoResult.detail.signature,
  17.     code: loginResult.code,
  18. };
  19. // #endif

OK,前端部分我们已经修改完了。


后端部分

我之前调试的时候发现登录弹框没有弹出来(如果已经配置好了 SSL 证书应该不会有这个问题了),排查发现返回接口的路由有点问题,如果有童鞋遇到没有弹出登录弹框的,可以尝试修改一下后端文件 forms/common/CommonAppConfig.php

找到 getDefaultPageList 方法,将

  1. $picUrl = str_replace('http://', 'https://', $picUrl);

注释(上线后再取消注释)

或者修改为:

  1. if (!getenv('YII_DEBUG')) {
  2.     $picUrl = str_replace('http://', 'https://', $picUrl);
  3. }

注:需要自己在根目录添加 .env 环境变量文件,并配置对应的环境变量值,这种方式更推荐。

接着上面,后端获取用户信息失败出问题的文件就是这个文件:vendor/luweiss/wechat/src/Wechat/Wechat.php

但是它又是一个第三方库的文件,所以基于 no hack core 原则我们是不建议修改它的,但是基本上大家都是不会升级了吧,所以修改也无所谓了。。

修改这个很简单,加一行代码就搞定。找到 decryptData 方法,在最后的 return 前面添加一行代码:

  1. $dataObj['openId'] = $sessionData['openid'];

OK,大功告成。




本文网址:https://www.zztuku.com/detail-9065.html
站长图库 - 禾匠4.4.8微信授权接口修复教程
申明:如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐