可以通过openId和session_key拿到用户信息码
时间: 2024-01-15 15:03:42 浏览: 26
是的,通过 OpenID 和 Session Key 可以获取用户的信息。OpenID 是用户在微信中的唯一标识符,而 Session Key 则是用户与小程序之间建立会话的密钥。通过调用微信接口,可以传入 OpenID 和 Session Key,获取用户的基本信息,例如昵称、头像等。需要注意的是,为了保护用户的隐私,获取用户信息需要用户授权。
相关问题
微信小程序拿到登录用户手机号
要获取微信小程序登录用户的手机号,需要先让用户授权手机号。具体步骤如下:
1. 在app.json中添加获取用户手机号的权限:
```json
{
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将用于小程序定位"
},
"scope.userInfo": {
"desc": "你的基本信息将用于小程序登录"
},
"scope.phoneNumber": {
"desc": "你的手机号码将用于小程序登录"
}
}
}
```
2. 在登录成功后,调用`wx.login()`获取code,并使用`wx.request()`发送code到后台服务器,获取session_key和openid,代码如下:
```javascript
wx.login({
success: res => {
wx.request({
url: 'https://yourserver.com/login',
data: {
code: res.code
},
success: res => {
//获取session_key和openid
let session_key = res.data.session_key;
let openid = res.data.openid;
//保存session_key和openid
wx.setStorageSync('session_key', session_key);
wx.setStorageSync('openid', openid);
}
})
}
})
```
3. 在获取到session_key和openid后,调用`wx.getUserInfo()`获取用户信息,检查用户是否授权手机号,如果已授权,则可以使用`wx.request()`发送加密数据到后台服务器,进行解密并获取手机号,代码如下:
```javascript
wx.getUserInfo({
success: res => {
if (res.errMsg === 'getUserInfo:ok') {
//检查是否授权手机号
if (res.userInfo.phoneNumber) {
//已授权手机号,调用后台接口获取解密后的手机号
wx.request({
url: 'https://yourserver.com/decryptPhone',
method: 'POST',
data: {
session_key: wx.getStorageSync('session_key'),
encrypted_data: res.encryptedData,
iv: res.iv
},
success: res => {
//获取手机号成功
let phone = res.data.phoneNumber;
console.log(phone);
}
})
} else {
//未授权手机号,提示用户授权
wx.showModal({
title: '提示',
content: '请授权手机号',
showCancel: false
})
}
}
}
})
```
注意,解密手机号的过程需要在后台服务器完成,需要使用后台语言如Node.js或Java等,具体实现方式可以参考微信官方提供的解密算法文档。
CREATE TABLE user ( id varchar(30) NOT NULL COMMENT '用户 openid', session_key varchar(30) DEFAULT NULL COMMENT '用户 session_key', nickname varchar(20) DEFAULT NULL COMMENT '用户昵称', role int(2) DEFAULT NULL COMMENT '角色类型 0是管理员,1是用户,2是员工', phone_number varchar(20) DEFAULT NULL COMMENT '用户手机号', create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (id), UNIQUE KEY phone_UNIQUE (phone_number) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';和CREATE TABLE user_account ( id int(10) NOT NULL AUTO_INCREMENT, user_id varchar(30) CHARACTER SET utf8mb4 NOT NULL COMMENT '用户id', password varchar(50) COLLATE utf8mb4_bin NOT NULL COMMENT '用户密码', create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (id), KEY user_id_idx (user_id), CONSTRAINT user_id_idx FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;,和public interface UserMapper extends MyBaseMapper<User> {},public interface UserAccountMapper extends MyBaseMapper<UserAccount> { },public interface MyBaseMapper<T> extends Mapper<T>, MySqlMapper<T>,MyInsertListMapper<T> { },如何插入?(不用jpa)
可以使用Mybatis进行插入操作。首先,在mapper.xml中编写插入语句:
```xml
<!-- 插入用户信息 -->
<insert id="insertUser" parameterType="User">
INSERT INTO user(id, session_key, nickname, role, phone_number)
VALUES(#{id}, #{sessionKey}, #{nickname}, #{role}, #{phoneNumber})
</insert>
<!-- 插入用户账户信息 -->
<insert id="insertUserAccount" parameterType="UserAccount">
INSERT INTO user_account(user_id, password)
VALUES(#{userId}, #{password})
</insert>
```
然后,在对应的Mapper接口中定义插入方法:
```java
public interface UserMapper {
void insertUser(User user);
}
public interface UserAccountMapper {
void insertUserAccount(UserAccount userAccount);
}
```
最后,在业务逻辑代码中调用插入方法即可:
```java
User user = new User();
user.setId("openid");
user.setSessionKey("session_key");
user.setNickname("nickname");
user.setRole(1);
user.setPhoneNumber("phone_number");
userMapper.insertUser(user);
UserAccount userAccount = new UserAccount();
userAccount.setUserId("openid");
userAccount.setPassword("password");
userAccountMapper.insertUserAccount(userAccount);
```
注意,如果使用的是Mybatis 3.5.0以上版本,可以直接使用@Insert注解代替在xml中编写插入语句。例如:
```java
@Insert("INSERT INTO user(id, session_key, nickname, role, phone_number) VALUES(#{id}, #{sessionKey}, #{nickname}, #{role}, #{phoneNumber})")
void insertUser(User user);
```