一、调用接口获取临时登录凭证(code)
wx.login({
success(res) {
if (res.code) {
// res.code => 登录凭证
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
二、调用 code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key
本接口应在后端服务器调用
GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
属性 |
类型 |
默认值 |
必填 |
说明 |
appid |
string |
|
是 |
小程序appid |
secret |
string |
|
是 |
小程序appSecret |
js_code |
string |
|
是 |
登录时获取的code |
grant_type |
string |
|
是 |
授权类型,此处只需要填写 authorization_code |
属性 |
类型 |
说明 |
openid |
string |
用户唯一标识 |
session_key |
string |
会话密钥 |
unionid |
string |
用户在开放平台的唯一标识符,在满足 UnionID 下发条件的情况下会返回 |
errcode |
number |
错误码 |
errmsg |
string |
错误信息 |
public function actionWechatLogin()
{
// 获取传参中的code
$code = $this->checkIsGet()->get('code');
// 调用微信接口获取openid
$openid = $this->getOpenId($code);
// 根据openid去数据库中查询用户信息,能查到数据继续下面的操作,未查到 提示未绑定微信登录
//重置token
// 1. 生成token
$authKey = md5(md5(time() . uniqid() . mt_rand(0, 999)));
// 2. 生成的token保存到 mysql数据库
// 3. 生成的token保存到 redis (键:token的值,value:用户信息)
// 返回
Output::output(true, '0', '成功', ['openid' => $openid, 'token' => $authKey]);
}
private function getOpenId($code)
{
// 这里的appid、secret、 grant_type 需要替换成你自己的
$url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.Yii::$app->params['mini_program']['AppID'] . '&secret='.Yii::$app->params['mini_program']['AppSecret'].'&js_code='.$code.'&grant_type=authorization_code';
$ch = curl_init();
$options = array(
CURLOPT_URL => $url,
CURLOPT_USERAGENT => "Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0",
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_HTTPHEADER => array("Content-Type: application/json-rpc")
);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
$html = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
$resData = json_decode($html);
Yii::error($html);
if (!isset($resData->openid)) {
Output::output(false, '1', '获取openid出错。', null);
}
Yii::error('openid == ' . $resData->openid);
return $resData->openid;
}
调用后台接口获取token
wx.setStorageSync('token', token)
wx.getStorageSync('token')
*注意
- 临时登录凭证 code 只能使用一次
- 用户登录凭证(有效期五分钟)