微信小程序的设定是不支持session,那么cookie之流肯定是用不了的。微信对wx.request这个API做了修改,小程序发起的请求并不是直接请求我们的后台服务器,而是先通过微信的服务器再发送到我们的后台服务器,既然请求都是要通过微信的服务器发送到我们的服务器,那么我们的服务器也就无从识别请求的发起者了。因此,session在微信小程序的后台开发中是无法使用的。
所以,我使用了比较流行的开发者服务端提供的token来识别用户身份。JSON WEB TOKEN。
登录流程时序
那么根据微信提供的业务流程走:
wx.login({
timeout: 3000 * 10,
success: res => {
if (res.code) {
//发起网络请求
wx.request({
method: 'POST',
url: 'XXXXXX',
data: {
code: res.code
},
success: res => {
var result = res;
wx.setStorageSync('info', result);//不属于开发者交互应该使用同步
}
})
} else {
console.log("获取code失败!");
}
}
})
TP5代码:
public function index()
{
$Request=Request::instance();
$post=$Request->post();
$url='https://api.weixin.qq.com/sns/jscode2session?appid='.$this->options['appId'].'&secret='.$this->options['appKey'].'&js_code='.$post['code'].'&grant_type=authorization_code';
$con=json_decode($this->http_get($url),JSON_OBJECT_AS_ARRAY);
$token=json_encode($this->JWTtoken($con));
$data=['session_key'=>$con['session_key'],'openid'=>$con['openid']];
Db::table('wx_user')->insert($data);
exit($token);
}
public function http_get($url){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
$con=curl_exec($ch);
curl_close($ch);
return $con;
}
public function JWTtoken($payload){
$obj = new Jwt();
$token=$obj->getToken($payload);
return $token;
}
这里有个地方要注意下,获取缓存的地方,是用同步还是用异步的问题,要搞清。如果要跟服务端交互就得异步,否则用同步写法跟微信服务端交互就可以获取或者储存到本地缓存。