最近公司新接了一个微信公众号项目,所以乘此机会学习一下微信公众平台的开发,此博客记录一下微信开发的过程和遇到的一些问题
首先我注册了一个微信公众测试号,能够使用几乎所有微信接口,除了微信支付的接口.
1.填写接口配置信息
appid:公众号的标识
appsecret:字面上的意思应该是app密码
url:你的服务器域名地址,如http://www.baidu.com/token
token:你设置的随即字符串
EncodingAESKey:随即生成或手动填写,密钥
消息加解密模式:初次开发最好使用明文模式,如果使用密文模式需要在自己项目接受数据时解密
2.架设好自己的服务器,启动自己的项目
1).验证消息来源
当接口配置信息填写完成提交时,微信服务器会请求上面填写的url地址,请求方式为GET,携带的有 signature:微信加密签名,内容为你的token参数和timestamp和nonce
timestamp:时间戳
nonce:随即数
echostr:随即字符串
将token,timestamp,nonce三个参数排序之后拼接成一个字符串加密后与signature比对,一致时返回 echostr,验证成功.
此验证是为了接受用户发送给公众号的信息来源是微信服务器,echostr参数可以保存到项目中
2).获取access_token
access_token是公众号调用微信接口唯一凭据,所有微信开放接口的调用都需要,使用时效为两个小时, 保存在项目中,并记录时间戳,超过两个小时重新获取
接口地址在微信公众平台的项目文档之中可以找到,本文不提供url地址
请求的方式为GET,需要的参数如下
grant_type:固定的为client_credential
appid:公众号唯一标识
apppsecrent:密钥
将参数请求到url之后,微信服务器会返回一个json字符串{"access_token","",expires_in":""},由于微信接 口都是以http的请求方式,所以我们可以写一个公共方法,代码如下
public static String httpPost(String url,String params){
String result = "";
try{
URL posturl = new URL(url);
HttpURLConnection postconn = (HttpURLConnection) posturl.openConnection();
postconn.setDoOutput(true);
postconn.setRequestMethod("POST");
OutputStream os = postconn.getOutputStream();
os.write(params.getBytes(Charset.forName("UTF-8")));
os.close();
BufferedReader br = new BufferedReader(new InputStreamReader(postconn.getInputStream(), "utf-8"));
String lines = "";
while((lines = br.readLine()) != null){
result+=lines;
}
postconn.disconnect();
}catch(Exception e){
e.printStackTrace();
}
return result;
}
public static String httpGet(String url){
String result = "";
try{URL geturl = new URL(url);HttpURLConnection postconn = (HttpURLConnection) geturl.openConnection();postconn.setRequestMethod("GET");postconn.setDoInput(true);BufferedReader
br = new BufferedReader(new InputStreamReader(postconn.getInputStream(), "utf-8"));String lines = "";while((lines = br.readLine()) != null){result += lines;}postconn.disconnect();}catch(Exception e){e.printStackTrace();}return result;}
取得返回的json字符串之后解析json,我使用的jackson的ObjectMapper
如果返回的错误信息,可以去开发文档中寻找对应的错误码调试,常见错误如下
1).开发配置时设置了密文或者半密文模式而项目中并未解密
2).appid或者appsecrent填写错误
3).url填写错误
4).服务器域名填写错误