手机版

的实施 网微信小程序获取用户UnionID

时间:2021-08-20 来源:互联网 编辑:宝哥软件园 浏览:

前言:

在实际的项目开发中,我们经常会遇到统一账号的问题。如何保证同一会员或用户账号在不同终端或不同登录方式下是唯一的(方便用户信息管理)。这段时间一直有这样的需求。之前有个客户做了个微信小程序商城(在店主这边),现在要做会员购物端的小程序商城。首先,之前用户登录凭证都是使用微信openid做的唯一标识,现在客户需要让用户跳转到会员端的掌柜小程序。如果用户的微信之前是在掌柜端审批的,则不需要进行数据提交和审批操作,直接登录即可。所以,我们使用UnionID进行关联,下面是我们当前项目的基本流程(很难看)。

谈谈银联机制:

如果开发者有多个移动应用、网站应用和公共账号(包括小程序),可以用UnionID来区分用户的唯一性,因为只要是同一微信开放平台账号下的移动应用、网站应用和公共账号(包括小程序),用户的UnionID就是唯一的。换句话说,同一个微信开放平台下,同一个用户对不同的应用拥有相同的unionid。

官方UnionID机制详细描述:https://developers . weixin . QQ.com/mini program/dev/framework/open-ability/union-id . html

微信开放平台绑定小程序流程:

登录微信开放平台-管理中心-小程序-绑定小程序(直接使用微信官方地图)

微信小程序获取UnoinID的两种方式

调用接口wx.getUserInfo从encryptedData获取UnionID(推荐):

推荐理由:无需关注微信微信官方账号即可获得银联ID。

调用接口wx.getUserInfo .先决条件:允许用户授权获取用户信息!

开发人员在后台验证和解密开放数据;

为了保证用户信息,微信通过wx.getUserInfo接口对用户获取的敏感信息进行加密。加密方法是对称加密(后面会提到)。首先需要通过微信小程序登录流程获取用户的session_key,然后我们可以将获取的session _ key上报缓存,通过用户授权获取用户相关信息。以下是通过用户授权成功获取的用户信息:

基本流程图如下:

(encryptedData)加密数据的解密算法:

如果开发人员需要获取敏感数据,他们需要对接口返回的encryptedData进行对称解密。解密算法如下:

用于对称解密的算法是AES-128-CBC,数据用PKCS#7填充。对称解密的目标密文是Base64_Decode(encryptedData)。对称解密密钥aeskey=base64 _ decode(session _ key),AES key为16字节。对称解密算法的初始向量是Base64_Decode(iv),其中iv由数据接口返回。可惜微信没有为我们大提供解密算法演示。Net,这真的不算。最后根据网上的数据,我们还是匹配了符合微信对称加密的解密算法。

代码实现:

首先,关于session_key的获取,请看下面的wx.login code2Session模式

调用接口wx.getUserInfo获取encryptedData和iv(初始向量):

//用户已授权wx . getuser info({ success : function(RES){ console . log(RES);Var userInfo=res.userInfo //用户基本信息let session key=wx . getstorage ync(' session _ key ');//临时会话密钥,通过小程序登录过程获得//请求。net webapi解密接口wx . request({ URL : ' https://www . xxxtest.com/API/User _ oAuth/decryptiondata ',data : { session key : session key,加密数据:res。加密数据,iv3360res。iv},标头: { ' content-type ' : ' application/JSON '//default value },Success (res) {//解密返回的union idconsole . log(RES . data)} } })})。net webapi解密数据接口:

///摘要///解密微信对称加密数据,获取用户联合运营编号////summary///param name=' session key '临时会话秘钥/param///param name=' encryptedData '微信用户敏感加密数据/param ///param name='iv '解密初始向量/param///returns/returns[HttpGet]public IHttpActionResult decryptiondata(string sessionKey,string encryptedData,string iv){ try { var getunion id=decryptbysbytes(encryptedData,session key,iv);返回Json(新{代码=1,msg='解密成功,结果=getunion id });} catch(Exception ex){ return Json(new { code=0,msg='解密失败,原因:' ex .消息});} } #地区俄歇电子能谱对称解密///摘要///AES解密////summary///param name=' encryptedData '待解密的字节数组/param ///param name='sessionKey '解密密钥字节数组/param ///param name='iv'IV初始化向量字节数组/param ///param name='cipher '运算模式/param ///param name='padding '填充模式/param /返回/返回私有静态字符串decryptbysbytes(string encryptedData,string sessionKey,string iv) { try { //非空验证if(!字符串isnullorhitespace(encryptedData)!字符串isnullorhitespace(会话密钥)!字符串isnullorhitespace(iv)){ var decryptBytes=Convert .FromBase64String(encryptedData .替换(""、"");变量密钥字节=转换FromBase64String(sessionKey .替换(""、"");var ivBytes=转换FromBase64String(iv .替换(""、"");var AES=新AES密码服务提供商{ Key=密钥字节,IV=ivBytes,Mode=密码模式CBC,Padding=PaddingMode .PKCS7 };var outputBytes=aes .CreateDecryptor().TransformFinalBlock(解密器字节,0,解密器字节.长度);var decryptResult=编码. UTF8。GetString(output bytes);动态解密数据=JsonConvert .反序列化对象(decryptResult,new { unionid='' } .GetType());JJHL .实用程序。日志助手。写日志(' AES对称解密结果为:' DecryptResult);返回decrypt data . union id } else { return " ";} } catch(例外{ JJHL .实用程序。日志助手。写日志(' AES对称解密失败原因:' e。消息);返回"";} } #endregion所遇异常:参数使用转换FromBase64String转化时,提示"基地-64字符数组的无效长度"的问题:

原因:加密参数中的' '通过地址栏传过来时,后台会解析为空格(遇到的概率比较小)。

解决:最好的做法是使用加密数据。替换(""、" ")先将空格编码,然后再作为参数传给另一页面传递,这样页面在提取参数时才会将" "解码为加号。但这儿为了简化,将空格直接还原为' '或者是直接在后台将空格替换为" "加密数据.替换(""、"");

直接通过wx.login code2Session获取到该用户UnionID:

其实这个方式就是实现了小程序的登录流程,微信官方详细说明:

https://开发者。微信。QQ。com/mini program/dev/framework/open-ability/log in。超文本标记语言

优点:无需用户授权。

前提:用户需要关注该微信公众号。

小程序端调用接口wx.login获取密码凭证,在通过请求auth.code2Session接口获取用户信息(UnionID,openid,session_key会话密钥)两种方式:

1.直接通过wx.login请求到密码凭证后,在请求该地址获取用户信息:

GET:https://API。微信。QQ。com/SNS/jscode 2会话?appid=APPIDsecret=SECRETjs _ code=JSCODEgrant _ type=authorization _ code

详细说明请看微信官方文档(代码略):https://开发者。微信。QQ。com/mini program/dev/API-后端/open-API/log in/auth。代码2会话。超文本标记语言

2.通过请求wx.login获取密码凭证,在向net webapi后端请求代码2会话接口:

原因:因为我们需要对获取的用户信息做相关业务逻辑处理。

微信小程序端代码:

复制代码代码如下:/***封装用户承诺登录,通过密码凭证获取用户信息(UnionID,openid,session_key会话密钥)*/userLogin:函数(){var即=this//定义承诺方法返回新的承诺(函数(解析,拒绝){//调用登录接口wx。登录({ 0成功:函数(res) {if (res.code) {console.log('用户登录授权密码为:' RES . code);//调用请求请求传递密码凭证换取用户openid,并获取后台用户信息wx。请求({ URL : ' https://www。xxxx。XXX。API/User _ oAuth/GetUserInfo ',//后台请求用户信息方法数据: {代码: RES . code//code凭证},标头: { '内容类型' : '应用程序/JSON '//默认值},成功(RES){控制台。如果是,记录数据。errcode==0){//存入会议缓存中控制台。日志数据。开放id);//微信用户唯一标识控制台。日志数据。union id);//微信开发平台联合idconsole。日志数据。session _ key);//会话密钥//***注意****//注意:这里是直接把会话密钥缓存起来,在上面wx.getUserInfo会使用到wx.setStorageSync('session_key ',RES . data。session _ key);[代码]//承诺机制放回成功数据解析(研究数据);} else { reject(' error ');} },fail:函数拒绝;wx.showToast({ title: '系统错误}) },complete: ()={ } //complete接口执行后的回调函数,无论成功失败都会调用})} else { reject(' error ');}}})})}[/code .Net WebApi请求用户信息接口:

///摘要///获取用户信息////summary ///param name='code '信息数据密码凭证/param///returns/returns[Httpget]public IHttpActionResult GetUserInfo(字符串代码){ string AppSecret='小程序秘钥;字符串' AppId='应用程序标识;尝试{ //请求目标地址和参数(授权码授权类型,此处只需填写授权码)字符串'https://api.weixin.qq.com/sns/jscode2session?AppId=' AppId ' secret=' AppSecret ' js _ code=' code ' grant _ type=authorization _ code ';//序列化解析数据var Result=HttpGet(OauthUrl);返回Json(new { openid=Result.openid,errcode=Result.errcode,UnionID=Result.unionid,session _ key=result。session _ key });} catch(Exception ex){ return Json(new { err code=1,msg='获取用户信息失败前任。消息});} } ///摘要///请求代码2会话接口获取用户信息////summary////param name=' request dataandrol '目标地址和参数/param///returns/returns public WxOauthModle HttpGet(字符串RequestDataAnDrl){ Httpwebrequest=(Httpwebrequest)WebRequest .创建(RequestDataAnDrl);请求。方法=' GET '请求content TYPe=' text/html;charset=UTF-8 ';HttpWebResponse=(HttpWebResponse)请求GetResponse();Stream myResponseStream=响应GetResponseStream();StreamReader myStreamReader=新的流阅读器(我的响应流,编码).UTF8);string retString=myStreamReader .ReadToEnd();我的流媒体阅读器.close();我的支持流close();返回JsonConvert .反序列化对象wxoauthmodle(retString);}公共类WxOauthModle { ///summary ///用户唯一标识////摘要公共字符串openid { get设置;} ///摘要///会话秘钥////摘要公共字符串会话密钥{ get设置;} ///摘要///联立编号////摘要公共字符串unionid { get设置;} ///摘要///错误码////summary public int errcode { get;设置;} ///摘要///错误信息////摘要公共字符串errmsg { get设置;} }关于微信网页开发通过珠蚌机制解决用户在不同公众号,或在公众号、移动应用之间帐号统一问题:

详情说明请点击:https://www .JB 51。net/article/168982。html文件的后缀

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

版权声明:的实施 网微信小程序获取用户UnionID是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。