1.小程序中,通过调用微信API(wx.getUserInfo)可以或得到当前用户的微信信息(此处会弹出获取信息授权框),但是仅有用户的基本信息,比如头像、昵称、性别等,由于产品业务需要,需要得到当前用户的openid以及unionId(微信开放平台下用户的唯一标识),那如何获取?其实微信的API(wx.getUserInfo)中,已经给到这两组数据,只是为了安全,没有在明文中显示,而是在wx.getUserInfo方法的结果参数encryptedData中,只要将参数encryptedData进行解密,就可以得到想要的数据,官方没有给到Java的解密过程,下面是Java版的解密过程:
packagecom.boboqi.wx.userinfo;importjava.io.UnsupportedEncodingException;importjava.security.AlgorithmParameters;importjava.security.InvalidAlgorithmParameterException;importjava.security.InvalidKeyException;importjava.security.NoSuchAlgorithmException;importjava.security.NoSuchProviderException;importjava.security.Security;importjava.security.spec.InvalidParameterSpecException;importjava.util.HashMap;importjava.util.Map;importjavax.crypto.BadPaddingException;importjavax.crypto.Cipher;importjavax.crypto.IllegalBlockSizeException;importjavax.crypto.NoSuchPaddingException;importjavax.crypto.spec.IvParameterSpec;importjavax.crypto.spec.SecretKeySpec;importnet.sf.json.JSONObject;importorg.bouncycastle.jce.provider.BouncyCastleProvider;importorg.bouncycastle.util.Arrays;importorg.codehaus.xfire.util.Base64;importcom.boboqi.wx.common.RemoteInterfaceAddress;importcom.boboqi.wx.util.HttpsClientUtil;/***微信小程序信息获取*@authorsonghn*/publicclassWXAppletUserInfo{/***获取微信小程序session_key和openid*/publicJSONObjectgetSessionKeyAndOropenid(Stringcode){//微信端登录code值StringwxCodecode;StringrequestUrlWxappConfig.GETSESSIONKEYOROPENID;MapString,StringrequestUrlParamnewHashMapString,String();requestUrlParam.put("appid",RemoteInterfaceAddress.AppletAPPID);requestUrlParam.put("secret",RemoteInterfaceAddress.AppletAppSecret);requestUrlParam.put("js_code",wxCode);requestUrlParam.put("grant_type","authorization_code");JSONObjectjsonObjectHttpsClientUtil.getInstance().sendGetRequest(requestUrl,requestUrlParam);returnjsonObject;}/***解密用户敏感数据获取用户信息*@paramsessionKey数据进行加密签名的密钥*@paramencryptedData包括敏感数据在内的完整用户信息的加密数据*@paramiv加密算法的初始向量*/publicJSONObjectgetUserInfo(StringencryptedData,StringsessionKey,Stringiv){//被加密的数据byte[]dataByteBase64.decode(encryptedData);//加密秘钥byte[]keyByteBase64.decode(sessionKey);//偏移量byte[]ivByteBase64.decode(iv);try{//如果密钥不足16位,那么就补足.这个if中的内容很重要intbase16;if(keyByte.length%base!0){intgroupskeyByte.length/base+(keyByte.length%base!0?1:0);byte[]tempnewbyte[groups*base];Arrays.fill(temp,(byte)0);System.arraycopy(keyByte,0,temp,0,keyByte.length);keyBytetemp;}//初始化Security.addProvider(newBouncyCastleProvider());CiphercipherCipher.getInstance("AES/CBC/PKCS7Padding","BC");SecretKeySpecspecnewSecretKeySpec(keyByte,"AES");AlgorithmParametersparametersAlgorithmParameters.getInstance("AES");parameters.init(newIvParameterSpec(ivByte));cipher.init(Cipher.DECRYPT_MODE,spec,parameters);//初始化byte[]resultBytecipher.doFinal(dataByte);if(null!resultByteresultByte.length0){StringresultnewString(resultByte,"UTF-8");returnJSONObject.fromObject(result);}}catch(NoSuchProviderExceptione){e.printStackTrace();}returnnull;}}2.附:微信小程序加密数据解密算法
3.接口如果涉及敏感数据(如wx.getUserInfo当中的openId和unionId),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据(encryptedData)进行对称解密。解密算法如下:对称解密使用的算法为AES-128-CBC,数据采用PKCS#7填充。对称解密的目标密文为Base64_Decode(encryptedData)。对称解密秘钥aeskeyBase64_Decode(session_key),aeskey是16字节。对称解密算法初始向量为Base64_Decode(iv),其中iv由数据接口返回。另外,为了应用能校验数据的有效性,我们会在敏感数据加上数据水印(watermark)
微信小程序获取用户信息解密encryptedData-微信小程序是盗人信息的-微信小程序有病毒吗
浏览量:1882
时间:
来源:尹东
版权声明
即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。
最新资讯
-

即速应用,赋能企业玩转微信小程序智慧经营
作为国内领军的智慧商业经营服务商,即速应用始终秉承“让每个企业都拥有自己的智慧店铺”的愿景,持续赋能更多企业玩转智慧经营。即速应用旗下拥有“小程序搭建工具-即速应用”、“私域流量专家-即客云”等产品,帮助商家打通互联网全生态营销闭环。 -

即客云2.0重磅更新,让微信小程序运营更简单!
即客云作为一款基于企业微信的第三方工具,现从多维度提供超过30种功能,自上线以来,已服务多家企业,受到一致好评。近期,我们根据客户反馈和市场调研正式推出升级版 即客云2.0!更新了私域运营SOP,群日历功能,批量拓客,客户雷达,消息推送,个人欢迎语,帮助企业更好运用企业微信;同时提升了社群运营工作标准化,提升运营效率,帮助企业实现客户增长,玩转私域流量。 -

零代码 + AI 双轮驱动|即速应用解锁人工智能小程序开发新范式
无需代码、无需 AI 算法功底,普通人也能快速搭建智能小程序。即速应用将人工智能与零代码开发深度融合,推出 AI 智能生成能力,用户通过自然语言描述需求,AI 自动生成小程序页面、功能模块与后台配置,覆盖商城、预约、同城、社区团购等全场景。平台内置 AI 智能推荐、智能客服、用户画像分析等能力,一键对接微信生态,打通视频号、企业微信、短信跳转,帮企业快速落地 AI 应用,抢占智慧经营先机,让每家企业都拥有 AI 驱动的智慧店铺。










