微信小程序授权登录api
时间: 2025-05-24 17:12:46 浏览: 56
### 关于微信小程序授权登录的API文档与示例
#### 1. 微信小程序授权登录的核心流程
微信小程序授权登录主要依赖于微信官方提供的接口,核心在于通过 `wx.login()` 获取临时登录凭证(code),并将其发送至服务器端换取用户的唯一标识(openid)和会话密钥(session_key)。此过程需遵循以下步骤:
- **前端部分**
使用 `wx.login()` 方法获取临时登录凭证 code[^1]。该方法返回的结果仅在短时间内有效,因此应立即传递给后端处理。
```javascript
uni.login({
success: function (res) {
if (res.code) {
console.log('Login succeeded! Code:', res.code);
// 将 code 发送到后台完成后续逻辑
} else {
console.error('Login failed!', res.errMsg);
}
},
});
```
- **后端部分**
后端接收到前端传来的 code 后,调用微信开放平台提供的 `auth.code2Session` 接口,交换 openid 和 session_key[^2]。
```http
GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code HTTP/1.1
Host: api.weixin.qq.com
Content-Type: application/json;charset=UTF-8
```
响应参数说明如下:
| 参数名 | 类型 | 描述 |
|--------------|----------|-------------------------------------------------------------|
| openid | string | 用户唯一标识 |
| session_key | string | 会话密钥 |
| unionid | string | 当且仅当该移动应用已获得该用户的unionid权限时才会返回 |
---
#### 2. 获取用户基本信息
如果需要进一步获取用户的昵称、头像等信息,则需要借助 `wx.getUserInfo()` 或者新的 `wx.getUserProfile()` 接口[^4]。以下是基于旧版 `wx.getUserInfo()` 的实现方式:
```html
<button class="btn" open-type="getUserInfo" @getuserinfo="bindGetUserInfo">微信授权</button>
```
绑定事件处理器以捕获用户同意后的回调数据:
```javascript
bindGetUserInfo(e) {
const userInfo = e.detail.userInfo;
if (!userInfo || !e.detail.iv) {
uni.showToast({ title: "您取消了授权, 登录失败", icon: "none" });
return false;
}
uni.getUserInfo({
provider: 'weixin',
success: function (infoRes) {
console.log('User Info Response:', infoRes);
const encryptedData = infoRes.encryptedData;
const iv = infoRes.iv;
// 调用后端解密接口
uni.request({
url: '/your-server-url/decrypt-user-info', // 替换为实际地址
method: 'POST',
data: {
encryptedData,
iv,
code: this.code, // 此处假设已经从前端 login 中获取到了 code
},
success: (response) => {
console.log('Decrypted User Data:', response.data);
},
fail: () => {
console.error('Failed to decrypt user information');
},
});
},
});
}
```
需要注意的是,在新版 SDK 中推荐使用更安全的 `wx.getUserProfile()` 来替代原有的 `wx.getUserInfo()`[^5]。
---
#### 3. 数据加密与解密
为了保护用户隐私,微信会对敏感数据进行加密传输。开发者需要利用从 `auth.code2Session` 返回的 `session_key` 对这些数据进行解密操作。具体可参考官方文档中的加解密算法[^3]。
Java 实现示例如下所示:
```java
import org.apache.commons.codec.binary.Base64;
public class WXBizDataCrypt {
private String appId;
private byte[] sessionKeyBytes;
public WXBizDataCrypt(String appId, String sessionKey) throws Exception {
this.appId = appId;
this.sessionKeyBytes = Base64.decodeBase64(sessionKey.getBytes());
}
public Map<String, Object> decrypt(String encryptedData, String ivStr) throws Exception {
IvParameterSpec iv = new IvParameterSpec(Base64.decodeBase64(ivStr));
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
SecretKeySpec keySpec = new SecretKeySpec(this.sessionKeyBytes, "AES");
cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);
byte[] result = cipher.doFinal(Base64.decodeBase64(encryptedData));
String decryptedJsonString = new String(result, "UTF-8");
JSONObject jsonObject = JSON.parseObject(decryptedJsonString);
if (!this.appId.equals(jsonObject.getString("watermark").getString("appid"))) {
throw new RuntimeException("Invalid App ID during decryption.");
}
return jsonObject.toMap();
}
}
```
---
#### 4. 注意事项
- 临时登录凭证 `code` 是一次性使用的,重复调用可能导致验证失败[^3]。
- 开发过程中务必妥善保管 `AppSecret`,切勿泄露至客户端代码中。
- 若涉及多个环境部署,请分别申请对应的测试号或正式账号配置文件。
---
###
阅读全文
相关推荐



















