简单的说下支付的步骤:
1.微信商户号必须开通了当面支付功能。
2.拼接请求参数。
3.返回微信生成的url给客户端。
4.回调支付结果。
5.注意事项。
以下代码返回结果是二维码的url
public Map<String, String> OrderPay(HttpServletRequest request, Model model, HttpSession session, String body, Integer product_id, Integer money, String machine, String Ono, String Type) throws Exception {
Map<String, String> ordmap = new HashMap<String, String>();
Map<String, String> error = new HashMap<String, String>();
ordmap.put("appid", WXPayConfig.APPID); //公众账号ID
ordmap.put("mch_id", WXPayConfig.mch_id); //商户号
ordmap.put("nonce_str", WXPayUtil.generateNonceStr()); //随机字符串
ordmap.put("body", body); //商品描述
String out_trade_no = Ono; //获取商户订单号
ordmap.put("out_trade_no", out_trade_no); //商户订单号
ordmap.put("total_fee", String.valueOf(money)); //标价金额 单位为分
ordmap.put("spbill_create_ip", WXPayUtil.getAddrIp(request)); //终端IP
ordmap.put("notify_url", WXPayConfig.notify_url); //通知地址
ordmap.put("trade_type", Type); //交易类型
ordmap.put("product_id", String.valueOf(product_id)); //商品ID
ordmap.put("attach", machine); //订单来源
try {
String sign = WXPayUtil.generateSignature(ordmap, WXPayConfig.paternerKey);
ordmap.put("sign", sign); //签名
} catch (Exception e) {
error.put("error", "支付参数错误");
return error;
}
String orderxml = WXPayUtil.mapToXml(ordmap); //将数据转成XML格式
System.out.println(orderxml);
String data = HttpRequest.sendPost(WXPayConfig.order_url, orderxml);
System.out.println(data);
Map<String, String> ordermap = null;
if (data.indexOf("SUCCESS") != -1) {
ordermap = OrderMapData(data);
System.out.println(ordermap);
}
return ordermap;
}
支付完成后回调支付结果
public String checkPayResult(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("===支付回调====");
System.out.println("===支付回调====");
InputStream input = request.getInputStream();
ByteArrayOutputStream outsteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = input.read(buffer)) != -1) {
outsteam.write(buffer, 0, len);
}
String resultStr = new String(outsteam.toByteArray(), "utf-8");
outsteam.close();
input.close();
System.out.println("回调数据:" + resultStr);
Map<String, String> map = WXPayUtil.xmlToMap(resultStr);
String Ono = map.get("attach");
boolean parm = WXPayUtil.isSignatureValid(map, WXPayConfig.paternerKey);
System.out.println(map);
System.out.println(parm);
System.out.println(Ono);
if (parm == true) {
//业务代码
return "SUCCESS";
}
return null;
}
注意:
1.签名时注意编码格式。
2.金额处理用BigDecimal不然在支付19.90(自测)会出现损失精度的问题支付结果会变成19.89。