From eb6b6dbb35a9f029e0b7d269773685c19fd40976 Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期四, 11 七月 2024 10:47:51 +0800 Subject: [PATCH] 玩湃微信商户认证代码 --- cloud-server-other/src/main/java/com/dsh/other/util/PayMoneyUtil.java | 41 cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/OperatorUser_proportionAuth_info.html | 4 cloud-server-course/src/main/java/com/dsh/course/util/PayMoneyUtil.java | 41 cloud-server-management/src/main/java/com/dsh/course/mapper/CarInsuranceMapper.java | 2 cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/TaskUtil.java | 135 ++ cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java | 23 cloud-server-management/src/main/resources/mapper/TOperatorAuthWxMapper.xml | 6 cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/IOperatorAuthWxService.java | 12 cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/HttpRequestUtil.java | 78 + cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java | 59 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/OperatorController.java | 690 +++++++++++ cloud-server-management/pom.xml | 50 cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/WxUploadImgUtil.java | 95 + cloud-server-competition/src/main/java/com/dsh/competition/util/PayMoneyUtil.java | 42 cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java | 56 cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/OperatorUser_proportionAuthWX.html | 305 +++++ cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TOperatorAuthWxServiceImpl.java | 24 cloud-server-course/src/main/java/com/dsh/course/feignclient/other/StoreClient.java | 6 cloud-server-management/src/main/java/com/dsh/course/mapper/TOperatorAuthWxMapper.java | 20 cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java | 65 + cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/OperatorUser_proportionAuth_infoWX.html | 480 ++++++++ cloud-server-competition/src/main/java/com/dsh/competition/feignclient/other/StoreClient.java | 6 cloud-server-other/src/main/java/com/dsh/other/controller/GameController.java | 65 + cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java | 42 cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/WeChatUtil.java | 336 ++-- cloud-server-other/src/main/java/com/dsh/other/feignclient/StoreClient.java | 7 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/OperatorUserController.java | 59 - cloud-server-account/src/main/java/com/dsh/account/service/impl/TAppUserServiceImpl.java | 3 cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java | 68 + cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackagePaymentServiceImpl.java | 82 + cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/AutoUpdateVerifierTest.java | 117 ++ cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/OperatorAuth.java | 59 cloud-server-account/src/main/java/com/dsh/account/service/impl/RechargeRecordsServiceImpl.java | 2 cloud-server-account/src/main/java/com/dsh/account/feignclient/other/StoreClient.java | 7 cloud-server-management/src/main/webapp/static/modular/system/operatorUser/operatorUser.js | 294 ++++ cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TOperatorUserServiceImpl.java | 5 36 files changed, 3,032 insertions(+), 354 deletions(-) diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/other/StoreClient.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/other/StoreClient.java index e3bb3b9..9bb1712 100644 --- a/cloud-server-account/src/main/java/com/dsh/account/feignclient/other/StoreClient.java +++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/other/StoreClient.java @@ -12,7 +12,12 @@ @FeignClient(value = "mb-cloud-other") public interface StoreClient { - + /** + * 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例 + * @return + */ + @PostMapping("/base/getProportionByOperatorId") + String getProportionByOperatorId(Integer id); /** * 根据运营商id获取对应运营商商户号 * @return diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/impl/RechargeRecordsServiceImpl.java b/cloud-server-account/src/main/java/com/dsh/account/service/impl/RechargeRecordsServiceImpl.java index ca8c34c..f9eb7cc 100644 --- a/cloud-server-account/src/main/java/com/dsh/account/service/impl/RechargeRecordsServiceImpl.java +++ b/cloud-server-account/src/main/java/com/dsh/account/service/impl/RechargeRecordsServiceImpl.java @@ -342,7 +342,7 @@ records.setPayTime(new Date()); records.setOrderNumber(tradeNo); rereMapper.updateById(records); - + payMoneyUtil.confirm(smid,code,tradeNo,amount.toString()); RechargeRecords rechargeRecords = rereMapper.selectOne(new QueryWrapper<RechargeRecords>() .eq("code", code)); if (rechargeRecords.getPayStatus() == 2) { diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/impl/TAppUserServiceImpl.java b/cloud-server-account/src/main/java/com/dsh/account/service/impl/TAppUserServiceImpl.java index 979be10..7409473 100644 --- a/cloud-server-account/src/main/java/com/dsh/account/service/impl/TAppUserServiceImpl.java +++ b/cloud-server-account/src/main/java/com/dsh/account/service/impl/TAppUserServiceImpl.java @@ -1768,6 +1768,7 @@ user.setIntegral(user.getIntegral() - userCouponPayment1.getIntegral().intValue()); appUserService.updateById(user); } + payMoneyUtil.confirm(smid,code,tradeNo,cash.toString()); break; @@ -1888,6 +1889,8 @@ userPointsMerchandise.setInsertTime(null); userPointsMerchandise.setUserId(null); mcClient.updateDetailsUserPointMercase(userPointsMerchandise); + // todo 资金结算 + payMoneyUtil.confirm(smid,code,tradeNo,cash.toString()); } moneyOut(tradeNo, tradeNo); break; diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java b/cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java index 6fabab4..3d5e3f9 100644 --- a/cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java +++ b/cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java @@ -1,5 +1,9 @@ package com.dsh.account.service.impl; +import com.alipay.api.AlipayClient; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.request.AlipayTradeOrderSettleRequest; +import com.alipay.api.response.AlipayTradeOrderSettleResponse; import com.alipay.api.response.AlipayTradeQueryResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -541,14 +545,19 @@ Integer storeId = coursePackage.getStoreId(); Store store = storeClient.queryStoreById(storeId); String smid1= ""; - if (store.getOperatorId()==null){ + if (store.getOperatorId()==null || store.getOperatorId() == 0){ // 平台 smid1 = smid; + // 属于平台 不做资金冻结 不做分账处理 + payMoneyUtil.confirm(smid1,code,tradeNo,amount.toString()); }else{ String smidByOperatorId = storeClient.getSMIDByOperatorId(store.getOperatorId()); smid1 = smidByOperatorId; + payMoneyUtil.confirm1(smid1,code,tradeNo,amount.toString()); + // 分账处理 + extracted(store.getOperatorId(), amount, tradeNo); } - payMoneyUtil.confirm(smid1,code,tradeNo,amount.toString()); + break; } if ("WAIT_BUYER_PAY".equals(tradeStatus)) { @@ -564,7 +573,51 @@ } return alipay; } - + private void extracted(Integer operatorId, BigDecimal coursePackageOrder1, String tradeNo) throws Exception { + // 分账 + AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", + "2021004105665036", + "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCi5i9nW/hGLJ3A06cZxTQdviFC7THpdSihoTYGLr9q006hu0V26ecBMY/o4w5bvIX0Ok/yofmZsVcCJpAPvbXL/uqVrIjnRRxXiaeBFThlxoBUTdunvbUSDYfzlEhJr5NvUKI6H6lz2niXlQGx4qy8Hau4ccWit9kM8jwUvsBVQoFgJA+xrjMvooA7YLopQtpOD+UJr5thApTSf1xrnr1W12yolTLEH15JmNV372cqXrYUuqnY0QsaPtxeqJUGAOcGdVLllQ7easEznP8DFBvDdHATcmp2SHNQDUEWN6MCVPbMgY06NQVqAXxqjTAYSVh+6TRu6bofPmpYC3TZB003AgMBAAECggEBAJAcR2+PA3NBYUYHeFrqBRMS8uX8ZR19kjZ7IgoSLTFaQsP9opRylPSPXhrPVBKAE5leRQAHn4MCSlESwHvMfxo7KFjFTFAc6dffZZpipYQUOc9bGampwJh58/3e/pyBgVMG6J23CPf/HJQtNFSkjd/V9+ayb/9l2dUEL3bC0fAZ/dbx8HsxdLw8wn3fLlWLj68hOMqa2deCZe3JdSVsPbeWqkh56FFsMLug0Nd+Ar4TgRl9/jnhXF0JWiD0LmPUYLhboY7EfUBzN4w1iYbDi1P+3zvoOYsiVKAXox9GMhQ2VzOO2UcSTuizSza2e98mGpabl/GpKmCz+RDFjtkX6eECgYEA2MyCij65eO3aGIm3FUe93DULRBYTfX8qJQSJq2WOWA3mmQlEW6L3O2B5/lG2h+8WmN6iLEs9eHpgycGYp7vAqgrANEn16ACVcuyx0scFtrZfZ+kmHMzFfiUWxJjVYk/6YngsGVBLdw6ueM42C8TTP67X9tU5TdVGoGWuqEj4W98CgYEAwFqwprXOch5Pqk/RPbb49r0Ou03K/UbciWnWWKzUhFFNS8MdlQPoDvQZbMwHLeWsa2VhaKITK3x5biLQb3U+0GLOn6lTvEyrEUH+ucREyLgVYTRAvwBPtnvlrzpyxPk2HnslQjju8WrvvLLBMKWUjlTrTOzhaHT21gz3pHMiOakCgYEAhLmfaXdBITGshb054sNLDtdCkGpbgEcrzAHdLps769iGxkYQHXHFngpQZUwtTUcoNGqIKknd1jZFrv7gsD+XkgKG7PwimehRlkwmCX5ilxtLiVgJRzRt6+5U5AMVD90a0tHzXYP0z2yjj73fBJF5KtGl0a10KZxaYrQdm1UhB00CgYBZZgzx/k9rtHC8LAqIj1CYhHejT92G53c6Gkl3vyOqN4sgKhfGmSEySfrDGPRBPZxr8ZtbIPCd5mUdberH0osWGMYFaJI1UsCy7aQwvGpniz7MhZeN7dweaOjwDs8mgtjHQ96mL4XGCDhR0BZ/wIURvZ/6iaGdhbbu9unlsWj3uQKBgQCmZYdsbbZkd3ev6f8rwyvMz+DrCQyYpY44cegBYuJgrZiQnL2fJioeN7ixX0UM48SfwsZEIrzshP/LGAwnc2MdjxKUl4jLN8SEe0NAjXOnz9Zaw740+aOmLpXcLWdP4uM2gIhWsvW1tEkQZCXmm7c9s/RsU8Pmzv+YL3+fSijOzA==", + "json", "GBK", + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmu8n/4yTHWbn7VOrNc9OsLtDL1bEQ8gC1dHkj8Wy5z0mkaOsjJRIG/28ze12M0V8jdCKuuDr5Z1OPKiqf+XO3ypguEh+mYUVMBM/cZodDFQfTY1TKLWjvQCuaqlA+QUTCK6f7T7stsgyQ1o9Jj0rXZDz6PM4QHSTzjrLIBaeqM5WIBvH+fy/X+QG5Utd+/UT0kc0JyvuKhZ65yVUd/C9VcwJJAPliRsAQNrqYterwAJ9zvw9tF11wj9W0XgJ8Ccu4x3gR1vrlLRJJo/OA97RmxPQ+5hSacWQZCUd1dwiBq+YCrKVHGTj14izRHXrLc0yBlRXo7tBOIqcy3IsvKVthQIDAQAB", + "RSA2"); + AlipayTradeOrderSettleRequest request = new AlipayTradeOrderSettleRequest(); + String randomCode = UUIDUtil.getRandomCode(16); + String proportionByOperatorId1 = storeClient.getProportionByOperatorId(operatorId); + // 支付宝分账比例 + String s1 = proportionByOperatorId1.split(",")[1]; + double i = Double.parseDouble(s1); + double v = i * 0.01; + BigDecimal bigDecimal1 = new BigDecimal(String.valueOf(v)); + // 分账金额 + BigDecimal bigDecimal2 = coursePackageOrder1.multiply(bigDecimal1).setScale(2, RoundingMode.DOWN); + request.setBizContent("{" + + " \"out_request_no\":\"" + randomCode + "\"," + + " \"trade_no\":\"" + tradeNo + "\"," + + " \"royalty_parameters\":[" + + " {" + + " \"royalty_type\":\"transfer\"," + + " \"trans_out\":\"" + storeClient.getSMIDByOperatorId(operatorId)+ "\"," + + " \"trans_out_type\":\"userId\"," + + " \"trans_in_type\":\"userId\"," + + " \"trans_in\":\"" + smid + "\"," + + " \"amount\":" + bigDecimal2 + "," + + " \"desc\":\"平台服务费\"," + + " \"royalty_scene\":\"平台服务费\"," + + " }" + + " ]," + + " \"extend_params\":{" + + " \"royalty_finish\":\"true\"" + + " }," + + " \"royalty_mode\":\"async\"" + + "}"); + AlipayTradeOrderSettleResponse response = alipayClient.execute(request); + if (response.isSuccess()) { + System.out.println("调用成功"); + } else { + System.out.println("调用失败"); + } + } public int PlaypaiGoldPayment(String code, ClasspaymentRequest request) { PlayPaiGoldCoursePackage paiGoldCoursePackage = new PlayPaiGoldCoursePackage(); paiGoldCoursePackage.setCoursePackageId(request.getLessonId()); diff --git a/cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java b/cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java index 045db5c..a6ecc8a 100644 --- a/cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java +++ b/cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java @@ -299,7 +299,47 @@ return ResultUtil.error("出现问题啦"); } } - + // 资金冻结 做分账处理 + public ResultUtil confirm1(String smid,String code, String outTradeNo, String amount) { + AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", + aliAppid, + appPrivateKey, + "json", + "GBK", + alipay_public_key, + "RSA2"); + AlipayTradeSettleConfirmRequest request = new AlipayTradeSettleConfirmRequest(); + request.setBizContent("{" + + " \"out_request_no\":\""+code+"\"," + + " \"trade_no\":\""+outTradeNo+"\"," + + " \"settle_info\":{" + + " \"settle_detail_infos\":[" + + " {" + + " \"trans_in_type\":\"defaultSettle\"," + + " \"settle_entity_id\":\""+smid+"\"," + + " \"settle_entity_type\":\"SecondMerchant\"," + + " \"amount\":"+amount+"," + + " }" + + " ]" + + " }," + + " \"extend_params\":{" + + " \"royalty_freeze\":\"true\"" + + " }" + + "}"); + AlipayTradeSettleConfirmResponse response = null; + try { + response = alipayClient.execute(request); + } catch (AlipayApiException e) { + e.printStackTrace(); + } + if(response.isSuccess()){ + System.out.println("调用成功"); + return ResultUtil.success(); + } else { + System.out.println("调用失败"); + return ResultUtil.error("出现问题啦"); + } + } /** * 支付成功后的回调处理逻辑 * diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/feignclient/other/StoreClient.java b/cloud-server-competition/src/main/java/com/dsh/competition/feignclient/other/StoreClient.java index 9e9a07d..dce59d7 100644 --- a/cloud-server-competition/src/main/java/com/dsh/competition/feignclient/other/StoreClient.java +++ b/cloud-server-competition/src/main/java/com/dsh/competition/feignclient/other/StoreClient.java @@ -14,6 +14,12 @@ @FeignClient("mb-cloud-other") public interface StoreClient { /** + * 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例 + * @return + */ + @PostMapping("/base/getProportionByOperatorId") + String getProportionByOperatorId(Integer id); + /** * 根据运营商id获取对应运营商商户号 * @return */ diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java b/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java index 81c645a..d676eaf 100644 --- a/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java +++ b/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java @@ -302,13 +302,13 @@ // 判断当前赛事属于哪个运营商 Competition byId = competitionService.getById(paymentCompetitionVo.getId()); Integer operatorId = byId.getOperatorId(); - if (operatorId == null ){ + if (operatorId == null || operatorId == 0 ){ // 说明是平台 - return aliPaymentCompetition(smid,code, money); + return aliPaymentCompetition(operatorId,smid,code, money); } // 获取该运营商的商户号 String smid = storeClient.getSMIDByOperatorId(operatorId); - return aliPaymentCompetition(smid,code, money); + return aliPaymentCompetition(operatorId,smid,code, money); } if (paymentCompetitionVo.getPayType() == 3) {//玩湃币 appUser.setPlayPaiCoins(appUser.getPlayPaiCoins() - money.intValue()); @@ -426,7 +426,7 @@ * @return * @throws Exception */ - public ResultUtil aliPaymentCompetition(String smid,String code, BigDecimal money) throws Exception { + public ResultUtil aliPaymentCompetition(Integer operatorId,String smid,String code, BigDecimal money) throws Exception { ResultUtil alipay = payMoneyUtil.alipay (smid,"报名赛事", "", "", code, money.toString(), "/base/competition/aliPaymentCompetitionCallback"); if (alipay.getCode() == 200) { @@ -471,8 +471,16 @@ paymentCompetition.setPayTime(new Date()); paymentCompetition.setPayOrderNo(tradeNo); paymentCompetitionService.updateById(paymentCompetition); + if (operatorId == null || operatorId == 0){ + // 属于平台的赛事 资金不做冻结 不做分账处理 + payMoneyUtil.confirm1(smid,code,tradeNo,money.toString()); + }else{ + // 资金冻结 + payMoneyUtil.confirm(smid,code,tradeNo,money.toString()); + // 分账处理 + extracted(operatorId, money, tradeNo); + } // 结算资金到商户账号 - payMoneyUtil.confirm(smid,code,tradeNo,money.toString()); //分账 // moneyOut(tradeNo, tradeNo,code); break; @@ -490,7 +498,52 @@ } return alipay; } - + private void extracted(Integer operatorId, BigDecimal money, String tradeNo) throws Exception { + // 分账 + AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", + "2021004105665036", + "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCi5i9nW/hGLJ3A06cZxTQdviFC7THpdSihoTYGLr9q006hu0V26ecBMY/o4w5bvIX0Ok/yofmZsVcCJpAPvbXL/uqVrIjnRRxXiaeBFThlxoBUTdunvbUSDYfzlEhJr5NvUKI6H6lz2niXlQGx4qy8Hau4ccWit9kM8jwUvsBVQoFgJA+xrjMvooA7YLopQtpOD+UJr5thApTSf1xrnr1W12yolTLEH15JmNV372cqXrYUuqnY0QsaPtxeqJUGAOcGdVLllQ7easEznP8DFBvDdHATcmp2SHNQDUEWN6MCVPbMgY06NQVqAXxqjTAYSVh+6TRu6bofPmpYC3TZB003AgMBAAECggEBAJAcR2+PA3NBYUYHeFrqBRMS8uX8ZR19kjZ7IgoSLTFaQsP9opRylPSPXhrPVBKAE5leRQAHn4MCSlESwHvMfxo7KFjFTFAc6dffZZpipYQUOc9bGampwJh58/3e/pyBgVMG6J23CPf/HJQtNFSkjd/V9+ayb/9l2dUEL3bC0fAZ/dbx8HsxdLw8wn3fLlWLj68hOMqa2deCZe3JdSVsPbeWqkh56FFsMLug0Nd+Ar4TgRl9/jnhXF0JWiD0LmPUYLhboY7EfUBzN4w1iYbDi1P+3zvoOYsiVKAXox9GMhQ2VzOO2UcSTuizSza2e98mGpabl/GpKmCz+RDFjtkX6eECgYEA2MyCij65eO3aGIm3FUe93DULRBYTfX8qJQSJq2WOWA3mmQlEW6L3O2B5/lG2h+8WmN6iLEs9eHpgycGYp7vAqgrANEn16ACVcuyx0scFtrZfZ+kmHMzFfiUWxJjVYk/6YngsGVBLdw6ueM42C8TTP67X9tU5TdVGoGWuqEj4W98CgYEAwFqwprXOch5Pqk/RPbb49r0Ou03K/UbciWnWWKzUhFFNS8MdlQPoDvQZbMwHLeWsa2VhaKITK3x5biLQb3U+0GLOn6lTvEyrEUH+ucREyLgVYTRAvwBPtnvlrzpyxPk2HnslQjju8WrvvLLBMKWUjlTrTOzhaHT21gz3pHMiOakCgYEAhLmfaXdBITGshb054sNLDtdCkGpbgEcrzAHdLps769iGxkYQHXHFngpQZUwtTUcoNGqIKknd1jZFrv7gsD+XkgKG7PwimehRlkwmCX5ilxtLiVgJRzRt6+5U5AMVD90a0tHzXYP0z2yjj73fBJF5KtGl0a10KZxaYrQdm1UhB00CgYBZZgzx/k9rtHC8LAqIj1CYhHejT92G53c6Gkl3vyOqN4sgKhfGmSEySfrDGPRBPZxr8ZtbIPCd5mUdberH0osWGMYFaJI1UsCy7aQwvGpniz7MhZeN7dweaOjwDs8mgtjHQ96mL4XGCDhR0BZ/wIURvZ/6iaGdhbbu9unlsWj3uQKBgQCmZYdsbbZkd3ev6f8rwyvMz+DrCQyYpY44cegBYuJgrZiQnL2fJioeN7ixX0UM48SfwsZEIrzshP/LGAwnc2MdjxKUl4jLN8SEe0NAjXOnz9Zaw740+aOmLpXcLWdP4uM2gIhWsvW1tEkQZCXmm7c9s/RsU8Pmzv+YL3+fSijOzA==", + "json", "GBK", + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmu8n/4yTHWbn7VOrNc9OsLtDL1bEQ8gC1dHkj8Wy5z0mkaOsjJRIG/28ze12M0V8jdCKuuDr5Z1OPKiqf+XO3ypguEh+mYUVMBM/cZodDFQfTY1TKLWjvQCuaqlA+QUTCK6f7T7stsgyQ1o9Jj0rXZDz6PM4QHSTzjrLIBaeqM5WIBvH+fy/X+QG5Utd+/UT0kc0JyvuKhZ65yVUd/C9VcwJJAPliRsAQNrqYterwAJ9zvw9tF11wj9W0XgJ8Ccu4x3gR1vrlLRJJo/OA97RmxPQ+5hSacWQZCUd1dwiBq+YCrKVHGTj14izRHXrLc0yBlRXo7tBOIqcy3IsvKVthQIDAQAB", + "RSA2"); + AlipayTradeOrderSettleRequest request = new AlipayTradeOrderSettleRequest(); + String randomCode = UUIDUtil.getRandomCode(16); + String proportionByOperatorId = storeClient.getProportionByOperatorId(operatorId); + // 支付宝分账比例 + String s1 = proportionByOperatorId.split(",")[1]; + double i = Double.parseDouble(s1); + double v = i * 0.01; + BigDecimal bigDecimal1 = new BigDecimal(String.valueOf(v)); + BigDecimal cashPayment = money; + // 分账金额 + BigDecimal bigDecimal2 = cashPayment.multiply(bigDecimal1).setScale(2, RoundingMode.DOWN); + request.setBizContent("{" + + " \"out_request_no\":\"" + randomCode + "\"," + + " \"trade_no\":\"" + tradeNo + "\"," + + " \"royalty_parameters\":[" + + " {" + + " \"royalty_type\":\"transfer\"," + + " \"trans_out\":\"" + storeClient.getSMIDByOperatorId(operatorId) + "\"," + + " \"trans_out_type\":\"userId\"," + + " \"trans_in_type\":\"userId\"," + + " \"trans_in\":\"" + smid + "\"," + + " \"amount\":" + bigDecimal2 + "," + + " \"desc\":\"平台服务费\"," + + " \"royalty_scene\":\"平台服务费\"," + + " }" + + " ]," + + " \"extend_params\":{" + + " \"royalty_finish\":\"true\"" + + " }," + + " \"royalty_mode\":\"async\"" + + "}"); + AlipayTradeOrderSettleResponse response = alipayClient.execute(request); + if (response.isSuccess()) { + System.out.println("调用成功"); + } else { + System.out.println("调用失败"); + } + } // @Autowired //private IPaymentCompetitionService paymentCompetitionService; diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/util/PayMoneyUtil.java b/cloud-server-competition/src/main/java/com/dsh/competition/util/PayMoneyUtil.java index 3c5e8eb..981959d 100644 --- a/cloud-server-competition/src/main/java/com/dsh/competition/util/PayMoneyUtil.java +++ b/cloud-server-competition/src/main/java/com/dsh/competition/util/PayMoneyUtil.java @@ -320,6 +320,47 @@ " ]" + " }," + " \"extend_params\":{" + + " \"royalty_freeze\":\"true\"" + + " }" + + "}"); + AlipayTradeSettleConfirmResponse response = null; + try { + response = alipayClient.execute(request); + } catch (AlipayApiException e) { + e.printStackTrace(); + } + if(response.isSuccess()){ + System.out.println("调用成功"); + return ResultUtil.success(); + } else { + System.out.println("调用失败"); + return ResultUtil.error("出现问题啦"); + } + } + // 属于平台的运营商 因为无需分账不冻结资金 + public ResultUtil confirm1(String smid,String code, String outTradeNo, String amount) { + AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", + aliAppid, + appPrivateKey, + "json", + "GBK", + alipay_public_key, + "RSA2"); + AlipayTradeSettleConfirmRequest request = new AlipayTradeSettleConfirmRequest(); + request.setBizContent("{" + + " \"out_request_no\":\""+code+"\"," + + " \"trade_no\":\""+outTradeNo+"\"," + + " \"settle_info\":{" + + " \"settle_detail_infos\":[" + + " {" + + " \"trans_in_type\":\"defaultSettle\"," + + " \"settle_entity_id\":\""+smid+"\"," + + " \"settle_entity_type\":\"SecondMerchant\"," + + " \"amount\":"+amount+"," + + " }" + + " ]" + + " }," + + " \"extend_params\":{" + " \"royalty_freeze\":\"false\"" + " }" + "}"); @@ -337,7 +378,6 @@ return ResultUtil.error("出现问题啦"); } } - /** * 微信统一下单 * diff --git a/cloud-server-course/src/main/java/com/dsh/course/feignclient/other/StoreClient.java b/cloud-server-course/src/main/java/com/dsh/course/feignclient/other/StoreClient.java index 33df8b0..0b0f163 100644 --- a/cloud-server-course/src/main/java/com/dsh/course/feignclient/other/StoreClient.java +++ b/cloud-server-course/src/main/java/com/dsh/course/feignclient/other/StoreClient.java @@ -15,6 +15,12 @@ */ @FeignClient("mb-cloud-other") public interface StoreClient { + /** + * 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例 + * @return + */ + @PostMapping("/base/getProportionByOperatorId") + String getProportionByOperatorId(Integer id); /** * 根据运营商id获取对应运营商商户号 diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackagePaymentServiceImpl.java b/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackagePaymentServiceImpl.java index 96d6024..ea84796 100644 --- a/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackagePaymentServiceImpl.java +++ b/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackagePaymentServiceImpl.java @@ -6,7 +6,11 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayClient; +import com.alipay.api.DefaultAlipayClient; import com.alipay.api.domain.Person; +import com.alipay.api.request.AlipayTradeOrderSettleRequest; +import com.alipay.api.response.AlipayTradeOrderSettleResponse; import com.alipay.api.response.AlipayTradeQueryResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -50,6 +54,7 @@ import javax.annotation.Resource; import javax.persistence.criteria.CriteriaBuilder; import java.math.BigDecimal; +import java.math.BigInteger; import java.math.MathContext; import java.math.RoundingMode; import java.text.ParseException; @@ -955,7 +960,23 @@ } private String smid = "2088330203191220";//平台支付宝商户号 + public static void main(String[] args) { + BigDecimal bigDecimal = new BigDecimal("100"); + + + String s = "1"; + double v = Double.parseDouble(s); + double v1 = v * 0.01; + + BigDecimal bigDecimal1 = new BigDecimal(String.valueOf(v1)); + BigDecimal multiply = bigDecimal1.multiply(bigDecimal); + System.err.println(v); + System.err.println(v1); + System.err.println(multiply); + } public ResultUtil AlipayPayment(String code, BigDecimal request) { + // 二级商户商户号 + String smidUser; TCoursePackagePaymentMapper baseMapper1 = this.baseMapper; TCoursePackagePayment coursePackagePayment = baseMapper1.getCoursePackagePaymentByCode(code); // 判断这个课包属于哪个门店 属于哪个运营商 根据运营商 id 获取对应的商户号 @@ -1016,13 +1037,17 @@ TCoursePackage byId = coursePackageService.getById(coursePackageId); Store store = storeClient.queryStoreById(byId.getStoreId()); if (store.getOperatorId() == null ){ - // 说明是平台的门店 - payMoneyUtil.confirm(smid,code,tradeNo,request.toString()); + // 说明是平台的门店 无需冻结资金 不走分账 + payMoneyUtil.confirm1(smid,code,tradeNo,request.toString()); }else if (store.getOperatorId() == 0){ - payMoneyUtil.confirm(smid,code,tradeNo,request.toString()); + // 说明是平台的门店 + payMoneyUtil.confirm1(smid,code,tradeNo,request.toString()); + // 发起分账 + extracted(store, coursePackageOrder1, tradeNo); }else{ - String smid = storeClient.getSMIDByOperatorId(store.getOperatorId()); - payMoneyUtil.confirm(smid,code,tradeNo,request.toString()); + payMoneyUtil.confirm(storeClient.getSMIDByOperatorId(store.getOperatorId()),code,tradeNo,request.toString()); + // 发起分账 + extracted(store, coursePackageOrder1, tradeNo); } break; } @@ -1040,6 +1065,53 @@ return alipay; } + private void extracted(Store store, CoursePackageOrder coursePackageOrder1, String tradeNo) throws Exception { + // 分账 + AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", + "2021004105665036", + "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCi5i9nW/hGLJ3A06cZxTQdviFC7THpdSihoTYGLr9q006hu0V26ecBMY/o4w5bvIX0Ok/yofmZsVcCJpAPvbXL/uqVrIjnRRxXiaeBFThlxoBUTdunvbUSDYfzlEhJr5NvUKI6H6lz2niXlQGx4qy8Hau4ccWit9kM8jwUvsBVQoFgJA+xrjMvooA7YLopQtpOD+UJr5thApTSf1xrnr1W12yolTLEH15JmNV372cqXrYUuqnY0QsaPtxeqJUGAOcGdVLllQ7easEznP8DFBvDdHATcmp2SHNQDUEWN6MCVPbMgY06NQVqAXxqjTAYSVh+6TRu6bofPmpYC3TZB003AgMBAAECggEBAJAcR2+PA3NBYUYHeFrqBRMS8uX8ZR19kjZ7IgoSLTFaQsP9opRylPSPXhrPVBKAE5leRQAHn4MCSlESwHvMfxo7KFjFTFAc6dffZZpipYQUOc9bGampwJh58/3e/pyBgVMG6J23CPf/HJQtNFSkjd/V9+ayb/9l2dUEL3bC0fAZ/dbx8HsxdLw8wn3fLlWLj68hOMqa2deCZe3JdSVsPbeWqkh56FFsMLug0Nd+Ar4TgRl9/jnhXF0JWiD0LmPUYLhboY7EfUBzN4w1iYbDi1P+3zvoOYsiVKAXox9GMhQ2VzOO2UcSTuizSza2e98mGpabl/GpKmCz+RDFjtkX6eECgYEA2MyCij65eO3aGIm3FUe93DULRBYTfX8qJQSJq2WOWA3mmQlEW6L3O2B5/lG2h+8WmN6iLEs9eHpgycGYp7vAqgrANEn16ACVcuyx0scFtrZfZ+kmHMzFfiUWxJjVYk/6YngsGVBLdw6ueM42C8TTP67X9tU5TdVGoGWuqEj4W98CgYEAwFqwprXOch5Pqk/RPbb49r0Ou03K/UbciWnWWKzUhFFNS8MdlQPoDvQZbMwHLeWsa2VhaKITK3x5biLQb3U+0GLOn6lTvEyrEUH+ucREyLgVYTRAvwBPtnvlrzpyxPk2HnslQjju8WrvvLLBMKWUjlTrTOzhaHT21gz3pHMiOakCgYEAhLmfaXdBITGshb054sNLDtdCkGpbgEcrzAHdLps769iGxkYQHXHFngpQZUwtTUcoNGqIKknd1jZFrv7gsD+XkgKG7PwimehRlkwmCX5ilxtLiVgJRzRt6+5U5AMVD90a0tHzXYP0z2yjj73fBJF5KtGl0a10KZxaYrQdm1UhB00CgYBZZgzx/k9rtHC8LAqIj1CYhHejT92G53c6Gkl3vyOqN4sgKhfGmSEySfrDGPRBPZxr8ZtbIPCd5mUdberH0osWGMYFaJI1UsCy7aQwvGpniz7MhZeN7dweaOjwDs8mgtjHQ96mL4XGCDhR0BZ/wIURvZ/6iaGdhbbu9unlsWj3uQKBgQCmZYdsbbZkd3ev6f8rwyvMz+DrCQyYpY44cegBYuJgrZiQnL2fJioeN7ixX0UM48SfwsZEIrzshP/LGAwnc2MdjxKUl4jLN8SEe0NAjXOnz9Zaw740+aOmLpXcLWdP4uM2gIhWsvW1tEkQZCXmm7c9s/RsU8Pmzv+YL3+fSijOzA==", + "json", "GBK", + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmu8n/4yTHWbn7VOrNc9OsLtDL1bEQ8gC1dHkj8Wy5z0mkaOsjJRIG/28ze12M0V8jdCKuuDr5Z1OPKiqf+XO3ypguEh+mYUVMBM/cZodDFQfTY1TKLWjvQCuaqlA+QUTCK6f7T7stsgyQ1o9Jj0rXZDz6PM4QHSTzjrLIBaeqM5WIBvH+fy/X+QG5Utd+/UT0kc0JyvuKhZ65yVUd/C9VcwJJAPliRsAQNrqYterwAJ9zvw9tF11wj9W0XgJ8Ccu4x3gR1vrlLRJJo/OA97RmxPQ+5hSacWQZCUd1dwiBq+YCrKVHGTj14izRHXrLc0yBlRXo7tBOIqcy3IsvKVthQIDAQAB", + "RSA2"); + AlipayTradeOrderSettleRequest request = new AlipayTradeOrderSettleRequest(); + String randomCode = UUIDUtil.getRandomCode(16); + String proportionByOperatorId = storeClient.getProportionByOperatorId(store.getOperatorId()); + // 支付宝分账比例 + String s1 = proportionByOperatorId.split(",")[1]; + double i = Double.parseDouble(s1); + double v = i * 0.01; + BigDecimal bigDecimal1 = new BigDecimal(String.valueOf(v)); + BigDecimal cashPayment = coursePackageOrder1.getCashPayment(); + // 分账金额 + BigDecimal bigDecimal2 = cashPayment.multiply(bigDecimal1).setScale(2, RoundingMode.DOWN); + request.setBizContent("{" + + " \"out_request_no\":\"" + randomCode + "\"," + + " \"trade_no\":\"" + tradeNo + "\"," + + " \"royalty_parameters\":[" + + " {" + + " \"royalty_type\":\"transfer\"," + + " \"trans_out\":\"" + storeClient.getSMIDByOperatorId(store.getOperatorId()) + "\"," + + " \"trans_out_type\":\"userId\"," + + " \"trans_in_type\":\"userId\"," + + " \"trans_in\":\"" + smid + "\"," + + " \"amount\":" + bigDecimal2 + "," + + " \"desc\":\"平台服务费\"," + + " \"royalty_scene\":\"平台服务费\"," + + " }" + + " ]," + + " \"extend_params\":{" + + " \"royalty_finish\":\"true\"" + + " }," + + " \"royalty_mode\":\"async\"" + + "}"); + AlipayTradeOrderSettleResponse response = alipayClient.execute(request); + if (response.isSuccess()) { + System.out.println("调用成功"); + } else { + System.out.println("调用失败"); + } + } + public ResultUtil PlaypaiGoldPayment(AppUser appUser, String code, Integer wpGold) { TCoursePackagePayment packagePayment = this.baseMapper.selectOne(new QueryWrapper<TCoursePackagePayment>() .eq("code", code)); diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java b/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java index 91166ec..736c129 100644 --- a/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java +++ b/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java @@ -1116,18 +1116,21 @@ Integer operatorId = store.getOperatorId(); if (operatorId==null){ String smid ="2088330203191220"; - // 说明是平台的 - payMoneyUtil.confirm(smid,finalCode,tradeNo,paymentPrice.toString()); + // 说明是平台的 不走分账 +// payMoneyUtil.confirm(smid,finalCode,tradeNo,paymentPrice.toString()); + payMoneyUtil.confirm1(smid,finalCode,tradeNo,paymentPrice.toString()); break; }else if (operatorId==0){ String smid ="2088330203191220"; // 说明是平台的 - payMoneyUtil.confirm(smid,finalCode,tradeNo,paymentPrice.toString()); + payMoneyUtil.confirm1(smid,finalCode,tradeNo,paymentPrice.toString()); break; }else{ // 当前课程不属于门店 查询这个课程属于哪个门店 属于哪个运营商 String smidByOperatorId = storeClient.getSMIDByOperatorId(operatorId); payMoneyUtil.confirm(smidByOperatorId,finalCode,tradeNo,paymentPrice.toString()); + // 分账处理 + extracted(store, coursePackageOrder1, tradeNo); break; } } @@ -1145,7 +1148,52 @@ return alipay; } - + private void extracted(Store store, CoursePackageOrder coursePackageOrder1, String tradeNo) throws Exception { + // 分账 + AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", + "2021004105665036", + "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCi5i9nW/hGLJ3A06cZxTQdviFC7THpdSihoTYGLr9q006hu0V26ecBMY/o4w5bvIX0Ok/yofmZsVcCJpAPvbXL/uqVrIjnRRxXiaeBFThlxoBUTdunvbUSDYfzlEhJr5NvUKI6H6lz2niXlQGx4qy8Hau4ccWit9kM8jwUvsBVQoFgJA+xrjMvooA7YLopQtpOD+UJr5thApTSf1xrnr1W12yolTLEH15JmNV372cqXrYUuqnY0QsaPtxeqJUGAOcGdVLllQ7easEznP8DFBvDdHATcmp2SHNQDUEWN6MCVPbMgY06NQVqAXxqjTAYSVh+6TRu6bofPmpYC3TZB003AgMBAAECggEBAJAcR2+PA3NBYUYHeFrqBRMS8uX8ZR19kjZ7IgoSLTFaQsP9opRylPSPXhrPVBKAE5leRQAHn4MCSlESwHvMfxo7KFjFTFAc6dffZZpipYQUOc9bGampwJh58/3e/pyBgVMG6J23CPf/HJQtNFSkjd/V9+ayb/9l2dUEL3bC0fAZ/dbx8HsxdLw8wn3fLlWLj68hOMqa2deCZe3JdSVsPbeWqkh56FFsMLug0Nd+Ar4TgRl9/jnhXF0JWiD0LmPUYLhboY7EfUBzN4w1iYbDi1P+3zvoOYsiVKAXox9GMhQ2VzOO2UcSTuizSza2e98mGpabl/GpKmCz+RDFjtkX6eECgYEA2MyCij65eO3aGIm3FUe93DULRBYTfX8qJQSJq2WOWA3mmQlEW6L3O2B5/lG2h+8WmN6iLEs9eHpgycGYp7vAqgrANEn16ACVcuyx0scFtrZfZ+kmHMzFfiUWxJjVYk/6YngsGVBLdw6ueM42C8TTP67X9tU5TdVGoGWuqEj4W98CgYEAwFqwprXOch5Pqk/RPbb49r0Ou03K/UbciWnWWKzUhFFNS8MdlQPoDvQZbMwHLeWsa2VhaKITK3x5biLQb3U+0GLOn6lTvEyrEUH+ucREyLgVYTRAvwBPtnvlrzpyxPk2HnslQjju8WrvvLLBMKWUjlTrTOzhaHT21gz3pHMiOakCgYEAhLmfaXdBITGshb054sNLDtdCkGpbgEcrzAHdLps769iGxkYQHXHFngpQZUwtTUcoNGqIKknd1jZFrv7gsD+XkgKG7PwimehRlkwmCX5ilxtLiVgJRzRt6+5U5AMVD90a0tHzXYP0z2yjj73fBJF5KtGl0a10KZxaYrQdm1UhB00CgYBZZgzx/k9rtHC8LAqIj1CYhHejT92G53c6Gkl3vyOqN4sgKhfGmSEySfrDGPRBPZxr8ZtbIPCd5mUdberH0osWGMYFaJI1UsCy7aQwvGpniz7MhZeN7dweaOjwDs8mgtjHQ96mL4XGCDhR0BZ/wIURvZ/6iaGdhbbu9unlsWj3uQKBgQCmZYdsbbZkd3ev6f8rwyvMz+DrCQyYpY44cegBYuJgrZiQnL2fJioeN7ixX0UM48SfwsZEIrzshP/LGAwnc2MdjxKUl4jLN8SEe0NAjXOnz9Zaw740+aOmLpXcLWdP4uM2gIhWsvW1tEkQZCXmm7c9s/RsU8Pmzv+YL3+fSijOzA==", + "json", "GBK", + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmu8n/4yTHWbn7VOrNc9OsLtDL1bEQ8gC1dHkj8Wy5z0mkaOsjJRIG/28ze12M0V8jdCKuuDr5Z1OPKiqf+XO3ypguEh+mYUVMBM/cZodDFQfTY1TKLWjvQCuaqlA+QUTCK6f7T7stsgyQ1o9Jj0rXZDz6PM4QHSTzjrLIBaeqM5WIBvH+fy/X+QG5Utd+/UT0kc0JyvuKhZ65yVUd/C9VcwJJAPliRsAQNrqYterwAJ9zvw9tF11wj9W0XgJ8Ccu4x3gR1vrlLRJJo/OA97RmxPQ+5hSacWQZCUd1dwiBq+YCrKVHGTj14izRHXrLc0yBlRXo7tBOIqcy3IsvKVthQIDAQAB", + "RSA2"); + AlipayTradeOrderSettleRequest request = new AlipayTradeOrderSettleRequest(); + String randomCode = UUIDUtil.getRandomCode(16); + String proportionByOperatorId = storeClient.getProportionByOperatorId(store.getOperatorId()); + // 支付宝分账比例 + String s1 = proportionByOperatorId.split(",")[1]; + double i = Double.parseDouble(s1); + double v = i * 0.01; + BigDecimal bigDecimal1 = new BigDecimal(String.valueOf(v)); + BigDecimal cashPayment = coursePackageOrder1.getCashPayment(); + // 分账金额 + BigDecimal bigDecimal2 = cashPayment.multiply(bigDecimal1).setScale(2, RoundingMode.DOWN); + request.setBizContent("{" + + " \"out_request_no\":\"" + randomCode + "\"," + + " \"trade_no\":\"" + tradeNo + "\"," + + " \"royalty_parameters\":[" + + " {" + + " \"royalty_type\":\"transfer\"," + + " \"trans_out\":\"" + storeClient.getSMIDByOperatorId(store.getOperatorId()) + "\"," + + " \"trans_out_type\":\"userId\"," + + " \"trans_in_type\":\"userId\"," + + " \"trans_in\":\"" + smid + "\"," + + " \"amount\":" + bigDecimal2 + "," + + " \"desc\":\"平台服务费\"," + + " \"royalty_scene\":\"平台服务费\"," + + " }" + + " ]," + + " \"extend_params\":{" + + " \"royalty_finish\":\"true\"" + + " }," + + " \"royalty_mode\":\"async\"" + + "}"); + AlipayTradeOrderSettleResponse response = alipayClient.execute(request); + if (response.isSuccess()) { + System.out.println("调用成功"); + } else { + System.out.println("调用失败"); + } + } //分账 public void moneyOut(String outNum, String tradeNo,String code) throws AlipayApiException { AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", aliAppid, appPrivateKey, "json", "UTF-8", alipay_public_key, "RSA2"); diff --git a/cloud-server-course/src/main/java/com/dsh/course/util/PayMoneyUtil.java b/cloud-server-course/src/main/java/com/dsh/course/util/PayMoneyUtil.java index 5272413..339a751 100644 --- a/cloud-server-course/src/main/java/com/dsh/course/util/PayMoneyUtil.java +++ b/cloud-server-course/src/main/java/com/dsh/course/util/PayMoneyUtil.java @@ -110,6 +110,47 @@ return ResultUtil.error("出现问题啦"); } } + // 属于平台的运营商 因为无需分账不冻结资金 + public ResultUtil confirm1(String smid,String code, String outTradeNo, String amount) { + AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", + aliAppid, + appPrivateKey, + "json", + "GBK", + alipay_public_key, + "RSA2"); + AlipayTradeSettleConfirmRequest request = new AlipayTradeSettleConfirmRequest(); + request.setBizContent("{" + + " \"out_request_no\":\""+code+"\"," + + " \"trade_no\":\""+outTradeNo+"\"," + + " \"settle_info\":{" + + " \"settle_detail_infos\":[" + + " {" + + " \"trans_in_type\":\"defaultSettle\"," + + " \"settle_entity_id\":\""+smid+"\"," + + " \"settle_entity_type\":\"SecondMerchant\"," + + " \"amount\":"+amount+"," + + " }" + + " ]" + + " }," + + " \"extend_params\":{" + + " \"royalty_freeze\":\"false\"" + + " }" + + "}"); + AlipayTradeSettleConfirmResponse response = null; + try { + response = alipayClient.execute(request); + } catch (AlipayApiException e) { + e.printStackTrace(); + } + if(response.isSuccess()){ + System.out.println("调用成功"); + return ResultUtil.success(); + } else { + System.out.println("调用失败"); + return ResultUtil.error("出现问题啦"); + } + } /** * 支付宝支付 */ diff --git a/cloud-server-management/pom.xml b/cloud-server-management/pom.xml index 1446650..c49e6ae 100644 --- a/cloud-server-management/pom.xml +++ b/cloud-server-management/pom.xml @@ -14,6 +14,32 @@ <name>管理后台</name> <description>管理后台</description> <dependencies> + <!--微信商户认证图片上传--> + <dependency> + <groupId>com.github.wechatpay-apiv3</groupId> + <artifactId>wechatpay-java</artifactId> + <version>0.2.12</version> + </dependency> + <dependency> + <groupId>com.github.wechatpay-apiv3</groupId> + <artifactId>wechatpay-apache-httpclient</artifactId> + <version>0.4.9</version> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-test</artifactId> + <version>5.3.9</version> + </dependency> + <dependency> + <groupId>com.google.zxing</groupId> + <artifactId>core</artifactId> + <version>3.4.1</version> + </dependency> + <dependency> + <groupId>com.google.zxing</groupId> + <artifactId>javase</artifactId> + <version>3.4.1</version> + </dependency> <!--处理json--> <dependency> <groupId>org.json</groupId> @@ -65,8 +91,8 @@ </dependency> <dependency> - <groupId>cn.mb.cloud</groupId> - <artifactId>mb-cloud-common-sentinel</artifactId> + <groupId>cn.mb.cloud</groupId> + <artifactId>mb-cloud-common-sentinel</artifactId> </dependency> <dependency> @@ -155,9 +181,9 @@ <classifier>jdk15</classifier> </dependency> <dependency> - <groupId>com.baomidou</groupId> - <artifactId>kaptcha-spring-boot-starter</artifactId> - <version>1.1.0</version> + <groupId>com.baomidou</groupId> + <artifactId>kaptcha-spring-boot-starter</artifactId> + <version>1.1.0</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> @@ -253,7 +279,17 @@ <version>4.5.0</version> </dependency> - + <!--二维码--> + <dependency> + <groupId>com.google.zxing</groupId> + <artifactId>core</artifactId> + <version>3.3.0</version> + </dependency> + <dependency> + <groupId>com.google.zxing</groupId> + <artifactId>javase</artifactId> + <version>3.3.0</version> + </dependency> </dependencies> <build> @@ -317,4 +353,4 @@ </repositories> -</project> +</project> \ No newline at end of file diff --git a/cloud-server-management/src/main/java/com/dsh/course/mapper/CarInsuranceMapper.java b/cloud-server-management/src/main/java/com/dsh/course/mapper/CarInsuranceMapper.java index 3be0de9..4fb41a9 100644 --- a/cloud-server-management/src/main/java/com/dsh/course/mapper/CarInsuranceMapper.java +++ b/cloud-server-management/src/main/java/com/dsh/course/mapper/CarInsuranceMapper.java @@ -2,11 +2,13 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dsh.guns.modular.system.model.CarInsurance; +import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; +@Mapper public interface CarInsuranceMapper extends BaseMapper<CarInsurance> { diff --git a/cloud-server-management/src/main/java/com/dsh/course/mapper/TOperatorAuthWxMapper.java b/cloud-server-management/src/main/java/com/dsh/course/mapper/TOperatorAuthWxMapper.java new file mode 100644 index 0000000..bb8dac4 --- /dev/null +++ b/cloud-server-management/src/main/java/com/dsh/course/mapper/TOperatorAuthWxMapper.java @@ -0,0 +1,20 @@ +package com.dsh.course.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dsh.guns.modular.system.model.OperatorAuth; +import com.dsh.guns.modular.system.model.OperatorAuthAlipay; +import org.apache.ibatis.annotations.Mapper; + +/** + * <p> + * Mapper 接口 + * </p> + * + * @author administrator + * @since 2023-09-19 + */ +@Mapper +public interface TOperatorAuthWxMapper extends BaseMapper<OperatorAuth> { + +} diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/OperatorController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/OperatorController.java index cd434d7..0b44a40 100644 --- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/OperatorController.java +++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/OperatorController.java @@ -19,6 +19,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.dsh.course.feignClient.account.model.Coach; +import com.dsh.course.mapper.TOperatorAuthWxMapper; import com.dsh.guns.core.base.controller.BaseController; import com.dsh.guns.core.common.constant.factory.PageFactory; import com.dsh.guns.core.util.SinataUtil; @@ -26,20 +27,43 @@ import com.dsh.guns.modular.system.model.*; import com.dsh.guns.modular.system.service.*; +import com.dsh.guns.modular.system.util.AutoUpdateVerifierTest; import com.dsh.guns.modular.system.util.HttpRequestUtil; import com.dsh.guns.modular.system.util.PayMoneyUtil; import com.dsh.guns.modular.system.util.ResultUtil; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.databind.ObjectMapper; import com.github.binarywang.wxpay.service.BankService; +import com.github.binarywang.wxpay.v3.WechatPayUploadHttpPost; import com.mysql.cj.x.protobuf.MysqlxExpr; +import com.sun.org.apache.bcel.internal.generic.NEW; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; import org.apache.poi.ss.formula.functions.T; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.RestTemplate; +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import javax.security.cert.X509Certificate; +import java.io.*; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -60,6 +84,8 @@ private TOperatorCityService operatorCityService; @Autowired private IOperatorAuthService operatorAuthService; + @Autowired + private IOperatorAuthWxService operatorAuthWxService; @Autowired private IOperatorUserService operatorUserService; @Autowired @@ -164,7 +190,7 @@ } /** - * 跳转运营商商户去认证页面 + * 支付宝跳转运营商商户去认证页面 */ @RequestMapping("/proportionAuth/{id}") public String proportionAuth(Model model,@PathVariable("id") Integer id) { @@ -215,7 +241,58 @@ return PREFIX + "OperatorUser_proportionAuth.html"; } /** - * 跳转运营商商户去认证页面 详情页面 + * 微信跳转运营商商户去认证页面 + */ + @RequestMapping("/proportionAuthWx/{id}") + public String proportionAuthWx(Model model,@PathVariable("id") Integer id) { + model.addAttribute("id",id); + TOperator data = operatorService.getById(id); + User byId = userService.getById(data.getUserId()); + model.addAttribute("user",byId); + List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0)); + model.addAttribute("list",list); + model.addAttribute("data",data); + OperatorAuthAlipay info = operatorAuthService.getOne(new QueryWrapper<OperatorAuthAlipay>().eq("operatorId", id)); + model.addAttribute("item",info); + + if (info==null){ + OperatorAuthAlipay operatorAuth = new OperatorAuthAlipay(); + model.addAttribute("item",operatorAuth); + model.addAttribute("bodyType",0); + model.addAttribute("code",null); + model.addAttribute("reasons",null); + // 0不显示二维码 + model.addAttribute("type",0); + }else{ + model.addAttribute("bodyType",info.getBodyType()); + model.addAttribute("accountType",info.getAccountType()); + model.addAttribute("useType",info.getUseType()); + model.addAttribute("cardType",info.getCardType()); + model.addAttribute("reasons",info.getRefuseReason()); +// TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, info.getCityCode())); +// List<TCity> district = cityService.list(new QueryWrapper<TCity>().eq("parent_id", one.getId())); +// model.addAttribute("district",district); +// if (info.getOrderStatus().equals("AUDIT_PASS")||info.getOrderStatus().equals("LEGAL_CONFIRM")||info.getOrderStatus().equals("CONTACT_CONFIRM")){ +// // 通过才展示二维码 +// model.addAttribute("type",1); +// }else{ +// model.addAttribute("type",0); +// } +// model.addAttribute("code",info.getQrCode()); +// model.addAttribute("item",info); +// model.addAttribute("bodyType",info.getBodyType()); +// if (info.getRefuseReason()!=null && (!info.getRefuseReason().equals(""))){ +// model.addAttribute("reasons",info.getRefuseReason()); +// }else{ +// model.addAttribute("reasons",null); +// } + + + } + return PREFIX + "OperatorUser_proportionAuthWX.html"; + } + /** + * 支付宝跳转运营商商户去认证页面 详情页面 */ @RequestMapping("/proportionAuth1/{id}") public String proportionAuth1(Model model,@PathVariable("id") Integer id) { @@ -291,6 +368,146 @@ return PREFIX + "OperatorUser_proportionAuth_info.html"; } /** + * 微信跳转运营商商户去认证页面 详情页面 + */ + @RequestMapping("/proportionAuth1Wx/{id}") + public String proportionAuth1Wx(Model model,@PathVariable("id") Integer id) { + model.addAttribute("id",id); + TOperator data = operatorService.getById(id); + User byId = userService.getById(data.getUserId()); + model.addAttribute("user",byId); + OperatorUser operatorId = operatorUserService.getOne(new QueryWrapper<OperatorUser>() + .eq("operatorId", data.getId())); + model.addAttribute("data",data); + OperatorAuth info = operatorAuthWxService.getOne(new QueryWrapper<OperatorAuth>() + .eq("operatorId", id)); + model.addAttribute("item",info); + List<TCity> list1 = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0)); + model.addAttribute("list1",list1); + if (StringUtils.hasLength(info.getProvince())){ + // 获取银行开户省 + List<TCity> list4 = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0)); + // 获取银行开户市 + TCity city = cityService.getOne(new QueryWrapper<TCity>().eq("code", info.getProvinceCode())); + List<TCity> list5 = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, city.getId())); + model.addAttribute("list4",list4); + model.addAttribute("list5",list5); + }else{ + List<TCity> list6 = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0)); + model.addAttribute("list4",list6); + List<TCity> list5 = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 1)); + model.addAttribute("list5",list5); + } + model.addAttribute("bodyType",info.getBodyType()); + model.addAttribute("accountType",info.getAccountType()); + model.addAttribute("useType",info.getAccountType()); + model.addAttribute("cardType",""); + model.addAttribute("reasons",info.getRefuseReason()); + // 【申请状态】 枚举值: + //CHECKING:资料校验中 + //ACCOUNT_NEED_VERIFY:待账户验证 + //AUDITING:审核中 + //REJECTED:已驳回 + //NEED_SIGN:待签约 + //FINISH:完成 + //FROZEN:已冻结 + //CANCELED:已作废 + switch (info.getApplymentState()){ + case "CHECKING": + model.addAttribute("applymentState","资料校验中"); + break; + case "ACCOUNT_NEED_VERIFY": + model.addAttribute("applymentState","待账户验证"); + break; + case "AUDITING": + model.addAttribute("applymentState","审核中"); + break; + case "REJECTED": + model.addAttribute("applymentState","已驳回"); + break; + case "NEED_SIGN": + model.addAttribute("applymentState","待签约"); + break; + case "FINISH": + model.addAttribute("applymentState","完成"); + break; + case "FROZEN": + model.addAttribute("applymentState","已冻结"); + break; + case "CANCELED": + model.addAttribute("applymentState","已作废"); + break; + } + if (info.getSignState()!=null){ + switch (info.getApplymentState()){ + case "CHECKING": + model.addAttribute("applymentState","资料校验中"); + break; + case "ACCOUNT_NEED_VERIFY": + model.addAttribute("applymentState","待账户验证"); + break; + case "AUDITING": + model.addAttribute("applymentState","审核中"); + break; + case "REJECTED": + model.addAttribute("applymentState","已驳回"); + break; + case "NEED_SIGN": + model.addAttribute("applymentState","待签约"); + break; + case "FINISH": + model.addAttribute("applymentState","完成"); + break; + case "FROZEN": + model.addAttribute("applymentState","已冻结"); + break; + case "CANCELED": + model.addAttribute("applymentState","已作废"); + break; + } + } + + model.addAttribute("state",info.getApplymentState()); + if (info.getSignState() == null){ + model.addAttribute("signState",0); + + }else{ + model.addAttribute("signState",info.getSignState()); + + } + // todo 查询申请单状态 + model.addAttribute("accountName",info.getSignState()); + model.addAttribute("accountNo",info.getSignState()); + model.addAttribute("payAmount",info.getSignState()); + model.addAttribute("destinationAccountNumber",info.getSignState()); + model.addAttribute("destinationAccountName",info.getSignState()); + model.addAttribute("destinationAccountBank",info.getSignState()); + model.addAttribute("city",info.getSignState()); + model.addAttribute("remark",info.getSignState()); + model.addAttribute("deadline",info.getSignState()); + model.addAttribute("signState",info.getSignState()); + +// TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, info.getCityCode())); +// List<TCity> district = cityService.list(new QueryWrapper<TCity>().eq("parent_id", one.getId())); +// model.addAttribute("district",district); +// if (info.getOrderStatus().equals("AUDIT_PASS")||info.getOrderStatus().equals("LEGAL_CONFIRM")||info.getOrderStatus().equals("CONTACT_CONFIRM")){ +// // 通过才展示二维码 +// model.addAttribute("type",1); +// }else{ +// model.addAttribute("type",0); +// } +// model.addAttribute("code",info.getQrCode()); +// model.addAttribute("item",info); +// model.addAttribute("bodyType",info.getBodyType()); +// if (info.getRefuseReason()!=null && (!info.getRefuseReason().equals(""))){ +// model.addAttribute("reasons",info.getRefuseReason()); +// }else{ +// model.addAttribute("reasons",null); +// } + + return PREFIX + "OperatorUser_proportionAuth_infoWX.html"; + } + /** * 根据所选市 获取区 */ @RequestMapping(value = "/getDistrict") @@ -305,7 +522,7 @@ return ERROR; } } -// public static void main(String[] args) { + // public static void main(String[] args) { // // 调用支付宝接口 通过银行卡号获取银行信息 // String url = "https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&" + // "cardNo=6217003800041315031&cardBinCheck=true"; @@ -319,7 +536,273 @@ // System.err.println(cardType); // // } + public static String rsaEncryptOAEP(String message, X509Certificate certificate) + throws IllegalBlockSizeException, IOException { + try { + Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding"); + cipher.init(Cipher.ENCRYPT_MODE, certificate.getPublicKey()); + byte[] data = message.getBytes("utf-8"); + byte[] cipherdata = cipher.doFinal(data); + return Base64.getEncoder().encodeToString(cipherdata); + } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { + throw new RuntimeException("当前Java环境不支持RSA v1.5/OAEP", e); + } catch (InvalidKeyException e) { + throw new IllegalArgumentException("无效的证书", e); + } catch (IllegalBlockSizeException | BadPaddingException e) { + throw new IllegalBlockSizeException("加密原串的长度不能超过214字节"); + } + } + /** + * 微信商户认证提交 + */ + @RequestMapping(value = "/wxAuth") + @ResponseBody + public Object wxAuth(Integer operatorId,String bodyType,String businessName,String businessNumber,String companyAddress, + String aliasName, + String license,String legalPhone, + String legalEmail, + String legalPerson,String legalAddress, + String IDCardTime,String IDCardEnd,String tradeTime,String endTime, + String leagleNumber,String legalFront,String legalBack, + String bankCard,String bankCardTwo,Integer useType,String bank,String bankName, + String accountName,String provinceCode,String province,String cityCode,String city, + String isBenefits, + String benefitsName, + String benefitsFront, + String benefitsBack, + String benefitsNumber, + String benefitsStartTime, + String benefitsEndTime, + String benefitsAddress + ) { + OperatorAuth operatorId1 = operatorAuthWxService.getOne(new QueryWrapper<OperatorAuth>() + .eq("operatorId", operatorId)); + TOperator byId = operatorService.getById(operatorId); + Integer userId1 = byId.getUserId(); + OperatorUser userId2 = operatorUserService.getOne(new QueryWrapper<OperatorUser>() + .eq("userId", userId1)); + userId2.setWechatAudit(1); + // 2是企业 4个体 + if (bodyType.equals("2")){ + userId2.setWechatType(2); + }else{ + userId2.setWechatType(4); + } + operatorUserService.updateById(userId2); + if (null == endTime || "".equals(endTime)){ + endTime = "长期"; + } + if (null == IDCardEnd || "".equals(IDCardEnd)){ + IDCardEnd = "长期"; + } + OperatorAuth operatorAuth = new OperatorAuth(); + + + operatorAuth.setOperatorId(operatorId); + operatorAuth.setBodyType(bodyType); + operatorAuth.setAliasName(aliasName); + operatorAuth.setBusinessName(businessName); + operatorAuth.setAccountType(useType); + operatorAuth.setBusinessNumber(businessNumber); + operatorAuth.setLegalRepresentative(legalPerson); + operatorAuth.setRegisterAddress(companyAddress); + operatorAuth.setBusinessTerm(tradeTime); + operatorAuth.setBusinessEnd(endTime); + operatorAuth.setLegalPerson(legalPerson); + operatorAuth.setLeagleNumber(leagleNumber); + operatorAuth.setLegalTerm(IDCardTime); + operatorAuth.setLegalEnd(IDCardEnd); + operatorAuth.setLegalEmail(legalEmail); + operatorAuth.setLegalAddress(legalAddress); + operatorAuth.setBusinessPicture(license); + operatorAuth.setLegalFront(legalFront); + operatorAuth.setLegalBack(legalBack); + if (!StringUtils.hasLength(license))operatorAuth.setBusinessPicture(null); + if (!StringUtils.hasLength(legalFront))operatorAuth.setLegalFront(null); + if (!StringUtils.hasLength(legalBack))operatorAuth.setLegalBack(null); + operatorAuth.setBank(bank); + operatorAuth.setAccountName(accountName); + operatorAuth.setProvince(province); + operatorAuth.setProvinceCode(provinceCode); + operatorAuth.setCity(city); + operatorAuth.setCityCode(cityCode); + operatorAuth.setBankName(bankName); + operatorAuth.setBankNumber(bankCard); + operatorAuth.setAuditState(0); + operatorAuth.setName(legalPerson); + operatorAuth.setLegalPhone(legalPhone); + operatorAuth.setPhone(legalPhone); + operatorAuth.setNumber(leagleNumber); + operatorAuth.setBankCardTwo(bankCardTwo); + operatorAuth.setIsBenefits(isBenefits); + + if (isBenefits.equals("true")){ + operatorAuth.setBenefitsName(legalPerson); + operatorAuth.setBenefitsFront(legalFront); + operatorAuth.setBenefitsBack(legalBack); + operatorAuth.setBenefitsNumber(leagleNumber); + operatorAuth.setBenefitsStartTime(IDCardTime); + operatorAuth.setBenefitsEndTime(IDCardEnd); + operatorAuth.setBenefitsAddress(legalAddress); + benefitsName = legalPerson; + benefitsFront = legalFront; + benefitsBack =legalBack; + benefitsNumber =leagleNumber; + benefitsStartTime =IDCardTime; + benefitsEndTime =IDCardEnd; + benefitsAddress = legalAddress; + } + LocalDateTime currentDateTime = LocalDateTime.now(); + // 格式化日期和时间信息 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); + String formattedDateTime = currentDateTime.format(formatter); + // 生成随机数,填充剩余位数 + Random random = new Random(); + StringBuilder randomPart = new StringBuilder(); + for (int i = 0; i < 3; i++) { + // 大写字母 + randomPart.append((char) (random.nextInt(26) + 'A')); + } + // 组合业务申请编号 若申请单被驳回,可填写相同的“业务申请编号”,即可覆盖修改原申请单信息 。 + String orderNumber = formattedDateTime + randomPart; + if (operatorId1 == null){ + operatorAuth.setOutBizNo(orderNumber); + operatorAuth.setAuditState(1); + operatorAuth.setApplymentState("CHECKING"); + operatorAuthWxService.save(operatorAuth); + }else{ + operatorAuth.setId(operatorId1.getId()); + operatorAuth.setBenefitsFront(operatorId1.getLegalFront()); + operatorAuth.setBenefitsBack(operatorId1.getLegalBack()); + BeanUtils.copyProperties(operatorAuth,operatorId1); + operatorId1.setAuditState(1); + operatorId1.setApplymentState("CHECKING"); + operatorAuthWxService.updateById(operatorId1); + } + String param="{"+ + "\"out_request_no\" :"+ "\""+orderNumber+"\""+","+ + " \"organization_type\" :"+"\""+bodyType+"\""+","+ + " \"finance_institution\" : false,\n" + + " \"business_license_info\" : {\n" + + // 主体为“个体工商户/企业”时,不填。 +// "cert_type:" + "CERTIFICATE_TYPE_2388,"+ + " \"business_license_copy\" :"+ "\""+license+"\""+","+ + " \"business_license_number\" : "+"\""+businessNumber+"\""+","+ + " \"merchant_name\" : "+ "\""+businessName+"\""+","+ + " \"legal_person\" : "+ "\""+legalPerson+"\""+","+ + "\"company_address\" :"+ "\""+companyAddress+"\""+","+ + " \"business_time\" : \"[\\\\\\\""+tradeTime+"\\\\\\\",\\\\\\\""+endTime+"\\\\\\\"]\"\n" + + " },\n" + +// "finance_institution_info:" +" {"+ +// "finance_type:" + "BANK_AGENT,"+ +// "finance_license_pics:" +"["+ +// "example_finance_license_pics"+ +// "]},"+ +// "id_holder_type:" + "LEGAL,"+ + " \"id_doc_type\" : \"IDENTIFICATION_TYPE_MAINLAND_IDCARD\",\n" + +// "authorize_letter_copy:" + "47ZC6GC-vnrbEny_Ie_An5-tCpqxucuxi-vByf3Gjm7KEIUv0OF4wFNIO4kqg05InE4d2I6_H7I4,"+ + " \"id_card_info\" : {\n" + + " \"id_card_copy\" : "+ "\""+legalFront+"\""+","+ + " \"id_card_national\" : "+ "\""+legalBack+"\""+","+ + " \"id_card_name\" : "+ "\""+legalPerson+"\""+","+ + " \"id_card_number\" : "+ "\""+leagleNumber+"\""+","+ + " \"id_card_address\" : "+ "\""+legalAddress+"\""+","+ + " \"id_card_valid_time_begin\" : "+ "\""+IDCardTime+"\""+","+ + " \"id_card_valid_time\" : "+ "\""+IDCardEnd+"\""+","+ +// "id_doc_info:" + +// "{id_doc_name:" + "jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ,"+ +// "id_doc_number:" + "jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ,"+ +// "id_doc_copy:" + "47ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4,"+ +// "id_doc_copy_back:" + "47ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4,"+ +// "id_doc_address:" + "jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ,"+ +// "doc_period_begin:" + "2019-06-06,"+ +// "doc_period_end:" + "2020-01-02},"+ + + " \"owner\" : true,\n" + + " \"account_info\" : {\n" + + " \"bank_account_type\" : "+ "\""+useType+"\""+","+ + " \"account_bank\" : "+ "\""+bank+"\""+","+ + " \"account_name\" : "+ "\""+accountName+"\""+","+ + " \"bank_address_code\" :"+ "\""+cityCode+"\""+","+ + " \"bank_branch_id\" : "+ "\""+bankCardTwo+"\""+","+ + " \"bank_name\" : "+ "\""+bankName+"\""+","+ + " \"account_number\" : "+ "\""+bankCard+"\""+","+ + " \"contact_info\" : {\n" + + " \"contact_type\" : \"65\",\n" + + " \"contact_name\" :"+ "\""+legalPerson+"\""+","+ + " \"contact_id_doc_type\" : \"IDENTIFICATION_TYPE_MAINLAND_IDCARD\",\n" + + " \"contact_id_card_number\" : "+ "\""+leagleNumber+"\""+","+ + " \"contact_id_doc_copy\" : "+ "\""+legalFront+"\""+","+ + " \"contact_id_doc_copy_back\" :"+ "\""+legalBack+"\""+","+ +// "contact_id_doc_period_begin:"+ "2019-06-06,"+ +// "contact_id_doc_period_end:" + "2026-06-06,"+ +// "business_authorization_letter:" + "47ZC6GC-vnrbEny_Ie_An5-tCpqxucuxi-vByf3Gjm7KEIUv0OF4wFNIO4kqg05InE4d2I6_H7I4,"+ + " \"mobile_phone\" : "+ "\""+legalPhone+"\""+","+ + " \"contact_email\" : "+ "\""+legalEmail+"\""+ + " },\n" + + " \"sales_scene_info\" : {\n" + + " \"store_name\" : \"爱烧烤\",\n" + + " \"store_url\" : \"http://www.qq.com\",\n" + + " \"store_qr_code\" : \"jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ\",\n" + + " \"mini_program_sub_appid\" : \"wxa123344545577\"\n" + + " },\n" + + " \"settlement_info\" : {\n" ; + if (Integer.parseInt(bodyType) == 4){ + param = param+" \"settlement_id\" : 802,\n" + + " \"qualification_type\" : \"休闲娱乐/旅游服务\"\n" +" },\n" ; + }else{ + param = param+" \"settlement_id\" : 800,\n" + + " \"qualification_type\" : \"休闲娱乐/旅游服务\"\n" +" },\n" ; + } + param+= " \"merchant_shortname\" : "+ "\""+aliasName+"\""+ + +// "qualifications:" + "[\"jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ\",\"47ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4\"],"+ +// "business_addition_pics:" + "[\"jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ\",\"47ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4\"],"+ +// "business_addition_desc:" + "特殊情况,说明原因,"+ +// "ubo_info_list:"+ "[{"+ + "\"ubo_info_list\" : [\n" + + " {\n" + + " \"ubo_id_doc_type\" : \"IDENTIFICATION_TYPE_MAINLAND_IDCARD\",\n" + + " \"ubo_id_doc_copy\" : "+ "\""+benefitsFront+"\""+ + " \"ubo_id_doc_copy_back\" : "+ "\""+benefitsBack+"\""+ + " \"ubo_id_doc_name\" : "+ "\""+benefitsName+"\""+ + " \"ubo_id_doc_number\" : "+ "\""+benefitsNumber+"\""+ + " \"ubo_id_doc_address\" : "+ "\""+benefitsAddress+"\""+ + " \"ubo_id_doc_period_begin\" : "+ "\""+benefitsStartTime+"\""+ + " \"ubo_id_doc_period_end\" : "+ "\""+benefitsEndTime+"\""+ + " }\n" + + " ]"+ + " }\n"+ + " }\n"+ + " }\n"; + + + // 使用 Jackson 解析 JSON + ObjectMapper objectMapper = new ObjectMapper(); + try { + // 将 JSON 字符串解析为 Map + Map<String, Object> map = objectMapper.readValue(param, Map.class); + + // 输出 Map 中的内容 + for (Map.Entry<String, Object> entry : map.entrySet()) { + System.out.println(entry.getKey() + ": " + entry.getValue()); + } + System.err.println(map); + String s = HttpRequestUtil.postRequest1("https://api.mch.weixin.qq.com/v3/ecommerce/applyments/", map); + System.err.println("返回结果:"+s); + JSONObject jsonObject = JSON.parseObject(s); + String string = jsonObject.getString("out_request_no"); + // 获取业务申请编号 后续用该字段查询申请状态 + operatorAuth.setOrderNo(string); + System.err.println(jsonObject); + } catch (IOException e) { + e.printStackTrace(); + } + System.err.println(param); + + return SUCCESS_TIP; + } /** * 支付宝商户认证提交 @@ -487,7 +970,6 @@ " \"mobile\":\""+phone+"\"," + " }" + " ],"; - // todo 拼接 String biz_cards=" \"biz_cards\":[" + " {" + " \"account_holder_name\":\""+accountName+"\"," + @@ -514,25 +996,25 @@ } String res= " \"service\":[" + - " \"app支付\"" + - " ]," + - " \"alipay_logon_id\":" + - " \""+zfbAccount+"\"" + - " ," + - " \"sites\":[" + - " {" + - " \"site_type\":\"02\"," + - " \"site_name\":\"玩湃生活\"," + - " \"tiny_app_id\":\"wx82f853a410b0c7c0\"" + - " }" + - " ]," + - " \"cert_name\":\""+businessName+"\","+ - " \"binding_alipay_logon_id\":\""+zfbAccount+"\","+ - " \"default_settle_rule\":{" + - " \"default_settle_type\":\""+type+"\"," + - " \"default_settle_target\":\""+account+"\"" + - " }" + - "}"; + " \"app支付\"" + + " ]," + + " \"alipay_logon_id\":" + + " \""+zfbAccount+"\"" + + " ," + + " \"sites\":[" + + " {" + + " \"site_type\":\"02\"," + + " \"site_name\":\"玩湃生活\"," + + " \"tiny_app_id\":\"wx82f853a410b0c7c0\"" + + " }" + + " ]," + + " \"cert_name\":\""+businessName+"\","+ + " \"binding_alipay_logon_id\":\""+zfbAccount+"\","+ + " \"default_settle_rule\":{" + + " \"default_settle_type\":\""+type+"\"," + + " \"default_settle_target\":\""+account+"\"" + + " }" + + "}"; if (accountType.equals("bankCard")){ request.setBizContent(param + biz_cards+res); @@ -579,6 +1061,7 @@ } return ResultUtil.success(); } + public static Object uploadImg(String img){ String appPrivateKey = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCi5i9nW/hGLJ3A06cZxTQdviFC7THpdSihoTYGLr9q006hu0V26ecBMY/o4w5bvIX0Ok/yofmZsVcCJpAPvbXL/uqVrIjnRRxXiaeBFThlxoBUTdunvbUSDYfzlEhJr5NvUKI6H6lz2niXlQGx4qy8Hau4ccWit9kM8jwUvsBVQoFgJA+xrjMvooA7YLopQtpOD+UJr5thApTSf1xrnr1W12yolTLEH15JmNV372cqXrYUuqnY0QsaPtxeqJUGAOcGdVLllQ7easEznP8DFBvDdHATcmp2SHNQDUEWN6MCVPbMgY06NQVqAXxqjTAYSVh+6TRu6bofPmpYC3TZB003AgMBAAECggEBAJAcR2+PA3NBYUYHeFrqBRMS8uX8ZR19kjZ7IgoSLTFaQsP9opRylPSPXhrPVBKAE5leRQAHn4MCSlESwHvMfxo7KFjFTFAc6dffZZpipYQUOc9bGampwJh58/3e/pyBgVMG6J23CPf/HJQtNFSkjd/V9+ayb/9l2dUEL3bC0fAZ/dbx8HsxdLw8wn3fLlWLj68hOMqa2deCZe3JdSVsPbeWqkh56FFsMLug0Nd+Ar4TgRl9/jnhXF0JWiD0LmPUYLhboY7EfUBzN4w1iYbDi1P+3zvoOYsiVKAXox9GMhQ2VzOO2UcSTuizSza2e98mGpabl/GpKmCz+RDFjtkX6eECgYEA2MyCij65eO3aGIm3FUe93DULRBYTfX8qJQSJq2WOWA3mmQlEW6L3O2B5/lG2h+8WmN6iLEs9eHpgycGYp7vAqgrANEn16ACVcuyx0scFtrZfZ+kmHMzFfiUWxJjVYk/6YngsGVBLdw6ueM42C8TTP67X9tU5TdVGoGWuqEj4W98CgYEAwFqwprXOch5Pqk/RPbb49r0Ou03K/UbciWnWWKzUhFFNS8MdlQPoDvQZbMwHLeWsa2VhaKITK3x5biLQb3U+0GLOn6lTvEyrEUH+ucREyLgVYTRAvwBPtnvlrzpyxPk2HnslQjju8WrvvLLBMKWUjlTrTOzhaHT21gz3pHMiOakCgYEAhLmfaXdBITGshb054sNLDtdCkGpbgEcrzAHdLps769iGxkYQHXHFngpQZUwtTUcoNGqIKknd1jZFrv7gsD+XkgKG7PwimehRlkwmCX5ilxtLiVgJRzRt6+5U5AMVD90a0tHzXYP0z2yjj73fBJF5KtGl0a10KZxaYrQdm1UhB00CgYBZZgzx/k9rtHC8LAqIj1CYhHejT92G53c6Gkl3vyOqN4sgKhfGmSEySfrDGPRBPZxr8ZtbIPCd5mUdberH0osWGMYFaJI1UsCy7aQwvGpniz7MhZeN7dweaOjwDs8mgtjHQ96mL4XGCDhR0BZ/wIURvZ/6iaGdhbbu9unlsWj3uQKBgQCmZYdsbbZkd3ev6f8rwyvMz+DrCQyYpY44cegBYuJgrZiQnL2fJioeN7ixX0UM48SfwsZEIrzshP/LGAwnc2MdjxKUl4jLN8SEe0NAjXOnz9Zaw740+aOmLpXcLWdP4uM2gIhWsvW1tEkQZCXmm7c9s/RsU8Pmzv+YL3+fSijOzA==";//支付宝开发者应用私钥 String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmu8n/4yTHWbn7VOrNc9OsLtDL1bEQ8gC1dHkj8Wy5z0mkaOsjJRIG/28ze12M0V8jdCKuuDr5Z1OPKiqf+XO3ypguEh+mYUVMBM/cZodDFQfTY1TKLWjvQCuaqlA+QUTCK6f7T7stsgyQ1o9Jj0rXZDz6PM4QHSTzjrLIBaeqM5WIBvH+fy/X+QG5Utd+/UT0kc0JyvuKhZ65yVUd/C9VcwJJAPliRsAQNrqYterwAJ9zvw9tF11wj9W0XgJ8Ccu4x3gR1vrlLRJJo/OA97RmxPQ+5hSacWQZCUd1dwiBq+YCrKVHGTj14izRHXrLc0yBlRXo7tBOIqcy3IsvKVthQIDAQAB";//支付宝支付公钥 @@ -625,6 +1108,74 @@ } /** + * 查询进件申请单审核状态 + */ + public JSONObject queryState(String orderNo) { + String url = "https://api.mch.weixin.qq.com/v3/ecommerce/applyments/out-request-no/"+orderNo; + String req1 = HttpRequestUtil.getReq1(url, new HashMap<>()); + System.err.println("查询申请单审核状态字符串"+req1); + JSONObject jsonObject = JSON.parseObject(req1); + System.err.println("查询申请单审核状态Json"+jsonObject); + String applymentState = jsonObject.getString("applyment_state"); + String outBizNo = jsonObject.getString("out_request_no"); + OperatorAuth operatorAuth = operatorAuthWxService.getOne( + new QueryWrapper<OperatorAuth>() + .eq("outBizNo", outBizNo)); + OperatorUser operatorUser = operatorUserService.getOne(new QueryWrapper<OperatorUser>() + .eq("operatorId", operatorAuth.getOperatorId())); + // 审核状态 + operatorAuth.setApplymentState(applymentState); + if (applymentState.equals("REJECTED") || applymentState.equals("FROZEN")){ + operatorUser.setWechatAudit(3); + operatorAuth.setAuditState(2); + // 如果被拒 赋值拒绝原因 + operatorAuth.setRefuseReason(jsonObject.getJSONObject("audit_detail").getString("reject_reason")); + } + if (applymentState.equals("NEED_SIGN")){ + operatorAuth.setSignUrl(jsonObject.getString("sign_url")); + operatorAuth.setMerchantNumber(jsonObject.getString("sub_mchid")); + } + if (applymentState.equals("FINISH")){ + operatorAuth.setMerchantNumber(jsonObject.getString("sub_mchid")); + operatorUser.setWechatAudit(2); + operatorAuth.setAuditState(1); + } + if (applymentState.equals("ACCOUNT_NEED_VERIFY")){ + operatorAuth.setLegalValidationUrl(jsonObject.getString("legal_validation_url")); + } + return jsonObject; + /** + * { + * "applyment_state" : "FINISH", + * "applyment_state_desc" : "审核中", + * "sign_url" : "https://pay.weixin.qq.com/public/apply4ec_sign/s?applymentId=2000002126198476&sign=b207b673049a32c858f3aabd7d27c7ec", + * "sub_mchid" : "1542488631", + * "account_validation" : { + * "account_name" : "aOf7Gk2qT26kakkuTZpbFAn7Mb7xcar0LlQaYoi3+LnnWwgAsfaUUTg9+GmYJq6YCz+RiluWHeHFq1lt8n3eIkF0laVvqmAU80xIWGZgWJnRmnRuZxsg0HJZfnUac2JfqyuL8OoyM2YSuYDqdsyvcOlgUQgq8MPCR6pmvhBCmIeJvnVSm8J+L+yx912itUmTDxhdBlu1CFBIUefME9nYB70vCVTNAVXgURkf65mjHMBiE9Y+wrPZVmTIIz3C3PtPVMZYDEvBT4rDdICA3ZYXshYqeOSslSjSMf+MhhC4oaujiISFzq3AE+as7mAEDJly+DgRuVs74msmKUH8pl+3oA==", + * "account_no" : "aOf7Gk2qT26kakkuTZpbFAn7Mb7xcar0LlQaYoi3+LnnWwgAsfaUUTg9+GmYJq6YCz+RiluWHeHFq1lt8n3eIkF0laVvqmAU80xIWGZgWJnRmnRuZxsg0HJZfnUac2JfqyuL8OoyM2YSuYDqdsyvcOlgUQgq8MPCR6pmvhBCmIeJvnVSm8J+L+yx912itUmTDxhdBlu1CFBIUefME9nYB70vCVTNAVXgURkf65mjHMBiE9Y+wrPZVmTIIz3C3PtPVMZYDEvBT4rDdICA3ZYXshYqeOSslSjSMf+MhhC4oaujiISFzq3AE+as7mAEDJly+DgRuVs74msmKUH8pl+3oA==", + * "pay_amount" : 124, + * "destination_account_number" : "7222223333322332", + * "destination_account_name" : "财付通支付科技有限公司", + * "destination_account_bank" : "招商银行威盛大厦支行", + * "city" : "深圳", + * "remark" : "入驻账户验证", + * "deadline" : "2018-12-10 17:09:01" + * }, + * "audit_detail" : [ + * { + * "param_name" : "id_card_copy", + * "reject_reason" : "身份证背面识别失败,请上传更清晰的身份证图片。" + * } + * ], + * "legal_validation_url" : "https://pay.weixin.qq.com/public/apply4ec_sign/s?applymentId=2000002126198476&sign=b207b673049a32c858f3aabd7d27c7ec", + * "out_request_no" : "APPLYMENT_00000000001", + * "applyment_id" : 2000002124775691, + * "sign_state" : "SIGNED" + * } + */ + } + + /** * 分账比例提交 */ @RequestMapping(value = "/proportion") @@ -636,6 +1187,86 @@ operatorUserService.updateById(id); return SUCCESS_TIP; } + + +// public static void main(String[] args) throws URISyntaxException { +// String filePath = "https://we-park-life.oss-cn-beijing.aliyuncs.com/img/a5e24fc4b13b4ea48bb2455ad8662a5d.jpg"; // 替换成你的OSS图片链接 +// String string = UUID.randomUUID().toString(); +// try { +// URL url = new URL(filePath); +// InputStream inputStream = url.openStream(); +// // 这里可以根据需求处理 inputStream,比如保存到本地文件 +// // 例如保存到本地文件 +// saveInputStreamToFile(inputStream, "D:\\tempImg\\"+string+".jpg"); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// URI uri = new URI("https://api.mch.weixin.qq.com/v3/merchant/media/upload"); +// File file = new File("D:\\tempImg\\"+string+".jpg"); +// try (FileInputStream ins1 = new FileInputStream(file)) { +// String sha256 = DigestUtils.sha256Hex(ins1); +// try (InputStream ins2 = new FileInputStream(file)) { +// HttpPost request = new WechatPayUploadHttpPost.Builder(uri) +// .withImage(file.getName(), sha256, ins2) +// .build(); +//// CloseableHttpResponse response1 = httpClient.execute(request); +// } +// } catch (IOException e) { +// throw new RuntimeException(e); +// } +// } + private static void saveInputStreamToFile(InputStream inputStream, String filePath) throws IOException { + OutputStream outputStream = new FileOutputStream(filePath); + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + outputStream.close(); + inputStream.close(); + } + /** + * 微信商户认证上传图片 + */ + @RequestMapping(value = "/wxUpload") + @ResponseBody + public Object wxUpload(String img) throws URISyntaxException, FileNotFoundException { + String filePath = "https://we-park-life.oss-cn-beijing.aliyuncs.com/img/a5e24fc4b13b4ea48bb2455ad8662a5d.jpg"; // 替换成你的OSS图片链接 + String string = UUID.randomUUID().toString(); + try { + URL url = new URL(filePath); + InputStream inputStream = url.openStream(); + // 这里可以根据需求处理 inputStream,比如保存到本地文件 + // 例如保存到本地文件 + + + saveInputStreamToFile(inputStream, "D:\\tempImg\\"+string+".jpg"); + } catch (IOException e) { + e.printStackTrace(); + } + URI uri = new URI("https://api.mch.weixin.qq.com/v3/merchant/media/upload"); + File file = new File("D:\\tempImg\\"+string+".jpg"); + try (FileInputStream ins1 = new FileInputStream(file)) { + String sha256 = DigestUtils.sha256Hex(ins1); + try (InputStream ins2 = new FileInputStream(file)) { + HttpPost request = new WechatPayUploadHttpPost.Builder(uri) + .withImage(file.getName(), sha256, ins2) + .build(); +// CloseableHttpResponse response1 = httpClient.execute(request); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + return null; + } + // 辅助方法:将 InputStream 转换为 FileInputStream + private static FileInputStream convertInputStreamToFileInputStream(InputStream inputStream) throws IOException { + // 将 InputStream 转为临时文件,然后返回其 FileInputStream + File tempFile = File.createTempFile("temp", null); + org.apache.commons.io.IOUtils.copy(inputStream, new java.io.FileOutputStream(tempFile)); + return new FileInputStream(tempFile); + } + /** * 跳转运营商设置分账比例页面 */ @@ -856,4 +1487,15 @@ } return ResultUtil.success("添加成功"); } -} + + + /** + * 获取所有运营商 + * @return + */ + @ResponseBody + @PostMapping("/getOperatorListAll") + public Object getOperatorListAll(){ + return operatorService.list(new QueryWrapper<TOperator>().eq("state", 1)); + } +} \ No newline at end of file diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/OperatorUserController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/OperatorUserController.java index 6f35ce3..5f4478e 100644 --- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/OperatorUserController.java +++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/OperatorUserController.java @@ -80,63 +80,4 @@ return list; } - @RequestMapping(value = "/mgtShopAuth", method = RequestMethod.POST) - @ApiOperation(value = "微信平台商户进件") - @ResponseBody - public Object mgtShopAuth(Integer operatorId,String aliasName, String name,String phone, - String bodyType,String businessName,String businessNumber,String legalPerson, - String legalRepresentative,String registerAddress,String businessTerm,String businessPicture, - String businessEnd,String legalNumber,String accountType, - Integer blBusinessFoeverFlag, String leagleNumber,String legalAddress, - String legalTerm,String legalEnd, Integer lpIcForeverFlag,String legalFront,String legalBack, - String legalPhone,String legalEmail, String settlementAccountType,String saBank,String saAccountName, - String saBankProvinceCode,String saBankCityCode, String saBankName,String saNumber,String baPics, - String baDesc,Integer owner, String uboName,String uboIdCard,String uboIcStartDate,String uboIcEndDate, - String uboIcFront,String uboIcBack, String uboIcAddress) { - MgtShopAuthDto mgtShopAuthDto = new MgtShopAuthDto(); - Integer userId = Objects.requireNonNull(UserExt.getUser()).getId(); - mgtShopAuthDto.setUserId(userId); - mgtShopAuthDto.setAuthId("1"); - mgtShopAuthDto.setShopId(Long.valueOf(operatorId)); - mgtShopAuthDto.setShopName(businessName); - mgtShopAuthDto.setShopownerName(name); - mgtShopAuthDto.setShopownerPhone(phone); - mgtShopAuthDto.setMainType(Integer.valueOf(bodyType)); - mgtShopAuthDto.setBlShopName(businessName); - mgtShopAuthDto.setBlNumber(businessNumber); - mgtShopAuthDto.setBlCorporateName(legalRepresentative); - mgtShopAuthDto.setBlRegisteredAddress(registerAddress); - mgtShopAuthDto.setBlBusinessStartTime(businessTerm); - mgtShopAuthDto.setBlBusinessDeanline(businessEnd); - mgtShopAuthDto.setBlBusinessFoeverFlag(blBusinessFoeverFlag); - mgtShopAuthDto.setBlImage(businessPicture); - mgtShopAuthDto.setLpCorporateName(legalPerson); - mgtShopAuthDto.setLpIdCard(legalNumber); - mgtShopAuthDto.setLpIdAddress(legalAddress); - mgtShopAuthDto.setLpIcStartDate(legalTerm); - mgtShopAuthDto.setLpIcEndDate(legalEnd); - mgtShopAuthDto.setLpIcForeverFlag(lpIcForeverFlag); - mgtShopAuthDto.setLpIcFront(legalFront); - mgtShopAuthDto.setLpIcBack(legalBack); - mgtShopAuthDto.setLpMobilePhone(legalPhone); - mgtShopAuthDto.setLpContactEmail("法人邮箱"); - mgtShopAuthDto.setSettlementAccountType(accountType); - mgtShopAuthDto.setSaBank("开户行"); - mgtShopAuthDto.setSaAccountName("开户名称"); - mgtShopAuthDto.setSaBankProvinceCode("开户所在省"); - mgtShopAuthDto.setSaBankCityCode("开户所在市"); - mgtShopAuthDto.setSaBankName("开户行全称"); - mgtShopAuthDto.setSaNumber("银行卡号"); - mgtShopAuthDto.setOwner(1); - mgtShopAuthDto.setUboName("ck"); - mgtShopAuthDto.setUboIdCard("513701199910156123"); - mgtShopAuthDto.setUboIcStartDate("2020-05-05"); - mgtShopAuthDto.setUboIcEndDate("2025-05-05"); - mgtShopAuthDto.setUboIcFront("受益人身份证正面"); - mgtShopAuthDto.setUboIcBack("受益人身份证正面"); - mgtShopAuthDto.setUboIcAddress("受益人居住地址"); - operatorUserService.mgtShopAuth(mgtShopAuthDto); - return SUCCESS_TIP; - } - } diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/OperatorAuth.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/OperatorAuth.java index 446f112..8649591 100644 --- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/OperatorAuth.java +++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/OperatorAuth.java @@ -21,8 +21,6 @@ private Integer operatorId; @TableField(value = "bodyType") private String bodyType; - @TableField(value = "type") - private Integer type; @TableField(value = "businessName") private String businessName; @TableField(value = "businessNumber") @@ -49,10 +47,16 @@ private String legalAddress; @TableField(value = "legalFront") private String legalFront; + @TableField(value = "merchantNumber") + private String merchantNumber; @TableField(value = "legalBack") private String legalBack; + @TableField(value = "aliasName") + private String aliasName; @TableField(value = "accountType") private Integer accountType; + @TableField(value = "auditState") + private Integer auditState; @TableField(value = "bank") private String bank; @TableField(value = "accountName") @@ -69,27 +73,11 @@ private String bankName; @TableField(value = "bankNumber") private String bankNumber; - @TableField(value = "auditState") - private Integer auditState; - @TableField(value = "isBeneficiary") - private String isBeneficiary; - @TableField(value = "beneficiary") - private String beneficiary; - @TableField(value = "beneficiaryNumber") - private String beneficiaryNumber; - @TableField(value = "beneficiaryAddress") - private String beneficiaryAddress; - @TableField(value = "beneficiaryTerm") - private String beneficiaryTerm; - @TableField(value = "beneficiaryFront") - private String beneficiaryFront; - @TableField(value = "beneficiaryBack") - private String beneficiaryBack; + @TableField(value = "bankCardTwo") + private String bankCardTwo; @TableField(value = "refuseReason") private String refuseReason; - @TableField(value = "remark") - private String remark; @TableField(value = "outBizNo") private String outBizNo; @TableField(value = "name") @@ -102,13 +90,32 @@ private String businessEnd; @TableField(value = "legalEnd") private String legalEnd; - @TableField(value = "beneficiaryEnd") - private String beneficiaryEnd; @TableField(value = "orderNo") private String orderNo; - @TableField(value = "orderStatus") - private String orderStatus; - @TableField(value = "qrCode") - private String qrCode; + @TableField(value = "legalValidationUrl") + private String legalValidationUrl; + @TableField(value = "applymentState") + private String applymentState; + @TableField(value = "signUrl") + private String signUrl; + @TableField(value = "signState") + private String signState; + + @TableField(value = "isBenefits") + private String isBenefits; + @TableField(value = "benefitsName") + private String benefitsName; + @TableField(value = "benefitsFront") + private String benefitsFront; + @TableField(value = "benefitsBack") + private String benefitsBack; + @TableField(value = "benefitsNumber") + private String benefitsNumber; + @TableField(value = "benefitsStartTime") + private String benefitsStartTime; + @TableField(value = "benefitsEndTime") + private String benefitsEndTime; + @TableField(value = "benefitsAddress") + private String benefitsAddress; } diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/IOperatorAuthWxService.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/IOperatorAuthWxService.java new file mode 100644 index 0000000..c712353 --- /dev/null +++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/IOperatorAuthWxService.java @@ -0,0 +1,12 @@ +package com.dsh.guns.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dsh.guns.modular.system.model.OperatorAuth; +import com.dsh.guns.modular.system.model.OperatorAuthAlipay; + +/** + * @author zhibing.pu + * @Date 2023/8/1 17:49 + */ +public interface IOperatorAuthWxService extends IService<OperatorAuth> { +} diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TOperatorAuthWxServiceImpl.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TOperatorAuthWxServiceImpl.java new file mode 100644 index 0000000..df5ba04 --- /dev/null +++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TOperatorAuthWxServiceImpl.java @@ -0,0 +1,24 @@ +package com.dsh.guns.modular.system.service.impl; + + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dsh.course.mapper.TOperatorAuthMapper; +import com.dsh.course.mapper.TOperatorAuthWxMapper; +import com.dsh.guns.modular.system.model.OperatorAuth; +import com.dsh.guns.modular.system.model.OperatorAuthAlipay; +import com.dsh.guns.modular.system.service.IOperatorAuthService; +import com.dsh.guns.modular.system.service.IOperatorAuthWxService; +import org.springframework.stereotype.Service; + +/** + * <p> + * 服务实现类 + * </p> + * + * @author administrator + * @since 2023-09-19 + */ +@Service +public class TOperatorAuthWxServiceImpl extends ServiceImpl<TOperatorAuthWxMapper, OperatorAuth> implements IOperatorAuthWxService { + +} diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TOperatorUserServiceImpl.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TOperatorUserServiceImpl.java index 4f67843..63bfe51 100644 --- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TOperatorUserServiceImpl.java +++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TOperatorUserServiceImpl.java @@ -17,7 +17,6 @@ import com.dsh.guns.modular.system.service.IOperatorAuthService; import com.dsh.guns.modular.system.service.IOperatorUserService; import com.dsh.guns.modular.system.service.ITStudentService; -import com.dsh.guns.modular.system.util.WeChatUtil; import com.github.binarywang.wxpay.bean.ecommerce.ApplymentsResult; import com.github.binarywang.wxpay.service.EcommerceService; import com.github.binarywang.wxpay.service.WxPayService; @@ -46,8 +45,8 @@ private IOperatorAuthService operatorAuthService; @Autowired private TOperatorMapper operatorMapper; - @Autowired - private WeChatUtil weChatUtil; +// @Autowired +// private WeChatUtil weChatUtil; // @Override // public void mgtShopAuth(MgtShopAuthDto mgtShopAuthDto) { diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/AutoUpdateVerifierTest.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/AutoUpdateVerifierTest.java new file mode 100644 index 0000000..e6320f0 --- /dev/null +++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/AutoUpdateVerifierTest.java @@ -0,0 +1,117 @@ +package com.dsh.guns.modular.system.util; + +import static org.apache.http.HttpHeaders.ACCEPT; +import static org.apache.http.HttpStatus.SC_OK; +import static org.apache.http.entity.ContentType.APPLICATION_JSON; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import com.github.binarywang.wxpay.v3.WechatPayUploadHttpPost; +import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder; +import com.wechat.pay.contrib.apache.httpclient.auth.AutoUpdateCertificatesVerifier; +import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner; +import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials; +import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator; +import com.wechat.pay.contrib.apache.httpclient.util.PemUtil; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.security.PrivateKey; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.util.EntityUtils; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +@Deprecated +public class AutoUpdateVerifierTest { + + // 你的商户私钥 + private static final String privateKey = "-----BEGIN PRIVATE KEY-----\n" + + "-----END PRIVATE KEY-----\n"; + //测试AutoUpdateCertificatesVerifier的verify方法参数 + private static final String serialNumber = ""; + private static final String message = ""; + private static final String signature = ""; + private static final String merchantId = ""; // 商户号 + private static final String merchantSerialNumber = ""; // 商户证书序列号 + private static final String apiV3Key = ""; // API V3密钥 + private CloseableHttpClient httpClient; + private AutoUpdateCertificatesVerifier verifier; + + @Before + public void setup() { + PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(privateKey); + + //使用自动更新的签名验证器,不需要传入证书 + verifier = new AutoUpdateCertificatesVerifier( + new WechatPay2Credentials(merchantId, new PrivateKeySigner(merchantSerialNumber, merchantPrivateKey)), + apiV3Key.getBytes(StandardCharsets.UTF_8)); + + httpClient = WechatPayHttpClientBuilder.create() + .withMerchant(merchantId, merchantSerialNumber, merchantPrivateKey) + .withValidator(new WechatPay2Validator(verifier)) + .build(); + } + + @After + public void after() throws IOException { + httpClient.close(); + } + + @Test + public void autoUpdateVerifierTest() { + assertTrue(verifier.verify(serialNumber, message.getBytes(StandardCharsets.UTF_8), signature)); + } + + @Test + public void getCertificateTest() throws Exception { + URIBuilder uriBuilder = new URIBuilder("https://api.mch.weixin.qq.com/v3/certificates"); + HttpGet httpGet = new HttpGet(uriBuilder.build()); + httpGet.addHeader(ACCEPT, APPLICATION_JSON.toString()); + CloseableHttpResponse response = httpClient.execute(httpGet); + assertEquals(SC_OK, response.getStatusLine().getStatusCode()); + try { + HttpEntity entity = response.getEntity(); + // do something useful with the response body + // and ensure it is fully consumed + EntityUtils.consume(entity); + } finally { + response.close(); + } + } + + @Test + public void uploadImageTest() throws Exception { + String filePath = "/your/home/hellokitty.png"; + + URI uri = new URI("https://api.mch.weixin.qq.com/v3/merchant/media/upload"); + + File file = new File(filePath); + try (FileInputStream fileIs = new FileInputStream(file)) { + String sha256 = DigestUtils.sha256Hex(fileIs); + try (InputStream is = new FileInputStream(file)) { + WechatPayUploadHttpPost request = new WechatPayUploadHttpPost.Builder(uri) + .withImage(file.getName(), sha256, is) + .build(); + + try (CloseableHttpResponse response = httpClient.execute(request)) { + assertEquals(SC_OK, response.getStatusLine().getStatusCode()); + HttpEntity entity = response.getEntity(); + // do something useful with the response body + // and ensure it is fully consumed + String s = EntityUtils.toString(entity); + System.out.println(s); + } + } + } + } +} \ No newline at end of file diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/HttpRequestUtil.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/HttpRequestUtil.java index f63c573..5adbfaa 100644 --- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/HttpRequestUtil.java +++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/HttpRequestUtil.java @@ -53,7 +53,39 @@ e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); - } + } + return result; + }/*** + * get请求(带参数) + * @param url + * @return String + */ + public static String getReq1(String url, Map<String, String> params) { + String result = null; + try { + URIBuilder uriBuilder = new URIBuilder(url); + Iterator maplist = params.entrySet().iterator(); + while (maplist.hasNext()) { + Map.Entry<String, String> map = (Map.Entry<String, String>) maplist.next(); + uriBuilder.addParameter(map.getKey(), map.getValue()); + } + CloseableHttpClient client = HttpClientBuilder.create().build(); + HttpPost get = new HttpPost(uriBuilder.build()); + // todo 验签 + get.setHeader("Authorization", "close"); + get.setHeader("Content-Type", "application/json"); + get.setHeader("Accept", "application/json"); + get.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36"); + HttpResponse response = client.execute(get); + result = EntityUtils.toString(response.getEntity(), "UTF-8"); + + } catch (URISyntaxException e) { + e.printStackTrace(); + } catch (ClientProtocolException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } return result; } public static String postRequest(String url, Map<String, String> params) { @@ -96,7 +128,49 @@ } return result; } - + public static String postRequest1(String url, Map<String, Object> params) { + // 构造HttpClient的实例 + HttpClient httpClient = new HttpClient(); + // 创建POST方法的实例 + PostMethod postMethod = new PostMethod(url); + // 设置请求头信息 + postMethod.setRequestHeader("Authorization", "close"); + postMethod.setRequestHeader("Accept", "application/json"); + postMethod.addRequestHeader("Content-Type", "application/json"); + postMethod.addRequestHeader("Wechatpay-Serial", "application/json"); + postMethod.setRequestHeader("Connection", "close"); + // 添加参数 + for (Map.Entry<String, Object> entry : params.entrySet()) { + postMethod.addParameter(entry.getKey(), entry.getValue().toString()); + } + // 使用系统提供的默认的恢复策略,设置请求重试处理,用的是默认的重试处理:请求三次 + httpClient.getParams().setBooleanParameter("http.protocol.expect-continue", false); + // 接收处理结果 + String result = null; + try { + // 执行Http Post请求 + httpClient.executeMethod(postMethod); + // 返回处理结果 + result = postMethod.getResponseBodyAsString(); + } catch (HttpException e) { + // 发生致命的异常,可能是协议不对或者返回的内容有问题 + System.out.println("请检查输入的URL!"); + e.printStackTrace(); + } catch (IOException e) { + // 发生网络异常 + System.out.println("发生网络异常!"); + e.printStackTrace(); + } finally { + // 释放链接 + postMethod.releaseConnection(); + // 关闭HttpClient实例 + if (httpClient != null) { + ((SimpleHttpConnectionManager) httpClient.getHttpConnectionManager()).shutdown(); + httpClient = null; + } + } + return result; + } public static String getRequest(String url, Map<String, String> params) { // 构造HttpClient实例 HttpClient client = new HttpClient(); diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/TaskUtil.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/TaskUtil.java index 146c8b4..60b077b 100644 --- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/TaskUtil.java +++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/TaskUtil.java @@ -1,8 +1,20 @@ package com.dsh.guns.modular.system.util; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.dsh.guns.modular.system.model.OperatorAuth; +import com.dsh.guns.modular.system.model.OperatorAuthAlipay; +import com.dsh.guns.modular.system.model.OperatorUser; +import com.dsh.guns.modular.system.model.TOperator; +import com.dsh.guns.modular.system.service.*; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; /** @@ -10,12 +22,131 @@ */ @Component public class TaskUtil { + @Autowired + private TOperatorService operatorService; + @Autowired + private TOperatorCityService operatorCityService; + @Autowired + private IOperatorAuthService operatorAuthService; + @Autowired + private IOperatorAuthWxService operatorAuthWxService; + @Autowired + private IOperatorUserService operatorUserService; + // 每隔5分钟执行一次 查询商户支付宝和微信绑定状态 + @Scheduled(fixedRate = 5 * 60 * 1000) + public void queryWxAndZfbState() { + // 支付宝 + List<OperatorAuthAlipay> list = operatorAuthService.list(); + for (OperatorAuthAlipay operatorAuthAlipay : list) { + OperatorUser operatorId = operatorUserService.getOne(new QueryWrapper<OperatorUser>() + .eq("operatorId", operatorAuthAlipay.getOperatorId())); + if (operatorId == null)return; + operatorId.setAlipayAudit(operatorAuthAlipay.getAuditState()); + operatorUserService.updateById(operatorId); + } + // 微信 + List<OperatorAuth> list1 = operatorAuthWxService.list(); + for (OperatorAuth operatorAuth : list1) { + OperatorUser operatorId = operatorUserService.getOne(new QueryWrapper<OperatorUser>() + .eq("operatorId", operatorAuth.getOperatorId())); + if (operatorId == null)return; + operatorId.setWechatAudit(operatorAuth.getAuditState()); + operatorUserService.updateById(operatorId); + } + } + // 每隔5分钟执行一次 查询商户支付宝和微信绑定状态 如果两者都进件成功 那么修改t_operator表为商户绑定成功状态 + @Scheduled(fixedRate = 5 * 60 * 1000) + public void queryOperatorState() { + List<TOperator> list2 = operatorService.list(); + for (TOperator tOperator : list2) { + OperatorUser operatorId = operatorUserService.getOne(new QueryWrapper<OperatorUser>() + .eq("operatorId", tOperator.getId())); + if (operatorId == null)return; + if (operatorId.getAlipayAudit() == 2 && operatorId.getWechatAudit() == 2){ + tOperator.setState(2); + operatorService.updateById(tOperator); + } + } + } + @Scheduled(fixedRate = 1 * 60 * 1000) + public void queryOperatorState1() { + List<OperatorAuth> list = operatorAuthWxService.list(); + for (OperatorAuth operatorAuth : list) { + queryState(operatorAuth.getOrderNo()); + } + } + /** + * 查询进件申请单审核状态 + */ + public JSONObject queryState(String orderNo) { + String url = "https://api.mch.weixin.qq.com/v3/ecommerce/applyments/out-request-no/"+orderNo; + String req1 = HttpRequestUtil.getReq1(url, new HashMap<>()); + System.err.println("查询申请单审核状态字符串"+req1); + JSONObject jsonObject = JSON.parseObject(req1); + System.err.println("查询申请单审核状态Json"+jsonObject); + String applymentState = jsonObject.getString("applyment_state"); + String outBizNo = jsonObject.getString("out_request_no"); + OperatorAuth operatorAuth = operatorAuthWxService.getOne( + new QueryWrapper<OperatorAuth>() + .eq("outBizNo", outBizNo)); + if (operatorAuth == null)return null; - - + OperatorUser operatorUser = operatorUserService.getOne(new QueryWrapper<OperatorUser>() + .eq("operatorId", operatorAuth.getOperatorId())); + // 审核状态 + operatorAuth.setApplymentState(applymentState); + if (applymentState.equals("REJECTED") || applymentState.equals("FROZEN")){ + operatorUser.setWechatAudit(3); + operatorAuth.setAuditState(2); + // 如果被拒 赋值拒绝原因 + operatorAuth.setRefuseReason(jsonObject.getJSONObject("audit_detail").getString("reject_reason")); + } + if (applymentState.equals("NEED_SIGN")){ + operatorAuth.setSignUrl(jsonObject.getString("sign_url")); + operatorAuth.setMerchantNumber(jsonObject.getString("sub_mchid")); + } + if (applymentState.equals("FINISH")){ + operatorAuth.setMerchantNumber(jsonObject.getString("sub_mchid")); + operatorUser.setWechatAudit(2); + operatorAuth.setAuditState(1); + } + if (applymentState.equals("ACCOUNT_NEED_VERIFY")){ + operatorAuth.setLegalValidationUrl(jsonObject.getString("legal_validation_url")); + } + return jsonObject; + /** + * { + * "applyment_state" : "FINISH", + * "applyment_state_desc" : "审核中", + * "sign_url" : "https://pay.weixin.qq.com/public/apply4ec_sign/s?applymentId=2000002126198476&sign=b207b673049a32c858f3aabd7d27c7ec", + * "sub_mchid" : "1542488631", + * "account_validation" : { + * "account_name" : "aOf7Gk2qT26kakkuTZpbFAn7Mb7xcar0LlQaYoi3+LnnWwgAsfaUUTg9+GmYJq6YCz+RiluWHeHFq1lt8n3eIkF0laVvqmAU80xIWGZgWJnRmnRuZxsg0HJZfnUac2JfqyuL8OoyM2YSuYDqdsyvcOlgUQgq8MPCR6pmvhBCmIeJvnVSm8J+L+yx912itUmTDxhdBlu1CFBIUefME9nYB70vCVTNAVXgURkf65mjHMBiE9Y+wrPZVmTIIz3C3PtPVMZYDEvBT4rDdICA3ZYXshYqeOSslSjSMf+MhhC4oaujiISFzq3AE+as7mAEDJly+DgRuVs74msmKUH8pl+3oA==", + * "account_no" : "aOf7Gk2qT26kakkuTZpbFAn7Mb7xcar0LlQaYoi3+LnnWwgAsfaUUTg9+GmYJq6YCz+RiluWHeHFq1lt8n3eIkF0laVvqmAU80xIWGZgWJnRmnRuZxsg0HJZfnUac2JfqyuL8OoyM2YSuYDqdsyvcOlgUQgq8MPCR6pmvhBCmIeJvnVSm8J+L+yx912itUmTDxhdBlu1CFBIUefME9nYB70vCVTNAVXgURkf65mjHMBiE9Y+wrPZVmTIIz3C3PtPVMZYDEvBT4rDdICA3ZYXshYqeOSslSjSMf+MhhC4oaujiISFzq3AE+as7mAEDJly+DgRuVs74msmKUH8pl+3oA==", + * "pay_amount" : 124, + * "destination_account_number" : "7222223333322332", + * "destination_account_name" : "财付通支付科技有限公司", + * "destination_account_bank" : "招商银行威盛大厦支行", + * "city" : "深圳", + * "remark" : "入驻账户验证", + * "deadline" : "2018-12-10 17:09:01" + * }, + * "audit_detail" : [ + * { + * "param_name" : "id_card_copy", + * "reject_reason" : "身份证背面识别失败,请上传更清晰的身份证图片。" + * } + * ], + * "legal_validation_url" : "https://pay.weixin.qq.com/public/apply4ec_sign/s?applymentId=2000002126198476&sign=b207b673049a32c858f3aabd7d27c7ec", + * "out_request_no" : "APPLYMENT_00000000001", + * "applyment_id" : 2000002124775691, + * "sign_state" : "SIGNED" + * } + */ + } /** * 每月第一天的1点执行的任务 diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/WeChatUtil.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/WeChatUtil.java index b85e134..0db8e40 100644 --- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/WeChatUtil.java +++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/WeChatUtil.java @@ -1,168 +1,168 @@ -package com.dsh.guns.modular.system.util; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.alipay.api.domain.Shop; -import com.dsh.course.util.UUIDUtil; -import com.dsh.guns.core.util.ToolUtil; -import com.dsh.guns.modular.system.controller.util.UploadUtil; -import com.dsh.guns.modular.system.model.OperatorAuth; -import com.dsh.guns.modular.system.model.TOperator; -import com.dsh.guns.modular.system.model.User; -import com.dsh.guns.modular.system.service.IUserService; -import com.github.binarywang.wxpay.bean.ecommerce.ApplymentsRequest; -import com.github.binarywang.wxpay.bean.ecommerce.ApplymentsResult; -import com.github.binarywang.wxpay.bean.media.ImageUploadResult; -import com.github.binarywang.wxpay.service.EcommerceService; -import com.github.binarywang.wxpay.service.MerchantMediaService; -import com.github.binarywang.wxpay.service.WxPayService; -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -import org.apache.commons.codec.digest.DigestUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.http.*; -import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 微信工具类 - */ -@Component -public class WeChatUtil { - - private WxPayService wxService; - - - - /** - * @description 电商二级商户进件(提交申请单) - * @author jqs - * @date 2023/8/11 10:04 - * @param shopAuthentication - * @param applyNumber - * @param operator - * @return ApplymentsResult - */ - - - public ApplymentsResult ecommerceApply(OperatorAuth shopAuthentication, String applyNumber, TOperator operator) throws Exception { - - EcommerceService ecommerceService = wxService.getEcommerceService(); - MerchantMediaService merchantMediaService = wxService.getMerchantMediaService(); - ApplymentsRequest request = new ApplymentsRequest(); - //生成提交类 - request.setOutRequestNo(applyNumber); - if("ENTERPRISE".equals(shopAuthentication.getBodyType())){ - request.setOrganizationType("2"); - }else{ - request.setOrganizationType("4"); - } - //营业执照 - ApplymentsRequest.BusinessLicenseInfo business_license_info = new ApplymentsRequest.BusinessLicenseInfo(); - InputStream blImageIO = OBSUploadUtil.getOBSStream(shopAuthentication.getBusinessPicture().replace("https://obs.ap-southeast-4.myhuaweicloud.com/","")); - ImageUploadResult blImageIR = merchantMediaService.imageUploadV3(blImageIO,applyNumber+"blimage.jpg"); - business_license_info.setBusinessLicenseCopy(blImageIR.getMediaId()); - blImageIO.close(); - business_license_info.setBusinessLicenseNumber(shopAuthentication.getBusinessNumber()); - business_license_info.setMerchantName(shopAuthentication.getBusinessName()); - business_license_info.setLegalPerson(shopAuthentication.getLegalPerson()); - business_license_info.setCompanyAddress(shopAuthentication.getRegisterAddress()); - List<String> businessTimeList = new ArrayList<>(); - businessTimeList.add(0,shopAuthentication.getBusinessTerm()); - businessTimeList.add(1,shopAuthentication.getBusinessEnd()); - if(businessTimeList!=null&&businessTimeList.size()>1){ - String businessTime = JSONObject.toJSONString(businessTimeList); - business_license_info.setBusinessTime(businessTime); - } - request.setBusinessLicenseInfo(business_license_info); - //法人证件 - request.setIdDocType("IDENTIFICATION_TYPE_MAINLAND_IDCARD"); - ApplymentsRequest.IdCardInfo id_card_info = new ApplymentsRequest.IdCardInfo(); - InputStream lpIcFrontIO = OBSUploadUtil.getOBSStream(shopAuthentication.getLegalFront().replace("https://obs.ap-southeast-4.myhuaweicloud.com/","")); - ImageUploadResult lpIcFrontIR = merchantMediaService.imageUploadV3(lpIcFrontIO,applyNumber+"lpIcFront.jpg"); - id_card_info.setIdCardCopy(lpIcFrontIR.getMediaId()); - lpIcFrontIO.close(); - InputStream lpIcBackIO = OBSUploadUtil.getOBSStream(shopAuthentication.getLegalBack().replace("https://obs.ap-southeast-4.myhuaweicloud.com/","")); - ImageUploadResult lpIcBackIR = merchantMediaService.imageUploadV3(lpIcBackIO,applyNumber+"lpIcBack.jpg"); - id_card_info.setIdCardNational(lpIcBackIR.getMediaId()); - lpIcBackIO.close(); - id_card_info.setIdCardName(shopAuthentication.getLegalPerson()); - id_card_info.setIdCardNumber(shopAuthentication.getLeagleNumber()); - if("ENTERPRISE".equals(shopAuthentication.getBodyType())){ - id_card_info.setIdCardAddress(shopAuthentication.getLegalAddress()); - } - id_card_info.setIdCardValidTimeBegin(shopAuthentication.getLegalTerm()); - id_card_info.setIdCardValidTime(shopAuthentication.getLegalEnd()); - request.setIdCardInfo(id_card_info); - //企业填写 - if("ENTERPRISE".equals(shopAuthentication.getBodyType())){ - //受益人 - if("true".equals(shopAuthentication.getIsBeneficiary())){ - request.setOwner(true); - }else{ - request.setOwner(false); - List<ApplymentsRequest.UboInfo> ubo_info_list = new ArrayList<>(); - ApplymentsRequest.UboInfo uboInfo = new ApplymentsRequest.UboInfo(); - uboInfo.setUboIdDocType("IDENTIFICATION_TYPE_MAINLAND_IDCARD"); - InputStream uboIcFrontIO = OBSUploadUtil.getOBSStream(shopAuthentication.getBeneficiaryFront().replace("https://obs.ap-southeast-4.myhuaweicloud.com/","")); - ImageUploadResult uboIcFrontIR = merchantMediaService.imageUploadV3(uboIcFrontIO,applyNumber+"uboIcFront.jpg"); - uboInfo.setUboIdDocCopy(uboIcFrontIR.getMediaId()); - uboIcFrontIO.close(); - InputStream uboIcBackIO = OBSUploadUtil.getOBSStream(shopAuthentication.getBeneficiaryBack().replace("https://obs.ap-southeast-4.myhuaweicloud.com/","")); - ImageUploadResult uboIcBackIR = merchantMediaService.imageUploadV3(uboIcBackIO,applyNumber+"uboIcBack.jpg"); - uboInfo.setUboIdDocCopyBack(uboIcBackIR.getMediaId()); - uboIcBackIO.close(); - uboInfo.setUboIdDocName(shopAuthentication.getBeneficiary()); - uboInfo.setUboIdDocNumber(shopAuthentication.getBeneficiaryNumber()); - uboInfo.setUboIdDocAddress(shopAuthentication.getBeneficiaryAddress()); - uboInfo.setUboIdDocPeriodBegin(shopAuthentication.getBeneficiaryTerm()); - ubo_info_list.add(uboInfo); - request.setUboInfoList(ubo_info_list); - } - } - //结算账户信息 - ApplymentsRequest.AccountInfo accountInfo = new ApplymentsRequest.AccountInfo(); - if(shopAuthentication.getAccountType().equals(1)){ - accountInfo.setBankAccountType("74"); - }else{ - accountInfo.setBankAccountType("75"); - } - accountInfo.setAccountBank(shopAuthentication.getBank()); - accountInfo.setAccountName(shopAuthentication.getAccountName()); - accountInfo.setBankAddressCode(shopAuthentication.getCityCode()); - accountInfo.setBankName(shopAuthentication.getBankName()); - accountInfo.setAccountNumber(shopAuthentication.getBankNumber()); - request.setAccountInfo(accountInfo); - ApplymentsRequest.ContactInfo contactInfo = new ApplymentsRequest.ContactInfo(); - contactInfo.setContactType("65"); - contactInfo.setContactName(shopAuthentication.getLegalPerson()); - contactInfo.setContactIdCardNumber(shopAuthentication.getLeagleNumber()); - contactInfo.setMobilePhone(shopAuthentication.getLegalPhone()); - contactInfo.setContactEmail(shopAuthentication.getLegalEmail()); - request.setContactInfo(contactInfo); - //店铺信息 - ApplymentsRequest.SalesSceneInfo salesSceneInfo = new ApplymentsRequest.SalesSceneInfo(); - salesSceneInfo.setStoreName(operator.getName()); -// InputStream storeQrCodeIO = OBSUploadUtils.getOSSInputStream(operator.getShopCode().replace("https://hongruitang.oss-cn-beijing.aliyuncs.com/","")); -// ImageUploadResult storeQrCodeIR = merchantMediaService.imageUploadV3(storeQrCodeIO,applyNumber+"storeQrCode.jpg"); -// salesSceneInfo.setStoreQrCode(storeQrCodeIR.getMediaId()); -// storeQrCodeIO.close(); - request.setSalesSceneInfo(salesSceneInfo); - request.setMerchantShortname(operator.getName()); -// request.setBusinessAdditionPics(shopAuthentication.getBaPics()); -// request.setBusinessAdditionDesc(shopAuthentication.getBaDesc()); - return ecommerceService.createApply(request); - } - -} +//package com.dsh.guns.modular.system.util; +// +//import com.alibaba.fastjson.JSON; +//import com.alibaba.fastjson.JSONObject; +//import com.alipay.api.domain.Shop; +//import com.dsh.course.util.UUIDUtil; +//import com.dsh.guns.core.util.ToolUtil; +//import com.dsh.guns.modular.system.controller.util.UploadUtil; +//import com.dsh.guns.modular.system.model.OperatorAuth; +//import com.dsh.guns.modular.system.model.TOperator; +//import com.dsh.guns.modular.system.model.User; +//import com.dsh.guns.modular.system.service.IUserService; +//import com.github.binarywang.wxpay.bean.ecommerce.ApplymentsRequest; +//import com.github.binarywang.wxpay.bean.ecommerce.ApplymentsResult; +//import com.github.binarywang.wxpay.bean.media.ImageUploadResult; +//import com.github.binarywang.wxpay.service.EcommerceService; +//import com.github.binarywang.wxpay.service.MerchantMediaService; +//import com.github.binarywang.wxpay.service.WxPayService; +//import lombok.AllArgsConstructor; +//import lombok.NoArgsConstructor; +//import org.apache.commons.codec.digest.DigestUtils; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.context.annotation.Bean; +//import org.springframework.http.*; +//import org.springframework.stereotype.Component; +//import org.springframework.web.client.RestTemplate; +// +//import java.io.ByteArrayInputStream; +//import java.io.InputStream; +//import java.io.UnsupportedEncodingException; +//import java.net.URLDecoder; +//import java.util.ArrayList; +//import java.util.HashMap; +//import java.util.List; +//import java.util.Map; +// +///** +// * 微信工具类 +// */ +//@Component +//public class WeChatUtil { +// +// private WxPayService wxService; +// +// +// +// /** +// * @description 电商二级商户进件(提交申请单) +// * @author jqs +// * @date 2023/8/11 10:04 +// * @param shopAuthentication +// * @param applyNumber +// * @param operator +// * @return ApplymentsResult +// */ +// +// +// public ApplymentsResult ecommerceApply(OperatorAuth shopAuthentication, String applyNumber, TOperator operator) throws Exception { +// +// EcommerceService ecommerceService = wxService.getEcommerceService(); +// MerchantMediaService merchantMediaService = wxService.getMerchantMediaService(); +// ApplymentsRequest request = new ApplymentsRequest(); +// //生成提交类 +// request.setOutRequestNo(applyNumber); +// if("ENTERPRISE".equals(shopAuthentication.getBodyType())){ +// request.setOrganizationType("2"); +// }else{ +// request.setOrganizationType("4"); +// } +// //营业执照 +// ApplymentsRequest.BusinessLicenseInfo business_license_info = new ApplymentsRequest.BusinessLicenseInfo(); +// InputStream blImageIO = OBSUploadUtil.getOBSStream(shopAuthentication.getBusinessPicture().replace("https://obs.ap-southeast-4.myhuaweicloud.com/","")); +// ImageUploadResult blImageIR = merchantMediaService.imageUploadV3(blImageIO,applyNumber+"blimage.jpg"); +// business_license_info.setBusinessLicenseCopy(blImageIR.getMediaId()); +// blImageIO.close(); +// business_license_info.setBusinessLicenseNumber(shopAuthentication.getBusinessNumber()); +// business_license_info.setMerchantName(shopAuthentication.getBusinessName()); +// business_license_info.setLegalPerson(shopAuthentication.getLegalPerson()); +// business_license_info.setCompanyAddress(shopAuthentication.getRegisterAddress()); +// List<String> businessTimeList = new ArrayList<>(); +// businessTimeList.add(0,shopAuthentication.getBusinessTerm()); +// businessTimeList.add(1,shopAuthentication.getBusinessEnd()); +// if(businessTimeList!=null&&businessTimeList.size()>1){ +// String businessTime = JSONObject.toJSONString(businessTimeList); +// business_license_info.setBusinessTime(businessTime); +// } +// request.setBusinessLicenseInfo(business_license_info); +// //法人证件 +// request.setIdDocType("IDENTIFICATION_TYPE_MAINLAND_IDCARD"); +// ApplymentsRequest.IdCardInfo id_card_info = new ApplymentsRequest.IdCardInfo(); +// InputStream lpIcFrontIO = OBSUploadUtil.getOBSStream(shopAuthentication.getLegalFront().replace("https://obs.ap-southeast-4.myhuaweicloud.com/","")); +// ImageUploadResult lpIcFrontIR = merchantMediaService.imageUploadV3(lpIcFrontIO,applyNumber+"lpIcFront.jpg"); +// id_card_info.setIdCardCopy(lpIcFrontIR.getMediaId()); +// lpIcFrontIO.close(); +// InputStream lpIcBackIO = OBSUploadUtil.getOBSStream(shopAuthentication.getLegalBack().replace("https://obs.ap-southeast-4.myhuaweicloud.com/","")); +// ImageUploadResult lpIcBackIR = merchantMediaService.imageUploadV3(lpIcBackIO,applyNumber+"lpIcBack.jpg"); +// id_card_info.setIdCardNational(lpIcBackIR.getMediaId()); +// lpIcBackIO.close(); +// id_card_info.setIdCardName(shopAuthentication.getLegalPerson()); +// id_card_info.setIdCardNumber(shopAuthentication.getLeagleNumber()); +// if("ENTERPRISE".equals(shopAuthentication.getBodyType())){ +// id_card_info.setIdCardAddress(shopAuthentication.getLegalAddress()); +// } +// id_card_info.setIdCardValidTimeBegin(shopAuthentication.getLegalTerm()); +// id_card_info.setIdCardValidTime(shopAuthentication.getLegalEnd()); +// request.setIdCardInfo(id_card_info); +// //企业填写 +// if("ENTERPRISE".equals(shopAuthentication.getBodyType())){ +// //受益人 +// if("true".equals(shopAuthentication.getIsBeneficiary())){ +// request.setOwner(true); +// }else{ +// request.setOwner(false); +// List<ApplymentsRequest.UboInfo> ubo_info_list = new ArrayList<>(); +// ApplymentsRequest.UboInfo uboInfo = new ApplymentsRequest.UboInfo(); +// uboInfo.setUboIdDocType("IDENTIFICATION_TYPE_MAINLAND_IDCARD"); +// InputStream uboIcFrontIO = OBSUploadUtil.getOBSStream(shopAuthentication.getBeneficiaryFront().replace("https://obs.ap-southeast-4.myhuaweicloud.com/","")); +// ImageUploadResult uboIcFrontIR = merchantMediaService.imageUploadV3(uboIcFrontIO,applyNumber+"uboIcFront.jpg"); +// uboInfo.setUboIdDocCopy(uboIcFrontIR.getMediaId()); +// uboIcFrontIO.close(); +// InputStream uboIcBackIO = OBSUploadUtil.getOBSStream(shopAuthentication.getBeneficiaryBack().replace("https://obs.ap-southeast-4.myhuaweicloud.com/","")); +// ImageUploadResult uboIcBackIR = merchantMediaService.imageUploadV3(uboIcBackIO,applyNumber+"uboIcBack.jpg"); +// uboInfo.setUboIdDocCopyBack(uboIcBackIR.getMediaId()); +// uboIcBackIO.close(); +// uboInfo.setUboIdDocName(shopAuthentication.getBeneficiary()); +// uboInfo.setUboIdDocNumber(shopAuthentication.getBeneficiaryNumber()); +// uboInfo.setUboIdDocAddress(shopAuthentication.getBeneficiaryAddress()); +// uboInfo.setUboIdDocPeriodBegin(shopAuthentication.getBeneficiaryTerm()); +// ubo_info_list.add(uboInfo); +// request.setUboInfoList(ubo_info_list); +// } +// } +// //结算账户信息 +// ApplymentsRequest.AccountInfo accountInfo = new ApplymentsRequest.AccountInfo(); +// if(shopAuthentication.getAccountType().equals(1)){ +// accountInfo.setBankAccountType("74"); +// }else{ +// accountInfo.setBankAccountType("75"); +// } +// accountInfo.setAccountBank(shopAuthentication.getBank()); +// accountInfo.setAccountName(shopAuthentication.getAccountName()); +// accountInfo.setBankAddressCode(shopAuthentication.getCityCode()); +// accountInfo.setBankName(shopAuthentication.getBankName()); +// accountInfo.setAccountNumber(shopAuthentication.getBankNumber()); +// request.setAccountInfo(accountInfo); +// ApplymentsRequest.ContactInfo contactInfo = new ApplymentsRequest.ContactInfo(); +// contactInfo.setContactType("65"); +// contactInfo.setContactName(shopAuthentication.getLegalPerson()); +// contactInfo.setContactIdCardNumber(shopAuthentication.getLeagleNumber()); +// contactInfo.setMobilePhone(shopAuthentication.getLegalPhone()); +// contactInfo.setContactEmail(shopAuthentication.getLegalEmail()); +// request.setContactInfo(contactInfo); +// //店铺信息 +// ApplymentsRequest.SalesSceneInfo salesSceneInfo = new ApplymentsRequest.SalesSceneInfo(); +// salesSceneInfo.setStoreName(operator.getName()); +//// InputStream storeQrCodeIO = OBSUploadUtils.getOSSInputStream(operator.getShopCode().replace("https://hongruitang.oss-cn-beijing.aliyuncs.com/","")); +//// ImageUploadResult storeQrCodeIR = merchantMediaService.imageUploadV3(storeQrCodeIO,applyNumber+"storeQrCode.jpg"); +//// salesSceneInfo.setStoreQrCode(storeQrCodeIR.getMediaId()); +//// storeQrCodeIO.close(); +// request.setSalesSceneInfo(salesSceneInfo); +// request.setMerchantShortname(operator.getName()); +//// request.setBusinessAdditionPics(shopAuthentication.getBaPics()); +//// request.setBusinessAdditionDesc(shopAuthentication.getBaDesc()); +// return ecommerceService.createApply(request); +// } +// +//} diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/WxUploadImgUtil.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/WxUploadImgUtil.java new file mode 100644 index 0000000..143894f --- /dev/null +++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/WxUploadImgUtil.java @@ -0,0 +1,95 @@ +package com.dsh.guns.modular.system.util; + + +import com.github.binarywang.wxpay.v3.WechatPayUploadHttpPost; +import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder; +import com.wechat.pay.contrib.apache.httpclient.auth.AutoUpdateCertificatesVerifier; +import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner; +import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials; +import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator; +import com.wechat.pay.contrib.apache.httpclient.util.PemUtil; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.time.DateUtils; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.util.EntityUtils; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; +import java.security.PrivateKey; +import java.text.ParseException; +import java.util.Date; + +import static org.apache.http.HttpStatus.SC_OK; +import static org.junit.Assert.assertEquals; + + +/** + * 定时任务工具类 + */ +@Component +public class WxUploadImgUtil { + // 你的商户私钥 + private static final String privateKey = "-----BEGIN PRIVATE KEY-----\n" + + "-----END PRIVATE KEY-----\n"; + //测试AutoUpdateCertificatesVerifier的verify方法参数 + private static final String serialNumber = ""; + private static final String message = ""; + private static final String signature = ""; + private static final String merchantId = ""; // 商户号 + private static final String merchantSerialNumber = ""; // 商户证书序列号 + private static final String apiV3Key = ""; // API V3密钥 + private CloseableHttpClient httpClient; + private AutoUpdateCertificatesVerifier verifier; + + public String uploadImg(String date, String pattern) throws IOException, URISyntaxException { + PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(privateKey); + + //使用自动更新的签名验证器,不需要传入证书 + verifier = new AutoUpdateCertificatesVerifier( + new WechatPay2Credentials(merchantId, new PrivateKeySigner(merchantSerialNumber, merchantPrivateKey)), + apiV3Key.getBytes(StandardCharsets.UTF_8)); + + httpClient = WechatPayHttpClientBuilder.create() + .withMerchant(merchantId, merchantSerialNumber, merchantPrivateKey) + .withValidator(new WechatPay2Validator(verifier)) + .build(); + String filePath = "/your/home/hellokitty.png"; + URI uri = new URI("https://api.mch.weixin.qq.com/v3/merchant/media/upload"); + File file = new File(filePath); + try (FileInputStream fileIs = new FileInputStream(file)) { + String sha256 = DigestUtils.sha256Hex(fileIs); + try (InputStream is = new FileInputStream(file)) { + WechatPayUploadHttpPost request = new WechatPayUploadHttpPost.Builder(uri) + .withImage(file.getName(), sha256, is) + .build(); + + try (CloseableHttpResponse response = httpClient.execute(request)) { + assertEquals(SC_OK, response.getStatusLine().getStatusCode()); + HttpEntity entity = response.getEntity(); + // do something useful with the response body + // and ensure it is fully consumed + String s = EntityUtils.toString(entity); + System.out.println(s); + } + } + } + httpClient.close(); + return null; + } + + + + + + + +} diff --git a/cloud-server-management/src/main/resources/mapper/TOperatorAuthWxMapper.xml b/cloud-server-management/src/main/resources/mapper/TOperatorAuthWxMapper.xml new file mode 100644 index 0000000..c32f426 --- /dev/null +++ b/cloud-server-management/src/main/resources/mapper/TOperatorAuthWxMapper.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.dsh.course.mapper.TOperatorAuthWxMapper"> + + +</mapper> diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/OperatorUser_proportionAuthWX.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/OperatorUser_proportionAuthWX.html new file mode 100644 index 0000000..dec2b08 --- /dev/null +++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/OperatorUser_proportionAuthWX.html @@ -0,0 +1,305 @@ +@layout("/common/_container.html"){ +<style> + .avatar-uploader .el-upload { + border: 1px dashed #d9d9d9; + border-radius: 6px; + cursor: pointer; + position: relative; + height: 100px; + width: 100px; + overflow: hidden; + } + + .avatar-uploader .el-upload:hover { + border-color: #409EFF; + } + .avatar-uploader-icon { + font-size: 28px; + color: #8c939d; + width: 100px; + height: 100px; + line-height: 100px; + margin-top: 32px; + text-align: center; + } + .avatar { + width: 100px; + height: 100px; + display: block; + } + + .col-sm-12 { + margin-top: 20px; + } + + .col-sm-12 select { + height: 33px; + } + #app1{ + margin-left: 255px; + } + + +</style> +<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=77b37f0753049c4e712ea79a24e0719c"></script> +<div class="ibox float-e-margins"> + <div class="ibox-content"> + <div class="form-horizontal" id="carInfoForm"> + <h2>商户信息</h2> + <div style="display: flex"> + <span>运营商名称:</span><span>${data.name}</span> + <span>管理员姓名:</span><span>${user.name}</span> + <span>管理员电话:</span><span>${user.phone}</span> + </div> + <h2>商户号信息</h2> + </br> + </br> + <input hidden id="id" value="${id}"> + <div class="row"> + <div class="col-lg-6" style=""> + <div class="form-group"> + <label class="col-sm-4 control-label" > + 商户类型:<input checked type="radio" name="bodyType" value="2" onclick="updateHalf(2)">企业 + <input type="radio" name="bodyType" value="4" onclick="updateHalf(1)">个人 + </label> + </div> + + <div class="form-group" > + <label class="col-sm-3 control-label">*法人姓名:</label> + <div class="col-sm-9" > + <input style="width: 300px" class="form-control" id="legalPerson" value="" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*法人身份证号:</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" value="" id="leagleNumber" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group"> + <#avatar id="IDCardImg" name="*法人身份证正面照" avatarImg="" /> + </div> + <div class="form-group"> + <#avatar id="IDCardImg1" name="*法人身份证背面照" avatarImg="" /> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*身份证开始时间:</label> + <div class="col-sm-9" style="display: flex"> + <input style="width: 300px" class="form-control" id="IDCardTime" value="" name="IDCardTime" type="date"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*身份证结束时间:</label> + <div class="col-sm-9" style="display: flex"> + <input style="width: 300px" class="form-control" value="" id="IDCardEnd" name="IDCardTime" type="date"> + <input type="checkbox" style="margin-left: 10px" id="IDCardE" value="0" onchange="TSite.tradeYse(this)">长期</input> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*证件居住地址:</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" value="" id="legalAddress" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*法人邮箱:</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" value="" id="legalEmail" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*法人电话:</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" value="" id="legalPhone" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group"> + <#avatar id="license" name="*营业执照" avatarImg="" /> + </div> + <div class="form-group" > + <label class="col-sm-3 control-label">*营业执照注册号:</label> + <div class="col-sm-9" > + <input style="width: 300px" class="form-control" id="businessNumber" value="" placeholder="请输入营业执照注册号" type="text"> + </div> + </div> + <div class="form-group" > + <label class="col-sm-3 control-label">*商户名称(一般与证件名称相同):</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" value="" id="businessName" placeholder="请输入商户名称" type="text"> + </div> + </div> + <div class="form-group" > + <label class="col-sm-3 control-label">*商户别名(微信账单显示的商户名称):</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" value="" id="aliasName" placeholder="请输入商户别名" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*营业期限(开始):</label> + <div class="col-sm-9" style="display: flex"> + <input style="width: 300px" class="form-control" id="tradeTime" value="" name="tradeTime" type="date"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*营业期限(结束):</label> + <div class="col-sm-9" style="display: flex"> + <input style="width: 300px" class="form-control" value="" id="endTime" name="endTime" type="date"> + <input type="checkbox" style="margin-left: 10px" id="tradeE" value="0" onchange="TSite.tradeYse(this)">长期</input> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*营业执照注册地址:</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" value="" id="companyAddress" placeholder="请输入" type="text"> + </div> + </div> + </div> + <div class="col-lg-6" style=""> + <div id="banks"> + <div class="form-group"> + <label class="col-sm-4 control-label" > + 账号使用类型:<input checked type="radio" name="useType" value="74" >对公 + <input type="radio" name="useType" value="75" >对私 + </label> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*开户银行:</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" id="bank" value="" placeholder="请输入(例:中国农业银行)" type="text"> + </div> + </div> + <div class="form-group" > + <label class="col-sm-3 control-label">*开户银行联行号:</label> + <div class="col-sm-9" > + <input style="width: 300px" class="form-control" id="bankCardTwo" value="" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group" > + <label class="col-sm-3 control-label">*开户名称:</label> + <div class="col-sm-9" > + <input style="width: 300px" class="form-control" id="bankUserName" value="" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group" > + <label class="col-sm-3 control-label">*开户银行全称(含支行):</label> + <div class="col-sm-9" > + <input style="width: 300px" class="form-control" id="bankName1" value="" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group" > + <label class="col-sm-3 control-label">*银行账号:</label> + <div class="col-sm-9" > + <input style="width: 300px" class="form-control" id="bankCard" value="" placeholder="请输入" type="text"> + </div> + </div> + + <div class="form-group" id="provinceCode"> + <label class="col-sm-3 control-label">*开户行所在省:</label> + <div class="col-sm-9"> + <select style="width: 300px" class="form-control" id="pCode" name="pCode" onchange="TSite.oneChange2(this)"> + <option style="width: 300px" value="">全部</option> + @for(obj in list){ + <option style="width: 300px" value="${obj.code}">${obj.name}</option> + @} + </select> + </div> + </div> + <div class="form-group" id="cityCode"> + <label class="col-sm-3 control-label">*开户行所在市:</label> + <div class="col-sm-9"> + <select style="width: 300px" class="form-control" id="cCode" name="cCode" > + </select> + </div> + </div> + </div> + </div> + <div class="row" id="benefit"> + <div class="col-lg-6" style=""> + <div class="form-group"> + <label class="col-sm-4 control-label" > + 法人是否为受益人:<input type="radio" checked name="type" value="true" onclick="updateHalf1(1)">是 + <input type="radio" name="type" value="false" onclick="updateHalf1(0)">否 + </label> + </div> + <div hidden id="benefitInfo"> + <div class="form-group"> + <label class="col-sm-3 control-label">*受益人姓名:</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" id="bName" name="bName" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*受益人身份证地址:</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" id="bAddress" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*受益人身份证有效期:</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" id="bTime" name="bTime" type="date"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*受益人身份证结束时间:</label> + <div class="col-sm-9" style="display: flex"> + <input style="width: 300px" class="form-control" id="bEnd" name="IDCardTime" type="date"> + <input type="checkbox" style="margin-left: 10px" id="bIDCardT" value="0" onchange="TSite.tradeYse(this)">长期</input> + </div> + </div> + <div class="form-group"> + <#avatar id="bImg1" name="受益人身份证正面照" /> + </div> + + <div class="col-lg-6" style=""> + <div class="form-group"> + <label class="col-sm-3 control-label">*受益人身份证号:</label> + <div class="col-sm-9" > + <input style="width: 300px" class="form-control" id="bIDNumber" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group"> + <#avatar id="bImg2" name="受益人身份证背面照" /> + </div> + </div> + </div> + </div> + </div> + </div> + <div class="form-group"> + <div class="row btn-group-m-t"> + <div class="col-sm-10 col-sm-offset-5" > + <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TSite.addSubmit1()"/> + <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TSite.close()"/> + </div> + </div> + </div> + </div> + </div> +</div> + +<script src="${ctxPath}/modular/system/operatorUser/operatorUser.js"></script> +<script src="${ctxPath}/js/vue/vue.js"></script> +<script src="${ctxPath}/js/elementui/index.js"></script> +<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css"> +<script> + function updateHalf(e) { + if(e==1){ + $("#benefit").hide() + }else { + $("#benefit").show() + } + } + function updateHalf1(e) { + if(e==0){ + // 法人不是受益人 + $("#benefitInfo").show() + }else { + // 法人是受益人 + $("#benefitInfo").hide() + } + } + + +</script> +@} diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/OperatorUser_proportionAuth_info.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/OperatorUser_proportionAuth_info.html index 2a8879b..ed31748 100644 --- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/OperatorUser_proportionAuth_info.html +++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/OperatorUser_proportionAuth_info.html @@ -149,7 +149,7 @@ <input type="radio" name="useType" value="02" >对私 </label> </div> - <div class="form-group"> + <div cl ass="form-group"> <label class="col-sm-4 control-label" > 银行卡类型:<input checked type="radio" name="cardType" value="DC" onclick="updateHalf(2)">借记卡 <input type="radio" name="cardType" value="CC" onclick="updateHalf(1)">信用卡 @@ -256,7 +256,7 @@ var cardType = "${cardType}"; var OBJradio=document.getElementsByName("bodyType") var type=document.getElementsByName("type") - if("${bodyType}"=="01"){ + if("${bodyType}"=="2"){ OBJradio[0].checked=true }else { OBJradio[1].checked=true diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/OperatorUser_proportionAuth_infoWX.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/OperatorUser_proportionAuth_infoWX.html new file mode 100644 index 0000000..337137d --- /dev/null +++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/OperatorUser_proportionAuth_infoWX.html @@ -0,0 +1,480 @@ +@layout("/common/_container.html"){ +<style> + .avatar-uploader .el-upload { + border: 1px dashed #d9d9d9; + border-radius: 6px; + cursor: pointer; + position: relative; + height: 100px; + width: 100px; + overflow: hidden; + } + + .avatar-uploader .el-upload:hover { + border-color: #409EFF; + } + .avatar-uploader-icon { + font-size: 28px; + color: #8c939d; + width: 100px; + height: 100px; + line-height: 100px; + margin-top: 32px; + text-align: center; + } + .avatar { + width: 100px; + height: 100px; + display: block; + } + + .col-sm-12 { + margin-top: 20px; + } + + .col-sm-12 select { + height: 33px; + } + #app1{ + margin-left: 255px; + } + + +</style> +<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=77b37f0753049c4e712ea79a24e0719c"></script> +<div class="ibox float-e-margins"> + <div class="ibox-content"> + <div class="form-horizontal" id="carInfoForm"> + <h2>商户信息</h2> + <div style="display: flex"> + <span>运营商名称:</span><span>${data.name}</span> + <span>管理员姓名:</span><span>${user.name}</span> + <span>管理员电话:</span><span>${user.phone}</span> + </div> + <h2>商户号信息</h2> + </br> + </br> + <input hidden id="id" value="${id}"> + <div class="row"> + <div class="col-lg-6" style=""> + <div class="form-group"> + <label class="col-sm-4 control-label" > + 商户类型:<input checked type="radio" name="bodyType" value="2" onclick="updateHalf(2)">企业 + <input type="radio" name="bodyType" value="4" onclick="updateHalf(1)">个人 + </label> + </div> + + <div class="form-group" > + <label class="col-sm-3 control-label">*法人姓名:</label> + <div class="col-sm-9" > + <input style="width: 300px" class="form-control" id="legalPerson" value="${item.legalPerson}" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*法人身份证号:</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" value="${item.leagleNumber}" id="leagleNumber" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group"> + <#avatar id="IDCardImg" name="*法人身份证正面照" avatarImg="${item.legalFront}" /> + </div> + <div class="form-group"> + <#avatar id="IDCardImg1" name="*法人身份证背面照" avatarImg="${item.legalBack}" /> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*身份证开始时间:</label> + <div class="col-sm-9" style="display: flex"> + <input style="width: 300px" class="form-control" id="IDCardTime" value="${item.legalTerm}" name="IDCardTime" type="date"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*身份证结束时间:</label> + <div class="col-sm-9" style="display: flex"> + <input style="width: 300px" class="form-control" value="${item.legalEnd}" id="IDCardEnd" name="IDCardTime" type="date"> + <input type="checkbox" style="margin-left: 10px" id="IDCardE" value="0" onchange="TSite.tradeYse(this)">长期</input> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*证件居住地址:</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" value="${item.legalAddress}" id="legalAddress" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*法人邮箱:</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" value="${item.legalEmail}" id="email" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*法人电话:</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" value="${item.legalPhone}" id="legalPhone" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group"> + <#avatar id="license" name="*营业执照" avatarImg="${item.businessPicture}" /> + </div> + <div class="form-group" > + <label class="col-sm-3 control-label">*营业执照注册号:</label> + <div class="col-sm-9" > + <input style="width: 300px" class="form-control" id="businessNumber" value="${item.businessNumber}" placeholder="请输入营业执照注册号" type="text"> + </div> + </div> + <div class="form-group" > + <label class="col-sm-3 control-label">*商户名称(一般与证件名称相同):</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" value="${item.businessName}" id="businessName" placeholder="请输入商户名称" type="text"> + </div> + </div> + <div class="form-group" > + <label class="col-sm-3 control-label">*商户别名(微信账单显示的商户名称):</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" value="${item.aliasName}" id="aliasName" placeholder="请输入商户别名" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*营业期限(开始):</label> + <div class="col-sm-9" style="display: flex"> + <input style="width: 300px" class="form-control" id="tradeTime" value="${item.businessTerm}" name="tradeTime" type="date"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*营业期限(结束):</label> + <div class="col-sm-9" style="display: flex"> + <input style="width: 300px" class="form-control" value="${item.businessEnd}" id="endTime" name="endTime" type="date"> + <input type="checkbox" style="margin-left: 10px" id="tradeE" value="0" onchange="TSite.tradeYse(this)">长期</input> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*营业执照注册地址:</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" value="${item.registerAddress}" id="companyAddress" placeholder="请输入" type="text"> + </div> + </div> + </div> + <div class="col-lg-6" style=""> + <div id="banks"> + <div class="form-group"> + <label class="col-sm-4 control-label" > + 账号使用类型:<input checked type="radio" name="useType" value="74" >对公 + <input type="radio" name="useType" value="75" >对私 + </label> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*开户银行:</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" id="bankName" value="${item.bank}" placeholder="请输入(例:中国农业银行)" type="text"> + </div> + </div> + <div class="form-group" > + <label class="col-sm-3 control-label">*开户银行联行号:</label> + <div class="col-sm-9" > + <input style="width: 300px" class="form-control" id="bankCardTwo" value="${item.bankCardTwo}" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group" > + <label class="col-sm-3 control-label">*开户名称:</label> + <div class="col-sm-9" > + <input style="width: 300px" class="form-control" id="bankUserName" value="${item.accountName}" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group" > + <label class="col-sm-3 control-label">*开户银行全称(含支行):</label> + <div class="col-sm-9" > + <input style="width: 300px" class="form-control" id="bankName1" value="${item.bankName}" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group" > + <label class="col-sm-3 control-label">*银行账号:</label> + <div class="col-sm-9" > + <input style="width: 300px" class="form-control" id="bankCard" value="${item.bankNumber}" placeholder="请输入" type="text"> + </div> + </div> + + <div class="form-group" id="provinceCode"> + <label class="col-sm-3 control-label">*开户行所在省:</label> + <div class="col-sm-9"> + <select style="width: 300px" class="form-control" id="pCode" name="pCode" onchange="TSite.oneChange2(this)"> + @for(obj in list4){ + <option style="width: 300px" value="${obj.code}" ${obj.code == item.provinceCode ? 'selected=selected' : ''}>${obj.name}</option> + @} + </select> + </div> + </div> + <div class="form-group" id="cityCode"> + <label class="col-sm-3 control-label">*开户行所在市:</label> + <div class="col-sm-9"> + <select style="width: 300px" class="form-control" id="cCode" name="cCode" > + @for(obj in list5){ + <option style="width: 300px" value="${obj.code}" ${obj.code == item.cityCode ? 'selected=selected' : ''}>${obj.name}</option> + @} + </select> + </div> + </div> + <div class="row" id="benefit"> + + <div class="form-group"> + <label class="col-sm-4 control-label" > + 法人是否为受益人:<input type="radio" checked name="type" value="true" onclick="updateHalf1(1)">是 + <input type="radio" name="type" value="false" onclick="updateHalf1(0)">否 + </label> + </div> + <div hidden id="benefitInfo"> + <div class="form-group"> + <label class="col-sm-3 control-label">*受益人姓名:</label> + <div class="col-sm-9"> + <input style="width: 300px" value="${item.benefitsName}"class="form-control" id="bName" name="bName" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*受益人身份证地址:</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control"value="${item.benefitsAddress}" id="bAddress" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*受益人身份证有效期:</label> + <div class="col-sm-9"> + <input style="width: 300px" class="form-control" value="${item.benefitsStartTime}" id="bTime" name="bTime" type="date"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*受益人身份证结束时间:</label> + <div class="col-sm-9" style="display: flex"> + <input style="width: 300px" class="form-control" value="${item.benefitsEndTime}" id="bEnd" name="IDCardTime" type="date"> + <input type="checkbox" style="margin-left: 10px" id="bIDCardT" value="0" onchange="TSite.tradeYse(this)">长期</input> + </div> + </div> + <div class="form-group"> + <#avatar id="bImg1" name="受益人身份证正面照" avatarImg="${item.benefitsFront}" /> + </div> + + <div class="form-group"> + <label class="col-sm-3 control-label">*受益人身份证号:</label> + <div class="col-sm-9" > + <input style="width: 300px" class="form-control" value="${item.benefitsNumber}" id="bIDNumber" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">*受益人证件居住地址:</label> + <div class="col-sm-9" > + <input style="width: 300px" class="form-control" value="${item.benefitsAddress}" id="bIDAddress" placeholder="请输入" type="text"> + </div> + </div> + <div class="form-group"> + <#avatar id="bImg2" name="受益人身份证背面照" avatarImg="${item.benefitsBack}"/> + + </div> + </div> + </div> + <div class="row" id="applyment_state"> + <div class="col-lg-6" > + <div class="form-group"> + <label class="col-sm-3 control-label">*申请状态:</label> + <div class="col-sm-9"> + <h3 style="color: red">${applymentState}</h3> + </div> + </div> + </div> + </div> + <div class="row" hidden id="account"> + <div class="col-lg-6" > + <div class="form-group"> + <label class="col-sm-3 control-label">*付款户名:</label> + <div class="col-sm-9"> + <h3>${accountName}</h3> + </div> + </div> + </div> + <div class="col-lg-6" > + <div class="form-group"> + <label class="col-sm-3 control-label">*付款卡号:</label> + <div class="col-sm-9"> + <h3>${accountNo}</h3> + </div> + </div> + </div> + <div class="col-lg-6" > + <div class="form-group"> + <label class="col-sm-3 control-label">*需要汇款的金额(单位:分):</label> + <div class="col-sm-9"> + <h3>${payAmount}</h3> + </div> + </div> + </div> + <div class="col-lg-6" > + <div class="form-group"> + <label class="col-sm-3 control-label">*收款账户的卡号:</label> + <div class="col-sm-9"> + <h3>${destinationAccountNumber}</h3> + </div> + </div> + </div> + <div class="col-lg-6" > + <div class="form-group"> + <label class="col-sm-3 control-label">*收款账户名:</label> + <div class="col-sm-9"> + <h3>${destinationAccountName}</h3> + </div> + </div> + </div> + <div class="col-lg-6" > + <div class="form-group"> + <label class="col-sm-3 control-label">*收款账户的开户银行名称:</label> + <div class="col-sm-9"> + <h3>${destinationAccountBank}</h3> + </div> + </div> + </div> + <div class="col-lg-6" > + <div class="form-group"> + <label class="col-sm-3 control-label">*收款账户的省市:</label> + <div class="col-sm-9"> + <h3>${city}</h3> + </div> + </div> + </div> + <div class="col-lg-6" > + <div class="form-group"> + <label class="col-sm-3 control-label">*商户汇款时,需要填写的备注信息:</label> + <div class="col-sm-9"> + <h3>${remark}</h3> + </div> + </div> + </div> + <div class="col-lg-6" > + <div class="form-group"> + <label class="col-sm-3 control-label">*请在此时间前完成汇款:</label> + <div class="col-sm-9"> + <h3>${deadline}</h3> + </div> + </div> + </div> + </div> + <div class="form-group" hidden id="sign_url"> + <label class="col-sm-3 control-label">*签约链接(需让申请单-管理者用微信扫码打开,完成签约):</label> + <div class="col-sm-9" > + <img src="https://we-park-life.oss-cn-beijing.aliyuncs.com/img/10e7c7ec88c14cb9970910ad642b4ad5.png" width="200px" height="200px" alt="二维码"> + </div> + </div> + <div class="form-group" hidden id="legal_validation_url"> + <label class="col-sm-3 control-label">*法人验证链接(商户法人用微信扫码打开,完成账户验证):</label> + <div class="col-sm-9" > + <img src="https://we-park-life.oss-cn-beijing.aliyuncs.com/img/10e7c7ec88c14cb9970910ad642b4ad5.png" width="200px" height="200px" alt="二维码"> + </div> + </div> + + <div class="row" hidden id="sign_state"> + <div class="col-lg-6" > + <div class="form-group"> + <label class="col-sm-3 control-label">*签约状态:</label> + <div class="col-sm-9"> + <h3 style="color: red">${signState}</h3> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + <div class="form-group"> + <div class="row btn-group-m-t"> + <div class="col-sm-10 col-sm-offset-5" > + <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TSite.addSubmit1()"/> + <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TSite.close()"/> + </div> + </div> + </div> + </div> + </div> +</div> + +<script src="${ctxPath}/modular/system/operatorUser/operatorUser.js"></script> +<script src="${ctxPath}/js/vue/vue.js"></script> +<script src="${ctxPath}/js/elementui/index.js"></script> +<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css"> +<script> + function updateHalf1(e) { + if(e==0){ + // 法人不是受益人 + $("#benefitInfo").show() + }else { + // 法人是受益人 + $("#benefitInfo").hide() + } + } + // function updateHalf(e) { + // if(e==3){ + // console.log("展示") + // $("#banks").show() + // $("#aliNumber").hide() + // }else if (e==4){ + // // 结算到支付宝账号 + // console.log("隐藏") + // $("#banks").hide() + // $("#aliNumber").show() + // } + // } + + window.onload = function(){ + var state="${state}" + if(state=="FINISH"){ + $("#sign_url").show() + } + var signState="${signState}" + if(signState!= 0){ + $("#sign_url").show() + } + var applymentState="${applymentState}" + var legalValidationUrl="${item.legalValidationUrl}" + if(applymentState== "待账户验证"){ + $("#account").show() + if (legalValidationUrl !=null && legalValidationUrl != ""){ + $("#legal_validation_url").show() + } + } + // 如果state为finish 才展示二维码链接 + var idCardEnd="${item.legalEnd}" + var businessEnd="${item.businessEnd}" + var benefitsEndTime="${item.benefitsEndTime}" + var tradeT = document.getElementById('tradeE'); + var IDCardTime = document.getElementById('IDCardTime'); + var endTime = document.getElementById('endTime'); + var IDCardT = document.getElementById('IDCardE'); + var IDCardTime = document.getElementById('IDCardEnd'); + var IDCardE = document.getElementById('IDCardE'); + var IDCardTime = document.getElementById('IDCardEnd'); + var IDCardE = document.getElementById('IDCardE'); + var bEnd = document.getElementById('bEnd'); + console.log("进入") + + console.log("身份证结束时间") + console.log(idCardEnd) + if (idCardEnd == "长期"){ + IDCardE.checked = true; + IDCardTime.disabled = true; + } + console.log("营业结束时间") + console.log(businessEnd) + if (businessEnd == "长期"){ + tradeT.checked = true; + endTime.disabled = true; + } + if (benefitsEndTime == "长期"){ + bIDCardT.checked = true; + bEnd.disabled = true; + } + console.log("${item.accountType}") + var accountType = "${item.accountType}"; + var OBJradio=document.getElementsByName("useType") + if(accountType=="74"){ + OBJradio[0].checked=true + }else { + OBJradio[1].checked=true + } + + } +</script> +@} diff --git a/cloud-server-management/src/main/webapp/static/modular/system/operatorUser/operatorUser.js b/cloud-server-management/src/main/webapp/static/modular/system/operatorUser/operatorUser.js index bc6a466..27d2cfa 100644 --- a/cloud-server-management/src/main/webapp/static/modular/system/operatorUser/operatorUser.js +++ b/cloud-server-management/src/main/webapp/static/modular/system/operatorUser/operatorUser.js @@ -58,17 +58,36 @@ }, ]; }; +/** + * 商户号认证页面 + */ TSite.auth = function () { + console.log("看看行内平台") if (this.check()) { - var index = layer.open({ - type: 2, - title: "商户认证", - area: ['100%', '100%'], //宽高 - fix: false, //不固定 - maxmin: true, - content: Feng.ctxPath + '/operator/proportionAuth/' + TSite.seItem.operatorId - }); - this.layerIndex = index; + console.log("看看行内平台") + console.log(TSite.seItem.platform) + if (TSite.seItem.platform == "微信"){ + var index = layer.open({ + type: 2, + title: "微信商户认证", + area: ['100%', '100%'], //宽高 + fix: false, //不固定 + maxmin: true, + content: Feng.ctxPath + '/operator/proportionAuthWx/' + TSite.seItem.operatorId + }); + this.layerIndex = index; + }else{ + var index = layer.open({ + type: 2, + title: "支付宝商户认证", + area: ['100%', '100%'], //宽高 + fix: false, //不固定 + maxmin: true, + content: Feng.ctxPath + '/operator/proportionAuth/' + TSite.seItem.operatorId + }); + this.layerIndex = index; + } + } }; /** @@ -76,15 +95,28 @@ */ TSite.auth1 = function () { if (this.check()) { - var index = layer.open({ - type: 2, - title: "商户认证详情", - area: ['100%', '100%'], //宽高 - fix: false, //不固定 - maxmin: true, - content: Feng.ctxPath + '/operator/proportionAuth1/' + TSite.seItem.operatorId - }); - this.layerIndex = index; + console.log(TSite.seItem.platform) + if (TSite.seItem.platform == "微信"){ + var index = layer.open({ + type: 2, + title: "微信商户认证", + area: ['100%', '100%'], //宽高 + fix: false, //不固定 + maxmin: true, + content: Feng.ctxPath + '/operator/proportionAuth1Wx/' + TSite.seItem.operatorId + }); + this.layerIndex = index; + }else { + var index = layer.open({ + type: 2, + title: "商户认证详情", + area: ['100%', '100%'], //宽高 + fix: false, //不固定 + maxmin: true, + content: Feng.ctxPath + '/operator/proportionAuth1/' + TSite.seItem.operatorId + }); + this.layerIndex = index; + } } }; TSite.proportion = function () { @@ -136,6 +168,10 @@ var oneId=$(e).val(); console.log(oneId) console.log("!!!!!!!!!!!!!") + if ($("#pCode").val()==""){ + var content='<option value="">请先选择省</option>'; + $("#cCode").empty().append(content); + } var ajax = new $ax(Feng.ctxPath + "/tCompetition/onChange3", function(data){ if(data!=null){ var content='<option value="">选择市</option>'; @@ -201,10 +237,7 @@ Feng.error("请输入营业执照编号"); return; } - if ("" == $("#businessNumber").val() ){ - Feng.error("请上传营业执照"); - return; - } + if ("" == $("#name").val() ){ Feng.error("请输入联系人姓名"); return; @@ -328,6 +361,214 @@ ajax.set("zfbAccount", $("#zfbAccount").val() ); ajax.start(); }; +// 微信商户认证提交按钮 +TSite.addSubmit1 = function(){ + var bodyType = $("input[name='bodyType']:checked").val(); + if (bodyType=="" || null == bodyType){ + Feng.error("请选择主体类型"); + return; + } + var radios = document.getElementsByName('type'); + if (bodyType == 2){ + for (var i = 0; i < radios.length; i++) { + if (radios[i].checked) { + if (radios[i].value != "true"){ + // 法人不是受益人 + if ("" == $("#bName").val() ){ + Feng.error("请输入受益人姓名"); + return; + } + if ("" == $("#bAddress").val() ){ + Feng.error("请输入受益人身份证居住地址"); + return; + } + if ("" == $("#bTime").val() ){ + Feng.error("请选择受益人身份证开始时间"); + return; + } + var bIDCardT = document.getElementById("bIDCardT"); + if (!bIDCardT.checked){ + if ("" == $("#bEnd").val() || null == $("#bEnd").val()){ + Feng.error("请选择受益人身份证过期时间"); + return; + } + } + + if ("" == $("#bIDNumber").val() ){ + Feng.error("请输入受益人身份证号"); + return; + } + + } + + + } + } + } + + if ("" == $("#businessName").val() ){ + Feng.error("请输入商户名称"); + return; + } + if ("" == $("#aliasName").val() ){ + Feng.error("请输入商户别名"); + return; + } + if ("" == $("#businessNumber").val() ){ + Feng.error("请输入营业执照编号"); + return; + } + + var tradeT = document.getElementById("tradeE"); + if (!tradeT.checked){ + if ("" == $("#endTime").val() || null == $("#endTime").val()){ + Feng.error("请输入营业证照过期时间"); + return; + } + } + if ("" == $("#tradeTime").val() || null == $("#tradeTime").val()){ + Feng.error("请输入营业执照生效期间"); + return; + } + if ("" == $("#licenseRegistration").val() ){ + Feng.error("请输入营业执照注册号"); + return; + } + if ("" == $("#companyAddress").val() ){ + Feng.error("营业执照注册地址"); + return; + } + if ("" == $("#legalPerson").val()){ + Feng.error("请输入法人姓名"); + return; + } + if ("" == $("#leagleNumber").val()){ + Feng.error("请输入法人身份证号"); + return; + } + var IDCardE = document.getElementById("IDCardE"); + if (!IDCardE.checked){ + if ("" == $("#IDCardEnd").val() || null == $("#IDCardEnd").val()){ + Feng.error("请选择身份证过期时间"); + return; + } + } + if ("" == $("#IDCardTime").val() || null == $("#IDCardTime").val()){ + Feng.error("请选择身份证开始时间"); + return; + } + // 结算账户类型 + var useType = $("input[name='useType']:checked").val(); + // 结算到银行卡 + if ("" == $("#bankCard").val()){ + Feng.error("请输入银行卡号"); + return; + } + if ("" == $("#bankName").val()){ + Feng.error("请输入开户银行"); + return; + } + if ("" == $("#bankCardTwo").val()){ + Feng.error("请输入开户银行联行号"); + return; + } + if ("" == $("#bankUserName").val()){ + Feng.error("请输入开户名称"); + return; + } + if ("" == $("#bankCard").val()){ + Feng.error("请输入银行账号"); + return; + } + if ("" == $("#bankName1").val()){ + Feng.error("请输入开户支行名称"); + return; + } + + if ("" == $("#pCode").val()){ + Feng.error("请选择开户银行所在省"); + return; + } + if ("" == $("#cCode").val()){ + Feng.error("请选择开户银行所在市"); + return; + } + //提交信息 + var ajax = new $ax(Feng.ctxPath + "/operator/wxAuth", function(data){ + if (data==5001){ + Feng.error("未上传营业执照!"); + return; + }else if(data==5002){ + Feng.error("未上传法人身份证正面照!"); + return; + }else if(data==5003){ + Feng.error("未上传法人身份证背面照!"); + return; + }else if (data.code==500){ + console.log(data); + Feng.error("认证失败:"+data.msg); + return; + }else{ + Feng.success("认证成功!请等待微信平台审核"); + window.parent.TSite.table.refresh(); + TSite.close(); + } + },function(data){ + Feng.error("操作失败!"); + }); + ajax.set("operatorId", $("#id").val()); + ajax.set("bodyType", bodyType ); + ajax.set("businessName", $("#businessName").val()); + ajax.set("aliasName", $("#aliasName").val()); + ajax.set("businessNumber", $("#businessNumber").val() ); + ajax.set("tradeTime", $("#tradeTime").val() ); + ajax.set("endTime", $("#endTime").val() ); + ajax.set("businessNumber", $("#businessNumber").val() ); + ajax.set("license", $("#license").val() ); + ajax.set("companyAddress", $("#companyAddress").val() ); + ajax.set("legalPerson", $("#legalPerson").val() ); + ajax.set("leagleNumber", $("#leagleNumber").val() ); + ajax.set("IDCardTime", $("#IDCardTime").val() ); + ajax.set("IDCardEnd", $("#IDCardEnd").val() ); + ajax.set("leagleNumber", $("#leagleNumber").val() ); + ajax.set("legalFront", $("#IDCardImg").val() ); + ajax.set("legalBack", $("#IDCardImg1").val() ); + ajax.set("legalPhone", $("#legalPhone").val() ); + ajax.set("legalEmail", $("#legalEmail").val() ); + ajax.set("legalAddress", $("#legalAddress").val() ); + ajax.set("useType", useType ); + ajax.set("bankCard", $("#bankCard").val() ); + ajax.set("bank", $("#bank").val() ); + ajax.set("bankCardTwo", $("#bankCardTwo").val() ); + ajax.set("accountName", $("#bankUserName").val() ); + ajax.set("bankName", $("#bankName1").val() ); + ajax.set("provinceCode", $("#pCode").val() ); + ajax.set("province", $('#pCode option:selected').text()); + ajax.set("cityCode", $("#cCode").val() ); + ajax.set("city", $('#cCode option:selected').text()); + if (radios[0].value == "true"){ + ajax.set("isBenefits", "true"); + ajax.set("benefitsName", $("#legalPerson").val() ); + ajax.set("benefitsFront", $("#IDCardImg").val() ); + ajax.set("benefitsBack", $("#IDCardImg1").val() ); + ajax.set("benefitsNumber", $("#leagleNumber").val() ); + ajax.set("benefitsStartTime", $("#IDCardTime").val() ); + ajax.set("benefitsEndTime", $("#IDCardEnd").val() ); + ajax.set("benefitsAddress", $("#legalAddress").val() ); + }else{ + ajax.set("isBenefits", "false"); + ajax.set("benefitsName", $("#bName").val() ); + ajax.set("benefitsFront", $("#bImg1").val() ); + ajax.set("benefitsBack", $("#bImg2").val() ); + ajax.set("benefitsNumber", $("#bIDNumber").val() ); + ajax.set("benefitsStartTime", $("#bTime").val() ); + ajax.set("benefitsEndTime", $("#bEnd").val() ); + ajax.set("benefitsAddress", $("#bAddress").val() ); + } + + + ajax.start(); +}; /** * 检查是否选中 */ @@ -416,20 +657,23 @@ // 判断是否被选中 if (tradeT.checked) { endTime.disabled = true; - endTime.value=""; + endTime.value="长期"; } else { endTime.disabled = false; + endTime.value=""; } if (IDCardT.checked) { - IDCardTime.value=""; + IDCardTime.value="长期"; IDCardTime.disabled = true; } else { IDCardTime.disabled = false; + IDCardTime.value=""; } if (bIDCardT.checked) { - bTime.value=""; + bTime.value="长期"; bTime.disabled = true; } else { + bTime.value=""; bTime.disabled = false; } }; diff --git a/cloud-server-other/src/main/java/com/dsh/other/controller/GameController.java b/cloud-server-other/src/main/java/com/dsh/other/controller/GameController.java index 482a6be..b591aed 100644 --- a/cloud-server-other/src/main/java/com/dsh/other/controller/GameController.java +++ b/cloud-server-other/src/main/java/com/dsh/other/controller/GameController.java @@ -2,11 +2,16 @@ import cn.hutool.http.HttpRequest; import com.alibaba.fastjson.JSONObject; +import com.alipay.api.AlipayClient; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.request.AlipayTradeOrderSettleRequest; +import com.alipay.api.response.AlipayTradeOrderSettleResponse; import com.alipay.api.response.AlipayTradeQueryResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.dsh.other.entity.*; import com.dsh.other.feignclient.CourseRecordClient; +import com.dsh.other.feignclient.StoreClient; import com.dsh.other.feignclient.account.AppUserClient; import com.dsh.other.feignclient.account.model.AppUser; import com.dsh.other.model.QueryMySiteVo; @@ -25,6 +30,7 @@ import javax.annotation.Resource; import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -329,14 +335,17 @@ TGame game = gameService.getById(gameId); String smid2=""; Integer operationId = game.getOperationId(); - if (operationId==0){ - // 是平台的 + if (operationId == null || operationId==0 ){ + // 是平台的不冻结资金 不做分账处理 smid2 = smid; + payMoneyUtil.confirm1(smid2,code,tradeNo,config.getCash().toString()); }else{ String smidByOperatorId = siteService.getSMIDByOperatorId(operationId); smid2 = smidByOperatorId; + payMoneyUtil.confirm(smid2,code,tradeNo,config.getCash().toString()); + extracted(operationId, config.getCash(), tradeNo); } - payMoneyUtil.confirm(smid2,code,tradeNo,config.getCash().toString()); + break; } if ("WAIT_BUYER_PAY".equals(s)) { @@ -389,7 +398,57 @@ return ResultUtil.runErr(); } } + @Autowired + private IOperatorUserService operatorUserService; + @Autowired + private StoreClient storeClient; + private void extracted(Integer operatorId, BigDecimal coursePackageOrder1, String tradeNo) throws Exception { + // 分账 + AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", + "2021004105665036", + "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCi5i9nW/hGLJ3A06cZxTQdviFC7THpdSihoTYGLr9q006hu0V26ecBMY/o4w5bvIX0Ok/yofmZsVcCJpAPvbXL/uqVrIjnRRxXiaeBFThlxoBUTdunvbUSDYfzlEhJr5NvUKI6H6lz2niXlQGx4qy8Hau4ccWit9kM8jwUvsBVQoFgJA+xrjMvooA7YLopQtpOD+UJr5thApTSf1xrnr1W12yolTLEH15JmNV372cqXrYUuqnY0QsaPtxeqJUGAOcGdVLllQ7easEznP8DFBvDdHATcmp2SHNQDUEWN6MCVPbMgY06NQVqAXxqjTAYSVh+6TRu6bofPmpYC3TZB003AgMBAAECggEBAJAcR2+PA3NBYUYHeFrqBRMS8uX8ZR19kjZ7IgoSLTFaQsP9opRylPSPXhrPVBKAE5leRQAHn4MCSlESwHvMfxo7KFjFTFAc6dffZZpipYQUOc9bGampwJh58/3e/pyBgVMG6J23CPf/HJQtNFSkjd/V9+ayb/9l2dUEL3bC0fAZ/dbx8HsxdLw8wn3fLlWLj68hOMqa2deCZe3JdSVsPbeWqkh56FFsMLug0Nd+Ar4TgRl9/jnhXF0JWiD0LmPUYLhboY7EfUBzN4w1iYbDi1P+3zvoOYsiVKAXox9GMhQ2VzOO2UcSTuizSza2e98mGpabl/GpKmCz+RDFjtkX6eECgYEA2MyCij65eO3aGIm3FUe93DULRBYTfX8qJQSJq2WOWA3mmQlEW6L3O2B5/lG2h+8WmN6iLEs9eHpgycGYp7vAqgrANEn16ACVcuyx0scFtrZfZ+kmHMzFfiUWxJjVYk/6YngsGVBLdw6ueM42C8TTP67X9tU5TdVGoGWuqEj4W98CgYEAwFqwprXOch5Pqk/RPbb49r0Ou03K/UbciWnWWKzUhFFNS8MdlQPoDvQZbMwHLeWsa2VhaKITK3x5biLQb3U+0GLOn6lTvEyrEUH+ucREyLgVYTRAvwBPtnvlrzpyxPk2HnslQjju8WrvvLLBMKWUjlTrTOzhaHT21gz3pHMiOakCgYEAhLmfaXdBITGshb054sNLDtdCkGpbgEcrzAHdLps769iGxkYQHXHFngpQZUwtTUcoNGqIKknd1jZFrv7gsD+XkgKG7PwimehRlkwmCX5ilxtLiVgJRzRt6+5U5AMVD90a0tHzXYP0z2yjj73fBJF5KtGl0a10KZxaYrQdm1UhB00CgYBZZgzx/k9rtHC8LAqIj1CYhHejT92G53c6Gkl3vyOqN4sgKhfGmSEySfrDGPRBPZxr8ZtbIPCd5mUdberH0osWGMYFaJI1UsCy7aQwvGpniz7MhZeN7dweaOjwDs8mgtjHQ96mL4XGCDhR0BZ/wIURvZ/6iaGdhbbu9unlsWj3uQKBgQCmZYdsbbZkd3ev6f8rwyvMz+DrCQyYpY44cegBYuJgrZiQnL2fJioeN7ixX0UM48SfwsZEIrzshP/LGAwnc2MdjxKUl4jLN8SEe0NAjXOnz9Zaw740+aOmLpXcLWdP4uM2gIhWsvW1tEkQZCXmm7c9s/RsU8Pmzv+YL3+fSijOzA==", + "json", "GBK", + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmu8n/4yTHWbn7VOrNc9OsLtDL1bEQ8gC1dHkj8Wy5z0mkaOsjJRIG/28ze12M0V8jdCKuuDr5Z1OPKiqf+XO3ypguEh+mYUVMBM/cZodDFQfTY1TKLWjvQCuaqlA+QUTCK6f7T7stsgyQ1o9Jj0rXZDz6PM4QHSTzjrLIBaeqM5WIBvH+fy/X+QG5Utd+/UT0kc0JyvuKhZ65yVUd/C9VcwJJAPliRsAQNrqYterwAJ9zvw9tF11wj9W0XgJ8Ccu4x3gR1vrlLRJJo/OA97RmxPQ+5hSacWQZCUd1dwiBq+YCrKVHGTj14izRHXrLc0yBlRXo7tBOIqcy3IsvKVthQIDAQAB", + "RSA2"); + AlipayTradeOrderSettleRequest request = new AlipayTradeOrderSettleRequest(); + String randomCode = UUIDUtil.getRandomCode(16); + String proportionByOperatorId = operatorUserService.getOne(new QueryWrapper<OperatorUser>() + .eq("operatorId",operatorId)).getAlipayProportion(); + // 支付宝分账比例 + String s1 = proportionByOperatorId.split(",")[1]; + double i = Double.parseDouble(s1); + double v = i * 0.01; + BigDecimal bigDecimal1 = new BigDecimal(String.valueOf(v)); + // 分账金额 + BigDecimal bigDecimal2 = coursePackageOrder1.multiply(bigDecimal1).setScale(2, RoundingMode.DOWN); + request.setBizContent("{" + + " \"out_request_no\":\"" + randomCode + "\"," + + " \"trade_no\":\"" + tradeNo + "\"," + + " \"royalty_parameters\":[" + + " {" + + " \"royalty_type\":\"transfer\"," + + " \"trans_out\":\"" + storeClient.getSMIDByOperatorId(operatorId)+ "\"," + + " \"trans_out_type\":\"userId\"," + + " \"trans_in_type\":\"userId\"," + + " \"trans_in\":\"" + smid + "\"," + + " \"amount\":" + bigDecimal2 + "," + + " \"desc\":\"平台服务费\"," + + " \"royalty_scene\":\"平台服务费\"," + + " }" + + " ]," + + " \"extend_params\":{" + + " \"royalty_finish\":\"true\"" + + " }," + + " \"royalty_mode\":\"async\"" + + "}"); + AlipayTradeOrderSettleResponse response = alipayClient.execute(request); + if (response.isSuccess()) { + System.out.println("调用成功"); + } else { + System.out.println("调用失败"); + } + } private static Integer startGame(Integer uid, Integer gameId, Integer spaceId, Integer sutuId) { HashMap<String, String> map = new HashMap<>(); diff --git a/cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java b/cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java index b17ef77..74fa039 100644 --- a/cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java +++ b/cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java @@ -15,6 +15,7 @@ import com.dsh.other.feignclient.model.BillingDataRequestVo; import com.dsh.other.feignclient.model.SiteChangeStateVO; import com.dsh.other.feignclient.model.SiteVo; +import com.dsh.other.mapper.TOperatorUserMapper; import com.dsh.other.model.*; import com.dsh.other.model.dto.siteDto.TSiteDTO; import com.dsh.other.model.vo.siteVo.ExpireSiteSearchVO; @@ -64,6 +65,8 @@ private UserCouponClient userCouponClient; @Autowired private CityManagerClient cityManagerClient; + @Autowired + private IOperatorUserService operatorUserService; /** * 通过运营商id查询运营商对应的支付宝商户号 @@ -73,6 +76,22 @@ public String getSMIDByOperatorId(Integer id) { // 获取运营商的管理员 return siteService.getSMIDByOperatorId(id); + }/** + * 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例 + */ + @RequestMapping("/base/getProportionByOperatorId") + @ResponseBody + public String getProportionByOperatorId(Integer id) { + OperatorUser operatorId = operatorUserService.getOne( + new QueryWrapper<OperatorUser>().eq("operatorId",id) + ); + if (operatorId.getWechatProportion() == null){ + operatorId.setWechatProportion("0"); + } + if (operatorId.getAlipayProportion() == null){ + operatorId.setAlipayProportion("0"); + } + return operatorId.getWechatProportion()+","+operatorId.getAlipayProportion(); } /** * 获取所有场地 @@ -698,10 +717,6 @@ @Autowired private StoreService service; - - @Autowired - private IOperatorUserService operatorUserService; - @ResponseBody @PostMapping("/base/site/game") diff --git a/cloud-server-other/src/main/java/com/dsh/other/feignclient/StoreClient.java b/cloud-server-other/src/main/java/com/dsh/other/feignclient/StoreClient.java index 461a683..b51e0d7 100644 --- a/cloud-server-other/src/main/java/com/dsh/other/feignclient/StoreClient.java +++ b/cloud-server-other/src/main/java/com/dsh/other/feignclient/StoreClient.java @@ -11,7 +11,12 @@ @FeignClient(value = "mb-cloud-other") public interface StoreClient { - + /** + * 根据运营商id获取对应运营商商户号 + * @return + */ + @PostMapping("/base/getSMIDByOperatorId") + String getSMIDByOperatorId(Integer id); @PostMapping("/base/protocol/storeDetail/courseOfSto") StoreDetailOfCourse getCourseOfStore(@RequestParam("storeId") Integer storeId); diff --git a/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java b/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java index 61a4e05..32d7cd9 100644 --- a/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java +++ b/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java @@ -4,11 +4,16 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.alipay.api.AlipayClient; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.request.AlipayTradeOrderSettleRequest; +import com.alipay.api.response.AlipayTradeOrderSettleResponse; import com.alipay.api.response.AlipayTradeQueryResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dsh.other.entity.*; +import com.dsh.other.feignclient.StoreClient; import com.dsh.other.feignclient.account.AppUserClient; import com.dsh.other.feignclient.account.model.AppUser; import com.dsh.other.feignclient.activity.CouponClient; @@ -523,6 +528,10 @@ } private String smid = "2088330203191220";//平台支付宝商户号 + @Autowired + private IOperatorUserService operatorUserService; + @Autowired + private StoreClient storeClient; /** * 课程支付宝支付 * @@ -591,15 +600,16 @@ Store byId = storeService.getById(storeId); Integer operatorId = byId.getOperatorId(); String smid1 = ""; - if (operatorId == null ){ - // 平台的门店 - }else if (operatorId == 0){ - smid1 = smid; + if (operatorId == null || operatorId == 0){ + // 平台的门店 不冻结资金不做分账处理 + payMoneyUtil.confirm1(smid1,code,tradeNo,paymentPrice.toString()); }else{ smid1 = siteService.getSMIDByOperatorId(operatorId); - + payMoneyUtil.confirm(smid1,code,tradeNo,paymentPrice.toString()); + // 分账 + extracted(operatorId, new BigDecimal(paymentPrice.toString()), tradeNo); } - payMoneyUtil.confirm(smid1,code,tradeNo,paymentPrice.toString()); + break; } if ("WAIT_BUYER_PAY".equals(s)) { @@ -616,7 +626,53 @@ return alipay; } + private void extracted(Integer operatorId, BigDecimal coursePackageOrder1, String tradeNo) throws Exception { + // 分账 + AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", + "2021004105665036", + "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCi5i9nW/hGLJ3A06cZxTQdviFC7THpdSihoTYGLr9q006hu0V26ecBMY/o4w5bvIX0Ok/yofmZsVcCJpAPvbXL/uqVrIjnRRxXiaeBFThlxoBUTdunvbUSDYfzlEhJr5NvUKI6H6lz2niXlQGx4qy8Hau4ccWit9kM8jwUvsBVQoFgJA+xrjMvooA7YLopQtpOD+UJr5thApTSf1xrnr1W12yolTLEH15JmNV372cqXrYUuqnY0QsaPtxeqJUGAOcGdVLllQ7easEznP8DFBvDdHATcmp2SHNQDUEWN6MCVPbMgY06NQVqAXxqjTAYSVh+6TRu6bofPmpYC3TZB003AgMBAAECggEBAJAcR2+PA3NBYUYHeFrqBRMS8uX8ZR19kjZ7IgoSLTFaQsP9opRylPSPXhrPVBKAE5leRQAHn4MCSlESwHvMfxo7KFjFTFAc6dffZZpipYQUOc9bGampwJh58/3e/pyBgVMG6J23CPf/HJQtNFSkjd/V9+ayb/9l2dUEL3bC0fAZ/dbx8HsxdLw8wn3fLlWLj68hOMqa2deCZe3JdSVsPbeWqkh56FFsMLug0Nd+Ar4TgRl9/jnhXF0JWiD0LmPUYLhboY7EfUBzN4w1iYbDi1P+3zvoOYsiVKAXox9GMhQ2VzOO2UcSTuizSza2e98mGpabl/GpKmCz+RDFjtkX6eECgYEA2MyCij65eO3aGIm3FUe93DULRBYTfX8qJQSJq2WOWA3mmQlEW6L3O2B5/lG2h+8WmN6iLEs9eHpgycGYp7vAqgrANEn16ACVcuyx0scFtrZfZ+kmHMzFfiUWxJjVYk/6YngsGVBLdw6ueM42C8TTP67X9tU5TdVGoGWuqEj4W98CgYEAwFqwprXOch5Pqk/RPbb49r0Ou03K/UbciWnWWKzUhFFNS8MdlQPoDvQZbMwHLeWsa2VhaKITK3x5biLQb3U+0GLOn6lTvEyrEUH+ucREyLgVYTRAvwBPtnvlrzpyxPk2HnslQjju8WrvvLLBMKWUjlTrTOzhaHT21gz3pHMiOakCgYEAhLmfaXdBITGshb054sNLDtdCkGpbgEcrzAHdLps769iGxkYQHXHFngpQZUwtTUcoNGqIKknd1jZFrv7gsD+XkgKG7PwimehRlkwmCX5ilxtLiVgJRzRt6+5U5AMVD90a0tHzXYP0z2yjj73fBJF5KtGl0a10KZxaYrQdm1UhB00CgYBZZgzx/k9rtHC8LAqIj1CYhHejT92G53c6Gkl3vyOqN4sgKhfGmSEySfrDGPRBPZxr8ZtbIPCd5mUdberH0osWGMYFaJI1UsCy7aQwvGpniz7MhZeN7dweaOjwDs8mgtjHQ96mL4XGCDhR0BZ/wIURvZ/6iaGdhbbu9unlsWj3uQKBgQCmZYdsbbZkd3ev6f8rwyvMz+DrCQyYpY44cegBYuJgrZiQnL2fJioeN7ixX0UM48SfwsZEIrzshP/LGAwnc2MdjxKUl4jLN8SEe0NAjXOnz9Zaw740+aOmLpXcLWdP4uM2gIhWsvW1tEkQZCXmm7c9s/RsU8Pmzv+YL3+fSijOzA==", + "json", "GBK", + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmu8n/4yTHWbn7VOrNc9OsLtDL1bEQ8gC1dHkj8Wy5z0mkaOsjJRIG/28ze12M0V8jdCKuuDr5Z1OPKiqf+XO3ypguEh+mYUVMBM/cZodDFQfTY1TKLWjvQCuaqlA+QUTCK6f7T7stsgyQ1o9Jj0rXZDz6PM4QHSTzjrLIBaeqM5WIBvH+fy/X+QG5Utd+/UT0kc0JyvuKhZ65yVUd/C9VcwJJAPliRsAQNrqYterwAJ9zvw9tF11wj9W0XgJ8Ccu4x3gR1vrlLRJJo/OA97RmxPQ+5hSacWQZCUd1dwiBq+YCrKVHGTj14izRHXrLc0yBlRXo7tBOIqcy3IsvKVthQIDAQAB", + "RSA2"); + AlipayTradeOrderSettleRequest request = new AlipayTradeOrderSettleRequest(); + String randomCode = UUIDUtil.getRandomCode(16); + String proportionByOperatorId = operatorUserService.getOne(new QueryWrapper<OperatorUser>() + .eq("operatorId",operatorId)).getAlipayProportion(); + // 支付宝分账比例 + String s1 = proportionByOperatorId.split(",")[1]; + double i = Double.parseDouble(s1); + double v = i * 0.01; + BigDecimal bigDecimal1 = new BigDecimal(String.valueOf(v)); + // 分账金额 + BigDecimal bigDecimal2 = coursePackageOrder1.multiply(bigDecimal1).setScale(2, RoundingMode.DOWN); + request.setBizContent("{" + + " \"out_request_no\":\"" + randomCode + "\"," + + " \"trade_no\":\"" + tradeNo + "\"," + + " \"royalty_parameters\":[" + + " {" + + " \"royalty_type\":\"transfer\"," + + " \"trans_out\":\"" + storeClient.getSMIDByOperatorId(operatorId)+ "\"," + + " \"trans_out_type\":\"userId\"," + + " \"trans_in_type\":\"userId\"," + + " \"trans_in\":\"" + smid + "\"," + + " \"amount\":" + bigDecimal2 + "," + + " \"desc\":\"平台服务费\"," + + " \"royalty_scene\":\"平台服务费\"," + + " }" + + " ]," + + " \"extend_params\":{" + + " \"royalty_finish\":\"true\"" + + " }," + + " \"royalty_mode\":\"async\"" + + "}"); + AlipayTradeOrderSettleResponse response = alipayClient.execute(request); + if (response.isSuccess()) { + System.out.println("调用成功"); + } else { + System.out.println("调用失败"); + } + } /** * 玩湃币支付 * diff --git a/cloud-server-other/src/main/java/com/dsh/other/util/PayMoneyUtil.java b/cloud-server-other/src/main/java/com/dsh/other/util/PayMoneyUtil.java index b5519f5..9974105 100644 --- a/cloud-server-other/src/main/java/com/dsh/other/util/PayMoneyUtil.java +++ b/cloud-server-other/src/main/java/com/dsh/other/util/PayMoneyUtil.java @@ -114,6 +114,47 @@ return ResultUtil.error("出现问题啦"); } } + // 属于平台的运营商 因为无需分账不冻结资金 + public ResultUtil confirm1(String smid,String code, String outTradeNo, String amount) { + AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", + aliAppid, + appPrivateKey, + "json", + "GBK", + alipay_public_key, + "RSA2"); + AlipayTradeSettleConfirmRequest request = new AlipayTradeSettleConfirmRequest(); + request.setBizContent("{" + + " \"out_request_no\":\""+code+"\"," + + " \"trade_no\":\""+outTradeNo+"\"," + + " \"settle_info\":{" + + " \"settle_detail_infos\":[" + + " {" + + " \"trans_in_type\":\"defaultSettle\"," + + " \"settle_entity_id\":\""+smid+"\"," + + " \"settle_entity_type\":\"SecondMerchant\"," + + " \"amount\":"+amount+"," + + " }" + + " ]" + + " }," + + " \"extend_params\":{" + + " \"royalty_freeze\":\"false\"" + + " }" + + "}"); + AlipayTradeSettleConfirmResponse response = null; + try { + response = alipayClient.execute(request); + } catch (AlipayApiException e) { + e.printStackTrace(); + } + if(response.isSuccess()){ + System.out.println("调用成功"); + return ResultUtil.success(); + } else { + System.out.println("调用失败"); + return ResultUtil.error("出现问题啦"); + } + } /** * 支付宝支付 */ -- Gitblit v1.7.1