微信小程序,微信授权手机号码

uniapp中index.vue:

复制代码
<template>
	<view class="content">
		<button 
		  open-type="getPhoneNumber" 
		  @getphonenumber="getPhoneNumber"
		  type="primary"
		>
		  授权手机号登录 
		</button>
	</view>
	
</template>

<script>
	export default {
		data() {
			return {

			}
		},
		onLoad() {
			 
		},
		methods: {
			getPhoneNumber(e) {
			if (e.detail.errMsg  === 'getPhoneNumber:ok') {
			      const { encryptedData, iv } = e.detail; 
				  
				wx.login({
				  	success: (res) => {
				  		console.log('====>'+res.code);
				  		wx.request({
				  		  url: 'http://localhost:8089/wx/user/wx-login',  // 替换为你的后端接口 
				  		  method: 'POST',
				  		  data: {
				  		    code: res.code, 
				  		    encryptedData,
				  		    iv 
				  		  },
				  		  success: (res) => {
				  			console.log(res);
				  		    // 3. 登录成功处理 
				  		    if (res.data.code  === 200) {
				  				console.log(res.data.msg);
				  		    }
				  		  }
				  		});
				  	}
				});
			      
			    } else {
			      console.error(' 获取手机号失败:', e.detail.errMsg); 
			    }
			  },
			

			
		}
	}
</script>

<style>

</style>

后端代码:

依赖

html 复制代码
<dependency>
	<groupId>com.github.binarywang</groupId>
	<artifactId>weixin-java-miniapp</artifactId>
	<version>4.3.0</version>
</dependency>

controller:

复制代码
    @PostMapping("/wx-login")
    public R<String> wxLogin(@RequestBody WxUserInfo userInfo) {
        return userInfoService.getPhoneNumber(userInfo);
    }

serviceImpl:

java 复制代码
    @Override
    public R<String> getPhoneNumber(WxUserInfo userInfo) {
        try {
            WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(userInfo.getCode());
            log.info(session.getSessionKey());
            log.info(session.getOpenid());
            //TODO 可以增加自己的逻辑,关联业务相关数据
            WxMaPhoneNumberInfo phoneInfo = wxMaService.getUserService().getPhoneNoInfo(session.getSessionKey(), userInfo.getEncryptedData(), userInfo.getIv());
            String phoneNumber = phoneInfo.getPhoneNumber();

            return R.ok(phoneNumber);
        } catch (WxErrorException e) {
            log.error(e.getMessage(), e);
            return R.fail(e.toString());
        } finally {
            WxMaConfigHolder.remove();//清理ThreadLocal
        }
    }
复制代码
WxUserInfo
java 复制代码
package com.example.demo.domain.dto;

import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;

@Data
@Accessors(chain = true)
public class WxUserInfo implements Serializable {
    private String appid;
    private String sessionKey;
    /**
     * 签名信息
     */
    private String signature;
    /**
     * 非敏感的用户信息
     */
    private String rawData;
    /**
     * 加密的数据
     */
    private String encryptedData;
    /**
     * 加密密钥
     */
    private String iv;

    private String code;
}
相关推荐
进击的尘埃4 分钟前
Vue3 中 emit 能 await 吗?事件机制里的异步陷阱
javascript
青青家的小灰灰13 分钟前
告别 Prop Drilling:Context API 的陷阱、Reducer 模式与原子化状态库原理
前端·javascript·react.js
进击的尘埃16 分钟前
CSS 变量 + 主题切换:从 CSS-in-JS 回归原生方案的实践之路
javascript
wuhen_n17 分钟前
Suspense:异步组件加载机制
前端·javascript·vue.js
wuhen_n18 分钟前
Teleport:渲染到任意DOM节点
前端·javascript·vue.js
进击的尘埃19 分钟前
组合式函数的设计模式:如何写出真正可复用的 Vue3 Composables
javascript
我叫黑大帅41 分钟前
前端总说的防抖与节流到底是什么?
前端·javascript·面试
掘金安东尼44 分钟前
从平面到空间:用 React Three Fiber 构建 3D 产品网格
前端·javascript·面试
swipe1 小时前
#用这 9 个浏览器 API,我把页面从“卡成 PPT”救回到 90+(每个都有能直接抄的例子)
前端·javascript·面试
摸鱼的春哥3 小时前
Agent教程15:认识LangChain,Agent框架的王(上)
前端·javascript·后端