精华内容
下载资源
问答
  • 微信小程序 手机号授权获取解密-java

    1.先从接口获取微信用户的openid,session_key,注意,需要在wx.login之后

    2.再经过小程序用户授权后,获得加密的encryptedData和iv,加上第一步获取的session_key,掉java接口进行解密手机号等信息

    工具类代码:

    import java.security.AlgorithmParameters;
    import java.security.Key;
    import java.security.Security;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec; 
    import com.alibaba.fastjson.JSONObject;
    @Component
    public class WXUserUtils{
    
     public static final String AES = "AES";
     public static final String AES_CBC_PADDING = "AES/CBC/PKCS7Padding";
    /**
    	 * 获取 微信小程序用户 openId
    	 * @param code
    	 * @return
    	 */
    	public static JSONObject  getWxxcxOpenId(String code) {
    		Map<String, String> params=new HashMap<>();
    		params.put("appid", "");
    		params.put("secret","");
    		params.put("js_code", code);
    		params.put("grant_type","authorization_code");
    		String result=HttpUtil.URLGet("https://api.weixin.qq.com/sns/jscode2session", params);
    	
    		return JSONObject.parseObject(result);
    		
    	}
    
     /**
         *    * 微信 数据解密<br/>
         *    * 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充<br/>
         *    * 对称解密的目标密文:encrypted=Base64_Decode(encryptData)<br/>
         *    * 对称解密秘钥:key = Base64_Decode(session_key),aeskey是16字节<br/>
         *    * 对称解密算法初始向量:iv = Base64_Decode(iv),同样是16字节<br/>
         *    *
         *    * @param encrypted 目标密文
         *    * @param session_key 会话ID
         *    * @param iv 加密算法的初始向量
         *    
         */
        public static String wxDecrypt(String encrypted, String session_key, String iv) {
            String result = null;
            byte[] encrypted64 = org.apache.commons.codec.binary.Base64.decodeBase64(encrypted);
            byte[] key64 = org.apache.commons.codec.binary.Base64.decodeBase64(session_key);
            byte[] iv64 = org.apache.commons.codec.binary.Base64.decodeBase64(iv);
            try {
                init();
                result = new String(decrypt(encrypted64, key64, generateIV(iv64)));
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;
        }
        /**
         *    * 初始化密钥
         *    
         */
    
        public static void init() throws Exception {
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
            KeyGenerator.getInstance(AES).init(128);
        }
    
        /**
         *    * 生成iv
         *    
         */
        public static AlgorithmParameters generateIV(byte[] iv) throws Exception {
            // iv 为一个 16 字节的数组,这里采用和 iOS 端一样的构造方法,数据全为0
            // Arrays.fill(iv, (byte) 0x00);
            AlgorithmParameters params = AlgorithmParameters.getInstance(AES);
            params.init(new IvParameterSpec(iv));
            return params;
        }
    
        /**
         *    * 生成解密
         *    
         */
        public static byte[] decrypt(byte[] encryptedData, byte[] keyBytes, AlgorithmParameters iv)
                throws Exception {
            Key key = new SecretKeySpec(keyBytes, AES);
            Cipher cipher = Cipher.getInstance(AES_CBC_PADDING);
            // 设置为解密模式
            cipher.init(Cipher.DECRYPT_MODE, key, iv);
            return cipher.doFinal(encryptedData);
        }
    }
    

    接口代码

    @ApiOperation(value = "获取微信openid,sessionkey等信息", response = Result.class)
    	@ApiImplicitParams({ 
    		@ApiImplicitParam(name = "code", value = "授权码", required = true, paramType = "query"),
    	})
    	@GetMapping("getWxOpenidInfo")
    	public Object getWxOpenidInfo(@RequestParam String code) {
    		if (StringUtil.isEmpty(code)) {
    			return null;
    		}
    		JSONObject jsonObject = WXUserUtils.getWxxcxOpenId(code);
    		return Result.success(jsonObject);
    	}
    
    @ApiOperation(value = "手机号解密", notes = "权限获取用户手机号-phoneNumber")
    	@ApiImplicitParams({ 
    		@ApiImplicitParam(name = "encryptedData", value = "加密信息-用户授权获取", required = true, paramType = "query"),
    		@ApiImplicitParam(name = "session_key", value = "通过getWxOpenidInfo接口获取", required = true, paramType = "query"),
    		@ApiImplicitParam(name = "iv", value = "偏移量-用户授权获取", required = true, paramType = "query"),
    		@ApiImplicitParam(name = "code", value = "微信code码", required = true, paramType = "query"),
    	})
        @GetMapping("/auth/phone")
        public Object authPhone(String encryptedData, String session_key, String iv) {
            try {
                String result = WXUserUtils.wxDecrypt(encryptedData, session_key, iv);
                JSONObject json = JSONObject.parseObject(result);
                if (json.containsKey("phoneNumber")) {
                    String phone = json.getString("phoneNumber");
                    if (StringUtils.isNoneBlank(phone)) {
                       return Result.success(json);
                    } else {
                        return Result.error("微信用户未绑定手机号");
                    }
                } else {
                	 return Result.error("获取失败");
                }
            } catch (Exception e) {
            	return Result.error("获取失败");
            }
        }

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

    前言

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

    />

    前提

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

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

    正文

    获取授权信息

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

    }

    }

    展开全文
  • Java 小程序 解码 获取手机

    第一步.

    调用wx.login 获取code

    uni.login({
                provider: 'weixin',
                success(res) {
                  if (res.errMsg === 'login:ok') {
                    return resolve({access_token, code: res.code})
                  } else {
                    return reject()
                  }
                }
              })

    第二步.

    根据code去获取session_key

    get请求 https://api.weixin.qq.com/sns/jscode2session

    
    /**
     * @author 
     */
    @Data
    @Component
    @ConfigurationProperties(prefix = "wx.config")
    public class WxMaProperties {
    
            /**
             * 设置微信小程序的appid
             */
            private String appid;
    
            /**
             * 设置微信小程序的Secret
             */
            private String secret;
    
            /**
             * 设置微信小程序消息服务器配置的token
             */
            private String token;
    
            /**
             * 设置微信小程序消息服务器配置的EncodingAESKey
             */
            private String aesKey;
    
            /**
             * 消息格式,XML或者JSON
             */
            private String msgDataFormat;
    
    
    
    }
    
    
      /**
         * 微信小程序获取OPENID
         */
        String WX_AUTHORIZATION_CODE_URL = "https://api.weixin.qq.com/sns/jscode2session" +
                "?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code";
    
    
        public R getOpenId(String code){
            String url = String.format(SecurityConstants.WX_AUTHORIZATION_CODE_URL
                    , wxMaProperties.getAppid(), wxMaProperties.getSecret(), code);
            String result = restTemplate.getForObject(url, String.class);
            //log.info("微信响应报文:{}", result);
    
            ObjectMapper objectMapper = new ObjectMapper();
            OpenIdDto openIdDto;
            try {
                openIdDto = objectMapper.readValue(result, OpenIdDto.class);
            }catch (Exception e){
                e.printStackTrace();
                return new R(-1,"解析微信结果出错");
            }
    
           return new R(openIdDto);
        }
    
    @Data
    public class OpenIdDto {
    
       private String openid;
       private String session_key;
    }

    第三步,

    将接口返回的session_key. 

    <button class="cu-btn" open-type="getPhoneNumber" @getphonenumber="getPhone" >获取微信授权</button>

    wx接口的iv, encryptedData,  放进工具类解密

    methods: {
    			getPhone(e) {
    					    console.log(e.detail.errMsg)
        console.log(e.detail.iv)
        console.log(e.detail.encryptedData)
    			}
    	  }

    手机号, 用户信息都已经测试过,可以使用

    解密方法如下

    public class DecodeUtil {
    
    
        /**
         * 解密工具直接放进去即可
         */
        public static String decryptS5(String encryptedData, String sessionKey, String ivParameter) {
            try {
    
                Base64.Decoder decoder = Base64.getDecoder();
                byte[] raw = decoder.decode(sessionKey);
                SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
                IvParameterSpec iv = new IvParameterSpec(decoder.decode(ivParameter));
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
                byte[] myendicod = decoder.decode(encryptedData);
                byte[] original = cipher.doFinal(myendicod);
                return new String(original, "utf-8");
            } catch (Exception ex) {
                return null;
            }
        }
    }

     

    展开全文
  • 提示:通过小程序获取用户微信绑定手机号 这里附上微信官方文档说明:微信官方文档 获取用户手机号步骤说明: 1.小程序客户端先调用wx.login(),获取到js_code; 2.将js_code传到后台,调用code2Session接口获取到...
  • 微信官方文档 · 小程序 获取手机获取微信用户绑定的手机号,需先调用wx.login接口。 因为需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 button 组件的点击来触发。 注意:目前该...
  • uniapp+java 获取用户手机号 首先你的appid不能是个体,具体可以参照微信官方文档 实现思路很简单 前端使用button的开放属性获取当前登录code和偏移量(iv)加密数据(encryptedData) 将获取到的数据回传到后台...
  • 获取encryptedData和iv请参考: https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html 获取微信sessionKey请参考: ... 后台根据encryptedData\i
  • 解析代码 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; ...import java.security.AlgorithmParameters;...import java.security....import java.
  • public class WXBizDataCrypt { private String appid; private String sessionKey; public WXBizDataCrypt(String appid, String sessionKey) { this.appid = appid; this.sessionKey = sessionKey;...
  • 微信小程序获取手机号流程附代码-java一、前端请求发送 携带 code 到后台换取 openid微信小程序前端wx.login({success(res) {if (res.code) {console.log(res.code)wx.request({url: '...method: 'GET',header: {...
  • 小程序获取手机号,后端JAVA解密流程代码微信官方文档获取手机号流程地址,先看下最好方便理解下面步骤实现思路,步骤如下1.前端需先调用官方wx.login接口获取登录凭证code。2.后端接收code 调用官方接口地址获取用户...
  • 小程序端登录后,得到登录时获取的 code(仅可使用一次)App({onLaunch: function () {//登录wx.login({success: res=>{//发送 res.code 到后台换取 openId, sessionKey, unionIdconsole.log(res.code)}})}})2.后端...
  • 具体思路为:小程序前端点击按钮,弹出授权手机号窗口,用户允许后,js得到加密数据,加密向量,session_key,将这些信息传递到java后台解密,最终拿到电话号码。(直接通过js只能获取到加密数据,需要后台解密) ...
  • 注意:目前该接口针对非个人开发者,且完成了认证的小程序开放(不包含海外主体)。需谨慎使用,若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限。官网地址如下:...
  • 微信官方文档地址https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html/*** Description: 解密微信数据,获得手机号码** @param data* @param sessionid* @return* @...
  • 然后接着写微信小程序如何获取手机号,本文既有小程序的实现代码、也有后台java的实现代码哦!! 小程序实现(我用的uni-app) 参考文档: 获取手机号 | 微信开放文档 1、首先必须先有一个button <u-button ...
  • 先参考微信小程序官网文档整理逻辑思路 调用微信小程序登录接口----获取用户授权—调用getCode接口获取手机号码(这里我有遇到获取手机号码异常bug)----调用后端API登录 ...1.1 点击触发事件 微信登录</van-button> 1.2 ...
  • 微信小程序授权获取用户信息和手机号码 1.微信官方文档 登录:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 手机号:...
  • 小程序中有很多地方都会用到注册用户信息的地方,用户需要填写手机号等,有了这个组件可以快速获取微信绑定手机号码,无须用户填写。1.getPaDirIrkFhoneNumber这个组件通过button来实现(别的标签无效)。将button中的...
  • * 获取微信小程序session_key * * @param jsonStr * @return */ @RequestMapping(value = "/getSessionKey", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
  • /*** 获取微信小程序 session_key 和 openid** @param code 调用微信登陆返回的Code* @return*/public static JSONObject getSessionKeyOropenid(String code) {//微信端登录code值String wxCode = code;Locale ...
  • Java实现表白小程序

    2021-03-22 16:38:31
    今天闲来无事,教大家一个哄妹子的case。我们需要创建一个心形图案,按照心形图案的www.cppcns.com位置和长度,对所创建的字符串进行截断并在所需的位置上输出,最终能呈现在屏幕上满满的爱心。废话不多说package ...
  • 记录微信小程序获取用户手机号遇到的坑及源码,来不及整理,功能没问题 1.引入pom <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk16</artifactId> &...
  • 微信小程序后端Java接口开发

    千次阅读 2021-11-05 16:36:15
    微信小程序后端Java接口开发 微信小程序使用wx.request(OBJECT)来调用后端接口。 首先 我们来一个简单案例 —— helloworld实现 1、搭建一个springboot项目并引入依赖 <dependency> <groupId>org....
  • 获取小程序的手机号,指的是获取绑定用户微信的手机号码,细节什么的我就不多说了,官网说的很详细了官网:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html注意:...
  • 注意:目前该接口针对非个人开发者,且完成了认证的小程序开放(不包含海外主体)。需谨慎使用,若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限。 1.WXBizDataCrypt实现类 ...
  • 微信小程序部分 小程序index.js 页面代码: Page({ data: { session_key: '', open_id: '', }, onLoad() { var that = this; //获取session_key和open_id wx.login({ success(res) { var ...
  • 获取用户信息(头像和昵称) 获取用户信息。页面产生点击事件(例如 button 上 bindtap 的回调中)后才可调用,每次请求都会弹出授权窗口,用户同意后返回 userInfo。...获取用户的电话号码 场景描述 一键

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 99,148
精华内容 39,659
关键字:

java获取小程序手机号码

java 订阅
友情链接: FetionFx2010.zip