最近在做一个关于通过公众号扫描二维码计算密码然后返回,中间需要调用公司用金蝶云平台做的erp,在访问erp系统时jar包中的某个post方法,处理时间过长,导致超时,试了各种方法,就干脆改为提前返回一个提示,比如说:正在处理,请稍后,然后处理完连接erp系统后,新建线程返回处理后的消息。(受某个银行公众号启发)
大致流程:
1 微信扫描后进入处理方法
2 开启多线程,一个线程返回为空或提示正在处理,稍后返回,另一个线程处理业务
3 业务处理完毕后,新建微信连接,将处理结果返回
在这把步骤3记一下:
这里的WxMpXmlMessage是微信数据封装的实体类 ,自己定义,这里主要是为了取到openId作为要返回消息的微信号的唯一凭证。
/**
* 与微信建立连接并返回消息
*
* @param token 用户凭证
* @param wxMessage 向公众号发送请求的用户,openID
* @param text 指公众号主动向用户发送的消息文本
*/
public static void post(String token, WxMpXmlMessage wxMessage, String text) {
String action = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + token;
String json = "{\"touser\": \"" + wxMessage.getFromUser() + "\",\"msgtype\": \"text\", \"text\": {\"content\": \"" + text + "\"}}";
logger.info("json:" + json);
URL url = null;
try {
url = new URL(action);
//将url以open方法返回的urlConnection,连接强转为HttpURLConnectioon连接
//此时http为一个待连接对象,待连接中
HttpURLConnection http = (HttpURLConnection) url.openConnection();
http.setRequestMethod("POST");
// 设置请求头里面的各个属性 (以下为设置内容的类型)
// application/x-javascript text/xml->xml数据
// application/x-javascript->json对象
// application/x-www-form-urlencoded->表单数据
// text/plain->raw格式
// 当选择json数据时,charset=utf-8 必须要,不然会出现乱码
// 该样例使用json对象进行请求
http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//设置连接输出流为true,默认false(post是以流的方式隐士的传递参数)
http.setDoOutput(true);
//设置连接输入流为true
http.setDoInput(true);
//连接超时30秒
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
//读取超时30秒
System.setProperty("sun.net.client.defaultReadTimeout", "30000");
//建立连接
http.connect();
//创建输入输出流,用于往连接里面输出携带的参数,设置参数编码格式为utf-8
OutputStream os = http.getOutputStream();
os.write(json.getBytes("UTF-8"));
InputStream is = http.getInputStream();
int size = is.available();
byte[] jsonBytes = new byte[size];
String result = new String(jsonBytes, "UTF-8");
logger.info("请求返回结果" + result);
//输出完成后刷新并关闭流
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}