微信小程序与微信公众号同一用户登录问题最近在做微信小程序与微信公众号登录合并的接口。整理相关资料以及个人认识的心得写了这篇文章与大家一起分享。首先,简单说下我遇到的问题是我们的程序调用微信小程序得到openid,然后通过openID得到用户的唯一标识,用户得以登录,然而,当我们调用微信公众号也同样的到openid,同一以用户两个不同的openid,不能区分是否为同一用户,然后发现无论调用微信小程序还是微信公众号同一个用户的到unionid是相同的,所以我们就用unionid来区分是否为同一用户。UnionID机制说明:如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。1、对于小程序获取unionid:1.我们来看下用户登录小程序时的时序图:
1、(JAVA后台)向微信服务器发起请求附带js_code、appId、secretkey和grant_type参数,以换取用户的openid和session_key(会话密钥)用code(前端调用微信接口得到)换取session_key,openid这是一个HTTPS接口,开发者服务器使用登录凭证code获取session_key和openid。其中session_key是对用户数据进行加密签名的密钥。为了自身应用安全,session_key不应该在网络上传输。后台解密用到。接口地址:https://api.weixin.qq.com/sns/jscode2session?appidAPPIDsecretSECRETjs_codeJSCODEgrant_typeauthorization_code请求参数说明:1参数是否必须说明2appid是应用唯一标识,在微信开放平台提交应用审核通过后获得3secret是应用密钥AppSecret,在微信开放平台提交应用审核通过后获得4js_code是填写第一步获取的code参数5grant_type是填authorization_codeMapString,StringparamsnewHashMapString,String();params.put("appid",APPID);params.put("secret",SECRET);params.put("js_code","js_Code");params.put("grant_type","authorization_code");StringopenidtokenHttpClientUtil.invokeGet(https://api.weixin.qq.com/sns/jscode2session,proxy,params,utf-8,60000);返回参数:参数说明openid用户唯一标识session_key会话密钥2、AES解密核心代码:(包含用户敏感信息的encryptedData信息由前端提供,后台负责解密数据,得到unionId)publicbyte[]decrypt(byte[]content,byte[]keyByte,byte[]ivByte)throwsInvalidAlgorithmParameterException{initialize();try{CiphercipherCipher.getInstance("AES/CBC/PKCS7Padding");KeysKeySpecnewSecretKeySpec(keyByte,"AES");cipher.init(Cipher.DECRYPT_MODE,sKeySpec,generateIV(ivByte));//初始化byte[]resultcipher.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();}3、解密用户信息:byte[]resultByteAes.decrypt(Base64.decodeBase64(encryptedData),Base64.decodeBase64(session_key),Base64.decodeBase64(ivByte));if(null!resultByteresultByte.length0){StringuserInfonewString(resultByte,"UTF-8");//结果转jsonJsonObjectjsonobjectnull;try{JsonParserparnewJsonParser();JsonElementjsonelementpar.parse(userInfo);jsonobjectjsonelement.getAsJsonObject();}catch(Exceptione){。。。。。。}//获取unionidunionIDjsonobject.get("unionId").getAsString()+"";}注:String和字节数组之间的转换:通过Base64.decodeBase64(String)就可以得到字节数组。通过StringuserInfonewString(resultByte,"UTF-8");就得到了想要的String4、解密得到的结果:加密过程微信服务器完成,解密过程在我们的服务器完成,即由encryptData得到如下数据:{"openId":"OPENID","nickName":"NICKNAME","gender":GENDER,"city":"CITY","province":"PROVINCE","country":"COUNTRY","avatarUrl":"AVATARURL","unionId":"UNIONID","watermark":{"appid":"APPID","timestamp":TIMESTAMP}}5、把得到的unionId与用户的唯一标识绑定在一起,通过标识就可以进行下一步操作,系统不同,操作不同,这里不再详谈。2、对于公众号获取unionId:1、先拿code获取网页授权access_token以及openid接口地址:https://api.weixin.qq.com/sns/oauth2/access_token?appidAPPIDsecretSECRETcodeJSCODEgrant_typeauthorization_code请求参数说明:1参数是否必须说明2appid是应用唯一标识,在微信开放平台提交应用审核通过后获得3secret是应用密钥AppSecret,在微信开放平台提交应用审核通过后获得4code是填写第一步获取的code参数5grant_type是填authorization_codeMapString,StringparamsnewHashMapString,String();params.put("appid",APPID);params.put("secret",SECRET);params.put("code","Code");params.put("grant_type","authorization_code");StringopenidtokenHttpClientUtil.invokeGet(https://api.weixin.qq.com/sns/oauth2/access_token,proxy,params,utf-8,60000);返回参数:{"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用户授权的作用域,使用逗号(,)分隔.2、可以看到除access_token外,还可以获得openid,用拿到的access_token和openid获取unionID接口地址:https://api.weixin.qq.com/sns/userinfo?appidAPPIDsecretSECRETcodeJSCODEgrant_typeauthorization_code请求参数说明:1参数是否必须说明2access_token是接口调用凭证3openid是授权用户唯一标识4lang否一般为固定值zh_CNMapString,StringparamsnewHashMapString,String();params.put("access_token",access_token);params.put("openid",openId);params.put("lang","zh_CN");StringopenidtokenHttpClientUtil.invokeGet(https://api.weixin.qq.com/sns/userinfo,proxy,params,utf-8,60000);在返回值里就包含有用户的unionID。这里不再详述。每天努力一点,每天都在进步。
微信小程序与微信公众号同一用户登录问题-微信公众号与小程序开发区别-微信小程序公众号开发
浏览量:2136
时间:
来源:powerfuler
版权声明
即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。
最新资讯
-

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

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

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










