小程序端代码:
wx.login参考文档:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html
auth.code2Session参考文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。
请求地址
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 下发条件的情况下会返回,详见 UnionID 机制说明。
errcode number 错误码
errmsg string 错误信息
errcode 的合法值
-1 系统繁忙,此时请开发者稍候再试
0 请求成功
40029 code 无效
45011 频率限制,每个用户每分钟100次
<view class="display_row myViewTop_userinfo">
<button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>
<block wx:else>
<image src="{{userInfo.avatarUrl}}"></image> //头像
<view>{{userInfo.nickName}}</view> // 昵称
</block>
</view>
const app = getApp();
Page({
data: {
userInfo: {},
hasUserInfo: false,
canIUse: wx.canIUse('button.open-type.getUserInfo'),
},
// 点击获取头像昵称 按钮获取用户昵称头像及wx.login的code(该code用来获取openid)
getUserInfo: function (e) {
var that = this;
if (e.detail.userInfo){
app.globalData.userInfo = e.detail.userInfo; //存入全局变量方便后面调用
// 请求后端获取openid
wx.login({
success: function(res){
app.getAjax('getauthCode',{'code':res.code},that.getauthCode);
}
})
}else{
this.setData({
hasUserInfo: false
})
}
},
// 调用后台获取openid接口之后进行绑定数据库
getauthCode: function(res){
if(res.data.code == 1){
var userinfo = app.globalData.userInfo;
var openid = res.data.data.openid;
var data = {
'avatarUrl':userinfo.avatarUrl,
'nickName':userinfo.nickName,
'gender':userinfo.gender,
'openid':openid
};
app.getAjax('adduser',data,this.addauth); //将获取到的openid及其他值传入后端添加用户接口中
}else{
wx.showToast({
title: '获取用户信息失败',
icon:'none'
})
}
},
// 添加用户接口成功回调函数
addauth: function(e){
var that = this;
if(e.data.code == 1){
//存入本地缓存
wx.setStorage({
data: e.data.data,
key: 'authinfo',
success: function(){
that.setData({
userInfo:e.data.data,
hasUserInfo: true
})
}
})
}
},
onShow: function(){
var that = this;
wx.getStorage({
key: 'authinfo',
success:function(res){
that.setData({
userInfo:res.data,
hasUserInfo: true
})
},
fail:function(){
that.setData({
hasUserInfo:false
})
}
}
})
},
})
//app.js
App({
onLaunch: function () {
},
globalData: {
userInfo: null,
userid:''
},
getAjax: function (url, data, callback){
wx.request({
url: 'http://192.168.1.38/demo/public/index.php/'+url,
header: {
'content-type': 'application/x-www-form-urlencoded',
},
method: 'POST',
data: data,
dataType: 'json',
success: function (res) {
callback(res);
},
fail:function(err){
callback(err);
}
})
},
})
后端(thinkphp5)
// 获取用户登录凭证校验(openid)
public function getauthCode(){
$appid = ''; // 小程序id
$secret = ''; // 小程序appSecret
$js_code = input('post.code'); // wx.login获取的 code
//grant_type 授权类型,此处只需填写 authorization_code
$method= "GET";
$host = "https://api.weixin.qq.com";
$path = '/sns/jscode2session';
$querys = "appid={$appid}&secret={$secret}&js_code={$js_code}&grant_type=authorization_code";
$url= $host.$path.'?'.$querys;
$weixin = file_get_contents($url);
$jsondecode = json_decode($weixin);
$array = get_object_vars($jsondecode);
return output_data(200,$array);
}
// 注册用户
public function adduser(){
$data = input('post.');
// 判断是否已有openid
$userinfo = db("user")->where('openid',input('post.openid'))->find();
if($userinfo != null || !empty($userinfo)){
return output_data(200,$userinfo);
}
$res=db('user')->insert($data);
if($res){
$userinfo = db("user")->where('openid',input('post.openid'))->find();
return output_data(200,$userinfo);
}else{
return output_error(203);
}
}
file_get_contents(): Unable to find the wrapper “https” - did you forget to enable it 的解决:
1.windows下的PHP,只需要到php.ini中把extension=php_openssl.dll前面的;删掉,重启服务就可以了。
2.linux下的PHP,就必须安装openssl模块,安装好了以后就可以访问了。
转自:https://blog.csdn.net/tonydandelion2014/article/details/50864786