4 ngrok内网穿透
下载后启动服务器
输入隧道id:ae2d4bac22…
当访问http://wjwezhan.free.idcfengye.com时会跳转到本地。
为了防止free.idcfengye.com域名被别人恶意使用后被举报,重新编辑一下域名
此时再浏览器中输入 即可访问主页。
5 微信js扫码
5.1 微信JSSDK引入
5.1.1 前置需求
申请个人微信公众号
5.1.2 引入并修改工具类
在wx包下创建servlet包,并导入配置类。
package com.wangjiawei.wx.servlet; import java.io.IOException; 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.wangjiawei.wx.util.SignatureUtil; @WebServlet("/wxconf.do") public class WXConfig extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); PrintWriter pw = response.getWriter(); String urlText = request.getParameter("xurl"); try { String json = SignatureUtil.getConfig(urlText ).toJSON(); pw.println(json); } catch (Exception e) { e.printStackTrace(); } pw.close(); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
在wx包下创建util包,并导入三个工具类,SignatureUtil.java,TicketUtil.java,TokenUtil.java
进行如下修改:
1.SignatureUtil类 88 行的appid 否则无法调用api
2.TokenUtil类的34行的appid
3.TokenUtil类的35行的secret
appid和密钥来自于:
mp.weixin.qq.com --> 基本配置
5.1.3 添加js安全域名
公众号设置 —> 功能设置 —> JS接口安全域名
按照给出的提示设置上面定义过的wjwezhan.zaixianke.cn
5.1.4 添加白名单ip
映射服务器地址:64.69.43.237
本机ip地址: 211.162.81.72
5.1.5 设置自动回复
公众号设置自动回复后连接到http://wjwezhan.zaixianke.cn/login.html,登录后是用快递助手,点击扫码按钮即可跳出扫码界面。
6 取件
设计两种取件方式:
第一种是扫描用户的二维码,展示出该用户所有的快递,再对每一个快递可以有取件的操作。
第二种是快递员扫描某个快递的二维码,再将其显示后可以有一个取件的操作。
6.1 完善后台代码
BaseExpressDao中添加根据手机号和快递状态查询的方法:
/** * 根据用户手机号和快递状态查询所有快递 * @param userPhone 手机号 * @param status 快递状态 * @return 查询的快递信息,手机号不存在时返回null */ List<Express> findByUserPhoneAndStatus(String userPhone, int status);
在接口实现类中进行实现:
@Override public List<Express> findByUserPhoneAndStatus(String userPhone, int status) { ArrayList<Express> data = new ArrayList<>(); Connection conn = DruidUtil.getConnection(); PreparedStatement state = null; ResultSet result = null; try { state = conn.prepareStatement(SQL_FIND_BY_USERPHONE_AND_STATUS); state.setString(1,userPhone); state.setInt(2,status); result = state.executeQuery(); while (result.next()){ int id = result.getInt("id"); String number = result.getString("number"); String username = result.getString("username"); String company = result.getString("company"); String code = result.getString("code"); Timestamp inTime = result.getTimestamp("inTime"); Timestamp outTime = result.getTimestamp("outTime"); String sysPhone = result.getString("sysPhone"); Express e = new Express(id, number, username, userPhone, company, code, inTime, outTime, status, sysPhone); data.add(e); } }catch (SQLException throwables){ throwables.printStackTrace(); }finally { DruidUtil.close(conn,state,result); } return data; }
service中添加相应方法:
public static List<Express> findByUserPhoneAndStatus(String userPhone, int status) { return dao.findByUserPhoneAndStatus(userPhone, status); }
6.2 微信端后台实现
6.2.1 快递展示操作
wx包下ExpressController中添加查询快递的方法,如果用户扫描的是个人二维码,则展示其所有快递:
@ResponseBody("/wx/userExpressList.do") public String expressList(HttpServletRequest request, HttpServletResponse response){ String userPhone = request.getParameter("userPhone"); List<Express> list = ExpressService.findByUserPhoneAndStatus(userPhone, 0); // 转变为更好显示的格式 List<BootStrapTableExpress> list2 = new ArrayList<>(); for (Express e:list){ String inTime = DateFormatUtil.format(e.getInTime()); String outTime = e.getOutTime()==null?"未出库":DateFormatUtil.format(e.getOutTime()); String status = e.getStatus() == 0 ? "待取件":"已取件"; String code = e.getCode()==null ? "已取件":e.getCode(); BootStrapTableExpress e2 = new BootStrapTableExpress(e.getId(),e.getNumber(),e.getUsername(),e.getUserPhone(),e.getCompany(),code,inTime,outTime,status,e.getSysPhone()); list2.add(e2); } Message msg = new Message(); if (list.size() == 0){ msg.setStatus(-1); msg.setResult("未查询到快递"); }else { msg.setStatus(0); msg.setResult("查询成功"); msg.setData(list2); } String json = JSONUtil.toJSON(msg); return json; }
6.2.2 取件操作(更新status)
QRCodeController中添加取件的操作:
@ResponseBody("/wx/updateStatus.do") public String updateExpressStatus(HttpServletRequest request, HttpServletResponse response){ String code = request.getParameter("code"); boolean flag = ExpressService.updateStatus(code); Message msg = new Message(); if (flag){ msg.setStatus(0); msg.setResult("取件成功"); }else { msg.setStatus(-1); msg.setResult("取件码不存在,请更新二维码"); } String json = JSONUtil.toJSON(msg); return json; } QRCodeController中添加根据取件码输入框中的取件码查询快递的操作(应用于第二种取件方式): @ResponseBody("/wx/findExpressByCode.do") public String findExpressByCode(HttpServletRequest request, HttpServletResponse response){ String code = request.getParameter("code"); Express e = ExpressService.findByCode(code); BootStrapTableExpress e2 = null; if (e != null){ String inTime = DateFormatUtil.format(e.getInTime()); String status = "待取件"; e2 = new BootStrapTableExpress(e.getId(),e.getNumber(),e.getUsername(),e.getUserPhone(),e.getCompany(),code,inTime,null,status,e.getSysPhone()); } Message msg = new Message(); if (e == null){ msg.setStatus(-1); msg.setResult("取件码不存在"); }else { msg.setStatus(0); msg.setResult("查询成功"); msg.setData(e2); } String json = JSONUtil.toJSON(msg); return json; }