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 000000000..af27f00d1 Binary files /dev/null and b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/user-copy-1.xlsx differ diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/user.xlsx b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/user.xlsx index af27f00d1..517d078c9 100644 Binary files a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/user.xlsx and b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/user.xlsx differ diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchPaySettingEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchPaySettingEntity.java index 21bd5a110..149457c53 100755 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchPaySettingEntity.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchPaySettingEntity.java @@ -120,6 +120,11 @@ public class MchPaySettingEntity extends Model { * 子商户号 */ 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