微信小程序登录流程及登录

一.登录流程
微信小程序登录流程及登录_第1张图片
1.微信小程序端发起请求并携带主要参数;
2.java后台接收到登录请求后,根据临时凭证code去调用微信接口获取用户唯一标识openId和sessionKey;
3.使用openId去查询数据库(openId是会员的的唯一标识
a.若openId存在,直接登录成功;
b.若openId’不存在,我们把openId写入到数据库,并且让他登录
4.根据openId查询redis数据库,判断openId对应的skey是否存在,如果存在删除原来的老skey以及对应的openId和sessionKey(为了安全,保证每次登录的key都是最新的)
5.通过uuid生成唯一的skey,用openId做键,skey做值,存入到redis中
6.然后把skey做键,openId和sessionKey的json串做值也重新存入到redis中
7.根据解密算法,参数有encryptedData、sessionKey和iv,获取用户信息userInfo,如果userInfo字段不满足需要,可通过userInfo.put( “balance”,user.getUbalance() );添加所需要的字段和值
8.将微信小程序需要的数据封装到map容器中,返回给小程序端

二.获取测试号的AppID和AppSecret

微信小程序登录流程及登录_第2张图片

三.在后台只需要发起一个get请求
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
微信小程序端发起登录请求,携带的参数主要有:
code:loginRes.code,//临时登录凭证
rawData:infoRes.rawData,//用户非敏感信息
signature:infoRes.signature,//签名
encrypteData:infoRes.encryptedData,//用户敏感信息
iv:infoRes.iv//解密算法的向量
需要的数据主要有:
result、userInfo和skey,result用来判断是否登录成功,userInfo是用户的一些信息,保存在缓存中,不用每次都从后台获取,skey是用户登录态标识,也放在缓存中,如果skey存在就直接登录,维护用户的登录状态,具有时效性
微信小程序登录流程及登录_第3张图片

微信小程序登录流程及登录_第4张图片
4.通过postMan发请求测试获取到了sessionKey和openId
微信小程序登录流程及登录_第5张图片

微信小程序登录流程及登录_第6张图片

@Configuration
public class UserRealm extends AuthorizingRealm{

private final static String WX_LOGIN_URL="https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code";

@Value("${wx.appid}")
private String wxAppId;

@Value("${wx.secret}")
private String wxSecret;

//spring提供我们发http请求的
@Autowired
private RestTemplate restTemplate;

@Autowired
private UserService userService;

/**
 * 授权
 */
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
	
	return null;
}

/**
 * 登录
 */
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
	String wxCode = token.getPrincipal().toString();
	//使用code给微信WX_LOGIN_URL换取openId
	String openId = getOpenIdByCode(wxCode);
	User user=userService.findByUsername(openId);
	if(user==null) {
		//该用户不存在
		//自动创建用户,在微信小程序里面,不需要通过用户名密码登录
		user =new User();
		user.setUserId(openId);
		//新增一个会员
		userService.save(user);
	}
	return new SimpleAuthenticationInfo(openId, "WX_LOGIN",wxCode);
}

private String getOpenIdByCode(String wxCode) {
	String url = String.format(WX_LOGIN_URL, wxAppId,wxSecret,wxCode);
	String wxResult = restTemplate.getForObject(url, String.class);
	JSONObject json = JSONUtil.parseObj(wxResult);
	//代表访问微信服务器时,发生错误
	if(json.containsKey("errcode")) {
		Long errCode = json.get("errcode",Long.class);
		if(errCode==40029) {
			//代表是code错误
			throw new RuntimeException("从微信来的code错误");
		}
	}
	
	//获取openId
	String openId = json.get("openid",String.class);
	return openId;
}

@RestController
public class LoginController {

@PostMapping("/login")
public ResponseEntity login(@RequestBody LoginParam loginParam){
	UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(loginParam.getPrincipal(), "WX_LOGIN");
	Subject subject = SecurityUtils.getSubject();
	String token=null;
	Map result =new HashMap(3);
	try {
		subject.login(usernamePasswordToken);
		token = subject.getSession().getId().toString();
		User user = (User) subject.getPrincipal();
		result.put("nickName", user.getNickName());
		result.put("userStutas", user.getStatus());
		result.put("access_token", token);
		return ResponseEntity.ok(result);
	} catch (AuthenticationException e) {
		e.printStackTrace();
	} 
	return ResponseEntity.ok(result);

}
 
  

}

五.通过微信小程序端调试,登录请求的response返回了access_token和nickName
微信小程序登录流程及登录_第7张图片

你可能感兴趣的:(小程序)