UnionId 是微信平台用户的唯一标识,对于后台开发来说,UnionId 无疑是一个非常好用的东西。
前言
在获取 UnionId 之前,首先需要做下面的准备:
-
在小程序平台完善自己的微信小程序信息
-
在微信开放平台将自己的微信小程序进行绑定
(在绑定小程序中使用的小程序账号就是上一步注册小程序时所用的账号/邮箱)
一、编写微信小程序前端代码
从 wx.getUserInfo接口文档 中可以知道,UnionId 被加密在 wx.getUserInfo
的回调函数返回值 encryptedData 中,所以我们只需要将 encryptedData 解密就可以获取到 UnionId 的值了。
1.编写 wxml button组件
编写 button 按钮且存在open-type="getUserInfo"
属性,bindgetuserinfo 指定函数来接收回调函数返回值:
<view class="order_auth_wrap">
<button type="primary" plain open-type="getUserInfo"
bindgetuserinfo="handleGetUserInfo">
获取授权
</button>
</view>
2.编写 js 请求发送逻辑代码
在js代码中,我封装了 wx.request
接口函数,但是参数类型是相同的(其中 url 就是将encryptedData, iv, code
发送到自己后台服务器进行解密的请求路径):
import {
login, request } from "../../utils/asyncWx.js";
import regeneratorRuntime from '../../lib/runtime/runtime';
//获取应用实例
const app = getApp()
Page({
// 获取用户信息回调函数
async handleGetUserInfo(e) {
try {
// 1.获取用户信息
const {
encryptedData, iv } = e.detail;
// 2.获取小程序成功登陆后的code
const {
code } = await login();
// 3.向后台发送 encryptedData, iv, code,后台通过解密之后获取 UserInfo
const params = {
encryptedData, iv, code };
const header = {
'content-type': 'application/x-www-form-urlencoded' };
const result = await request({
url: "***", data: params, method: "POST", header });
console.log(result);
const {
unionId } = result.data;
// 4.将 unionId 保存到全局变量中
app.globalData.unionId = unionId;
// 5.跳转回上一层页面
wx.navigateBack({
delta: 1
});
} catch (error) {
console.log(error);
}
}
})
二、后台解密Controller实现
1.处理前端发送的 url 请求 controller:
package com.kiger.controller;
import com.alibaba.fastjson.JSONObject;
import com.kiger.Utils.AesCbcUtil;
import com.kiger.Utils.HttpRequest;
import com.kiger.entities.CommonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
/**
* @author zk_kiger
* @date 2020/4/18
*/
@RestController
@Slf4j
@RequestMapping("/api")
public class ConsumerController {
@PostMapping("/getUserInfo")
public CommonResult<Map> getUserInfo(String encryptedData, String iv, String code)<