1.开始是用SSM框架写支付的后台逻辑,包括订单,订单详情,支付,商品,商品价格几张表的基本的增删该查
第一个坑:因为不熟悉框架,但又不勤问老师,走了许多弯路。
1.1 js中顶对象:是顶层的窗口对象,top.dialog()弹框属性应该要与该顶部处于同一页面,才能弹出弹框,
坑点:自己在另一页页面使用top.dialog(),致使点击编辑按钮无弹框弹出
1.2订单用户地址三张表的关联查询:
开始按常规,创建了这几张表的实体类,很繁琐的写了代码,但在解析返回来的结果时,是json.get(0).getString( “用户”),通过调试看到字符串结果的结构时才正确取到了我想要的。后来按照框架的,用了一个PageData,替代了所有的实体类,并且轻松对结果进行了读取,直接json.getParameter( “”)搞定
还有一个是映射语句的问题,因为关联查询过程出现了字段重复问题,所以需要对其中一个取一个别名,则在读取该字段时,键名应该是我取得那个别名,而不是数据库中的字段名
2.支付流程遇到问题:
网页授权域名,及认证备案过的域名,不能加HTTP:前缀,否则会域名与后台配置不一致,如http://www.baidu.com,则应该填baidu.com,
JS安全域名,要填回掉地址,如baidu.com/callbackpayjs,调起微信JS对象完成支付,当时没有按照规则,填错了。
2.1解析的OpenID的遇到问题
通过httpGetUtil.httpRequestToString发送access_token,得到的是{“openid”=“fjjsjdfdsf”},解析成json对象,JsonObject jsonobject = JsonObject.from(“openid”),因为导入的net.sf.json包需要别的依赖包,正确的依赖是:
<!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.sf.ezmorph/ezmorph -->
<dependency>
<groupId>net.sf.ezmorph</groupId>
<artifactId>ezmorph</artifactId>
<version>1.0.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib -->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>com.hynnet</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
</dependency>
2.2将11个参数传给前台,object.put(“正文”,“这是商品的描述”),后面是中文会报乱码错误,原因是发起请求的工具解析编码是出现错误,需统一成UTF -8
wxpayutil.java中
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
httpRequest.java:
// 获取URLConnection对象对应的输出流
out =new PrintWriter(new OutputStreamWriter(conn.getOutputStream(),"UTF-8"));
httpUtil.java:
conn.setRequestProperty("Accept-Charset", "UTF-8");
conn.setRequestProperty("contentType", "utf-8");
String value = URLEncoder.encode(params.get(key), "UTF-8");
BufferedReader in = new BufferedReader(new InputStreamReader(is,
"UTF-8"));
3.1 微信公众号菜单配置:
微信公众号开发者模式下生成菜单,没有仔细读文档,或者文档上根本就没写也说不定就是怎样点关注,就会使用到回掉地址,进入自己写的后台程序解决方案:
在测试号管理的接口配置信息修改那填写你的后台程序的入口与路径(填写的URL需要正确响应微信发送的令牌验证)
这样点关注就能触发事件,进入程序
2.3关注时回复图文链接的排版出现错误,自己写成了多篇图文的格式,正确的是,
String articeArray="[{\"title\":\"标题\"},{\"description\":\"描述\"},{\"picurl\":\"https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=2552526776,4194968822&fm=26&gp=0.jpg\"},{\"url\":\"www.baidu.com\"}]";
其中XML转JSON出现错误
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(req.getInputStream(),"UTF-8"));
StringBuilder stringBuilder=new StringBuilder();
String inputstr="sdd";
while ((inputstr=bufferedReader.readLine())!=null){
stringBuilder.append(inputstr);
}
String inputstr1=stringBuilder.toString();
System.out.println(inputstr1);
JSONObject jsonObject=JSONObject.fromObject(inputstr1);
使用这种方式时需要接入XOM依赖包。
2.4
//此处touser是开发者公众号,fromUserName是用户的openid,,这是个坑
String toUserName = (String) jsonObject.get("ToUserName");
4.1 保存订单详情时,需要获得当前自增的主键 ,第一次是查出所有,再降序排列,取第一条,但高并发会出错,
换了种解决方式
<insert id="addOD" parameterType="java.util.Map">
<selectKey keyProperty="id" resultType="java.lang.String">
select LAST_INSERT_ID()
</selectKey>
INSERT INTO farm_orders_detail(
orders_id,
goods_id,
price,
quantity
) VALUES (
#{orders_id},
#{goods_id},
#{price},
#{quantity}
)
</insert>
用了mysql自带的 LAST_INSERT_ID() 函数轻松搞定,当时不理解
<selectKey keyProperty="id" resultType="java.lang.String">
select LAST_INSERT_ID()
</selectKey>
所以老是报错,后来知道它通过这个函数,获取到自增主键。
//创建订单
Map<String, String> order = new HashMap<String, String>();
String sn = get32UUID();
String createTime = pd.getString("createTime");
String unionid = pd.getString("unionid");
order.put("sn", sn);
order.put("createTime", createTime);
order.put("unionid", unionid);
ordersService.addOrder(order);
//创建订单详情
List<Map> orderList = JSONArray.fromObject(pd.getString("goods"));
for (Map m : orderList) {
m.put("orders_id", order.get("id"));
ordersDetailService.addOD(m);
total += (Integer.parseInt(m.get("price").toString()) * Integer.parseInt(m.get("quantity").toString()));
}
order.put("total", String.valueOf(total));
ordersService.updateOP(order);
JSONObject result = new JSONObject();
PrintWriter out = response.getWriter();
result.accumulate("msg", "success");
out.print(result);
out.flush();
out.close();
}
order.put("sn", sn);
order.put("createTime", createTime);
order.put("unionid", unionid);
ordersService.addOrder(order);
public void addOD(Map map) throws Exception {
dao.save("ordersDetailMapper.addOD", map);
}
<!----------------------------------->
<insert id="addOD" parameterType="java.util.Map">
<selectKey keyProperty="id" resultType="java.lang.String">
select LAST_INSERT_ID()
</selectKey>
INSERT INTO farm_orders_detail(
orders_id,
goods_id,
price,
quantity
) VALUES (
#{orders_id},
#{goods_id},
#{price},
#{quantity}
)
通过
int id=order.get("id");就可以拿到id,是通过map的键值对形式自动装载进order对象中