|
|
|
@@ -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<String, String> 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<String, String> 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()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* 提供微信支付回调调用 |
|
|
|
|