@Log(title="微信支付(商品消费)",businessType = BusinessType.INSERT)
@PostMapping("/wechatpaygoods")
@ResponseBody
public Map<String,Object> wechatPayOrderInfo(OrderInfo orderInfo){
responseHeaderPage();
Long memberId = orderInfo.getMemberId();
String checkPrice = (String) orderInfo.getParams().get("checkActualPrice");
if(memberId != null && !memberId.equals(0L) && orderInfo.getGoodsType() != null && orderInfo.getGoodsId() != null && orderInfo.getGoodsId() != 0L && orderInfo.getGoodsNum() != null && StringUtils.isNotEmpty(checkPrice)) {
Member member = membersService.selectMemberByMemberId(memberId);
if(member != null) {
try {
orderInfo.setOrderType(0);
orderInfo = orderInfoService.submitOrderInfoPretreatment(orderInfo);
if(MoneyUtils.moneyComp(orderInfo.getOrderActualPrice(), "0.01")) {
}else {
return error("-2","业务逻辑错误:实际付款金额不得小于0.01元");
}
}catch(Exception e) {
e.getMessage();
e.printStackTrace();
return error("-2",e.getMessage());
}
orderInfo.setPaymentType(2);
WechatPublic wechatPublic = wechatPublicService.queryWechatPublicById(member.getWechatPublicId());
if(wechatPublic != null){
}else{
return error("-2","业务逻辑错误:店铺未开通微信支付功能");
}
String goodsName = "商品消费金额:" + orderInfo.getOrderActualPrice();
PayRecord payRecord = new PayRecord();
payRecord.setOrderCode(IdUtils.getUUIDKey());
payRecord.setOrderType(0);
payRecord.setOrderTitle(goodsName);
if(orderInfo.getGoodsType().equals(0)) {
payRecord.setGoodsId(orderInfo.getGoodsId());
}else {
payRecord.setPackageId(orderInfo.getGoodsId());
}
payRecord.setPayCost(orderInfo.getOrderActualPrice());
payRecord.setTopUpCost(orderInfo.getOrderTotalPrice());
payRecord.setMemberId(memberId);
payRecord.setTopUpNum((long)(int)orderInfo.getGoodsNum());
payRecord.setCouponsOperateIdStr(orderInfo.getCheckedCouponsOperate());
if(orderInfo.getFlagForAppoint() == 1){
payRecord.setRemark(orderInfo.getAppointDate() + "," + orderInfo.getAppointTime() + "," + orderInfo.getAppointPhoneNum());
}
payRecordService.insertPayRecord(payRecord);
String notifyUrl = Global.getConfig("ruoyi.api_head_url") + "/api/orderinfo/wechatpayorderinfocallback";
Map<String,Object> wechatPayMap = wechatUnifiedOrder(goodsName,payRecord.getOrderCode(),payRecord.getPayCost(),notifyUrl,member.getOpenid(),wechatPublic.getAppletId(),wechatPublic.getMchId(),wechatPublic.getMchKey());
wechatPayMap.put("payRecordId", payRecord.getRecordId());
return wechatPayMap;
}else {
return error("-1","非法参数:该会员信息不存在");
}
}else {
return error("-1","非法参数:会员ID或订单总金额为空");
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
protected Map<String,Object> wechatUnifiedOrder(String goodsName, String orderCode, String buyCost, String notifyUrl, String openId, String appId, String mchId,String mchKey){
Map<String,Object> response = new HashMap<String,Object>();
try {
String nonce_str = WXPayUtil.generateNonceStr();
String body = goodsName;
String out_trade_no = orderCode;
String total_fee = MoneyUtils.moneyMul(buyCost, "100");
String spbill_create_ip = IpUtils.getIpAddr(getRequest());
String notify_url = notifyUrl;
String trade_type = "JSAPI";
String openid = openId;
String mch_key = mchKey;
Map<String,String> packageParams = new HashMap<String,String>();
packageParams.put("appid", appId);
packageParams.put("mch_id", mchId);
packageParams.put("nonce_str", nonce_str);
packageParams.put("body", new String(body.getBytes(),"utf-8"));
packageParams.put("out_trade_no", out_trade_no);
packageParams.put("total_fee", total_fee);
packageParams.put("spbill_create_ip", spbill_create_ip);
packageParams.put("notify_url", notify_url);
packageParams.put("trade_type", trade_type);
packageParams.put("openid", openid);
String xmlParam = WXPayUtil.generateSignedXml(packageParams, mch_key);
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
HttpEntity formEntity = new HttpEntity(xmlParam ,headers);
System.out.println("调试模式_统一下单接口 请求XML数据:" + formEntity);
String result = new String(restTemplate.postForObject(WechatConstants.API_PAY_UNIFIEDORDER, formEntity, String.class).getBytes(),"UTF-8");
System.out.println("调试模式_统一下单接口 返回XML数据:" + result);
Map map = WechatPayUtils.doXMLParse(result);
String return_code = (String) map.get("return_code");
if(return_code.equals("SUCCESS")){
response.put("return_code", "SUCCESS");
String prepay_id = (String) map.get("prepay_id");
response.put("nonceStr", nonce_str);
response.put("package", "prepay_id=" + prepay_id);
Long timeStamp = System.currentTimeMillis() / 1000;
response.put("timeStamp", timeStamp + "");
String stringSignTemp = "appId=" + appId + "&nonceStr=" + nonce_str + "&package=prepay_id=" + prepay_id+ "&signType=" + "MD5" + "&timeStamp=" + timeStamp;
String paySign = WechatPayUtils.sign(stringSignTemp, mchKey, "utf-8").toUpperCase();
logger.info("=======================第二次签名:" + paySign + "=====================");
response.put("paySign", paySign);
response.put("appid", appId);
}else {
response.put("return_code", "ERROR");
response.put("msg", "统一下单接口调用失败 "+(String) map.get("return_msg"));
}
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
@PostMapping("/wechatpayorderinfocallback")
@ResponseBody
public void wechatPayFastConCallBack(HttpServletRequest request,HttpServletResponse response) {
logger.info("微信回调接口方法start");
logger.info("微信回调接口操作逻辑start");
String inputLine = "";
String notifyXml = "";
try {
while((inputLine = request.getReader().readLine()) != null) {
notifyXml += inputLine;
}
request.getReader().close();
logger.info("微信回调内容信息:" + notifyXml);
@SuppressWarnings("unchecked")
Map<String,String> map = WechatPayUtils.doXMLParse(notifyXml);
if("SUCCESS".equals(map.get("result_code"))) {
logger.info("微信回调返回是否支付成功:是");
String outTradeNo = map.get("out_trade_no");
logger.info("微信回调返回商户订单号:" + outTradeNo);
PayRecord payRecord = payRecordService.selectPayRecordByCode(outTradeNo);
if(payRecord.getPayStatus().equals(0)) {
OrderInfo orderInfo = new OrderInfo();
orderInfo.setPaymentType(2);
orderInfo = orderInfoService.insertOrderInfoPretreatment(orderInfo, payRecord);
orderInfo.setThirdPartyNumber(payRecord.getOrderCode());
int rows = orderInfoService.insertOrderInfo(orderInfo);
if(rows > 0) {
try {
rows = orderInfoService.orderInfoPaymentSuccessfully(orderInfo);
}catch(Exception e) {
e.getMessage();
e.printStackTrace();
}
}
payRecord.setOrderId(orderInfo.getOrderInfoId());
payRecord.setPayStatus(1);
payRecordService.updatePayRecord(payRecord);
logger.info("微信回调 会员商品消费付款成功");
StringBuffer buffer = new StringBuffer();
buffer.append("<xml>");
buffer.append("<return_code>SUCCESS</return_code>");
buffer.append("<return_msg>OK</return_msg>");
buffer.append("<xml>");
PrintWriter writer = response.getWriter();
writer.print(buffer.toString());
}
}
}catch(IOException e) {
e.printStackTrace();
}catch(Exception e) {
e.getMessage();
e.printStackTrace();
}
}