diff --git a/mallinkService/src/main/java/com/simple/pay/WxPayOrderQ.java b/mallinkService/src/main/java/com/simple/pay/WxPayOrderQ.java new file mode 100644 index 000000000..517b1dc23 --- /dev/null +++ b/mallinkService/src/main/java/com/simple/pay/WxPayOrderQ.java @@ -0,0 +1,65 @@ +package com.simple.pay; + +/** + * Created by Stormeye on 2018/8/10. + */ +public class WxPayOrderQ { + private String appid; // 公众账号ID + private String mch_id; // 商户号 + private String nonce_str; // 随机字符串 + private String sign; // 签名 + private String out_trade_no; // 商户订单号 + + + public String getAppid() { + return appid; + } + + public void setAppid(String appid) { + this.appid = appid; + } + + public String getMch_id() { + return mch_id; + } + + public void setMch_id(String mch_id) { + this.mch_id = mch_id; + } + + public String getNonce_str() { + return nonce_str; + } + + public void setNonce_str(String nonce_str) { + this.nonce_str = nonce_str; + } + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + } + + public String getOut_trade_no() { + return out_trade_no; + } + + public void setOut_trade_no(String out_trade_no) { + this.out_trade_no = out_trade_no; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("WxPayOrder{"); + sb.append("appid='").append(appid).append('\''); + sb.append(", mch_id='").append(mch_id).append('\''); + sb.append(", nonce_str='").append(nonce_str).append('\''); + sb.append(", sign='").append(sign).append('\''); + sb.append(", out_trade_no='").append(out_trade_no).append('\''); + sb.append('}'); + return sb.toString(); + } +} diff --git a/mallinkService/src/main/java/com/simple/service/WxPayOrderService.java b/mallinkService/src/main/java/com/simple/service/WxPayOrderService.java index 1ebf9e81b..8ed43e065 100644 --- a/mallinkService/src/main/java/com/simple/service/WxPayOrderService.java +++ b/mallinkService/src/main/java/com/simple/service/WxPayOrderService.java @@ -20,6 +20,20 @@ public interface WxPayOrderService { */ ResultData createPayOrder(boolean isReal, WxAppinfo appInfo, WxCUser user, WxPayOrder record, EnumPayWay payWay); + /** + * 微信支付订单查询 + * @param appInfo 支付订单Appinfo + * @param record 支付订单 + */ + ResultData payOrderQuery(WxAppinfo appInfo, WxPayOrder record); + + /** + * 微信支付关闭订单 + * @param appInfo 支付订单Appinfo + * @param record 支付订单 + */ + ResultData payOrderClose(WxAppinfo appInfo, WxPayOrder record); + /** * 异步通知 * diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxPayOrderServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxPayOrderServiceImpl.java index 6ca8c8c39..67817f30e 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxPayOrderServiceImpl.java @@ -17,9 +17,7 @@ import com.simple.enums.EnumPayType; import com.simple.enums.EnumPayWay; import com.simple.exception.MallinkException; import com.simple.mapper.*; -import com.simple.pay.WxPay; -import com.simple.pay.WxPayOrderP; -import com.simple.pay.WxPayment; +import com.simple.pay.*; import com.simple.service.WxOrderService; import com.simple.service.WxPayOrderService; import com.simple.utils.BeanUtils; @@ -56,7 +54,8 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { @Autowired WxOrderService wxOrderService; - JSONObject errorMap = JSON.parseObject("{\"NOAUTH\":{\"detail\":\"商户无此接口权限\",\"reason\":\"商户未开通此接口权限\",\"resolution\":\"请商户前往申请此接口权限\"}," + + JSONObject errorMap = JSON.parseObject("{" + + "\"NOAUTH\":{\"detail\":\"商户无此接口权限\",\"reason\":\"商户未开通此接口权限\",\"resolution\":\"请商户前往申请此接口权限\"}," + "\"NOTENOUGH\":{\"detail\":\"余额不足\",\"reason\":\"用户帐号余额不足\",\"resolution\":\"用户帐号余额不足,请用户充值或更换支付卡后再支付\"}," + "\"ORDERPAID\":{\"detail\":\"商户订单已支付\",\"reason\":\"商户订单已支付,无需重复操作\",\"resolution\":\"商户订单已支付,无需更多操作\"}," + "\"ORDERCLOSED\":{\"detail\":\"订单已关闭\",\"reason\":\"当前订单已关闭,无法支付\",\"resolution\":\"当前订单已关闭,请重新下单\"}," + @@ -72,6 +71,18 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { "\"POST_DATA_EMPTY\":{\"detail\":\"post数据为空\",\"reason\":\"post数据不能为空\",\"resolution\":\"请检查post数据是否为空\"}," + "\"NOT_UTF8\":{\"detail\":\"编码格式错误\",\"reason\":\"未使用指定编码格式\",\"resolution\":\"请使用UTF-8编码格式\"}}"); + JSONObject errorMapQuery = JSON.parseObject("{" + + "\"ORDERNOTEXIST\":{\"detail\":\"此交易订单号不存在\",\"reason\":\"查询系统中不存在此交易订单号\",\"resolution\":\"该API只能查提交支付交易返回成功的订单,请商户检查需要查询的订单号是否正确\"},\n" + + "\"SYSTEMERROR\":{\"detail\":\"系统错误\t\",\"reason\":\"后台系统返回错误\",\"resolution\":\"系统异常,请再调用发起查询\"}}"); + + JSONObject errorMapClose = JSON.parseObject("{" + + "\"ORDERPAID\":{\"detail\":\"订单已支付\",\"reason\":\"订单已支付,不能发起关单\",\"resolution\":\"订单已支付,不能发起关单,请当作已支付的正常交易\"}," + + "\"SYSTEMERROR\":{\"detail\":\"系统错误\",\"reason\":\"系统错误\",\"resolution\":\"系统异常,请重新调用该API\"}," + + "\"ORDERCLOSED\":{\"detail\":\"订单已关闭\",\"reason\":\"订单已关闭,无法重复关闭\",\"resolution\":\"订单已关闭,无需继续调用\"}" + + "\"SIGNERROR\":{\"detail\":\"签名错误\",\"reason\":\"参数签名结果不正确\",\"resolution\":\"请检查签名参数和方法是否都符合签名算法要求\"}," + + "\"REQUIRE_POST_METHOD\":{\"detail\":\"请使用post方法\",\"reason\":\"未使用post传递参数\",\"resolution\":\"请检查请求参数是否通过post方法提交\"}," + + "\"XML_FORMAT_ERROR\":{\"detail\":\"XML格式错误\t\",\"reason\":\"XML格式错误\",\"reason\":\"请检查XML参数格式是否正确\"}}"); + @Override public ResultData createPayOrder(boolean isReal, WxAppinfo appInfo, WxCUser user, WxPayOrder record, EnumPayWay payWay) { final IdWorker idworker = IdWorker.get(); @@ -205,8 +216,97 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } // TODO - // 微信订单查询 - // 微信关闭订单 + /** + * 微信订单查询 + * + */ + @Override + public ResultData payOrderQuery(WxAppinfo appInfo, WxPayOrder record) { + // get payAccount + WxPayAccount payAccount = wxPayAccountMapper.selectByPrimaryKey(appInfo.getPayId()); + WxPayOrderQ payOrderQ = new WxPayOrderQ(); + String noncestr = Utility.generate32UUID(); + payOrderQ.setAppid(appInfo.getAppId()); + payOrderQ.setMch_id(payAccount.getMchId()); + payOrderQ.setNonce_str(noncestr); + payOrderQ.setOut_trade_no(record.getPayOrderNo()); + + try { + payOrderQ.setSign(WxPayment.createSign(BeanUtils.toStringMap(payOrderQ), payAccount.getApiKey())); + + String response = WxPay.orderQuery(BeanUtils.toStringMap(payOrderQ)); + + logger.info("pay order query, " + payOrderQ.toString() + ", response: " + response); + Map returnMap = WxPayment.xmlToMap(response); + String result_code = returnMap.get("result_code"); + if ("SUCCESS".equals(result_code)) { + String trade_state = returnMap.get("trade_state"); + //SUCCESS—支付成功 + //REFUND—转入退款 + //NOTPAY—未支付 + //CLOSED—已关闭 + //REVOKED—已撤销(刷卡支付) + //USERPAYING--用户支付中 + //PAYERROR--支付失败(其他原因,如银行返回失败) + if ("SUCCESS".equals(trade_state)) { + record.setPayOrderStatus(EnumPayStatus.PAY_WAY_SUCCESS.getCode()); + handlePayOrderStatusUpdate(record); + } else if ("USERPAYING".equals(trade_state)) { + //record.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode()); + //handlePayOrderStatusUpdate(record); + } else { + record.setPayOrderStatus(EnumPayStatus.PAY_WAY_FAIL.getCode()); + handlePayOrderStatusUpdate(record); + } + return new ResultData(Result.SUCCESS, "订单查询成功", returnMap); + } else { + JSONObject errObj = errorMap.getJSONObject(result_code); + return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errObj.toJSONString(), returnMap); + } + } catch (RuntimeException e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } catch (Exception e){ + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } + + } + /** + * 微信关闭订单 + */ + @Override + public ResultData payOrderClose(WxAppinfo appInfo, WxPayOrder record) { + // get payAccount + WxPayAccount payAccount = wxPayAccountMapper.selectByPrimaryKey(appInfo.getPayId()); + WxPayOrderQ payOrderC = new WxPayOrderQ(); + String noncestr = Utility.generate32UUID(); + payOrderC.setAppid(appInfo.getAppId()); + payOrderC.setMch_id(payAccount.getMchId()); + payOrderC.setNonce_str(noncestr); + payOrderC.setOut_trade_no(record.getPayOrderNo()); + + try { + payOrderC.setSign(WxPayment.createSign(BeanUtils.toStringMap(payOrderC), payAccount.getApiKey())); + + String response = WxPay.closeOrder(BeanUtils.toStringMap(payOrderC)); + + logger.info("pay order close, " + payOrderC.toString() + ", response: " + response); + Map returnMap = WxPayment.xmlToMap(response); + String result_code = returnMap.get("result_code"); + if ("SUCCESS".equals(result_code)) { + record.setPayOrderStatus(EnumPayStatus.PAY_WAY_FAIL.getCode()); + handlePayOrderStatusUpdate(record); + return new ResultData(Result.SUCCESS, "订单关闭成功", returnMap); + } else { + JSONObject errObj = errorMapClose.getJSONObject(result_code); + return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errObj.toJSONString(), returnMap); + } + } catch (RuntimeException e) { + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } catch (Exception e){ + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); + } + } + /** * 提供微信支付回调调用