From a16f5de2df4d72dd2e6be8330627f9142ef02e68 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Fri, 8 May 2026 17:21:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=94=AF=E4=BB=98=E5=AE=9D=E6=94=AF?= =?UTF-8?q?=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- local.env | 5 +- .../miniplatform/AppPlusPlatformTypeEnum.java | 2 +- .../pay/wechat/ThirdAppPlusPayDto.java | 2 + .../pay/wechat/ThirdMiniWechatQueryDto.java | 21 -- .../wechat/ThirdMiniWechatRefundQueryDto.java | 16 -- .../entity/pay/ThirdPayOrderEntity.java | 12 ++ .../vo/appplus/pay/ThirdMiniAppPayVo.java | 5 +- .../pay/alipay/ThirdALiPayCallbackVo.java | 2 + .../pay/wechat/ThirdMiniJsapiPayVo.java | 2 +- .../pay/wechat/ThirdMiniWechatQueryVo.java | 140 ------------- .../thirdparty/vo/pay/ThirdPayOrderVo.java | 2 + .../thirdparty/config/AppPlusPayConfig.java | 5 + .../initconfig/WechatConfiguration.java | 28 +++ .../appplus/ThirdMinAppPayCotroller.java | 8 + .../service/ThirdAppPlusAliPayService.java | 15 +- .../service/ThirdAppPlusService.java | 6 + .../service/ThirdAppPlusWechatService.java | 20 +- .../ThirdAppPlusAliPayServiceImpl.java | 69 ++++++- .../impl/appplus/ThirdAppPlusServiceImpl.java | 138 ++++++++++--- .../ThirdAppPlusWechatServiceImpl.java | 193 ++++++++++++++---- .../src/main/resources/application.yml | 13 +- .../resources/mapper/ThirdPayOrderMapper.xml | 2 + .../src/main/resources/file/user-copy-1.xlsx | Bin 0 -> 9183 bytes .../src/main/resources/file/user.xlsx | Bin 9183 -> 13503 bytes .../api/entity/mch/MchPaySettingEntity.java | 5 + .../service/impl/WalletManageServiceImpl.java | 2 +- 26 files changed, 439 insertions(+), 274 deletions(-) delete mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/pay/wechat/ThirdMiniWechatQueryDto.java delete mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/pay/wechat/ThirdMiniWechatRefundQueryDto.java delete mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/appplus/pay/wechat/ThirdMiniWechatQueryVo.java create mode 100644 pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/user-copy-1.xlsx diff --git a/local.env b/local.env index 32d77925b..fae4a457f 100644 --- a/local.env +++ b/local.env @@ -1,4 +1,7 @@ MYSQL_HOST=123.157.250.162 MYSQL_PORT=28815 MYSQL_USER=root@sys -MYSQL_PWD=bsd.1799 \ No newline at end of file +MYSQL_PWD=bsd.1799 + +SERVICE_MYSQL_USER=jhkjx +SERVICE_MYSQL_PWD=LrM8Sza8DF77cESJ \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/miniplatform/AppPlusPlatformTypeEnum.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/miniplatform/AppPlusPlatformTypeEnum.java index 2f140d33b..a5c3db617 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/miniplatform/AppPlusPlatformTypeEnum.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/miniplatform/AppPlusPlatformTypeEnum.java @@ -13,7 +13,7 @@ import java.util.Arrays; @Getter public enum AppPlusPlatformTypeEnum { - WECHAT("10", "微信小程序"), + WECHAT("10", "微信"), ALI_PAY("20", "支付宝"), ; diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/pay/wechat/ThirdAppPlusPayDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/pay/wechat/ThirdAppPlusPayDto.java index 21cd73488..6384ed81c 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/pay/wechat/ThirdAppPlusPayDto.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/pay/wechat/ThirdAppPlusPayDto.java @@ -9,6 +9,8 @@ import lombok.Data; @Data public class ThirdAppPlusPayDto { + private Long mchId; + /** * 子商户id */ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/pay/wechat/ThirdMiniWechatQueryDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/pay/wechat/ThirdMiniWechatQueryDto.java deleted file mode 100644 index 09e2a11cc..000000000 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/pay/wechat/ThirdMiniWechatQueryDto.java +++ /dev/null @@ -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; - -} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/pay/wechat/ThirdMiniWechatRefundQueryDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/pay/wechat/ThirdMiniWechatRefundQueryDto.java deleted file mode 100644 index ac69ea0fa..000000000 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/appplus/pay/wechat/ThirdMiniWechatRefundQueryDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.bsd.pjcloud.thirdparty.dto.appplus.pay.wechat; - -import lombok.Data; - -/** - * 微信退款查询入参 - */ -@Data -public class ThirdMiniWechatRefundQueryDto { - - /** - * 退款id - */ - private String refundId; - -} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/pay/ThirdPayOrderEntity.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/pay/ThirdPayOrderEntity.java index 0df0ad34a..c4c4da00b 100755 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/pay/ThirdPayOrderEntity.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/pay/ThirdPayOrderEntity.java @@ -54,6 +54,18 @@ public class ThirdPayOrderEntity extends Model { @Schema(description = "用户id") private Long userId; + /** + * 支付到账商户id + */ + @Schema(description = "支付到账商户id") + private Long mchId; + + /** + * 商户支付配置 + */ + @Schema(description = "商户支付配置") + private String mchPaySettingJson; + /** * 用户code */ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/appplus/pay/ThirdMiniAppPayVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/appplus/pay/ThirdMiniAppPayVo.java index fc14e6080..9261e6a77 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/appplus/pay/ThirdMiniAppPayVo.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/appplus/pay/ThirdMiniAppPayVo.java @@ -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 appPlusPayParams; + private String payNo; + + private Map appPlusPayParams; } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/appplus/pay/alipay/ThirdALiPayCallbackVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/appplus/pay/alipay/ThirdALiPayCallbackVo.java index 5cacb80b2..9b95f39e7 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/appplus/pay/alipay/ThirdALiPayCallbackVo.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/appplus/pay/alipay/ThirdALiPayCallbackVo.java @@ -13,6 +13,8 @@ import java.time.LocalDateTime; @Data public class ThirdALiPayCallbackVo { + private String msg_method; + /** * 通知时间。通知的发送时间。格式为 yyyy-MM-dd HH:mm:ss。 */ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/appplus/pay/wechat/ThirdMiniJsapiPayVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/appplus/pay/wechat/ThirdMiniJsapiPayVo.java index 1d5b6ddcd..c8aa57c1e 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/appplus/pay/wechat/ThirdMiniJsapiPayVo.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/appplus/pay/wechat/ThirdMiniJsapiPayVo.java @@ -39,7 +39,7 @@ public class ThirdMiniJsapiPayVo { private String code_url; - private HashMap miniAppPayParams; + private HashMap appPayParams; public boolean isHttpSucess() { return ObjectUtil.equals(ThirdMiniWechatQueryVo.SUCCESS, return_code); diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/appplus/pay/wechat/ThirdMiniWechatQueryVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/appplus/pay/wechat/ThirdMiniWechatQueryVo.java deleted file mode 100644 index 91ecf8812..000000000 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/appplus/pay/wechat/ThirdMiniWechatQueryVo.java +++ /dev/null @@ -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 "" + - "" + - "" + - ""; - } - - public static String wechantSuccess() { - return "" + - " " + - " \n" + - ""; - } - -} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/ThirdPayOrderVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/ThirdPayOrderVo.java index 4051fe63c..ed1572bc4 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/ThirdPayOrderVo.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/ThirdPayOrderVo.java @@ -6,6 +6,8 @@ import lombok.Data; @Data public class ThirdPayOrderVo extends ThirdPayOrderEntity { + private String mchName; + private String username; private String userPhone; diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/AppPlusPayConfig.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/AppPlusPayConfig.java index 302750e96..d1f387da3 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/AppPlusPayConfig.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/AppPlusPayConfig.java @@ -61,6 +61,11 @@ public class AppPlusPayConfig { */ private String merchantSerialNumber; + /** + * 回调基础地址 + */ + private String baseCallbackUrl; + /** * 支付成功的回调 */ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/initconfig/WechatConfiguration.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/initconfig/WechatConfiguration.java index 32a1d5101..c341ca50b 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/initconfig/WechatConfiguration.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/initconfig/WechatConfiguration.java @@ -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(); + } + } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/appplus/ThirdMinAppPayCotroller.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/appplus/ThirdMinAppPayCotroller.java index d7bb363dd..631e8af14 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/appplus/ThirdMinAppPayCotroller.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/appplus/ThirdMinAppPayCotroller.java @@ -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 getByPayNo(@RequestParam String payNo) { + PjcloudUser user = SecurityUtils.getUser(); + return R.ok(thirdMiniAppService.getByPayNo(user.getId(), payNo)); + } + @Operation(summary = "支付") @PostMapping("/app/pay") public R miniPay(@Validated @RequestBody ThirdMiniAppPayDto dto) { diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusAliPayService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusAliPayService.java index 0683dd703..7209b0a77 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusAliPayService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusAliPayService.java @@ -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 params, String body, Map headers); + + /** + * 支付消息订阅 + */ + ThirdALiPayCallbackVo miniSubscribeCallback(Map params, String body, Map headers); } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusService.java index d7ebb68c8..ce580118a 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusService.java @@ -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); + /** * 小程序支付 */ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusWechatService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusWechatService.java index efa867da3..a216de17e 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusWechatService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdAppPlusWechatService.java @@ -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 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 headers); + /** + * 解析支付的回调 + */ + Transaction pasePayCallback(String body, Map headers); + /** * 退款回调 */ ThirdPayOrderEntity refundCallback(String body, @RequestHeader Map headers); + /** + * 解析退款的回调 + */ + RefundNotification paseRefundCallback(String body, Map headers); } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusAliPayServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusAliPayServiceImpl.java index 7d90a8ef6..5439b5765 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusAliPayServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusAliPayServiceImpl.java @@ -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 params, String body, Map 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; diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusServiceImpl.java index aa7eef116..e33cd8fe6 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusServiceImpl.java @@ -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 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 params, String body, Map 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 params, String body, Map 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 params, String body, Map headers) { - return ""; + ThirdALiPayCallbackVo vo = thirdMiniAppAliPayService.miniSubscribeCallback(params, body, headers); + if (ObjectUtil.equals(vo.getMsg_method(), "")) { + + } + return "success"; } // 判断支付回调 - private AppPlusPlatformTypeEnum checkMiniPlatformType(Map 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 params, String body, Map 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 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 params, String body, Map 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 { diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusWechatServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusWechatServiceImpl.java index 978f773e4..7d5f1a7f4 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusWechatServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/appplus/ThirdAppPlusWechatServiceImpl.java @@ -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 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 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 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 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 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; + } + } + /** * 解密回调信息解密 */ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml index 3523a7fb1..28dd6f397 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml @@ -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 diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdPayOrderMapper.xml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdPayOrderMapper.xml index 4200b3807..ad29c9cd7 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdPayOrderMapper.xml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdPayOrderMapper.xml @@ -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, diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/user-copy-1.xlsx b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/user-copy-1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..af27f00d183920a87d2686ea083831865be1c8e3 GIT binary patch literal 9183 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 delta 6351 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 { * 子商户号 */ private String subMchid; + + /** + * 子商户授权token + */ + private String appAuthToken; } } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java index 23578700c..bd3e51370 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java @@ -140,7 +140,7 @@ public class WalletManageServiceImpl extends ServiceImpl