一、调用接口获取临时登录凭证(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 只能使用一次
- 用户登录凭证(有效期五分钟)