前言

微信小程序API文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html

在实际的小程序开发中,往往需要用户授权登陆并获取用户的数据,快速对接用户系统。

openId: 用户在当前小程序的唯一标识

unionId : 如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionId是相同的。详情登录微信开放平台(open.weixin.qq.com) 。

在微信小程序开发中,unionId等敏感数据则被加密在encryptedData,于是需要以下流程来解密敏感数据,从而获取unionId等信息。

流程

1、(客户端)微信小程序客户端调用 wx.login()接口获取登录凭证(code)

//1、调用微信登录接口,获取code

wx.login({

success: function (r) {

var code = r.code;//登录凭证

if (code) {

//2、调用获取用户信息接口

//...

} else {

console.log('获取用户登录态失败!' + r.errMsg)

}

},

fail: function () {

callback(false)

}

})

2、(客户端)微信小程序客户端调用 wx.getUserInfo()接口获取 用户基本信息、encryptedData(用户敏感信息加密数据) 和 iv(加密算法的初始向量 )

//1、调用微信登录接口,获取code

wx.login({

success: function (r) {

var code = r.code;//登录凭证

if (code) {

//2、调用获取用户信息接口

wx.getUserInfo({

success: function (res) {

console.log({encryptedData: res.encryptedData, iv: res.iv, code: code})

//3.解密用户信息 获取unionId

//...

},

fail: function () {

console.log('获取用户信息失败')

}

})

} else {

console.log('获取用户登录态失败!' + r.errMsg)

}

},

fail: function () {

callback(false)

}

})

3、(客户端)将前面获取到的 code 、encryptedData、iv发送到自己的服务器(开发者服务器),通过自己的服务器(开发者服务器)解密获取信息

//1、调用微信登录接口,获取code

wx.login({

success: function (r) {

var code = r.code;//登录凭证

if (code) {

//2、调用获取用户信息接口

wx.getUserInfo({

success: function (res) {

console.log({encryptedData: res.encryptedData, iv: res.iv, code: code})

//3.请求自己的服务器,解密用户信息 获取unionId等加密信息

wx.request({

url: 'https://xxxx.com/wxsp/decodeUserInfo',//自己的服务接口地址

method: 'post',

header: {

'content-type': 'application/x-www-form-urlencoded'

},

data: {encryptedData: res.encryptedData, iv: res.iv, code: code},

success: function (data) {

//4.解密成功后 获取自己服务器返回的结果

if (data.data.status == 1) {

var userInfo_ = data.data.userInfo;

console.log(userInfo_)

} else {

console.log('解密失败')

}

},

fail: function () {

console.log('系统错误')

}

})

},

fail: function () {

console.log('获取用户信息失败')

}

})

} else {

console.log('获取用户登录态失败!' + r.errMsg)

}

},

fail: function () {

console.log('登陆失败')

}

})

4、(服务端 php)自己的服务器发送code到微信服务器获取openid(用户唯一标识)和session_key(会话密钥),最后将encryptedData、iv、session_key通过AES解密获取到用户敏感数据

解密需要 引用的文件官网可以下载

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html

/**

* 解密用户敏感数据

*

* @param encryptedData 明文,加密数据

* @param iv 加密算法的初始向量

* @param code 用户允许登录后,回调内容会带上 code(有效期五分钟),开发者需要将 code 发送到开发者服务器后台,使用code 换取 session_key api,将 code 换成 openid 和 session_key

* @return

*/

$code = input('get.code');

$appid = 'wx8c9d056ead85efd7';

$secret = '849fbc7dff5c949c2a9707d9a20df7a8';

$encryptedData = input('encryptedData');

$iv = input('iv');

if($code != ''){

$url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$appid.'&secret='.$secret.'&js_code='.$code.'&grant_type=authorization_code';

$html = file_get_contents($url);

$obj = json_decode($html);

if(isset($obj->errcode)){

// 获取用户信息失败

return $html;

}else{

$arrlist['openid'] = $obj->openid;

$arrlist['session_key'] = $obj->session_key;

/**

* 解密用户敏感数据

*

* @param encryptedData 明文,加密数据

* @param iv 加密算法的初始向量

* @param code 用户允许登录后,回调内容会带上 code(有效期五分钟),开发者需要将 code 发送到开发者服务器后台,使用code 换取 session_key api,将 code 换成 openid 和 session_key

* @return

*/

include_once "wxBizDataCrypt.php";

$pc = new \WXBizDataCrypt( $appid, $arrlist['session_key']);

$errCode = $pc->decryptData($encryptedData, $iv, $data );

$data = json_decode($data);//$data 包含用户所有基本信息

$arrlist['time'] = time();

$arrlist['city'] = $data->city;//城市-市

$arrlist['country'] = $data->country;//国家

$arrlist['gender'] = $data->gender;//性别

$arrlist['language'] = $data->language;//语言

$arrlist['nickName'] = $data->nickName;//昵称

$arrlist['avatarUrl'] = $data->avatarUrl;//头像

$arrlist['province'] = $data->province;//城市-省份

//判断获取信息是否成功

if ($errCode != 0) {

return $errCode;

}

//存入数据库

$user = db('xw_userinfo');

//判断是否已存在

$list = $user->where('openid',$arrlist['openid'])->find();

if(empty($list)){

//数据不存在 则存入数据

$user->insert($arrlist);

}else{

//数据存在 则更新数据

$where['openid'] = $arrlist['openid'];

$user->where($where)->update($arrlist);

}

return $html;

}

}else{

return json_encode('code为空');

}

总结

好了,总算完成数据解密了

qq:1366860941

php获取微信uninoid_PHP微信小程序之获取并解密用户数据获取openId和unionId,,小程序登陆...相关推荐

  1. PHP微信小程序之获取并解密用户数据获取openId和unionId

    前言 微信小程序API文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html 在实际的小程序开发中,往往需要用户授权登陆并获取用 ...

  2. 微信小程序中的用户ID(openid和unionid)

    前沿 做过微信开发的同学,多多少少都会涉及到用户的唯一标示的问题.由于微信牢牢把控着用户的信息,因此当你需要在微信平台中获取用户的标示信息,必然要通过微信的平台接口来获取(当然,你可以通过你自己的平台 ...

  3. 微信小程序- css相比,wxss区别?小程序关联微信公众号如何确定用户的唯一性?微信小程序中的用户ID(openid和unionid)

    1 与css相比, wxss区别? 1) 响应式长度 rpx 2) 样式导入 3) 小程序不支持通配符* *{ width:100rpx; height:100rpx; } 2 小程序关联微信公众号如 ...

  4. 微信小程序无法获取UnionId的情况及处理

    问题背景:做了微信小程序,一切都还正常,但是最后体验版放出去时,却发现很多用户无法绑定用户,后台返回:参数非法.经过多方排查,发现是微信拿到的code请求返回的数据里没有UnionId,也就是接口返回 ...

  5. php获取微信uninoid_微信小程序获取openid和unionid方法

    openid微信公众平台和小程序都有,不同用户在同一公众平台或是小程序中openid可以用于区别不同用户,遗憾的是openid只是应用于当前公众号或小程序. unionid微信公众平台和小程序都有,同 ...

  6. Java-(二)微信小程序授权获取用户信息和手机号码

    第一篇我们已经知道了微信小程序怎么授权登录获取用户信息. openId 和 unionId .下面将高速告诉大家,微信小程序如何授权获取用户信息和手机号码. 微信官方文档:https://develo ...

  7. java登入ajxs_微信小程序之获取并解密用户数据(获取openid,nickName等)

    本文主要总结微信小程序通过后台请求访问微信用户信息 创建一个微信小程序工程(自行百度) 微信小程序index.js代码 //index.js //获取应用实例 const app = getApp() ...

  8. 2023年微信小程序授权获取头像最新形式——头像昵称填写

    官方公告调整背景 小程序用户头像昵称获取规则调整公告 在实践中发现有部分小程序,在用户刚打开小程序时就要求收集用户的微信昵称头像,或者在支付前等不合理路径上要求授权.如果用户拒绝授权,则无法使用小程序 ...

  9. 微信小程序授权获取头像昵称的最新形式——头像昵称填写

    微信小程序授权用户信息,不知道有没有人像我一样,从wx.getUserInfo到wx.getUserProfile再到头像昵称填写获取用户头像昵称全部尝试了一遍,怪就怪自己一开始没仔细看官方文档,没注 ...

最新文章

  1. tomact+apache实现web网页动静结合
  2. 设计模式之控制反转和依赖注入的使用小结
  3. 数据库服务器(SQL SERVER)的安全设置
  4. Linux下安装Redis(三分钟搞定)
  5. python123数值运算_python123中 Hello World的条件输出 和数值运算
  6. java处理表单变量_Java自学之SpringMVC:接收表单数据
  7. 第十七章 特殊成员_使用typedef简化函数指针的声明
  8. iocomp控件 Crack V512-sp6
  9. 7.26 1004度度熊的午饭时光 百度之星题解
  10. 谷歌最新版本浏览器如何兼容flash插件
  11. Delphi中使用Imageen控件将图像文件转换成PDF
  12. PCB正片与负片之分以及实际使用建议
  13. 网站优化相关理论概述
  14. GTX 1070Ti正式发布!iGame Vulcan X家族再添新成员
  15. VR全景航拍补天教程
  16. 大数据Hive学习案例(2)——基于汽车销售的日志数据分析
  17. 如何发表高质量的学术论文(硕士、博士均有参考价值)
  18. Reso | mysql、SQLServer、Oracle的区别
  19. 904-线程池项目死锁问题分析
  20. 4--STM32RCC时钟树

热门文章

  1. DH密钥交换在实践中的安全问题
  2. 转-iOS- GPUImage README.md
  3. 涨姿势!3D游戏里的男女性角色是这样建模出来的
  4. 六度分离(Six Degrees of Separation)理论
  5. 训练好的深度学习模型原来这样部署的!(干货满满,收藏慢慢看)
  6. android手机接投影仪,手机投屏到投影仪的几种方法
  7. C解析8583报文55域
  8. SQL Server 的 count(1) 是什么意思呢
  9. 2022年前端面试题整理,持续更新中
  10. 商务与经济统计 笔记