微信小程序> 微信小程序与微信公众号同一用户登录问题-微信公众号与小程序开发区别-微信小程序公众号开发

微信小程序与微信公众号同一用户登录问题-微信公众号与小程序开发区别-微信小程序公众号开发

浏览量:2136 时间: 来源:powerfuler
微信小程序与微信公众号同一用户登录问题最近在做微信小程序与微信公众号登录合并的接口。整理相关资料以及个人认识的心得写了这篇文章与大家一起分享。首先,简单说下我遇到的问题是我们的程序调用微信小程序得到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。这里不再详述。每天努力一点,每天都在进步。

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

最新资讯

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎