| @@ -6,7 +6,8 @@ package com.iformall.enums; | |||||
| public enum EnumPayVersion { | public enum EnumPayVersion { | ||||
| WX_PAY_V2(1, "微信支付2.0,老版本"), | WX_PAY_V2(1, "微信支付2.0,老版本"), | ||||
| WX_PAY_V3(2, "微信支付3.0,对接电商收付通"), | |||||
| WX_PAY_V3(2, "微信支付3.0,暂时还未接"), | |||||
| WX_PAY_V3_SFT(7,"对接电商收付通版本"), | |||||
| DY_PAY_V2(3,"抖音支付2.0,对接商品库"), | DY_PAY_V2(3,"抖音支付2.0,对接商品库"), | ||||
| NEU_POS_V1(4,"东软POS支付1.0版本"), | NEU_POS_V1(4,"东软POS支付1.0版本"), | ||||
| NO_VERSION(5,"无需支付,无版本"), | NO_VERSION(5,"无需支付,无版本"), | ||||
| @@ -10,10 +10,10 @@ import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils; | |||||
| import com.github.binarywang.wxpay.exception.WxPayException; | import com.github.binarywang.wxpay.exception.WxPayException; | ||||
| import com.github.binarywang.wxpay.service.WxPayService; | import com.github.binarywang.wxpay.service.WxPayService; | ||||
| import com.github.binarywang.wxpay.v3.util.RsaCryptoUtil; | import com.github.binarywang.wxpay.v3.util.RsaCryptoUtil; | ||||
| import com.iformall.service.pay.service.pay.wx.v3.entity.CombineCloseReq; | |||||
| import com.iformall.service.pay.service.pay.wx.v3.entity.CombinePayCommonMiniAppReq; | |||||
| import com.iformall.service.pay.service.pay.wx.v3.entity.PayCommonMiniAppReq; | |||||
| import com.iformall.service.pay.service.pay.wx.v3.entity.PayQueryReq; | |||||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTCombineCloseReq; | |||||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTCombinePayCommonMiniAppReq; | |||||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTPayCommonMiniAppReq; | |||||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTPayQueryReq; | |||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
| @@ -89,7 +89,7 @@ public class WxPayV3 { | |||||
| * 电商收付通-普通支付-小程序下单 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_3.shtml | * 电商收付通-普通支付-小程序下单 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_3.shtml | ||||
| * @throws WxPayException | * @throws WxPayException | ||||
| */ | */ | ||||
| public static String payCommonWithMiniApp(WxPayService payService,PayCommonMiniAppReq payReq) throws WxPayException { | |||||
| public static String payCommonWithMiniApp(WxPayService payService,SFTPayCommonMiniAppReq payReq) throws WxPayException { | |||||
| return payService.postV3WithWechatpaySerial(PAY_COMMON_MINIAPP_URL, JSON.toJSONString(payReq)); | return payService.postV3WithWechatpaySerial(PAY_COMMON_MINIAPP_URL, JSON.toJSONString(payReq)); | ||||
| } | } | ||||
| @@ -97,7 +97,7 @@ public class WxPayV3 { | |||||
| * 电商收付通-普通支付-查询 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_5.shtml | * 电商收付通-普通支付-查询 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_5.shtml | ||||
| * @throws WxPayException | * @throws WxPayException | ||||
| */ | */ | ||||
| public static String payCommonQuery(WxPayService payService,PayQueryReq payQuery) throws WxPayException { | |||||
| public static String payCommonQuery(WxPayService payService,SFTPayQueryReq payQuery) throws WxPayException { | |||||
| return payService.postV3WithWechatpaySerial(String.format(PAY_COMMON_QUERY_URL, payQuery.getOut_trade_no()), JSON.toJSONString(payQuery)); | return payService.postV3WithWechatpaySerial(String.format(PAY_COMMON_QUERY_URL, payQuery.getOut_trade_no()), JSON.toJSONString(payQuery)); | ||||
| } | } | ||||
| @@ -105,7 +105,7 @@ public class WxPayV3 { | |||||
| * 电商收付通-合单支付-小程序下单https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_4.shtml | * 电商收付通-合单支付-小程序下单https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_4.shtml | ||||
| * @throws WxPayException | * @throws WxPayException | ||||
| */ | */ | ||||
| public static String payCombineCommonWithMiniApp(WxPayService payService,CombinePayCommonMiniAppReq payReq) throws WxPayException { | |||||
| public static String payCombineCommonWithMiniApp(WxPayService payService,SFTCombinePayCommonMiniAppReq payReq) throws WxPayException { | |||||
| return payService.postV3WithWechatpaySerial(PAY_COMBINE_MINIAPP_URL, JSON.toJSONString(payReq)); | return payService.postV3WithWechatpaySerial(PAY_COMBINE_MINIAPP_URL, JSON.toJSONString(payReq)); | ||||
| } | } | ||||
| @@ -113,7 +113,7 @@ public class WxPayV3 { | |||||
| * 电商收付通-合单支付-查询 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_11.shtml | * 电商收付通-合单支付-查询 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_11.shtml | ||||
| * @throws WxPayException | * @throws WxPayException | ||||
| */ | */ | ||||
| public static String payCombineQuery(WxPayService payService,PayQueryReq payQuery) throws WxPayException { | |||||
| public static String payCombineQuery(WxPayService payService,SFTPayQueryReq payQuery) throws WxPayException { | |||||
| return payService.postV3WithWechatpaySerial(String.format(PAY_COMBINE_QUERY_URL, payQuery.getOut_trade_no()), null); | return payService.postV3WithWechatpaySerial(String.format(PAY_COMBINE_QUERY_URL, payQuery.getOut_trade_no()), null); | ||||
| } | } | ||||
| @@ -122,7 +122,7 @@ public class WxPayV3 { | |||||
| * 电商收付通-普通支付-关闭 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_11.shtml | * 电商收付通-普通支付-关闭 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_11.shtml | ||||
| * @throws WxPayException | * @throws WxPayException | ||||
| */ | */ | ||||
| public static String payCommonClose(WxPayService payService,PayQueryReq payQuery) throws WxPayException { | |||||
| public static String payCommonClose(WxPayService payService,SFTPayQueryReq payQuery) throws WxPayException { | |||||
| return payService.postV3WithWechatpaySerial(String.format(PAY_COMMON_CLOSE_ORDER_URL, payQuery.getOut_trade_no()), JSON.toJSONString(payQuery)); | return payService.postV3WithWechatpaySerial(String.format(PAY_COMMON_CLOSE_ORDER_URL, payQuery.getOut_trade_no()), JSON.toJSONString(payQuery)); | ||||
| } | } | ||||
| @@ -131,7 +131,7 @@ public class WxPayV3 { | |||||
| * 电商收付通-合单支付-关闭 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_12.shtml | * 电商收付通-合单支付-关闭 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_12.shtml | ||||
| * @throws WxPayException | * @throws WxPayException | ||||
| */ | */ | ||||
| public static String payCombineClose(WxPayService payService,CombineCloseReq closeOrder) throws WxPayException { | |||||
| public static String payCombineClose(WxPayService payService,SFTCombineCloseReq closeOrder) throws WxPayException { | |||||
| return payService.postV3WithWechatpaySerial(String.format(PAY_COMBINE_CLOSE_ORDER_URL, closeOrder.getCombine_out_trade_no()), JSON.toJSONString(closeOrder)); | return payService.postV3WithWechatpaySerial(String.format(PAY_COMBINE_CLOSE_ORDER_URL, closeOrder.getCombine_out_trade_no()), JSON.toJSONString(closeOrder)); | ||||
| } | } | ||||
| @@ -448,7 +448,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { | |||||
| } | } | ||||
| int share_amount = 0; | int share_amount = 0; | ||||
| int rate_amount = 0; | int rate_amount = 0; | ||||
| 11111111111111111111 | |||||
| //TODO 11111111111111111111 | |||||
| //todo 注意购物车模式(需测试)每笔子订单算法可能与总订单算法有差 | //todo 注意购物车模式(需测试)每笔子订单算法可能与总订单算法有差 | ||||
| for (WxOrder o : orderList) { | for (WxOrder o : orderList) { | ||||
| Long merchant_id = null; | Long merchant_id = null; | ||||
| @@ -22,12 +22,11 @@ import com.iformall.service.pay.service.pay.CDrivingPayService; | |||||
| import com.iformall.service.pay.service.pay.CPassivePayService; | import com.iformall.service.pay.service.pay.CPassivePayService; | ||||
| import com.iformall.service.pay.service.pay.PayAdapterService; | import com.iformall.service.pay.service.pay.PayAdapterService; | ||||
| import com.iformall.service.pay.service.pay.douyin.v1.miniApp.TtMiniAppPayAdapterService; | import com.iformall.service.pay.service.pay.douyin.v1.miniApp.TtMiniAppPayAdapterService; | ||||
| import com.iformall.service.pay.service.pay.wx.sft.h5.WxH5PaySFTService; | |||||
| import com.iformall.service.pay.service.pay.wx.sft.miniApp.appPay.WxMiniAppPaySFTAdapterService; | |||||
| import com.iformall.service.pay.service.pay.wx.v2.h5.WxH5PayService; | import com.iformall.service.pay.service.pay.wx.v2.h5.WxH5PayService; | ||||
| import com.iformall.service.pay.service.pay.wx.v2.miniApp.appPay.WxMiniAppPayAdapterService; | import com.iformall.service.pay.service.pay.wx.v2.miniApp.appPay.WxMiniAppPayAdapterService; | ||||
| import com.iformall.service.pay.service.pay.wx.v2.miniApp.maPay.WxMiniMaPayAdapterService; | import com.iformall.service.pay.service.pay.wx.v2.miniApp.maPay.WxMiniMaPayAdapterService; | ||||
| import com.iformall.service.pay.service.pay.wx.v3.h5.WxH5PayV3Service; | |||||
| import com.iformall.service.pay.service.pay.wx.v3.miniApp.appPay.WxMiniAppPayV3AdapterService; | |||||
| import com.iformall.service.pay.service.pay.wx.v3.miniApp.maPay.WxMiniMaPayV3AdapterService; | |||||
| import com.iformall.service.pay.service.refund.RefundPayAdapterService; | import com.iformall.service.pay.service.refund.RefundPayAdapterService; | ||||
| import com.iformall.service.pay.service.share.PayShareAdapterService; | import com.iformall.service.pay.service.share.PayShareAdapterService; | ||||
| @@ -47,17 +46,15 @@ public class PayServiceFactory { | |||||
| @Autowired | @Autowired | ||||
| WxMiniAppPayAdapterService wxMiniAppPayService; | WxMiniAppPayAdapterService wxMiniAppPayService; | ||||
| @Autowired | @Autowired | ||||
| WxMiniAppPayV3AdapterService wxMiniAppPayV3AdapterService; | |||||
| WxMiniAppPaySFTAdapterService wxMiniAppPayV3AdapterService; | |||||
| @Autowired | @Autowired | ||||
| WxMiniMaPayAdapterService wxMiniAppMaPayService; | WxMiniMaPayAdapterService wxMiniAppMaPayService; | ||||
| @Autowired | |||||
| WxMiniMaPayV3AdapterService wxMiniMaPayV3AdapterService; | |||||
| @Autowired | @Autowired | ||||
| WxH5PayService wxH5PayService; | WxH5PayService wxH5PayService; | ||||
| @Autowired | @Autowired | ||||
| WxH5PayV3Service wxH5PayV3Service; | |||||
| WxH5PaySFTService wxH5PayV3Service; | |||||
| @Autowired | @Autowired | ||||
| TtMiniAppPayAdapterService ttMiniAppPayService; | TtMiniAppPayAdapterService ttMiniAppPayService; | ||||
| @@ -89,11 +86,11 @@ public class PayServiceFactory { | |||||
| if (null == serviceMap) { | if (null == serviceMap) { | ||||
| serviceMap = new ConcurrentHashMap<String,PayAdapterService>(); | serviceMap = new ConcurrentHashMap<String,PayAdapterService>(); | ||||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxMiniAppPayService); | serviceMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxMiniAppPayService); | ||||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxMiniAppPayV3AdapterService); | |||||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxMiniAppPayV3AdapterService); | |||||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxMiniAppMaPayService); | serviceMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxMiniAppMaPayService); | ||||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxMiniMaPayV3AdapterService); | |||||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxMiniAppMaPayService); | |||||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT_WAP.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxH5PayService); | serviceMap.put(EnumPayWay.PAY_WAY_WECHAT_WAP.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxH5PayService); | ||||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT_WAP.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxH5PayV3Service); | |||||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT_WAP.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxH5PayV3Service); | |||||
| serviceMap.put(EnumPayWay.PAY_WAY_TT.getCode()+"_"+EnumPayVersion.DY_PAY_V2.getCode(),ttMiniAppPayService); | serviceMap.put(EnumPayWay.PAY_WAY_TT.getCode()+"_"+EnumPayVersion.DY_PAY_V2.getCode(),ttMiniAppPayService); | ||||
| } | } | ||||
| return serviceMap; | return serviceMap; | ||||
| @@ -103,7 +100,7 @@ public class PayServiceFactory { | |||||
| if (null == qrcodeMap) { | if (null == qrcodeMap) { | ||||
| qrcodeMap = new ConcurrentHashMap<String,PayAdapterService>(); | qrcodeMap = new ConcurrentHashMap<String,PayAdapterService>(); | ||||
| qrcodeMap.put(EnumAppPlat.WX.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxMiniAppPayService); | qrcodeMap.put(EnumAppPlat.WX.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxMiniAppPayService); | ||||
| qrcodeMap.put(EnumAppPlat.WX.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxMiniAppPayService); | |||||
| qrcodeMap.put(EnumAppPlat.WX.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxMiniAppPayService); | |||||
| qrcodeMap.put(EnumAppPlat.TOUTIAO.getCode()+"_"+EnumPayVersion.DY_PAY_V2.getCode(),ttMiniAppPayService); | qrcodeMap.put(EnumAppPlat.TOUTIAO.getCode()+"_"+EnumPayVersion.DY_PAY_V2.getCode(),ttMiniAppPayService); | ||||
| } | } | ||||
| return qrcodeMap; | return qrcodeMap; | ||||
| @@ -128,19 +125,19 @@ public class PayServiceFactory { | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_CREDIT.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxShareService); | shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_CREDIT.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxShareService); | ||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_GIFTLIST.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxShareService); | shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_GIFTLIST.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxShareService); | ||||
| shareMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_POS_NEU.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_MERCHANT.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_VERRIFY.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_B_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_CAR_STOP.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_SYSTEM_SEND.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_BATCH_SEND.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_TRADE.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_PASSWD.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_CREDIT.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_GIFTLIST.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_POS_NEU.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_MERCHANT.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_VERRIFY.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_B_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_CAR_STOP.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_SYSTEM_SEND.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_BATCH_SEND.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_TRADE.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_PASSWD.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_CREDIT.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_GIFTLIST.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareV3Service); | |||||
| } | } | ||||
| return shareMap; | return shareMap; | ||||
| } | } | ||||
| @@ -150,8 +147,8 @@ public class PayServiceFactory { | |||||
| refundMap = new ConcurrentHashMap<String, RefundPayAdapterService>(); | refundMap = new ConcurrentHashMap<String, RefundPayAdapterService>(); | ||||
| refundMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxRefundService); | refundMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxRefundService); | ||||
| refundMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxRefundService); | refundMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxRefundService); | ||||
| refundMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxRefundV3AdapterService); | |||||
| refundMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxRefundV3AdapterService); | |||||
| refundMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxRefundV3AdapterService); | |||||
| refundMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxRefundV3AdapterService); | |||||
| refundMap.put(EnumPayWay.PAY_WAY_TT.getCode()+"_"+EnumPayVersion.DY_PAY_V2.getCode(), ttRefundService); | refundMap.put(EnumPayWay.PAY_WAY_TT.getCode()+"_"+EnumPayVersion.DY_PAY_V2.getCode(), ttRefundService); | ||||
| } | } | ||||
| return refundMap; | return refundMap; | ||||
| @@ -162,8 +159,8 @@ public class PayServiceFactory { | |||||
| cashoutMap = new ConcurrentHashMap<String, CashOutAdapterService>(); | cashoutMap = new ConcurrentHashMap<String, CashOutAdapterService>(); | ||||
| cashoutMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxCashOutService); | cashoutMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxCashOutService); | ||||
| cashoutMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxCashOutService); | cashoutMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxCashOutService); | ||||
| cashoutMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxCashOutV3AdapterService); | |||||
| cashoutMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3.getCode(), wxCashOutV3AdapterService); | |||||
| cashoutMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxCashOutV3AdapterService); | |||||
| cashoutMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxCashOutV3AdapterService); | |||||
| } | } | ||||
| return cashoutMap; | return cashoutMap; | ||||
| } | } | ||||
| @@ -1,4 +1,4 @@ | |||||
| package com.iformall.service.pay.service.pay.wx.v2; | |||||
| package com.iformall.service.pay.service.pay.wx; | |||||
| import java.io.File; | import java.io.File; | ||||
| import java.util.Date; | import java.util.Date; | ||||
| @@ -51,22 +51,38 @@ import me.chanjar.weixin.open.api.WxOpenService; | |||||
| @Slf4j | @Slf4j | ||||
| public class BaseWxPayAdapterService { | public class BaseWxPayAdapterService { | ||||
| protected PayQueryAdapterResult queryPayStatus(WxPayOrder oldRecord, WxAppinfo appInfo, WxPayAccount payAccount) | |||||
| throws Exception { | |||||
| Map<String, String> retMap = WxPayOrderServiceHelper.wxOrderPayStatusMap(oldRecord, appInfo, payAccount); | |||||
| int code = WxPayOrderServiceHelper.getPayStatusFromMap(retMap,oldRecord.getPayOrderNo()); | |||||
| String msg = WxPayOrderServiceHelper.getPayStatusMsg(retMap, oldRecord.getPayOrderNo()); | |||||
| PayQueryAdapterResult result = new PayQueryAdapterResult(code, msg,null, retMap,retMap.get("transaction_id"),retMap.get("time_end")); | |||||
| return result; | |||||
| } | |||||
| protected int queryPayStatus(PayQueryAdapterResult statusObject, String orderOutNo) throws Exception { | |||||
| return WxPayOrderServiceHelper.getPayStatusFromMap((Map<String, String>) statusObject.getData(),orderOutNo); | |||||
| } | |||||
| @Autowired | |||||
| WxOpenService openService; | |||||
| @Autowired | |||||
| MaUtil maUtil; | |||||
| protected File getQrCode(WxAppinfo appinfo,String pageUrl,int type,String sceneParam) throws WxErrorException { | |||||
| boolean isFmOpen = false; | |||||
| WxMaService wxMaService; | |||||
| if(isFmOpen) { | |||||
| wxMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appinfo.getAppId()); | |||||
| } else { | |||||
| wxMaService = maUtil.getWeappService(appinfo); | |||||
| } | |||||
| protected int queryPayStatusCode(WxPayOrder oldRecord, WxAppinfo appInfo, WxPayAccount payAccount) | |||||
| throws Exception { | |||||
| return WxPayOrderServiceHelper.wxOrderPayStatus(oldRecord, appInfo, payAccount); | |||||
| boolean autoColor = false; | |||||
| boolean isHyaline = true; | |||||
| WxMaCodeLineColor color = new WxMaCodeLineColor("0", "0", "0"); | |||||
| String pathStr = ""; | |||||
| if (StringUtils.isNotBlank(sceneParam)) { | |||||
| pathStr = pageUrl + "?scene="+sceneParam; | |||||
| } else { | |||||
| pathStr = pageUrl; | |||||
| } | |||||
| if(type == 0) { | |||||
| final File codeFile = wxMaService.getQrcodeService().createQrcode(pathStr, QRCodeUtils.QR_WIDTH); | |||||
| return codeFile; | |||||
| }else { | |||||
| final File codeFile = wxMaService.getQrcodeService().createWxaCodeUnlimit(sceneParam, pageUrl, QRCodeUtils.QR_WIDTH, autoColor, color, isHyaline); | |||||
| return codeFile; | |||||
| } | |||||
| } | } | ||||
| JSONObject errorMapClose = JSON.parseObject("{" + | JSONObject errorMapClose = JSON.parseObject("{" + | ||||
| @@ -77,85 +93,17 @@ public class BaseWxPayAdapterService { | |||||
| "\"REQUIRE_POST_METHOD\":{\"detail\":\"请使用post方法\",\"reason\":\"未使用post传递参数\",\"resolution\":\"请检查请求参数是否通过post方法提交\"}," + | "\"REQUIRE_POST_METHOD\":{\"detail\":\"请使用post方法\",\"reason\":\"未使用post传递参数\",\"resolution\":\"请检查请求参数是否通过post方法提交\"}," + | ||||
| "\"XML_FORMAT_ERROR\":{\"detail\":\"XML格式错误\t\",\"reason\":\"XML格式错误\",\"reason\":\"请检查XML参数格式是否正确\"}}"); | "\"XML_FORMAT_ERROR\":{\"detail\":\"XML格式错误\t\",\"reason\":\"XML格式错误\",\"reason\":\"请检查XML参数格式是否正确\"}}"); | ||||
| protected PayAdapterResult closeOrder(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) { | |||||
| String response = closeOrderWx(appInfo, record,payAccount); | |||||
| log.info("pay order close, " + record.toString() + ", response: " + response); | |||||
| Map<String, String> returnMap = WxPayment.xmlToMap(response); | |||||
| String return_code = returnMap.get("return_code"); | |||||
| String result_code = returnMap.get("result_code"); | |||||
| if ("SUCCESS".equalsIgnoreCase(return_code)) { | |||||
| if ("SUCCESS".equals(result_code)) { | |||||
| return new PayAdapterResult(true, "success", returnMap, null); | |||||
| } else { | |||||
| String errMsg = ""; | |||||
| JSONObject errObj = errorMapClose.getJSONObject(result_code); | |||||
| if (errObj != null) { | |||||
| errMsg = errObj.toJSONString(); | |||||
| } else { | |||||
| errMsg = returnMap.get("return_msg"); | |||||
| } | |||||
| return new PayAdapterResult(false, errMsg, returnMap, null); | |||||
| } | |||||
| } else { | |||||
| String errMsg = returnMap.get("return_msg"); | |||||
| return new PayAdapterResult(false, errMsg, returnMap, null); | |||||
| } | |||||
| } | |||||
| private String closeOrderWx(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) { | |||||
| // get payAccount | |||||
| if (payAccount.getType() == EnumPayMode.MCH.getCode()) { | |||||
| // 普通商户号模式 | |||||
| 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 { | |||||
| Map map = BeanUtils.toStringMap(payOrderC); | |||||
| payOrderC.setSign(WxPayment.createSign(map, payAccount.getApiKey())); | |||||
| map = BeanUtils.toStringMap(payOrderC); | |||||
| String response = WxPay.closeOrder(map); | |||||
| log.info("request:" + map.toString() + "\nresponse:" + response); | |||||
| return response; | |||||
| } 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()); | |||||
| } | |||||
| } else { | |||||
| // 服务商模式 | |||||
| WxPayOrderSQ payOrderSC = new WxPayOrderSQ(); | |||||
| String noncestr = Utility.generate32UUID(); | |||||
| payOrderSC.setAppid(appInfo.getParentAppId()); | |||||
| payOrderSC.setSub_appid(appInfo.getAppId()); | |||||
| payOrderSC.setMch_id(payAccount.getMchId()); | |||||
| payOrderSC.setSub_mch_id(payAccount.getSubMchId()); | |||||
| payOrderSC.setNonce_str(noncestr); | |||||
| payOrderSC.setOut_trade_no(record.getPayOrderNo()); | |||||
| payOrderSC.setSign_type("HMAC-SHA256"); | |||||
| try { | |||||
| Map map = BeanUtils.toStringMap(payOrderSC); | |||||
| payOrderSC.setSign(WxPayment.createSignHMAC(map, payAccount.getApiKey())); | |||||
| map = BeanUtils.toStringMap(payOrderSC); | |||||
| String response = WxPay.closeOrder(map); | |||||
| log.info("request:" + map.toString() + "\nresponse:" + response); | |||||
| return response; | |||||
| } 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()); | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 收款码支付回撤,都是2.0版本 | |||||
| * @param appInfo | |||||
| * @param record | |||||
| * @param payAccount | |||||
| * @return | |||||
| * @throws Exception | |||||
| */ | |||||
| protected PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) throws Exception { | |||||
| String response = payOrderReverseWx(appInfo, record,payAccount); | |||||
| protected PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount,String subMchId) throws Exception { | |||||
| String response = payOrderReverseWx(appInfo, record,payAccount,subMchId); | |||||
| log.info("pay order reverse, " + record.toString() + ", response: " + response); | log.info("pay order reverse, " + record.toString() + ", response: " + response); | ||||
| Map<String, String> returnMap = WxPayment.xmlToMap(response); | Map<String, String> returnMap = WxPayment.xmlToMap(response); | ||||
| String return_code = returnMap.get("return_code"); | String return_code = returnMap.get("return_code"); | ||||
| @@ -179,7 +127,7 @@ public class BaseWxPayAdapterService { | |||||
| } | } | ||||
| } | } | ||||
| private String payOrderReverseWx(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) { | |||||
| private String payOrderReverseWx(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount,String subMchId) { | |||||
| // get payAccount | // get payAccount | ||||
| if (payAccount.getType() == EnumPayMode.MCH.getCode()) { | if (payAccount.getType() == EnumPayMode.MCH.getCode()) { | ||||
| // 普通商户号模式 | // 普通商户号模式 | ||||
| @@ -209,7 +157,7 @@ public class BaseWxPayAdapterService { | |||||
| payOrderSC.setAppid(appInfo.getParentAppId()); | payOrderSC.setAppid(appInfo.getParentAppId()); | ||||
| payOrderSC.setSub_appid(appInfo.getAppId()); | payOrderSC.setSub_appid(appInfo.getAppId()); | ||||
| payOrderSC.setMch_id(payAccount.getMchId()); | payOrderSC.setMch_id(payAccount.getMchId()); | ||||
| payOrderSC.setSub_mch_id(payAccount.getSubMchId()); | |||||
| payOrderSC.setSub_mch_id(subMchId); | |||||
| payOrderSC.setNonce_str(noncestr); | payOrderSC.setNonce_str(noncestr); | ||||
| payOrderSC.setOut_trade_no(record.getPayOrderNo()); | payOrderSC.setOut_trade_no(record.getPayOrderNo()); | ||||
| payOrderSC.setSign_type("HMAC-SHA256"); | payOrderSC.setSign_type("HMAC-SHA256"); | ||||
| @@ -228,39 +176,4 @@ public class BaseWxPayAdapterService { | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @Autowired | |||||
| WxOpenService openService; | |||||
| @Autowired | |||||
| MaUtil maUtil; | |||||
| protected File getQrCode(WxAppinfo appinfo,String pageUrl,int type,String sceneParam) throws WxErrorException { | |||||
| boolean isFmOpen = false; | |||||
| WxMaService wxMaService; | |||||
| if(isFmOpen) { | |||||
| wxMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appinfo.getAppId()); | |||||
| } else { | |||||
| wxMaService = maUtil.getWeappService(appinfo); | |||||
| } | |||||
| boolean autoColor = false; | |||||
| boolean isHyaline = true; | |||||
| WxMaCodeLineColor color = new WxMaCodeLineColor("0", "0", "0"); | |||||
| String pathStr = ""; | |||||
| if (StringUtils.isNotBlank(sceneParam)) { | |||||
| pathStr = pageUrl + "?scene="+sceneParam; | |||||
| } else { | |||||
| pathStr = pageUrl; | |||||
| } | |||||
| if(type == 0) { | |||||
| final File codeFile = wxMaService.getQrcodeService().createQrcode(pathStr, QRCodeUtils.QR_WIDTH); | |||||
| return codeFile; | |||||
| }else { | |||||
| final File codeFile = wxMaService.getQrcodeService().createWxaCodeUnlimit(sceneParam, pageUrl, QRCodeUtils.QR_WIDTH, autoColor, color, isHyaline); | |||||
| return codeFile; | |||||
| } | |||||
| } | |||||
| } | } | ||||
| @@ -0,0 +1,56 @@ | |||||
| package com.iformall.service.pay.service.pay.wx.sft; | |||||
| import java.io.File; | |||||
| import java.util.Date; | |||||
| import java.util.Map; | |||||
| import org.apache.commons.lang3.StringUtils; | |||||
| import org.springframework.beans.factory.annotation.Autowired; | |||||
| import com.alibaba.fastjson.JSON; | |||||
| import com.alibaba.fastjson.JSONObject; | |||||
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |||||
| import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; | |||||
| import com.iformall.common.ErrorCode; | |||||
| import com.iformall.common.Result; | |||||
| import com.iformall.common.ResultData; | |||||
| import com.iformall.domain.po.PosCouponOrderVerify; | |||||
| import com.iformall.domain.po.WxAppinfo; | |||||
| import com.iformall.domain.po.WxBatchOrder; | |||||
| import com.iformall.domain.po.WxCouponOrder; | |||||
| import com.iformall.domain.po.WxOrder; | |||||
| import com.iformall.domain.po.WxPayAccount; | |||||
| import com.iformall.domain.po.WxPayOrder; | |||||
| import com.iformall.enums.EnumCouponOrderStatus; | |||||
| import com.iformall.enums.EnumOrderFrom; | |||||
| import com.iformall.enums.EnumOrderStatus; | |||||
| import com.iformall.enums.EnumOrderType; | |||||
| import com.iformall.enums.EnumPayMode; | |||||
| import com.iformall.enums.EnumPayStatus; | |||||
| import com.iformall.exception.MallinkException; | |||||
| import com.iformall.pay.WxPay; | |||||
| import com.iformall.pay.WxPayOrderQ; | |||||
| import com.iformall.pay.WxPayOrderSQ; | |||||
| import com.iformall.pay.WxPayment; | |||||
| import com.iformall.service.QrCodeService; | |||||
| import com.iformall.service.helper.WxPayOrderServiceHelper; | |||||
| import com.iformall.service.pay.service.pay.PayAdapterService; | |||||
| import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | |||||
| import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | |||||
| import com.iformall.service.pay.service.pay.wx.BaseWxPayAdapterService; | |||||
| import com.iformall.utils.BeanUtils; | |||||
| import com.iformall.utils.MaUtil; | |||||
| import com.iformall.utils.QRCodeUtils; | |||||
| import com.iformall.utils.Utility; | |||||
| import cn.binarywang.wx.miniapp.api.WxMaService; | |||||
| import cn.binarywang.wx.miniapp.bean.WxMaCodeLineColor; | |||||
| import lombok.extern.slf4j.Slf4j; | |||||
| import me.chanjar.weixin.common.error.WxErrorException; | |||||
| import me.chanjar.weixin.open.api.WxOpenService; | |||||
| @Slf4j | |||||
| public class BaseWxPaySFTAdapterService extends BaseWxPayAdapterService{ | |||||
| } | |||||
| @@ -1,9 +1,9 @@ | |||||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||||
| import lombok.Data; | import lombok.Data; | ||||
| @Data | @Data | ||||
| public class CombineCloseItemOrder { | |||||
| public class SFTCombineCloseItemOrder { | |||||
| private String mchid;//子单发起方商户号,必须与发起方appid有绑定关系 | private String mchid;//子单发起方商户号,必须与发起方appid有绑定关系 | ||||
| private String out_trade_no;//子单商户订单号 | private String out_trade_no;//子单商户订单号 | ||||
| @@ -1,4 +1,4 @@ | |||||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import java.util.List; | import java.util.List; | ||||
| @@ -9,21 +9,21 @@ import com.iformall.service.order.entity.WxComposeChildOrderShare; | |||||
| import lombok.Data; | import lombok.Data; | ||||
| @Data | @Data | ||||
| public class CombineCloseReq { | |||||
| public class SFTCombineCloseReq { | |||||
| private String combine_appid;//合单发起方的appid | private String combine_appid;//合单发起方的appid | ||||
| @JSONField(serialize = false) | @JSONField(serialize = false) | ||||
| private String combine_out_trade_no;//不放到body | private String combine_out_trade_no;//不放到body | ||||
| private List<CombineCloseItemOrder> sub_orders; | |||||
| private List<SFTCombineCloseItemOrder> sub_orders; | |||||
| public void initSubOrders(WxPayAccount payAccount,WxPayOrder payOrder) { | public void initSubOrders(WxPayAccount payAccount,WxPayOrder payOrder) { | ||||
| List<WxComposeChildOrderShare> childs = payOrder.getAllChilds(); | List<WxComposeChildOrderShare> childs = payOrder.getAllChilds(); | ||||
| if (null != childs) { | if (null != childs) { | ||||
| List<CombineCloseItemOrder> suborders = new ArrayList<CombineCloseItemOrder>(); | |||||
| List<SFTCombineCloseItemOrder> suborders = new ArrayList<SFTCombineCloseItemOrder>(); | |||||
| for (WxComposeChildOrderShare child : childs) { | for (WxComposeChildOrderShare child : childs) { | ||||
| CombineCloseItemOrder ccio = new CombineCloseItemOrder(); | |||||
| SFTCombineCloseItemOrder ccio = new SFTCombineCloseItemOrder(); | |||||
| ccio.setMchid(payAccount.getMchId()); | ccio.setMchid(payAccount.getMchId()); | ||||
| ccio.setSub_mchid(child.getMerchantUid()); | ccio.setSub_mchid(child.getMerchantUid()); | ||||
| ccio.setOut_trade_no(String.valueOf(child.getOrderId())); | ccio.setOut_trade_no(String.valueOf(child.getOrderId())); | ||||
| @@ -1,4 +1,4 @@ | |||||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||||
| import com.iformall.domain.po.WxAppinfo; | import com.iformall.domain.po.WxAppinfo; | ||||
| import com.iformall.domain.po.WxOrder; | import com.iformall.domain.po.WxOrder; | ||||
| @@ -7,26 +7,26 @@ import com.iformall.domain.po.WxPayAccount; | |||||
| import lombok.Data; | import lombok.Data; | ||||
| @Data | @Data | ||||
| public class CombineItemOrder { | |||||
| public class SFTCombineItemOrder { | |||||
| private String mchid;//子单发起方商户号,必须与发起方appid有绑定关系 | private String mchid;//子单发起方商户号,必须与发起方appid有绑定关系 | ||||
| private String attach;//附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用 | private String attach;//附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用 | ||||
| private CombinePayAmountReq amount;//订单金额 | |||||
| private SFTCombinePayAmountReq amount;//订单金额 | |||||
| private String out_trade_no;//子单商户订单号 | private String out_trade_no;//子单商户订单号 | ||||
| private String sub_mchid;//二级商户号,服务商子商户的商户号,被合单方。直连商户不用传二级商户号 | private String sub_mchid;//二级商户号,服务商子商户的商户号,被合单方。直连商户不用传二级商户号 | ||||
| private String description;//商品描述,需传入应用市场上的APP名字-实际商品名称 | private String description;//商品描述,需传入应用市场上的APP名字-实际商品名称 | ||||
| private PaySettleReq settle_info;//结算信息 | |||||
| private SFTPaySettleReq settle_info;//结算信息 | |||||
| public void initByWxOrder(WxPayAccount payAccount,WxOrder order,String subMchId,WxAppinfo appInfo,String productName,String extParam) { | public void initByWxOrder(WxPayAccount payAccount,WxOrder order,String subMchId,WxAppinfo appInfo,String productName,String extParam) { | ||||
| this.mchid = payAccount.getMchId(); | this.mchid = payAccount.getMchId(); | ||||
| this.attach = extParam; | this.attach = extParam; | ||||
| CombinePayAmountReq amount = new CombinePayAmountReq(); | |||||
| SFTCombinePayAmountReq amount = new SFTCombinePayAmountReq(); | |||||
| amount.setTotal_amount(order.getPayment()); | amount.setTotal_amount(order.getPayment()); | ||||
| this.setAmount(amount); | this.setAmount(amount); | ||||
| this.out_trade_no = String.valueOf(order.getId()); | this.out_trade_no = String.valueOf(order.getId()); | ||||
| this.sub_mchid = subMchId; | this.sub_mchid = subMchId; | ||||
| this.description = appInfo.getName()+"-"+productName; | this.description = appInfo.getName()+"-"+productName; | ||||
| PaySettleReq settle = new PaySettleReq(); | |||||
| SFTPaySettleReq settle = new SFTPaySettleReq(); | |||||
| settle.setProfit_sharing(true); | settle.setProfit_sharing(true); | ||||
| this.setSettle_info(settle); | this.setSettle_info(settle); | ||||
| } | } | ||||
| @@ -1,9 +1,9 @@ | |||||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||||
| import lombok.Data; | import lombok.Data; | ||||
| @Data | @Data | ||||
| public class CombinePayAmountReq { | |||||
| public class SFTCombinePayAmountReq { | |||||
| private int total_amount;//总金额,单位为分。 | private int total_amount;//总金额,单位为分。 | ||||
| private String currency="CNY";//货币类型 | private String currency="CNY";//货币类型 | ||||
| @@ -1,16 +1,16 @@ | |||||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||||
| import java.util.List; | import java.util.List; | ||||
| import lombok.Data; | import lombok.Data; | ||||
| @Data | @Data | ||||
| public class CombinePayCommonMiniAppReq { | |||||
| public class SFTCombinePayCommonMiniAppReq { | |||||
| private String combine_appid;//合单发起方的appid | private String combine_appid;//合单发起方的appid | ||||
| private String combine_mchid;//合单发起方商户号,服务商和电商模式下,传服务商商户号 | private String combine_mchid;//合单发起方商户号,服务商和电商模式下,传服务商商户号 | ||||
| private String combine_out_trade_no;//合单支付总订单号 | private String combine_out_trade_no;//合单支付总订单号 | ||||
| private List<CombineItemOrder> sub_orders;//商品描述 | |||||
| private CombinePayerReq combine_payer_info;// 支付者信息 | |||||
| private List<SFTCombineItemOrder> sub_orders;//商品描述 | |||||
| private SFTCombinePayerReq combine_payer_info;// 支付者信息 | |||||
| private String notify_url;//接收微信支付异步通知回调地址 | private String notify_url;//接收微信支付异步通知回调地址 | ||||
| } | } | ||||
| @@ -1,9 +1,9 @@ | |||||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||||
| import lombok.Data; | import lombok.Data; | ||||
| @Data | @Data | ||||
| public class CombinePayerReq { | |||||
| public class SFTCombinePayerReq { | |||||
| private String openid;//使用合单appid获取的对应用户openid | private String openid;//使用合单appid获取的对应用户openid | ||||
| @@ -1,9 +1,9 @@ | |||||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||||
| import lombok.Data; | import lombok.Data; | ||||
| @Data | @Data | ||||
| public class PayAmountReq { | |||||
| public class SFTPayAmountReq { | |||||
| private int total;//总金额,单位为分。 | private int total;//总金额,单位为分。 | ||||
| private String currency="CNY";//货币类型 | private String currency="CNY";//货币类型 | ||||
| @@ -1,9 +1,9 @@ | |||||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||||
| import lombok.Data; | import lombok.Data; | ||||
| @Data | @Data | ||||
| public class PayCommonMiniAppReq { | |||||
| public class SFTPayCommonMiniAppReq { | |||||
| private String sp_appid;//服务商应用ID | private String sp_appid;//服务商应用ID | ||||
| private String sp_mchid;//服务商户号 | private String sp_mchid;//服务商户号 | ||||
| @@ -11,7 +11,7 @@ public class PayCommonMiniAppReq { | |||||
| private String description;//商品描述 | private String description;//商品描述 | ||||
| private String out_trade_no;//商户订单号 | private String out_trade_no;//商户订单号 | ||||
| private String notify_url;//通知地址,不允许携带查询串 | private String notify_url;//通知地址,不允许携带查询串 | ||||
| private PaySettleReq settle_info;//结算信息 | |||||
| private PayAmountReq amount;//订单金额 | |||||
| private PayerReq payer;//支付者 | |||||
| private SFTPaySettleReq settle_info;//结算信息 | |||||
| private SFTPayAmountReq amount;//订单金额 | |||||
| private SFTPayerReq payer;//支付者 | |||||
| } | } | ||||
| @@ -1,11 +1,11 @@ | |||||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||||
| import com.alibaba.fastjson.annotation.JSONField; | import com.alibaba.fastjson.annotation.JSONField; | ||||
| import lombok.Data; | import lombok.Data; | ||||
| @Data | @Data | ||||
| public class PayQueryReq { | |||||
| public class SFTPayQueryReq { | |||||
| private String sp_mchid;//服务商户号。 | private String sp_mchid;//服务商户号。 | ||||
| private String sub_mchid;//二级商户号 | private String sub_mchid;//二级商户号 | ||||
| @@ -1,9 +1,9 @@ | |||||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||||
| import lombok.Data; | import lombok.Data; | ||||
| @Data | @Data | ||||
| public class PaySettleReq { | |||||
| public class SFTPaySettleReq { | |||||
| private boolean profit_sharing;//是否指定分账 | private boolean profit_sharing;//是否指定分账 | ||||
| private int subsidy_amount = 0;//补差金额,单笔订单最高补差金额为5000元.SettleInfo.profit_sharing为true时,该金额才生效 | private int subsidy_amount = 0;//补差金额,单笔订单最高补差金额为5000元.SettleInfo.profit_sharing为true时,该金额才生效 | ||||
| @@ -1,9 +1,9 @@ | |||||
| package com.iformall.service.pay.service.pay.wx.v3.entity; | |||||
| package com.iformall.service.pay.service.pay.wx.sft.entity; | |||||
| import lombok.Data; | import lombok.Data; | ||||
| @Data | @Data | ||||
| public class PayerReq { | |||||
| public class SFTPayerReq { | |||||
| private String sp_openid;//用户在服务商appid下的唯一标识 | private String sp_openid;//用户在服务商appid下的唯一标识 | ||||
| @@ -1,4 +1,4 @@ | |||||
| package com.iformall.service.pay.service.pay.wx.v3.h5; | |||||
| package com.iformall.service.pay.service.pay.wx.sft.h5; | |||||
| import java.io.File; | import java.io.File; | ||||
| import java.util.Date; | import java.util.Date; | ||||
| @@ -16,10 +16,11 @@ import com.iformall.service.pay.entity.PayExtraParam; | |||||
| import com.iformall.service.pay.service.pay.CDrivingPayService; | import com.iformall.service.pay.service.pay.CDrivingPayService; | ||||
| import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | ||||
| import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | ||||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayAdapterService; | |||||
| import com.iformall.service.pay.service.pay.wx.sft.BaseWxPaySFTAdapterService; | |||||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayV2AdapterService; | |||||
| @Service | @Service | ||||
| public class WxH5PayV3Service implements CDrivingPayService{ | |||||
| public class WxH5PaySFTService extends BaseWxPaySFTAdapterService implements CDrivingPayService{ | |||||
| @Override | @Override | ||||
| public PayAdapterResult pay(WxPayAccount payAccount,WxPayOrder record,WxComposeOrder composeOrder,List<WxOrder> childOrders, | public PayAdapterResult pay(WxPayAccount payAccount,WxPayOrder record,WxComposeOrder composeOrder,List<WxOrder> childOrders, | ||||
| @@ -1,4 +1,4 @@ | |||||
| package com.iformall.service.pay.service.pay.wx.v3.miniApp.appPay; | |||||
| package com.iformall.service.pay.service.pay.wx.sft.miniApp.appPay; | |||||
| import java.io.File; | import java.io.File; | ||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| @@ -37,16 +37,18 @@ import com.iformall.service.pay.entity.PayExtraParam; | |||||
| import com.iformall.service.pay.service.pay.CDrivingPayService; | import com.iformall.service.pay.service.pay.CDrivingPayService; | ||||
| import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | ||||
| import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | ||||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayAdapterService; | |||||
| import com.iformall.service.pay.service.pay.wx.v3.entity.CombineCloseReq; | |||||
| import com.iformall.service.pay.service.pay.wx.v3.entity.CombineItemOrder; | |||||
| import com.iformall.service.pay.service.pay.wx.v3.entity.CombinePayCommonMiniAppReq; | |||||
| import com.iformall.service.pay.service.pay.wx.v3.entity.CombinePayerReq; | |||||
| import com.iformall.service.pay.service.pay.wx.v3.entity.PayAmountReq; | |||||
| import com.iformall.service.pay.service.pay.wx.v3.entity.PayCommonMiniAppReq; | |||||
| import com.iformall.service.pay.service.pay.wx.v3.entity.PayQueryReq; | |||||
| import com.iformall.service.pay.service.pay.wx.v3.entity.PaySettleReq; | |||||
| import com.iformall.service.pay.service.pay.wx.v3.entity.PayerReq; | |||||
| import com.iformall.service.pay.service.pay.wx.BaseWxPayAdapterService; | |||||
| import com.iformall.service.pay.service.pay.wx.sft.BaseWxPaySFTAdapterService; | |||||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTCombineCloseReq; | |||||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTCombineItemOrder; | |||||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTCombinePayCommonMiniAppReq; | |||||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTCombinePayerReq; | |||||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTPayAmountReq; | |||||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTPayCommonMiniAppReq; | |||||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTPayQueryReq; | |||||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTPaySettleReq; | |||||
| import com.iformall.service.pay.service.pay.wx.sft.entity.SFTPayerReq; | |||||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayV2AdapterService; | |||||
| import com.iformall.utils.BeanUtils; | import com.iformall.utils.BeanUtils; | ||||
| import com.iformall.utils.MaUtil; | import com.iformall.utils.MaUtil; | ||||
| import com.iformall.utils.MapUtil; | import com.iformall.utils.MapUtil; | ||||
| @@ -56,13 +58,13 @@ import lombok.extern.slf4j.Slf4j; | |||||
| @Slf4j | @Slf4j | ||||
| @Service | @Service | ||||
| public class WxMiniAppPayV3AdapterService implements CDrivingPayService{ | |||||
| public class WxMiniAppPaySFTAdapterService extends BaseWxPaySFTAdapterService implements CDrivingPayService{ | |||||
| @Autowired | @Autowired | ||||
| MaUtil maUtil; | MaUtil maUtil; | ||||
| private PayCommonMiniAppReq generatePayCommonRequest(WxPayAccount payAccount,WxComposeOrder composeOrder,String productName, WxPayOrder record,String openId,WxAppinfo appInfo,Date currentDate) throws Exception { | |||||
| PayCommonMiniAppReq req = new PayCommonMiniAppReq(); | |||||
| private SFTPayCommonMiniAppReq generatePayCommonRequest(WxPayAccount payAccount,WxComposeOrder composeOrder,String productName, WxPayOrder record,String openId,WxAppinfo appInfo,Date currentDate) throws Exception { | |||||
| SFTPayCommonMiniAppReq req = new SFTPayCommonMiniAppReq(); | |||||
| req.setSp_appid(String.valueOf(appInfo.getId())); | req.setSp_appid(String.valueOf(appInfo.getId())); | ||||
| req.setSp_mchid(payAccount.getMchId()); | req.setSp_mchid(payAccount.getMchId()); | ||||
| req.setSub_mchid(getMerchantUid(record,composeOrder.getSingleOrder())); | req.setSub_mchid(getMerchantUid(record,composeOrder.getSingleOrder())); | ||||
| @@ -70,15 +72,15 @@ public class WxMiniAppPayV3AdapterService implements CDrivingPayService{ | |||||
| req.setOut_trade_no(String.valueOf(composeOrder.getMainOrderId())); | req.setOut_trade_no(String.valueOf(composeOrder.getMainOrderId())); | ||||
| req.setNotify_url(payAccount.getPayNotifyV3Url()); | req.setNotify_url(payAccount.getPayNotifyV3Url()); | ||||
| PaySettleReq settle = new PaySettleReq(); | |||||
| SFTPaySettleReq settle = new SFTPaySettleReq(); | |||||
| settle.setProfit_sharing(true); | settle.setProfit_sharing(true); | ||||
| req.setSettle_info(settle); | req.setSettle_info(settle); | ||||
| PayAmountReq amout = new PayAmountReq(); | |||||
| SFTPayAmountReq amout = new SFTPayAmountReq(); | |||||
| amout.setTotal(record.getPayAmount()); | amout.setTotal(record.getPayAmount()); | ||||
| req.setAmount(amout); | req.setAmount(amout); | ||||
| PayerReq payer = new PayerReq(); | |||||
| SFTPayerReq payer = new SFTPayerReq(); | |||||
| payer.setSp_openid(openId); | payer.setSp_openid(openId); | ||||
| req.setPayer(payer); | req.setPayer(payer); | ||||
| @@ -90,24 +92,24 @@ public class WxMiniAppPayV3AdapterService implements CDrivingPayService{ | |||||
| return share.getMerchantUid(); | return share.getMerchantUid(); | ||||
| } | } | ||||
| private CombinePayCommonMiniAppReq generateCombinePayReqeust(WxPayAccount payAccount,WxComposeOrder composeOrder,List<WxOrder> childOrders,String productName, | |||||
| private SFTCombinePayCommonMiniAppReq generateCombinePayReqeust(WxPayAccount payAccount,WxComposeOrder composeOrder,List<WxOrder> childOrders,String productName, | |||||
| WxPayOrder record,WxAppinfo appInfo,String openId,String appId,Date currentDate,EnumPayShare isShare) throws Exception { | WxPayOrder record,WxAppinfo appInfo,String openId,String appId,Date currentDate,EnumPayShare isShare) throws Exception { | ||||
| CombinePayCommonMiniAppReq req = new CombinePayCommonMiniAppReq(); | |||||
| SFTCombinePayCommonMiniAppReq req = new SFTCombinePayCommonMiniAppReq(); | |||||
| req.setCombine_appid(appInfo.getAppId()); | req.setCombine_appid(appInfo.getAppId()); | ||||
| req.setCombine_mchid(payAccount.getMchId()); | req.setCombine_mchid(payAccount.getMchId()); | ||||
| req.setCombine_out_trade_no(String.valueOf(composeOrder.getMainOrderId())); | req.setCombine_out_trade_no(String.valueOf(composeOrder.getMainOrderId())); | ||||
| List<CombineItemOrder> suborders = new ArrayList<CombineItemOrder>(); | |||||
| List<SFTCombineItemOrder> suborders = new ArrayList<SFTCombineItemOrder>(); | |||||
| for (WxOrder order : childOrders) { | for (WxOrder order : childOrders) { | ||||
| CombineItemOrder so = new CombineItemOrder(); | |||||
| SFTCombineItemOrder so = new SFTCombineItemOrder(); | |||||
| String subMchId = getMerchantUid(record,order); | String subMchId = getMerchantUid(record,order); | ||||
| so.initByWxOrder(payAccount, order, subMchId, appInfo, productName, String.valueOf(record.getId())); | so.initByWxOrder(payAccount, order, subMchId, appInfo, productName, String.valueOf(record.getId())); | ||||
| suborders.add(so); | suborders.add(so); | ||||
| } | } | ||||
| req.setSub_orders(suborders); | req.setSub_orders(suborders); | ||||
| CombinePayerReq payer = new CombinePayerReq(); | |||||
| SFTCombinePayerReq payer = new SFTCombinePayerReq(); | |||||
| payer.setOpenid(openId); | payer.setOpenid(openId); | ||||
| req.setCombine_payer_info(payer); | req.setCombine_payer_info(payer); | ||||
| @@ -168,7 +170,7 @@ public class WxMiniAppPayV3AdapterService implements CDrivingPayService{ | |||||
| * https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_3.shtml | * https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_3.shtml | ||||
| */ | */ | ||||
| if (childOrders.size() == 1) { | if (childOrders.size() == 1) { | ||||
| PayCommonMiniAppReq payReq = generatePayCommonRequest(payAccount,composeOrder,productName,record,openId,appInfo,currentDate); | |||||
| SFTPayCommonMiniAppReq payReq = generatePayCommonRequest(payAccount,composeOrder,productName,record,openId,appInfo,currentDate); | |||||
| String response = WxPayV3.payCommonWithMiniApp(payService, payReq); | String response = WxPayV3.payCommonWithMiniApp(payService, payReq); | ||||
| log.info("pay order v3, " + payReq.toString() + ", response: " + response.toString()); | log.info("pay order v3, " + payReq.toString() + ", response: " + response.toString()); | ||||
| return getOrderPResult(response); | return getOrderPResult(response); | ||||
| @@ -221,7 +223,7 @@ public class WxMiniAppPayV3AdapterService implements CDrivingPayService{ | |||||
| public PayQueryAdapterResult queryPayStatus(WxPayOrder oldRecord, WxAppinfo appInfo, | public PayQueryAdapterResult queryPayStatus(WxPayOrder oldRecord, WxAppinfo appInfo, | ||||
| WxPayAccount payAccount) throws Exception { | WxPayAccount payAccount) throws Exception { | ||||
| WxPayService payService = maUtil.getWxPayService(appInfo, payAccount); | WxPayService payService = maUtil.getWxPayService(appInfo, payAccount); | ||||
| PayQueryReq req = new PayQueryReq(); | |||||
| SFTPayQueryReq req = new SFTPayQueryReq(); | |||||
| if (!oldRecord.isMulity()) { | if (!oldRecord.isMulity()) { | ||||
| req.setSp_mchid(payAccount.getMchId()); | req.setSp_mchid(payAccount.getMchId()); | ||||
| req.setSub_mchid(oldRecord.getSingleChildOrderShare().getMerchantUid()); | req.setSub_mchid(oldRecord.getSingleChildOrderShare().getMerchantUid()); | ||||
| @@ -259,7 +261,7 @@ public class WxMiniAppPayV3AdapterService implements CDrivingPayService{ | |||||
| public PayAdapterResult payOrderClose(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) throws Exception { | public PayAdapterResult payOrderClose(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) throws Exception { | ||||
| WxPayService payService = maUtil.getWxPayService(appInfo, payAccount); | WxPayService payService = maUtil.getWxPayService(appInfo, payAccount); | ||||
| if (!record.isMulity()) { | if (!record.isMulity()) { | ||||
| PayQueryReq req = new PayQueryReq(); | |||||
| SFTPayQueryReq req = new SFTPayQueryReq(); | |||||
| req.setSp_mchid(payAccount.getMchId()); | req.setSp_mchid(payAccount.getMchId()); | ||||
| req.setSub_mchid(record.getSingleChildOrderShare().getMerchantUid()); | req.setSub_mchid(record.getSingleChildOrderShare().getMerchantUid()); | ||||
| req.setOut_trade_no(String.valueOf(record.getId())); | req.setOut_trade_no(String.valueOf(record.getId())); | ||||
| @@ -281,19 +283,17 @@ public class WxMiniAppPayV3AdapterService implements CDrivingPayService{ | |||||
| @Override | @Override | ||||
| public PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record, WxPayAccount payAccount) | public PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record, WxPayAccount payAccount) | ||||
| throws Exception { | throws Exception { | ||||
| //return super.payOrderReverse(appInfo, record, payAccount); | |||||
| return null; | |||||
| return super.payOrderReverse(appInfo, record, payAccount, payAccount.getSubMchId()); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public PayAdapterResult payOrderPush(String openId,WxAppinfo appInfo, WxBatchOrder batchOrder,WxPayOrder payOrder) throws Exception { | public PayAdapterResult payOrderPush(String openId,WxAppinfo appInfo, WxBatchOrder batchOrder,WxPayOrder payOrder) throws Exception { | ||||
| return null; | |||||
| throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR); | |||||
| } | } | ||||
| @Override | @Override | ||||
| public File getQrcode(WxAppinfo appinfo,String pageUrl,int type,String sceneParam) throws Exception{ | public File getQrcode(WxAppinfo appinfo,String pageUrl,int type,String sceneParam) throws Exception{ | ||||
| //return super.getQrCode(appinfo, pageUrl, type, sceneParam); | |||||
| return null; | |||||
| return super.getQrCode(appinfo, pageUrl, type, sceneParam); | |||||
| } | } | ||||
| @Override | @Override | ||||
| @@ -0,0 +1,159 @@ | |||||
| package com.iformall.service.pay.service.pay.wx.v2; | |||||
| import java.io.File; | |||||
| import java.util.Date; | |||||
| import java.util.Map; | |||||
| import org.apache.commons.lang3.StringUtils; | |||||
| import org.springframework.beans.factory.annotation.Autowired; | |||||
| import com.alibaba.fastjson.JSON; | |||||
| import com.alibaba.fastjson.JSONObject; | |||||
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |||||
| import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; | |||||
| import com.iformall.common.ErrorCode; | |||||
| import com.iformall.common.Result; | |||||
| import com.iformall.common.ResultData; | |||||
| import com.iformall.domain.po.PosCouponOrderVerify; | |||||
| import com.iformall.domain.po.WxAppinfo; | |||||
| import com.iformall.domain.po.WxBatchOrder; | |||||
| import com.iformall.domain.po.WxCouponOrder; | |||||
| import com.iformall.domain.po.WxOrder; | |||||
| import com.iformall.domain.po.WxPayAccount; | |||||
| import com.iformall.domain.po.WxPayOrder; | |||||
| import com.iformall.enums.EnumCouponOrderStatus; | |||||
| import com.iformall.enums.EnumOrderFrom; | |||||
| import com.iformall.enums.EnumOrderStatus; | |||||
| import com.iformall.enums.EnumOrderType; | |||||
| import com.iformall.enums.EnumPayMode; | |||||
| import com.iformall.enums.EnumPayStatus; | |||||
| import com.iformall.exception.MallinkException; | |||||
| import com.iformall.pay.WxPay; | |||||
| import com.iformall.pay.WxPayOrderQ; | |||||
| import com.iformall.pay.WxPayOrderSQ; | |||||
| import com.iformall.pay.WxPayment; | |||||
| import com.iformall.service.QrCodeService; | |||||
| import com.iformall.service.helper.WxPayOrderServiceHelper; | |||||
| import com.iformall.service.pay.service.pay.PayAdapterService; | |||||
| import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | |||||
| import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | |||||
| import com.iformall.service.pay.service.pay.wx.BaseWxPayAdapterService; | |||||
| import com.iformall.utils.BeanUtils; | |||||
| import com.iformall.utils.MaUtil; | |||||
| import com.iformall.utils.QRCodeUtils; | |||||
| import com.iformall.utils.Utility; | |||||
| import cn.binarywang.wx.miniapp.api.WxMaService; | |||||
| import cn.binarywang.wx.miniapp.bean.WxMaCodeLineColor; | |||||
| import lombok.extern.slf4j.Slf4j; | |||||
| import me.chanjar.weixin.common.error.WxErrorException; | |||||
| import me.chanjar.weixin.open.api.WxOpenService; | |||||
| @Slf4j | |||||
| public class BaseWxPayV2AdapterService extends BaseWxPayAdapterService{ | |||||
| protected PayQueryAdapterResult queryPayStatus(WxPayOrder oldRecord, WxAppinfo appInfo, WxPayAccount payAccount) | |||||
| throws Exception { | |||||
| Map<String, String> retMap = WxPayOrderServiceHelper.wxOrderPayStatusMap(oldRecord, appInfo, payAccount); | |||||
| int code = WxPayOrderServiceHelper.getPayStatusFromMap(retMap,oldRecord.getPayOrderNo()); | |||||
| String msg = WxPayOrderServiceHelper.getPayStatusMsg(retMap, oldRecord.getPayOrderNo()); | |||||
| PayQueryAdapterResult result = new PayQueryAdapterResult(code, msg,null, retMap,retMap.get("transaction_id"),retMap.get("time_end")); | |||||
| return result; | |||||
| } | |||||
| protected int queryPayStatus(PayQueryAdapterResult statusObject, String orderOutNo) throws Exception { | |||||
| return WxPayOrderServiceHelper.getPayStatusFromMap((Map<String, String>) statusObject.getData(),orderOutNo); | |||||
| } | |||||
| protected int queryPayStatusCode(WxPayOrder oldRecord, WxAppinfo appInfo, WxPayAccount payAccount) | |||||
| throws Exception { | |||||
| return WxPayOrderServiceHelper.wxOrderPayStatus(oldRecord, appInfo, payAccount); | |||||
| } | |||||
| 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参数格式是否正确\"}}"); | |||||
| protected PayAdapterResult closeOrder(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) { | |||||
| String response = closeOrderWx(appInfo, record,payAccount); | |||||
| log.info("pay order close, " + record.toString() + ", response: " + response); | |||||
| Map<String, String> returnMap = WxPayment.xmlToMap(response); | |||||
| String return_code = returnMap.get("return_code"); | |||||
| String result_code = returnMap.get("result_code"); | |||||
| if ("SUCCESS".equalsIgnoreCase(return_code)) { | |||||
| if ("SUCCESS".equals(result_code)) { | |||||
| return new PayAdapterResult(true, "success", returnMap, null); | |||||
| } else { | |||||
| String errMsg = ""; | |||||
| JSONObject errObj = errorMapClose.getJSONObject(result_code); | |||||
| if (errObj != null) { | |||||
| errMsg = errObj.toJSONString(); | |||||
| } else { | |||||
| errMsg = returnMap.get("return_msg"); | |||||
| } | |||||
| return new PayAdapterResult(false, errMsg, returnMap, null); | |||||
| } | |||||
| } else { | |||||
| String errMsg = returnMap.get("return_msg"); | |||||
| return new PayAdapterResult(false, errMsg, returnMap, null); | |||||
| } | |||||
| } | |||||
| private String closeOrderWx(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) { | |||||
| // get payAccount | |||||
| if (payAccount.getType() == EnumPayMode.MCH.getCode()) { | |||||
| // 普通商户号模式 | |||||
| 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 { | |||||
| Map map = BeanUtils.toStringMap(payOrderC); | |||||
| payOrderC.setSign(WxPayment.createSign(map, payAccount.getApiKey())); | |||||
| map = BeanUtils.toStringMap(payOrderC); | |||||
| String response = WxPay.closeOrder(map); | |||||
| log.info("request:" + map.toString() + "\nresponse:" + response); | |||||
| return response; | |||||
| } 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()); | |||||
| } | |||||
| } else { | |||||
| // 服务商模式 | |||||
| WxPayOrderSQ payOrderSC = new WxPayOrderSQ(); | |||||
| String noncestr = Utility.generate32UUID(); | |||||
| payOrderSC.setAppid(appInfo.getParentAppId()); | |||||
| payOrderSC.setSub_appid(appInfo.getAppId()); | |||||
| payOrderSC.setMch_id(payAccount.getMchId()); | |||||
| payOrderSC.setSub_mch_id(payAccount.getSubMchId()); | |||||
| payOrderSC.setNonce_str(noncestr); | |||||
| payOrderSC.setOut_trade_no(record.getPayOrderNo()); | |||||
| payOrderSC.setSign_type("HMAC-SHA256"); | |||||
| try { | |||||
| Map map = BeanUtils.toStringMap(payOrderSC); | |||||
| payOrderSC.setSign(WxPayment.createSignHMAC(map, payAccount.getApiKey())); | |||||
| map = BeanUtils.toStringMap(payOrderSC); | |||||
| String response = WxPay.closeOrder(map); | |||||
| log.info("request:" + map.toString() + "\nresponse:" + response); | |||||
| return response; | |||||
| } 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()); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -16,10 +16,10 @@ import com.iformall.service.pay.entity.PayExtraParam; | |||||
| import com.iformall.service.pay.service.pay.CDrivingPayService; | import com.iformall.service.pay.service.pay.CDrivingPayService; | ||||
| import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | ||||
| import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | ||||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayAdapterService; | |||||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayV2AdapterService; | |||||
| @Service | @Service | ||||
| public class WxH5PayService extends BaseWxPayAdapterService implements CDrivingPayService{ | |||||
| public class WxH5PayService extends BaseWxPayV2AdapterService implements CDrivingPayService{ | |||||
| @Override | @Override | ||||
| public PayAdapterResult pay(WxPayAccount payAccount,WxPayOrder record,WxComposeOrder composeOrder,List<WxOrder> childOrders, | public PayAdapterResult pay(WxPayAccount payAccount,WxPayOrder record,WxComposeOrder composeOrder,List<WxOrder> childOrders, | ||||
| @@ -29,7 +29,7 @@ import com.iformall.service.pay.entity.PayExtraParam; | |||||
| import com.iformall.service.pay.service.pay.CDrivingPayService; | import com.iformall.service.pay.service.pay.CDrivingPayService; | ||||
| import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | ||||
| import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | ||||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayAdapterService; | |||||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayV2AdapterService; | |||||
| import com.iformall.utils.BeanUtils; | import com.iformall.utils.BeanUtils; | ||||
| import com.iformall.utils.MapUtil; | import com.iformall.utils.MapUtil; | ||||
| import com.iformall.utils.Utility; | import com.iformall.utils.Utility; | ||||
| @@ -38,7 +38,7 @@ import lombok.extern.slf4j.Slf4j; | |||||
| @Slf4j | @Slf4j | ||||
| @Service | @Service | ||||
| public class WxMiniAppPayAdapterService extends BaseWxPayAdapterService implements CDrivingPayService{ | |||||
| public class WxMiniAppPayAdapterService extends BaseWxPayV2AdapterService implements CDrivingPayService{ | |||||
| JSONObject errorMap = JSON.parseObject("{" + | JSONObject errorMap = JSON.parseObject("{" + | ||||
| @@ -270,7 +270,7 @@ public class WxMiniAppPayAdapterService extends BaseWxPayAdapterService implemen | |||||
| @Override | @Override | ||||
| public PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record, WxPayAccount payAccount) | public PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record, WxPayAccount payAccount) | ||||
| throws Exception { | throws Exception { | ||||
| return super.payOrderReverse(appInfo, record, payAccount); | |||||
| return super.payOrderReverse(appInfo, record, payAccount,payAccount.getSubMchId()); | |||||
| } | } | ||||
| @Override | @Override | ||||
| @@ -32,7 +32,7 @@ import com.iformall.service.pay.service.pay.CPassivePayService; | |||||
| import com.iformall.service.pay.service.pay.entity.CreateUser; | import com.iformall.service.pay.service.pay.entity.CreateUser; | ||||
| import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | ||||
| import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | ||||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayAdapterService; | |||||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayV2AdapterService; | |||||
| import com.iformall.utils.BeanUtils; | import com.iformall.utils.BeanUtils; | ||||
| import com.iformall.utils.Utility; | import com.iformall.utils.Utility; | ||||
| import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
| @@ -41,7 +41,7 @@ import me.chanjar.weixin.common.error.WxErrorException; | |||||
| @Slf4j | @Slf4j | ||||
| @Service | @Service | ||||
| public class WxMiniMaPayAdapterService extends BaseWxPayAdapterService implements CPassivePayService{ | |||||
| public class WxMiniMaPayAdapterService extends BaseWxPayV2AdapterService implements CPassivePayService{ | |||||
| private WxMicroPayOrderP generateWxMicroPayOrderP(WxPayAccount payAccount, WxComposeOrder composeOrder, String productName,WxPayOrder record, EnumPayShare isShare, | private WxMicroPayOrderP generateWxMicroPayOrderP(WxPayAccount payAccount, WxComposeOrder composeOrder, String productName,WxPayOrder record, EnumPayShare isShare, | ||||
| WxAppinfo appInfo, Date currentDate,String bAppId,String bUserPhone) throws Exception { | WxAppinfo appInfo, Date currentDate,String bAppId,String bUserPhone) throws Exception { | ||||
| @@ -253,7 +253,7 @@ public class WxMiniMaPayAdapterService extends BaseWxPayAdapterService implement | |||||
| @Override | @Override | ||||
| public PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record, WxPayAccount payAccount) | public PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record, WxPayAccount payAccount) | ||||
| throws Exception { | throws Exception { | ||||
| return super.payOrderReverse(appInfo, record, payAccount); | |||||
| return super.payOrderReverse(appInfo, record, payAccount,payAccount.getSubMchId()); | |||||
| } | } | ||||
| @Override | @Override | ||||
| @@ -0,0 +1,56 @@ | |||||
| package com.iformall.service.pay.service.pay.wx.v3; | |||||
| import java.io.File; | |||||
| import java.util.Date; | |||||
| import java.util.Map; | |||||
| import org.apache.commons.lang3.StringUtils; | |||||
| import org.springframework.beans.factory.annotation.Autowired; | |||||
| import com.alibaba.fastjson.JSON; | |||||
| import com.alibaba.fastjson.JSONObject; | |||||
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |||||
| import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; | |||||
| import com.iformall.common.ErrorCode; | |||||
| import com.iformall.common.Result; | |||||
| import com.iformall.common.ResultData; | |||||
| import com.iformall.domain.po.PosCouponOrderVerify; | |||||
| import com.iformall.domain.po.WxAppinfo; | |||||
| import com.iformall.domain.po.WxBatchOrder; | |||||
| import com.iformall.domain.po.WxCouponOrder; | |||||
| import com.iformall.domain.po.WxOrder; | |||||
| import com.iformall.domain.po.WxPayAccount; | |||||
| import com.iformall.domain.po.WxPayOrder; | |||||
| import com.iformall.enums.EnumCouponOrderStatus; | |||||
| import com.iformall.enums.EnumOrderFrom; | |||||
| import com.iformall.enums.EnumOrderStatus; | |||||
| import com.iformall.enums.EnumOrderType; | |||||
| import com.iformall.enums.EnumPayMode; | |||||
| import com.iformall.enums.EnumPayStatus; | |||||
| import com.iformall.exception.MallinkException; | |||||
| import com.iformall.pay.WxPay; | |||||
| import com.iformall.pay.WxPayOrderQ; | |||||
| import com.iformall.pay.WxPayOrderSQ; | |||||
| import com.iformall.pay.WxPayment; | |||||
| import com.iformall.service.QrCodeService; | |||||
| import com.iformall.service.helper.WxPayOrderServiceHelper; | |||||
| import com.iformall.service.pay.service.pay.PayAdapterService; | |||||
| import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | |||||
| import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | |||||
| import com.iformall.service.pay.service.pay.wx.BaseWxPayAdapterService; | |||||
| import com.iformall.utils.BeanUtils; | |||||
| import com.iformall.utils.MaUtil; | |||||
| import com.iformall.utils.QRCodeUtils; | |||||
| import com.iformall.utils.Utility; | |||||
| import cn.binarywang.wx.miniapp.api.WxMaService; | |||||
| import cn.binarywang.wx.miniapp.bean.WxMaCodeLineColor; | |||||
| import lombok.extern.slf4j.Slf4j; | |||||
| import me.chanjar.weixin.common.error.WxErrorException; | |||||
| import me.chanjar.weixin.open.api.WxOpenService; | |||||
| @Slf4j | |||||
| public class BaseWxPayV3AdapterService extends BaseWxPayAdapterService{ | |||||
| } | |||||
| @@ -1,275 +0,0 @@ | |||||
| package com.iformall.service.pay.service.pay.wx.v3.miniApp.maPay; | |||||
| import java.io.File; | |||||
| import java.util.Date; | |||||
| import java.util.List; | |||||
| import java.util.Map; | |||||
| import com.iformall.domain.po.*; | |||||
| import org.apache.commons.lang3.StringUtils; | |||||
| import org.springframework.beans.factory.annotation.Autowired; | |||||
| import org.springframework.stereotype.Service; | |||||
| import com.iformall.common.ErrorCode; | |||||
| import com.iformall.common.IdWorker; | |||||
| import com.iformall.domain.po.base.TenantEntity; | |||||
| import com.iformall.enums.EnumPayMode; | |||||
| import com.iformall.enums.EnumPayShare; | |||||
| import com.iformall.enums.EnumUserIsSubscribe; | |||||
| import com.iformall.exception.MallinkException; | |||||
| import com.iformall.mapper.WxCUserBasicInfoMapper; | |||||
| import com.iformall.mapper.WxCUserMapper; | |||||
| import com.iformall.mapper.WxMallMapper; | |||||
| import com.iformall.pay.WxMicroPayOrderP; | |||||
| import com.iformall.pay.WxMicroPayOrderSP; | |||||
| import com.iformall.pay.WxPay; | |||||
| import com.iformall.pay.WxPayment; | |||||
| import com.iformall.service.WxCUserService; | |||||
| import com.iformall.service.order.entity.WxComposeOrder; | |||||
| import com.iformall.service.pay.entity.PayExtraParam; | |||||
| import com.iformall.service.pay.service.pay.CPassivePayService; | |||||
| import com.iformall.service.pay.service.pay.entity.CreateUser; | |||||
| import com.iformall.service.pay.service.pay.entity.PayAdapterResult; | |||||
| import com.iformall.service.pay.service.pay.entity.PayQueryAdapterResult; | |||||
| import com.iformall.service.pay.service.pay.wx.v2.BaseWxPayAdapterService; | |||||
| import com.iformall.utils.BeanUtils; | |||||
| import com.iformall.utils.Utility; | |||||
| import lombok.extern.slf4j.Slf4j; | |||||
| import me.chanjar.weixin.common.error.WxErrorException; | |||||
| @Slf4j | |||||
| @Service | |||||
| public class WxMiniMaPayV3AdapterService implements CPassivePayService{ | |||||
| private WxMicroPayOrderP generateWxMicroPayOrderP(WxPayAccount payAccount, WxComposeOrder composeOrder, String productName,WxPayOrder record, EnumPayShare isShare, | |||||
| WxAppinfo appInfo, Date currentDate,String bAppId,String bUserPhone) throws Exception { | |||||
| String noncestr = Utility.generate32UUID(); | |||||
| WxMicroPayOrderP wxPayOrderP = new WxMicroPayOrderP(); | |||||
| wxPayOrderP.setAppid(bAppId); | |||||
| wxPayOrderP.setMch_id(payAccount.getMchId()); | |||||
| wxPayOrderP.setDevice_info(bUserPhone); | |||||
| wxPayOrderP.setNonce_str(noncestr); | |||||
| wxPayOrderP.setBody(productName); | |||||
| wxPayOrderP.setOut_trade_no(record.getPayOrderNo()); | |||||
| wxPayOrderP.setTotal_fee(record.getPayAmount()); | |||||
| wxPayOrderP.setSpbill_create_ip(record.getIp()); // 终端IP | |||||
| wxPayOrderP.setAuth_code(record.getAuthCode()); | |||||
| wxPayOrderP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentDate)); | |||||
| Date futureDate = new Date(); | |||||
| futureDate.setTime(currentDate.getTime() + 15 * 60 * 1000); | |||||
| wxPayOrderP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(futureDate)); // 15分钟后结束 | |||||
| Map<String, String> payOrderMap = BeanUtils.toStringMap(wxPayOrderP); | |||||
| wxPayOrderP.setSign(WxPayment.createSign(payOrderMap, payAccount.getApiKey())); | |||||
| return wxPayOrderP; | |||||
| } | |||||
| private PayAdapterResult getWxMicroPayOrderPResult(Map<String, String> returnMap,WxPayOrder record,WxPayAccount payAccount) { | |||||
| String return_code = returnMap.get("return_code"); | |||||
| String result_code = returnMap.get("result_code"); | |||||
| PayAdapterResult pr = null; | |||||
| if ("SUCCESS".equalsIgnoreCase(return_code)) { | |||||
| if ("SUCCESS".equals(result_code)) { | |||||
| String openId = returnMap.get("openid"); | |||||
| String isSubscribe = returnMap.get("is_subscribe"); | |||||
| String transactionId = returnMap.get("transaction_id"); | |||||
| record.setTransactionId(transactionId); | |||||
| record.setUpdateTime(new Date()); | |||||
| pr = new PayAdapterResult(true, "success", returnMap,transactionId); | |||||
| } else { | |||||
| String err_code = returnMap.get("err_code"); | |||||
| String errMsg = returnMap.get("err_code_des"); | |||||
| if (errMsg.length() <= 0) { | |||||
| errMsg = returnMap.get("return_msg"); | |||||
| } | |||||
| record.setFailReason(errMsg); | |||||
| record.setUpdateTime(new Date()); | |||||
| pr = new PayAdapterResult(false, errMsg, returnMap,null); | |||||
| } | |||||
| } else { | |||||
| String errMsg = returnMap.get("return_msg"); | |||||
| record.setFailReason(errMsg); | |||||
| record.setUpdateTime(new Date()); | |||||
| pr = new PayAdapterResult(false, errMsg, returnMap,null); | |||||
| } | |||||
| return pr; | |||||
| } | |||||
| private WxMicroPayOrderSP generateWxMicroPayOrderSP(WxPayAccount payAccount, WxComposeOrder composeOrder, String productName,WxPayOrder record, EnumPayShare isShare, | |||||
| WxAppinfo appInfo, Date currentDate,String bUserPhone) throws Exception { | |||||
| String noncestr = Utility.generate32UUID(); | |||||
| WxMicroPayOrderSP wxPayOrderSP = new WxMicroPayOrderSP(); | |||||
| wxPayOrderSP.setAppid(appInfo.getParentAppId()); | |||||
| wxPayOrderSP.setMch_id(payAccount.getMchId()); | |||||
| wxPayOrderSP.setSub_appid(appInfo.getAppId()); | |||||
| wxPayOrderSP.setSub_mch_id(payAccount.getSubMchId()); | |||||
| wxPayOrderSP.setDevice_info(bUserPhone); | |||||
| wxPayOrderSP.setNonce_str(noncestr); | |||||
| wxPayOrderSP.setBody(productName); | |||||
| wxPayOrderSP.setOut_trade_no(record.getPayOrderNo()); | |||||
| wxPayOrderSP.setTotal_fee(record.getPayAmount()); | |||||
| wxPayOrderSP.setSpbill_create_ip(record.getIp()); | |||||
| wxPayOrderSP.setAuth_code(record.getAuthCode()); | |||||
| wxPayOrderSP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentDate)); | |||||
| Date futureDate = new Date(); | |||||
| futureDate.setTime(currentDate.getTime() + 15 * 60 * 1000); | |||||
| wxPayOrderSP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(futureDate)); // 15分钟后结束 | |||||
| wxPayOrderSP.setSign_type("HMAC-SHA256"); | |||||
| wxPayOrderSP.setProfit_sharing(null); | |||||
| if (isShare == EnumPayShare.YES) { | |||||
| wxPayOrderSP.setProfit_sharing("Y"); | |||||
| } | |||||
| Map<String, String> payOrderMap = BeanUtils.toStringMap(wxPayOrderSP); | |||||
| wxPayOrderSP.setSign(WxPayment.createSignHMAC(payOrderMap, payAccount.getApiKey())); | |||||
| return wxPayOrderSP; | |||||
| } | |||||
| private PayAdapterResult getWxMicroPayOrderSPResutl(Map<String, String> returnMap,WxPayOrder record,WxPayAccount payAccount) { | |||||
| PayAdapterResult pr = null; | |||||
| String return_code = returnMap.get("return_code"); | |||||
| String result_code = returnMap.get("result_code"); | |||||
| if ("SUCCESS".equalsIgnoreCase(return_code)) { | |||||
| if ("SUCCESS".equals(result_code)) { | |||||
| String openId = returnMap.get("sub_openid"); | |||||
| String isSubscribe = returnMap.get("sub_is_subscribe"); | |||||
| String transactionId = returnMap.get("transaction_id"); | |||||
| record.setTransactionId(transactionId); | |||||
| record.setUpdateTime(new Date()); | |||||
| pr = new PayAdapterResult(true, "success", returnMap,transactionId); | |||||
| } else { | |||||
| String err_code = returnMap.get("err_code"); | |||||
| String errMsg = returnMap.get("err_code_des"); | |||||
| if (errMsg.length() <= 0) { | |||||
| errMsg = returnMap.get("return_msg"); | |||||
| } | |||||
| record.setFailReason(errMsg); | |||||
| record.setUpdateTime(new Date()); | |||||
| pr = new PayAdapterResult(false, errMsg, returnMap,null); | |||||
| } | |||||
| } else { | |||||
| String errMsg = returnMap.get("return_msg"); | |||||
| record.setFailReason(errMsg); | |||||
| record.setUpdateTime(new Date()); | |||||
| pr = new PayAdapterResult(false, errMsg, returnMap,null); | |||||
| } | |||||
| return pr; | |||||
| } | |||||
| @Override | |||||
| public PayAdapterResult pay(WxPayAccount payAccount,WxPayOrder record, WxComposeOrder composeOrder,List<WxOrder> childOrders, | |||||
| String productName, EnumPayShare isShare,WxAppinfo appInfo, Date currentDate, PayExtraParam params) throws Exception { | |||||
| if (payAccount.getType() == EnumPayMode.MCH.getCode()) { | |||||
| // 扫码支付 普通商户模式 | |||||
| String bAppId = (String) params.getValue("bAppId"); | |||||
| if (StringUtils.isBlank(bAppId)) { | |||||
| throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"bAppId 不能为空"); | |||||
| } | |||||
| String bUserPhone = (String) params.getValue("bUserPhone"); | |||||
| if (StringUtils.isBlank(bUserPhone)) { | |||||
| throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"bUserPhone 不能为空"); | |||||
| } | |||||
| WxMicroPayOrderP wxPayOrderP = generateWxMicroPayOrderP(payAccount, composeOrder,productName,record, isShare, appInfo, currentDate, bAppId, bUserPhone); | |||||
| String response = WxPay.micropay(BeanUtils.toStringMap(wxPayOrderP)); | |||||
| log.info("pay order, wechat micropay, " + wxPayOrderP.toString() + ", response: " + response.toString()); | |||||
| Map<String, String> returnMap = WxPayment.xmlToMap(response); | |||||
| returnMap.put("payOrderId", record.getPayOrderNo()); | |||||
| returnMap.put("orderId", String.valueOf(composeOrder.getMainOrderId())); | |||||
| return getWxMicroPayOrderPResult(returnMap, record, payAccount); | |||||
| } else { | |||||
| // 统一下单 // 服务商模式 | |||||
| String bUserPhone = (String) params.getValue("bUserPhone"); | |||||
| if (StringUtils.isBlank(bUserPhone)) { | |||||
| throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"bUserPhone 不能为空"); | |||||
| } | |||||
| WxMicroPayOrderSP wxPayOrderSP = generateWxMicroPayOrderSP(payAccount, composeOrder,productName,record, isShare, appInfo, currentDate, bUserPhone); | |||||
| String response = WxPay.micropay(BeanUtils.toStringMap(wxPayOrderSP)); | |||||
| log.info("pay order, wechat micropay, " + wxPayOrderSP.toString() + ", response: " + response.toString()); | |||||
| Map<String, String> returnMap = WxPayment.xmlToMap(response); | |||||
| returnMap.put("payOrderId", record.getPayOrderNo()); | |||||
| returnMap.put("orderId", String.valueOf(composeOrder.getMainOrderId())); | |||||
| return getWxMicroPayOrderSPResutl(returnMap, record, payAccount); | |||||
| } | |||||
| } | |||||
| @Autowired | |||||
| WxCUserMapper wxCUserMapper; | |||||
| @Autowired | |||||
| WxCUserService wxCUserService; | |||||
| @Autowired | |||||
| WxCUserBasicInfoMapper wxCUserBasicInfoMapper; | |||||
| @Autowired | |||||
| WxMallMapper wxMallMapper; | |||||
| @Override | |||||
| public CreateUser getCUserAfterPay(Object result,WxAppinfo appInfo) throws Exception { | |||||
| // add c_user, 收银台支付和券支付可能不是同一个人 | |||||
| WxCUser userQ = new WxCUser(); | |||||
| Map<String, String> returnMap = (Map<String, String>) result; | |||||
| String openId = returnMap.get("sub_openid"); | |||||
| //String isSubscribe = returnMap.get("sub_is_subscribe"); | |||||
| userQ.setOpenId(openId); | |||||
| userQ.setAppId(appInfo.getAppId()); | |||||
| userQ.updateTenantInfo(appInfo); | |||||
| WxCUser user1 = wxCUserMapper.findByOpenId(userQ); | |||||
| if (user1 == null) { | |||||
| return null; | |||||
| }else { | |||||
| return new CreateUser(user1.getId(),user1.getUserId()); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public PayQueryAdapterResult queryPayStatus(WxPayOrder oldRecord, WxAppinfo appInfo, | |||||
| WxPayAccount payAccount) throws Exception { | |||||
| //return super.queryPayStatus(oldRecord,appInfo, payAccount); | |||||
| return null; | |||||
| } | |||||
| @Override | |||||
| public int queryPayStatus(PayQueryAdapterResult statusObject, String orderOutNo) throws Exception { | |||||
| //return super.queryPayStatus(statusObject, orderOutNo); | |||||
| return 0; | |||||
| } | |||||
| @Override | |||||
| public int queryPayStatusCode(WxPayOrder oldRecord, WxAppinfo appInfo, WxPayAccount payAccount) | |||||
| throws Exception { | |||||
| //return super.queryPayStatusCode(oldRecord, appInfo, payAccount); | |||||
| return 0; | |||||
| } | |||||
| @Override | |||||
| public PayAdapterResult payOrderClose(WxAppinfo appInfo, WxPayOrder record,WxPayAccount payAccount) throws Exception { | |||||
| //return super.closeOrder(appInfo, record, payAccount); | |||||
| return null; | |||||
| } | |||||
| @Override | |||||
| public PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record, WxPayAccount payAccount) | |||||
| throws Exception { | |||||
| //return super.payOrderReverse(appInfo, record, payAccount); | |||||
| return null; | |||||
| } | |||||
| @Override | |||||
| public PayAdapterResult payOrderPush(String openId,WxAppinfo appInfo, WxBatchOrder batchOrder,WxPayOrder payOrder) throws Exception { | |||||
| return null; | |||||
| } | |||||
| @Override | |||||
| public File getQrcode(WxAppinfo appinfo,String pageUrl,int type,String sceneParam) throws Exception { | |||||
| //return super.getQrCode(appinfo, pageUrl, type, sceneParam); | |||||
| return null; | |||||
| } | |||||
| @Override | |||||
| public PayAdapterResult noCreatePay(WxPayOrder record, WxComposeOrder composeOrder, List<WxOrder> childOrders) { | |||||
| throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR); | |||||
| } | |||||
| } | |||||