一旦手把手教你开发微信公众平台
目录
1: 初步认识微信公众平台
微信公众平台,简称weChat。曾命名为“官号平台”和“媒体平台”,最终定位为“公众平台”,无疑让我们看到一个微信对后续更大的期望。和新浪微博早期从明星战略着手不同,微信此时已经有了亿级的用户,挖掘自己用户的价值,为这个新的平台增加更优质的内容,创造更好的粘性,形成一个不一样的生态循环,是平台发展初期更重要的方向。利用公众账号平台进行自媒体活动,简单来说就是进行一对多的媒体性行为活动,如商家通过申请公众微信服务号通过二次开发展示商家微官网、微会员、微推送、微支付、微活动,微报名、微分享、微名片等,已经形成了一种主流的线上线下微信互动营销方式。
2: 如何申请微信公众平台测试号
- 首先微信公众平台提供了接口文档,地址为:http://mp.weixin.qq.com/wiki/home/index.html
- 打开接口页面之后,点击左侧菜单”测试号申请/在线调试”,点击子菜单”接口测试号申请”即可跳转到申请页面,开发者使用自己的微信账号扫描二维码之后系统会自动分配一个测试号给你。
- 然后我们需要在测试号页面填写相关信息之后即可开始开发。主要是完成接口配置信息修改,即填写一个URL作为响应微信服务器请求的地址。(1:不明白可以忽略,看完明白了再照着做。2:具体配置见下一步骤)
3: 接口配置信息
- 配置界面如图所示:
- 注意不明白的也不要太纠结为什么要配置这个,以后明白了也没什么。反正就是配置一个地址,这个地址即为你的一个后台访问路径,这个路径必须是能够访问到的,并且还必须是公网地址。
- 关于公网地址的问题,有的码农朋友可能舍不得花钱,那就搞个ngrok映射一下,这个我就不提供教程了。
4: 环境搭建以及验证消息真实性
- 环境介绍:本人采用spring+springMVC+hibernate搭建了一个后台。注意也可自己搭个其他环境,无所谓。(本教程用不到数据库)
- 解释:当一个关注了你的公众号的用户向你发消息或者图片等等之类的时候,微信服务器会向你的公众号配置的那个地址发送一个请求来通知你,并且你要给微信服务器返回你对这个事件的反应是什么。下面的这个步骤就是要教你如何判断这个请求是微信服务器发来的,而不是有人冒充微信服务器向你发送通知以达到不法目的。
- 首先提供一个controller,其中accept方法即为我上面配置的地址。
@Controller
@RequestMapping(value = "/hello")
public class HelloController {
private static final String url = "http://f5b3cbc2.ngrok.io" + "/weixin/";
/**
* 微信接入验证
*
* @desc 1. 将token、timestamp、nonce三个参数进行字典序排序
* @desc 2. 将三个参数字符串拼接成一个字符串进行sha1加密
* @desc 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
* */
@RequestMapping(value = "/accept.do", method = RequestMethod.GET)
@ResponseBody
public String accept(String signature, String timestamp, String nonce, String echostr) {
if (WeChatUtils.checkSignature(signature, timestamp, nonce)) {
return echostr;
}
return null;
}
}
- 本人写的一个工具类
public class WeChatUtils {
private static final String token = "hello";
public static Boolean checkSignature(String signature, String timestamp, String nonce) {
//sort
String[] arr = new String[] { token, timestamp, nonce };
Arrays.sort(arr);
StringBuffer sf = new StringBuffer();
for (int i = 0; i < arr.length; i++) {
sf.append(arr[i]);
}
//sha1加密
MessageDigest md;
try {
md = MessageDigest.getInstance("SHA");
// 执行摘要方法
byte[] digest = md.digest(sf.toString().getBytes());
String encriptStr = new HexBinaryAdapter().marshal(digest);
if (encriptStr.equalsIgnoreCase(signature)) {
return true;
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return false;
}
}