小程序-小程序登录微信昵称头像接口升级(Yii框架版本)

1.问题描述

小程序登录接口升级之后,将之前的微信昵称和头像返回为微信用户和灰色头像,如下图所示:

2.解决方案

处理方案

引入微信小程序的最新临时对接方案:

选择或者上传微信头像

选择或者填写微信昵称

思路梳理

①微信授权获取空白头像和微信用户昵称

②新增获取最新用户数据代码,与数据库进行存储对接工作

③更新之后的用户则无需第二次的头像昵称信息的修改操作

效果展示

点击个人中心的灰色头像

显示操作页面

微信头像操作

微信昵称操作

完整操作截图

提交结果

修改成功最终跳转到自定义界面

完成后再次点击微信头像则不再进行修改的操作,也可以修改成可一直修改状态,根据具体需求进行开发即可!

3.代码部分

app.json

加入此页面的引入部分(app.json文件加入如下代码部分):

"pages/user_base/index",

小程序前端页面目录

/pages/user_base目录:

index.js

const defaultAvatarUrl = 'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0'
Page({
/**
   * 页面的初始数据
   */
  data: {
    avatarUrl: defaultAvatarUrl,
    theme: wx.getSystemInfoSync().theme,
  },
  onLoad: function (e) {
    getApp().page.onLoad(this, e);
    var t = this;
    t.getDistrictData(function (e) {
      area_picker.init({
        page: t,
        data: e
      })
    }), t.setData({
      address_id: e.id
    }), e.id && (getApp().core.showLoading({
      title: "正在加载",
      mask: !0
    }), getApp().request({
      url: getApp().api.user.address_detail,
      data: {
        id: e.id
      },
      success: function (e) {
        getApp().core.hideLoading(), 0 == e.code && t.setData(e.data)
      }
    }))
  },
  onChooseAvatar(e) {
    const { avatarUrl } = e.detail 
    this.setData({
      avatarUrl:avatarUrl,
    })
    getApp().globalData.userInfo.avatarUrl = avatarUrl
    console.log();
    // getApp().core.setStorageSync(getApp().const.USER_INFO.avatar_url, avatarUrl);
  },
//下列方法与上方方法一样,但是需要注意的是下方代码完善的是将图片存储服务器部分,而非只是记录手机端图片位置,切记需要使用下方完整版方法,上方方法仅作记录使用
onChooseAvatar(e) {
    const { avatarUrl } = e.detail 
    this.setData({
      avatarUrl:avatarUrl,
    })
    // const { avatarUrl } = e.detail 
    // this.setData({
    //   avatarUrl,
    // })
    let that = this
    wx.uploadFile({
      url: getApp().api.default.upload_image, //url地址如果不填写正确的话会不走下方方法,可以添加error方法进行抓取工作
    //   url:t.api.default.upload_image,
      filePath: that.data.avatarUrl,
      name: 'image',    
      success(res) {
        //   console.log(res);
          if(res.statusCode == 200){

            // wx.showToast({
            //     title: '网络异常,上传失败请重试!'
            //   })
            var show_images = JSON.parse(res.data);

            if(show_images.code == 0){
                that.setData({
                    avatarUrl:show_images.data.url,
                })
            }else{
                wx.showToast({
                    title: '网络异常,上传失败请重试!'
                  })
            }

          }else{
            wx.showToast({
                title: '网络异常,上传失败请重试!'
              })
          }
        //   console.log(JSON.parse(res.data));
        //   console.log(JSON.(res.data));
        //   console.log(res.data.code);
        // that.data.navatarUrl = res.data;
        // that.setData({
        //     avatarUrl:res.data,
        // })
        // console.log(res.data);
        // this.setData({
        //     register_rule: !0
        //   })
        
      }
    })
    // getApp().globalData.userInfo.avatarUrl = avatarUrl
    // console.log();
    // getApp().core.setStorageSync(getApp().const.USER_INFO.avatar_url, avatarUrl);
  },
  formSubmit(e){
    var userInfo = getApp().getUser();
    userInfo.nickname = e.detail.value.nickname;
    userInfo.avatar_url = e.detail.value.avatar;
    
    // getApp().getUser() = userInfo;

    //开始与服务器进行链接更改用户数据信息
    getApp().request({
      url: getApp().api.user.users_save,
      method: "post",
      data: {
        nickname: userInfo.nickname,
        avatar_url: userInfo.avatar_url,
        user_id: userInfo.id,
      },
      success: function (e) {
        getApp().core.hideLoading(), 0 == e.code && getApp().core.showModal({
          title: "提示",
          content: e.msg,
          showCancel: !1,
          success: function (e) {
            wx.navigateTo({
              url: '/pages/user/user',
            })
          }
        }), 1 == e.code && t.showToast({
          title: e.msg
        })
      }
    })
     
  },
  /**
   * 生命周期函数--监听页面加载
   */
  // onLoad(options) {
  //   getApp().page.onLoad(this, e)
  //   wx.onThemeChange((result) => {
  //     this.setData({
  //       theme: result.theme
  //     })
  //   })
  // },
})

index.json

{
  "usingComponents": {}
}

index.wxml

<view data-weui-theme="{{theme}}">
  <button class="avatar-wrapper" open-type="chooseAvatar" bindchooseavatar="onChooseAvatar">
    <image class="avatar" src="{{avatarUrl}}"></image>
  </button> 
  <form catchsubmit="formSubmit">
    <view class="row">
      <view class="text1">昵称:</view>
        <input type="nickname" class="weui-input" name="nickname" placeholder="请输入昵称"/>
        <input hidden="true" name="avatar" value="{{avatarUrl}}" />
    </view>
    <button type="primary" style="margin-top: 40rpx;margin-bottom: 20rpx;" form-type="submit">提交</button>
  </form>
</view>

index.wxss

.avatar-wrapper {
  padding: 0;
  width: 56px !important;
  border-radius: 8px;
  margin-top: 40px;
  margin-bottom: 40px;
  background-color: #fff;
}
.avatar {
  display: block;
  width: 56px;
  height: 56px;
}
.container {
  display: flex;
}
.row{
   border-top: 1px solid #ccc;
   border-bottom: 1px solid #ccc;
   display: flex;
   align-items: center;
   height: 80rpx;
   padding-left: 20rpx;
}
.text1{
    flex: 2;
}
.weui-input{
    flex: 6;
}

接口自定义

小程序接口自定义(user/users_save):

所在目录

项目名称\core\api.js

代码展示

备注:Yii中API的接口方法格式为:action+驼峰命名法的英文,方法示例:actionUsersSave。

users_save: _api_root + "user/users-save",
后端API接口位置

项目名称\modules\api\controllers

错误位置

项目名称\assets\modules\api\controllers

后端接口方法(Yii框架)

方法一位置(控制器)

项目名称\modules\api\controllers\UserController.php:

//保存用户数据信息
    public function actionUsersSave()
    {
        $form = new UserForm();
        $form->attributes = \Yii::$app->request->post();
//        $avatar_url = \Yii::$app->request->post('avatar_url');
        $form->store_id = $this->store->id;
        $form->user_id = \Yii::$app->user->id;

        return new BaseApiResponse($form->saveUserNewInfo());

    }
方法二位置(Model层)

项目名称\modules\api\models\UserForm.php:

/**
 * @param $code
 * @return mixed
 * 更新用户数据信息
 */
public function saveUserNewInfo(){

    //查询用户数据信息是否存在
    $user = User::findOne(['id' => $this->user_id]);

    $nickname = \Yii::$app->request->post('nickname');
    $avatar_url = \Yii::$app->request->post('avatar_url');
    
    if($user){

        if(empty($nickname) || empty($avatar_url)){
            return [
                'code'=>1,
                'msg'=>'数据填写不全,请填写完整后重试!'
            ];
        }else{
            $user->avatar_url = $avatar_url;
            $user->nickname = $nickname;
            $user->save();
            return [
                'code'=>0,
                'msg'=>'保存成功!'
            ];
        }

    }else{
        return [
            'code'=>1,
            'msg'=>'暂未查询到此用户!'
        ];
    }


}

二次修改限制

更新之后的用户则无需第二次的头像昵称信息的修改操作:

代码完整展示:

wxml部分
<block wx:if='{{user_info.is_change == 1}}'>
                <view class='flex-grow-0'  bindtap="get_user_info">
                  <image class='avatar' src='{{user_info.avatar_url}}'></image>
                </view>
                <view class='flex-grow-1' bindtap="get_user_info">
                  <text class='user-name'>{{user_info.nickname}}</text>
                  <view bindtap='member' class='user-level flex-row'>
                    <view class='level-name flex-y-bottom'>
                      <image src='{{__wxapp_img.user.level.url}}'></image>
                      <view class='flex-y-center' style='height:100%;'>{{ (user_info.level_name || "普通用户") }}</view>
                    </view>
                  </view>
                </view>
              
              </block>
              <block wx:else>
                <view class='flex-grow-0'>
                  <image class='avatar' src='{{user_info.avatar_url}}'></image>
                </view>
                <view class='flex-grow-1'>
                  <text class='user-name'>{{user_info.nickname}}</text>
                  <view bindtap='member' class='user-level flex-row'>
                    <view class='level-name flex-y-bottom'>
                      <image src='{{__wxapp_img.user.level.url}}'></image>
                      <view class='flex-y-center' style='height:100%;'>{{ (user_info.level_name || "普通用户") }}</view>
                    </view>
                  </view>
                </view>
              </block>
js部分
if(o.data.user_info.nickname === '微信用户'){
    o.data.user_info.is_change = 1;
}else{
    o.data.user_info.is_change = 0;
}

图片上传服务器服务器端代码

actionUploadImage方法

在\modules\api\controllers\DefaultController.php文件中

public function actionUploadImage()
    {
        $form = new UploadForm();
        $upload_config = UploadConfig::findOne(['store_id' => $this->store->id]);
        $form->upload_config = $upload_config;
        return new BaseApiResponse($form->saveImage('thumb'));
    }
saveImage方法

在\models\UploadForm.php文件中

public function saveImageOld($name = null)
{
    if (!$name) {
        foreach ($_FILES as $_name => $file) {
            $name = $_name;
        }
    }
    if (!$name) {
        $name = 'image';
    }
    $this->image = UploadedFile::getInstanceByName($name);
    if (!$this->validate()) {
        return $this->errors;
    }

    $allow_type = ['jpg', 'jpeg', 'gif', 'png', 'bmp', 'webp',];
    if (!in_array($this->image->extension, $allow_type)) {
        return [
            'code' => 1,
            'msg' => '上传文件格式不正确,请上传' . implode('/', $allow_type) . '格式的图片',
        ];
    }

    $fileMd5 = md5_file($this->image->tempName);
    $saveName = $fileMd5 . '.' . $this->image->extension;
    $saveDir = '/web/temuploads/image/' . substr($saveName, 0, 2) . '/';
    $res = $this->saveFile($this->image->tempName, $saveDir, $saveName);
    if ($res['code'] == 0) {
        $res['data']['extension'] = $this->image->extension;
        $res['data']['type'] = $this->getFileType($this->image->extension);
        $res['data']['size'] = $this->image->size;
    }
    $this->saveData($res);
    return $res;
}

中间问题记录

1.wx.uploadFile方法中的url地址如果不填写正确的话会出现错误

onChooseAvatar(e) {
    const { avatarUrl } = e.detail 
    this.setData({
      avatarUrl:avatarUrl,
    })
    // const { avatarUrl } = e.detail 
    // this.setData({
    //   avatarUrl,
    // })
    let that = this
    wx.uploadFile({
      url: getApp().api.default.upload_image,//着重强调此项 
    //   url:t.api.default.upload_image,
      filePath: that.data.avatarUrl,
      name: 'image',    
      success(res) {
        //   console.log(res);
          if(res.statusCode == 200){

            // wx.showToast({
            //     title: '网络异常,上传失败请重试!'
            //   })
            var show_images = JSON.parse(res.data);

            if(show_images.code == 0){
                that.setData({//已经let that = this了,所以就不需要再使用this.setData了,使用that.setData
                    avatarUrl:show_images.data.url,
                })
            }else{
                wx.showToast({
                    title: '网络异常,上传失败请重试!'
                  })
            }

          }else{
            wx.showToast({
                title: '网络异常,上传失败请重试!'
              })
          }
        //   console.log(JSON.parse(res.data));
        //   console.log(JSON.(res.data));
        //   console.log(res.data.code);
        // that.data.navatarUrl = res.data;
        // that.setData({
        //     avatarUrl:res.data,
        // })
        // console.log(res.data);
        // this.setData({
        //     register_rule: !0
        //   })
        
      }
    })
    // getApp().globalData.userInfo.avatarUrl = avatarUrl
    // console.log();
    // getApp().core.setStorageSync(getApp().const.USER_INFO.avatar_url, avatarUrl);
  },

2.上传成功后一定要使用如下方法将头像链接进行重新赋值,否则依然未手机本地照片路径,无法与服务器进行链接

that.setData({
    avatarUrl:show_images.data.url,
})

3.可以使用缓存的照片路径在修改界面默认显示,不显示则使用默认头像(使用三元运算符)

4.wx.uploadFile方法中的name属性一定要与服务器接口的名字一致,否则报错

onChooseAvatar(e) {
    const { avatarUrl } = e.detail 
    this.setData({
      avatarUrl:avatarUrl,
    })
    // const { avatarUrl } = e.detail 
    // this.setData({
    //   avatarUrl,
    // })
    let that = this
    wx.uploadFile({
      url: getApp().api.default.upload_image,
    //   url:t.api.default.upload_image,
      filePath: that.data.avatarUrl,
      name: 'image', //着重强调此项   
      success(res) {
        //   console.log(res);
          if(res.statusCode == 200){

            // wx.showToast({
            //     title: '网络异常,上传失败请重试!'
            //   })
            var show_images = JSON.parse(res.data);

            if(show_images.code == 0){
                that.setData({//已经let that = this了,所以就不需要再使用this.setData了,使用that.setData
                    avatarUrl:show_images.data.url,
                })
            }else{
                wx.showToast({
                    title: '网络异常,上传失败请重试!'
                  })
            }

          }else{
            wx.showToast({
                title: '网络异常,上传失败请重试!'
              })
          }
        //   console.log(JSON.parse(res.data));
        //   console.log(JSON.(res.data));
        //   console.log(res.data.code);
        // that.data.navatarUrl = res.data;
        // that.setData({
        //     avatarUrl:res.data,
        // })
        // console.log(res.data);
        // this.setData({
        //     register_rule: !0
        //   })
        
      }
    })
    // getApp().globalData.userInfo.avatarUrl = avatarUrl
    // console.log();
    // getApp().core.setStorageSync(getApp().const.USER_INFO.avatar_url, avatarUrl);
  },

5.JSON.parse可解析json化的数据

var show_images = JSON.parse(res.data);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 微信小程序的php后端搭建,主要分为以下几个步骤: 1. 安装php环境和相关依赖; 2. 配置php环境和相关依赖; 3. 编写后端代码; 4. 部署代码到服务器。 在搭建之前,你需要先确定要使用的php框架和数据库。目前常见的php框架有Laravel、Yii2、ThinkPHP等,而数据库则有MySQL、PostgreSQL等。这里以Laravel和MySQL为例。 1. 安装php环境和相关依赖 这里推荐使用PHP-FPM和NGINX,使用它们可以大大提升php应用的性能和稳定性。在安装完php和 NGINX 后,还需要安装相应的依赖,比如Composer等。 2. 配置php环境和相关依赖 在配置php环境和相关依赖时,需要分别对php、Composer和NGINX进行配置。配置好后就可以进行后端代码的编写。 3. 编写后端代码 使用Laravel框架编写php后端代码,可以利用它丰富的语法和类库,快速地实现业务逻辑。比如,实现用户注册、登录、权限管理等功能。 4. 部署代码到服务器 在开发和测试完成后,需要将php后端代码部署到服务器上。需要将代码和依赖一起打包,上传服务器上。在服务器上,需要配置好环境、数据库等,然后再启动服务,从而让微信小程序前端可以请求到后端以实现想要的效果。 这是一个较为简单的微信小程序php后端搭建过程,实际操作会因人而异。如果您初次尝试,建议细心阅读相关配置文件和配置文档,以便稳定运行您的小程序。 ### 回答2: 微信小程序的后端搭建需要使用到PHP语言,具体操作流程如下: 首先,需要搭建PHP环境,可以使用工具如WAMP、XAMPP或LAMP等。安装完成后,需要新建一个PHP文件。 接下来,需要引入微信官方提供的SDK,代码如下: require_once "{path}/wechat_sdk.php"; 除了SDK以外,还需要配置一些参数,如appId、appSecret、token、encodingAESKey等。 完成以上步骤后,就可以开始开发后端逻辑了。开发过程中需要调用微信官方提供的api,如获取access_token、获取用户信息等。 在开发过程中,需要注意安全问题,如接口的安全保护、防止SQL注入等。同时,需要对接口进行测试,查看返回数据是否符合预期。 最后,将开发好的后端逻辑部署到服务器上,接着就可以与微信小程序前端进行交互了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

眼眸间的深情

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值