共计 3092 个字符,预计需要花费 8 分钟才能阅读完成。
微信开发之环境搭建
接入指南
接入概述
接入微信公众平台开发,开发者需要按照如下步骤完成:
1、填写服务器配置
2、验证服务器地址的有效性
3、依据接口文档实现业务逻辑
下面详细介绍这 3 个步骤。
第一步:填写服务器配置
登录微信公众平台官网后,在公众平台官网的开发 - 基本设置页面,勾选协议成为开发者,点击“修改配置”按钮,填写服务器地址(URL)、Token 和 EncodingAESKey,其中 URL 是开发者用来接收微信消息和事件的接口 URL。Token 可由开发者可以任意填写,用作生成签名(该 Token 会和接口 URL 中包含的 Token 进行比对,从而验证安全性)。EncodingAESKey 由开发者手动填写或随机生成,将用作消息体加解密密钥。
消息解密类型选择推荐兼容,方便调试和开发。
如果选择安全模式,返回的 xml 是进行加密,解密方式参考 文档
如果没有域名 推荐使用内网穿透工具 小花生或者 ngrok 等
详细 请看 ngrok 教程:https://blog.csdn.net/weixin_… 官网:https://www.ngrok.cc
第二步:验证消息的确来自微信服务器
开发者通过检验 signature 对请求进行校验(下面有校验方式)。若确认此次 GET 请求来自微信服务器,请原样返回 echostr 参数内容,则接入生效,成为开发者成功,否则接入失败。
signature 微信加密签名,signature 结合了开发者填写的 token 参数和请求中的 timestamp 参数、nonce 参数。
timestamp 时间戳
nonce 随机数
echostr 随机字符串
代码如下:
@GetMapping(“getToken”)
@ResponseBody
public String getToken(HttpServletRequest request) {
String signature = request.getParameter(“signature”);
String timestamp= request.getParameter(“timestamp”);
String nonce= request.getParameter(“nonce”);
String echostr = request.getParameter(“echostr”);
logger.info(signature);
logger.info(timestamp);
logger.info(nonce);
logger.info(echostr);
// 校验请求
boolean check = RequestParamType.check(timestamp, nonce ,signature);
if (check) {
logger.info(“ 接入成功。。”);
return echostr;
}else{
logger.info(“ 接入失败。。”);
return null;
}
}
check 工具类:
//token
private final static String token = “test”;
// 获取 token 验证
public static boolean check(String timestamp, String nonce,String signature){
/**
*
1)将 token、timestamp、nonce 三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行 sha1 加密
3)开发者获得加密后的字符串可与 signature 对比,标识该请求来源于微信
*/
logger.info(“token = “+token);
String [] strings = new String[] {token,timestamp,nonce};
Arrays.sort(strings);
String sha1Str = strings[0] + strings[1] + strings[2];
//sha1 加密
String string2Sha1 = Sha1Util.getSha1(sha1Str);
logger.info(“ 加密前:” + signature);
logger.info(“ 加密后:”+string2Sha1);
//signature 与生成的 signature 对比
if (string2Sha1 != null && string2Sha1.equalsIgnoreCase(signature)){
return true;
}
return false;
}
sha1 加密 工具类:
/**
* sha1 加密
* @param str 返回加密字符串
* @return
*/
public static String getSha1(String str) {
if (str == null || str.length() == 0) {
return null;
}
char hexDigits[] = {‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’};
try {
MessageDigest mdTemp = MessageDigest.getInstance(“sha1”);
mdTemp.update(str.getBytes(“UTF-8″));
byte[] md = mdTemp.digest();
int j = md.length;
char buf[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
buf[k++] = hexDigits[byte0 & 0xf];
}
return new String(buf);
} catch (Exception e) {
logger.error(” sha1 加密异常!” + e);
e.getStackTrace();
return null;
}
}
第三步:依据接口文档实现业务逻辑
验证 URL 有效性成功后即接入生效,成为开发者。你可以在公众平台网站中申请微信认证,认证成功后,将获得更多接口权限,满足更多业务需求。
成为开发者后,用户每次向公众号发送消息、或者产生自定义菜单、或产生微信支付订单等情况时,开发者填写的服务器配置 URL 将得到微信服务器推送过来的消息和事件,开发者可以依据自身业务逻辑进行响应,如回复消息。
公众号调用各接口时,一般会获得正确的结果,具体结果可见对应接口的说明。返回错误时,可根据返回码来查询错误原因。全局返回码说明
用户向公众号发送消息时,公众号方收到的消息发送者是一个 OpenID,是使用用户微信号加密后的结果,每个用户对每个公众号有一个唯一的 OpenID。
此外,由于开发者经常有需在多个平台(移动应用、网站、公众帐号)之间共通用户帐号,统一帐号体系的需求,微信开放平台(open.weixin.qq.com)提供了 UnionID 机制。开发者可通过 OpenID 来获取用户基本信息,而如果开发者拥有多个应用(移动应用、网站应用和公众帐号,公众帐号只有在被绑定到微信开放平台帐号下后,才会获取 UnionID),可通过获取用户基本信息中的 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台帐号下的不同应用,UnionID 是相同的。详情请在微信开放平台的资源中心 - 移动应用开发 - 微信登录 - 授权关系接口调用指引 - 获取用户个人信息(UnionID 机制)中查看。
另请注意,微信公众号接口必须以 http:// 或 https:// 开头,分别支持 80 端口和 443 端口。
关注我