业务流程图
api-login.jpg
小程序登录流程.png
小程序开发工具新建快速启动模版
小程序.jpg
如要配置本地环境,需勾选不校验合法域名
小程序登录2.jpg
添加配置文件 config.js
/**
* 小程序配置文件
*/
// 此处主机域名修改成腾讯云解决方案分配的域名
var host = 'http://www.parkserver.com';
var config = {
// 下面的地址配合云端 Demo 工作
service: {
host,
// 登录地址,用于建立会话
loginUrl: `${host}/api/login/index`,
}
};
module.exports = config;
app.js导入配置文件
//app.js
var config = require('./config')
- 调用登录接口返回临时票据code
- 调用登陆接口提交后台登录凭证校验接口
// 登录
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
var code = res.code;
if (res.code) {
wx.getUserInfo({
success: function(res) {
var userInfo = res.userInfo;
var rawData = res.rawData;//不包括敏感信息的原始数据字符串,用于计算签名。
var signature = res.signature;//使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息,参考文档 signature。
var encryptedData = res.encryptedData;//包括敏感数据在内的完整用户信息的加密数据
var iv = res.iv;//加密算法的初始向量
wx.request({
url: config.service.loginUrl,
data: {
"code":code,
"rawData":rawData,
"signature":signature,
'encryptedData': encryptedData,
'iv': iv
},
succuess: function (info) {
console.log("info");
console.log(info);
}
});
}
});
}
}
});
后端php文件
<?php
return [
'template' => [
// 模板文件名分隔符
'view_depr' => '_',
'taglib_pre_load' => 'app\common\taglib\Clt',
],
#微信小程序配置
'wechat' => [
'wx_appid'=>'wx9d34cf6e8977f3a4',
'wx_appsec'=>'b46bb6e915a3b00cdcec0c3b4db11fb7',
#微信登录凭证校验接口
'wx_loginurl'=>'https://api.weixin.qq.com/sns/jscode2session'
]
];
public function index() {
#微信小程序登录 临时code
$code = mz_checkfield('code', true, '缺少code');
$appid = $this->config['wx_appid'];
$appsec = $this->config['wx_appsec'];
$url = $this->config['wx_loginurl'];
$params = array(
'appid' => $appid,
'secret' => $appsec,
'js_code' => $code,
'grant_type' => 'authorization_code'
);
#通过微信登录校验凭证获取 session_key 以及 openid
$arr = mz_http_send($url,$params,'post');
$arr = json_decode($arr, true);
if (isset($arr['errcode']) && !empty($arr['errcode'])) {
#获取失败
return mz_apierror($arr['errmsg']);
}
$openid = $arr['openid'];
$session_key = $arr['session_key'];
# 数据签名校验
$signature = input("signature");
$signature2 = sha1($_GET['rawData'] . $session_key); //别用框架自带的input,会过滤掉必要的数据
if ($signature != $signature2) {
return mz_apierror("数据签名校验失败");
}
#开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密
$encryptedData = $_GET['encryptedData'];
$iv = $_GET['iv'];
#导入微信解密算法SDK
\think\Loader::import('wxBizDataCrypt.wxBizDataCrypt');
$pc = new \WXBizDataCrypt($appid, $session_key);
$errCode = $pc->decryptData($encryptedData, $iv, $data); //其中$data包含用户的所有数据
if ($errCode != 0) {
return mz_apierror("获取失败");
}
#数据库操作 存储用户信息 $data
/****** */
//写自己的逻辑: 操作数据库等操作
/****** */
#生成第三方3rd_session 用于识别用户
#3rd_session为key session_key+openid为value
$session3rd = null;
$strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
$max = strlen($strPol) - 1;
for ($i = 0; $i < 16; $i++) {
$session3rd .=$strPol[rand(0, $max)];
}
#存储sessionkey
Session::set($session3rd, $arr);
return mz_apisuc("成功", $session3rd);
}
/**
* 发送HTTP请求方法
* @param string $url 请求URL
* @param array $params 请求参数
* @param string $method 请求方法GET/POST
* @return array $data 响应数据
*/
function mz_http_send($url, $params, $method = 'GET', $header = array(), $multi = false) {
$opts = array(
CURLOPT_TIMEOUT => 30,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_HTTPHEADER => $header
);
/* 根据请求类型设置特定参数 */
switch (strtoupper($method)) {
case 'GET':
$opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
break;
case 'POST':
//判断是否传输文件
$params = $multi ? $params : http_build_query($params);
$opts[CURLOPT_URL] = $url;
$opts[CURLOPT_POST] = 1;
$opts[CURLOPT_POSTFIELDS] = $params;
break;
default:
throw new Exception('不支持的请求方式!');
}
/* 初始化并执行curl请求 */
$ch = curl_init();
curl_setopt_array($ch, $opts);
$data = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if ($error)
throw new Exception('请求发生错误:' . $error);
return $data;
}
网友评论