办公技巧
Office Skills联系我们
Contact us2022-9-20
我们在用WEB架设微信公众号或者小程序的时候,第一步就是要去微信公众平台(http://mp.weixin.qq.com)用微信登录,申请一个公众号作为媒介,通过微信的接口去完成我们想要的功能。
但是我们申请下来之后,要填写具体的个人服务器信息。我们要申请一个开发者ID(AppID)和生成一个开发者密码(AppSecret),还要将您的服务器IP填写到白名单中,这里服务器可以是虚拟主机、固定IP的服务器也可以是VPS这类产品。
最重要的一步就是服务器配置这里了。由于开发语言的不同,我们都知道WEB开发语言有很多种:大概可分ASP、ASP.NET、JSP、PHP等等。我们在配置服务器的时候,初学者都配置不成功,尤其是Token这一项,很多时候会和说明文档里的access_token这项混淆。其实这个token是服务器配置的密匙,好比说微信公众平台要连接你的服务器,怎么证明这个服务器就是你的呢?这里用到的就是token。您需要在您的服务器目录里建立可以发送的文件,微信公众号平台需要和您的网站有数据交换,平台会给您发送token令牌,你也要回复给公众号平台,这里需要动态网站技术的支持。
我们用最简单的asp举例,我们这里把asp文件起名为token.asp,并把此文件放入自己的服务器内(注意要有访问权限并正常访问)。
服务器地址(URL):这里填写http://www.xxx.com/token.asp (这里也可以是https:)
令牌(Token):这里填写您程序里写的密码
消息加解密密钥(EncodingAESKey):这里点右边的随机生成按钮即可
消息加解密方式:这里有三个选项,明文模式、兼容模式和安全模式(推荐)。这里我们为了操作方便,选择明文模式。
最后点击提交即可!
我们在开发文档中只能看到官方给我们提供PHP编程的例子,这显然是不适用的。你让JSP和asp等等的程序员情何以堪。我们介绍几个主流语言连接文件的编写方法,这里注意要把文件格式改为UTF-8,否则输出有乱码:
PHP:请详看帮助文档。
ASP:
<%
Response.Write request("echostr")
Response.End %>
这里不用写秘钥方法,进入基本配置的token里随便填写即可。
ASP.NET:
{
//微信服务器配置提交时,echoStr才不为空。
string echoStr = Request.QueryString["echoStr"];
if (echoStr != null)
{
if (CheckSignature())
{
if (!string.IsNullOrEmpty(echoStr))
{
Response.Write(echoStr); Response.End();
}
}
}
JAVA:
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.what21.weixin.utils.CheckoutUtils;
@WebServlet(name = "WeiXinAccessValidateServlet", urlPatterns = { "/wxav", "/wxavs" }, loadOnStartup = 1)
public class WeiXinAccessValidateServlet extends HttpServlet {
private static final long serialVersionUID = -339872708022690958L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
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 && CheckoutUtils.checkSignature(signature, timestamp, nonce)) {
try {
print = response.getWriter();
print.write(echostr);
print.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("signature->" + signature);
System.out.println("timestamp->" + timestamp);
System.out.println("nonce->" + nonce);
System.out.println("echostr->" + echostr);
}
}
}
package com.what21.weixin.utils;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class CheckoutUtils {
// 接口配置信息中的Token要一致
private static String token = "www_xxx_com";
/**
* 验证签名
*
* @param signature
* @param timestamp
* @param nonce
* @return
*/
public static boolean checkSignature(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
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
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;
}
/**
* @param a
*/
public static void sort(String a[]) {
for (int i = 0; i
for (int j = i + 1; j
if (a[j].compareTo(a[i])
String temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}}}}
以上代码仅供参考!