/**
* 官微-客服订单在线支付接口(微信内部支付)
*
* @param request
* @param response
*/
@SuppressWarnings("unchecked")
@ResponseBody
@RequestMapping(value = "/unvalidate/erpOrderPay", method = RequestMethod.POST)
public Map<String, Object> erpOrderPay(HttpServletRequest request, HttpServletResponse response) throws Exception {
logger.info("erpOrderPay start");
Map<String, Object> resultMap = new HashMap<String, Object>();
// 获取订单编号
String number = request.getParameter("number");
// 获取支付金额
String amount = request.getParameter("amount");
// 获取订单信息
ErpOrderBase erpOrderBase = erpOrderBaseService.getByNumber(number);
if (null == erpOrderBase) {
resultMap.put("success", false);
resultMap.put("code", "1");
resultMap.put("body", null);
resultMap.put("msg", "订单信息不存在");
return resultMap;
}
// 判断支付状态,防止重复支付
// 订单状态 0:未支付 1:已支付 2:已支付订金
if (erpOrderBase.getStatus() == 1) {
resultMap.put("success", false);
resultMap.put("code", "3");
resultMap.put("body", null);
resultMap.put("msg", "请勿重复支付");
return resultMap;
}
// 判断支付金额
int price100 = new BigDecimal(amount).multiply(new BigDecimal(100)).intValue();
if (price100 <= 0) {
resultMap.put("success", false);
resultMap.put("code", "2");
resultMap.put("body", null);
resultMap.put("msg", "支付金额错误");
return resultMap;
}
// 设置回调地址
String notify_url = "对应的回调地址";
//用订单编号+随机时间戳,生成唯一订单号
String numberCurrent = number + "_" +System.currentTimeMillis();
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("appid", ConfigUtil.WAP_APPID);// 公众账号ID
parameters.put("mch_id", ConfigUtil.WAP_MCH_ID);//商户号
parameters.put("nonce_str", WXPayUtil.generateNonceStr());// 随机字符串
parameters.put("body", "延保订单在线支付");// 商品描述
parameters.put("out_trade_no", numberCurrent); // 订单号
parameters.put("fee_type", "CNY");// 金额类型
parameters.put("total_fee", String.valueOf(price100));// 标价金额
parameters.put("spbill_create_ip", CommonUtil.getIpAddress(request));// 终端IP
parameters.put("notify_url", notify_url);// 回调地址
parameters.put("sign_type", "MD5");// 签名方式
parameters.put("trade_type", "JSAPI");// 交易类型
// openid需要获取
String openid = request.getParameter("openid");
parameters.put("openid", openid);// 用户标识
// parameters.put("openid", "ojdHFs0ZZTgrxpc2Fb090To_6MkI");// 测试-写死
// 设置签名
logger.info("得到的集合是-----------" + parameters.toString());
String sign = WXPayUtil.generateSignature(parameters, ConfigUtil.WAP_API_KEY);
parameters.put("sign", sign);
// 封装请求参数结束
String requestXML = WXPayUtil.mapToXml(parameters);
logger.info("requestXML:" + requestXML);
// 调用统一下单接口
String result = PayCommonUtil.httpsRequest(ConfigUtil.UNIFIED_ORDER_URL, "POST", requestXML);
logger.info("\n" + result);
// 预支付id
String prepay_id = "";
try {
/** 统一下单接口返回正常的 ,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay **/
Map<String, String> map = WXPayUtil.xmlToMap(result);
String resultCode = map.get("result_code");
if ("FAIL".equals(resultCode)) {
resultMap.put("success", false);
resultMap.put("code", "201");
resultMap.put("body", null);
resultMap.put("msg", "微信支付失败");
return resultMap;
}
logger.info(" map " + map.toString());
String returnCode = map.get("return_code");
if (returnCode.equals("SUCCESS") && resultCode.equals("SUCCESS")) {
prepay_id = (String) map.get("prepay_id");
} else {
resultMap.put("success", false);
resultMap.put("code", "200");// 请求成功
resultMap.put("body", null);
resultMap.put("msg", "微信支付失败");
return resultMap;
}
//重新生成签名
Map<String, String> backMap = new HashMap<String, String>();
backMap.put("appId", ConfigUtil.WAP_APPID);
backMap.put("timeStamp",WXPayUtil.getCurrentTimestamp() + "");
backMap.put("nonceStr", WXPayUtil.generateNonceStr());
backMap.put("package","prepay_id="+prepay_id);
backMap.put("signType","MD5");
String paySign = null;
try {
paySign = WXPayUtil.generateSignature(backMap, ConfigUtil.WAP_API_KEY);
backMap.put("paySign",paySign);
} catch (Exception e) {
e.printStackTrace();
}
resultMap.put("success", true);
resultMap.put("code", "200"); // 请求成功
resultMap.put("body", backMap); // 返回前端参数
resultMap.put("msg", null);
} catch (JDOMException e) {
resultMap.put("success", false);
resultMap.put("code", "500");// 请求失败
resultMap.put("body", null);
resultMap.put("msg", "微信支付失败,请重试");
logger.error(e.toString());
} catch (IOException e) {
resultMap.put("success", false);
resultMap.put("code", "500");// 请求失败
resultMap.put("body", null);
resultMap.put("msg", "微信支付失败,请重试");
logger.error(e.toString());
} catch (Exception e) {
e.printStackTrace();
}
return resultMap;
}
/**
* 微信异步通知,回调地址,处理业务
*
* (客服订单在线支付)
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
@ResponseBody
@RequestMapping(value = "/unvalidate/erpOrderNotify", method = RequestMethod.POST)
public void erpOrderNotify(HttpServletRequest request, HttpServletResponse response)
throws IOException, JDOMException, ApplicationException {
logger.info("erpOrderNotify start");
// 读取参数
InputStream inputStream;
StringBuffer sb = new StringBuffer();
inputStream = request.getInputStream();
String s;
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
while ((s = in.readLine()) != null) {
sb.append(s);
}
in.close();
inputStream.close();
// 解析xml成map
Map<String, String> m = new HashMap<String, String>();
m = XMLUtil.doXMLParse(sb.toString());
for (Object keyValue : m.keySet()) {
logger.info(keyValue + "=" + m.get(keyValue));
}
// 过滤空 设置 TreeMap
SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();
Iterator it = m.keySet().iterator();
while (it.hasNext()) {
String parameter = (String) it.next();
String parameterValue = m.get(parameter);
String v = "";
if (null != parameterValue) {
v = parameterValue.trim();
}
packageParams.put(parameter, v);
}
// 判断签名是否正确
String resXml = "";
if (PayCommonUtil.isTenpayWapSign("UTF-8", packageParams)) {
if ("SUCCESS".equals((String) packageParams.get("result_code"))) {
// 这里是支付成功
/**
* // 执行自己的业务逻辑
*/
resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
logger.info("订单已成功处理");
} else {
logger.info("支付失败,错误信息:" + packageParams.get("err_code"));
resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
+ "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
}
}else {
resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
+ "<return_msg><![CDATA[通知签名验证失败]]></return_msg>" + "</xml> ";
logger.info("通知签名验证失败");
}
// ------------------------------
// 处理业务完毕
// ------------------------------
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
out.write(resXml.getBytes());
out.flush();
out.close();
}
微信公众号JSAPI支付接口及回调业务处理
最新推荐文章于 2024-09-03 22:45:00 发布