1. 前端通过 wx.login 接口获得临时登录凭证 code, 传给后台
前端wx.login (API)
https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html
2. 后台调用jscode2session接口, 使用 code 换取 openid、unionid、session_key 等信息
小程序登录 (服务端)
https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html
3. 注册和登录实现代码
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class LoginController {
/**
* 微信小程序注册和登录
*
* @param code 用户登录凭证(有效期五分钟)
* @return
*/
@RequestMapping("/login")
public Object login(String code){
if (StringUtils.isEmpty(code)) {
return AjaxResult.error("登录凭证不能为空");
}
try {
String appid = "AppID(小程序ID)";
String secret = "AppSecret(小程序密钥)";
String grant_type = "authorization_code";
CloseableHttpClient httpClient = HttpClients.createDefault();
// 小程序登录
String url = "https://api.weixin.qq.com/sns/jscode2session?appid="+appid+"&secret="+secret+"&js_code="+code+"&grant_type="+grant_type;
HttpGet get = new HttpGet(url);
CloseableHttpResponse response = httpClient.execute(get);
String result = EntityUtils.toString(response.getEntity(), "utf-8");
JSONObject json = JSONObject.parseObject(result);
if (!json.containsKey("errcode")) {
String openid = json.getString("openid");
String unionid = json.getString("unionid");
// TODO 存数据库
return "success";
}
} catch (Exception e) {
e.printStackTrace();
}
return "error";
}
}