微信小程序获取用户信息(含服务端)

本文获取用户信息方式需要服务端配合,纯前端的可查看 微信小程序获取用户信息(纯前端)

若需获取 openid 和用户信息,可使用 wx.getUserInfo() 获取加密后的信息,传给服务端后解密。

小程序代码(uni-app 版)

<button type="primary" @click="mpWxLogin">
	授权登录
</button>
async mpWxLogin() {
  const {
    code
  } = await wx.login();
  
  const {
    encryptedData,
    iv
  } = await wx.getUserInfo();

  // 调用服务端接口
  const userInfo = await login({
    code,
    encryptedData,
    iv
  });
  
  console.log(JSON.stringify(userInfo, null, 2));
},

服务端代码(node 版)

const crypto = require('crypto')
const axios = require('axios');

const appId = '';
const secret = '';

/**
 * 微信小程序授权登录获取session_key
 * @param {Object} options
 * @param {String} options.code 小程序code
 * @param {String} options.encryptedData 可选,存在encryptedData和iv时返回用户信息(包含unionid)
 * @param {String} options.iv 可选
 */
const login = async options => {
  const {
    code,
    encryptedData,
    iv
  } = options;

  let url = 'https://api.weixin.qq.com/sns/jscode2session';
  url += '?appid=' + appId;
  url += '&secret=' + secret;
  url += '&js_code=' + code + '&grant_type=authorization_code';

  const { data } = await axios.get(url);
  
  const userInfo = WXBizDataCrypt({
    sessionKey: data.session_key,
    encryptedData,
    iv
  })

  return {
    session_key: data.session_key,
    openid: data.openid,
    userInfo
  }
}

/**
 * 解密encryptedData 获取unionid
 * @param {Object} options
 * @param {String} options.sessionKey
 * @param {String} options.encryptedData
 * @param {String} options.iv
 */
const WXBizDataCrypt = options => {
  const appId = wxConfigMp.appId;
  let {
    sessionKey,
    encryptedData,
    iv
  } = options;
  sessionKey = new Buffer(sessionKey, 'base64')
  encryptedData = new Buffer(encryptedData, 'base64')
  iv = new Buffer(iv, 'base64')

  let decoded;
  try {
    // 解密
    let decipher = crypto.createDecipheriv('aes-128-cbc', sessionKey, iv)
    // 设置自动 padding 为 true,删除填充补位
    decipher.setAutoPadding(true)
    decoded = decipher.update(encryptedData, 'binary', 'utf8')
    decoded += decipher.final('utf8')
    decoded = JSON.parse(decoded)
  } catch (err) {
    throw new Error('Illegal Buffer')
  }
  if (decoded.watermark.appid !== appId) {
    throw new Error('Illegal Buffer')
  }
  return decoded
}

其他说明
官网上 wx.getUserProfile() 也能返回 encryptedData 和 iv,但亲测会报appid错误。
在这里插入图片描述
如果没有服务端,则可以使用 wx.getUserProfile() 获取用户信息,查看详情


其他服务端语言解密方式可见微信小程序官网

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微信小程序服务端获取用户信息的步骤如下: 1. 首先,前端页面需要使用一个按钮,并在按钮上添加相应的属性,以便回调到小程序的JavaScript方法中。这个按钮可以在页面的wxml文件中定义。 2. 当用户点击按钮时,前端会触发相应的JavaScript方法。在这个方法中,可以通过调用wx.login接口获取用户的code。 3. 接下来,前端需要将用户的code发送给服务端服务端可以调用微信的auth.code2Session接口,使用这个code来获取用户的OpenID、UnionID(如果当前小程序已绑定到微信开放平台账号)和会话密钥session_key。服务端调用接口的具体方法可以参考微信的开发文档。 4. 服务端获取了用户的登录信息后,就可以使用这些信息进行相应的操作了,比如保存到数据库或进行其他的业务逻辑处理。 需要注意的是,wx.login的code只能使用一次,所以在获取到code之后,要及时将其发送给服务端进行处理。此外,获取用户绑定的手机号需要用户主动触发,所以需要在小程序中使用button组件的点击来触发相应的操作。另外,获取手机号的功能只对完成了认证的小程序开放。123 #### 引用[.reference_title] - *1* [[小程序]微信小程序登陆并获取用户信息](https://blog.csdn.net/taoshihan/article/details/101249695)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *2* *3* [微信小程序获取用户基本信息](https://blog.csdn.net/xiongxiaoning/article/details/115235105)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值