feat:支付宝支付

This commit is contained in:
dzc committed 2026-05-08 17:21:15 +08:00
1 parent 4d3376067c
commit a16f5de2df
26 files changed
+439 -274

No files matched your search

+4 -1
View File
@@ -1,4 +1,7 @@
MYSQL_HOST=123.157.250.162
MYSQL_PORT=28815
MYSQL_USER=root@sys
MYSQL_PWD=bsd.1799
MYSQL_PWD=bsd.1799
SERVICE_MYSQL_USER=jhkjx
SERVICE_MYSQL_PWD=LrM8Sza8DF77cESJ
@@ -13,7 +13,7 @@ import java.util.Arrays;
@Getter
public enum AppPlusPlatformTypeEnum {
WECHAT("10", "微信小程序"),
WECHAT("10", "微信"),
ALI_PAY("20", "支付宝"),
;
@@ -9,6 +9,8 @@ import lombok.Data;
@Data
public class ThirdAppPlusPayDto {
private Long mchId;
/**
* 子商户id
*/
@@ -1,21 +0,0 @@
package com.bsd.pjcloud.thirdparty.dto.appplus.pay.wechat;
import lombok.Data;
/**
* 查询订单入参
*/
@Data
public class ThirdMiniWechatQueryDto {
/**
* 微信订单号
*/
private String wechantOrderId;
/**
* 商户订单号
*/
private String orderId;
}
@@ -1,16 +0,0 @@
package com.bsd.pjcloud.thirdparty.dto.appplus.pay.wechat;
import lombok.Data;
/**
* 微信退款查询入参
*/
@Data
public class ThirdMiniWechatRefundQueryDto {
/**
* 退款id
*/
private String refundId;
}
@@ -54,6 +54,18 @@ public class ThirdPayOrderEntity extends Model<ThirdPayOrderEntity> {
@Schema(description = "用户id")
private Long userId;
/**
* 支付到账商户id
*/
@Schema(description = "支付到账商户id")
private Long mchId;
/**
* 商户支付配置
*/
@Schema(description = "商户支付配置")
private String mchPaySettingJson;
/**
* 用户code
*/
@@ -3,10 +3,13 @@ package com.bsd.pjcloud.thirdparty.vo.appplus.pay;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
public class ThirdMiniAppPayVo {
private HashMap<String, Object> appPlusPayParams;
private String payNo;
private Map<String, Object> appPlusPayParams;
}
@@ -13,6 +13,8 @@ import java.time.LocalDateTime;
@Data
public class ThirdALiPayCallbackVo {
private String msg_method;
/**
* 通知时间。通知的发送时间。格式为 yyyy-MM-dd HH:mm:ss。
*/
@@ -39,7 +39,7 @@ public class ThirdMiniJsapiPayVo {
private String code_url;
private HashMap<String, Object> miniAppPayParams;
private HashMap<String, Object> appPayParams;
public boolean isHttpSucess() {
return ObjectUtil.equals(ThirdMiniWechatQueryVo.SUCCESS, return_code);
@@ -1,140 +0,0 @@
package com.bsd.pjcloud.thirdparty.vo.appplus.pay.wechat;
import cn.hutool.core.util.ObjectUtil;
import lombok.Data;
/**
* 查询订单返回
*/
@Data
public class ThirdMiniWechatQueryVo {
public static final String SUCCESS = "SUCCESS";
private String return_code;
private String return_msg;
private String appid;
private String mch_id;
private String nonce_str;
private String sign;
private String result_code;
private String err_code;
private String err_code_des;
private String device_info;
/**
* 用户标识
*/
private String openid;
/**
* 是否关注公众账号
*/
private String is_subscribe;
/**
* 交易类型
*/
private String trade_type;
/**
* 交易状态
*/
private String trade_state;
/**
* 付款银行
*/
private String bank_type;
/**
* 标价金额
*/
private String total_fee;
/**
* 应结订单金额
*/
private String settlement_total_fee;
/**
* 标价币种
*/
private String fee_type;
/**
* 现金支付金额
*/
private String cash_fee;
/**
* 现金支付币种
*/
private String cash_fee_type;
/**
* 代金券金额
*/
private String coupon_fee;
/**
* 代金券使用数量
*/
private String coupon_count;
/**
* 微信支付订单号
*/
private String transaction_id;
/**
* 商户订单号
*/
private String out_trade_no;
/**
* 附加数据
*/
private String attach;
/**
* 支付完成时间
*/
private String time_end;
/**
* 交易状态描述
*/
private String trade_state_desc;
public boolean isHttpSucess() {
return ObjectUtil.equals(ThirdMiniWechatQueryVo.SUCCESS, return_code);
}
public boolean isPaySucess() {
return ObjectUtil.equals(ThirdMiniWechatQueryVo.SUCCESS, result_code);
}
public static String wechantError() {
return "<xml>" +
"<return_code><![CDATA[FAIL]]></return_code>" +
"<return_msg><![CDATA[FAIL]]></return_msg>" +
"</xml>";
}
public static String wechantSuccess() {
return "<xml>" +
" <return_code><![CDATA[SUCCESS]]></return_code>" +
" <return_msg><![CDATA[OK]]></return_msg>\n" +
"</xml>";
}
}
@@ -6,6 +6,8 @@ import lombok.Data;
@Data
public class ThirdPayOrderVo extends ThirdPayOrderEntity {
private String mchName;
private String username;
private String userPhone;
@@ -61,6 +61,11 @@ public class AppPlusPayConfig {
*/
private String merchantSerialNumber;
/**
* 回调基础地址
*/
private String baseCallbackUrl;
/**
* 支付成功的回调
*/
@@ -8,10 +8,14 @@ import com.bsd.pjcloud.thirdparty.config.AppPlusPayConfig;
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.core.RSAPublicKeyConfig;
import com.wechat.pay.java.core.notification.NotificationConfig;
import com.wechat.pay.java.core.notification.NotificationParser;
import com.wechat.pay.java.core.notification.RSAPublicKeyNotificationConfig;
import com.wechat.pay.java.service.partnerpayments.app.AppService;
import com.wechat.pay.java.service.partnerpayments.app.AppServiceExtension;
import com.wechat.pay.java.service.partnerpayments.jsapi.JsapiServiceExtension;
import com.wechat.pay.java.service.partnerpayments.nativepay.NativePayService;
import com.wechat.pay.java.service.refund.RefundService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
@@ -55,4 +59,28 @@ public class WechatConfiguration {
return new AppServiceExtension.Builder().config(config).build();
}
@Bean
public NotificationParser notificationParser() {
AppPlusPayConfig.WechatConfig wechatConfig = properties.getWechatConfig();
NotificationConfig config = new RSAAutoCertificateConfig.Builder()
.merchantId(wechatConfig.getMerchantId())
.privateKeyFromPath(wechatConfig.getMchPrivatePath())
.merchantSerialNumber(wechatConfig.getMerchantSerialNumber())
.apiV3Key(wechatConfig.getApiV3Key())
.build();
return new NotificationParser(config);
}
@Bean
public RefundService refundService() {
AppPlusPayConfig.WechatConfig wechatConfig = properties.getWechatConfig();
Config config = new RSAAutoCertificateConfig.Builder()
.merchantId(wechatConfig.getMerchantId())
.privateKeyFromPath(wechatConfig.getMchPrivatePath())
.merchantSerialNumber(wechatConfig.getMerchantSerialNumber())
.apiV3Key(wechatConfig.getApiV3Key())
.build();
return new RefundService.Builder().config(config).build();
}
}
@@ -8,6 +8,7 @@ import com.bsd.pjcloud.thirdparty.dto.appplus.ThirdMiniAppPayDto;
import com.bsd.pjcloud.thirdparty.dto.appplus.pay.wechat.ThirdMiniWechatRefundDto;
import com.bsd.pjcloud.thirdparty.service.ThirdAppPlusService;
import com.bsd.pjcloud.thirdparty.vo.appplus.pay.ThirdMiniAppPayVo;
import com.bsd.pjcloud.thirdparty.vo.pay.ThirdPayOrderVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -40,6 +41,13 @@ public class ThirdMinAppPayCotroller {
/* ************************************* start app start ************************************* */
@Operation(summary = "查询支付订单")
@GetMapping("/app/get-by-pay-no")
public R<ThirdPayOrderVo> getByPayNo(@RequestParam String payNo) {
PjcloudUser user = SecurityUtils.getUser();
return R.ok(thirdMiniAppService.getByPayNo(user.getId(), payNo));
}
@Operation(summary = "支付")
@PostMapping("/app/pay")
public R<ThirdMiniAppPayVo> miniPay(@Validated @RequestBody ThirdMiniAppPayDto dto) {
@@ -1,18 +1,26 @@
package com.bsd.pjcloud.thirdparty.service;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.bsd.pjcloud.thirdparty.dto.appplus.pay.wechat.ThirdAppPlusPayDto;
import com.bsd.pjcloud.thirdparty.dto.appplus.pay.wechat.ThirdMiniWechatRefundDto;
import com.bsd.pjcloud.thirdparty.entity.pay.ThirdPayOrderEntity;
import com.bsd.pjcloud.thirdparty.vo.appplus.pay.alipay.ThirdALiPayCallbackVo;
import com.bsd.pjcloud.wallet.api.vo.mch.MchPaySettingVo;
import java.util.Map;
public interface ThirdAppPlusAliPayService {
/**
* 查询订单
*/
AlipayTradeQueryResponse query(String payNo, String settingJson);
/**
* app支付
*/
String appPay(ThirdAppPlusPayDto dto);
String appPay(ThirdAppPlusPayDto dto, MchPaySettingVo paySetting);
/**
* 退款
@@ -28,4 +36,9 @@ public interface ThirdAppPlusAliPayService {
* 退款回调
*/
ThirdPayOrderEntity refundCallback(Map<String, String> params, String body, Map<String, String> headers);
/**
* 支付消息订阅
*/
ThirdALiPayCallbackVo miniSubscribeCallback(Map<String, String> params, String body, Map<String, String> headers);
}
@@ -6,6 +6,7 @@ import com.bsd.pjcloud.thirdparty.dto.appplus.ThirdMiniAppPayDto;
import com.bsd.pjcloud.thirdparty.dto.appplus.pay.wechat.ThirdMiniWechatRefundDto;
import com.bsd.pjcloud.thirdparty.vo.appplus.ThirdMinAppOAth2LoginVo;
import com.bsd.pjcloud.thirdparty.vo.appplus.pay.ThirdMiniAppPayVo;
import com.bsd.pjcloud.thirdparty.vo.pay.ThirdPayOrderVo;
import java.util.Map;
@@ -21,6 +22,11 @@ public interface ThirdAppPlusService {
*/
String getUniqueCode(ThirdMiniAppGetUniqueDto dto);
/**
* 查询支付订单
*/
ThirdPayOrderVo getByPayNo(Long userId, String payNo);
/**
* 小程序支付
*/
@@ -5,6 +5,9 @@ import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import com.bsd.pjcloud.thirdparty.dto.appplus.pay.wechat.*;
import com.bsd.pjcloud.thirdparty.entity.pay.ThirdPayOrderEntity;
import com.bsd.pjcloud.thirdparty.vo.appplus.pay.wechat.*;
import com.bsd.pjcloud.wallet.api.vo.mch.MchPaySettingVo;
import com.wechat.pay.java.service.partnerpayments.app.model.Transaction;
import com.wechat.pay.java.service.refund.model.RefundNotification;
import org.springframework.web.bind.annotation.RequestHeader;
import java.util.Map;
@@ -14,7 +17,7 @@ public interface ThirdAppPlusWechatService {
/**
* APP支付
*/
ThirdMiniJsapiPayVo appPay(ThirdAppPlusPayDto dto);
Map<String, Object> appPay(ThirdAppPlusPayDto dto, MchPaySettingVo setting);
/**
* 获取openId
@@ -29,7 +32,7 @@ public interface ThirdAppPlusWechatService {
/**
* 查询订单
*/
ThirdMiniWechatQueryVo query(ThirdMiniWechatQueryDto dto);
Transaction query(String payNo, String settingJson);
/**
* 撤销订单
@@ -39,21 +42,30 @@ public interface ThirdAppPlusWechatService {
/**
* 申请退款
*/
ThirdMiniWechatRefundVo refund(ThirdPayOrderEntity thirdPayOrder, ThirdMiniWechatRefundDto dto);
ThirdPayOrderEntity refund(ThirdPayOrderEntity thirdPayOrder, ThirdMiniWechatRefundDto dto);
/**
* 查询退款
*/
ThirdMiniWechatRefundQueryVo refundQuery(ThirdMiniWechatRefundQueryDto dto);
ThirdMiniWechatRefundQueryVo refundQuery(String payNo);
/**
* 支付的回调通知
*/
ThirdPayOrderEntity payCallback(String body, @RequestHeader Map<String, String> headers);
/**
* 解析支付的回调
*/
Transaction pasePayCallback(String body, Map<String, String> headers);
/**
* 退款回调
*/
ThirdPayOrderEntity refundCallback(String body, @RequestHeader Map<String, String> headers);
/**
* 解析退款的回调
*/
RefundNotification paseRefundCallback(String body, Map<String, String> headers);
}
@@ -1,5 +1,6 @@
package com.bsd.pjcloud.thirdparty.service.impl.appplus;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.ObjectUtil;
@@ -9,11 +10,15 @@ import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.domain.AlipayTradeQueryModel;
import com.alipay.api.domain.AlipayTradeRefundModel;
import com.alipay.api.domain.ExtendParams;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.bsd.pjcloud.thirdparty.config.AppPlusPayConfig;
import com.bsd.pjcloud.thirdparty.constant.miniplatform.AppPlusPlatformTypeEnum;
@@ -24,6 +29,8 @@ import com.bsd.pjcloud.thirdparty.entity.pay.ThirdPayOrderEntity;
import com.bsd.pjcloud.thirdparty.service.ThirdAppPlusAliPayService;
import com.bsd.pjcloud.thirdparty.service.ThirdPayOrderService;
import com.bsd.pjcloud.thirdparty.vo.appplus.pay.alipay.ThirdALiPayCallbackVo;
import com.bsd.pjcloud.wallet.api.entity.mch.MchPaySettingEntity;
import com.bsd.pjcloud.wallet.api.vo.mch.MchPaySettingVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -32,6 +39,7 @@ import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
@@ -83,14 +91,37 @@ public class ThirdAppPlusAliPayServiceImpl implements ThirdAppPlusAliPayService
return fen.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString();
}
/**
* 查询订单
*/
@Override
public AlipayTradeQueryResponse query(String payNo, String settingJson) {
MchPaySettingEntity mchPaySettingEntity = JSONUtil.toBean(settingJson, MchPaySettingEntity.class);
MchPaySettingEntity.AliPaySetting aliPaySetting = JSONUtil.toBean(mchPaySettingEntity.getSettingJson(), MchPaySettingEntity.AliPaySetting.class);
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
AlipayTradeQueryModel model = new AlipayTradeQueryModel();
model.setOutTradeNo(payNo);
request.setBizModel(model);
request.putOtherTextParam("app_auth_token", aliPaySetting.getAppAuthToken());
try {
return getAlipayClient().execute(request);
} catch (Exception e) {
e.printStackTrace();
log.error("|{}|查询订单失败error:{}", TAG, e.getMessage());
}
return null;
}
/**
* app支付
*/
public String appPay(ThirdAppPlusPayDto dto) {
public String appPay(ThirdAppPlusPayDto dto, MchPaySettingVo setting) {
AppPlusPayConfig.AliPayConfig aliPayConfig = appPlusPayConfig.getAliPayConfig();
LocalDateTime now = LocalDateTime.now();
MchPaySettingEntity.AliPaySetting aliPaySetting = JSONUtil.toBean(setting.getSettingJson(), MchPaySettingEntity.AliPaySetting.class);
ThirdPayOrderEntity payOrder = new ThirdPayOrderEntity();
payOrder.setPayPlatformType(AppPlusPlatformTypeEnum.ALI_PAY.getType());
payOrder.setBizId(dto.getBizId());
@@ -100,6 +131,8 @@ public class ThirdAppPlusAliPayServiceImpl implements ThirdAppPlusAliPayService
payOrder.setPrice(dto.getAmount());
payOrder.setStatus(ThirdPayOrderStatusEnum.PAY_UNPAID.getType());
payOrder.setPayNo(dto.getOutTradeNo());
payOrder.setMchId(dto.getMchId());
payOrder.setMchPaySettingJson(JSONUtil.toJsonStr(setting));
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
request.setNotifyUrl(aliPayConfig.getBaseCallbackUrl() + aliPayConfig.getPayCallbackUrl());
@@ -110,13 +143,11 @@ public class ThirdAppPlusAliPayServiceImpl implements ThirdAppPlusAliPayService
model.setSubject("资安信");
// 超时时间15分钟
model.setTimeExpire(LocalDateTimeUtil.format(now.plusMinutes(15), DatePattern.NORM_DATETIME_PATTERN));
// 设置子商户号
ExtendParams extendParams = new ExtendParams();
extendParams.setSysServiceProviderId(dto.getSubMchid());
model.setExtendParams(extendParams);
payOrder.setPayRep(JSONUtil.toJsonStr(model));
request.setBizModel(model);
request.putOtherTextParam("app_auth_token", aliPaySetting.getAppAuthToken());
request.setNotifyUrl(aliPayConfig.getBaseCallbackUrl() + aliPayConfig.getPayCallbackUrl());
try {
AlipayTradeAppPayResponse response = getAlipayClient().sdkExecute(request);
String orderStr = response.getBody();
@@ -141,6 +172,9 @@ public class ThirdAppPlusAliPayServiceImpl implements ThirdAppPlusAliPayService
AppPlusPayConfig.AliPayConfig aliPayConfig = appPlusPayConfig.getAliPayConfig();
String refundNo = "refund_" + thirdPayOrder.getPayNo();
MchPaySettingEntity mchPaySettingEntity = JSONUtil.toBean(thirdPayOrder.getMchPaySettingJson(), MchPaySettingEntity.class);
MchPaySettingEntity.AliPaySetting aliPaySetting = JSONUtil.toBean(mchPaySettingEntity.getSettingJson(), MchPaySettingEntity.AliPaySetting.class);
Integer refundFee = dto.getRefundPrice();
if (ObjectUtil.isEmpty(refundFee)) {
refundFee = thirdPayOrder.getPrice();
@@ -158,9 +192,12 @@ public class ThirdAppPlusAliPayServiceImpl implements ThirdAppPlusAliPayService
model.setRefundAmount(fenToYuan(BigDecimal.valueOf(refundFee)));
model.setRefundReason("饭卡充值退款");
model.setOutRequestNo(refundNo);
model.setQueryOptions(List.of("deposit_back_info"));
updateObj.setRefundRep(JSONUtil.toJsonStr(model));
request.setBizModel(model);
request.putOtherTextParam("app_auth_token", aliPaySetting.getAppAuthToken());
request.setNotifyUrl(aliPayConfig.getBaseCallbackUrl() + aliPayConfig.getRefundCallbackUrl());
try {
AlipayTradeRefundResponse response = getAlipayClient().execute(request);
boolean success = response.isSuccess();
@@ -232,12 +269,12 @@ public class ThirdAppPlusAliPayServiceImpl implements ThirdAppPlusAliPayService
// 查询订单
ThirdPayOrderEntity payOrderEntity = thirdPayOrderService.getByPayNo(vo.getOut_trade_no());
if (ObjectUtil.isEmpty(payOrderEntity)) {
log.error("|{}|refundCallback,意外的错误,订单不存在,微信返回json|{}|", TAG, JSONUtil.toJsonStr(vo));
log.error("|{}|refundCallback,意外的错误,订单不存在,支付宝返回json|{}|", TAG, JSONUtil.toJsonStr(vo));
return null;
}
// 重复的回调
if (ObjectUtil.notEqual(payOrderEntity.getStatus(), ThirdPayOrderStatusEnum.REFUNDING.getType())) {
log.error("|{}|refundCallback,意外的错误,重复的回调,微信返回json|{}|", TAG, JSONUtil.toJsonStr(vo));
log.error("|{}|refundCallback,意外的错误,重复的回调,支付宝返回json|{}|", TAG, JSONUtil.toJsonStr(vo));
return null;
}
// 更新订单状态
@@ -249,6 +286,24 @@ public class ThirdAppPlusAliPayServiceImpl implements ThirdAppPlusAliPayService
return thirdPayOrderService.getById(payOrderEntity.getId());
}
/**
* 支付消息订阅
*/
@Override
public ThirdALiPayCallbackVo miniSubscribeCallback(Map<String, String> params, String body, Map<String, String> headers) {
try {
boolean flag = AlipaySignature.rsaCheckV1(params, appPlusPayConfig.getAliPayConfig().getAlipayPublicKey(), "UTF-8", "RSA2");
if (!flag) return null;
String bizContent = params.get("biz_content");
String msgMethod = params.get("msg_method");
ThirdALiPayCallbackVo vo = BeanUtil.toBean(bizContent, ThirdALiPayCallbackVo.class);
vo.setMsg_method(msgMethod);
} catch (Exception e) {
return null;
}
return null;
}
private String getTradeNo(ThirdPayOrderEntity payOrder) {
if (ObjectUtil.isEmpty(payOrder)) {
return null;
@@ -1,11 +1,13 @@
package com.bsd.pjcloud.thirdparty.service.impl.appplus;
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.XmlUtil;
import cn.hutool.json.JSONUtil;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.bsd.pjcloud.admin.api.dto.UserInfo;
import com.bsd.pjcloud.admin.api.dto.UserTokenDTO;
import com.bsd.pjcloud.admin.api.feign.RemoteTokenService;
@@ -32,6 +34,7 @@ import com.bsd.pjcloud.thirdparty.vo.appplus.ThirdMinAppOAth2LoginVo;
import com.bsd.pjcloud.thirdparty.vo.appplus.pay.ThirdMiniAppPayVo;
import com.bsd.pjcloud.thirdparty.vo.appplus.pay.alipay.ThirdALiPayCallbackVo;
import com.bsd.pjcloud.thirdparty.vo.appplus.pay.wechat.*;
import com.bsd.pjcloud.thirdparty.vo.pay.ThirdPayOrderVo;
import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargePaySuccess;
import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeRefundSuccess;
import com.bsd.pjcloud.wallet.api.entity.mch.MchPaySettingEntity;
@@ -40,6 +43,8 @@ import com.bsd.pjcloud.wallet.api.feign.RemoteMchService;
import com.bsd.pjcloud.wallet.api.feign.RemoteWalletRechargePackageService;
import com.bsd.pjcloud.wallet.api.vo.MchManageVo;
import com.bsd.pjcloud.wallet.api.vo.mch.MchPaySettingVo;
import com.wechat.pay.java.service.partnerpayments.app.model.Transaction;
import com.wechat.pay.java.service.refund.model.RefundNotification;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -144,6 +149,85 @@ public class ThirdAppPlusServiceImpl implements ThirdAppPlusService {
return uniqueCode;
}
/**
* 查询支付订单
*/
@Override
public ThirdPayOrderVo getByPayNo(Long userId, String payNo) {
ThirdPayOrderEntity detail = thirdPayOrderService.getByPayNo(payNo);
if (ObjectUtil.isEmpty(detail)) return null;
if (ObjectUtil.notEqual(detail.getUserId(), userId)) return null;
boolean isPaySuccessAfter = manualQueyPayResult(detail);
detail = thirdPayOrderService.getByPayNo(payNo);
ThirdPayOrderVo vo = BeanUtil.toBean(detail, ThirdPayOrderVo.class);
// 查询商户
if (ObjectUtil.isNotEmpty(vo.getMchId())) {
MchManageVo mch = remoteMchService.getById(vo.getMchId()).getData();
if (ObjectUtil.isNotEmpty(mch)) {
vo.setMchName(mch.getName());
}
}
return vo;
}
public boolean manualQueyPayResult(ThirdPayOrderEntity payOrder) {
ThirdPayOrderEntity update = new ThirdPayOrderEntity();
update.setId(payOrder.getId());
// 判断是否为支付中,如果是则查询支付
if (ObjectUtil.equals(payOrder.getStatus(), ThirdPayOrderStatusEnum.PAY_UNPAID.getType()) || ObjectUtil.equals(payOrder.getStatus(), ThirdPayOrderStatusEnum.REFUNDING.getType())) {
// 微信
if (ObjectUtil.equals(payOrder.getPayPlatformType(), AppPlusPlatformTypeEnum.WECHAT.getType())) {
Transaction query = thirdMiniAppWechatService.query(payOrder.getPayNo(), payOrder.getMchPaySettingJson());
Transaction.TradeStateEnum tradeState = query.getTradeState();
// 支付成功
if (ObjectUtil.equals(tradeState, Transaction.TradeStateEnum.SUCCESS)) {
update.setPayTime(LocalDateTime.now());
update.setPayRes(JSONUtil.toJsonStr(query));
update.setStatus(ThirdPayOrderStatusEnum.PAY_SUCCESS.getType());
// thirdPayOrderService.updateById(update);
return true;
}
// 退款成功
else if (ObjectUtil.equals(tradeState, Transaction.TradeStateEnum.REFUND)) {
update.setRefundTime(LocalDateTime.now());
update.setRefundRes(JSONUtil.toJsonStr(query));
update.setStatus(ThirdPayOrderStatusEnum.PAY_SUCCESS.getType());
// thirdPayOrderService.updateById(update);
return true;
}
}
// 支付宝
else if (ObjectUtil.equals(payOrder.getPayPlatformType(), AppPlusPlatformTypeEnum.ALI_PAY.getType())) {
AlipayTradeQueryResponse query = thirdMiniAppAliPayService.query(payOrder.getPayNo(), payOrder.getMchPaySettingJson());
String tradeStatus = query.getTradeStatus();
// 支付成功
if (ObjectUtil.equals("TRADE_SUCCESS", tradeStatus)) {
update.setPayTime(LocalDateTime.now());
update.setPayRes(JSONUtil.toJsonStr(query));
update.setStatus(ThirdPayOrderStatusEnum.PAY_SUCCESS.getType());
thirdPayOrderService.updateById(update);
return true;
}
// 退款成功
else if (ObjectUtil.equals("TRADE_CLOSED", tradeStatus)) {
update.setRefundTime(LocalDateTime.now());
update.setRefundRes(JSONUtil.toJsonStr(query));
update.setStatus(ThirdPayOrderStatusEnum.PAY_SUCCESS.getType());
thirdPayOrderService.updateById(update);
return true;
}
} else {
return true;
}
} else {
return true;
}
return false;
}
/**
* 小程序支付
*/
@@ -199,6 +283,10 @@ public class ThirdAppPlusServiceImpl implements ThirdAppPlusService {
appPlusPayDto.setUserId(userId);
appPlusPayDto.setOpenid(dto.getOpenId());
appPlusPayDto.setAmount(dto.getAmount());
appPlusPayDto.setMchId(mchManage.getId());
result.setPayNo(outTradeNo);
// 微信小程序
if (ObjectUtil.equals(dto.getMiniPlatformType().getType(), AppPlusPlatformTypeEnum.WECHAT.getType())) {
MchPaySettingVo paySetting = paySettingList.stream().filter(item -> ObjectUtil.equals(item.getPlatformType(), AppPlusPlatformPayType.WECHAT.getType())).findFirst().orElse(null);
@@ -208,11 +296,11 @@ public class ThirdAppPlusServiceImpl implements ThirdAppPlusService {
MchPaySettingEntity.WechatPaySetting wechatPaySetting = JSONUtil.toBean(paySetting.getSettingJson(), MchPaySettingEntity.WechatPaySetting.class);
appPlusPayDto.setSubMchid(wechatPaySetting.getSubMchid());
ThirdMiniJsapiPayVo thirdMiniJsapiPayVo = thirdMiniAppWechatService.appPay(appPlusPayDto);
if (ObjectUtil.isEmpty(thirdMiniJsapiPayVo)) {
Map<String, Object> appPlusPayParams = thirdMiniAppWechatService.appPay(appPlusPayDto, paySetting);
if (ObjectUtil.isEmpty(appPlusPayParams)) {
throw new RuntimeException("创建微信支付错误");
}
result.setAppPlusPayParams(thirdMiniJsapiPayVo.getMiniAppPayParams());
result.setAppPlusPayParams(appPlusPayParams);
}
// 支付宝
else if (ObjectUtil.equals(dto.getMiniPlatformType().getType(), AppPlusPlatformTypeEnum.ALI_PAY.getType())) {
@@ -223,7 +311,7 @@ public class ThirdAppPlusServiceImpl implements ThirdAppPlusService {
MchPaySettingEntity.AliPaySetting wechatPaySetting = JSONUtil.toBean(paySetting.getSettingJson(), MchPaySettingEntity.AliPaySetting.class);
appPlusPayDto.setSubMchid(wechatPaySetting.getSubMchid());
String orderStr = thirdMiniAppAliPayService.appPay(appPlusPayDto);
String orderStr = thirdMiniAppAliPayService.appPay(appPlusPayDto, paySetting);
if (ObjectUtil.isEmpty(orderStr)) {
throw new RuntimeException("创建支付宝支付错误");
}
@@ -277,16 +365,16 @@ public class ThirdAppPlusServiceImpl implements ThirdAppPlusService {
*/
@Override
public String miniPayCallback(Map<String, String> params, String body, Map<String, String> headers) {
AppPlusPlatformTypeEnum platformType = checkMiniPlatformType(params, body);
AppPlusPlatformTypeEnum platformType = checkMiniPlatformType(params, body, headers);
// 微信小程序
if (ObjectUtil.equals(platformType, AppPlusPlatformTypeEnum.WECHAT)) {
ThirdPayOrderEntity thirdPayOrder = thirdMiniAppWechatService.payCallback(body, headers);
if (ObjectUtil.isEmpty(thirdPayOrder)) {
return ThirdMiniWechatQueryVo.wechantError();
return "fail";
}
// 根据订单bizType来处理
boolean isSuccess = disposePaySuccessAfter(thirdPayOrder);
return isSuccess ? ThirdMiniWechatQueryVo.wechantSuccess() : ThirdMiniWechatQueryVo.wechantError();
return isSuccess ? "success" : "fail";
}
// 支付宝
else if (ObjectUtil.equals(platformType, AppPlusPlatformTypeEnum.ALI_PAY)) {
@@ -309,7 +397,7 @@ public class ThirdAppPlusServiceImpl implements ThirdAppPlusService {
*/
@Override
public String miniRefundCallback(Map<String, String> params, String body, Map<String, String> headers) {
AppPlusPlatformTypeEnum platformType = checkRefundMiniPlatformType(params, body);
AppPlusPlatformTypeEnum platformType = checkRefundMiniPlatformType(params, body, headers);
// 微信小程序
if (ObjectUtil.equals(platformType, AppPlusPlatformTypeEnum.WECHAT)) {
ThirdPayOrderEntity thirdPayOrder = thirdMiniAppWechatService.refundCallback(body, headers);
@@ -318,7 +406,7 @@ public class ThirdAppPlusServiceImpl implements ThirdAppPlusService {
}
// 根据订单bizType来处理
boolean isSuccess = disposeRefundSuccessAfter(thirdPayOrder);
return isSuccess ? ThirdMiniWechatQueryVo.wechantSuccess() : ThirdMiniWechatQueryVo.wechantError();
return isSuccess ? "success" : "fail";
}
// 支付宝
else if (ObjectUtil.equals(platformType, AppPlusPlatformTypeEnum.ALI_PAY)) {
@@ -341,21 +429,18 @@ public class ThirdAppPlusServiceImpl implements ThirdAppPlusService {
*/
@Override
public String miniSubscribeCallback(Map<String, String> params, String body, Map<String, String> headers) {
return "";
ThirdALiPayCallbackVo vo = thirdMiniAppAliPayService.miniSubscribeCallback(params, body, headers);
if (ObjectUtil.equals(vo.getMsg_method(), "")) {
}
return "success";
}
// 判断支付回调
private AppPlusPlatformTypeEnum checkMiniPlatformType(Map<String, String> params, String body) {
ThirdMiniWechatRefundQueryVo vo = null;
try {
vo = JSONUtil.toBean(JSONUtil.toJsonStr(XmlUtil.xmlToMap(body)), ThirdMiniWechatRefundQueryVo.class);
} catch (Exception e) {
log.error("|{}|判断支付回调wx xml解析错误,body:|{}|", TAG, body);
}
private AppPlusPlatformTypeEnum checkMiniPlatformType(Map<String, String> params, String body, Map<String, String> headers) {
Transaction transaction = thirdMiniAppWechatService.pasePayCallback(body, headers);
// 微信
if (ObjectUtil.isNotEmpty(vo) && ObjectUtil.isNotEmpty(vo.getTransaction_id())) {
return AppPlusPlatformTypeEnum.WECHAT;
}
if (ObjectUtil.isNotEmpty(transaction)) return AppPlusPlatformTypeEnum.WECHAT;
// 支付宝
if (ObjectUtil.isNotEmpty(params)) {
try {
@@ -373,17 +458,10 @@ public class ThirdAppPlusServiceImpl implements ThirdAppPlusService {
/**
* 判断退款回调
*/
private AppPlusPlatformTypeEnum checkRefundMiniPlatformType(Map<String, String> params, String body) {
ThirdMiniWechantRefunCallbackSoureVo vo = null;
try {
vo = JSONUtil.toBean(JSONUtil.toJsonStr(XmlUtil.xmlToMap(body)), ThirdMiniWechantRefunCallbackSoureVo.class);
} catch (Exception e) {
log.error("|{}|判断退款回调wx xml解析错误,body:|{}|", TAG, body);
}
private AppPlusPlatformTypeEnum checkRefundMiniPlatformType(Map<String, String> params, String body, Map<String, String> headers) {
RefundNotification refundNotification = thirdMiniAppWechatService.paseRefundCallback(body, headers);
// 微信
if (ObjectUtil.isNotEmpty(vo) && ObjectUtil.isNotEmpty(vo.getAppid()) && ObjectUtil.isNotEmpty(vo.getMch_id()) && ObjectUtil.isNotEmpty(vo.getNonce_str()) && ObjectUtil.isNotEmpty(vo.getReq_info())) {
return AppPlusPlatformTypeEnum.WECHAT;
}
if (ObjectUtil.isNotEmpty(refundNotification)) return AppPlusPlatformTypeEnum.WECHAT;
// 支付宝
if (ObjectUtil.isNotEmpty(params)) {
try {
@@ -3,6 +3,7 @@ package com.bsd.pjcloud.thirdparty.service.impl.appplus;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
@@ -17,11 +18,15 @@ import com.bsd.pjcloud.thirdparty.service.ThirdAppPlusWechatService;
import com.bsd.pjcloud.thirdparty.service.ThirdPayOrderService;
import com.bsd.pjcloud.thirdparty.utils.pay.wechat.ThirdAppPlusWechantPayConstant;
import com.bsd.pjcloud.thirdparty.vo.appplus.pay.wechat.*;
import com.bsd.pjcloud.wallet.api.entity.mch.MchPaySettingEntity;
import com.bsd.pjcloud.wallet.api.vo.mch.MchPaySettingVo;
import com.wechat.pay.java.core.notification.NotificationParser;
import com.wechat.pay.java.core.notification.RequestParam;
import com.wechat.pay.java.service.partnerpayments.app.AppServiceExtension;
import com.wechat.pay.java.service.partnerpayments.app.model.*;
import com.wechat.pay.java.service.partnerpayments.app.model.Amount;
import com.wechat.pay.java.service.partnerpayments.app.model.PrepayRequest;
import com.wechat.pay.java.service.partnerpayments.app.model.PrepayWithRequestPaymentResponse;
import com.wechat.pay.java.service.partnerpayments.app.model.SettleInfo;
import com.wechat.pay.java.service.refund.RefundService;
import com.wechat.pay.java.service.refund.model.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
@@ -31,16 +36,11 @@ import org.springframework.validation.annotation.Validated;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.net.ssl.*;
import java.io.FileInputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.charset.StandardCharsets;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
/**
* 微信小程序(app版本)
@@ -59,13 +59,15 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService
private final ThirdPayOrderService thirdPayOrderService;
private final AppServiceExtension appServiceExtension;
private final RefundService refundService;
private final NotificationParser notificationParser;
/**
* APP支付
*/
@Override
public ThirdMiniJsapiPayVo appPay(ThirdAppPlusPayDto dto) {
public Map<String, Object> appPay(ThirdAppPlusPayDto dto, MchPaySettingVo setting) {
AppPlusPayConfig.WechatConfig wechatConfig = appPlusPayConfig.getWechatConfig();
ThirdPayOrderEntity payOrder = new ThirdPayOrderEntity();
@@ -77,6 +79,8 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService
payOrder.setPrice(dto.getAmount());
payOrder.setStatus(ThirdPayOrderStatusEnum.PAY_UNPAID.getType());
payOrder.setPayNo(dto.getOutTradeNo());
payOrder.setMchId(dto.getMchId());
payOrder.setMchPaySettingJson(JSONUtil.toJsonStr(setting));
try {
String description = "饭卡钱包充值" + fenToYuan(BigDecimal.valueOf(dto.getAmount())) + "元";
// 支付金额
@@ -92,20 +96,21 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService
request.setSpMchid(wechatConfig.getMerchantId());
request.setSubMchid(dto.getSubMchid());
request.setDescription(description);
request.setSettleInfo(settleInfo);
// request.setSettleInfo(settleInfo);
request.setOutTradeNo(dto.getOutTradeNo());
request.setNotifyUrl(wechatConfig.getPayCallbackUrl());
request.setNotifyUrl(wechatConfig.getBaseCallbackUrl() + wechatConfig.getPayCallbackUrl());
payOrder.setPayRep(JSONUtil.toJsonStr(request));
PrepayWithRequestPaymentResponse res = appServiceExtension.prepayWithRequestPayment(request, wechatConfig.getAppPlatformAppId());
log.debug("APP支付,json,xml|{}", res);
if (ObjectUtil.isEmpty(res)) {
log.error("APP支付,res为空");
return null;
}
payOrder.setPayTime(LocalDateTime.now());
payOrder.setPayRes(JSONUtil.toJsonStr(res));
return null;
return BeanUtil.beanToMap(res);
} catch (Exception e) {
log.error("|{}|JSAPI/小程序下单,异常", TAG, e);
log.error("|{}|APP支付,异常", TAG, e);
return null;
} finally {
thirdPayOrderService.save(payOrder);
@@ -152,7 +157,22 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService
* 查询订单
*/
@Override
public ThirdMiniWechatQueryVo query(ThirdMiniWechatQueryDto dto) {
public Transaction query(String payNo, String settingJson) {
AppPlusPayConfig.WechatConfig wechatConfig = appPlusPayConfig.getWechatConfig();
MchPaySettingEntity wechatPaySettingEntity = JSONUtil.toBean(settingJson, MchPaySettingEntity.class);
MchPaySettingEntity.WechatPaySetting wechatPaySetting = JSONUtil.toBean(wechatPaySettingEntity.getSettingJson(), MchPaySettingEntity.WechatPaySetting.class);
try {
QueryOrderByOutTradeNoRequest req = new QueryOrderByOutTradeNoRequest();
req.setSpMchid(wechatConfig.getMerchantId());
req.setSubMchid(wechatPaySetting.getSubMchid());
req.setOutTradeNo(payNo);
Transaction transaction = appServiceExtension.queryOrderByOutTradeNo(req);
} catch (Exception e) {
log.error("|{}|查询订单,异常", TAG, e);
return null;
}
return null;
}
@@ -165,22 +185,19 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService
return null;
}
private String getTransactionIdByThirdPayOrder(ThirdPayOrderEntity thirdPayOrder) {
if (ObjectUtil.isEmpty(thirdPayOrder) || ObjectUtil.isEmpty(thirdPayOrder.getPayRes())) {
return null;
}
String payRes = thirdPayOrder.getPayCallbackRes();
ThirdMiniWechantRefunCallbackVo thirdMiniJsapiPay = JSONUtil.toBean(payRes, ThirdMiniWechantRefunCallbackVo.class);
return thirdMiniJsapiPay.getTransaction_id();
}
/**
* 申请退款
* AP申请退款
*/
@Override
public ThirdMiniWechatRefundVo refund(ThirdPayOrderEntity thirdPayOrder, ThirdMiniWechatRefundDto dto) {
public ThirdPayOrderEntity refund(ThirdPayOrderEntity thirdPayOrder, ThirdMiniWechatRefundDto dto) {
AppPlusPayConfig.WechatConfig wechatConfig = appPlusPayConfig.getWechatConfig();
if (ObjectUtil.isEmpty(thirdPayOrder.getMchPaySettingJson())) {
throw new RuntimeException("支付配置不存在");
}
MchPaySettingEntity wechatPaySettingEntity = JSONUtil.toBean(thirdPayOrder.getMchPaySettingJson(), MchPaySettingEntity.class);
MchPaySettingEntity.WechatPaySetting wechatPaySetting = JSONUtil.toBean(wechatPaySettingEntity.getSettingJson(), MchPaySettingEntity.WechatPaySetting.class);
ThirdPayOrderEntity updateObj = new ThirdPayOrderEntity();
updateObj.setId(thirdPayOrder.getId());
@@ -189,14 +206,45 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService
refundFee = thirdPayOrder.getPrice();
}
String refundNo = "refund_" + thirdPayOrder.getPayNo();
return null;
CreateRequest createRequest = new CreateRequest();
AmountReq amountReq = new AmountReq();
// 订单金额信息
amountReq.setRefund(Long.valueOf(refundFee));
amountReq.setTotal(Long.valueOf(thirdPayOrder.getPrice()));
amountReq.setCurrency("CNY");
createRequest.setOutTradeNo(thirdPayOrder.getPayNo());
createRequest.setAmount(amountReq);
createRequest.setSubMchid(wechatPaySetting.getSubMchid());
createRequest.setOutRefundNo(refundNo);
createRequest.setReason("退还饭卡钱包充值" + fenToYuan(BigDecimal.valueOf(refundFee)) + "元");
createRequest.setNotifyUrl(wechatConfig.getBaseCallbackUrl() + wechatConfig.getRefundCallbackUrl());
updateObj.setRefundRep(JSONUtil.toJsonStr(createRequest));
updateObj.setRefundNo(refundNo);
updateObj.setRefundTime(LocalDateTime.now());
updateObj.setStatus(ThirdPayOrderStatusEnum.REFUNDING.getType());
try {
Refund refund = refundService.create(createRequest);
updateObj.setRefundRes(JSONUtil.toJsonStr(refund));
if (ObjectUtil.isNotEmpty(refund)) {
throw new RuntimeException("微信退款申请错误异常");
}
} catch (Exception e) {
log.error("|{}|AP申请退款,异常", TAG, e);
return null;
} finally {
thirdPayOrderService.updateById(updateObj);
}
return thirdPayOrderService.getByPayNo(thirdPayOrder.getPayNo());
}
/**
* 查询退款
*/
@Override
public ThirdMiniWechatRefundQueryVo refundQuery(ThirdMiniWechatRefundQueryDto dto) {
public ThirdMiniWechatRefundQueryVo refundQuery(String payNo) {
AppPlusPayConfig.WechatConfig wechatConfig = appPlusPayConfig.getWechatConfig();
return null;
}
@@ -206,62 +254,119 @@ public class ThirdAppPlusWechatServiceImpl implements ThirdAppPlusWechatService
*/
@Override
public ThirdPayOrderEntity payCallback(String body, Map<String, String> headers) {
String bodyJson = JSONUtil.toJsonStr(XmlUtil.xmlToMap(body));
ThirdMiniWechatRefundQueryVo vo = JSONUtil.toBean(bodyJson, ThirdMiniWechatRefundQueryVo.class);
if (ObjectUtil.isEmpty(vo) || !vo.isHttpSucess()) {
Transaction transaction = pasePayCallback(body, headers);
if (ObjectUtil.isEmpty(transaction) || ObjectUtil.isEmpty(transaction.getOutTradeNo())) {
log.error("|{}|payCallback,意外的错误,微信支付回调解析错误", TAG);
return null;
}
boolean paySucess = vo.isPaySucess();
// 查询订单
ThirdPayOrderEntity payOrderEntity = thirdPayOrderService.getByPayNo(vo.getOut_trade_no());
ThirdPayOrderEntity payOrderEntity = thirdPayOrderService.getByPayNo(transaction.getOutTradeNo());
if (ObjectUtil.isEmpty(payOrderEntity)) {
log.error("|{}|payCallback,意外的错误,订单不存在,微信返回json|{}|", TAG, bodyJson);
log.error("|{}|payCallback,意外的错误,订单不存在,微信返回body|{}|", TAG, body);
return null;
}
// 重复的回调
if (ObjectUtil.notEqual(payOrderEntity.getStatus(), ThirdPayOrderStatusEnum.PAY_UNPAID.getType())) {
log.error("|{}|payCallback,意外的错误,重复的回调,微信返回json|{}|", TAG, bodyJson);
log.error("|{}|payCallback,意外的错误,重复的回调,微信返回body|{}|", TAG, body);
return null;
}
boolean paySucess = ObjectUtil.equals(Transaction.TradeStateEnum.SUCCESS, transaction.getTradeState());
// 更新订单状态
ThirdPayOrderEntity updateObj = new ThirdPayOrderEntity();
updateObj.setId(payOrderEntity.getId());
updateObj.setPayCallbackRes(bodyJson);
updateObj.setPayCallbackRes(JSONUtil.toJsonStr(transaction));
updateObj.setStatus(paySucess ? ThirdPayOrderStatusEnum.PAY_SUCCESS.getType() : ThirdPayOrderStatusEnum.PAY_FAILED.getType());
thirdPayOrderService.updateById(updateObj);
return thirdPayOrderService.getById(payOrderEntity.getId());
}
/**
* 解析支付的回调
*/
@Override
public Transaction pasePayCallback(String body, Map<String, String> headers) {
String serialNumber = headers.get("Wechatpay-Serial");
String nonce = headers.get("Wechatpay-Nonce");
String signature = headers.get("Wechatpay-Signature");
String signatureType = headers.get("Wechatpay-Signature-Type");
String timestamp = headers.get("Wechatpay-Timestamp");
if (!ObjectUtil.isAllNotEmpty(serialNumber, nonce, signature, timestamp)) {
return null;
}
RequestParam requestParam = new RequestParam.Builder()
.serialNumber(serialNumber)
.nonce(nonce)
.signature(signature)
.signType(signatureType)
.timestamp(timestamp)
.body(body)
.build();
try {
return notificationParser.parse(requestParam, Transaction.class);
} catch (Exception e) {
return null;
}
}
/**
* 退款回调
*/
@Override
public ThirdPayOrderEntity refundCallback(String body, Map<String, String> headers) {
ThirdMiniWechantRefunCallbackVo vo = decrypt(body);
if (ObjectUtil.isEmpty(vo)) {
RefundNotification refundNotification = paseRefundCallback(body, headers);
if (ObjectUtil.isEmpty(refundNotification) || ObjectUtil.isEmpty(refundNotification.getOutTradeNo())) {
log.error("|{}|payCallback,意外的错误,微信退款回调解析错误", TAG);
return null;
}
// 查询订单
ThirdPayOrderEntity payOrderEntity = thirdPayOrderService.getByPayNo(vo.getOut_trade_no());
ThirdPayOrderEntity payOrderEntity = thirdPayOrderService.getByPayNo(refundNotification.getOutTradeNo());
if (ObjectUtil.isEmpty(payOrderEntity)) {
log.error("|{}|refundCallback,意外的错误,订单不存在,微信返回json|{}|", TAG, JSONUtil.toJsonStr(vo));
log.error("|{}|refundCallback,意外的错误,订单不存在,微信返回json|{}|", TAG, JSONUtil.toJsonStr(refundNotification));
return null;
}
// 重复的回调
if (ObjectUtil.notEqual(payOrderEntity.getStatus(), ThirdPayOrderStatusEnum.REFUNDING.getType())) {
log.error("|{}|refundCallback,意外的错误,重复的回调,微信返回json|{}|", TAG, JSONUtil.toJsonStr(vo));
log.error("|{}|refundCallback,意外的错误,重复的回调,微信返回json|{}|", TAG, JSONUtil.toJsonStr(refundNotification));
return null;
}
// 更新订单状态
boolean refundSuccess = vo.isAllSuccess();
boolean refundSuccess = ObjectUtil.equals(refundNotification.getRefundStatus(), Status.SUCCESS);
ThirdPayOrderEntity updateObj = new ThirdPayOrderEntity();
updateObj.setId(payOrderEntity.getId());
updateObj.setRefundCallbackRes(JSONUtil.toJsonStr(vo));
updateObj.setRefundCallbackRes(JSONUtil.toJsonStr(refundNotification));
updateObj.setStatus(refundSuccess ? ThirdPayOrderStatusEnum.REFUND_SUCCESS.getType() : ThirdPayOrderStatusEnum.REFUND_FAILED.getType());
thirdPayOrderService.updateById(updateObj);
return thirdPayOrderService.getById(payOrderEntity.getId());
}
/**
* 解析退款的回调
*/
@Override
public RefundNotification paseRefundCallback(String body, Map<String, String> headers) {
String serialNumber = headers.get("Wechatpay-Serial");
String nonce = headers.get("Wechatpay-Nonce");
String signature = headers.get("Wechatpay-Signature");
String signatureType = headers.get("Wechatpay-Signature-Type");
String timestamp = headers.get("Wechatpay-Timestamp");
if (!ObjectUtil.isAllNotEmpty(serialNumber, nonce, signature, timestamp)) {
return null;
}
RequestParam requestParam = new RequestParam.Builder()
.serialNumber(serialNumber)
.nonce(nonce)
.signature(signature)
.signType(signatureType)
.timestamp(timestamp)
.body(body)
.build();
try {
return notificationParser.parse(requestParam, RefundNotification.class);
} catch (Exception e) {
return null;
}
}
/**
* 解密回调信息解密
*/
@@ -120,16 +120,17 @@ app-plus:
api-v3-key: f0f5fd485bac7f377af6f5ca97636dd4
merchant-serial-number: 1A4A19DC15F4742D9DC1A2CF1DE05F15FFCAE315
mch-private-path: /Users/dengzhangchen/Desktop/backups/pay/zax_wx_pt_v3/apiclient_key.pem
pay-callback-url: https://dzc-test-1.fy.takin.cc/third/third-app-pay/app/pay-callback
refund-callback-url: https://dzc-test-1.fy.takin.cc/third/third-app-pay/app/refund-callback
base-callback-url: https://dzc-test-1.fy.takin.cc
pay-callback-url: /third/third-app-pay/app/pay-callback
refund-callback-url: /third/third-app-pay/app/refund-callback
spbill-create-ip: 59.202.170.152
base-url: https://api.mch.weixin.qq.com
ali-pay-config:
app-id: 2021006152681025
app-private-key: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCArccby2Bq3DlDveWHLrBBzx/zQEehhJlJbUnzlYytpwcsprhlUIKfLJDxVlERxBCaOFQDVh8IPYSpD/ryXPsvkQ4Ev1g2TPDdmikUJYP9zigLwvB55tLMjYy78+hrYnKIUVGxk4j+FKW2/d/MJM09/j8NcHZbtRy9Jg1Bcxoo9FR+nk+MRhsKc1pdR7ba+45LMtNvWX/GLZffxDkGF2QfITtNNvbZHlAsuOTDGNjpF8bykHNr9eIsYaiJhSZsbRW0RrOEWf5nq9iEVEN5zi1moq1pDMveIN96wXj21Nurkt9i21i5gLWTslCFOE46bOlCtwCjy0j5x9sJ2FaJY6B5AgMBAAECggEAaT+6L721azIdlI7qAhvqBqnHVEsrS60NQ8WkSxvzKMYJVDg5coTbkh39n6gePw3DFqEj9mamkzLeIvnzI/FxcoKOmMt491EPYfIJz3Sv9RR+JMCZuNtXaAAPMFxbqhmn3F/HFhu6XTe+I2KbfnpLdX1TTUbDSFdm3j8VcIcYyo2EA8ksMRifcoEjYPJO9X/V70VxrqvcMnYzb8HegzLVmdA9E6KOxz4E8YcTsPl53H3z7M+LHZ7hAxWffacKwEuCj015nD4DVNRcx+9B0qyaH0V0FD0eGeYB9wlR3Q71AuT9Eu1DMJ1Krd1PH9++pGOqOE+9oWzfk3YsZxKD32tQEQKBgQDEmRakTBZZZKKxlFsX/h5Jl0WQhV0zKzOMBDEvonmLp7jB948UXqdL+A/1r1lJ/+9NJAlyeySstcUVdkgpFvnFWkVOkEuUsiYyIE+Zl3qjedhs+v5nGZ6pK/N+r6tGxOdKT2gfg2s9gTZZKwNcHOmUTLd2Pv+80s4ElhkwMoWicwKBgQCnjx8FxO4FLmFHjzmbNwlXgSdjLbLQsR/08ZzwuNQwn7nR72Ye1d6EEIkyqdq/WMJPiaAMUg+zkoIzM0zX21U7ZrV0kknm4LctLi+FwEEGK/wm5nAdGQA8Uf+Lt55A0dafJMjVT/w8vf3S9JV/6qZQ8wwGVCnavZhbAJRdLMl6YwKBgC/aU3iKTKZVqIQw6Dtez2B6QaR70cOysElUe+RsV8l2ebI838bFg1Mqfjf/BmzMryLHssT61GJ1nBMtR0M5JHK1FkmZNcxr0IBC/R0VkfRYpCVisqnFwqjK2ensOHRxWRrtWRrSkjfWS7RIk/jH0NMYGU/e5cDATwUuw9LHeV+hAoGAZeE306IxtyTEMWZ8eEu2emYlNMCMgSexbpWZ/yPioM39hhAx333aliIXyZ5NSxsEyqe7kMI0mdLzJ36Bsp3B7SQ+IGryVFc+CVKTwpdq8f28i0qB0K9q3UJeRu2WY4MzJACRvGGt1KEQvDvKysQ56+5b2V1DNaUiBfMMQrsAplECgYBgVTk/5NVFHt6MTiYJiqIA4s6Us5lfNpTbc7rGOlFfKo+sxS1hO/klZ83Ou2HHyzm18F5AXSARETBT98m0UzPHL+c6EZaFPltgOJHG72eZ0MstWQU1et9mzPpInCRCXAv5cg1VCrXe9bPhH61UhBK3i9NR6QFahMaPPyVsQF0ISg==
app-id: 2021006152609558
app-private-key: MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC24MPW2yRAhwvsggYizILPI1ip10LFRrLKrwnstP3C0CmsxGsJFzmw3iA0jT3ruaAEB/fM4UpJKFQG8JCUui3+eMqEi0d39GSBD9puMh4Vc5tVPqPdBTmiN3T4ut3857HPRq58d/9CnGF7AldNuVv6gPNrGBideEoAuBV5iTfrmlv7gVStO4ieEYJnkcLjutD0uzZ24j2HsWQHg0x/qioH9odFBizNsnTH3Uvd3RnK3n9rZXgxsNnhTEEw+lu32w+xzHC/1ob3k2alE6Kn+w4Rljr7T9mcv9eQPqaMa5Slu+ulpDbZe5guMv3WWI0QwNU2x0gfWqN36RtZwgC5AUmzAgMBAAECggEAXhGpyyg4MpUE1ihf3aCTHNeSsPKQXwepykZVdZP4ADCxbzQt1qRCwa7QpBePJWT7YXdzyMiOPKlo55Tw2gAWzpH1ok4+ef6VgCnWct6GyQQJf8TT50nbxox+N79vlrrbpMI32MCk5e+o2OxwWgOhw253R7xCVSXd8xa9vSGPSTngyskNIoXXujIg6bf0CfYClMD1c8jWAA3Y9ZlM2RcxFP16RvGRvDvgDomF1/oEB8aIP1BswXpmFbWVlmYMB/5pS1P90fzJ+w74pqRObH90kYJgoQ0k+5NUD3q8xv61Wu7+mCfGrlxgYEmNp+O3rT0DMRaQhG3qCB/FJM/xa7cNyQKBgQD+u0f363GIE6penUGlxH+Ww2wtR7aTrYVf4TQMpjPNGjoh+jx4VAIwA0Uxq3diA4+l03DbSGZkFiQaSK8txWpXqe2R6o/5+Y+/MCVzRLDsBRl8TB2EPtFUmhzRSS4rWzEZzpzRh7qHT+ycxxuJNo66WOIgqs4Tx2Mp0TinufmedQKBgQC3yeN5qa+eaUORoWfBbuRB1XxuVneU+i5/1D9Md7heTzM9NzJYN8LAB6y/VsQQsLJO0p0fVKkjKbJSY/qyB0o7AXlr7dZhbzfCLN0yaWdUzpyy/nbO1Z4jzZEXGMNfqi2N41fuVBucVXpUcU3NDf0oFkwdtGVTz5WCUq3y4gCShwKBgQCN25wjq+Go51K8qBTUDQ8E1cXbnZFGwp6BG7hRxwkYEqAHJgUg+Z/SPy/8jkHIurT3oz25UKN833uxi4LLGaK0OTTNSvRtQJbV4Skp/ToN5nUf7H+PkzAeTkj4ICnvCTTZ618XrN+q1U6urI9gJZrsme0sRhLHnwVRV2uWtJIXtQKBgQCCOy3UXRgTkRWPESc7Wv+lYsh8SwsLZsgiTlzYK5FaSpbNTtp+xmxatFWFc88U4JBI6FbsB4qeXwJ7/Vp8YkwIScAnaW3atvt0vWO0QBo3bvx8nXHEmHwpdJXWHvb6R9Vl0G3TdIfoHG3FflAZ+Eql6D7hYZ3XaKXRphKao+ix6wKBgQC6aYF2ldJcX4cxvkm1Cuz96jvKt5qx7IhH3CkH+qEVnnYZRrcMbwcO4agwWpvgp/tTKgYV2DzEuXF5aNbBoKXAXG5FOT+etPlutnkt+/n2vsRiafeMMnBFvWqZ48XgREqi/ehHCMcZdsDpudxX0VAAwtvBYJsQfes6XyMYsC6gbA==
alipay-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg/tnDZnVyF3K6mQYrdnPqfnFou0tmf2uFOErWps7GBzPtR65XI8aFuwN17oFsF0m1L05i1tPzRN+UWH/siXlAh2YtDosw8Af1GY0fhwZQIxD/WigDvPD8w8c9xwNGGfmGfyc0f46GEsTakur7UG2wDmhE51ijLbQiol0kQixu6cUCWuCEXl3pCgCvpByUn53607+w/gfXDeMF5tMT734RsDwhz9hiDALrT3z50V5HSyfM0JsQZEMIG3uM+PSD04gvUY95yIuhAWUjf8z67TdKY/rMoW9PJYBI4aG2UZge2YkDufDXgtCSdFt6qJx9c0w4BY/FQZPBCxfyMZ7noiJmQIDAQAB
# base-callback-url: https://dzc-test-1.fy.takin.cc
base-callback-url: https://www.zianxin.com/api
base-callback-url: https://dzc-test-1.fy.takin.cc
# base-callback-url: https://www.zianxin.com/api
pay-callback-url: /third/third-app-pay/app/pay-callback
refund-callback-url: /third/third-app-pay/app/refund-callback
subscribe-url: /third/third-app-pay/app/subscribe-callback
@@ -9,6 +9,8 @@
a.biz_id,
a.user_id,
a.user_code,
a.mch_id,
a.mch_pay_setting_json,
a.price,
a.status,
a.pay_no,
@@ -120,6 +120,11 @@ public class MchPaySettingEntity extends Model<MchPaySettingEntity> {
* 子商户号
*/
private String subMchid;
/**
* 子商户授权token
*/
private String appAuthToken;
}
}
@@ -140,7 +140,7 @@ public class WalletManageServiceImpl extends ServiceImpl<WalletManageMapper, Wal
}
// 默认创建饭卡并绑定饭卡钱包
if (ObjectUtil.equals(v.getUniqueCode(), WalletTypeEnum.EAT.getCode())) {
walletActiveService.createAndActiveCard(wallet);
walletActiveService.createAndActiveCard(insertObj);
}
}
}