一、微信小程序端
1).调用wx.login获取 code 。
2).调用wx.getUserInfo获取签名所需的 rawData , signatrue , encryptData 。
3).发起请求将获取的数据发送的后台。
//点击按钮-弹出授权
getUserInfo: function(e) {
//登录-获取code
wx.login({
success: res => {
var code = res.code;
//获取授权信息
if (e.detail.errMsg == "getUserInfo:ok") {
//得到rawData, signatrue, encryptData,iv
//并-检测是否注册
var rawData = e.detail.rawData;
var signature = e.detail.signature;
var encryptedData = e.detail.encryptedData;
var iv = e.detail.iv;
wx.request({
url: '你自己的后台地址',
data: {
"code": code,
"rawData": rawData,
"signature": signature,
'iv': iv,
'encryptedData': encryptedData
},
method: 'post',
success: function (info) {
console.log(info);
}
})
} else {
console.log('用户授权失败!');
}
}
})
},
二、后台服务端
需下载微信官方解密文件。 —— [ 用户数据的签名验证和加解密 ]
1.解压后会出现不同语言的文件包,这里用的是PHP,将文件夹放到vendor目录下。
2.根据登陆凭证 code 获取 session_key 和 openid。
3.数据签名校验。
4.数据解密。
5.生成第三方3rd_session并返回微信小程序端。
/*
*登录(调用wx.login获取)
* @param $code string
* @param $rawData string
* @param $signatrue string
* @param $encryptedData string
* @param $iv string
*/
public function login()
{
$post = input('post.');
if (empty($post['code']) || empty($post['iv']) || empty($post['rawData']) || empty($post['signature']) || empty($post['encryptedData'])) {
return Sendmsg('301','Parameter is wrong','参数有误');
}
$code = $post['code'];
$iv = $post['iv'];
$rawData = $post['rawData'];
$signature = $post['signature'];
$encryptedData = $post['encryptedData'];
//从表中获取appid与秘钥
$core = db::table('ot_fa_wx_core')->where('id', 1)->field('wxapp_appid,wxapp_appsecret')->find();
$appid = $core['wxapp_appid'];
$appsecret = $core['wxapp_appsecret'];
//请求链接
$url = "https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$appsecret&js_code=$code&grant_type=authorization_code";
$res_data = json_decode($this->curl_get($url), true);
//是否成功获取到数据
if (!isset($res_data['openid'])) {
return Sendmsg('302','获取openid失败');
}
$openid = $res_data['openid'];
$session_key = $res_data['session_key'];
// =================== 签名校验 + 解密数据包 ==================
// 1、数据签名校验
$signature2 = sha1($rawData . $session_key);
if ($signature != $signature2) {
return Sendmsg('303','数据签名验证失败!');
}
// 2、解密数据包
//加载解密文件,在官方有下载
import("wxapp_auth_verify.wxBizDataCrypt",EXTEND_PATH);
$pc = new \WXBizDataCrypt($appid, $session_key);
$errCode = $pc->decryptData($encryptedData, $iv, $data); //其中$data包含用户的所有数据
if ($errCode == 0) {
//解密所得的用户信息
$data = json_decode($data,true);
$user_info = $this->get_user_info($data['openId']);
return Sendmsg('200','OK',$user_info);
} else {
//打印解密失败信息
return Sendmsg('400','Error',$errCode);
}
// =================== 签名校验 + 解密数据包 ==================
}
//根据openID获取用户信息
public function get_user_info($openId)
{
$is_have = db::table('ot_fa_wx_user')->where('openid_wxapp',$openId)->find();
if ($is_have) {
return $is_have;
} else {
//如果不存在该用户信息 -- 去注册
return false;
}
}
// CURL实现的get方法请求
protected function curl_get($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) CarbonForum/5.0");
curl_setopt($ch, CURLOPT_URL, $url);
$response = curl_exec($ch);
curl_close($ch);
if(empty($response)){
return false;
}else{
return $response;
}
}
三、其他