目录
1. 现在比较简单的方式
-> 接口名
---> 功能描述
-> 调用方式
---> HTTPS 调用
---> 第三方调用
---> 请求参数
---> 返回参数
2. 实现方式
1. 加入fastjson依赖
2. http请求类
3. Json串工具类
4.接口方法
3.另外介绍一点access_token
1. 现在比较简单的方式
统一封装最新文章地址(可跳过): 微信小程序02: 使用手机号快速验证获取手机号(新版)
下面(旧版)的可以直接使用, 上面的文章(最新)进行了同一封装
-> 接口名
getPhoneNumber
---> 功能描述
该接口需配合手机号快速填写组件能力一起使用,当用户点击并同意之后,可以通过 bindgetphonenumber
事件回调获取到动态令牌code
,再调用该接口将code
换取用户手机号。
注意:每个code只能使用一次,code的有效期为5min。
-> 调用方式
---> HTTPS 调用
POST /wxa/business/getuserphonenumber?access_token=ACCESS_TOKEN
---> 第三方调用
-
调用方式以及出入参和HTTPS相同,仅是调用的token不同
-
该接口所属的权限集id为:18
-
服务商获得其中之一权限集授权后,可通过使用authorizer_access_token代商家进行调用
---> 请求参数
属性 | 类型 | 必填 | 说明 |
---|---|---|---|
access_token | string | 是 | 接口调用凭证,该参数为 URL 参数,非 Body 参数。使用access_token或者authorizer_access_token |
code | string | 是 | 手机号获取凭证 |
---> 返回参数
属性 | 类型 | 说明 | |||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
errcode | number | 错误码 | |||||||||||||||||||||||||||||||||||||
errmsg | string | 错误信息 | |||||||||||||||||||||||||||||||||||||
phone_info | object | 用户手机号信息 | |||||||||||||||||||||||||||||||||||||
|
2. 实现方式
1. 加入fastjson依赖
<dependency>
<groupId></groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
2. http请求类
import .slf4j.Slf4j;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import org.;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* HTTP/HTTPS 请求封装: GET / POST
* 默认失败重试3次
* @author admin
*/
@Slf4j
public class HttpClientSslUtils {
/**
* 默认的字符编码格式
*/
private static final String DEFAULT_CHAR_SET = "UTF-8";
/**
* 默认连接超时时间 (毫秒)
*/
private static final Integer DEFAULT_CONNECTION_TIME_OUT = 2000;
/**
* 默认socket超时时间 (毫秒)
*/
private static final Integer DEFAULT_SOCKET_TIME_OUT = 3000;
/** socketTimeOut上限 */
private static final Integer SOCKET_TIME_OUT_UPPER_LIMIT = 10000;
/** socketTimeOut下限 */
private static final Integer SOCKET_TIME_OUT_LOWER_LIMIT = 1000;
private static CloseableHttpClient getHttpClient() {
RequestConfig requestConfig = ().setSocketTimeout(DEFAULT_SOCKET_TIME_OUT)
.setConnectTimeout(DEFAULT_CONNECTION_TIME_OUT).build();
return ().setDefaultRequestConfig(requestConfig)
.setRetryHandler(new DefaultHttpRequestRetryHandler()).build();
}
private static CloseableHttpClient getHttpClient(Integer socketTimeOut) {
RequestConfig requestConfig =
().setSocketTimeout(socketTimeOut).setConnectTimeout(DEFAULT_CONNECTION_TIME_OUT)
.build();
return ().setDefaultRequestConfig(requestConfig)
.setRetryHandler(new DefaultHttpRequestRetryHandler()).build();
}
public static String doPost(String url, String requestBody) throws Exception {
return doPost(url, requestBody, ContentType.APPLICATION_JSON);
}
public static String doPost(String url, String requestBody, Integer socketTimeOut) throws Exception {
return doPost(url, requestBody, ContentType.APPLICATION_JSON, null, socketTimeOut);
}
public static String doPost(String url, String requestBody, ContentType contentType) throws Exception {
return doPost(url, requestBody, contentType, null);
}
public static String doPost(String url, String requestBody, List<BasicHeader> headers) throws Exception {
return doPost(url, requestBody, ContentType.APPLICATION_JSON, headers);
}
public static String doPost(String url, String requestBody, ContentType contentType, List<BasicHeader> headers)
throws Exception {
return doPost(url, requestBody, contentType, headers, getHttpClient());
}
public static String doPost(String url, String requestBody, ContentType contentType, List<BasicHeader> headers,
Integer socketTimeOut) throws Exception {
if (socketTimeOut < SOCKET_TIME_OUT_LOWER_LIMIT || socketTimeOut > SOCKET_TIME_OUT_UPPER_LIMIT) {
("socketTimeOut非法");
throw new Exception();
}
return doPost(url, requestBody, contentType, headers, getHttpClient(socketTimeOut));
}
/**
* 通用Post远程服务请求
* @param url
* 请求url地址
* @param requestBody
* 请求体body
* @param contentType
* 内容类型
* @param headers
* 请求头
* @return String 业务自行解析
* @throws Exception
*/
public static String doPost(String url, String requestBody, ContentType contentType, List<BasicHeader> headers,
CloseableHttpClient client) throws Exception {
// 构造http方法,设置请求和传输超时时间,重试3次
CloseableHttpResponse response = null;
long startTime = ();
try {
HttpPost post = new HttpPost(url);
if (!(headers)) {
for (BasicHeader header : headers) {
(header);
}
}
StringEntity entity =
new StringEntity(requestBody, ((), DEFAULT_CHAR_SET));
(entity);
response = (post);
if (().getStatusCode() != ()) {
("业务请求返回失败:{}", (()));
throw new Exception();
}
String result = (());
return result;
} finally {
releaseResourceAndLog(url, requestBody, response, startTime);
}
}
/**
* 暂时用于智慧园区业务联调方式
* @param url 业务请求url
* @param param 业务参数
* @return
* @throws Exception
*/
public static String doPostWithUrlEncoded(String url,
Map<String, String> param) throws Exception {
// 创建Httpclient对象
CloseableHttpClient httpClient = getHttpClient();
CloseableHttpResponse response = null;
long startTime = ();
try {
// 创建Http Post请求
HttpPost httpPost = new HttpPost(url);
// 创建参数列表
if (param != null) {
List<> paramList = new ArrayList<>();
for (String key : ()) {
(new BasicNameValuePair(key, (key)));
}
// 模拟表单
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, DEFAULT_CHAR_SET);
(entity);
}
// 执行http请求
response = (httpPost);
if (().getStatusCode() != ()) {
("业务请求返回失败:{}" , (()));
throw new Exception();
}
String resultString = ((), DEFAULT_CHAR_SET);
return resultString;
} finally {
releaseResourceAndLog(url, param == null ? null : (), response, startTime);
}
}
private static void releaseResourceAndLog(String url, String request, CloseableHttpResponse response, long startTime) {
if (null != response) {
try {
();
recordInterfaceLog(startTime, url, request);
} catch (IOException e) {
(());
}
}
}
public static String doGet(String url) throws Exception {
return doGet(url, ContentType.DEFAULT_TEXT);
}
public static String doGet(String url, ContentType contentType) throws Exception {
return doGet(url, contentType, null);
}
public static String doGet(String url, List<BasicHeader> headers) throws Exception {
return doGet(url, ContentType.DEFAULT_TEXT, headers);
}
/**
* 通用Get远程服务请求
* @param url
* 请求参数
* @param contentType
* 请求参数类型
* @param headers
* 请求头可以填充
* @return String 业务自行解析数据
* @throws Exception
*/
public static String doGet(String url, ContentType contentType, List<BasicHeader> headers) throws Exception {
CloseableHttpResponse response = null;
long startTime = ();
try {
CloseableHttpClient client = getHttpClient();
HttpGet httpGet = new HttpGet(url);
if (!(headers)) {
for (BasicHeader header : headers) {
(header);
}
}
if(contentType != null){
("Content-Type", ());
}
response = (httpGet);
if (().getStatusCode() != ()) {
("业务请求返回失败:{}", (()));
throw new Exception();
}
String result = (());
return result;
} finally {
releaseResourceAndLog(url, null, response, startTime);
}
}
private static void recordInterfaceLog(long startTime, String url, String request) {
long endTime = ();
long timeCost = endTime - startTime;
("totalTime", (timeCost));
("url", url);
("logType", "third-platform-service");
("HttpClientSslUtils 远程请求:{} 参数:{} 耗时:{}ms", url, request, timeCost);
}
}
3. Json串工具类
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import .slf4j.Slf4j;
import ;
import ;
@Slf4j
public class JsonUtil {
/**
* 定义映射对象
*/
public static ObjectMapper objectMapper = new ObjectMapper();
/**
* 日期格式化
*/
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
static {
//对象的所有字段全部列入
(.NON_NULL);
//取消默认转换timestamps形式
(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
//忽略空Bean转json的错误
(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
//所有的日期格式都统一为以下的样式,即yyyy-MM-dd HH:mm:ss
(new SimpleDateFormat(DATE_FORMAT));
//忽略 在json字符串中存在,但是在java对象中不存在对应属性的情况。防止错误
(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
/**
* string转JsonNode
*
* @param jsonString
* @return
*/
public static JsonNode stringToJsonNode(String jsonString) throws JsonProcessingException {
return (jsonString);
}
/**
* 对象转json字符串
*
* @param obj
* @param <T>
*/
public static <T> String objToString(T obj) {
if (obj == null) {
return null;
}
try {
return obj instanceof String ? (String) obj : (obj);
} catch (JsonProcessingException e) {
("Parse Object to String error : {}", ());
return null;
}
}
/**
* 对象转格式化的字符串字符串
*
* @param obj
* @param <T>
* @return
*/
public static <T> String objToPrettyString(T obj) {
if (obj == null) {
return null;
}
try {
return obj instanceof String ? (String) obj : ().writeValueAsString(obj);
} catch (JsonProcessingException e) {
("Parse Object to String error : {}", ());
return null;
}
}
/**
* json字符串转对象
*
* @param jsonString
* @param cls
* @param <T>
*/
public static <T> T stringToObj(String jsonString, Class<T> cls) {
if ((jsonString) || cls == null) {
return null;
}
try {
return () ? (T) jsonString : (jsonString, cls);
} catch (JsonProcessingException e) {
("Parse String to Object error : {}", ());
return null;
}
}
}
4.接口方法
@PostMapping("/getPhone")
public ResultResponse getPhone(@RequestBody @Valid WxMiniGetPhone param) {
JSONObject wxJson;
// 获取token
String token_url = null;
/**
* appid切换
*/
if (() == 1) {
token_url = ("/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", bAppID, bAppSecret);
} else if (() == 2) {
token_url = ("/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", aAppId, aSecret);
} else {
throw new UserServiceException("异常");
}
try {
JSONObject token = ((token_url));
if (token == null) {
("获取token失败");
return null;
}
String accessToken = ("access_token");
if ((accessToken)) {
("获取token失败");
return null;
}
("token : {}", accessToken);
//获取phone
String url = "/wxa/business/getuserphonenumber"
+ "?access_token=" + accessToken;
JSONObject jsonObject = new JSONObject();
("code", ());
String reqJsonStr = (jsonObject);
wxJson = ((url, reqJsonStr));
if (wxJson == null) {
("获取手机号失败");
return ("获取手机号失败!");
}
return ("获取成功!").setData(wxJson);
} catch (Exception e) {
();
}
return ("获取失败,请重试!");
}
3.另外介绍一点access_token
access_token是有次数限制的 一天2000次 超过了需要刷新accessToken限制次数,10次/月