Просмотр исходного кода

fix pay v3

release_toaliyun_real
lin 3 лет назад
Родитель
Сommit
c299567aa2
25 измененных файлов: 429 добавлений и 521 удалений
  1. +2
    -1
      mallinkService/src/main/java/com/iformall/enums/EnumPayVersion.java
  2. +10
    -10
      mallinkService/src/main/java/com/iformall/pay/WxPayV3.java
  3. +1
    -1
      mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java
  4. +25
    -28
      mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java
  5. +44
    -131
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/BaseWxPayAdapterService.java
  6. +56
    -0
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/BaseWxPaySFTAdapterService.java
  7. +2
    -2
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTCombineCloseItemOrder.java
  8. +5
    -5
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTCombineCloseReq.java
  9. +6
    -6
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTCombineItemOrder.java
  10. +2
    -2
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTCombinePayAmountReq.java
  11. +4
    -4
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTCombinePayCommonMiniAppReq.java
  12. +2
    -2
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTCombinePayerReq.java
  13. +2
    -2
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTPayAmountReq.java
  14. +5
    -5
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTPayCommonMiniAppReq.java
  15. +2
    -2
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTPayQueryReq.java
  16. +2
    -2
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTPaySettleReq.java
  17. +2
    -2
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTPayerReq.java
  18. +4
    -3
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/h5/WxH5PaySFTService.java
  19. +30
    -30
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/miniApp/appPay/WxMiniAppPaySFTAdapterService.java
  20. +159
    -0
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v2/BaseWxPayV2AdapterService.java
  21. +2
    -2
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v2/h5/WxH5PayService.java
  22. +3
    -3
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v2/miniApp/appPay/WxMiniAppPayAdapterService.java
  23. +3
    -3
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v2/miniApp/maPay/WxMiniMaPayAdapterService.java
  24. +56
    -0
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v3/BaseWxPayV3AdapterService.java
  25. +0
    -275
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v3/miniApp/maPay/WxMiniMaPayV3AdapterService.java

+ 2
- 1
mallinkService/src/main/java/com/iformall/enums/EnumPayVersion.java Просмотреть файл

@@ -6,7 +6,8 @@ package com.iformall.enums;
public enum EnumPayVersion {

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,对接商品库"),
NEU_POS_V1(4,"东软POS支付1.0版本"),
NO_VERSION(5,"无需支付,无版本"),


+ 10
- 10
mallinkService/src/main/java/com/iformall/pay/WxPayV3.java Просмотреть файл

@@ -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.service.WxPayService;
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.LoggerFactory;
@@ -89,7 +89,7 @@ public class WxPayV3 {
* 电商收付通-普通支付-小程序下单 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_3.shtml
* @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));
}
@@ -97,7 +97,7 @@ public class WxPayV3 {
* 电商收付通-普通支付-查询 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_5.shtml
* @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));
}
@@ -105,7 +105,7 @@ public class WxPayV3 {
* 电商收付通-合单支付-小程序下单https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_4.shtml
* @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));
}
@@ -113,7 +113,7 @@ public class WxPayV3 {
* 电商收付通-合单支付-查询 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_11.shtml
* @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);
}
@@ -122,7 +122,7 @@ public class WxPayV3 {
* 电商收付通-普通支付-关闭 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_11.shtml
* @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));
}
@@ -131,7 +131,7 @@ public class WxPayV3 {
* 电商收付通-合单支付-关闭 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_12.shtml
* @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));
}


+ 1
- 1
mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java Просмотреть файл

@@ -448,7 +448,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
}
int share_amount = 0;
int rate_amount = 0;
11111111111111111111
//TODO 11111111111111111111
//todo 注意购物车模式(需测试)每笔子订单算法可能与总订单算法有差
for (WxOrder o : orderList) {
Long merchant_id = null;


+ 25
- 28
mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java Просмотреть файл

@@ -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.PayAdapterService;
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.miniApp.appPay.WxMiniAppPayAdapterService;
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.share.PayShareAdapterService;

@@ -47,17 +46,15 @@ public class PayServiceFactory {
@Autowired
WxMiniAppPayAdapterService wxMiniAppPayService;
@Autowired
WxMiniAppPayV3AdapterService wxMiniAppPayV3AdapterService;
WxMiniAppPaySFTAdapterService wxMiniAppPayV3AdapterService;
@Autowired
WxMiniMaPayAdapterService wxMiniAppMaPayService;
@Autowired
WxMiniMaPayV3AdapterService wxMiniMaPayV3AdapterService;
@Autowired
WxH5PayService wxH5PayService;
@Autowired
WxH5PayV3Service wxH5PayV3Service;
WxH5PaySFTService wxH5PayV3Service;

@Autowired
TtMiniAppPayAdapterService ttMiniAppPayService;
@@ -89,11 +86,11 @@ public class PayServiceFactory {
if (null == serviceMap) {
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_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_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_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);
}
return serviceMap;
@@ -103,7 +100,7 @@ public class PayServiceFactory {
if (null == qrcodeMap) {
qrcodeMap = new ConcurrentHashMap<String,PayAdapterService>();
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);
}
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_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;
}
@@ -150,8 +147,8 @@ public class PayServiceFactory {
refundMap = new ConcurrentHashMap<String, RefundPayAdapterService>();
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.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);
}
return refundMap;
@@ -162,8 +159,8 @@ public class PayServiceFactory {
cashoutMap = new ConcurrentHashMap<String, CashOutAdapterService>();
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.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;
}


mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v2/BaseWxPayAdapterService.java → mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/BaseWxPayAdapterService.java Просмотреть файл

@@ -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.util.Date;
@@ -51,22 +51,38 @@ import me.chanjar.weixin.open.api.WxOpenService;
@Slf4j
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("{" +
@@ -77,85 +93,17 @@ public class BaseWxPayAdapterService {
"\"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());
}
}
}
/**
* 收款码支付回撤,都是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);
Map<String, String> returnMap = WxPayment.xmlToMap(response);
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
if (payAccount.getType() == EnumPayMode.MCH.getCode()) {
// 普通商户号模式
@@ -209,7 +157,7 @@ public class BaseWxPayAdapterService {
payOrderSC.setAppid(appInfo.getParentAppId());
payOrderSC.setSub_appid(appInfo.getAppId());
payOrderSC.setMch_id(payAccount.getMchId());
payOrderSC.setSub_mch_id(payAccount.getSubMchId());
payOrderSC.setSub_mch_id(subMchId);
payOrderSC.setNonce_str(noncestr);
payOrderSC.setOut_trade_no(record.getPayOrderNo());
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;
}
}
}

+ 56
- 0
mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/BaseWxPaySFTAdapterService.java Просмотреть файл

@@ -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{


}

mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v3/entity/CombineCloseItemOrder.java → mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTCombineCloseItemOrder.java Просмотреть файл

@@ -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;

@Data
public class CombineCloseItemOrder {
public class SFTCombineCloseItemOrder {

private String mchid;//子单发起方商户号,必须与发起方appid有绑定关系
private String out_trade_no;//子单商户订单号

mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v3/entity/CombineCloseReq.java → mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTCombineCloseReq.java Просмотреть файл

@@ -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.List;
@@ -9,21 +9,21 @@ import com.iformall.service.order.entity.WxComposeChildOrderShare;
import lombok.Data;

@Data
public class CombineCloseReq {
public class SFTCombineCloseReq {

private String combine_appid;//合单发起方的appid
@JSONField(serialize = false)
private String combine_out_trade_no;//不放到body
private List<CombineCloseItemOrder> sub_orders;
private List<SFTCombineCloseItemOrder> sub_orders;
public void initSubOrders(WxPayAccount payAccount,WxPayOrder payOrder) {
List<WxComposeChildOrderShare> childs = payOrder.getAllChilds();
if (null != childs) {
List<CombineCloseItemOrder> suborders = new ArrayList<CombineCloseItemOrder>();
List<SFTCombineCloseItemOrder> suborders = new ArrayList<SFTCombineCloseItemOrder>();
for (WxComposeChildOrderShare child : childs) {
CombineCloseItemOrder ccio = new CombineCloseItemOrder();
SFTCombineCloseItemOrder ccio = new SFTCombineCloseItemOrder();
ccio.setMchid(payAccount.getMchId());
ccio.setSub_mchid(child.getMerchantUid());
ccio.setOut_trade_no(String.valueOf(child.getOrderId()));

mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v3/entity/CombineItemOrder.java → mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTCombineItemOrder.java Просмотреть файл

@@ -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.WxOrder;
@@ -7,26 +7,26 @@ import com.iformall.domain.po.WxPayAccount;
import lombok.Data;

@Data
public class CombineItemOrder {
public class SFTCombineItemOrder {

private String mchid;//子单发起方商户号,必须与发起方appid有绑定关系
private String attach;//附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用
private CombinePayAmountReq amount;//订单金额
private SFTCombinePayAmountReq amount;//订单金额
private String out_trade_no;//子单商户订单号
private String sub_mchid;//二级商户号,服务商子商户的商户号,被合单方。直连商户不用传二级商户号
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) {
this.mchid = payAccount.getMchId();
this.attach = extParam;
CombinePayAmountReq amount = new CombinePayAmountReq();
SFTCombinePayAmountReq amount = new SFTCombinePayAmountReq();
amount.setTotal_amount(order.getPayment());
this.setAmount(amount);
this.out_trade_no = String.valueOf(order.getId());
this.sub_mchid = subMchId;
this.description = appInfo.getName()+"-"+productName;
PaySettleReq settle = new PaySettleReq();
SFTPaySettleReq settle = new SFTPaySettleReq();
settle.setProfit_sharing(true);
this.setSettle_info(settle);
}

mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v3/entity/CombinePayAmountReq.java → mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTCombinePayAmountReq.java Просмотреть файл

@@ -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;

@Data
public class CombinePayAmountReq {
public class SFTCombinePayAmountReq {

private int total_amount;//总金额,单位为分。
private String currency="CNY";//货币类型

mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v3/entity/CombinePayCommonMiniAppReq.java → mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTCombinePayCommonMiniAppReq.java Просмотреть файл

@@ -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 lombok.Data;

@Data
public class CombinePayCommonMiniAppReq {
public class SFTCombinePayCommonMiniAppReq {

private String combine_appid;//合单发起方的appid
private String combine_mchid;//合单发起方商户号,服务商和电商模式下,传服务商商户号
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;//接收微信支付异步通知回调地址
}

mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v3/entity/CombinePayerReq.java → mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTCombinePayerReq.java Просмотреть файл

@@ -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;

@Data
public class CombinePayerReq {
public class SFTCombinePayerReq {

private String openid;//使用合单appid获取的对应用户openid

mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v3/entity/PayAmountReq.java → mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTPayAmountReq.java Просмотреть файл

@@ -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;

@Data
public class PayAmountReq {
public class SFTPayAmountReq {

private int total;//总金额,单位为分。
private String currency="CNY";//货币类型

mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v3/entity/PayCommonMiniAppReq.java → mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTPayCommonMiniAppReq.java Просмотреть файл

@@ -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;

@Data
public class PayCommonMiniAppReq {
public class SFTPayCommonMiniAppReq {

private String sp_appid;//服务商应用ID
private String sp_mchid;//服务商户号
@@ -11,7 +11,7 @@ public class PayCommonMiniAppReq {
private String description;//商品描述
private String out_trade_no;//商户订单号
private String notify_url;//通知地址,不允许携带查询串
private PaySettleReq settle_info;//结算信息
private PayAmountReq amount;//订单金额
private PayerReq payer;//支付者
private SFTPaySettleReq settle_info;//结算信息
private SFTPayAmountReq amount;//订单金额
private SFTPayerReq payer;//支付者
}

mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v3/entity/PayQueryReq.java → mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTPayQueryReq.java Просмотреть файл

@@ -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 lombok.Data;

@Data
public class PayQueryReq {
public class SFTPayQueryReq {

private String sp_mchid;//服务商户号。
private String sub_mchid;//二级商户号

mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v3/entity/PaySettleReq.java → mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTPaySettleReq.java Просмотреть файл

@@ -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;

@Data
public class PaySettleReq {
public class SFTPaySettleReq {

private boolean profit_sharing;//是否指定分账
private int subsidy_amount = 0;//补差金额,单笔订单最高补差金额为5000元.SettleInfo.profit_sharing为true时,该金额才生效

mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v3/entity/PayerReq.java → mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/entity/SFTPayerReq.java Просмотреть файл

@@ -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;

@Data
public class PayerReq {
public class SFTPayerReq {

private String sp_openid;//用户在服务商appid下的唯一标识

mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v3/h5/WxH5PayV3Service.java → mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/h5/WxH5PaySFTService.java Просмотреть файл

@@ -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.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.entity.PayAdapterResult;
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
public class WxH5PayV3Service implements CDrivingPayService{
public class WxH5PaySFTService extends BaseWxPaySFTAdapterService implements CDrivingPayService{

@Override
public PayAdapterResult pay(WxPayAccount payAccount,WxPayOrder record,WxComposeOrder composeOrder,List<WxOrder> childOrders,

mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v3/miniApp/appPay/WxMiniAppPayV3AdapterService.java → mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/miniApp/appPay/WxMiniAppPaySFTAdapterService.java Просмотреть файл

@@ -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.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.entity.PayAdapterResult;
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.MaUtil;
import com.iformall.utils.MapUtil;
@@ -56,13 +58,13 @@ import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class WxMiniAppPayV3AdapterService implements CDrivingPayService{
public class WxMiniAppPaySFTAdapterService extends BaseWxPaySFTAdapterService implements CDrivingPayService{

@Autowired
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_mchid(payAccount.getMchId());
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.setNotify_url(payAccount.getPayNotifyV3Url());
PaySettleReq settle = new PaySettleReq();
SFTPaySettleReq settle = new SFTPaySettleReq();
settle.setProfit_sharing(true);
req.setSettle_info(settle);
PayAmountReq amout = new PayAmountReq();
SFTPayAmountReq amout = new SFTPayAmountReq();
amout.setTotal(record.getPayAmount());
req.setAmount(amout);
PayerReq payer = new PayerReq();
SFTPayerReq payer = new SFTPayerReq();
payer.setSp_openid(openId);
req.setPayer(payer);
@@ -90,24 +92,24 @@ public class WxMiniAppPayV3AdapterService implements CDrivingPayService{
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 {
CombinePayCommonMiniAppReq req = new CombinePayCommonMiniAppReq();
SFTCombinePayCommonMiniAppReq req = new SFTCombinePayCommonMiniAppReq();
req.setCombine_appid(appInfo.getAppId());
req.setCombine_mchid(payAccount.getMchId());
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) {
CombineItemOrder so = new CombineItemOrder();
SFTCombineItemOrder so = new SFTCombineItemOrder();
String subMchId = getMerchantUid(record,order);
so.initByWxOrder(payAccount, order, subMchId, appInfo, productName, String.valueOf(record.getId()));
suborders.add(so);
}
req.setSub_orders(suborders);
CombinePayerReq payer = new CombinePayerReq();
SFTCombinePayerReq payer = new SFTCombinePayerReq();
payer.setOpenid(openId);
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
*/
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);
log.info("pay order v3, " + payReq.toString() + ", response: " + response.toString());
return getOrderPResult(response);
@@ -221,7 +223,7 @@ public class WxMiniAppPayV3AdapterService implements CDrivingPayService{
public PayQueryAdapterResult queryPayStatus(WxPayOrder oldRecord, WxAppinfo appInfo,
WxPayAccount payAccount) throws Exception {
WxPayService payService = maUtil.getWxPayService(appInfo, payAccount);
PayQueryReq req = new PayQueryReq();
SFTPayQueryReq req = new SFTPayQueryReq();
if (!oldRecord.isMulity()) {
req.setSp_mchid(payAccount.getMchId());
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 {
WxPayService payService = maUtil.getWxPayService(appInfo, payAccount);
if (!record.isMulity()) {
PayQueryReq req = new PayQueryReq();
SFTPayQueryReq req = new SFTPayQueryReq();
req.setSp_mchid(payAccount.getMchId());
req.setSub_mchid(record.getSingleChildOrderShare().getMerchantUid());
req.setOut_trade_no(String.valueOf(record.getId()));
@@ -281,19 +283,17 @@ public class WxMiniAppPayV3AdapterService implements CDrivingPayService{
@Override
public PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record, WxPayAccount payAccount)
throws Exception {
//return super.payOrderReverse(appInfo, record, payAccount);
return null;
return super.payOrderReverse(appInfo, record, payAccount, payAccount.getSubMchId());
}

@Override
public PayAdapterResult payOrderPush(String openId,WxAppinfo appInfo, WxBatchOrder batchOrder,WxPayOrder payOrder) throws Exception {
return null;
throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR);
}

@Override
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

+ 159
- 0
mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v2/BaseWxPayV2AdapterService.java Просмотреть файл

@@ -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());
}
}
}

}

+ 2
- 2
mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v2/h5/WxH5PayService.java Просмотреть файл

@@ -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.entity.PayAdapterResult;
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
public class WxH5PayService extends BaseWxPayAdapterService implements CDrivingPayService{
public class WxH5PayService extends BaseWxPayV2AdapterService implements CDrivingPayService{

@Override
public PayAdapterResult pay(WxPayAccount payAccount,WxPayOrder record,WxComposeOrder composeOrder,List<WxOrder> childOrders,


+ 3
- 3
mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v2/miniApp/appPay/WxMiniAppPayAdapterService.java Просмотреть файл

@@ -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.entity.PayAdapterResult;
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.MapUtil;
import com.iformall.utils.Utility;
@@ -38,7 +38,7 @@ import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class WxMiniAppPayAdapterService extends BaseWxPayAdapterService implements CDrivingPayService{
public class WxMiniAppPayAdapterService extends BaseWxPayV2AdapterService implements CDrivingPayService{

JSONObject errorMap = JSON.parseObject("{" +
@@ -270,7 +270,7 @@ public class WxMiniAppPayAdapterService extends BaseWxPayAdapterService implemen
@Override
public PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record, WxPayAccount payAccount)
throws Exception {
return super.payOrderReverse(appInfo, record, payAccount);
return super.payOrderReverse(appInfo, record, payAccount,payAccount.getSubMchId());
}

@Override


+ 3
- 3
mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v2/miniApp/maPay/WxMiniMaPayAdapterService.java Просмотреть файл

@@ -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.PayAdapterResult;
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.Utility;
import lombok.extern.slf4j.Slf4j;
@@ -41,7 +41,7 @@ import me.chanjar.weixin.common.error.WxErrorException;

@Slf4j
@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,
WxAppinfo appInfo, Date currentDate,String bAppId,String bUserPhone) throws Exception {
@@ -253,7 +253,7 @@ public class WxMiniMaPayAdapterService extends BaseWxPayAdapterService implement
@Override
public PayAdapterResult payOrderReverse(WxAppinfo appInfo, WxPayOrder record, WxPayAccount payAccount)
throws Exception {
return super.payOrderReverse(appInfo, record, payAccount);
return super.payOrderReverse(appInfo, record, payAccount,payAccount.getSubMchId());
}

@Override


+ 56
- 0
mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v3/BaseWxPayV3AdapterService.java Просмотреть файл

@@ -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{


}

+ 0
- 275
mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v3/miniApp/maPay/WxMiniMaPayV3AdapterService.java Просмотреть файл

@@ -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);
}


}

Загрузка…
Отмена
Сохранить