update 支付宝小程序

This commit is contained in:
Guoqs
2024-06-17 15:08:13 +08:00
parent 22d9d15507
commit 8bde6e1eb7
10 changed files with 153 additions and 8 deletions

View File

@@ -166,8 +166,13 @@ public class OrderService {
* @return
*/
public String generateOrderV2(GenerateOrderDTO dto) throws ParseException {
String delayMode = null;
if (StringUtils.equals(dto.getRequestSource(), AdapayPayChannelEnum.WX_LITE.getValue())) {
delayMode = pileMerchantInfoService.getDelayModeByWechatAppId(dto.getAppId());
} else if (StringUtils.equals(dto.getRequestSource(), AdapayPayChannelEnum.ALIPAY_LITE.getValue())) {
delayMode = pileMerchantInfoService.getDelayModeByAlipayAppId(dto.getAppId());
}
// 新逻辑
String delayMode = pileMerchantInfoService.getDelayModeByWechatAppId(dto.getAppId());
AbstractProgramLogic orderLogic = ProgramLogicFactory.getProgramLogic(delayMode);
OrderBasicInfo orderBasicInfo = orderLogic.generateOrder(dto);
if (orderBasicInfo != null) {

View File

@@ -171,12 +171,14 @@ adapay:
rsaPrivateKey: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAOl7qJyrkrks7FKnBPr/Sngub897Ni5Bkn5pEa81zfs+4LrYsuWZQ8G1n7Q8/rjH4G/T7vPX+So41vNU74Sqn6E1b3BpW+wWBULhs9p1JSPT7Kzima4FmPigUr80NLrlVKn5bW+V4/odpN+bJWvpxdd024edHAD8mXX1M1N1lU5ZAgMBAAECgYA+mxbiM6tbFe2kV/6g4vVv9luq0cn8az7BwKCqT44U8Y5G67ZElG0zsuTI6pYOrCHFOpnXLrE0HhudEchL1YiJqW/SDKaoC4oDZf5nybhh11kOR3N5maLqvUz/WxdNy17th/2XxqVfTTu752X9yeeoXDj89N5OxyMl0jmxlhWbgQJBAPeoitR7FCxcjKtcKsEyrtV3T0H2WtQ2Pbku7CGe6VCtL4+DJNeUentn7plBj4IhbH3EwNmyCYzNlfp0X2d8fWkCQQDxWONjt1vV/dyKQYRvSVw/SWQWlR7g2OnHZokU2SNeewiCX2umCdYKh0doN0JHbSTLOGG5IA3+6Vxam+9hzPtxAkEAjr+QHf8/Vn6V+mOqpSdgjNwzS/MC0ZTeKPI52vsswnrAkjjmMHh9zMnQRnf6juhTD38sJY6wYH9TdkRDhXPFGQJATiFYe4+AS2ZDXv6WwPAezN4VaLodpOyTwdmPxxAEQzHRL2N0levZPs9MbpB1BGpw3tkBycx2u28QVsTkWeTiAQJAGRsAVr6Rhhdaq2vTjt9orhMVwt6BCoSQ0zzHSYilv4PMOtSu1Pyt4K8BDv3gjEyAi1GtE7kkJ0dcbsvOGiLzqQ==
appId: app_d0c80cb1-ffc8-48cb-a030-fe9bec823aaa
wechatAppId: wxbb3e0d474569481d
alipayAppId: 2021004145642756
xixiao:
apiKey: api_live_8690aad5-18df-4c94-ba8c-4f9499721c65
mockApiKey: api_test_a2944395-e6ba-4d59-969a-f629b7a9e53e
rsaPrivateKey: MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJ608yEkr5Fxj3ID9fIzavuwW/orgjlD1SIrmZVTwLFzM+ljnr/iFMRRhjJZZGImO+ySj296N+VPujHiiQZqymgIACdORs3YyRvxOeWQoPKiik21mOiF7RRw2GIOQEzqo0MKeJ/qdK89FvwnAIZKRXl+ccH/VTTr68VGWuiLWEK3AgMBAAECgYACsMCaZDvRtGIhJa4KsBJ1N9UnVYt8mwjG7oRJAsV2fKR5pWWwjQ2bEmK7Acbw3wMPDKD/28uMyKA4bkWyZScPO5T2Mhvo28AVOfdsbBht70iKzBAXuqHhHd99+AEmQL9ZcoCYCvoP2JqV8cHp5sXGEvncm9VRsjs3iSTsBYu0WQJBANB6x0DCPnAFXYnKvtBcBmF4jU8pO0iIGtx/ZR/N0pRTbL7cIvh+z6ZqtWo880Xbcli6i1qwZl1ctWwV0yKArOsCQQDC4dN6e8/Gj3FubXLmyLfIrbq7BuHW8kg19t0/wmAXunpkBtFhAA2FD7FYGg+/l6/f6YqWX8nSUr6pFZQI0Z5lAkARvBANIzj6gIpXeWbIBLwKOJ4UuNYxMlrOnQu2K+UY9wvOJJ3Y87ioWHV8RxkOvT856wyFt3HNyWAphKXETpvnAkEAnIjJ1ktW9FXJtfph3bABt0acg5eelYmcqQP2aT1W9BhMMMYtLi3drjCRsYOVfL55fXBYajrcoHzoOmZjtsWw5QJBAM/Wpk6L7BLVi357icleuivPtKsP04Ix5afUpgiFmssEheiLAxr+Zs5/nk/HM6V4Pk8kA0ILaNbRqjfAF5ZnAvk=
appId: app_7848ccb2-f7e7-4841-a968-fbf02cc265ad
wechatAppId: wx20abc5210391649c
alipayAppId: wx20abc5210391649c # 待修改为真正的支付宝小程序id
#高德地图相关配置

View File

@@ -35,9 +35,14 @@ public class JsowellAdapayConfig extends AbstractAdapayConfig {
@Value("${adapay.jsowell.wechatAppId}")
private String wechatAppId;
@Value("${adapay.jsowell.alipayAppId}")
private String alipayAppId;
@Override
public void afterPropertiesSet() throws Exception {
// key为微信小程序id
AdapayConfigFactory.register(wechatAppId, this);
// key为支付宝小程序id
AdapayConfigFactory.register(alipayAppId, this);
}
}

View File

@@ -84,9 +84,9 @@ public class AdapayService {
private MemberBasicInfoService memberBasicInfoService;
/**
* 获取支付参数
* 获取支付参数-微信支付
*/
public Map<String, Object> createPayment(PayOrderDTO dto) {
public Map<String, Object> createPaymentForWechat(PayOrderDTO dto) {
// log.info("===============使用汇付支付-获取支付参数");
// 相同参数重复请求,返回同一个支付对象
String redisKey = CacheConstants.ADAPAY_ORDER_PARAM + dto.getOrderCode();
@@ -173,6 +173,97 @@ public class AdapayService {
return resultMap;
}
/**
* 获取支付参数-支付宝支付
*/
public Map<String, Object> createPaymentForAlipay(PayOrderDTO dto) {
// log.info("===============使用汇付支付-获取支付参数");
// 相同参数重复请求,返回同一个支付对象
String redisKey = CacheConstants.ADAPAY_ORDER_PARAM + dto.getOrderCode();
Map<String, Object> resultMap = redisCache.getCacheObject(redisKey);
if (resultMap != null) {
// 表示已经获取到支付参数了,后续再有支付请求就拒绝
return resultMap;
}
// 获取支付配置
AbstractAdapayConfig config = AdapayConfigFactory.getConfig(dto.getAlipayAppId());
if (config == null) {
throw new BusinessException(ReturnCodeEnum.CODE_ADAPAY_CONFIG_IS_NULL_ERROR);
}
// 获取openId
MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMemberId(dto.getMemberId());
if (memberBasicInfo == null) {
throw new BusinessException(ReturnCodeEnum.CODE_GET_OPEN_ID_BY_CODE_ERROR);
}
String openId = memberBasicInfo.getOpenId();
// 支付场景
String type = dto.getType();
// 封装对象
String amount = AdapayUtil.formatAmount(dto.getPayAmount()); // 用户支付金额
String delayMode = pileMerchantInfoService.getDelayModeByWechatAppId(dto.getWechatAppId());
String payMode = MerchantDelayModeEnum.getAdapayPayMode(delayMode);
CreateAdaPaymentParam createAdaPaymentParam = new CreateAdaPaymentParam();
// 请求订单号, 防止请求订单号重复,结尾拼接时间
String orderNo = dto.getOrderCode() + "_" + DateUtils.dateTimeNow();
createAdaPaymentParam.setOrder_no(orderNo);
createAdaPaymentParam.setPay_amt(amount);
createAdaPaymentParam.setApp_id(config.getAdapayAppId());
// 2024年6月13日11点55分需要兼容支付宝小程序首先判断请求来源如为空默认微信小程序
String payChannel = StringUtils.isNotBlank(dto.getRequestSource())
? dto.getRequestSource()
: AdapayPayChannelEnum.WX_LITE.getValue();
createAdaPaymentParam.setPay_channel(payChannel);
createAdaPaymentParam.setGoods_title(dto.getGoodsTitle());
createAdaPaymentParam.setGoods_desc(dto.getGoodsDesc()); // 这个字段是微信支付凭证的商品名
Map<String, String> map = Maps.newHashMap();
map.put("type", type);
map.put("orderCode", dto.getOrderCode());
map.put("payMode", payMode);
map.put("memberId", dto.getMemberId());
createAdaPaymentParam.setDescription(JSON.toJSONString(map));
// 异步通知地址url为http/https路径服务器POST回调URL 上请勿附带参数
createAdaPaymentParam.setNotify_url(ADAPAY_CALLBACK_URL);
// alipay_lite参数 buyer_id String(100) Y 买家的支付宝用户 id
createAdaPaymentParam.setExpend(JSON.toJSONString(ImmutableMap.of("buyer_id", openId)));
// 延时分账
if (StringUtils.isNotBlank(payMode)) {
createAdaPaymentParam.setPay_mode(payMode);
}
try {
Map<String, Object> response = Payment.create(BeanMap.create(createAdaPaymentParam), config.getWechatAppId());
log.info("创建汇付支付参数:{}, response:{}", JSON.toJSONString(createAdaPaymentParam), JSON.toJSONString(response));
if (response != null && !response.isEmpty()) {
String status = (String) response.get("status");
if (!StringUtils.equals(status, AdapayStatusEnum.SUCCEEDED.getValue())) {
String error_msg = (String) response.get("error_msg");
throw new BusinessException(ReturnCodeEnum.CODE_GET_WECHAT_PAY_PARAMETER_ERROR.getValue(), error_msg);
}
JSONObject expend = JSONObject.parseObject(response.get("expend").toString());
JSONObject pay_info = expend.getJSONObject("pay_info");
resultMap = JSONObject.parseObject(pay_info.toJSONString(), new TypeReference<Map<String, Object>>() {});
}
} catch (BaseAdaPayException e) {
log.error("汇付-获取支付对象发生异常, orderCode:{}", dto.getOrderCode(), e);
}
// 放缓存
if (resultMap != null) {
// 请求参数放入缓存15分钟以内返回同一个支付参数
redisCache.setCacheObject(redisKey, resultMap, 15, TimeUnit.MINUTES);
// 请求订单号放redis
redisCache.setCacheObject(CacheConstants.ORDER_WECHAT_PAY_PARAMETERS + dto.getOrderCode(), orderNo, CacheConstants.cache_expire_time_10d);
}
return resultMap;
}
/**
* 创建结算账户
*

View File

@@ -66,6 +66,11 @@ public class PayOrderDTO extends BaseDTO{
*/
private String wechatAppId;
/**
* 支付宝小程序appId
*/
private String alipayAppId;
/**
* 商品标题
*/

View File

@@ -140,6 +140,8 @@ public interface PileMerchantInfoService {
*/
String getDelayModeByWechatAppId(String wechatAppId);
String getDelayModeByAlipayAppId(String alipayAppId);
/**
* 通过运营商id查询一级运营商配置的delayMode
* @param merchantId 运营商id

View File

@@ -578,7 +578,7 @@ public class OrderPileOccupyServiceImpl implements OrderPileOccupyService {
dto.setGoodsTitle("占桩费用");
dto.setGoodsDesc("占桩订单金额");
dto.setType(ScenarioEnum.OCCUPY.getValue());
Map<String, Object> weixinMap = adapayService.createPayment(dto);
Map<String, Object> weixinMap = adapayService.createPaymentForWechat(dto);
resultMap.put("weixinMap", weixinMap);
} else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue())) { // 白名单支付
whiteListPayOccupyPileOrder(dto);

View File

@@ -514,6 +514,20 @@ public class PileMerchantInfoServiceImpl implements PileMerchantInfoService {
return merchant.getDelayMode();
}
/**
* 通过wechatAppId查询一级运营商的延时支付模式配置
* @param alipayAppId 微信小程序id
* @return 延时分账模式0-不延时1-延时分账)
*/
@Override
public String getDelayModeByAlipayAppId(String alipayAppId) {
PileMerchantInfo merchant = getFirstLevelMerchantByAlipayAppId(alipayAppId);
if (merchant == null) {
throw new BusinessException(ReturnCodeEnum.CODE_GET_FIRST_LEVEL_MERCHANT_BY_APP_ID);
}
return merchant.getDelayMode();
}
/**
* 通过运营商id查询一级运营商配置的delayMode
* @param merchantId

View File

@@ -102,10 +102,25 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic {
dto.setGoodsTitle(goodsTitle);
dto.setGoodsDesc(goodsDesc);
dto.setType(ScenarioEnum.ORDER.getValue());
Map<String, Object> weixinMap = onlinePaymentOrder(dto);
Map<String, Object> weixinMap = onlinePaymentOrderForWechat(dto);
// 返回微信支付参数
resultMap.put("weixinMap", weixinMap);
} else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_ALIPAY.getValue())) {
// 2023-07-11 全部改为汇付支付
String goodsTitle = "充电费用";
String goodsDesc = "充电桩预付款金额";
if (StringUtils.equals(orderInfo.getPayStatus(), OrderPayStatusEnum.repay.getValue())) {
goodsTitle = "补缴费用";
goodsDesc = dto.getOrderCode() + "订单补缴金额";
}
dto.setGoodsTitle(goodsTitle);
dto.setGoodsDesc(goodsDesc);
dto.setType(ScenarioEnum.ORDER.getValue());
Map<String, Object> weixinMap = onlinePaymentOrderForWechat(dto);
// 返回微信支付参数
resultMap.put("alipayMap", weixinMap);
} else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue())) { // 白名单支付
// 白名单支付可以直接调支付回调方法
dto.setPayAmount(Constants.WHITELIST_DEFAULT_AMOUNT);
@@ -319,12 +334,18 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic {
/**
* 在线支付订单
*/
public Map<String, Object> onlinePaymentOrder(PayOrderDTO dto) {
public Map<String, Object> onlinePaymentOrderForWechat(PayOrderDTO dto) {
logger.info("【{}】-在线支付订单start, param:{}", this.getClass().getSimpleName(), JSON.toJSONString(dto));
Map<String, Object> weixinMap = adapayService.createPayment(dto);
Map<String, Object> weixinMap = adapayService.createPaymentForWechat(dto);
return weixinMap;
}
public Map<String, Object> onlinePaymentOrderForAlipay(PayOrderDTO dto) {
logger.info("【{}】-在线支付订单start, param:{}", this.getClass().getSimpleName(), JSON.toJSONString(dto));
Map<String, Object> alipayMap = adapayService.createPaymentForAlipay(dto);
return alipayMap;
}
/**
* 白名单支付订单
*/

View File

@@ -212,7 +212,7 @@ public class NotDelayMerchantProgramLogic extends AbstractProgramLogic {
*/
public Map<String, Object> onlinePaymentOrder(PayOrderDTO dto) {
logger.info("【{}】-在线支付订单start, param:{}", this.getClass().getSimpleName(), JSON.toJSONString(dto));
Map<String, Object> weixinMap = adapayService.createPayment(dto);
Map<String, Object> weixinMap = adapayService.createPaymentForWechat(dto);
return weixinMap;
}