微信小程序登录
登录,微信api
后台获取微信token,包括openid在内
登录流程
1. 小程序发起wx.login请求获取jscode
2. 获取jscode,发送到自己的后端
3. 自己的后台发请求带上jscode, appid(当前用户的唯一标识), secretkey
到微信的后端获取session_key, openid
4. 返回session_key或者openid到页面
5. 页面再发请求到后台验证openid 是否存在, 存在即登录。
不存在 保存openid到个人数据库,即注册。
6. 登录成功后,返回jwt token签名
7. 页面通过微信app.js 的globalData保存openid,jwt token信息
微信用户,授权信息,相关实体类
微信用户表
create table forum_info.wei_xin_user
(
id int auto_increment primary key,
user_name varchar(30) null,
user_pwd varchar(30) null,
# 这里的密码没用,登录只是验证open_id,
# 所以说小程序登录是不需要密码的额。它问你是否授权。
# 然后收集你的其它个人信息。
create_date date null,
wx_open_id varchar(30) null
);
实体类
package top.bitqian.entity;
import java.util.Date;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 微信用户注册实体类~
* </p>
*
* @author echo lovely
* @since 2020-12-04
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class WeiXinUser implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Integer id;
private String userName;
private String userPwd;
private Date createDate;
private String wxOpenId;
}
获取微信的token
文档里面的字段搬过来。
package top.bitqian.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* <p>
* 调用微信接口 返回授权信息~
* </p>
* @author echo lovely
* @date 2020/12/4 21:56
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Code2Session {
//用户唯一标识
private String openid;
// 会话密钥
private String session_key;
// 用户在开放平台的唯一标识符
private String unionid;
// 错误码
private Integer errcode;
// 错误信息
private String errmsg;
}
常量抽取
package top.bitqian.config;
/**
* @author echo lovely
* @date 2020/12/4 22:03
*/
public class WeiXinPostParamConstant {
/**
* 小程序appid
*/
public static String APP_ID = "小程序开发者官网生成";
/**
* 小程序 appSecret
*/
public static String SECRET = "小程序开发者官网生成";
/**
* 登录时获取的 code
*/
public static String JS_CODE = "";
/**
* 授权类型,此处只需填写 authorization_code
* grant_type ctrl + shit + u
*/
public static String GRANT_TYPE = "";
}
httpClient工具,用于发送请求获取token
nbplus pom
这里是boot,省略了version
<!-- http工具类 -->
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<!--<version>4.5.6</version>-->
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<!--<version>4.4.10</version>-->
</dependency>
工具类
package top.bitqian.config;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketTimeoutException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Map;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.config.RequestConfig.Builder;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
/**
* HTTPClient 工具类.
* @author echo lovely
* @date 2020/12/4 21:44
*/
@Configuration
@SuppressWarnings(value = "all")
public class HttpClientUtil {
private static final Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);
private static PoolingHttpClientConnectionManager connectionManager;
private static String DEFAULT_STR = "";
private static