demo
官方教材:
小程序登录
小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。
说明:
-
小程序调用wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
-
开发者服务器以code换取 用户唯一标识openid 和 会话密钥session_key。
之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。
示例代码
//app.js
App({
onLaunch: function() {
wx.login({
success: function(res) {
if (res.code) {
//发起网络请求
wx.request({
url: 'https://test.com/onLogin',
data: {
code: res.code
}
})
} else {
console.log('登录失败!' + res.errMsg)
}
}
});
}
})
登录凭证校验
临时登录凭证校验接口是一个 HTTPS 接口,开发者服务器使用 临时登录凭证code 获取 session_key 和 openid 等。
注意:
-
会话密钥session_key 是对用户数据进行加密签名的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。
-
UnionID 只在满足一定条件的情况下返回。具体参看UnionID机制说明
-
临时登录凭证code只能使用一次
接口地址:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
请求参数
参数 | 必填 | 说明 |
---|---|---|
appid | 是 | 小程序唯一标识 |
secret | 是 | 小程序的 app secret |
js_code | 是 | 登录时获取的 code |
grant_type | 是 | 填写为 authorization_code |
在不满足UnionID下发条件的情况下,返回参数
参数 | 说明 |
---|---|
openid | 用户唯一标识 |
session_key | 会话密钥 |
在满足UnionID下发条件的情况下,返回参数
参数 | 说明 |
---|---|
openid | 用户唯一标识 |
session_key | 会话密钥 |
unionid | 用户在开放平台的唯一标识符 |
php代码
<?php
$post = file_get_contents("php://input");//接收POST数据
$postdata = json_decode($post,TRUE);
$appid = 'appid';//appid
$secret = 'secret';//secret
$arr['js_code'] = $postdata['code'];//用户登录凭证(有效期五分钟)
$arr['appid'] = $appid;
$arr['secret'] = $secret;
$arr['grant_type'] ='authorization_code';
$url = "https://api.weixin.qq.com/sns/jscode2session?";
// curl请求获取openid
$url = $url . http_build_query($arr);//拼接参数
$res = curl_request($url);
return $res;
function curl_request($url, $post = '', $cookie = '', $returnCookie = 0) {
//参数1:访问的URL,参数2:post数据(不填则为GET),参数3:提交的$Cookies,参数4:是否返回$cookies
$curl = curl_init(); //初始化curl会话
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)');
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
curl_setopt($curl, CURLOPT_REFERER, "http://XXX");
if ($post) {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));
}
if ($cookie) {
curl_setopt($curl, CURLOPT_COOKIE, $cookie);
}
curl_setopt($curl, CURLOPT_HEADER, $returnCookie);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl); //执行curl会话
if (curl_errno($curl)) {
return curl_error($curl);
}
curl_close($curl); //关闭curl会话
if ($returnCookie) {
list($header, $body) = explode("\r\n\r\n", $data, 2);
preg_match_all("/Set\-Cookie:([^;]*);/", $header, $matches);
$info['cookie'] = substr($matches[1][0], 1);
$info['content'] = $body;
return $info;
} else {
return $data;
}
}