package com.ishop.merchant.support; import com.iplatform.base.VariableConstants; import com.iplatform.core.BeanContextAware; import com.iplatform.model.po.S_pay_notify; import com.iplatform.model.po.S_pay_order; import com.iplatform.pay.support.DefaultWechatV2OrderCallback; import com.ishop.merchant.BalanceRecordConstants; import com.ishop.merchant.OrderConstants; import com.ishop.merchant.PayConstants; import com.ishop.merchant.UserRegCache; import com.ishop.merchant.service.PayServiceImpl; import com.ishop.merchant.util.PayUtils; import com.ishop.model.po.EbOrder; import com.ishop.model.po.EbRechargeOrder; import com.ishop.model.po.EbUser; import com.ishop.model.po.EbUserBalanceRecord; import com.walker.infrastructure.utils.DateUtils; import com.walker.infrastructure.utils.NumberGenerator; import com.walker.infrastructure.utils.StringUtils; import com.walker.pay.NotifyValue; import com.walker.pay.PayStatus; import com.walker.pay.wechat.Constants; import com.walker.pay.wechat.v2.NotifyOrder; public class MerchantWechatOrderCallback extends DefaultWechatV2OrderCallback { /** * 订单通知:更新系统订单状态,写入平台通知记录。 *
     *     重写支付平台中,通知订单完成方法:
     *     1) 更新电商模块,订单支付状态
     *     2) 对于虚拟商品,自动发货,更新订单为'已完成'
     * 
* @param notifyValue * @date 2023-07-08 * @date 2023-09-09 虚拟商品,自动发货,更新订单为'已完成' */ @Override protected void doNotifyOrderPay(NotifyValue notifyValue){ long orderId = Long.parseLong(notifyValue.getOrderId()); S_pay_notify exist = this.getPayService().get(new S_pay_notify(orderId)); if(exist != null && exist.getPay_status().equals(PayStatus.Success.getIndex())){ logger.warn("订单通知已经接收,而且支付成功,不再重复处理,notifyId = {}, orderId = {}", notifyValue.getId(), orderId); return; } S_pay_notify s_pay_notify = this.acquirePayNotify(notifyValue); // 2023-09-12 根据平台订单判断是哪种支付:消费、充值、退款等 S_pay_order platformOrder = this.getPayService().get(new S_pay_order(orderId)); String attach = platformOrder.getAttach(); // String attach = notifyValue.getData().getAttach(); String[] attachArray = StringUtils.commaDelimitedListToStringArray(attach); String payServiceType = attachArray[0]; // String userId = attachArray[1]; // 2023-08-28 由于微信通知没有返回attach,所以这里直接查支付订单,如果退款则不再这里处理! if(payServiceType.equals(PayConstants.PAY_SERVICE_TYPE_ORDER)){ this.processOrder(orderId, notifyValue, s_pay_notify, exist); } else if(payServiceType.equals(PayConstants.PAY_SERVICE_TYPE_RECHARGE)){ this.processRecharge(orderId, s_pay_notify, exist); } else { throw new UnsupportedOperationException("未实现支付通知回调,payServiceType=" + payServiceType); } // if(payServiceType.equals(PayConstants.PAY_SERVICE_TYPE_ORDER)){ // // 订单通知 // EbOrder ebOrder = this.getPayService().get(new EbOrder(orderId)); // ebOrder.setOutTradeNo(notifyValue.getTradeNo()); // 微信订单id // this.getPayService().execPayWechatPublic(ebOrder, s_pay_notify, exist != null); // logger.debug("微信通知更新订单,orderId={}", orderId); // } else { // // 其他通知 // logger.warn("微信v2,其他通知,未实现代码!"); // } } private void processRecharge(long orderId, S_pay_notify s_pay_notify, S_pay_notify exist){ EbRechargeOrder rechargeOrder = this.getPayService().get(new EbRechargeOrder(orderId)); rechargeOrder.setPaid(1); rechargeOrder.setPayTime(DateUtils.getDateTimeNumber()); rechargeOrder.setUpdateTime(rechargeOrder.getPayTime()); long userId = rechargeOrder.getUid(); double addPrice = rechargeOrder.getPrice() + rechargeOrder.getGivePrice(); EbUser user = BeanContextAware.getBeanByType(UserRegCache.class).get(userId); double balance = user.getNowMoney() + addPrice; // 余额变动对象 EbUserBalanceRecord record = new EbUserBalanceRecord(); record.setId(NumberGenerator.getLongSequenceNumber()); record.setCreateTime(DateUtils.getDateTimeNumber()); record.setUid(userId); // record.setLinkId(rechargeOrder.getOrderNo()); record.setLinkId(String.valueOf(orderId)); record.setLinkType(BalanceRecordConstants.BALANCE_RECORD_LINK_TYPE_RECHARGE); record.setType(BalanceRecordConstants.BALANCE_RECORD_TYPE_ADD); record.setAmount(addPrice); record.setBalance(balance); record.setRemark(BalanceRecordConstants.BALANCE_RECORD_REMARK_RECHARGE + addPrice); record.setSign(PayUtils.acquireUserBalanceSign(userId, addPrice, balance, VariableConstants.TOKEN_SECRET)); record.setMonth(Integer.parseInt(DateUtils.getYearMonthCurrentValue())); this.getPayService().execRechargeWechatNotify(rechargeOrder, record, addPrice, s_pay_notify, exist != null); // 更新缓存中用户余额,为外面更新准备 user.setNowMoney(user.getNowMoney() + addPrice); logger.debug("微信通知更新(充值)订单,orderId={}", orderId); } private void processOrder(long orderId, NotifyValue notifyValue, S_pay_notify s_pay_notify, S_pay_notify exist){ EbOrder ebOrder = this.getPayService().get(new EbOrder(orderId)); ebOrder.setOutTradeNo(notifyValue.getTradeNo()); // 微信订单id ebOrder.setPayType(PayConstants.PAY_TYPE_WE_CHAT); ebOrder.setUpdateTime(DateUtils.getDateTimeNumber()); String tradeType = notifyValue.getTradeType(); if(StringUtils.isEmpty(tradeType)){ ebOrder.setPayChannel("none"); } else if(tradeType.equals(Constants.PAY_TYPE_H5)){ ebOrder.setPayChannel(PayConstants.PAY_CHANNEL_WECHAT_PUBLIC); } else if(tradeType.equals(Constants.PAY_TYPE_APP)){ ebOrder.setPayChannel(PayConstants.PAY_CHANNEL_WECHAT_APP_ANDROID); } else if(tradeType.equals(Constants.PAY_TYPE_NATIVE)){ ebOrder.setPayChannel(PayConstants.PAY_CHANNEL_WECHAT_MINI); } else { ebOrder.setPayChannel(tradeType); } // 2023-09-09 if(PayUtils.isAutoShippingDone(ebOrder.getOrderNo())){ // 当余额支付是,虚拟商品自动完成订单,无需发货 ebOrder.setStatus(OrderConstants.ORDER_STATUS_COMPLETE); } this.getPayService().execPayWechatPublic(ebOrder, s_pay_notify, exist != null); logger.debug("微信通知更新订单,orderId={}", orderId); } private PayServiceImpl getPayService(){ return BeanContextAware.getBeanByType(PayServiceImpl.class); } }