1.使用
/**
* vip 小程序 登陆解码过程
*/
@ApiOperation("vip 小程序 登录凭证校验")
@RequestMapping(value="/code2Session" , method = RequestMethod.GET)
Code2SessionFromWeiXinResponse code2Session(
@RequestParam("appid") String appid, //小程序 appId
@RequestParam("secret") String secret, //小程序 appSecret
@RequestParam("js_code") String js_code, //登录时获取的 code
@RequestParam(value = "grant_type",defaultValue = "authorization_code") String grant_type //授权类型,此处只需填写 authorization_code
)
{
//请求:GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
Code2SessionFromWeiXinResponse res=new Code2SessionFromWeiXinResponse();
HttpGetRequest request=new HttpGetRequest();
request.setUrl("https://api.weixin.qq.com/sns/jscode2session");
Map paramMap=new HashMap();
paramMap.put("appid",appid);
paramMap.put("secret",secret);
paramMap.put("js_code",js_code);
paramMap.put("grant_type",grant_type);
request.setParamMap(paramMap);
//code2Session
JSONObject httpResponse= httpGetAdapter.httpGetMethod(request);
logger.info("http请求返回值:{}"+httpResponse);
if(httpResponse!=null){
if (httpResponse.has("errcode")) { //判断JSONObject是否包含含有openid属性值
res.setErrcode(httpResponse.getLong("errcode"));
}
if (httpResponse.has("openid")) {
res.setOpenid(httpResponse.getString("openid"));
}
if(httpResponse.has("errmsg")){
res.setErrmsg(httpResponse.getString("errmsg"));
}
if(httpResponse.has("unionid")){
res.setUnionid(httpResponse.getString("unionid"));
}
if(httpResponse.has("session_key")){
res.setSession_key(httpResponse.getString("session_key"));
}
}
return res;
}
2.httpGetAdapter
package com.fangdd.esf.web.server.adapter;
import com.fangdd.esf.web.server.entity.HttpGetRequest;
import org.apache.commons.collections.MapUtils;
import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.json.JSONObject;
import java.net.URISyntaxException;
import java.util.Map;
@Component
public class HttpGetAdapter {
private static final Logger logger = LoggerFactory.getLogger(HttpGetAdapter.class);
/**
* 调用外部的http 接口,get请求
* @param request
* @return
*/
public JSONObject httpGetMethod(HttpGetRequest request) {
//返回数据
JSONObject responseBody=new JSONObject();
//response
HttpResponse response = null;
//httpClient
CloseableHttpClient httpClient = HttpClients.createDefault();
try {
logger.debug("code2Session with request {}", request);
// get method
URIBuilder uriBuilder = new URIBuilder(request.getUrl());
Map paramMap= request.getParamMap();//参数map
if(MapUtils.isNotEmpty(paramMap)){
for (Map.Entry entry : paramMap.entrySet()) {
uriBuilder.addParameter(entry.getKey(), entry.getValue());
}
}
// 根据带参数的URI对象构建GET请求对象
HttpGet httpGet = new HttpGet(uriBuilder.build());
response = httpClient.execute(httpGet); //执行返回的结果
// 获取response 的body
String resBody = EntityUtils.toString(response.getEntity(),"UTF-8");
// /** 将String数组转为JSON*/
responseBody = new JSONObject(resBody);
// HttpEntity entity = response.getEntity();
// ret=EntityUtils.toString(entity,"UTF-8");
} catch (ParseException e) {
System.err.println("解析错误");
e.printStackTrace();
} catch (URISyntaxException e) {
System.err.println("URI解析异常");
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放连接
if (null != response) {
try {
httpClient.close();
} catch (Exception e) {
System.err.println("释放连接出错");
e.printStackTrace();
}
}
}
logger.debug("The response is {}", response);
return responseBody;
}
}
3.request
package com.fangdd.esf.web.server.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Map;
@Data
@ApiModel(description = "httpGet方法request")
public class HttpGetRequest implements Serializable {
//https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
@ApiModelProperty(value = "url")
private String url;
@ApiModelProperty(value = "参数map")
private Map paramMap;
}
4.response
package com.fangdd.esf.web.server.entity.brandStore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel(description = "微信登录凭证校验response")
public class Code2SessionFromWeiXinResponse implements Serializable {
@ApiModelProperty(value = "用户唯一标识")
private String openid;
@ApiModelProperty(value = "会话密钥")
private String session_key;
@ApiModelProperty(value = "用户在开放平台的唯一标识符,在满足 UnionID 下发条件的情况下会返回")
private String unionid;
@ApiModelProperty(value = "错误码")
private Long errcode;
/**
* errcode 的合法值
*
* -1 系统繁忙,此时请开发者稍候再试
* 0 请求成功
* 40029 code 无效
* 45011 频率限制,每个用户每分钟100次
*/
@ApiModelProperty(value = "错误信息")
private String errmsg;
}