精华内容
下载资源
问答
  • 在开发过程中获取用户手机号是大多数项目中必不可少的需求,通过微信更加容易获取到用户的手机号,那么今天就来讲讲微信小程序是如何获取到用户的手机的。以下代码使用伪代码进行讲解。 登录凭证校验 由前端通过wx....

        在开发过程中获取用户手机号是大多数项目中必不可少的需求,通过微信更加容易获取到用户的手机号,那么今天就来讲讲微信小程序是如何获取到用户的手机的。

        以下代码使用伪代码进行讲解。

    5f24fd39ec5578bf8a0bd75e882b8616.pngfa63305c260a3eddca5583fa5aca039e.png

    登录凭证校验

    fde1bebcefd544be34c97cd1438c6d19.png50b5df0b72e8f9408ae438c1a91cac6f.png

        由前端通过wx.login接口获得临时登录凭证code,我们拿到code之后通过登录凭证校验获取到session_key,具体代码如下

    public static String login(String appid, String secret,String code) throws IOException{        //API请求地址        String url=                "https://api.weixin.qq.com/sns/jscode2session?appid=" + appid                        + "&secret="+ secret                        +"&js_code="+ code                        +"&grant_type=authorization_code";        //通过GET方法请求,具体http请求工具此处不再展示        String s = UrlUtil.doGet(url);        if( StringUtils.isEmpty(s) ){            throw new IOException("WxLogin code " + s);        }        return s;    }

    该API接口主要返回如下参数:

    openid---用户唯一标识

    session_key--会话密钥

    unionid--用户在开放平台的唯一标识符,在满足UnionID下发条件的情况下会返回(具体说明请参考下面的链接)

    注:返回的session_key要全局缓存起来,在以后获取手机号的时候使用。此接口有调用频率限制,每个用户每分钟100次。

    参考API文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
    5f24fd39ec5578bf8a0bd75e882b8616.pngfa63305c260a3eddca5583fa5aca039e.png

    解密手机号

    fde1bebcefd544be34c97cd1438c6d19.png50b5df0b72e8f9408ae438c1a91cac6f.png

        第二步就是通过前端传入的encryptedData、iv以及上述获取的session_key来解密用户信息。

        encryptedData--包括敏感数据在内的完整用户信息的加密数据

        iv--加密算法的初始向量

    //先导入解密需要的pom包  org.bouncycastle  bcprov-jdk15on  1.56import org.bouncycastle.jce.provider.BouncyCastleProvider;import org.bouncycastle.util.Arrays;import org.bouncycastle.util.encoders.Base64;import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import java.security.Key;import java.security.Security;/** * 微信工具类 */public class WechatDecryptDataUtil {    private static final String KEY_ALGORITHM = "AES";    private static final String ALGORITHM_STR = "AES/CBC/PKCS7Padding";    private static Key key;    private static Cipher cipher;        public static String decryptData(String encryptDataB64, String sessionKeyB64, String ivB64) {        return new String( decryptOfDiyIV(Base64.decode(encryptDataB64),Base64.decode(sessionKeyB64),Base64.decode(ivB64)));    }    private static void init(byte[] keyBytes) {        // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要        int base = 16;        if (keyBytes.length % base != 0) {            int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);            byte[] temp = new byte[groups * base];            Arrays.fill(temp, (byte) 0);            System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);            keyBytes = temp;        }        // 初始化        Security.addProvider(new BouncyCastleProvider());        // 转化成JAVA的密钥格式        key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);        try {            // 初始化cipher            cipher = Cipher.getInstance(ALGORITHM_STR, "BC");        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 解密方法     * @param encryptedData 要解密的字符串     * @param keyBytes      解密密钥     * @param ivs           自定义对称解密算法初始向量 iv     * @return 解密后的字节数组     */    private static byte[] decryptOfDiyIV(byte[] encryptedData, byte[] keyBytes, byte[] ivs) {        byte[] encryptedText = null;        init(keyBytes);        try {            cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(ivs));            encryptedText = cipher.doFinal(encryptedData);        } catch (Exception e) {            e.printStackTrace();        }        return encryptedText;    }}
    @Data //此注解是Lombok的注解public class WxPhone {    private String phoneNumber; //带区号手机号    private String purePhoneNumber;//纯手机号    private String countryCode;//区号}
    String s = WechatDecryptDataUtil.decryptData(encryptedData,session_key, iv);WxPhone wxPhone = JsonUtil.fromJson(s, WxPhone.class);

        好啦至此手机号就获取到啦,若有不明白的可以后台留言哟。

    【精彩推荐】

    图片优雅的转换成Base64

    Linux脚本启动jar包

    HMAC-MD5签名算法

    Java-微信JSSDK

    e8cd2df0c88989586f8bb3126c8b4fb8.png

    展开全文
  • 用 session_key ,encryptedData ,iv 解密获取手机号import com.anmoyi.common.Base64; //此包为自己封装的,只要能解密base64都行import java.security.spec.AlgorithmParameterSpec;import javax.crypto.Cipher;...

    用 session_key ,encryptedData ,iv 解密获取手机号

    import com.anmoyi.common.Base64; //此包为自己封装的,只要能解密base64都行

    import java.security.spec.AlgorithmParameterSpec;

    import javax.crypto.Cipher;

    import javax.crypto.spec.IvParameterSpec;

    import javax.crypto.spec.SecretKeySpec;

    /**

    * 解密用户手机号

    * @param keyStr sessionkey

    * @param ivStr ivData

    * @param encDataStr 带解密数据

    * @return

    * @throws Exception

    * @date 2019年05月08日

    */

    public static String decrypt(String keyStr, String ivStr, String encDataStr)throws Exception {

    byte[] encData = Base64.decode(encDataStr);

    byte[] iv =Base64.decode(ivStr);

    byte[] key = Base64.decode(keyStr);

    AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv);

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

    SecretKeySpec keySpec = new SecretKeySpec(key, "AES");

    cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);

    return new String(cipher.doFinal(encData),"UTF-8");

    }

    结果返回

    {

    "phoneNumber": "187*********",

    "purePhoneNumber": "187********",

    "countryCode": "86",

    "watermark":

    {

    "appid":"APPID",

    "timestamp":TIMESTAMP

    }

    }

    展开全文
  • 用 session_key ,encryptedData ,iv 解密获取手机号 import com.anmoyi.common.Base64; //此包为自己封装的,只要能解密base64都行 import java.security.spec.AlgorithmParameterSpec; import javax.crypto...

    用 session_key ,encryptedData ,iv 解密获取手机号


    import com.anmoyi.common.Base64; //此包为自己封装的,只要能解密base64都行
     
    import java.security.spec.AlgorithmParameterSpec;
     
    import javax.crypto.Cipher;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
     
     /**
         * 解密用户手机号
         * @param keyStr sessionkey
         * @param ivStr  ivData
         * @param encDataStr 带解密数据
         * @return
         * @throws Exception
         * @date 2019年05月08日
         */
        public static String decrypt(String keyStr, String ivStr, String encDataStr)throws Exception {
     
            byte[] encData = Base64.decode(encDataStr);
            byte[] iv =Base64.decode(ivStr);
            byte[] key = Base64.decode(keyStr);
     
            AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv);
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
            cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
     
     
     
            return new String(cipher.doFinal(encData),"UTF-8");
        }

    结果返回

    {
        "phoneNumber": "187*********",  
        "purePhoneNumber": "187********", 
        "countryCode": "86",
        "watermark":
        {
            "appid":"APPID",
            "timestamp":TIMESTAMP
        }
    }

     

    展开全文
  • 前言小程序内可以直接通过授权获取用户微信号绑定的手机号码或用户添加的其他手机号码,这样可以使得小程序在进行账户的身份可控上又提高了一步,那么应该如何来获取手机号码呢?这篇文章就和大家一起来研究一下。/&...

    前言

    小程序内可以直接通过授权获取用户微信号绑定的手机号码或用户添加的其他手机号码,这样可以使得小程序在进行账户的身份可控上又提高了一步,那么应该如何来获取手机号码呢?这篇文章就和大家一起来研究一下。

    />

    前提

    值得注意的是,如果您要获取手机号码首先要满足如下要求:

    注意:目前该接口针对非个人开发者,且完成了认证的小程序开放(不包含海外主体)。需谨慎使用,若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限。 – 微信开发平台

    正文

    获取授权信息

    首先,我们需要使用button组件,其open-type的值要设置为getPhoneNumber,可参考button · 小程序,然后绑定bindgetphonenumber的回调函数,在用户点击按钮,弹起的授权框允许授权之后回调函数内会返回一个event的对象,在其对象的detail下分别存在两个值(可参考《获取手机号 · 小程序》):

    参数

    类型

    说明

    encryptedData

    String

    包括敏感数据在内的完整用户信息的加密数据

    iv

    String

    加密算法的初始向量

    接下来我们要模拟一次登录,调用wx.login,然后再授权成功的回调中获取授权code值,接着将上述的encryptedData与iv一并传送至服务端,接下来就开始进行服务端解密过程。

    服务端解密

    服务端接收到encryptedData、iv与code值之后,进行微信授权登录一次,接口可参考:《code2Session · 小程序》,然后我们需要获取返回值中的session_key字段,即为会话秘钥。

    在微信《开放数据校验与解密 · 小程序》中提供了多种编程语言的示例代码,但是就是没有Java的,不知道是不是微信团队从来不写Java ,于是我们就自己实现了一个WXBizDataCrypt,具体实现如下:

    public class WXBizDataCrypt {

    private String appid;

    private String sessionKey;

    public WXBizDataCrypt(String appid, String sessionKey)

    {

    this.appid = appid;

    this.sessionKey = sessionKey;

    }

    public JSONObject decryptData(String encryptedData, String iv) throws Exception{

    byte[] dataByte = Base64.decodeBase64(encryptedData);

    // 加密秘钥

    byte[] keyByte = Base64.decodeBase64(this.sessionKey);

    // 偏移量

    byte[] ivByte = Base64.decodeBase64(iv);

    try {

    // 如果密钥不足16位,那么就补足. 这个if 中的内容很重要

    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;

    }

    // 初始化

    // 初始化

    Security.addProvider(new BouncyCastleProvider());

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

    SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");

    AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");

    parameters.init(new IvParameterSpec(ivByte));

    cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化

    byte[] resultByte = cipher.doFinal(dataByte);

    if (null != resultByte && resultByte.length > 0) {

    String result = new String(resultByte, "UTF-8");

    return JSONObject.parseObject(result);

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

    return null;

    }

    }

    [v_tips]上述代码中并没有实现签名效验的相关业务,可自行实现[/v_tips]

    首先我们需要创建WXBizDataCrypt的实体,传入小程序的appid与我们获取的session_key,然后再调用decryptData方法传入encryptedData与iv即可进行解密,如果返回的值为NULL或抛出异常则为解密失败,解密成功之后可以获取返回对象的countryCode以及purePhoneNumber组成完整的含区号的手机号码。

    后记

    在微信开放的相关开放接口中,对于用户的隐私数据这一块处理都是需要效验解密的,当然这一点也是为了数据安全,不过不得不吐槽有时候官方的文档真的是写的让人摸不着头脑,比如微信支付中的timestamp与timeStamp :arrow:

    展开全文
  • java对接微信小程序获取openid获取手机号; 第一次对接微信小程序,这里是后端的java代码,因为写这个时候是前后端分离,所以前端并没有涉及到。mh 1.解密类 import java.security.AlgorithmParameters; import ...
  • 微信小程序 开放数据校验与解密JavaJava微信小程序获取用户信息和手机号码解密Java版 一、依赖pom <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec --> <dependency> ...
  • 业务层,根据自己业务需求 @ApiOperation(value = "获取手机号", notes = "获取手机号") @ApiImplicitParams({ @ApiImplicitParam(name = "encryptedData", value = "encryptedData", required = true, paramType = ...
  • 提示:通过小程序获取用户微信绑定手机号 这里附上微信官方文档说明:微信官方文档 获取用户手机号步骤说明: 1.小程序客户端先调用wx.login(),获取到js_code; 2.将js_code传到后台,调用code2Session接口获取到...
  • java解析微信小程序获取手机

    千次阅读 2020-03-26 09:35:17
    我很好奇,java作为最火的语言之一,微信小程序的开发文档里边竟然没有解析小程序手机号的java实例。。。话不多说上代码!!! 1. 根据微信小程序开发文档先在小程序中获取必要的三个参数:encryptedData,iv,...
  • java解析的源码和小程序的源码,自己从项目中剥离出来的,肯定能用,有疑问私信,微信小程序获取各类信息(openid、session_key以及用户基本信息、解密手机号)
  • 小程序端添加获取手机号码按钮 <button size="mini" class="mobile" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber" wx:if="{{!mobile}}">获取手机号码</button> 添加绑定事件 g...
  • 下载微信开发者工具 注册开发者 获取appid 和 appSecret 获取code 发送后台获取openid 和sessionKey(获取用户信息) ...获取用户信息java代码 Map<String, String> params = new HashMap<String...
  • uniapp+java 获取用户手机号 首先你的appid不能是个体,具体可以参照微信官方文档 实现思路很简单 前端使用button的开放属性获取当前登录code和偏移量(iv)加密数据(encryptedData) 将获取到的数据回传到后台...
  • public class WXBizDataCrypt { private String appid; private String sessionKey; public WXBizDataCrypt(String appid, String sessionKey) { this.appid = appid; this.sessionKey = sessionKey;...
  • 获取小程序手机号,指的是获取绑定用户微信的手机号码,细节什么的我就不多说了,官网说的很详细了官网:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html注意:...
  • 获取微信小程序源代码两种方法:1、在手机获取。但需要获取手机的root权限,获得微信小程序的wxapkg包;2、运用模拟器,在电脑上运行微信小程序,获得微信小程序的wxapkg包;第一个方法有点难,下文以第二种方法...
  • public String decrypt(String key, String iv, String encrypdata) throws Exception { AlgorithmParameterSpec ivSpec = new IvParameterSpec(Base64.decodeBase64(iv)); Cipher cipher = Ci...
  • 微信小程序获取手机号,java后台

    万次阅读 多人点赞 2018-10-25 10:19:51
    获取小程序手机号,指的是获取绑定用户微信的手机号码,细节什么的我就不多说了,官网说的很详细了 官网:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html 注意...
  • 现在我们利用合法的域名来获取手机的接口,是Ok的 话不多说,我们直接干代码 首先wxml文件显示的ui <view class='head head-height'> <block wx:if="{{phone==null||phone==''}}"> <view class=...
  • 获取微信小程序手机号,后端为java

    千次阅读 2019-05-09 11:42:08
    微信小程序获取手机号步骤 1、前端调用 wx.login() 获取loginCode wx.login({ success:function(res){ console.log('loginCode:', res.code) } }); 2、后端拿到该 loginCode 发送https请求微信接口获取 ...
  • LZ-Says:有些东西,真的是很矛盾,本来很简单的事儿,各自坚持,结果,不欢而散,不舍?...今天接到要实现一个解密微信小程序获取微信绑定的手机号接口,有点懵。 下面一起开始吧~ 解密获取绑定...
  • 前言:最近公司做一个支付宝小程序项目,用支付宝userId做唯一用户id,后台encryptedData解密出用户支付宝绑定的手机号信息,其中正文开始:贴代码:1.authtoken获取userId 前端文档 后端文档public String ...
  • 注意:目前该接口针对非个人开发者,且完成了认证的小程序开放(不包含海外主体)。需谨慎使用,若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限。官网地址如下:...
  • 配置文件 WxConstant.java /** * wx 配置文件 * */ public class WxConstant { public static final String appid = "你的appid"; public static final String secret = "你的secret"; public static final ...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 318
精华内容 127
关键字:

java获取小程序手机

java 订阅