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

fix pay v3

release_toaliyun_real
lin 3 лет назад
Родитель
Сommit
53d2cf9a67
6 измененных файлов: 333 добавлений и 529 удалений
  1. +18
    -69
      mallinkService/src/main/java/com/iformall/pay/WxPayV3.java
  2. +100
    -0
      mallinkService/src/main/java/com/iformall/pay/WxPayV3SFT.java
  3. +20
    -19
      mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java
  4. +4
    -3
      mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/sft/miniApp/appPay/WxMiniAppPaySFTAdapterService.java
  5. +182
    -0
      mallinkService/src/main/java/com/iformall/service/pay/service/share/wx/sft/WxPayShareSFTService.java
  6. +9
    -438
      mallinkService/src/main/java/com/iformall/service/pay/service/share/wx/v3/WxPayShareV3Service.java

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

@@ -1,20 +1,19 @@
package com.iformall.pay;

import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.crypto.IllegalBlockSizeException;
import com.alibaba.fastjson.JSON;
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.AesUtils;
import com.github.binarywang.wxpay.v3.util.RsaCryptoUtil;
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;

@@ -25,21 +24,22 @@ public class WxPayV3 {
private static final String MERCHANT_TRANSFER_CHANGE_URL = "https://api.mch.weixin.qq.com/v3/transfer/batches";
//查询商家转账到零钱
private static final String MERCHANT_TRANSFER_QUERY_URL = "https://api.mch.weixin.qq.com/v3/transfer/batches/out-batch-no/%s";
//电商收付通-普通支付-小程序下单
private static final String PAY_COMMON_MINIAPP_URL = "https://api.mch.weixin.qq.com/v3/pay/partner/transactions/jsapi";
//电商收付通-普通支付-查询
private static final String PAY_COMMON_QUERY_URL = "https://api.mch.weixin.qq.com/v3/pay/partner/transactions/out-trade-no/%s";
//电商收付通-合单支付-小程序下单
private static final String PAY_COMBINE_MINIAPP_URL = "https://api.mch.weixin.qq.com/v3/combine-transactions/jsapi";
//电商收付通-合单支付-查询
private static final String PAY_COMBINE_QUERY_URL = "https://api.mch.weixin.qq.com/v3/combine-transactions/out-trade-no/%s";
//电商收付通-普通支付-关闭订单
private static final String PAY_COMMON_CLOSE_ORDER_URL = "https://api.mch.weixin.qq.com/v3/pay/partner/transactions/out-trade-no/%s/close";
//电商收付通-合单支付-关闭订单
private static final String PAY_COMBINE_CLOSE_ORDER_URL = "https://api.mch.weixin.qq.com/v3/combine-transactions/out-trade-no/%s/close";
private WxPayV3() {
}

//敏感信息加密
public static String entry(WxPayService payService,String content) throws IllegalBlockSizeException {
X509Certificate certificate = payService.getConfig().getVerifier().getValidCertificate();
return RsaCryptoUtil.encryptOAEP(content, certificate);
}
//解密平台加密信息
public static String decrypt(WxPayService payService,String entryText,String nonce,String associatedData) throws GeneralSecurityException, IOException {
String apiV3Key = payService.getConfig().getApiV3Key();
return JSON.toJSONString(AesUtils.decryptToString(associatedData, nonce, entryText, apiV3Key));
}
/**
* 商家转账到零钱 https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter4_3_1.shtml
* 注意:1. 需要登录到特约商户号自己的商户后台,产品中心---APPID账号管理----我关联的appId账号,把C端小程序关联
@@ -56,12 +56,11 @@ public class WxPayV3 {
* @throws IllegalBlockSizeException
*/
public static String merchantTranferChange(WxPayService payService,WxCashOutPV3 cashOutV3) throws WxPayException, IllegalBlockSizeException {
X509Certificate certificate = payService.getConfig().getVerifier().getValidCertificate();
List<WxCashOutPV3Item> items = cashOutV3.getTransfer_detail_list();
for (WxCashOutPV3Item it : items) {
if (!StringUtils.isBlank(it.getUser_name())) {
//敏感信息加密
it.setUser_name(RsaCryptoUtil.encryptOAEP(it.getUser_name(), certificate));
it.setUser_name(entry(payService,it.getUser_name()));
}
}
return payService.postV3WithWechatpaySerial(MERCHANT_TRANSFER_CHANGE_URL, JSON.toJSONString(cashOutV3));
@@ -85,54 +84,4 @@ public class WxPayV3 {
return payService.postV3WithWechatpaySerial(String.format(MERCHANT_TRANSFER_QUERY_URL, batchNo), JSON.toJSONString(param));
}
/**
* 电商收付通-普通支付-小程序下单 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_3.shtml
* @throws WxPayException
*/
public static String payCommonWithMiniApp(WxPayService payService,SFTPayCommonMiniAppReq payReq) throws WxPayException {
return payService.postV3WithWechatpaySerial(PAY_COMMON_MINIAPP_URL, JSON.toJSONString(payReq));
}
/**
* 电商收付通-普通支付-查询 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_5.shtml
* @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));
}
/**
* 电商收付通-合单支付-小程序下单https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_4.shtml
* @throws WxPayException
*/
public static String payCombineCommonWithMiniApp(WxPayService payService,SFTCombinePayCommonMiniAppReq payReq) throws WxPayException {
return payService.postV3WithWechatpaySerial(PAY_COMBINE_MINIAPP_URL, JSON.toJSONString(payReq));
}
/**
* 电商收付通-合单支付-查询 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_11.shtml
* @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);
}
/**
* 电商收付通-普通支付-关闭 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_11.shtml
* @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));
}
/**
* 电商收付通-合单支付-关闭 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_12.shtml
* @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));
}
}

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

@@ -0,0 +1,100 @@
package com.iformall.pay;

import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.crypto.IllegalBlockSizeException;
import com.alibaba.fastjson.JSON;
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.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;

public class WxPayV3SFT {
protected static Logger log = LoggerFactory.getLogger(WxPayV3SFT.class);

//电商收付通-普通支付-小程序下单
private static final String PAY_COMMON_MINIAPP_URL = "https://api.mch.weixin.qq.com/v3/pay/partner/transactions/jsapi";
//电商收付通-普通支付-查询
private static final String PAY_COMMON_QUERY_URL = "https://api.mch.weixin.qq.com/v3/pay/partner/transactions/out-trade-no/%s";
//电商收付通-合单支付-小程序下单
private static final String PAY_COMBINE_MINIAPP_URL = "https://api.mch.weixin.qq.com/v3/combine-transactions/jsapi";
//电商收付通-合单支付-查询
private static final String PAY_COMBINE_QUERY_URL = "https://api.mch.weixin.qq.com/v3/combine-transactions/out-trade-no/%s";
//电商收付通-普通支付-关闭订单
private static final String PAY_COMMON_CLOSE_ORDER_URL = "https://api.mch.weixin.qq.com/v3/pay/partner/transactions/out-trade-no/%s/close";
//电商收付通-合单支付-关闭订单
private static final String PAY_COMBINE_CLOSE_ORDER_URL = "https://api.mch.weixin.qq.com/v3/combine-transactions/out-trade-no/%s/close";
//电商收付通-分账
private static final String SHARE_URL = "https://api.mch.weixin.qq.com/v3/ecommerce/profitsharing/orders";
private WxPayV3SFT() {
}

/**
* 电商收付通-普通支付-小程序下单 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_3.shtml
* @throws WxPayException
*/
public static String payCommonWithMiniApp(WxPayService payService,SFTPayCommonMiniAppReq payReq) throws WxPayException {
return payService.postV3WithWechatpaySerial(PAY_COMMON_MINIAPP_URL, JSON.toJSONString(payReq));
}
/**
* 电商收付通-普通支付-查询 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_5.shtml
* @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));
}
/**
* 电商收付通-合单支付-小程序下单https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_4.shtml
* @throws WxPayException
*/
public static String payCombineCommonWithMiniApp(WxPayService payService,SFTCombinePayCommonMiniAppReq payReq) throws WxPayException {
return payService.postV3WithWechatpaySerial(PAY_COMBINE_MINIAPP_URL, JSON.toJSONString(payReq));
}
/**
* 电商收付通-合单支付-查询 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_11.shtml
* @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);
}
/**
* 电商收付通-普通支付-关闭 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_11.shtml
* @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));
}
/**
* 电商收付通-合单支付-关闭 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_12.shtml
* @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));
}
/**
* 电商收付通-分账
*/
public static String share(WxPayService payService) {
//return payService.postV3WithWechatpaySerial(SHARE_URL, JSON.toJSONString(closeOrder));
return null;
}
}

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

@@ -8,6 +8,7 @@ import com.iformall.service.pay.service.refund.douyin.TtRefundAdapterService;
import com.iformall.service.pay.service.refund.wx.v2.WxRefundAdapterService;
import com.iformall.service.pay.service.refund.wx.v3.WxRefundV3AdapterService;
import com.iformall.service.pay.service.share.douyin.TtPayShareService;
import com.iformall.service.pay.service.share.wx.sft.WxPayShareSFTService;
import com.iformall.service.pay.service.share.wx.v2.WxPayShareService;
import com.iformall.service.pay.service.share.wx.v3.WxPayShareV3Service;
import org.springframework.beans.factory.annotation.Autowired;
@@ -46,7 +47,7 @@ public class PayServiceFactory {
@Autowired
WxMiniAppPayAdapterService wxMiniAppPayService;
@Autowired
WxMiniAppPaySFTAdapterService wxMiniAppPayV3AdapterService;
WxMiniAppPaySFTAdapterService wxMiniAppPaySFTAdapterService;
@Autowired
WxMiniMaPayAdapterService wxMiniAppMaPayService;
@@ -54,7 +55,7 @@ public class PayServiceFactory {
@Autowired
WxH5PayService wxH5PayService;
@Autowired
WxH5PaySFTService wxH5PayV3Service;
WxH5PaySFTService wxH5PaySFTService;

@Autowired
TtMiniAppPayAdapterService ttMiniAppPayService;
@@ -62,7 +63,7 @@ public class PayServiceFactory {
@Autowired
WxPayShareService wxShareService;
@Autowired
WxPayShareV3Service wxPayShareV3Service;
WxPayShareSFTService wxPayShareSFTService;

@Autowired
TtPayShareService ttShareService;
@@ -86,11 +87,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_SFT.getCode(), wxMiniAppPayV3AdapterService);
serviceMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxMiniAppPaySFTAdapterService);
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_SFT.getCode(), wxMiniAppMaPayService);
//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_SFT.getCode(), wxH5PayV3Service);
serviceMap.put(EnumPayWay.PAY_WAY_WECHAT_WAP.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxH5PaySFTService);
serviceMap.put(EnumPayWay.PAY_WAY_TT.getCode()+"_"+EnumPayVersion.DY_PAY_V2.getCode(),ttMiniAppPayService);
}
return serviceMap;
@@ -125,19 +126,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_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);
shareMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareSFTService);
shareMap.put(EnumPayWay.PAY_WAY_WECHAT_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareSFTService);
shareMap.put(EnumPayWay.PAY_WAY_POS_NEU.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareSFTService);
shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_MERCHANT.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareSFTService);
shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_VERRIFY.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareSFTService);
shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_B_MA.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareSFTService);
shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_CAR_STOP.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareSFTService);
shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_SYSTEM_SEND.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareSFTService);
shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_BATCH_SEND.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareSFTService);
shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_TRADE.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareSFTService);
shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_PASSWD.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareSFTService);
shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_CREDIT.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareSFTService);
shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_GIFTLIST.getCode()+"_"+EnumPayVersion.WX_PAY_V3_SFT.getCode(), wxPayShareSFTService);
}
return shareMap;
}


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

@@ -29,6 +29,7 @@ import com.iformall.pay.WxPay;
import com.iformall.pay.WxPayOrderP;
import com.iformall.pay.WxPayOrderSP;
import com.iformall.pay.WxPayV3;
import com.iformall.pay.WxPayV3SFT;
import com.iformall.pay.WxPayment;
import com.iformall.service.helper.WxPayOrderServiceHelper;
import com.iformall.service.order.entity.WxComposeChildOrderShare;
@@ -171,7 +172,7 @@ public class WxMiniAppPaySFTAdapterService extends BaseWxPaySFTAdapterService i
*/
if (childOrders.size() == 1) {
SFTPayCommonMiniAppReq payReq = generatePayCommonRequest(payAccount,composeOrder,productName,record,openId,appInfo,currentDate);
String response = WxPayV3.payCommonWithMiniApp(payService, payReq);
String response = WxPayV3SFT.payCommonWithMiniApp(payService, payReq);
log.info("pay order v3, " + payReq.toString() + ", response: " + response.toString());
return getOrderPResult(response);
} else {
@@ -228,7 +229,7 @@ public class WxMiniAppPaySFTAdapterService extends BaseWxPaySFTAdapterService i
req.setSp_mchid(payAccount.getMchId());
req.setSub_mchid(oldRecord.getSingleChildOrderShare().getMerchantUid());
req.setOut_trade_no(String.valueOf(oldRecord.getId()));
String response = WxPayV3.payCommonQuery(payService, req);
String response = WxPayV3SFT.payCommonQuery(payService, req);
if (StringUtils.isBlank(response)){
log.error("pay common v3 query response is null."+JSON.toJSONString(req));
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"pay common v3 query response is null."+JSON.toJSONString(req));
@@ -265,7 +266,7 @@ public class WxMiniAppPaySFTAdapterService extends BaseWxPaySFTAdapterService i
req.setSp_mchid(payAccount.getMchId());
req.setSub_mchid(record.getSingleChildOrderShare().getMerchantUid());
req.setOut_trade_no(String.valueOf(record.getId()));
WxPayV3.payCommonClose(payService, req);
WxPayV3SFT.payCommonClose(payService, req);
return new PayAdapterResult(true, "close success", req, null);
}else {
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"因电商收付通合单查询无法处理,暂时不支持合单支付关闭");


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

@@ -0,0 +1,182 @@
package com.iformall.service.pay.service.share.wx.sft;

import java.text.ParseException;
import java.util.*;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.iformall.common.IdWorker;
import com.iformall.domain.dto.WxSharingOrderDto;
import com.iformall.domain.po.*;
import com.iformall.domain.po.base.TenantEntity;
import com.iformall.douyin.pay.enums.MerchantImportStatus;
import com.iformall.enums.*;
import com.iformall.mapper.*;

import net.sf.saxon.trans.Err;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.iformall.common.ErrorCode;
import com.iformall.common.ResultData;
import com.iformall.exception.MallinkException;
import com.iformall.pay.WxPayment;
import com.iformall.pay.WxProfitSharing;
import com.iformall.pay.WxProfitSharingFinishP;
import com.iformall.pay.WxProfitSharingP;
import com.iformall.pay.WxProfitSharingQueryP;
import com.iformall.pay.WxProfitSharingReceiverP;
import com.iformall.service.WxProfitSharingReceiverService;
import com.iformall.service.order.util.OrderHelper;
import com.iformall.service.pay.service.pay.douyin.v1.miniApp.EnumTtPayChannel;
import com.iformall.service.pay.service.share.PayShareAdapterService;
import com.iformall.service.pay.service.share.PayShareBaseAdapterService;
import com.iformall.service.pay.service.share.entity.ShareAccountResult;
import com.iformall.service.pay.service.share.entity.PayShareCalculateAmount;
import com.iformall.service.pay.service.share.entity.PayShareQueryResult;
import com.iformall.service.pay.service.share.entity.PayShareResult;
import com.iformall.service.pay.service.share.entity.ShareNotifyAdapterResult;
import com.iformall.utils.BeanUtils;
import com.iformall.utils.Utility;
import com.iformall.utils.XmlUtil;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class WxPayShareSFTService extends PayShareBaseAdapterService{

@Autowired
WxProfitSharingOrderMapper wxProfitSharingOrderMapper;
@Lazy
@Autowired
WxProfitSharingReceiverService wxProfitSharingReceiverService;

final JSONObject statusMap = JSON.parseObject(
"{\"ACCEPTED\":3," +
"\"PROCESSING\": 4," +
"\"FINISHED\": 5," +
"\"CLOSED\": 6}");
@Override
public Integer getSubsidyType() {
return EnumMerchantSubsidyType.WECHAT.getCode();
}

@Override
public Integer getProfitSharingType() {
return EnumProfitSharingType.PROFIT_SHARING_TYPE_WECHAT.getCode();
}

@Override
public Integer getSharingOrderInitialStatus() {
return EnumProfitSharingOrderStatus.PROFIT_SHARING_READY.getCode();
}

@Override
public PayShareCalculateAmount calculateAmount(Integer payAmount,Integer officialCommissionRate, WxPayAccount payAccount) {
int mallCharge = OrderHelper.getMallCharge(payAmount, payAccount);
Integer realRateAmount = OrderHelper.getRealRateAmount(payAmount, payAccount);
return new PayShareCalculateAmount(payAmount,mallCharge,realRateAmount,0);
}

@Override
public PayShareResult noReciverShare(WxAppinfo appInfo,WxPayAccount payAccount,WxProfitSharingOrder record,String transcationId,Integer amount) {
return null;
}

@Override
public PayShareResult haveReciversShare(WxAppinfo appInfo,WxPayAccount payAccount,WxProfitSharingOrder record,String transcationId,JSONArray receivers,EnumProfitSharingOrderType shareType ) throws MallinkException {
return null;
}

@Override
public PayShareQueryResult shareQuery(WxAppinfo appInfo, WxPayAccount payAccount, WxProfitSharingOrder record) throws MallinkException {
return null;
}
@Autowired
WxAppinfoMapper wxAppinfoMapper;
@Autowired
WxPayAccountMapper wxPayAccountMapper;
@Autowired
WxPayOrderMapper wxPayOrderMapper;
private ShareNotifyAdapterResult getErrorResult(String msg) {
SortedMap resultMap = new TreeMap();
resultMap.put("return_code", "FAIL");
resultMap.put("return_msg", msg);
return new ShareNotifyAdapterResult(false,ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR.getCode(),msg,XmlUtil.getRequestXml(resultMap));
}
private ShareNotifyAdapterResult getSuccessResult(WxPayOrder payOrder, String transcationId){
SortedMap resultMap = new TreeMap();
resultMap.put("return_code", "SUCCESS");
resultMap.put("return_msg", "OK");
return new ShareNotifyAdapterResult(transcationId, payOrder, XmlUtil.getRequestXml(resultMap));
}
@Override
public ShareNotifyAdapterResult notify(Map<String, String> paramMap,EnumPayWay payWay) {

return getErrorResult("FAILED");
}

@Override
public ShareAccountResult createShareAccount(WxAppinfo appInfo,WxPayAccount payAccount,WxProfitSharingReceiver receiver) {
return null;

}

@Autowired
WxProfitSharingReceiverMapper wxProfitSharingReceiverMapper;
@Override
public ShareAccountResult deleteShareAccount(WxAppinfo appInfo, WxPayAccount payAccount,
WxProfitSharingReceiver receiver) {
return null;
}

@Override
public int getOfficialCommission(WxOrder o, WxPayAccount payAccount) {
return 0;
}

@Override
public ResultData handerSharingOrder(WxPayOrder payOrder, WxProfitSharingOrder sharingOrder) {
return new ResultData(ErrorCode.SYS_PARAMETER_TYPE_ERROR.getCode(),"微信分账无需处理");
}

@Override
public WxProfitSharingOrder createSharingOrder(WxSharingOrderDto sharingOrderDto, Integer mchType,Integer share) {
if(EnumPayMchType.DIRECT.getCode().equals(mchType)){
throw new MallinkException(ErrorCode.SYS_PARAMETER_TYPE_ERROR.getCode(),"微信直连模式待开发");
}
if(EnumYesOrNo.NO.getCode().equals(share)){
throw new MallinkException(ErrorCode.SYS_PARAMETER_TYPE_ERROR.getCode(),"微信不分账");
}

return null;
}

@Override
public List<WxProfitSharingReceiver> getReceiverList(TenantEntity tenantEntity, Long merchantId, Integer ttPayWay) {
return null;
}

}

+ 9
- 438
mallinkService/src/main/java/com/iformall/service/pay/service/share/wx/v3/WxPayShareV3Service.java Просмотреть файл

@@ -91,133 +91,18 @@ public class WxPayShareV3Service extends PayShareBaseAdapterService{
@Override
public PayShareResult noReciverShare(WxAppinfo appInfo,WxPayAccount payAccount,WxProfitSharingOrder record,String transcationId,Integer amount) {
WxProfitSharingFinishP psFCmd = new WxProfitSharingFinishP();
psFCmd.setMch_id(payAccount.getMchId());
psFCmd.setSub_mch_id(payAccount.getSubMchId());
psFCmd.setAppid(appInfo.getParentAppId());
psFCmd.setNonce_str(Utility.generate32UUID());
psFCmd.setTransaction_id(transcationId);
psFCmd.setOut_order_no(record.getId().toString());
//psFCmd.setAmount(amount);
psFCmd.setDescription("分账已完结");
psFCmd.setSign_type("HMAC-SHA256");

String response;
try {
psFCmd.setSign(WxPayment.createSignHMAC(BeanUtils.toStringMap(psFCmd), payAccount.getApiKey()));
log.info("request:" + psFCmd.toString());
response = WxProfitSharing.finishOrder(BeanUtils.toStringMap(psFCmd), payAccount.getCertPath(), payAccount.getMchId());
} catch (Exception e) {
log.error("wx noreciver share error:",e);
return new PayShareResult(false, EnumProfitSharingOrderStatus.PROFIT_SHARING_REQ_FAILED.getCode(),ErrorCode.PROFIT_SHARING_REQUEST_FAILED.getMessage()+":"+e.getMessage(), null,null);
}

log.info("response: " + response);
Map<String, String> returnMap = WxPayment.xmlToMap(response);
String return_code = returnMap.get("return_code");

if (!"SUCCESS".equals(return_code)) {
return new PayShareResult(false, EnumProfitSharingOrderStatus.PROFIT_SHARING_REQ_FAILED.getCode(),returnMap.get("return_msg"), null,null);
}
if (!WxPayment.verifyNotifyHMAC(returnMap,payAccount.getApiKey())){
return new PayShareResult(false, EnumProfitSharingOrderStatus.PROFIT_SHARING_REQ_FAILED.getCode(),ErrorCode.PROFIT_SHARING_RETURN_INVALID.getMessage(), null,null);
}
String result_code = returnMap.get("result_code");
if (!"SUCCESS".equals(result_code)) {
return new PayShareResult(false, EnumProfitSharingOrderStatus.PROFIT_SHARING_APPLY_FAILED.getCode(),returnMap.get("err_code_des"), null,null);
}
return new PayShareResult(true, null,"success", returnMap,returnMap.get("order_id"));
return null;
}

@Override
public PayShareResult haveReciversShare(WxAppinfo appInfo,WxPayAccount payAccount,WxProfitSharingOrder record,String transcationId,JSONArray receivers,EnumProfitSharingOrderType shareType ) throws MallinkException {
//分账提交
WxProfitSharingP psCmd = new WxProfitSharingP();
psCmd.setMch_id(payAccount.getMchId());
psCmd.setSub_mch_id(payAccount.getSubMchId());
psCmd.setAppid(appInfo.getParentAppId());
psCmd.setSub_appid(appInfo.getAppId());
psCmd.setNonce_str(Utility.generate32UUID());
psCmd.setTransaction_id(transcationId);
psCmd.setOut_order_no(record.getId().toString());
psCmd.setSign_type("HMAC-SHA256");
psCmd.setReceivers(receivers.toJSONString());
String response;
try {
psCmd.setSign(WxPayment.createSignHMAC(BeanUtils.toStringMap(psCmd), payAccount.getApiKey()));
log.info("request:" + psCmd.toString());
if(shareType.getCode().intValue()==EnumProfitSharingOrderType.PROFIT_SHARING_SINGLE.getCode().intValue()) {
response = WxProfitSharing.pushOrder(BeanUtils.toStringMap(psCmd), payAccount.getCertPath(), payAccount.getMchId());
} else if(shareType.getCode().intValue()==EnumProfitSharingOrderType.PROFIT_SHARING_MULTI.getCode().intValue()) {
response = WxProfitSharing.pushMultiOrder(BeanUtils.toStringMap(psCmd), payAccount.getCertPath(), payAccount.getMchId());
} else {
throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR);
}
} catch (Exception e) {
log.error("wx recivers share error:",e);
return new PayShareResult(false, EnumProfitSharingOrderStatus.PROFIT_SHARING_REQ_FAILED.getCode(), ErrorCode.PROFIT_SHARING_REQUEST_FAILED.getMessage()+":"+e.getMessage(), null, null);
}

log.info("response: " + response);
Map<String, String> returnMap = WxPayment.xmlToMap(response);
String return_code = returnMap.get("return_code");

if (!"SUCCESS".equals(return_code)) {
return new PayShareResult(false, EnumProfitSharingOrderStatus.PROFIT_SHARING_REQ_FAILED.getCode(), returnMap.get("return_msg"), null, null);
}

if (!WxPayment.verifyNotifyHMAC(returnMap,payAccount.getApiKey())){
return new PayShareResult(false, EnumProfitSharingOrderStatus.PROFIT_SHARING_REQ_FAILED.getCode(), ErrorCode.PROFIT_SHARING_RETURN_INVALID.getMessage(), null, null);
}

String result_code = returnMap.get("result_code");
if (!"SUCCESS".equals(result_code)) {
return new PayShareResult(false, EnumProfitSharingOrderStatus.PROFIT_SHARING_APPLY_FAILED.getCode(), returnMap.get("err_code_des"), null, null);
}
return null;
return new PayShareResult(true, null, "success",returnMap, returnMap.get("order_id"));
}

@Override
public PayShareQueryResult shareQuery(WxAppinfo appInfo, WxPayAccount payAccount, WxProfitSharingOrder record) throws MallinkException {
WxProfitSharingQueryP wxProfitSharingQueryP = new WxProfitSharingQueryP();;
wxProfitSharingQueryP.setMch_id(payAccount.getMchId());
wxProfitSharingQueryP.setSub_mch_id(payAccount.getSubMchId());
wxProfitSharingQueryP.setNonce_str(Utility.generate32UUID());
wxProfitSharingQueryP.setTransaction_id(record.getTransactionId());
wxProfitSharingQueryP.setOut_order_no(record.getId().toString());
wxProfitSharingQueryP.setSign_type("HMAC-SHA256");
String response;
try {
wxProfitSharingQueryP.setSign(WxPayment.createSignHMAC(BeanUtils.toStringMap(wxProfitSharingQueryP),payAccount.getApiKey()));
response = WxProfitSharing.queryOrder(BeanUtils.toStringMap(wxProfitSharingQueryP), payAccount.getCertPath(), payAccount.getMchId());
}catch (Exception e){
throw new MallinkException(ErrorCode.PROFIT_SHARING_QUERY_REQUEST_FAILED.getCode(), ErrorCode.PROFIT_SHARING_QUERY_REQUEST_FAILED.getMessage()+e.getMessage());
}
Map<String, String> returnMap = WxPayment.xmlToMap(response);
String return_code = returnMap.get("return_code");
if (!"SUCCESS".equals(return_code)) {
throw new MallinkException(ErrorCode.PROFIT_SHARING_QUERY_REQUEST_FAILED.getCode(), returnMap.get("return_msg"));
}

if (!WxPayment.verifyNotifyHMAC(returnMap,payAccount.getApiKey())){
throw new MallinkException(ErrorCode.PROFIT_SHARING_QUERY_RETURN_INVALID);
}

String result_code = returnMap.get("result_code");
if (!"SUCCESS".equals(result_code)) {
throw new MallinkException(ErrorCode.PROFIT_SHARING_QUERY_APPLY_FAILED.getCode(), returnMap.get("err_code_des"));
}

String out_order_no = returnMap.get("out_order_no");
if (StringUtils.isBlank(out_order_no) || !out_order_no.equals(record.getId().toString())){
throw new MallinkException(ErrorCode.PROFIT_SHARING_QUERY_RETURN_INVALID.getCode(),"out_order_no:["+out_order_no+"] WxProfitSharingOrder:["+record.getId()+"]");
}
Integer code = (Integer) statusMap.get(returnMap.get("status"));
return new PayShareQueryResult(true, code, "success",returnMap, returnMap.get("receivers"));
return null;
}
@@ -244,145 +129,15 @@ public class WxPayShareV3Service extends PayShareBaseAdapterService{
@Override
public ShareNotifyAdapterResult notify(Map<String, String> paramMap,EnumPayWay payWay) {
// how to get wechatAppId, wechatMchId, partnerKey
String appId = paramMap.get("appid");
String subAppId = paramMap.get("sub_appid");
String mchId = paramMap.get("mch_id");
String subMchId = paramMap.get("sub_mch_id");
WxAppinfo appinfo = null;
boolean isNormal = true;
if (StringUtils.isBlank(subAppId) && StringUtils.isBlank(subMchId)) {
// 普通商户号
appinfo = wxAppinfoMapper.findByAppId(appId);
if (appinfo == null) {
log.error("appid not found: " + appId);
throw new MallinkException(ErrorCode.APP_ID_NOT_FOUND);
}
isNormal = true;
} else {
// 服务号 现在用hmac-sha256
appinfo = wxAppinfoMapper.findByAppId(subAppId);
if (appinfo == null) {
log.error("subappid not found: " + subAppId);
throw new MallinkException(ErrorCode.APP_ID_NOT_FOUND);
}
isNormal = false;
}

WxPayAccount payAccount = wxPayAccountMapper.selectById(appinfo.getPayId());
if (payAccount == null) {
throw new MallinkException(ErrorCode.MCH_INFO_NOT_FOUND);
}
String partnerKey = payAccount.getApiKey();
try {
if (payWay == EnumPayWay.PAY_WAY_WECHAT) {
boolean signVerified = false;
if (isNormal) {
// 普通商户号支付
signVerified = WxPayment.verifyNotify(paramMap, partnerKey);
if (!signVerified) {
log.warn("notify order, wxpay checksign error, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString());
throw new MallinkException(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
}
} else {
// 服务号 现在用hmac-sha256
signVerified = WxPayment.verifyNotifyHMAC(paramMap, partnerKey);
if (!signVerified) {
log.warn("notify order, wxpay checksign error, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString());
throw new MallinkException(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
}
}

if (!"SUCCESS".equals(paramMap.get("return_code"))) {
log.warn("notify order, wxpay status not success, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString());
return getErrorResult("订单状态码非SUCCESS");
}

String payOrderNo = paramMap.get("out_trade_no");
String timEndStr = paramMap.get("time_end");
Long payOrderId = Long.valueOf(payOrderNo);
WxPayOrder payOrder = wxPayOrderMapper.selectById(payOrderId,payAccount.getTenantId());
if (payOrder == null) {
log.warn("notify order, wxpay check pay order not exists, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString());
return getErrorResult("订单不存在");
}
// 验证支付金额
if (!paramMap.get("total_fee").equals(payOrder.getPayAmount().toString())) {
log.warn("notify order, wxpay check total_fee is invalid, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString());
return getErrorResult("订单总金额不一致");
}

Date timeEnd = null;

try {
timeEnd = Utility.getDateFromString(timEndStr);
} catch (ParseException e) {
log.error("解析timeEnd失败");
timeEnd = new Date();
}
payOrder.setPayTimeEnd(timeEnd);

log.info("notify order, wxpay checksign success, paramMap:{}, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString());
return getSuccessResult(payOrder, paramMap.get("transaction_id"));
}
} catch (RuntimeException e) {
log.warn("notify order, checksign error, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString() + ", e:" + e.getMessage());
throw new MallinkException(ErrorCode.PAY_ORDER_ERROR);
}

return getErrorResult("FAILED");
}

@Override
public ShareAccountResult createShareAccount(WxAppinfo appInfo,WxPayAccount payAccount,WxProfitSharingReceiver receiver) {
WxProfitSharingReceiverP wxProfitSharingReceiverP = new WxProfitSharingReceiverP();
if (StringUtils.isNotBlank(appInfo.getParentAppId())) {
wxProfitSharingReceiverP.setAppid(appInfo.getParentAppId());
wxProfitSharingReceiverP.setMch_id(payAccount.getMchId());
wxProfitSharingReceiverP.setSub_appid(appInfo.getAppId());
wxProfitSharingReceiverP.setSub_mch_id(payAccount.getSubMchId());
} else {
wxProfitSharingReceiverP.setAppid(appInfo.getAppId());
wxProfitSharingReceiverP.setMch_id(payAccount.getMchId());
}
wxProfitSharingReceiverP.setNonce_str(Utility.generate32UUID());
wxProfitSharingReceiverP.setSign_type("HMAC-SHA256");


JSONObject receiverJSON = new JSONObject();
receiverJSON.put("type", EnumProfitSharingReceiverType.getEnum(receiver.getReceiverType()).getMessage());
receiverJSON.put("account", receiver.getReceiverAccount());
receiverJSON.put("name", receiver.getTrueName());

wxProfitSharingReceiverP.setReceiver(receiverJSON.toJSONString());
String response;
try {
wxProfitSharingReceiverP.setSign(WxPayment.createSignHMAC(BeanUtils.toStringMap(wxProfitSharingReceiverP), payAccount.getApiKey()));
response = WxProfitSharing.addReceiver(BeanUtils.toStringMap(wxProfitSharingReceiverP));
log.info(response);
} catch (Exception e) {
log.error(ErrorCode.PROFIT_SHARING_RECEIVER_ADD_FAILED.getMessage() + e.getMessage());
return new ShareAccountResult(false, ErrorCode.PROFIT_SHARING_RECEIVER_ADD_FAILED.getCode(), e.getMessage(), null);
}
Map<String, String> returnMap = WxPayment.xmlToMap(response);
String return_code = returnMap.get("return_code");
if (!"SUCCESS".equals(return_code)) {
log.error(ErrorCode.PROFIT_SHARING_RECEIVER_ADD_FAILED.getMessage() + returnMap.get("return_msg")+":"+JSON.toJSONString(returnMap));
return new ShareAccountResult(false, ErrorCode.PROFIT_SHARING_RECEIVER_ADD_FAILED.getCode(), returnMap.get("return_msg"), null);
}

String result_code = returnMap.get("result_code");
if (!"SUCCESS".equals(result_code)) {
log.error(ErrorCode.PROFIT_SHARING_RECEIVER_ADD_FAILED.getMessage() + returnMap.get("err_code_des")+":"+JSON.toJSONString(returnMap));
return new ShareAccountResult(false, ErrorCode.PROFIT_SHARING_RECEIVER_ADD_FAILED.getCode(), returnMap.get("err_code_des"), null);
}

if (!WxPayment.verifyNotifyHMAC(returnMap, payAccount.getApiKey())) {
log.error(ErrorCode.PROFIT_SHARING_RECEIVER_ADD_FAILED.getMessage() + "verifyNotifyHMAC"+":"+JSON.toJSONString(returnMap));
return new ShareAccountResult(false, ErrorCode.PROFIT_SHARING_RECEIVER_ADD_FAILED.getCode(), ErrorCode.PROFIT_SHARING_RECEIVER_ADD_FAILED.getMessage(), null);
}
return null;

return new ShareAccountResult(true, null, "success", returnMap);
}

@Autowired
@@ -391,58 +146,8 @@ public class WxPayShareV3Service extends PayShareBaseAdapterService{
@Override
public ShareAccountResult deleteShareAccount(WxAppinfo appInfo, WxPayAccount payAccount,
WxProfitSharingReceiver receiver) {
//删除分账账户从微信服务器
WxProfitSharingReceiverP wxProfitSharingReceiverP = new WxProfitSharingReceiverP();
if (StringUtils.isNotBlank(appInfo.getParentAppId())) {
wxProfitSharingReceiverP.setAppid(appInfo.getParentAppId());
wxProfitSharingReceiverP.setMch_id(payAccount.getMchId());
wxProfitSharingReceiverP.setSub_appid(appInfo.getAppId());
wxProfitSharingReceiverP.setSub_mch_id(payAccount.getSubMchId());
} else {
wxProfitSharingReceiverP.setAppid(appInfo.getAppId());
wxProfitSharingReceiverP.setMch_id(payAccount.getMchId());
}
wxProfitSharingReceiverP.setNonce_str(Utility.generate32UUID());
wxProfitSharingReceiverP.setSign_type("HMAC-SHA256");

JSONObject receiverJSON = new JSONObject();
receiverJSON.put("type", EnumProfitSharingReceiverType.getEnum(receiver.getReceiverType()).getMessage());
receiverJSON.put("account", receiver.getReceiverAccount());

wxProfitSharingReceiverP.setReceiver(receiverJSON.toJSONString());
String response;
try {
wxProfitSharingReceiverP.setSign(WxPayment.createSignHMAC(BeanUtils.toStringMap(wxProfitSharingReceiverP), payAccount.getApiKey()));
response = WxProfitSharing.delReceiver(BeanUtils.toStringMap(wxProfitSharingReceiverP));
} catch (Exception e) {
log.error(ErrorCode.PROFIT_SHARING_RECEIVER_DEL_FAILED.getMessage() + e.getMessage());
return new ShareAccountResult(false, ErrorCode.PROFIT_SHARING_RECEIVER_DEL_FAILED.getCode(), e.getMessage(), null);
}
Map<String, String> returnMap = WxPayment.xmlToMap(response);
String return_code = returnMap.get("return_code");
if (!"SUCCESS".equals(return_code)) {
log.error(ErrorCode.PROFIT_SHARING_RECEIVER_DEL_FAILED.getMessage() + returnMap.get("return_msg")+":"+JSON.toJSONString(returnMap));
return new ShareAccountResult(false, ErrorCode.PROFIT_SHARING_RECEIVER_DEL_FAILED.getCode(), returnMap.get("return_msg"), null);
}

String result_code = returnMap.get("result_code");
if (!"SUCCESS".equals(result_code)) {

if (returnMap.get("err_code").contains("USER_NOT_EXIST")) {
receiver.setStatus(EnumProfitSharingReceiverStatus.PROFIT_SHARING_RECEIVER_STATUS_INVALID.getCode());
receiver.setUpdateTime(new Date());
wxProfitSharingReceiverMapper.updateById(receiver);
}
log.error(ErrorCode.PROFIT_SHARING_RECEIVER_DEL_FAILED.getMessage() + returnMap.get("err_code_des")+":"+JSON.toJSONString(returnMap));
return new ShareAccountResult(false, ErrorCode.PROFIT_SHARING_RECEIVER_DEL_FAILED.getCode(), returnMap.get("err_code_des"), null);
}

if (!WxPayment.verifyNotifyHMAC(returnMap, payAccount.getApiKey())) {
log.error(ErrorCode.PROFIT_SHARING_RECEIVER_DEL_FAILED.getMessage()+":"+JSON.toJSONString(returnMap));
return new ShareAccountResult(false, ErrorCode.PROFIT_SHARING_RECEIVER_DEL_FAILED.getCode(), "verifyNotifyHMAC", null);
}
return null;
return new ShareAccountResult(true, null, "success", returnMap);
}

@Override
@@ -463,149 +168,15 @@ public class WxPayShareV3Service extends PayShareBaseAdapterService{
if(EnumYesOrNo.NO.getCode().equals(share)){
throw new MallinkException(ErrorCode.SYS_PARAMETER_TYPE_ERROR.getCode(),"微信不分账");
}
//是否已创建分账订单
WxProfitSharingOrder record = new WxProfitSharingOrder();
record.updateTenantInfo(sharingOrderDto);
record.setOrderId(sharingOrderDto.getOrderId());
record = wxProfitSharingOrderMapper.selectOne(new QueryWrapper(record));
if (record == null) {
//创建分账订单
Date currentDate = new Date();
record = new WxProfitSharingOrder();
final IdWorker idworker = IdWorker.get();
record.setId(idworker.nextId());
record.updateTenantInfo(sharingOrderDto);
record.setTransactionId(sharingOrderDto.getTransactionId());
record.setOrderId(sharingOrderDto.getOrderId());
record.setPayAmount(sharingOrderDto.getPayAmount());
record.setMerchantId(sharingOrderDto.getMerchantId());
record.setSharingStatus(this.getSharingOrderInitialStatus());
record.setCreateTime(currentDate);
record.setUpdateTime(currentDate);
record.setPayTimeStart(sharingOrderDto.getPayTimeStart());
record.setPayTimeEnd(sharingOrderDto.getPayTimeEnd());
record.setType(sharingOrderDto.getType());
wxProfitSharingOrderMapper.insert(record);
}

List<WxProfitSharingReceiver> psReceiverList = getReceiverList(sharingOrderDto, sharingOrderDto.getMerchantId(), null);

if (psReceiverList != null && psReceiverList.size() > 50) {
throw new MallinkException(ErrorCode.PROFIT_SHARING_RECEIVER_INVALID);
}

if (psReceiverList == null || psReceiverList.size() == 0) { //没有分账账户,
throw new MallinkException(ErrorCode.PROFIT_SHARING_RECEIVER_UNKNOWN);
}

if (psReceiverList.size() > 1 &&//计算分账账户合法性
psReceiverList.stream().filter(r->(r.getParameter() == null)).count() > 0) {
throw new MallinkException(ErrorCode.PROFIT_SHARING_RECEIVER_INVALID);
}

//计算分账金额合法性
psReceiverList.stream().forEach(r->
{
if (r.getParameter() == null){
r.setSharingAmount(sharingOrderDto.getShareAmount());
r.setRateAmount(sharingOrderDto.getRateAmount());
r.setRealRateAmount(sharingOrderDto.getRealRateAmount());
r.setCommissionAmount(sharingOrderDto.getCommissionAmount());
} else {
r.setSharingAmount(sharingOrderDto.getShareAmount()*Integer.valueOf(r.getParameter())/10000);
}
});
if (psReceiverList.stream().mapToInt(r->r.getSharingAmount()).sum() > sharingOrderDto.getShareAmount()){
throw new MallinkException(ErrorCode.PROFIT_SHARING_RECEIVER_UNKNOWN);
}

// 添加分账接收方
JSONArray receivers = new JSONArray();
psReceiverList.stream().forEach(receiver->{
JSONObject jo = new JSONObject();
jo.put("type",this.getShareAccount(receiver.getReceiverType()).getMessage());
jo.put("account",receiver.getReceiverAccount());
jo.put("amount", receiver.getSharingAmount());
jo.put("rateAmount", receiver.getRateAmount());
jo.put("realRateAmount", receiver.getRateAmount());
jo.put("commissionAmount", receiver.getCommissionAmount());
//jo.put("description",receiver.getReceiverComments()); //改为存ID,
jo.put("description",receiver.getId().toString()); //为重试做准备
receivers.add(jo);
});

record.setReceivers(receivers.toJSONString());
wxProfitSharingOrderMapper.updateById(record);

return record;
return null;
}

@Override
public List<WxProfitSharingReceiver> getReceiverList(TenantEntity tenantEntity, Long merchantId, Integer ttPayWay) {
WxProfitSharingReceiver psReceiverQ = new WxProfitSharingReceiver();
psReceiverQ.updateTenantInfo(tenantEntity);
psReceiverQ.setMerchantId(merchantId);
psReceiverQ.setSharingType(getProfitSharingType());
psReceiverQ.setStatus(EnumProfitSharingReceiverStatus.PROFIT_SHARING_RECEIVER_STATUS_VALID.getCode());
psReceiverQ.setPlat(EnumAppPlat.WX.getCode());
List<WxProfitSharingReceiver> psReceiverList = wxProfitSharingReceiverMapper.findList(psReceiverQ);
if (null == psReceiverList || psReceiverList.size() == 0) {
throw new MallinkException(ErrorCode.PROFIT_SHARING_RECEIVER_INVALID.getCode(),"该商户未设置分账账号.");
}else {
for (WxProfitSharingReceiver receiver:psReceiverList) {
if (EnumProfitSharingReceiverType.PROFIT_SHARING_RECEIVER_PERSONAL_WECHATID.getCode().intValue()
== receiver.getReceiverType().intValue()) {
throw new MallinkException(ErrorCode.PROFIT_SHARING_RECEIVER_INVALID.getCode(),"该商户收款账号存在个人微信号方式,微信已停止支持,请重新设置.");
}
}
}
return psReceiverList;
}

private static String queryOrderShareAmount(String mchId,String transcationId,String apiKey) {
WxProfitSharingP psCmd = new WxProfitSharingP();
psCmd.setMch_id(mchId);//服务商商户id
psCmd.setNonce_str(Utility.generate32UUID());
psCmd.setTransaction_id(transcationId);
psCmd.setSign_type("HMAC-SHA256");
try {
psCmd.setSign(WxPayment.createSignHMAC(BeanUtils.toStringMap(psCmd), apiKey));
return WxProfitSharing.queryOrderShareAmount(BeanUtils.toStringMap(psCmd));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

// public static void main(String[] args) {
// System.out.println(queryOrderShareAmount("1511925291","4200001516202205010431149938","XHZfpVA0NzoXgLEjsujctUTcyj8Zur2C"));
// //System.out.println(test("1511925291", "1604439800", "wxed2f44705544b892", "4200001455202205127949391954", "XHZfpVA0NzoXgLEjsujctUTcyj8Zur2C", "684670745960046592", "D:\\apiclient_cert.p12"));
// }
//
// private static String test(String mchId,String subMchId,String parentAppId,String transcationId,String apiKey,String orderNo,String certPaht) {
// WxProfitSharingFinishP psFCmd = new WxProfitSharingFinishP();
// psFCmd.setMch_id(mchId);
// psFCmd.setSub_mch_id(subMchId);
// psFCmd.setAppid(parentAppId);
// psFCmd.setNonce_str(Utility.generate32UUID());
// psFCmd.setTransaction_id(transcationId);
// psFCmd.setOut_order_no(orderNo);
// //psFCmd.setAmount(amount);
// psFCmd.setDescription("分账已完结");
// psFCmd.setSign_type("HMAC-SHA256");
//
// String response;
// try {
// psFCmd.setSign(WxPayment.createSignHMAC(BeanUtils.toStringMap(psFCmd), apiKey));
// log.info("request:" + psFCmd.toString());
// response = WxProfitSharing.finishOrder(BeanUtils.toStringMap(psFCmd), certPaht, mchId);
// return response;
// } catch (Exception e) {
// e.printStackTrace();
// }
// return null;
//
// }
}

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