前端:

			<template>
				<button class="cu-btn bg-gradual-orange lg round margin-top-xl" open-type="getPhoneNumber"
					@getphonenumber="handleGetPhone" :loading="loading">
					<text class="text-xl">手机号自动登录</text>
				</button>
			</template>
			async handleGetPhone(e) {
				console.log("开始获取手机号");

				if (e.detail.errMsg === 'getPhoneNumber:ok') {
					this.loading = true;
					const loginRes = await uni.login({
						provider: 'weixin'
					});
					console.log("loginRes", loginRes);
					console.log("loginRes[1].code", loginRes[1].code);
					try {
						
						console.log('encryptedData:', e.detail.encryptedData);
						console.log('iv:', e.detail.iv);
						console.log('code:', loginRes[1].code);

						const params = {
							appId: "xxxxxxxxxxxxxxxxxxx",
							code: loginRes[1].code,
							encryptedData: e.detail.encryptedData,
							iv: e.detail.iv,
							"grant_type": "authorization_code"
						}


						console.log("后端发起");
						this.$http.post('/frontuser/getWechatUserInfo/', 
								params
							)
							.then(res => {
								console.log("后端发起内容:");
								console.log(res);
								if(res.data.code == 200){
									let tmp = res.data.data;
									let openid = tmp.openid;
									let session_key = tmp.session_key;
									const pc = new WXBizDataCrypt(params.appId, session_key);
									const data = pc.decryptData(params.encryptedData, params.iv);
									console.log('解密后的数据:', data);
									console.log('手机号:', data.phoneNumber);
									console.log('国家码:', data.countryCode);
									console.log('区号:', data.purePhoneNumber);
									this.username = data.phoneNumber;
											// 注册用户
											this.$http.post('/frontuser/Register/', {
												phoneNumber: data.phoneNumber
											})
											.then(res => {
												if(res.data.code === 200) {
													console.log("注册成功");
													//重新刷新小程序
													console.log(res.data.data);
													 uni.reLaunch({
													 	url: '/pages/FRONTpages/index'
													 });
												} else {
													uni.showToast({
														title: res.data.msg,
														icon: 'none'
													});
												}
											})
											.catch(err => {
												uni.showToast({
													title: '注册失败',
													icon: 'none'
												});
												console.error(err);
											});
										}
								
							}).catch(err => {
								uni.showToast({
									icon: 'none',
									title: '发起失败,请联系管理员!',
									duration: 2000
								})
								console.log(err);
							})


					} catch (error) {
						uni.showToast({
							title: '获取手机号失败',
							icon: 'none'
						});
					} finally {
						this.loading = false;
					}
				}
			}

后端


@Slf4j
@RestController
@RequestMapping("/frontuser")
public class FrontUserController {

    @PostMapping("/getWechatUserInfo")
    public Result<?> getWechatUserInfo(
            @RequestBody JSONObject jsonObject
    ) {
        try {
            String appId = "xxxxxxxxxxxxxxxxx";
            String appSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
            String code = jsonObject.getString("code");
            System.out.println("code:" + code);
            // 调用微信接口获取session_key和openid
            String response = Unirest.get("https://api.weixin.qq.com/sns/jscode2session")
                    .queryString("appid", appId)
                    .queryString("secret", appSecret)
                    .queryString("js_code", code)
                    .queryString("grant_type", "authorization_code")
                    .asString().getBody();

            System.out.println("response:" + response);

            // 解析返回数据
// 由于 JSONObject(String) 构造函数未定义,使用 parseObject 方法解析字符串
            JSONObject jsonResponse = JSONObject.parseObject(response);
            System.out.println(jsonResponse);
            String openid = jsonResponse.getString("openid");
            String session_key = jsonResponse.getString("session_key");

            JSONObject data = new JSONObject();
            data.put("openid", openid);
            data.put("session_key", session_key);
            // 返回解密后的用户信息
            return Result.OK(data);
        } catch (UnirestException e) {
            log.error("微信接口调用失败", e);
            return Result.error("微信接口调用失败");
        } catch (Exception e) {
            log.error("数据处理异常", e);
            return Result.error("数据处理异常");
        }
    }
}
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐