| @@ -1,20 +1,19 @@ | |||||
| package com.iformall.pay; | package com.iformall.pay; | ||||
| import java.io.IOException; | |||||
| import java.security.GeneralSecurityException; | |||||
| import java.security.cert.X509Certificate; | import java.security.cert.X509Certificate; | ||||
| import java.util.HashMap; | import java.util.HashMap; | ||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | import java.util.Map; | ||||
| import javax.crypto.IllegalBlockSizeException; | import javax.crypto.IllegalBlockSizeException; | ||||
| import com.alibaba.fastjson.JSON; | import com.alibaba.fastjson.JSON; | ||||
| import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils; | import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils; | ||||
| import com.github.binarywang.wxpay.exception.WxPayException; | import com.github.binarywang.wxpay.exception.WxPayException; | ||||
| import com.github.binarywang.wxpay.service.WxPayService; | import com.github.binarywang.wxpay.service.WxPayService; | ||||
| import com.github.binarywang.wxpay.v3.util.AesUtils; | |||||
| import com.github.binarywang.wxpay.v3.util.RsaCryptoUtil; | 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.Logger; | ||||
| import org.slf4j.LoggerFactory; | 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_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 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() { | 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 | * 商家转账到零钱 https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter4_3_1.shtml | ||||
| * 注意:1. 需要登录到特约商户号自己的商户后台,产品中心---APPID账号管理----我关联的appId账号,把C端小程序关联 | * 注意:1. 需要登录到特约商户号自己的商户后台,产品中心---APPID账号管理----我关联的appId账号,把C端小程序关联 | ||||
| @@ -56,12 +56,11 @@ public class WxPayV3 { | |||||
| * @throws IllegalBlockSizeException | * @throws IllegalBlockSizeException | ||||
| */ | */ | ||||
| public static String merchantTranferChange(WxPayService payService,WxCashOutPV3 cashOutV3) throws WxPayException, 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(); | List<WxCashOutPV3Item> items = cashOutV3.getTransfer_detail_list(); | ||||
| for (WxCashOutPV3Item it : items) { | for (WxCashOutPV3Item it : items) { | ||||
| if (!StringUtils.isBlank(it.getUser_name())) { | 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)); | 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)); | 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)); | |||||
| } | |||||
| } | } | ||||
| @@ -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; | |||||
| } | |||||
| } | |||||
| @@ -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.v2.WxRefundAdapterService; | ||||
| import com.iformall.service.pay.service.refund.wx.v3.WxRefundV3AdapterService; | 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.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.v2.WxPayShareService; | ||||
| import com.iformall.service.pay.service.share.wx.v3.WxPayShareV3Service; | import com.iformall.service.pay.service.share.wx.v3.WxPayShareV3Service; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
| @@ -46,7 +47,7 @@ public class PayServiceFactory { | |||||
| @Autowired | @Autowired | ||||
| WxMiniAppPayAdapterService wxMiniAppPayService; | WxMiniAppPayAdapterService wxMiniAppPayService; | ||||
| @Autowired | @Autowired | ||||
| WxMiniAppPaySFTAdapterService wxMiniAppPayV3AdapterService; | |||||
| WxMiniAppPaySFTAdapterService wxMiniAppPaySFTAdapterService; | |||||
| @Autowired | @Autowired | ||||
| WxMiniMaPayAdapterService wxMiniAppMaPayService; | WxMiniMaPayAdapterService wxMiniAppMaPayService; | ||||
| @@ -54,7 +55,7 @@ public class PayServiceFactory { | |||||
| @Autowired | @Autowired | ||||
| WxH5PayService wxH5PayService; | WxH5PayService wxH5PayService; | ||||
| @Autowired | @Autowired | ||||
| WxH5PaySFTService wxH5PayV3Service; | |||||
| WxH5PaySFTService wxH5PaySFTService; | |||||
| @Autowired | @Autowired | ||||
| TtMiniAppPayAdapterService ttMiniAppPayService; | TtMiniAppPayAdapterService ttMiniAppPayService; | ||||
| @@ -62,7 +63,7 @@ public class PayServiceFactory { | |||||
| @Autowired | @Autowired | ||||
| WxPayShareService wxShareService; | WxPayShareService wxShareService; | ||||
| @Autowired | @Autowired | ||||
| WxPayShareV3Service wxPayShareV3Service; | |||||
| WxPayShareSFTService wxPayShareSFTService; | |||||
| @Autowired | @Autowired | ||||
| TtPayShareService ttShareService; | TtPayShareService ttShareService; | ||||
| @@ -86,11 +87,11 @@ public class PayServiceFactory { | |||||
| if (null == serviceMap) { | if (null == serviceMap) { | ||||
| serviceMap = new ConcurrentHashMap<String,PayAdapterService>(); | serviceMap = new ConcurrentHashMap<String,PayAdapterService>(); | ||||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxMiniAppPayService); | serviceMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxMiniAppPayService); | ||||
| serviceMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3_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_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_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); | serviceMap.put(EnumPayWay.PAY_WAY_TT.getCode()+"_"+EnumPayVersion.DY_PAY_V2.getCode(),ttMiniAppPayService); | ||||
| } | } | ||||
| return serviceMap; | 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_CREDIT.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxShareService); | ||||
| shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_GIFTLIST.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxShareService); | shareMap.put(EnumPayWay.PAY_WAY_NOT_UNPAY_GIFTLIST.getCode()+"_"+EnumPayVersion.WX_PAY_V2.getCode(), wxShareService); | ||||
| shareMap.put(EnumPayWay.PAY_WAY_WECHAT.getCode()+"_"+EnumPayVersion.WX_PAY_V3_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; | return shareMap; | ||||
| } | } | ||||
| @@ -29,6 +29,7 @@ import com.iformall.pay.WxPay; | |||||
| import com.iformall.pay.WxPayOrderP; | import com.iformall.pay.WxPayOrderP; | ||||
| import com.iformall.pay.WxPayOrderSP; | import com.iformall.pay.WxPayOrderSP; | ||||
| import com.iformall.pay.WxPayV3; | import com.iformall.pay.WxPayV3; | ||||
| import com.iformall.pay.WxPayV3SFT; | |||||
| import com.iformall.pay.WxPayment; | import com.iformall.pay.WxPayment; | ||||
| import com.iformall.service.helper.WxPayOrderServiceHelper; | import com.iformall.service.helper.WxPayOrderServiceHelper; | ||||
| import com.iformall.service.order.entity.WxComposeChildOrderShare; | import com.iformall.service.order.entity.WxComposeChildOrderShare; | ||||
| @@ -171,7 +172,7 @@ public class WxMiniAppPaySFTAdapterService extends BaseWxPaySFTAdapterService i | |||||
| */ | */ | ||||
| if (childOrders.size() == 1) { | if (childOrders.size() == 1) { | ||||
| SFTPayCommonMiniAppReq payReq = generatePayCommonRequest(payAccount,composeOrder,productName,record,openId,appInfo,currentDate); | SFTPayCommonMiniAppReq payReq = generatePayCommonRequest(payAccount,composeOrder,productName,record,openId,appInfo,currentDate); | ||||
| String response = WxPayV3.payCommonWithMiniApp(payService, payReq); | |||||
| String response = WxPayV3SFT.payCommonWithMiniApp(payService, payReq); | |||||
| log.info("pay order v3, " + payReq.toString() + ", response: " + response.toString()); | log.info("pay order v3, " + payReq.toString() + ", response: " + response.toString()); | ||||
| return getOrderPResult(response); | return getOrderPResult(response); | ||||
| } else { | } else { | ||||
| @@ -228,7 +229,7 @@ public class WxMiniAppPaySFTAdapterService extends BaseWxPaySFTAdapterService i | |||||
| req.setSp_mchid(payAccount.getMchId()); | req.setSp_mchid(payAccount.getMchId()); | ||||
| req.setSub_mchid(oldRecord.getSingleChildOrderShare().getMerchantUid()); | req.setSub_mchid(oldRecord.getSingleChildOrderShare().getMerchantUid()); | ||||
| req.setOut_trade_no(String.valueOf(oldRecord.getId())); | req.setOut_trade_no(String.valueOf(oldRecord.getId())); | ||||
| String response = WxPayV3.payCommonQuery(payService, req); | |||||
| String response = WxPayV3SFT.payCommonQuery(payService, req); | |||||
| if (StringUtils.isBlank(response)){ | if (StringUtils.isBlank(response)){ | ||||
| log.error("pay common v3 query response is null."+JSON.toJSONString(req)); | 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)); | 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.setSp_mchid(payAccount.getMchId()); | ||||
| req.setSub_mchid(record.getSingleChildOrderShare().getMerchantUid()); | req.setSub_mchid(record.getSingleChildOrderShare().getMerchantUid()); | ||||
| req.setOut_trade_no(String.valueOf(record.getId())); | req.setOut_trade_no(String.valueOf(record.getId())); | ||||
| WxPayV3.payCommonClose(payService, req); | |||||
| WxPayV3SFT.payCommonClose(payService, req); | |||||
| return new PayAdapterResult(true, "close success", req, null); | return new PayAdapterResult(true, "close success", req, null); | ||||
| }else { | }else { | ||||
| throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"因电商收付通合单查询无法处理,暂时不支持合单支付关闭"); | throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"因电商收付通合单查询无法处理,暂时不支持合单支付关闭"); | ||||
| @@ -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; | |||||
| } | |||||
| } | |||||
| @@ -91,133 +91,18 @@ public class WxPayShareV3Service extends PayShareBaseAdapterService{ | |||||
| @Override | @Override | ||||
| public PayShareResult noReciverShare(WxAppinfo appInfo,WxPayAccount payAccount,WxProfitSharingOrder record,String transcationId,Integer amount) { | 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 | @Override | ||||
| public PayShareResult haveReciversShare(WxAppinfo appInfo,WxPayAccount payAccount,WxProfitSharingOrder record,String transcationId,JSONArray receivers,EnumProfitSharingOrderType shareType ) throws MallinkException { | 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 | @Override | ||||
| public PayShareQueryResult shareQuery(WxAppinfo appInfo, WxPayAccount payAccount, WxProfitSharingOrder record) throws MallinkException { | 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 | @Override | ||||
| public ShareNotifyAdapterResult notify(Map<String, String> paramMap,EnumPayWay payWay) { | 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"); | return getErrorResult("FAILED"); | ||||
| } | } | ||||
| @Override | @Override | ||||
| public ShareAccountResult createShareAccount(WxAppinfo appInfo,WxPayAccount payAccount,WxProfitSharingReceiver receiver) { | 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 | @Autowired | ||||
| @@ -391,58 +146,8 @@ public class WxPayShareV3Service extends PayShareBaseAdapterService{ | |||||
| @Override | @Override | ||||
| public ShareAccountResult deleteShareAccount(WxAppinfo appInfo, WxPayAccount payAccount, | public ShareAccountResult deleteShareAccount(WxAppinfo appInfo, WxPayAccount payAccount, | ||||
| WxProfitSharingReceiver receiver) { | 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 | @Override | ||||
| @@ -463,149 +168,15 @@ public class WxPayShareV3Service extends PayShareBaseAdapterService{ | |||||
| if(EnumYesOrNo.NO.getCode().equals(share)){ | if(EnumYesOrNo.NO.getCode().equals(share)){ | ||||
| throw new MallinkException(ErrorCode.SYS_PARAMETER_TYPE_ERROR.getCode(),"微信不分账"); | 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 | @Override | ||||
| public List<WxProfitSharingReceiver> getReceiverList(TenantEntity tenantEntity, Long merchantId, Integer ttPayWay) { | 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; | 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; | |||||
| // | |||||
| // } | |||||
| } | } | ||||