精华内容
参与话题
问答
  • 用于微信小程序用户数据解密。 JAVA 代码实现 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。 对称解密的目标密文为 Base64_Decode(encryptedData)。 对称解密秘钥 aeskey = Base64_Decode(session_key), ...
  • 如上图,我解密微信用户信息,报以上的错误,是哪里配置不对吗?在工具类中用main方法可以正常解密,用web请求就报“Cannot find any provider supporting AES/CBC/PKCS7Padding”错误,求大神们指点
  • 小程序用户信息解密乱码

    千次阅读 2018-11-11 23:36:10
    在进行小程序开发的过程中,当前端调用getUserInfo,然后传给后端之后,后端进行解密,偶尔会解密乱码报错,概率大概是2%左右,但是又不知道为什么会解密乱码。 百度之后,还有看了官方的API,他们说的原因大概如下...

    在进行小程序开发的过程中,当前端调用getUserInfo,然后传给后端之后,后端进行解密,偶尔会解密乱码报错,概率大概是2%左右,但是又不知道为什么会解密乱码。

    百度之后,还有看了官方的API,他们说的原因大概如下:

    1.前端传给后台,丢失某些特殊的符号。  这个前后端对比下就能解决。

    2.我们系统里面存的sessionKey 错误或者过期。 通过checkSession可以看看过期没有。

    3. 我们用的sessionKey不是最新的sessionKey。

    在我的系统里,确实是sessionkey错误。

    解决方案:

    根据自己实际的系统,分析出到底哪里导致了sessionKey不是最新的问题。

     

    解密代码如下:

        /**
         * AES解密
         *
         * @param encryptedData 消息密文
         * @param ivStr         iv字符串
         */
        public static String decrypt(String sessionKey, String encryptedData, String ivStr) {
            try {
                AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
                params.init(new IvParameterSpec(Base64.decodeBase64(ivStr)));
    
                Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
                cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(Base64.decodeBase64(sessionKey), "AES"), params);
    
                return new String(PKCS7Encoder.decode(cipher.doFinal(Base64.decodeBase64(encryptedData))), StandardCharsets.UTF_8);
            } catch (Exception e) {
                throw new RuntimeException("AES解密失败", e);
            }
        }
    
    
    //类
    public class PKCS7Encoder {
    
        private static final Charset CHARSET = Charset.forName("utf-8");
        private static final int BLOCK_SIZE = 32;
    
        /**
         * 获得对明文进行补位填充的字节.
         *
         * @param count 需要进行填充补位操作的明文字节个数
         * @return 补齐用的字节数组
         */
        public static byte[] encode(int count) {
            // 计算需要填充的位数
            int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);
            if (amountToPad == 0) {
                amountToPad = BLOCK_SIZE;
            }
            // 获得补位所用的字符
            char padChr = chr(amountToPad);
            String tmp = new String();
            for (int index = 0; index < amountToPad; index++) {
                tmp += padChr;
            }
            return tmp.getBytes(CHARSET);
        }
    
        /**
         * 删除解密后明文的补位字符
         *
         * @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);
        }
    
        /**
         * 将数字转化成ASCII码对应的字符,用于对明文进行补码
         *
         * @param a 需要转化的数字
         * @return 转化得到的字符
         */
        public static char chr(int a) {
            byte target = (byte) (a & 0xFF);
            return (char) target;
        }
    }
    

     

    展开全文
  • 当初之所以要去解密用户数据,只是为了拿到unionId,说来奇怪,其实微信的登录凭证校验接口(https://api.weixin.qq.com/sns/jscode2session?appid=APPID&amp;secret=SECRET&amp;js_code=JSCODE&amp;...

    文章不是很全面,只是截取了项目内容的一部分,不明白的地方可以私信。

    当初之所以要去解密用户数据,只是为了拿到unionId,说来奇怪,其实微信的登录凭证校验接口(https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code)回参中有unionId,但是在实际的情况中,回参中并没有这个值,无奈只能通过解密用户数据来拿到这个值。

    流程是这样的:小程序首先通过wx.login()获取临时登录凭证code,iv,encryptedData——>调用应用后台,调用微信登录凭证校验接口获取session_key——>根据iv,encryptedData,session_key解密用户数据。

    https://developers.weixin.qq.com/miniprogram/dev/api/open.html(微信小程序获取用户信息接口api)

    https://developers.weixin.qq.com/miniprogram/dev/api/api-login.html(微信小程序获取登录信息接口api)


    展开全文
  • java获取微信小程序用户信息

    千次阅读 2019-05-08 19:39:17
    * 获取微信小程序用户openid和session_key/unionid * 返回格式:{"session_key":"ZXxmVGt78993dkNCPmQOA==","openid":"o5TI441P58849p4E-fBrH_HgVvGo","unionid":"oD08m1s24646ZIDJ_AQ9ADUf...

     第一步:获取openid、session_key等信息。

    /**
     * 获取微信小程序的用户openid和session_key/unionid
     * 返回格式:{"session_key":"ZXxmVGt78993dkNCPmQOA==","openid":"o5TI441P58849p4E-fBrH_HgVvGo","unionid":"oD08m1s24646ZIDJ_AQ9ADUf5QQ"}
     * @param code
     * @return
     * @throws Exception
     * @return JSONObject
     * @author tyg
     * @date   2019年4月25日下午2:24:22
     */
    public static JSONObject getWechatSmallProgram(String code) throws Exception {
    	// 小程序唯一标识 (在微信小程序管理后台获取)
    	String wxspAppid = "wx456478dfsffdsfsdfsa";
    	// 小程序的 app secret (在微信小程序管理后台获取)
    	String wxspSecret = "4ds4f89d4afa46fsfsd";
    	//请求地址
    	String url = "https://api.weixin.qq.com/sns/jscode2session?";
    	// 授权(必填)
    	String grant_type = "authorization_code";
    
    	//1、向微信服务器 使用登录凭证 code 获取 session_key 和 openid
    	// 请求参数
    	StringBuffer params = new StringBuffer("appid=").append(wxspAppid);
    	params.append("&secret=").append(wxspSecret);
    	params.append("&js_code=").append(code);
    	params.append("&grant_type=").append(grant_type);
    	String data = HttpTookit.doGet(url, params.toString(), "UTF-8", true);
    LOG.info("\n微信小程序用户信息:"+data);
    	return JSONObject.parseObject(data);
    }

    第二步:使用session_key对encryptedData进行解密,获取用户信息,返回用户昵称、头像信息。

    package com.yt.distribution.util;
    import java.io.UnsupportedEncodingException;
    import java.security.AlgorithmParameters;
    import java.security.InvalidAlgorithmParameterException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.security.Security;
    import java.security.spec.InvalidParameterSpecException;
    
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    
    import org.apache.commons.codec.binary.Base64;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    
    /**
     * Created by yfs on 2017/2/6.
     * <p>
     * AES-128-CBC 加密方式
     * 注:
     * AES-128-CBC可以自己定义“密钥”和“偏移量“。
     * AES-128是jdk自动生成的“密钥”。
     */
    public class AesCbcUtil {
    
        static {
            //BouncyCastle是一个开源的加解密解决方案,主页在http://www.bouncycastle.org/
            Security.addProvider(new BouncyCastleProvider());
        }
    
        /**
         * AES解密
         *
         * @param data           //密文,被加密的数据
         * @param key            //秘钥
         * @param iv             //偏移量
         * @param encodingFormat //解密后的结果需要进行的编码
         * @return
         * @throws Exception
         */
        public static String decrypt(String data, String key, String iv, String encodingFormat) throws Exception {
    //        initialize();
    
            //被加密的数据
            byte[] dataByte = Base64.decodeBase64(data);
            //加密秘钥
            byte[] keyByte = Base64.decodeBase64(key);
            //偏移量
            byte[] ivByte = Base64.decodeBase64(iv);
    
            try {
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
    
                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, encodingFormat);
                    return result;
                }
                return null;
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (InvalidParameterSpecException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (InvalidAlgorithmParameterException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            } catch (BadPaddingException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
    
            return null;
        }
    
    }

     

    展开全文
  • thinkphp后台获取微信小程序用户信息

    千次阅读 2017-09-12 21:26:51
    thinkphp后台获取微信小程序用户信息 首先需要看懂微信小程序开发文档的 开放接口中的 登录 和 用户信息。 微信小程序的用户数据怎么传到thinphp后台操作存储到mysql。 wx.login(OBJECT) 调用接口获取登录凭证...
    thinkphp后台获取微信小程序用户信息

    首先需要看懂微信小程序开发文档的  开放接口中的  登录 和 用户信息。

    wx.login(OBJECT)

    调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成。

    code 换取 session_key

    ​这是一个 HTTPS 接口,开发者服务器使用登录凭证 code 获取 session_key 和 openid。

    session_key 是对用户数据进行加密签名的密钥。为了自身应用安全,session_key 不应该在网络上传输

    小程序端的代码:

    //app.js
    App({
      onLaunch: function () {
        //调用API从本地缓存中获取数据
        var logs = wx.getStorageSync('logs') || []
        logs.unshift(Date.now())
        wx.setStorageSync('logs', logs)
      },
      getUserInfo:function(cb){
        var that = this
        if(this.globalData.userInfo){
          typeof cb == "function" && cb(this.globalData.userInfo)
        }else{
          //调用登录接口
          wx.login({
            success: function (res) {
                  var code = res.code
                    // success
                    // 获取用户信息
                  wx.getUserInfo({
                      success: function (data) {
                        that.globalData.userInfo = data.userInfo
                        typeof cb == "function" && cb(that.globalData.userInfo)
                        var rawData = data.rawData;
                        var signature = data.signature;
                        var encryptedData = data.encryptedData;
                        var iv = data.iv;
                        wx.request({
                          url: "你的后台地址",
                          data: {
                              "code" : code,
                             " rawData" : rawData,
                              "signature" : signature,
                             " iv" : iv,
                              "encryptedData" : encryptedData
                          },
                          method: 'GET',
                          success: function(res){
                            // success
                            console.log(res)
                            console.log(rawData)
                          }
                        })
                      }
                    })
            }
          })
        }
      },
      globalData:{
        userInfo:null
      },
    })

    查看微信小程序端的 network 可能查看请求是否成功

    thinkphp后台代码

     	public function sendCode(){
     		$APPID = '################APPID';
     		$AppSecret = '#################';
     		$code = input('get.code');
     		$url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$APPID.'&secret='.$AppSecret.'&js_code='.$code.'&grant_type=authorization_code';
     		$arr = $this -> vegt($url);
    
     		$arr = json_decode($arr,true);
     		// $openid = $arr['openid'];
     		$session_key = $arr['session_key'];
    
     		// 数字签名校验
     		$signature = input('get.signature');
     		$signature2 = sha1($_GET['rawData'].$session_key);
     		if($signature != $signature2){
     			echo "数字签名失败";
     			die;
     		}
     		// 获取信息,对接口进行解密
     		Vendor("PHP.wxBizDataCrypt");
     		$encryptedData = $_GET['encryptedData'];
     		$iv = $_GET['iv'];
     		if(empty($signature) || empty($encryptedData) || empty($iv)){
     			echo "传递信息不全";
     		}
     		include_once "PHP/wxBizDataCrypt.php";
     		$pc = new \WXBizDataCrypt($APPID,$session_key);
     		$errCode = $pc->decryptData($encryptedData,$iv,$data);
     		if($errCode != 0){
     			echo "解密数据失败";
     			die;
     		}else {
     			$data = json_decode($data,true);
     			session('myinfo',$data);
     			$save['openid'] = $data['openId'];
     			$save['uname'] = $data['nickName'];
     			$save['unex'] = $data['gender'];
     			$save['address'] = $data['city'];
     			$save['time'] = time();
     			$map['openid'] = $data['openId'];
     			!empty($data['unionId']) && $save['unionId'] = $data['unionId'];
    
     			$res = \think\Db::name('user') -> where($map) -> find();
     			if(!$res){
    	 			$db = \think\Db::name('user') -> insert($save); 
    	 			if($db !== false){
    	 				echo "保存用户成功";
    	 			}else{
    	 				echo "error";
    	 			}
     			}else{
     				echo "用户已经存在";
     			}
     		}
    		//生成第三方3rd_session
    		$session3rd  = null;
    		$strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
    		$max = strlen($strPol)-1;
    		for($i=0;$i<16;$i++){
    		    $session3rd .=$strPol[rand(0,$max)];
    		}
    		// echo $session3rd;
     	}
     	public function vegt($url){
     		$info = curl_init();
    		curl_setopt($info,CURLOPT_RETURNTRANSFER,true);
    	    curl_setopt($info,CURLOPT_HEADER,0);
    	    curl_setopt($info,CURLOPT_NOBODY,0);
    	    curl_setopt($info,CURLOPT_SSL_VERIFYPEER, false);
    	    curl_setopt($info,CURLOPT_SSL_VERIFYHOST, false);
    	    curl_setopt($info,CURLOPT_URL,$url);
    	    $output= curl_exec($info);
    	    curl_close($info);
    	    return $output;
     	}

    官网有加解密的文件自行下载:  https://www.w3cschool.cn/weixinapp/weixinapp-signature.html
    写的不好的地方欢迎补充,这也是小编经过多处得出学习得出的
    展开全文
  • 微信小程序用户信息接口实现总结

    千次阅读 2018-01-12 17:34:37
    微信小程序用户信息接口实现总结官方文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/微信小程序登录流程(wx.login(OBJECT))1、调用接口获取登录凭证(code)注意: code–用户登录凭证(有效期五分钟),...
  • - 从公众号菜单或者转发分享等形式进入小程序的,如果需要获取用户的openid,仅仅在app.js执行登陆方法或者在配置的主页面调用登陆方法是不够的 - 如果公众号菜单挂载的页面是小程序的其他页面,是不会执行app.js...
  • 1、引入maven依赖 &lt;dependency&gt;  &lt;groupId&gt;org.bouncycastle&lt;/groupId&gt;  &lt;artifactId&gt;bcprov-jdk16&lt;/artifactId&.../dependency&am
  • 我们在开发微信小程序时经常需要获取用户微信用户名以及头像信息,微信提供了专门的接口API用于返回这些信息,但是与接口获取接口需要经过许多验证步骤,现在记录如下。 1、接口校验 只有通过微信平台验证的域名才能...
  • 首先我相信当各位大佬看到这个文章的时候,应该看过很多关于java解密微信小程序用户信息的方案了。但是总会遇到一些问题,比如代码复制过来,导入正确的包也会遇到的问题拉~,这里我就发布一个自己遇到的问题,希望...
  • 原文链接:https://www.cnblogs.com/cai-rd/p/6816849.html
  • Java后台获取小程序用户信息和登录

    千次阅读 2019-07-05 10:58:55
    登录请求体 public class MiniProgramLoginCommand { private String jsCode; private String encryptedData; private String iv; } ...private static final Logger logger = LoggerFactory.getLogger(XX...
  • 因公司业务需要,接触了微信小程序,在做微信自动登录的时候遇到了问题,头像昵称未能获取到,在网上找了一个服务器端解密的方法,只能获取到用户openid和unionid,仅供参考,如果有大佬知道获取昵称头像的方法,请...

空空如也

1 2 3 4 5 ... 20
收藏数 10,161
精华内容 4,064
关键字:

小程序用户信息