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

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

    前言

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

    />

    前提

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

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

    正文

    获取授权信息

    首先,我们需要使用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:

    展开全文
  • 用 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

    }

    }

    展开全文
  • 小程序端添加获取手机号码按钮 <button size="mini" class="mobile" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber" wx:if="{{!mobile}}">获取手机号码</button> 添加绑定事件 g...

    开发前提,注册小程序获取appid和secret

    小程序端添加获取手机号码按钮

    <button size="mini" class="mobile" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber" wx:if="{{!mobile}}">获取手机号码</button>

    添加绑定事件

    getPhoneNumber: function (e) {
        console.log(e)
        var that = this;
        that.getMobile(e.detail.encryptedData, e.detail.iv);
      },
    
    
      getMobile: function (encryptedData, iv) {
        var that = this;
        wx.request({
          url: app.globalData.domain + '/app/wechat/phone',
          data: {
            storeId: app.globalData.storeId,
            sessionKey: app.globalData.sessionKey,
            encryptedData: encryptedData,
            iv: iv
          },
          success: function (res) {
            if (res.data.code == 0) {
              that.setData({
                mobile: res.data.phone
              });
            }
    
          }
        })
      },

    后台接口实现

    @RequestMapping("phone")
        public R phone(Long storeId, String sessionKey, String encryptedData, String iv) throws WxErrorException {
        	WxMaPhoneNumberInfo phoNumberInfo = WxMaFactory.getWxMaService(storeId).getUserService().getPhoneNoInfo(sessionKey, encryptedData, iv);
        	return R.ok().put("phone", phoNumberInfo.getPhoneNumber());
        }

     

    展开全文
  • public class WXBizDataCrypt { private String appid; private String sessionKey; public WXBizDataCrypt(String appid, String sessionKey) { this.appid = appid; this.sessionKey = sessionKey;...
  • 微信小程序 开放数据校验与解密JavaJava微信小程序获取用户信息和手机号码解密Java版 一、依赖pom <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec --> <dependency> ...
  • 前端微信小程序获取code,后台使用asp获取session_key和openid;然后结合iv和encryptedData解密出微信用户手机号码 【操作步骤】 第1步:wx.login获取code 第2步:传递code到服务器,获取session_key和openid 第3步...
  • 配置文件 WxConstant.java /** * wx 配置文件 * */ public class WxConstant { public static final String appid = "你的appid"; public static final String secret = "你的secret"; public static final ...
  • 获取用户手机号码获取用户手机号码 获取用户手机号码 //小程序根据code获取用户openId String result = HttpRequest.sendGet("https://api.weixin.qq.com/sns/jscode2session", "appid=" + FgStaticParam.AppId + /...
  • 微信官方说的特别详细(微笑),使用iv,session_key和encryptedData解密获取到用户手机号,然后官方提供的解密算法是这样的。 经过查找bai大du量zhi的dao资料,终于写出了解决办法T_T 上代码: @ApiOperation(...
  • 下面将高速告诉大家,微信小程序如何授权获取用户信息和手机号码。 微信官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html Java后台接收小程序端传过来的 ...
  • 微信小程序获取用户手机号码(后台jsp、java版) 04年进入计算机行业。...
  • 1.生活速查生活速查小程序,是适合每个人的小程序,生活助手,随身生活查询小工具,您可以手机号归属地查询、难免会有朋友或者请人换号码通知不到位,这个时候,就可以查询归属地啦,还支持躺尸身份证归属地查询、I....
  • 本篇记录说明 微信小程序获取用户手机号码Java后台servlet解密 (第一次写博客,写得不好的地方见谅,面向新手,大佬请无视,不喜勿喷) 一、前言: 微信小程序有一个获取用户手机号码很便捷的接口,通过...
  • 获取小程序的手机号,指的是获取绑定用户微信的手机号码,细节什么的我就不多说了,官网说的很详细了官网:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html注意:...
  • 微信小程序获取手机号,java后台

    万次阅读 多人点赞 2018-10-25 10:19:51
    获取小程序的手机号,指的是获取绑定用户微信的手机号码,细节什么的我就不多说了,官网说的很详细了 官网:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html 注意...
  • 创建小程序项目(测试号即可) 创建Java后台项目(此处为SpringBoot 普通项目) 二、前端代码 WXML 代码 获取头像昵称 <block wx:else> <image bindtap="bindViewTap" class="userinfo-avatar" src=...
  • 恰饭广告注意:获取openid和unionid以及手机号码的请求必须写在后台代码,微信官方不允许直接请求新建login页面(login.wxml)获取openid获取unionidlogin.jsgetUnion:function(e) {wx.login({success: function (r) {...
  • 微信小程序 用户手机号码 openid session_key java
  • 具体思路为:小程序前端点击按钮,弹出授权手机号窗口,用户允许后,js得到加密数据,加密向量,session_key,将这些信息传递到java后台解密,最终拿到电话号码。(直接通过js只能获取到加密数据,需要后台解密) ...

空空如也

空空如也

1 2 3 4
收藏数 71
精华内容 28
关键字:

java获取小程序手机号码

java 订阅