SpringBoot之开发流程
说明:
开发只作参考,不作限制,条条⼤路通罗马,本⽂只是实现当前业务的⼀种⽅式,需要优化的地⽅还有很多,共勉。      应系统业务拓展,加⼊模块。开发流程如下,本⽂共分六个部分:
1)后台与项⽬对接;(开启开发者模式)
2)获取AccessToken;
3)⾃定义菜单;
4)获取⽤户openid(⽤户在注册的基本信息)
5)页⾯跳转控制;
6)接收事件推送
⼀、后台与项⽬对接
通过阅读官⽅⽂档,可以得知若要接⼊平台开发,开发者需要按照以下三步流程:
1、填写服务器配置
解释:
1)服务器地址(URL):域名指向的IP端⼝必须是80端⼝和443端⼝
2)令牌(Token):须与后台配置的⼀致
3)消息加解密密钥(EncodingAESKey):随机⽣成即可
4)消息加解密⽅式:我选择的是明⽂模式,选加密模式也可以,看项⽬的私密性⽽定
5)最重要的⼀点:配服务器信息之后,需要添加⽩名单(域名指向的IP)
2、验证服务器地址的有效性
点击上图的提交,验证服务器地址等相关信息的有效性
验证通过后选择启⽤,则进⼊开发者模式,通过后台⾃定义事件失去效果
注意:
我们的应⽤服务器要接受服务器的get请求,其中包括四个参数(signature、timestamp、nonce、echostr),开                发者通过检验signature对请求进⾏校验。若确认此次GET请求来⾃服务器,请原样返回echostr参数内容,则接⼊⽣
效,成为开发者成功,否则接⼊失败。
1) 排序:将token、timestamp、nonce三个参数进⾏字典序排序
2) 加密:将三个参数字符串拼接成⼀个字符串进⾏SHA1加密,开发者获得加密后的字符串可与signature对⽐,标识该请求来源于
// 此处TOKEN即我们刚刚所填的token,须与后台配置的token保持⼀致
private static final String TOKEN = "obdkurongshenji";
@GetMapping(value = "/login")
public String checkName(@RequestParam(name = "signature") String signature,
@RequestParam(name = "timestamp") String timestamp, @RequestParam(name = "nonce") String nonce,
@RequestParam(name = "echostr") String echostr) throws UnsupportedEncodingException {
// 排序
String sortString = sort(TOKEN, timestamp, nonce);
// 加密
String myString = sha1(sortString);
// 校验
if (myString != null && myString != "" && myString.equals(signature)) {
// 如果检验成功原样返回echostr,服务器接收到此输出,才会确认检验完成。
logger.debug("-----------------------签名校验通过------------------------");
// ⾸次接⼊打开,成功创建之后请注释掉(⽣成⾃定义菜单)
Long id = tbWxAccesstokenService.selectMaxId();// 获取最后⼀个(未过期)token
String access_token = tbWxAccesstokenService.selectAccessTokeById(id);
logger.debug("-----------后端服务器地址:" + backUrl);
if (null != access_token) {
Menu menu = WebchatMenuUtil.initMenu(backUrl, appId);
} else {
logger.debug("-----------access_token获取失败------------");
}
return echostr;
} else {
logger.debug("-----------------------签名校验失败------------------------");
return null;
}
}
解释:
代码中涉及到的排序,加密的代码⽰例如下:
// 排序⽅法
public String sort(String token, String timestamp, String nonce) {
String[] strArray = { token, timestamp, nonce };
Arrays.sort(strArray);
StringBuilder sb = new StringBuilder();
for (String str : strArray) {
sb.append(str);
}
String();
}
/**
代码转换* 将字符串进⾏sha1加密
* @param str 需要加密的字符串
* @return 加密后的内容
*/
public String sha1(String str) {
try {
MessageDigest digest = Instance("SHA-1");
digest.Bytes());
byte messageDigest[] = digest.digest();
/
/ Create Hex String
StringBuffer hexString = new StringBuffer();
// 字节数组转换为 ⼗六进制 数
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = HexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexString.append(0);
}
hexString.append(shaHex);
}
String();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
⼆、获取AccessToken
1、定义:access_token是的全局唯⼀接⼝调⽤凭据,调⽤各接⼝时都需使⽤access_token。开发者需要进⾏妥善保存。access_token的存储⾄少要保留512个字符空间。access_token的有效期⽬前为2个⼩时,需定时刷新,重复获取将导致上次获取的access_token失效。
2、在库融审计项⽬中,⽤的是access_token持久化,每隔⼀个⼩时获取到新的access_token,则保存到数据库中,调⽤接⼝需要access_token时,从数据库中取出最新的access_token即可。
3、接⼝请求⽅式:GET
5、接⼝详情:
1、⾃定义菜单能够帮助丰富界⾯,让⽤户更好更快的理解的功能。开启⾃定义菜单后,界⾯如图所⽰:
注意:
1)⾃定义菜单最多包含3个⼀级菜单,每个菜单最多包含5个⼆级菜单
2)⼀级菜单最多四个汉字,⼆级菜单最多七个汉字,多出来的部分将会以”…”代替
3)创建⾃定义菜单后,菜单的刷新策略是,在⽤户进⼊会话页或profile页时,如果发现
上⼀次拉取菜单的请求在5分钟以前,就会拉取⼀下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
2、接⼝请求⽅式:POST
3、接⼝:ttps://api.weixin.qq/cgi-bin/menu/create?access_token=ACCESS_TOKEN
4、菜单⽰例:
private final static String CREATE_MENU_URL = "api.weixin.qq/cgi-bin/menu/create?
access_token=ACCESS_TOKEN";
private static Logger logger = Logger(WebchatMenuUtil.class);
public static int createMenu(String token, String menu) {
int result = 0;
String url = CREATE_place("ACCESS_TOKEN", token);
JSONObject jsonObject = WebchatHttpsUtil.httpsRequest(url, "POST", menu);
if (null != jsonObject) {
result = Integer("errcode");
}
logger.debug("----------------菜单初始化成功-------------------");
return result;
}
// 默认⾃定义菜单初始化
public static Menu initMenu(String backUrl, String appId) throws UnsupportedEncodingException {
Menu menu = new Menu();
ViewButton button11 = new ViewButton();
button11.setName("车辆列表");
button11.setType("view");
button11.setUrl(backUrl + "/freeter-api/wechatredirect/auth?state=carListPage");
ViewButton button12 = new ViewButton();
button12.setName("报警列表");
button12.setType("view");
button12.setUrl(backUrl + "/freeter-api/wechatredirect/auth?state=stockListPage");
Button button1 = new Button();
button1.setName("数据列表"); // 将button11/button12两个button作为⼆级菜单封装第⼀个⼀级菜单
button1.setSub_button(new Button[] { button11, button12 });
// 创建跳转到⼩程序的菜单
MiniprogramButton miniprogramButton = new MiniprogramButton();
miniprogramButton.setName("上线验证");
miniprogramButton.setType("miniprogram");
miniprogramButton.setAppid("appid");
miniprogramButton.setUrl("mp.weixin.qq");
miniprogramButton.setPagepath("pages/index/index");
ViewButton button3 = new ViewButton();
button3.setName("个⼈中⼼");
button3.setType("view");
button3.setUrl(backUrl + "/freeter-api/wechatredirect/auth?state=userInfoPage");
menu.setButton(new Button[] { button1, miniprogramButton, button3 });// 将31Button直接作为⼀级菜单        return menu;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。