前言
微信小程序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