微信小程序实现登录功能php后台,PHP后台实现用微信小程序登录

一、微信小程序端

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;

}

}

三、其他

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值