SpringBoot集成微信小程序(二)【登录、获取头像昵称及手机号】

一、背景

小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。

微信小程序官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html

二、技术栈

  • SpringBoot 2.0
  • MyBatis-Plus
  • MySQL
  • Redis
  • Sa-Token
  • weixin-java-miniapp

三、第一个小程序

参考微信步骤:https://developers.weixin.qq.com/miniprogram/dev/framework/quickstart/getstart.html#%E7%94%B3%E8%AF%B7%E8%B4%A6%E5%8F%B7

四、登录时序图

在这里插入图片描述

五、实现

5.1 登录

5.1.1 wx.login获取code登录

onLaunch(options) {
        wx.login({
            success: function (res) {
                if (res.code) {
                    // 发起网络请求获取 session_key 和 openid
                    wx.request({
                        url: "http://localhost:8087/auth/login?code=" + res.code,
                        method: 'POST',
                        success: function (response) {
                        	if (response.data.code === 200) {
	                        	const token= response.data.data;
	                            wx.setStorageSync('token', token);
                        	} else {
                        		console.log("登录失败")
                        	}
                        },
                        fail: function (e) {
                        }
                    });
                }
            }
        });
    },

5.1.2 后端实现

private final WxMaService wxMaService;

private final RedisTemplate<String, Object> redisTemplate;

@ApiOperation("微信登录")
@PostMapping(value = "/login")
public ResultVO<String> login(@Valid @NotBlank(message = "微信code不能为空") String code) throws WxErrorException {
    WxMaJscode2SessionResult sessionInfo = wxMaService.getUserService().getSessionInfo(code);
    if (null == sessionInfo) {
        return ResultVO.fail("获取session失败");
    }
    // todo 模拟通过openid查询用户
    String openid = sessionInfo.getOpenid();
    Long userId = 1L;

    // 登录
    StpUtil.login(userId);

    // token
    String tokenValue = StpUtil.getTokenValue();

    // 缓存用户信息
    UserLoginVO loginVO = new UserLoginVO();
    loginVO.setId(userId);
    loginVO.setWxOpenId(openid);
    loginVO.setToken(tokenValue);
    redisTemplate.opsForValue().set("userinfo:" + userId, JSONObject.toJSONString(loginVO));

    return ResultVO.success(tokenValue);
}

5.2 获取头像

<button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar">
  <image class="avatar" src="{{avatarUrl}}"></image>
</button>
Page({
    data: {
        avatarUrl: 'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0'
    },
    onLoad: function (options) {
        // 页面创建时执行
    },
    onShow: function () {
        // 页面出现在前台时执行
    },
    onReady: function () {
        // 页面首次渲染完毕时执行
    },
    onHide: function () {
        // 页面从前台变为后台时执行
    },
    onUnload: function () {
        // 页面销毁时执行
    },
    onChooseAvatar(e) {
        const {avatarUrl} = e.detail
        this.setData({
            avatarUrl,
        });
        // todo 上传文件
    }
})

5.3 获取昵称

<input model:value="{{nickName}}" bindinput="bindKeyInput" type="nickname" class="weui-input" placeholder="请输入昵称"/>
Page({
    data: {
        nickName: ''
    },
    onLoad: function (options) {
        // 页面创建时执行
    },
    onShow: function () {
        // 页面出现在前台时执行
    },
    onReady: function () {
        // 页面首次渲染完毕时执行
    },
    onHide: function () {
        // 页面从前台变为后台时执行
    },
    onUnload: function () {
        // 页面销毁时执行
    },
    // 输入框变化事件触发
    bindKeyInput(e) {
        this.setData({
            nickName: e.detail.value
        })
    }
})

5.4 获取手机号

<button class="login-btn" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">获取手机号</button>
// 将code发送到服务器换取手机号进行绑定
wx.request({
    url: "http://localhost:8087/auth/getPhoneNumber?pcode=" + res.code,
    method: 'POST',
    success: function (res) {
        if (res.data.code === 200) {
			const phoneNumber = res.data.data;
		}
    },
    fail: function (e) {
        console.log("注册失败")
    }
});
@ApiOperation("获取手机号")
@GetMapping(value = "/getPhoneNumber")
public ResultVO<String> getPhoneNumber(@Valid @NotBlank(message = "微信pcode不能为空") String pcode) throws WxErrorException {
    WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(pcode);
    if (phoneNoInfo == null) {
        return ResultVO.fail("获取手机号失败");
    }

    return ResultVO.success(phoneNoInfo.getPhoneNumber());
}

六、至此本节结束

微信小程序开发中,获取用户头像昵称的方法已经发生了变化。以前常用的方法如wx.getUserInfo和wx.getUserProfile已经不再支持获取用户头像昵称的功能。现在,为了保护用户隐私和提高用户体验,微信小程序需要通过用户授权才能获取头像昵称等敏感信息。 目前,获取用户头像昵称的常用方法是通过使用button组件,并设置open-type属性为getUserProfile来获取用户的头像昵称。当用户点击这个button时,会弹出授权框,用户可以选择是否授权给小程序获取头像昵称信息。一旦用户授权,就可以通过event.detail.userInfo获取到用户的头像昵称。 需要注意的是,为了保护用户隐私,微信小程序获取用户头像昵称的权限进行了限制。开发者需要在小程序管理后台进行相应的配置,包括设置业务域名和配置授权设置等。具体的配置步骤可以参考微信小程序的官方文档。 总结起来,微信小程序开发获取用户头像昵称的方法已经发生了变化,现在需要使用button组件并设置open-type属性为getUserProfile来获取用户授权,通过event.detail.userInfo来获取用户的头像昵称。但需要注意在小程序管理后台进行相应的配置以及保护用户隐私的要求。123 #### 引用[.reference_title] - *1* *2* [微信小程序获取用户头像昵称](https://blog.csdn.net/m0_61443432/article/details/130257744)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *3* [微信小程序授权获取头像昵称的最新形式——头像昵称填写](https://blog.csdn.net/qq_38970408/article/details/127754307)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

PG_强哥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值