微信公众号开发-服务器配置
最近在进行公司的微信公众号和小程序的开发,由于都是由本人独立研发,所以框架和接口都要自己去搭去写,因此想把相关接口做完之后做一些记录,如今闲来无事就总结下相关接口,本篇内容为:微信公众号研发的服务器配置
1.微信公众平台配置
要进行服务器配置的话首先登入微信公众平台,总步骤如下:
- 登入微信公众平台 ,在左侧菜单栏最下方子菜单找到 开发–基本配置
- 点击进入 基本配置,出现下图
- 此处我已经进行过配置了,未进行配置的页面 服务器配置 相关信息应是空白。那么此页面需要配置的信息为 ip白名单+服务器配置信息,url填服务器+接口,token随便填,token用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性),密钥直接点随机生成,加解密方式选明文模式。
- 具体配置: ip白名单应配置为你的服务器ip地址(不知道自己的ip?看完本条看下一条),服务器地址应配置为你的项目发布的服务器地址(必须是已备案的域名,端口必须是80或443)+项目名+接口名,(此条看懂的话,第五第六条可跳过)
- 不知道自己的ip地址,打开cmd命令,windows输入ipconfig,Linux输入ifconfig,windows或者可以直接打开百度,然后输入ip至搜索框,点搜索,往下翻翻,就可以看到下图
- 你的项目发布的服务器地址(必须是已备案的域名,端口必须是80或443)+项目名+接口名 :意思是你的项目必须发布在一台外网可以访问到的服务器上,且发布的端口必须是80或443,如果你想用本机发布并调试的话,建议去natapp买一个外网映射工具,在网站里叫隧道(图一),再在本网站二级域名菜单里点击注册买个已备案的二级域名(图二),然后把域名绑定到隧道上,下载一个小工具,解压,修改一下配置,然后启动之后,本机地址就映射到外网了(图三);URL格式示例:http://top.XXX.cc/项目名/wechat
至此,微信公众平台上的配置就完成了,接下来是java端的接口写法。
2.JAVA接口写法
- 先看官方文档的说明
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
参数 | 描述 |
---|---|
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
官方文档链接:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319
官方文档里还给了个PHP的代码示例,不过我做的框架是java的SSM,开始有点懵,后来在网上借鉴相关在ssm里配置相关借口资料研究之后终于走通,所以现在直接贴出java的相关代码
Controller层
package com.wechat.controller;
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.wechat.service.WxService;
@RestController
@RequestMapping("/wxportal")
public class WxController {
@Autowired
private WxService wxService;
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private static org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger("logfile");
@ResponseBody
@GetMapping(produces = "text/plain;charset=utf-8")
public String authGet(@RequestParam(name = "signature", required = false) String signature,
@RequestParam(name = "timestamp", required = false) String timestamp,
@RequestParam(name = "nonce", required = false) String nonce,
@RequestParam(name = "echostr", required = false) String echostr) {
this.logger.info("\n接收到来自微信服务器的认证消息:[{}, {}, {}, {}]", signature, timestamp, nonce, echostr)