将微信订阅号的用户消息发到自己的服务器

2017-09-08  本文已影响0人  意浅离殇

首先进入微信公众号的开发者中心,找到服务器配置如下图:

![](http://ou8xokgeo.bkt.clouddn.com/2017/8/24/11429536612.png)

填写服务器的url  和token  如上图 具体代码如下:

`````java

@RequestMapping("/talk.do")

public void Talk(HttpServletRequest request,HttpServletResponse response) {

response.setCharacterEncoding("UTF-8");

boolean isGet = request.getMethod().toLowerCase().equals("get");

PrintWriter print;

if (isGet) {

// 微信加密签名

String signature = request.getParameter("signature");

// 时间戳

String timestamp = request.getParameter("timestamp");

// 随机数

String nonce = request.getParameter("nonce");

// 随机字符串

String echostr = request.getParameter("echostr");

// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败

if (signature != null && CheckoutUtil.checkSignature(StringConfig.Wen_Code,signature, timestamp, nonce)) {

try {

print = response.getWriter();

print.write(echostr);

print.flush();

} catch (IOException e) {

e.printStackTrace();

}

}

}else {

try {

// 接收消息并返回消息

new AcceptMessage().acceptMessage(request, response);

} catch (IOException e) {

e.printStackTrace();

}

}

}

`````

微信的token  检验时get请求。

我们获取4个参数 如下代码

```java

//              微信加密签名

String signature = request.getParameter("signature");

// 时间戳

String timestamp = request.getParameter("timestamp");

// 随机数

String nonce = request.getParameter("nonce");

// 随机字符串

String echostr = request.getParameter("echostr");

```

通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败

`CheckoutUtil.checkSignature(StringConfig.Wen_Code,signature, timestamp, nonce))`

checkSignature 的详细代码如下

```java

public class CheckoutUtil {

/**

* 验证签名

*

* @param signature

* @param timestamp

* @param nonce

* @return

*/

public static boolean checkSignature(String token,String signature, String timestamp, String nonce) {

String[] arr = new String[] { token, timestamp, nonce };

// 将token、timestamp、nonce三个参数进行字典序排序

// Arrays.sort(arr);

sort(arr);

StringBuilder content = new StringBuilder();

for (int i = 0; i < arr.length; i++) {

content.append(arr[i]);

}

MessageDigest md = null;

String tmpStr = null;

try {

md = MessageDigest.getInstance("SHA-1");

// 将三个参数字符串拼接成一个字符串进行sha1加密

byte[] digest = md.digest(content.toString().getBytes());

tmpStr = byteToStr(digest);

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

content = null;

// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信

return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;

}

/**

* 将字节数组转换为十六进制字符串

*

* @param byteArray

* @return

*/

private static String byteToStr(byte[] byteArray) {

String strDigest = "";

for (int i = 0; i < byteArray.length; i++) {

strDigest += byteToHexStr(byteArray[i]);

}

return strDigest;

}

/**

* 将字节转换为十六进制字符串

*

* @param mByte

* @return

*/

private static String byteToHexStr(byte mByte) {

char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

char[] tempArr = new char[2];

tempArr[0] = Digit[(mByte >>> 4) & 0X0F];

tempArr[1] = Digit[mByte & 0X0F];

String s = new String(tempArr);

return s;

}

public static void sort(String a[]) {

for (int i = 0; i < a.length - 1; i++) {

for (int j = i + 1; j < a.length; j++) {

if (a[j].compareTo(a[i]) < 0) {

String temp = a[i];

a[i] = a[j];

a[j] = temp;

}

}

}

}

}

```

如果能返回正确的结果就代表接入成功了,之后就可以将微信订阅号的用户输入的内容,传到自己的服务器了。

个人博客地址 www.haha174.top

上一篇下一篇

猜你喜欢

热点阅读