1.首先,简单说下我遇到的问题是我们的程序调用微信小程序得到openid,然后通过openID得到用户的唯一标识,用户得以登录,然而,当我们调用微信公众号也同样的到openid,同一以用户两个不同的openid,不能区分是否为同一用户,然后发现无论调用微信小程序还是微信公众号同一个用户的到unionid是相同的,所以我们就用unionid来区分是否为同一用户。
2.UnionID机制说明:
3.如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。
4.1、对于小程序获取unionid:
5.我们来看下用户登录小程序时的时序图:
6.1、(JAVA后台)向微信服务器发起请求附带js_code、appId、secretkey和grant_type参数,以换取用户的openid和session_key(会话密钥)
7.用code(前端调用微信接口得到)换取session_key,openid
8.这是一个HTTPS接口,开发者服务器使用登录凭证code获取session_key和openid。其中session_key是对用户数据进行加密签名的密钥。为了自身应用安全,session_key不应该在网络上传输。后台解密用到。
9.接口地址:
10.https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
11.请求参数说明:
12.1参数是否必须说明2appid是应用唯一标识,在微信开放平台提交应用审核通过后获得3secret是应用密钥AppSecret,在微信开放平台提交应用审核通过后获得4js_code是填写第一步获取的code参数5grant_type是填authorization_code
13.MapString,Stringparams=newHashMapString,String();params.put(“appid”,APPID);params.put(“secret”,SECRET);params.put(“js_code”,“js_Code”);params.put(“grant_type”,“authorization_code”);Stringopenidtoken=HttpClientUtil.invokeGet(https://api.weixin.qq.com/sns/jscode2session,proxy,params,utf-8,60000);
14.返回参数:
15.参数说明openid用户唯一标识session_key会话密钥
2、AES解密核心代码:(包含用户敏感信息的encryptedData信息由前端提供,后台负责解密数据,得到unionId)publicbyte[]decrypt(byte[]content,byte[]keyByte,byte[]ivByte)throwsInvalidAlgorithmParameterException{initialize();try{Ciphercipher=Cipher.getInstance("AES/CBC/PKCS7Padding");KeysKeySpec=newSecretKeySpec(keyByte,"AES");cipher.init(Cipher.DECRYPT_MODE,sKeySpec,generateIV(ivByte));//初始化byte[]result=cipher.doFinal(content);returnresult;}catch(NoSuchAlgorithmExceptione){e.printStackTrace();}catch(NoSuchPaddingExceptione){e.printStackTrace();}catch(InvalidKeyExceptione){e.printStackTrace();}catch(IllegalBlockSizeExceptione){e.printStackTrace();}catch(BadPaddingExceptione){e.printStackTrace();}catch(NoSuchProviderExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}16.3、解密用户信息:
byte[]resultByte=Aes.decrypt(Base64.decodeBase64(encryptedData),Base64.decodeBase64(session_key),Base64.decodeBase64(ivByte));if(null!=resultByte&&resultByte.length0){StringuserInfo=newString(resultByte,"UTF-8");//结果转jsonJsonObjectjsonobject=null;try{JsonParserpar=newJsonParser();JsonElementjsonelement=par.parse(userInfo);jsonobject=jsonelement.getAsJsonObject();}catch(Exceptione){。。。。。。}//获取unionidunionID=jsonobject.get("unionId").getAsString()+"";}17.注:String和字节数组之间的转换:
18.通过Base64.decodeBase64(String)就可以得到字节数组。
19.通过StringuserInfo=newString(resultByte,“UTF-8”);就得到了想要的String
20.4、解密得到的结果:加密过程微信服务器完成,解密过程在我们的服务器完成,即由encryptData得到如下数据:{“openId”:“OPENID”,“nickName”:“NICKNAME”,“gender”:GENDER,“city”:“CITY”,“province”:“PROVINCE”,“country”:“COUNTRY”,“avatarUrl”:“AVATARURL”,“unionId”:“UNIONID”,“watermark”:{“appid”:“APPID”,“timestamp”:TIMESTAMP}}5、把得到的unionId与用户的唯一标识绑定在一起,通过标识就可以进行下一步操作,系统不同,操作不同,这里不再详谈。
21.2、对于公众号获取unionId:
22.1、先拿code获取网页授权access_token以及openid
23.接口地址:
24.https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=JSCODE&grant_type=authorization_code
25.请求参数说明:
26.1参数是否必须说明2appid是应用唯一标识,在微信开放平台提交应用审核通过后获得3secret是应用密钥AppSecret,在微信开放平台提交应用审核通过后获得4code是填写第一步获取的code参数5grant_type是填authorization_code
27.MapString,Stringparams=newHashMapString,String();params.put(“appid”,APPID);params.put(“secret”,SECRET);params.put(“code”,“Code”);params.put(“grant_type”,“authorization_code”);Stringopenidtoken=HttpClientUtil.invokeGet(https://api.weixin.qq.com/sns/oauth2/access_token,proxy,params,utf-8,60000);
28.返回参数:{“access_token”:“ACCESS_TOKEN”,“expires_in”:7200,“refresh_token”:“REFRESH_TOKEN”,“openid”:“OPENID”,“scope”:“SCOPE”}参数说明access_token接口调用凭证expires_inaccess_token接口调用凭证超时时间,单位(秒)refresh_token用户刷新access_tokenopenid授权用户唯一标识scope用户授权的作用域,使用逗号(,)分隔.
29.2、可以看到除access_token外,还可以获得openid,用拿到的access_token和openid获取unionID
30.接口地址:
31.https://api.weixin.qq.com/sns/userinfo?appid=APPID&secret=SECRET&code=JSCODE&grant_type=authorization_code
32.请求参数说明:
33.1参数是否必须说明2access_token是接口调用凭证3openid是授权用户唯一标识4lang否一般为固定值zh_CN
34.MapString,Stringparams=newHashMapString,String();params.put(“access_token”,access_token);params.put(“openid”,openId);params.put(“lang”,“zh_CN”);Stringopenidtoken=HttpClientUtil.invokeGet(https://api.weixin.qq.com/sns/userinfo,proxy,params,utf-8,60000);
35.在返回值里就包含有用户的unionID。这里不再详述。
36.原文:https://blog.csdn.net/dingjianmin/article/details/75137934?utm_source=copy
微信公众号关联不了小程序-微信小程序与微信公众号同一用户登录问题-微信关联小程序
浏览量:2819
时间:
来源:zlzhaoe
版权声明
即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。
最新资讯
-

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

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

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










