微信小程序 获取 code openid 用户信息

code:用户登录凭证(有效期五分钟,只能使用一次)

https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html
wx.login({
    
    
  success (res) {
    
    
    if (res.code) {
    
    
      //发起网络请求
      wx.request({
    
    
        url: 'https://test.com/onLogin',
        data: {
    
    
          code: res.code
        }
      })
    } else {
    
    
      console.log('登录失败!' + res.errMsg)
    }
  }
})

openid:用户唯一标识

https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html

服务端发送请求:

GET https://api.weixin.qq.com/sns/jscode2session?
appid=APPID			//小程序注册的qppid
&secret=SECRET		//小程序的密钥
&js_code=JSCODE		//获取的code
&grant_type=authorization_code		//该接口固定,不变属性

返回值为json类型,解析,获取 openidsession_key

UserInfo:用户信息

https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html
// 必须是在用户已经授权的情况下调用
wx.getUserInfo({
    
    
  success: function(res) {
    
    
    var userInfo = res.userInfo
    var nickName = userInfo.nickName
    var avatarUrl = userInfo.avatarUrl
    var gender = userInfo.gender //性别 0:未知、1:男、2:女
    var province = userInfo.province
    var city = userInfo.city
    var country = userInfo.country
  }
})

获取手机号

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html

客户端获取加密后的数据:encryptedData

<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>

Page({
    
    
  getPhoneNumber (e) {
    
    
    console.log(e.detail.errMsg)
    console.log(e.detail.iv)
    console.log(e.detail.encryptedData)
  }
})

服务端解密:sessionKey在获取openid的同时就获取到了

    /**
     * 小程序 数据解密
     * @param encryptData 加密数据
     * @param iv 对称解密算法初始向量
     * @param sessionKey 对称解密密钥
     * @return 解密数据
     * @throws Exception 抛出异常
     */
    public static String decrypt(String encryptData, String iv, String sessionKey) throws Exception {
    
    
        AlgorithmParameters algorithmParameters = AlgorithmParameters.getInstance("AES");
        algorithmParameters.init(new IvParameterSpec(Base64.decodeBase64(iv)));
        Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(Base64.decodeBase64(sessionKey), "AES"), algorithmParameters);
        byte[] decode = decode(cipher.doFinal(Base64.decodeBase64(encryptData)));

        String decryptStr = new String(decode, StandardCharsets.UTF_8);
        return decryptStr;
    }

   /**
     * 删除解密后明文的补位字符
     *
     * @param decrypted 解密后的明文
     * @return 删除补位字符后的明文
     */
    public static byte[] decode( byte[] decrypted ) {
    
    
        int pad = decrypted[decrypted.length - 1];
        if (pad < 1 || pad > 32) {
    
    
            pad = 0;
        }
        return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);
    }

猜你喜欢

转载自blog.csdn.net/qq_43532386/article/details/107891355