Commit 63bbef99 authored by terrfly's avatar terrfly
Browse files

Merge remote-tracking branch 'origin/dev' into master

parents 48c5d532 49edc927
...@@ -57,15 +57,9 @@ public class MchAppController extends CommonCtrl { ...@@ -57,15 +57,9 @@ public class MchAppController extends CommonCtrl {
@GetMapping @GetMapping
public ApiRes list() { public ApiRes list() {
MchApp mchApp = getObject(MchApp.class); MchApp mchApp = getObject(MchApp.class);
mchApp.setMchNo(getCurrentMchNo());
LambdaQueryWrapper<MchApp> wrapper = MchApp.gw(); IPage<MchApp> pages = mchAppService.selectPage(getIPage(true), mchApp);
wrapper.eq(MchApp::getMchNo, getCurrentMchNo());
if (StringUtils.isNotEmpty(mchApp.getAppId())) wrapper.eq(MchApp::getAppId, mchApp.getAppId());
if (StringUtils.isNotEmpty(mchApp.getAppName())) wrapper.eq(MchApp::getAppName, mchApp.getAppName());
if (mchApp.getState() != null) wrapper.eq(MchApp::getState, mchApp.getState());
wrapper.orderByDesc(MchApp::getCreatedAt);
IPage<MchApp> pages = mchAppService.page(getIPage(true), wrapper);
return ApiRes.ok(pages); return ApiRes.ok(pages);
} }
...@@ -97,7 +91,7 @@ public class MchAppController extends CommonCtrl { ...@@ -97,7 +91,7 @@ public class MchAppController extends CommonCtrl {
@PreAuthorize("hasAnyAuthority('ENT_MCH_APP_VIEW', 'ENT_MCH_APP_EDIT')") @PreAuthorize("hasAnyAuthority('ENT_MCH_APP_VIEW', 'ENT_MCH_APP_EDIT')")
@GetMapping("/{appId}") @GetMapping("/{appId}")
public ApiRes detail(@PathVariable("appId") String appId) { public ApiRes detail(@PathVariable("appId") String appId) {
MchApp mchApp = mchAppService.getById(appId); MchApp mchApp = mchAppService.selectById(appId);
if (mchApp == null || !mchApp.getMchNo().equals(getCurrentMchNo())) { if (mchApp == null || !mchApp.getMchNo().equals(getCurrentMchNo())) {
return ApiRes.fail(ApiCodeEnum.SYS_OPERATION_FAIL_SELETE); return ApiRes.fail(ApiCodeEnum.SYS_OPERATION_FAIL_SELETE);
......
...@@ -17,17 +17,24 @@ package com.jeequan.jeepay.mch.ctrl.merchant; ...@@ -17,17 +17,24 @@ package com.jeequan.jeepay.mch.ctrl.merchant;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.jeequan.jeepay.core.aop.MethodLog; import com.jeequan.jeepay.core.aop.MethodLog;
import com.jeequan.jeepay.core.constants.ApiCodeEnum;
import com.jeequan.jeepay.core.constants.CS; import com.jeequan.jeepay.core.constants.CS;
import com.jeequan.jeepay.core.entity.MchApp;
import com.jeequan.jeepay.core.entity.MchInfo; import com.jeequan.jeepay.core.entity.MchInfo;
import com.jeequan.jeepay.core.entity.PayInterfaceConfig; import com.jeequan.jeepay.core.entity.PayInterfaceConfig;
import com.jeequan.jeepay.core.entity.PayInterfaceDefine; import com.jeequan.jeepay.core.entity.PayInterfaceDefine;
import com.jeequan.jeepay.core.exception.BizException; import com.jeequan.jeepay.core.exception.BizException;
import com.jeequan.jeepay.core.model.ApiRes; import com.jeequan.jeepay.core.model.ApiRes;
import com.jeequan.jeepay.core.model.params.NormalMchParams;
import com.jeequan.jeepay.core.mq.MqCommonService; import com.jeequan.jeepay.core.mq.MqCommonService;
import com.jeequan.jeepay.core.utils.JsonKit; import com.jeequan.jeepay.core.utils.JsonKit;
import com.jeequan.jeepay.core.utils.StringKit;
import com.jeequan.jeepay.mch.ctrl.CommonCtrl; import com.jeequan.jeepay.mch.ctrl.CommonCtrl;
import com.jeequan.jeepay.service.impl.MchAppService;
import com.jeequan.jeepay.service.impl.MchInfoService; import com.jeequan.jeepay.service.impl.MchInfoService;
import com.jeequan.jeepay.service.impl.PayInterfaceConfigService; import com.jeequan.jeepay.service.impl.PayInterfaceConfigService;
import com.jeequan.jeepay.service.impl.SysConfigService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -49,6 +56,8 @@ public class MchPayInterfaceConfigController extends CommonCtrl { ...@@ -49,6 +56,8 @@ public class MchPayInterfaceConfigController extends CommonCtrl {
@Autowired private PayInterfaceConfigService payInterfaceConfigService; @Autowired private PayInterfaceConfigService payInterfaceConfigService;
@Autowired private MchInfoService mchInfoService; @Autowired private MchInfoService mchInfoService;
@Autowired private MqCommonService mqCommonService; @Autowired private MqCommonService mqCommonService;
@Autowired private MchAppService mchAppService;
@Autowired private SysConfigService sysConfigService;
/** /**
* @Author: ZhuXiao * @Author: ZhuXiao
...@@ -78,9 +87,25 @@ public class MchPayInterfaceConfigController extends CommonCtrl { ...@@ -78,9 +87,25 @@ public class MchPayInterfaceConfigController extends CommonCtrl {
@GetMapping("/{appId}/{ifCode}") @GetMapping("/{appId}/{ifCode}")
public ApiRes getByMchNo(@PathVariable(value = "appId") String appId, @PathVariable(value = "ifCode") String ifCode) { public ApiRes getByMchNo(@PathVariable(value = "appId") String appId, @PathVariable(value = "ifCode") String ifCode) {
PayInterfaceConfig payInterfaceConfig = payInterfaceConfigService.getByInfoIdAndIfCode(CS.INFO_TYPE_MCH_APP, appId, ifCode); PayInterfaceConfig payInterfaceConfig = payInterfaceConfigService.getByInfoIdAndIfCode(CS.INFO_TYPE_MCH_APP, appId, ifCode);
if (payInterfaceConfig != null && payInterfaceConfig.getIfRate() != null) { if (payInterfaceConfig != null) {
// 费率转换为百分比数值
if (payInterfaceConfig.getIfRate() != null) {
payInterfaceConfig.setIfRate(payInterfaceConfig.getIfRate().multiply(new BigDecimal("100"))); payInterfaceConfig.setIfRate(payInterfaceConfig.getIfRate().multiply(new BigDecimal("100")));
} }
// 敏感数据脱敏
if (StringUtils.isNotBlank(payInterfaceConfig.getIfParams())) {
MchInfo mchInfo = mchInfoService.getById(getCurrentMchNo());
// 普通商户的支付参数执行数据脱敏
if (mchInfo.getType() == CS.MCH_TYPE_NORMAL) {
NormalMchParams mchParams = NormalMchParams.factory(payInterfaceConfig.getIfCode(), payInterfaceConfig.getIfParams());
if (mchParams != null) {
payInterfaceConfig.setIfParams(mchParams.deSenData());
}
}
}
}
return ApiRes.ok(payInterfaceConfig); return ApiRes.ok(payInterfaceConfig);
} }
...@@ -117,6 +142,9 @@ public class MchPayInterfaceConfigController extends CommonCtrl { ...@@ -117,6 +142,9 @@ public class MchPayInterfaceConfigController extends CommonCtrl {
//若配置存在,为saveOrUpdate添加ID,第一次配置添加创建者 //若配置存在,为saveOrUpdate添加ID,第一次配置添加创建者
if (dbRecoed != null) { if (dbRecoed != null) {
payInterfaceConfig.setId(dbRecoed.getId()); payInterfaceConfig.setId(dbRecoed.getId());
// 合并支付参数
payInterfaceConfig.setIfParams(StringKit.marge(dbRecoed.getIfParams(), payInterfaceConfig.getIfParams()));
}else { }else {
payInterfaceConfig.setCreatedUid(userId); payInterfaceConfig.setCreatedUid(userId);
payInterfaceConfig.setCreatedBy(realName); payInterfaceConfig.setCreatedBy(realName);
...@@ -133,4 +161,25 @@ public class MchPayInterfaceConfigController extends CommonCtrl { ...@@ -133,4 +161,25 @@ public class MchPayInterfaceConfigController extends CommonCtrl {
return ApiRes.ok(); return ApiRes.ok();
} }
/** 查询支付宝商户授权URL **/
@GetMapping("/alipayIsvsubMchAuthUrls/{mchAppId}")
public ApiRes queryAlipayIsvsubMchAuthUrl(@PathVariable String mchAppId) {
MchApp mchApp = mchAppService.getById(mchAppId);
if (mchApp == null || !mchApp.getMchNo().equals(getCurrentMchNo())) {
return ApiRes.fail(ApiCodeEnum.SYS_OPERATION_FAIL_SELETE);
}
MchInfo mchInfo = mchInfoService.getById(mchApp.getMchNo());
String authUrl = sysConfigService.getDBApplicationConfig().genAlipayIsvsubMchAuthUrl(mchInfo.getIsvNo(), mchAppId);
String authQrImgUrl = sysConfigService.getDBApplicationConfig().genScanImgUrl(authUrl);
JSONObject result = new JSONObject();
result.put("authUrl", authUrl);
result.put("authQrImgUrl", authQrImgUrl);
return ApiRes.ok(result);
}
} }
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jeequan.jeepay.pay.channel.alipay.ctrl;
import cn.hutool.core.util.URLUtil;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.domain.AlipayOpenAuthTokenAppModel;
import com.alipay.api.request.AlipayOpenAuthTokenAppRequest;
import com.alipay.api.response.AlipayOpenAuthTokenAppResponse;
import com.jeequan.jeepay.core.constants.CS;
import com.jeequan.jeepay.core.ctrls.AbstractCtrl;
import com.jeequan.jeepay.core.entity.MchApp;
import com.jeequan.jeepay.core.entity.PayInterfaceConfig;
import com.jeequan.jeepay.core.exception.BizException;
import com.jeequan.jeepay.core.model.params.alipay.AlipayConfig;
import com.jeequan.jeepay.core.model.params.alipay.AlipayIsvParams;
import com.jeequan.jeepay.core.mq.MqCommonService;
import com.jeequan.jeepay.core.utils.JsonKit;
import com.jeequan.jeepay.pay.channel.alipay.AlipayKit;
import com.jeequan.jeepay.pay.model.AlipayClientWrapper;
import com.jeequan.jeepay.pay.model.IsvConfigContext;
import com.jeequan.jeepay.pay.service.ConfigContextService;
import com.jeequan.jeepay.service.impl.MchAppService;
import com.jeequan.jeepay.service.impl.PayInterfaceConfigService;
import com.jeequan.jeepay.service.impl.SysConfigService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import java.io.IOException;
import java.math.BigDecimal;
/**
* 渠道侧自定义业务ctrl
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/7/15 11:49
*/
@Slf4j
@Controller
@RequestMapping("/api/channelbiz/alipay")
public class AlipayBizController extends AbstractCtrl {
@Autowired private ConfigContextService configContextService;
@Autowired private SysConfigService sysConfigService;
@Autowired private PayInterfaceConfigService payInterfaceConfigService;
@Autowired private MqCommonService mqCommonService;
@Autowired private MchAppService mchAppService;
/** 跳转到支付宝的授权页面 (统一从pay项目获取到isv配置信息)
* isvAndMchNo 格式: ISVNO_MCHAPPID
* example: https://pay.jeepay.cn/api/channelbiz/alipay/redirectAppToAppAuth/V1623998765_60cc41694ee0e6685f57eb1f
* **/
@RequestMapping("/redirectAppToAppAuth/{isvAndMchAppId}")
public void redirectAppToAppAuth(@PathVariable("isvAndMchAppId") String isvAndMchAppId) throws IOException {
String isvNo = isvAndMchAppId.split("_")[0];
IsvConfigContext isvConfigContext = configContextService.getIsvConfigContext(isvNo);
AlipayIsvParams alipayIsvParams = isvConfigContext.getIsvParamsByIfCode(CS.IF_CODE.ALIPAY, AlipayIsvParams.class);
alipayIsvParams.getSandbox();
String oauthUrl = AlipayConfig.PROD_APP_TO_APP_AUTH_URL;
if(alipayIsvParams.getSandbox() != null && alipayIsvParams.getSandbox() == CS.YES){
oauthUrl = AlipayConfig.SANDBOX_APP_TO_APP_AUTH_URL;
}
String redirectUrl = sysConfigService.getDBApplicationConfig().getPaySiteUrl() + "/api/channelbiz/alipay/appToAppAuthCallback";
response.sendRedirect(String.format(oauthUrl, alipayIsvParams.getAppId(), URLUtil.encode(redirectUrl), isvAndMchAppId));
}
/** 支付宝授权回调地址 **/
@RequestMapping("/appToAppAuthCallback")
public String appToAppAuthCallback() {
String errMsg = null;
boolean isAlipaySysAuth = true; //是否 服务商登录支付宝后台系统发起的商户授权, 此时无法获取authCode和商户的信息。
try {
// isvAndMchAppId 格式: ISVNO_MCHAPPID, 如果isvAndMchNo为空说明是: 支付宝后台的二维码授权之后的跳转链接。
String isvAndMchAppId = getValString("state");
String appAuthCode = getValString("app_auth_code"); // 支付宝授权code
if(StringUtils.isNotEmpty(isvAndMchAppId) && StringUtils.isNotEmpty(appAuthCode)){
isAlipaySysAuth = false;
String isvNo = isvAndMchAppId.split("_")[0];
String mchAppId = isvAndMchAppId.split("_")[1];
AlipayClientWrapper alipayClientWrapper = configContextService.getIsvConfigContext(isvNo).getAlipayClientWrapper();
AlipayOpenAuthTokenAppRequest request = new AlipayOpenAuthTokenAppRequest();
AlipayOpenAuthTokenAppModel model = new AlipayOpenAuthTokenAppModel();
model.setGrantType("authorization_code");
model.setCode(appAuthCode);
request.setBizModel(model);
// expiresIn: 该字段已作废,应用令牌长期有效,接入方不需要消费该字段
// reExpiresIn: 刷新令牌的有效时间(从接口调用时间作为起始时间),单位到秒
// DateUtil.offsetSecond(new Date(), Integer.parseInt(resp.getExpiresIn()));
AlipayOpenAuthTokenAppResponse resp = alipayClientWrapper.execute(request);
if(!resp.isSuccess()){
throw new BizException(AlipayKit.appendErrMsg(resp.getMsg(), resp.getSubMsg()));
}
String appAuthToken = resp.getAppAuthToken();
JSONObject ifParams = new JSONObject();
ifParams.put("appAuthToken", appAuthToken); ifParams.put("refreshToken", resp.getAppRefreshToken()); ifParams.put("expireTimestamp", resp.getExpiresIn());
PayInterfaceConfig dbRecord = payInterfaceConfigService.getByInfoIdAndIfCode(CS.INFO_TYPE_MCH_APP, mchAppId, CS.IF_CODE.ALIPAY);
if(dbRecord != null){
PayInterfaceConfig updateRecord = new PayInterfaceConfig();
updateRecord.setId(dbRecord.getId()); updateRecord.setIfParams(ifParams.toJSONString());
payInterfaceConfigService.updateById(updateRecord);
}else{
dbRecord = new PayInterfaceConfig();
dbRecord.setInfoType(CS.INFO_TYPE_MCH_APP);
dbRecord.setInfoId(mchAppId);
dbRecord.setIfCode(CS.IF_CODE.ALIPAY);
dbRecord.setIfParams(ifParams.toJSONString());
dbRecord.setIfRate(new BigDecimal("0.006")); //默认费率
dbRecord.setState(CS.YES);
dbRecord.setCreatedBy("SYS");
dbRecord.setCreatedUid(0L);
payInterfaceConfigService.save(dbRecord);
}
MchApp mchApp = mchAppService.getById(mchAppId);
JSONObject jsonObject = JsonKit.newJson("mchNo", mchApp.getMchNo());
jsonObject.put("appId", mchApp.getAppId());
mqCommonService.send(jsonObject.toJSONString(), CS.MQ.MQ_TYPE_MODIFY_MCH_APP); // 推送mq到目前节点进行更新数据
}
} catch (Exception e) {
log.error("error", e);
errMsg = StringUtils.defaultIfBlank(e.getMessage(), "系统异常!");
}
request.setAttribute("errMsg", errMsg);
request.setAttribute("isAlipaySysAuth", isAlipaySysAuth);
return "channel/alipay/isvsubMchAuth";
}
}
...@@ -27,6 +27,7 @@ import com.jeequan.jeepay.pay.rqrs.AbstractRS; ...@@ -27,6 +27,7 @@ import com.jeequan.jeepay.pay.rqrs.AbstractRS;
import com.jeequan.jeepay.pay.rqrs.payorder.UnifiedOrderRQ; import com.jeequan.jeepay.pay.rqrs.payorder.UnifiedOrderRQ;
import com.jeequan.jeepay.pay.util.PaywayUtil; import com.jeequan.jeepay.pay.util.PaywayUtil;
import com.jeequan.jeepay.pay.model.MchAppConfigContext; import com.jeequan.jeepay.pay.model.MchAppConfigContext;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/* /*
...@@ -93,8 +94,10 @@ public class WxpayPaymentService extends AbstractPaymentService { ...@@ -93,8 +94,10 @@ public class WxpayPaymentService extends AbstractPaymentService {
if(mchAppConfigContext.isIsvsubMch()){ if(mchAppConfigContext.isIsvsubMch()){
WxpayIsvsubMchParams isvsubMchParams = mchAppConfigContext.getIsvsubMchParamsByIfCode(getIfCode(), WxpayIsvsubMchParams.class); WxpayIsvsubMchParams isvsubMchParams = mchAppConfigContext.getIsvsubMchParamsByIfCode(getIfCode(), WxpayIsvsubMchParams.class);
request.setSubMchId(isvsubMchParams.getSubMchId()); request.setSubMchId(isvsubMchParams.getSubMchId());
if (StringUtils.isNotBlank(isvsubMchParams.getSubMchAppId())) {
request.setSubAppId(isvsubMchParams.getSubMchAppId()); request.setSubAppId(isvsubMchParams.getSubMchAppId());
} }
}
return request; return request;
} }
...@@ -128,7 +131,9 @@ public class WxpayPaymentService extends AbstractPaymentService { ...@@ -128,7 +131,9 @@ public class WxpayPaymentService extends AbstractPaymentService {
reqJSON.put("sp_appid", wxPayService.getConfig().getAppId()); reqJSON.put("sp_appid", wxPayService.getConfig().getAppId());
reqJSON.put("sp_mchid", wxPayService.getConfig().getMchId()); reqJSON.put("sp_mchid", wxPayService.getConfig().getMchId());
reqJSON.put("sub_mchid", isvsubMchParams.getSubMchId()); reqJSON.put("sub_mchid", isvsubMchParams.getSubMchId());
if (StringUtils.isNotBlank(isvsubMchParams.getSubMchAppId())) {
reqJSON.put("sub_appid", isvsubMchParams.getSubMchAppId()); reqJSON.put("sub_appid", isvsubMchParams.getSubMchAppId());
}
}else { // 普通商户 }else { // 普通商户
reqJSON.put("appid", wxPayService.getConfig().getAppId()); reqJSON.put("appid", wxPayService.getConfig().getAppId());
reqJSON.put("mchid", wxPayService.getConfig().getMchId()); reqJSON.put("mchid", wxPayService.getConfig().getMchId());
......
...@@ -27,6 +27,7 @@ import com.github.binarywang.wxpay.v3.auth.PrivateKeySigner; ...@@ -27,6 +27,7 @@ import com.github.binarywang.wxpay.v3.auth.PrivateKeySigner;
import com.github.binarywang.wxpay.v3.auth.WxPayCredentials; import com.github.binarywang.wxpay.v3.auth.WxPayCredentials;
import com.github.binarywang.wxpay.v3.auth.WxPayValidator; import com.github.binarywang.wxpay.v3.auth.WxPayValidator;
import com.github.binarywang.wxpay.v3.util.PemUtils; import com.github.binarywang.wxpay.v3.util.PemUtils;
import com.github.binarywang.wxpay.v3.util.SignUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpStatus; import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig; import org.apache.http.client.config.RequestConfig;
...@@ -71,9 +72,9 @@ public class WxpayV3Util { ...@@ -71,9 +72,9 @@ public class WxpayV3Util {
ISV_URL_MAP.put(WxPayConstants.TradeType.MWEB, "/v3/pay/partner/transactions/h5"); ISV_URL_MAP.put(WxPayConstants.TradeType.MWEB, "/v3/pay/partner/transactions/h5");
} }
public static JSONObject unifiedOrderV3(String url, JSONObject reqJSON, WxPayConfig wxPayConfig) throws WxPayException { public static JSONObject unifiedOrderV3(String reqUrl, JSONObject reqJSON, WxPayConfig wxPayConfig) throws WxPayException {
String response = postV3(PAY_BASE_URL + url, reqJSON.toJSONString(), wxPayConfig); String response = postV3(PAY_BASE_URL + reqUrl, reqJSON.toJSONString(), wxPayConfig);
return JSON.parseObject(response); return JSONObject.parseObject(getPayInfo(response, wxPayConfig));
} }
public static JSONObject queryOrderV3(String url, WxPayConfig wxPayConfig) throws WxPayException { public static JSONObject queryOrderV3(String url, WxPayConfig wxPayConfig) throws WxPayException {
...@@ -215,4 +216,59 @@ public class WxpayV3Util { ...@@ -215,4 +216,59 @@ public class WxpayV3Util {
return httpPost; return httpPost;
} }
public static String getPayInfo(String response, WxPayConfig wxPayConfig) throws WxPayException {
try {
JSONObject resJSON = JSON.parseObject(response);
String timestamp = String.valueOf(System.currentTimeMillis() / 1000L);
String nonceStr = SignUtils.genRandomStr();
String prepayId = resJSON.getString("prepay_id");
switch(wxPayConfig.getTradeType()) {
case WxPayConstants.TradeType.JSAPI: {
Map<String, String> payInfo = new HashMap<>(); // 如果用JsonObject会出现签名错误
payInfo.put("appId", wxPayConfig.getAppId());
payInfo.put("timeStamp", timestamp);
payInfo.put("nonceStr", nonceStr);
payInfo.put("package", "prepay_id=" + prepayId);
payInfo.put("signType", "RSA");
String beforeSign = String.format("%s\n%s\n%s\n%s\n", wxPayConfig.getAppId(), timestamp, nonceStr, "prepay_id=" + prepayId);
payInfo.put("paySign", SignUtils.sign(beforeSign, PemUtils.loadPrivateKey(new FileInputStream(wxPayConfig.getPrivateKeyPath()))));
// 签名以后在增加prepayId参数
payInfo.put("prepayId", prepayId);
return JSON.toJSONString(payInfo);
}
case WxPayConstants.TradeType.MWEB: {
return response;
}
case WxPayConstants.TradeType.APP: {
Map<String, String> payInfo = new HashMap<>();
// APP支付绑定的是微信开放平台上的账号,APPID为开放平台上绑定APP后发放的参数
String wxAppId = wxPayConfig.getSubAppId();
// 此map用于参与调起sdk支付的二次签名,格式全小写,timestamp只能是10位,格式固定,切勿修改
String partnerId = wxPayConfig.getSubMchId();
String packageValue = "Sign=WXPay";
// 此map用于客户端与微信服务器交互
String beforeSign = String.format("%s\n%s\n%s\n%s\n", wxAppId, timestamp, nonceStr, "prepay_id=" + prepayId);
payInfo.put("sign", SignUtils.sign(beforeSign, PemUtils.loadPrivateKey(new FileInputStream(wxPayConfig.getPrivateKeyPath()))));
payInfo.put("prepayId", prepayId);
payInfo.put("partnerId", partnerId);
payInfo.put("appId", wxAppId);
payInfo.put("package", packageValue);
payInfo.put("timeStamp", timestamp);
payInfo.put("nonceStr", nonceStr);
return JSON.toJSONString(payInfo);
}
case WxPayConstants.TradeType.NATIVE:
return response;
default:
return null;
}
} catch (Exception e) {
throw (e instanceof WxPayException) ? (WxPayException) e : new WxPayException(e.getMessage(), e);
}
}
} }
...@@ -23,12 +23,12 @@ import com.jeequan.jeepay.core.entity.PayOrder; ...@@ -23,12 +23,12 @@ import com.jeequan.jeepay.core.entity.PayOrder;
import com.jeequan.jeepay.pay.channel.wxpay.WxpayPaymentService; import com.jeequan.jeepay.pay.channel.wxpay.WxpayPaymentService;
import com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayKit; import com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayKit;
import com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayV3Util; import com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayV3Util;
import com.jeequan.jeepay.pay.model.MchAppConfigContext;
import com.jeequan.jeepay.pay.rqrs.AbstractRS; import com.jeequan.jeepay.pay.rqrs.AbstractRS;
import com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg;
import com.jeequan.jeepay.pay.rqrs.payorder.UnifiedOrderRQ; import com.jeequan.jeepay.pay.rqrs.payorder.UnifiedOrderRQ;
import com.jeequan.jeepay.pay.rqrs.payorder.payway.WxAppOrderRS; import com.jeequan.jeepay.pay.rqrs.payorder.payway.WxAppOrderRS;
import com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg;
import com.jeequan.jeepay.pay.util.ApiResBuilder; import com.jeequan.jeepay.pay.util.ApiResBuilder;
import com.jeequan.jeepay.pay.model.MchAppConfigContext;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/* /*
...@@ -50,6 +50,7 @@ public class WxApp extends WxpayPaymentService { ...@@ -50,6 +50,7 @@ public class WxApp extends WxpayPaymentService {
public AbstractRS pay(UnifiedOrderRQ rq, PayOrder payOrder, MchAppConfigContext mchAppConfigContext) { public AbstractRS pay(UnifiedOrderRQ rq, PayOrder payOrder, MchAppConfigContext mchAppConfigContext) {
WxPayService wxPayService = mchAppConfigContext.getWxServiceWrapper().getWxPayService(); WxPayService wxPayService = mchAppConfigContext.getWxServiceWrapper().getWxPayService();
wxPayService.getConfig().setTradeType(WxPayConstants.TradeType.APP);
// 构造请求数据 // 构造请求数据
JSONObject reqJSON = buildV3OrderRequest(payOrder, mchAppConfigContext); JSONObject reqJSON = buildV3OrderRequest(payOrder, mchAppConfigContext);
......
...@@ -24,13 +24,13 @@ import com.jeequan.jeepay.core.entity.PayOrder; ...@@ -24,13 +24,13 @@ import com.jeequan.jeepay.core.entity.PayOrder;
import com.jeequan.jeepay.pay.channel.wxpay.WxpayPaymentService; import com.jeequan.jeepay.pay.channel.wxpay.WxpayPaymentService;
import com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayKit; import com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayKit;
import com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayV3Util; import com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayV3Util;
import com.jeequan.jeepay.pay.model.MchAppConfigContext;
import com.jeequan.jeepay.pay.rqrs.AbstractRS; import com.jeequan.jeepay.pay.rqrs.AbstractRS;
import com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg;
import com.jeequan.jeepay.pay.rqrs.payorder.UnifiedOrderRQ; import com.jeequan.jeepay.pay.rqrs.payorder.UnifiedOrderRQ;
import com.jeequan.jeepay.pay.rqrs.payorder.payway.WxH5OrderRQ; import com.jeequan.jeepay.pay.rqrs.payorder.payway.WxH5OrderRQ;
import com.jeequan.jeepay.pay.rqrs.payorder.payway.WxH5OrderRS; import com.jeequan.jeepay.pay.rqrs.payorder.payway.WxH5OrderRS;
import com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg;
import com.jeequan.jeepay.pay.util.ApiResBuilder; import com.jeequan.jeepay.pay.util.ApiResBuilder;
import com.jeequan.jeepay.pay.model.MchAppConfigContext;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/* /*
...@@ -54,6 +54,7 @@ public class WxH5 extends WxpayPaymentService { ...@@ -54,6 +54,7 @@ public class WxH5 extends WxpayPaymentService {
WxH5OrderRQ bizRQ = (WxH5OrderRQ) rq; WxH5OrderRQ bizRQ = (WxH5OrderRQ) rq;
WxPayService wxPayService = mchAppConfigContext.getWxServiceWrapper().getWxPayService(); WxPayService wxPayService = mchAppConfigContext.getWxServiceWrapper().getWxPayService();
wxPayService.getConfig().setTradeType(WxPayConstants.TradeType.MWEB);
// 构造请求数据 // 构造请求数据
JSONObject reqJSON = buildV3OrderRequest(payOrder, mchAppConfigContext); JSONObject reqJSON = buildV3OrderRequest(payOrder, mchAppConfigContext);
......
...@@ -23,13 +23,13 @@ import com.jeequan.jeepay.core.entity.PayOrder; ...@@ -23,13 +23,13 @@ import com.jeequan.jeepay.core.entity.PayOrder;
import com.jeequan.jeepay.pay.channel.wxpay.WxpayPaymentService; import com.jeequan.jeepay.pay.channel.wxpay.WxpayPaymentService;
import com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayKit; import com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayKit;
import com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayV3Util; import com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayV3Util;
import com.jeequan.jeepay.pay.model.MchAppConfigContext;
import com.jeequan.jeepay.pay.rqrs.AbstractRS; import com.jeequan.jeepay.pay.rqrs.AbstractRS;
import com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg;
import com.jeequan.jeepay.pay.rqrs.payorder.UnifiedOrderRQ; import com.jeequan.jeepay.pay.rqrs.payorder.UnifiedOrderRQ;
import com.jeequan.jeepay.pay.rqrs.payorder.payway.WxJsapiOrderRQ; import com.jeequan.jeepay.pay.rqrs.payorder.payway.WxJsapiOrderRQ;
import com.jeequan.jeepay.pay.rqrs.payorder.payway.WxJsapiOrderRS; import com.jeequan.jeepay.pay.rqrs.payorder.payway.WxJsapiOrderRS;
import com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg;
import com.jeequan.jeepay.pay.util.ApiResBuilder; import com.jeequan.jeepay.pay.util.ApiResBuilder;
import com.jeequan.jeepay.pay.model.MchAppConfigContext;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/* /*
...@@ -57,16 +57,15 @@ public class WxJsapi extends WxpayPaymentService { ...@@ -57,16 +57,15 @@ public class WxJsapi extends WxpayPaymentService {
// 构造请求数据 // 构造请求数据
JSONObject reqJSON = buildV3OrderRequest(payOrder, mchAppConfigContext); JSONObject reqJSON = buildV3OrderRequest(payOrder, mchAppConfigContext);
String reqUrl; // 请求地址 wxPayService.getConfig().setTradeType(WxPayConstants.TradeType.JSAPI);
String reqUrl;
if(mchAppConfigContext.isIsvsubMch()){ // 特约商户 if(mchAppConfigContext.isIsvsubMch()){ // 特约商户
reqUrl = WxpayV3Util.ISV_URL_MAP.get(WxPayConstants.TradeType.JSAPI); reqUrl = WxpayV3Util.ISV_URL_MAP.get(WxPayConstants.TradeType.JSAPI);
JSONObject payer = new JSONObject(); JSONObject payer = new JSONObject();
payer.put("sp_openid", bizRQ.getOpenid()); payer.put("sp_openid", bizRQ.getOpenid());
reqJSON.put("payer", payer); reqJSON.put("payer", payer);
}else { }else {
reqUrl = WxpayV3Util.NORMALMCH_URL_MAP.get(WxPayConstants.TradeType.JSAPI); reqUrl = WxpayV3Util.NORMALMCH_URL_MAP.get(WxPayConstants.TradeType.JSAPI);
JSONObject payer = new JSONObject(); JSONObject payer = new JSONObject();
payer.put("openid", bizRQ.getOpenid()); payer.put("openid", bizRQ.getOpenid());
reqJSON.put("payer", payer); reqJSON.put("payer", payer);
......
...@@ -23,13 +23,13 @@ import com.jeequan.jeepay.core.entity.PayOrder; ...@@ -23,13 +23,13 @@ import com.jeequan.jeepay.core.entity.PayOrder;
import com.jeequan.jeepay.pay.channel.wxpay.WxpayPaymentService; import com.jeequan.jeepay.pay.channel.wxpay.WxpayPaymentService;
import com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayKit; import com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayKit;
import com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayV3Util; import com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayV3Util;
import com.jeequan.jeepay.pay.model.MchAppConfigContext;
import com.jeequan.jeepay.pay.rqrs.AbstractRS; import com.jeequan.jeepay.pay.rqrs.AbstractRS;
import com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg;
import com.jeequan.jeepay.pay.rqrs.payorder.UnifiedOrderRQ; import com.jeequan.jeepay.pay.rqrs.payorder.UnifiedOrderRQ;
import com.jeequan.jeepay.pay.rqrs.payorder.payway.WxJsapiOrderRQ; import com.jeequan.jeepay.pay.rqrs.payorder.payway.WxJsapiOrderRQ;
import com.jeequan.jeepay.pay.rqrs.payorder.payway.WxJsapiOrderRS; import com.jeequan.jeepay.pay.rqrs.payorder.payway.WxJsapiOrderRS;
import com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg;
import com.jeequan.jeepay.pay.util.ApiResBuilder; import com.jeequan.jeepay.pay.util.ApiResBuilder;
import com.jeequan.jeepay.pay.model.MchAppConfigContext;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/* /*
...@@ -57,6 +57,8 @@ public class WxLite extends WxpayPaymentService { ...@@ -57,6 +57,8 @@ public class WxLite extends WxpayPaymentService {
// 构造请求数据 // 构造请求数据
JSONObject reqJSON = buildV3OrderRequest(payOrder, mchAppConfigContext); JSONObject reqJSON = buildV3OrderRequest(payOrder, mchAppConfigContext);
wxPayService.getConfig().setTradeType(WxPayConstants.TradeType.JSAPI);
String reqUrl; // 请求地址 String reqUrl; // 请求地址
if(mchAppConfigContext.isIsvsubMch()){ // 特约商户 if(mchAppConfigContext.isIsvsubMch()){ // 特约商户
reqUrl = WxpayV3Util.ISV_URL_MAP.get(WxPayConstants.TradeType.JSAPI); reqUrl = WxpayV3Util.ISV_URL_MAP.get(WxPayConstants.TradeType.JSAPI);
......
...@@ -58,7 +58,8 @@ public class WxNative extends WxpayPaymentService { ...@@ -58,7 +58,8 @@ public class WxNative extends WxpayPaymentService {
// 构造请求数据 // 构造请求数据
JSONObject reqJSON = buildV3OrderRequest(payOrder, mchAppConfigContext); JSONObject reqJSON = buildV3OrderRequest(payOrder, mchAppConfigContext);
String reqUrl; // 请求地址 wxPayService.getConfig().setTradeType(WxPayConstants.TradeType.NATIVE);
String reqUrl;
if(mchAppConfigContext.isIsvsubMch()){ // 特约商户 if(mchAppConfigContext.isIsvsubMch()){ // 特约商户
reqUrl = WxpayV3Util.ISV_URL_MAP.get(WxPayConstants.TradeType.NATIVE); reqUrl = WxpayV3Util.ISV_URL_MAP.get(WxPayConstants.TradeType.NATIVE);
}else { }else {
......
...@@ -22,6 +22,7 @@ import com.jeequan.jeepay.pay.mq.receive.MqReceiveCommon; ...@@ -22,6 +22,7 @@ import com.jeequan.jeepay.pay.mq.receive.MqReceiveCommon;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.activemq.ScheduledMessage; import org.apache.activemq.ScheduledMessage;
import org.apache.activemq.command.ActiveMQQueue; import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
...@@ -75,6 +76,16 @@ public class ActiveMqMessage extends MqCommonService { ...@@ -75,6 +76,16 @@ public class ActiveMqMessage extends MqCommonService {
@Qualifier("activePayOrderMchNotifyInner") @Qualifier("activePayOrderMchNotifyInner")
private Queue mqQueue4PayOrderMchNotifyInner; private Queue mqQueue4PayOrderMchNotifyInner;
@Bean("activeMqSendModifyMchApp")
public ActiveMQTopic mqTopic4ModifyMchApp(){
return new ActiveMQTopic(CS.MQ.TOPIC_MODIFY_MCH_APP);
}
@Lazy
@Autowired
@Qualifier("activeMqSendModifyMchApp")
private ActiveMQTopic mqTopic4ModifyMchApp;
/** /**
* 发送消息 * 发送消息
* @param msg * @param msg
...@@ -86,6 +97,8 @@ public class ActiveMqMessage extends MqCommonService { ...@@ -86,6 +97,8 @@ public class ActiveMqMessage extends MqCommonService {
channelOrderQuery(msg); channelOrderQuery(msg);
}else if (sendType.equals(CS.MQ.MQ_TYPE_PAY_ORDER_MCH_NOTIFY)) { }else if (sendType.equals(CS.MQ.MQ_TYPE_PAY_ORDER_MCH_NOTIFY)) {
payOrderMchNotify(msg); payOrderMchNotify(msg);
}else if (sendType.equals(CS.MQ.MQ_TYPE_MODIFY_MCH_APP)) { // 商户应用修改
this.jmsTemplate.convertAndSend(mqTopic4ModifyMchApp, msg);
} }
} }
......
...@@ -53,6 +53,8 @@ public class RabbitMqMessage extends MqCommonService { ...@@ -53,6 +53,8 @@ public class RabbitMqMessage extends MqCommonService {
channelOrderQuery(msg); channelOrderQuery(msg);
}else if (sendType.equals(CS.MQ.MQ_TYPE_PAY_ORDER_MCH_NOTIFY)) { }else if (sendType.equals(CS.MQ.MQ_TYPE_PAY_ORDER_MCH_NOTIFY)) {
payOrderMchNotify(msg); payOrderMchNotify(msg);
}else if (sendType.equals(CS.MQ.MQ_TYPE_MODIFY_MCH_APP)) { // 商户应用修改
directModifyMchApp(msg);
} }
} }
...@@ -91,6 +93,12 @@ public class RabbitMqMessage extends MqCommonService { ...@@ -91,6 +93,12 @@ public class RabbitMqMessage extends MqCommonService {
}); });
} }
/** 发送商户应用修改消息 **/
public void directModifyMchApp(String msg) {
rabbitTemplate.convertAndSend(CS.DIRECT_EXCHANGE, CS.MQ.TOPIC_MODIFY_MCH_APP, msg);
}
/** 接收 查单消息 **/ /** 接收 查单消息 **/
@RabbitListener(queues = CS.MQ.QUEUE_CHANNEL_ORDER_QUERY) @RabbitListener(queues = CS.MQ.QUEUE_CHANNEL_ORDER_QUERY)
public void receiveChannelOrderQuery(String msg) { public void receiveChannelOrderQuery(String msg) {
......
...@@ -57,6 +57,8 @@ public class RocketMqMessage extends MqCommonService { ...@@ -57,6 +57,8 @@ public class RocketMqMessage extends MqCommonService {
channelOrderQuery(msg); channelOrderQuery(msg);
}else if (sendType.equals(CS.MQ.MQ_TYPE_PAY_ORDER_MCH_NOTIFY)) { }else if (sendType.equals(CS.MQ.MQ_TYPE_PAY_ORDER_MCH_NOTIFY)) {
payOrderMchNotify(msg); payOrderMchNotify(msg);
}else if (sendType.equals(CS.MQ.MQ_TYPE_MODIFY_MCH_INFO)) { // 商户信息修改
modifyMchInfo(msg);
} }
} }
...@@ -127,4 +129,17 @@ public class RocketMqMessage extends MqCommonService { ...@@ -127,4 +129,17 @@ public class RocketMqMessage extends MqCommonService {
mqReceiveCommon.payOrderMchNotify(msg); mqReceiveCommon.payOrderMchNotify(msg);
} }
} }
/** 发送商户信息修改消息 **/
public void modifyMchInfo(String msg) {
sendMsg(msg, CS.MQ.TOPIC_MODIFY_MCH_INFO);
}
public void sendMsg(String msg, String group) {
// 这里的分组和消息名称未做区分
rocketMQTemplate.getProducer().setProducerGroup(group);
this.rocketMQTemplate.convertAndSend(group, msg);
}
} }
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>授权提示</title>
<link rel="stylesheet" href="https://cdn.staticfile.org/layui/2.4.3/css/layui.css">
<style>
.mainDiv1 {color:lightseagreen; text-align:center; margin-top: 50px;}
.mainDiv2 {text-align:center; margin-top: 10px;}
.mainDiv3 {text-align:center; margin-top: 200px;}
.mainDivTitle {text-align:center; margin-top: 20px; color:orangered }
</style>
</head>
<body>
<#if errMsg != null >
<div class="mainDiv1 layui-fluid">
<i class="layui-icon" style="font-size:100px; color:orangered">&#x1007;</i>
</div>
<div class="mainDiv2 layui-fluid">
<span style="font-size:16px; ">授权失败</span>
<div class="mainDivTitle layui-fluid">
<span style="font-size:14px">错误提示:${errMsg!''}
</span>
</div>
</div>
<#else>
<div class="mainDiv1 layui-fluid">
<i class="layui-icon" style="font-size:100px;">&#x1005;</i>
</div>
<div class="mainDiv2 layui-fluid">
<span style="font-size:16px">授权成功</span>
</div>
<#if isAlipaySysAuth>
<div class="mainDivTitle layui-fluid">
<span style="font-size:14px">提示: 请联系您的 [服务商]
登录支付宝管理平台获取 [<span style="font-style: oblique">授权Token</span>] 进行下一步配置!</span>
</div>
</#if>
</#if>
<div class="mainDiv3 layui-fluid">
<a class="layui-btn layui-btn-primary closeBtn">关闭页面</a>
</div>
<script src="https://cdn.staticfile.org/layui/2.4.3/layui.min.js"></script>
<script>
layui.use(['jquery'], function(){
layui.$(".closeBtn").click(function(){
var ua = navigator.userAgent.toLowerCase();
if(ua.match(/MicroMessenger/i)=="micromessenger") {
WeixinJSBridge.call('closeWindow');
} else if(ua.indexOf("alipay")!=-1){
AlipayJSBridge.call('closeWebview');
}
else{
window.close();
}
});
});
</script>
</body>
</html>
package com.jeequan.jeepay.service.impl; package com.jeequan.jeepay.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jeequan.jeepay.core.constants.ApiCodeEnum; import com.jeequan.jeepay.core.constants.ApiCodeEnum;
import com.jeequan.jeepay.core.constants.CS; import com.jeequan.jeepay.core.constants.CS;
...@@ -8,7 +10,9 @@ import com.jeequan.jeepay.core.entity.MchPayPassage; ...@@ -8,7 +10,9 @@ import com.jeequan.jeepay.core.entity.MchPayPassage;
import com.jeequan.jeepay.core.entity.PayInterfaceConfig; import com.jeequan.jeepay.core.entity.PayInterfaceConfig;
import com.jeequan.jeepay.core.entity.PayOrder; import com.jeequan.jeepay.core.entity.PayOrder;
import com.jeequan.jeepay.core.exception.BizException; import com.jeequan.jeepay.core.exception.BizException;
import com.jeequan.jeepay.core.utils.StringKit;
import com.jeequan.jeepay.service.mapper.MchAppMapper; import com.jeequan.jeepay.service.mapper.MchAppMapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
...@@ -49,4 +53,30 @@ public class MchAppService extends ServiceImpl<MchAppMapper, MchApp> { ...@@ -49,4 +53,30 @@ public class MchAppService extends ServiceImpl<MchAppMapper, MchApp> {
throw new BizException(ApiCodeEnum.SYS_OPERATION_FAIL_DELETE); throw new BizException(ApiCodeEnum.SYS_OPERATION_FAIL_DELETE);
} }
} }
public MchApp selectById(String appId) {
MchApp mchApp = this.getById(appId);
if (mchApp == null) {
return null;
}
mchApp.setAppSecret(StringKit.str2Star(mchApp.getAppSecret(), 6, 6, 6));
return mchApp;
}
public IPage<MchApp> selectPage(IPage iPage, MchApp mchApp) {
LambdaQueryWrapper<MchApp> wrapper = MchApp.gw();
if (StringUtils.isNotBlank(mchApp.getMchNo())) wrapper.eq(MchApp::getMchNo, mchApp.getMchNo());
if (StringUtils.isNotEmpty(mchApp.getAppId())) wrapper.eq(MchApp::getAppId, mchApp.getAppId());
if (StringUtils.isNotEmpty(mchApp.getAppName())) wrapper.eq(MchApp::getAppName, mchApp.getAppName());
if (mchApp.getState() != null) wrapper.eq(MchApp::getState, mchApp.getState());
wrapper.orderByDesc(MchApp::getCreatedAt);
IPage<MchApp> pages = this.page(iPage, wrapper);
pages.getRecords().stream().forEach(item -> item.setAppSecret(StringKit.str2Star(item.getAppSecret(), 6, 6, 6)));
return pages;
}
} }
...@@ -127,6 +127,7 @@ public class PayInterfaceConfigService extends ServiceImpl<PayInterfaceConfigMap ...@@ -127,6 +127,7 @@ public class PayInterfaceConfigService extends ServiceImpl<PayInterfaceConfigMap
.isNotNull(PayInterfaceConfig::getIfParams)); .isNotNull(PayInterfaceConfig::getIfParams));
for (PayInterfaceConfig config : isvConfigList) { for (PayInterfaceConfig config : isvConfigList) {
config.addExt("mchType", mchInfo.getType());
isvPayConfigMap.put(config.getIfCode(), config); isvPayConfigMap.put(config.getIfCode(), config);
} }
} }
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
<!-- 根据支付方式查询可用的支付接口列表 --> <!-- 根据支付方式查询可用的支付接口列表 -->
<select id="selectAvailablePayInterfaceList" resultType="com.alibaba.fastjson.JSONObject" parameterType="java.util.Map"> <select id="selectAvailablePayInterfaceList" resultType="com.alibaba.fastjson.JSONObject" parameterType="java.util.Map">
select pid.if_code ifCode, pid.if_name ifName, pid.bg_color bgColor, pid.icon icon, pic.if_params ifParams, pic.if_rate ifRate from t_pay_interface_define pid select pid.if_code ifCode, pid.if_name ifName, pid.config_page_type configPageType, pid.bg_color bgColor, pid.icon icon, pic.if_params ifParams, pic.if_rate ifRate from t_pay_interface_define pid
inner join t_pay_interface_config pic on pid.if_code = pic.if_code inner join t_pay_interface_config pic on pid.if_code = pic.if_code
where JSON_CONTAINS(pid.way_codes, JSON_OBJECT('wayCode', #{wayCode})) where JSON_CONTAINS(pid.way_codes, JSON_OBJECT('wayCode', #{wayCode}))
and pid.state = 1 and pid.state = 1
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
<result column="if_name" property="ifName" /> <result column="if_name" property="ifName" />
<result column="is_mch_mode" property="isMchMode" /> <result column="is_mch_mode" property="isMchMode" />
<result column="is_isv_mode" property="isIsvMode" /> <result column="is_isv_mode" property="isIsvMode" />
<result column="config_page_type" property="configPageType" />
<result column="isv_params" property="isvParams" /> <result column="isv_params" property="isvParams" />
<result column="isvsub_mch_params" property="isvsubMchParams" /> <result column="isvsub_mch_params" property="isvsubMchParams" />
<result column="normal_mch_params" property="normalMchParams" /> <result column="normal_mch_params" property="normalMchParams" />
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version> <version>2.4.8</version>
</parent> </parent>
<!-- 声明子项目 --> <!-- 声明子项目 -->
...@@ -37,14 +37,14 @@ ...@@ -37,14 +37,14 @@
<properties> <properties>
<java.version>1.8</java.version> <!-- 指定java版本号 --> <java.version>1.8</java.version> <!-- 指定java版本号 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 项目构建输出编码 --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 项目构建输出编码 -->
<isys.version>1.3.0</isys.version> <!-- 指定当前[项目]版本号 --> <isys.version>1.4.0</isys.version> <!-- 指定当前[项目]版本号 -->
<!-- 其他工具包 --> <!-- 其他工具包 -->
<jeepay.sdk.java.version>1.1.0</jeepay.sdk.java.version> <jeepay.sdk.java.version>1.1.0</jeepay.sdk.java.version>
<fastjson.version>1.2.76</fastjson.version> <!-- fastjson --> <fastjson.version>1.2.76</fastjson.version> <!-- fastjson -->
<mybatis.plus.starter.version>3.4.2</mybatis.plus.starter.version> <!-- mybatis plus --> <mybatis.plus.starter.version>3.4.2</mybatis.plus.starter.version> <!-- mybatis plus -->
<hutool.util.version>5.6.6</hutool.util.version> <!-- hutool --> <hutool.util.version>5.6.6</hutool.util.version> <!-- hutool -->
<spring.security.version>5.4.6</spring.security.version> <!-- 用于core的scope依赖 --> <spring.security.version>5.4.7</spring.security.version> <!-- 用于core的scope依赖 -->
<jjwt.version>0.9.1</jjwt.version> <jjwt.version>0.9.1</jjwt.version>
<binarywang.weixin.java.version>4.1.0</binarywang.weixin.java.version> <binarywang.weixin.java.version>4.1.0</binarywang.weixin.java.version>
<rocketmq.spring.boot.starter.version>2.0.3</rocketmq.spring.boot.starter.version> <rocketmq.spring.boot.starter.version>2.0.3</rocketmq.spring.boot.starter.version>
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment