微信小程序获取用户手机号

一、微信小程序获取用户手机号分四步:

1.微信前端登录接口wx.login获取临时登录凭证code

微信文档 https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html

2.后台根据code换取sessionKey

URL:https://api.weixin.qq.com/sns/jscode2session?appid={appId}&secret={appSecret}&grant_type=authorization_code&js_code={code}

该接口同时也会返回 openId和unionid

微信参考文档 https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html

3.前端获取到encryptedData、iv

使用微信小程序的组件 button,open-type值为getPhoneNumber。

微信文档 https://developers.weixin.qq.com/miniprogram/dev/component/button.html

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

4.encryptedData、iv、sessionKey三个参数调用后台解密接口解密即可得到微信小程序用户手机号

这一步有坑,详见下面

Java版解密工具类demo:

package com.meritdata.cloud.middleplatform.dataservice.cashier.utils;import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;import javax.crypto.*;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.InvalidParameterSpecException;
import java.util.Arrays;/*** 2020/12/14 5:08 PM** @author shoo* @describe 解密工具类*/
public class SecretUtilTools {public SecretUtilTools() {}public static String encryptForDES(String souce, String key) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {SecureRandom sr = new SecureRandom();DESKeySpec dks = new DESKeySpec(key.getBytes("UTF-8"));SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");SecretKey key1 = keyFactory.generateSecret(dks);Cipher cipher = Cipher.getInstance("DES");cipher.init(1, key1, sr);byte[] encryptedData = cipher.doFinal(souce.getBytes("UTF-8"));String base64Str = (new BASE64Encoder()).encode(encryptedData);return base64Str;}public static String decryptForDES(String souce, String key) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IOException, IllegalBlockSizeException, BadPaddingException {SecureRandom sr = new SecureRandom();DESKeySpec dks = new DESKeySpec(key.getBytes());SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");SecretKey key1 = keyFactory.generateSecret(dks);Cipher cipher = Cipher.getInstance("DES");cipher.init(2, key1, sr);byte[] encryptedData = (new BASE64Decoder()).decodeBuffer(souce);byte[] decryptedData = cipher.doFinal(encryptedData);return new String(decryptedData, "UTF-8");}public static String decrypt(String data, String key, String iv, String encodingFormat) throws Exception {byte[] dataByte = Base64.decodeBase64(data);byte[] keyByte = Base64.decodeBase64(key);byte[] ivByte = Base64.decodeBase64(iv);int base = 16;if (keyByte.length % base != 0) {int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);byte[] temp = new byte[groups * base];Arrays.fill(temp, (byte)0);System.arraycopy(keyByte, 0, temp, 0, keyByte.length);keyByte = temp;}try {Security.addProvider(new BouncyCastleProvider());Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");parameters.init(new IvParameterSpec(ivByte));cipher.init(2, spec, parameters);byte[] resultByte = cipher.doFinal(dataByte);if (null != resultByte && resultByte.length > 0) {String result = new String(resultByte, encodingFormat);return result;}return null;} catch (NoSuchAlgorithmException var13) {var13.printStackTrace();} catch (NoSuchPaddingException var14) {var14.printStackTrace();} catch (InvalidParameterSpecException var15) {var15.printStackTrace();} catch (InvalidKeyException var16) {var16.printStackTrace();} catch (InvalidAlgorithmParameterException var17) {var17.printStackTrace();} catch (IllegalBlockSizeException var18) {var18.printStackTrace();} catch (BadPaddingException var19) {var19.printStackTrace();} catch (UnsupportedEncodingException var20) {var20.printStackTrace();}return null;}
}

调用方法:

    public static MinAppUser getMiniUserInfo(String encryptedData, String iv, String sessionKey) throws IOException {MinAppUser minAppUser = new MinAppUser();String result = "";try {result = SecretUtilTools.decrypt(encryptedData, sessionKey, iv, "UTF-8");if (null != result && result.length() > 0) {minAppUser = (MinAppUser)(new ObjectMapper()).readValue(result, MinAppUser.class);} else {System.out.println("getMiniUserInfo error");}} catch (Exception var11) {var11.printStackTrace();}return minAppUser;}

二、以上四步步骤顺序不能错,否则各种报错。如:

1.解密报错 pad block corrupted

2.解密那一步,通过URL传参,不知道什么机制会自动把 "+" 换成 " ",导致你的encryptedData、iv错误。解决方法是反替换:

encryptedData = encryptedData.replaceAll(" ","+");
iv = iv.replaceAll(" ","+");

微信小程序获取用户手机号相关推荐

  1. 微信小程序获取用户手机号--官方示例

    微信小程序获取用户手机号–官方示例 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNu ...

  2. 微信小程序python解析获取用户手机号_微信小程序获取用户手机号

    获取微信用户绑定的手机号,需先调用wx.login接口. 小程序获取code. 后台得到session_key,openid. 组件触发getPhoneNumber 因为需要用户主动触发才能发起获取手 ...

  3. springboot 微信小程序获取用户手机号 最新方式

    springboot 微信小程序获取用户手机号 直接开整!!! 现在有两种方式获取微信用户的手机号 第一种 这种方式比较旧了,也能获取到手机号,但不建议使用. 1.前端调用wx.login()(官方的 ...

  4. 微信小程序获取用户手机号授权方法

    微信小程序获取用户手机号方法 首先在 app.json 页面添加一个新的用户授权页面,放在首页index的后面即可 在 app.js 页面中编写如下代码: 这里包含了获取用户信息的相关代码 //app ...

  5. 微信小程序获取用户手机号,后端php实现 (前后端完整代码附效果图)

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 如图: 小程序代码: 第一步,登录,获取用户的 session_key: 第二步,点击按钮调用 bindget ...

  6. 微信小程序获取用户手机号存数据库,前后端都有《Java后台版 》

    开发这个功能的时候走了很多弯路磨了很多时间,我发一下我自己用的来帮助大家 流程图 前端 index.wxml <view>我的首页内容</view><button cla ...

  7. 微信小程序python解析获取用户手机号_微信小程序获取用户手机号详解

    最近在做一款微信小程序,需要获取用户手机号,具体步骤如下: 流程图: 1.首先,客户端调用wx.login,回调数据了包含jscode,用于获取openid(用户唯一标识)和sessionkey(会话 ...

  8. 微信小程序获取用户手机号授权

    1.获取微信用户绑定的手机号,需要先在主页面调用wx.login接口 2.使用button按钮触发授权弹窗 <button open-type="getPhoneNumber" ...

  9. 小程序获取用户手机号权限,微信认证

    问题:小程序获取用户手机号,提示权限不足 原因:小程序没有进行微信认证 解决方案:在小程序的管理后台,点击右上角小程序logo,然后找到微信认证 微信认证方法1:自己开通 点击对应详情,根据流程一步一 ...

  10. 微信小程序获取用户信息流程(2022年版)

     开门见山地说,本文主要讲述微信小程序在2022年以后获取用户信息的主要方法,如果想要了解2022年之前微信小程序获取用户信息的相关知识或者是微信小程序之前这部分的设计思想的话,推荐博主的下面这篇博客 ...

最新文章

  1. +z +Z compiler flag for HP
  2. 终于,LoRaWAN成全球物联网标准!LoRa将拿下LPWAN领域50%市场?
  3. thinkphp如何一次性的上传多个文件,在文件域中可以多选?
  4. linux操作系统教学,Linux操作系统教学视频
  5. ASP.NET 4.0 新特性--Web.Config Transformation(原创)
  6. MyBatis增删改示例——MyBatis学习笔记之二
  7. linux centos7修改默认启动的内核(升级及切换内核)
  8. MySQL集群搭建--多主模式
  9. 下拉多选择框 实现方式_物体检测之旅(三)|设计选择,经验教训和物体检测的趋势...
  10. 1051. 复数乘法 (15)
  11. Codeforces 815C. Karen and Supermarket【树形DP】
  12. 将物体固定在坐标某个点_坐标变换(2)—不同坐标系下的变换
  13. 一些js/css动画 mark
  14. BroadcastReceiver之动态广播 demo+笔记
  15. java txt中统计一个字母出现的次数并储存,统计txt文件中每个字符出现的次数,并根据次数从高到低排序...
  16. 【android】apk在线升级
  17. 多级联动(已知和未知级次)
  18. u盘加密truecrypt_Mac OS X上的TrueCrypt驱动器加密入门
  19. yolov4 火焰检测 火焰识别 代码 数据集 开源
  20. C语言实现一个关机程序

热门文章

  1. 等保2.0三级物联网安全扩展要求
  2. bandicam安装及使用教学
  3. springboot 整合腾讯云短信
  4. 腾讯云 短信 简单使用
  5. SPSS T检测原理及结果分析
  6. oracle导出为dmp文件,oracle导出dmp文件的2种方法
  7. 【美味蟹堡王今日营业】论文学习笔记10-02
  8. 【转载】MIXLY二次开发(傻瓜版)
  9. Houdini vex用勾股定理推算椭圆运动轨迹
  10. 计算机专业表情包图片,各个专业表情包盘点 | 你的专业也有自己专属表情包吗?...