传参不正确
springmvc使用HttpClient向微信服务器发送post请求
返回 errcode: 41001, errmsg: "access_token missing hint: [V.Ee6a07688721!]"
最开始我以为access_token可以和其他参数一起封装了传过去,就总是不成功。后来发现url格式是
正确做法:
微信端传参数
服务器端
若不用服务器,直接在小程序里发起请求
实践是检验真理得唯一标准
实际操作中发现像access_token还有openid都不能从小程序这边取,因为合法域名的问题。然后关于form_id也是要和用户对应,且只能用一次,时效7天,所以无法实现A点击提交表单得到form_id然后再去给B作推送。但是不管怎样,还是有必要记录一下一些过程,以便后面要再作推送时方便查阅
access_token对象
//微信小程序access_token
public class AccessToken {
private String accessToken;//token
private Long expiresTime;//过期时间 时间戳
public AccessToken(){
}
public AccessToken(String accessToken,Integer expiresIn){
super();
this.accessToken = accessToken;
this.expiresTime = System.currentTimeMillis()+expiresIn*1000;
}
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public Long getExpiresTime() {
return expiresTime;
}
public void setExpiresTime(Long expiresTime) {
this.expiresTime = expiresTime;
}
/**
* 判断当前token是否过期
* @return
*/
public Boolean isExpired(){
return System.currentTimeMillis()>expiresTime;
}
}
controller
private void getToken(){
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type="+"client_credential"+"&appid="+appId+"&secret="+appSecret;
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet(url);
try {
HttpResponse response = httpclient.execute(httpget);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode >= 200 && statusCode < 300) {
HttpEntity entity = response.getEntity();
if (entity != null) {
JSONObject jsonObject = JSONObject.parseObject(EntityUtils.toString(entity));
at=new AccessToken(jsonObject.getString("access_token"),jsonObject.getInteger("expires_in"));
}
} else {
throw new ClientProtocolException("Unexpected response status: " + statusCode);
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
模板消息构造参考
https://blog.csdn.net/weixin_39984161/article/details/81189684
post请求
// 发送post请求
private HttpResponse requestByPostMethod(String url, String jsonObj) {
HttpResponse response = null;
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost post = new HttpPost(url);
if (jsonObj != null) {
StringEntity entity = new StringEntity(jsonObj, Charset.forName("UTF-8"));
entity.setContentEncoding("UTF-8");
// 发送Json格式的数据请求
entity.setContentType("application/json");
post.setEntity(entity);
}
try {
response = httpclient.execute(post);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return response;
}
参数构造参考那个网址
发送模板消息(HttpClient),调用上面post方法传入参数与网址