From 61bbd595ee2bc3c67b40878894dcc07174c6eea6 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期二, 24 九月 2024 10:15:30 +0800
Subject: [PATCH] 玩湃微信商户分账
---
cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/PayMoneyUtil.java | 283 +++
cloud-server-other/src/main/java/com/dsh/other/util/PayMoneyUtil.java | 190 ++
cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/OperatorUser_proportionAuth_info.html | 4
cloud-server-management/src/main/java/com/dsh/course/mapper/CarInsuranceMapper.java | 2
cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/PointsMerchandise.java | 2
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 | 96 +
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/HttpClientUtil.java | 270 +++
cloud-server-other/src/main/resources/mapper/SiteMapper.xml | 3
cloud-server-other/src/main/java/com/dsh/other/mapper/SiteMapper.java | 1
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/MD5AndKL.java | 111 +
cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/TOperatorService.java | 2
cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TOperatorServiceImpl.java | 17
cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java | 97 +
cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/OperatorUser_proportionAuthWX.html | 305 +++
cloud-server-other/src/main/java/com/dsh/other/entity/TGameRecord.java | 13
cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/Operator.html | 1
cloud-server-other/src/main/java/com/dsh/other/entity/SiteBooking.java | 17
cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java | 102 +
cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/OperatorUser_proportionAuth_infoWX.html | 480 +++++
cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandise.java | 7
cloud-server-account/src/main/java/com/dsh/account/model/dto/Coupon.java | 2
cloud-server-competition/src/main/java/com/dsh/competition/feignclient/other/StoreClient.java | 10
cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java | 127 +
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/OperatorUserController.java | 59
cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java | 142 +
cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackagePaymentServiceImpl.java | 115 +
cloud-server-competition/src/main/java/com/dsh/competition/service/impl/PaymentCompetitionServiceImpl.java | 20
cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/OperatorAuth.java | 59
cloud-server-account/src/main/java/com/dsh/account/feignclient/other/StoreClient.java | 12
cloud-server-management/src/main/webapp/static/modular/system/operator/operator_add.js | 52
cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/PointsMerchandise.java | 7
cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop.html | 2
cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/UserCouponPayment.java | 3
cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/Operator_wx.html | 81
cloud-server-course/src/main/java/com/dsh/course/util/PayMoneyUtil.java | 122 +
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 | 34
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/OperatorController.java | 711 +++++++
cloud-server-management/pom.xml | 24
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/HttpResult.java | 32
cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/WxUploadImgUtil.java | 95 +
cloud-server-competition/src/main/java/com/dsh/competition/entity/PaymentCompetition.java | 22
cloud-server-competition/src/main/java/com/dsh/competition/util/PayMoneyUtil.java | 192 ++
cloud-server-management/src/main/resources/bootstrap.properties | 3
cloud-server-other/src/main/java/com/dsh/other/service/ISiteService.java | 1
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 | 9
cloud-server-management/src/main/java/com/dsh/course/mapper/TOperatorAuthWxMapper.java | 20
cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TOperator.java | 10
cloud-server-management/src/main/webapp/static/modular/system/operator/operator.js | 15
cloud-server-other/src/main/java/com/dsh/other/controller/GameController.java | 49
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-account/src/main/java/com/dsh/account/service/impl/TAppUserServiceImpl.java | 150 +
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TGoodsController.java | 2
cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackageOrder.java | 11
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
cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java | 30
62 files changed, 4,716 insertions(+), 407 deletions(-)
diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/PointsMerchandise.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/PointsMerchandise.java
index 4abbdcc..87b87de 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/PointsMerchandise.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/PointsMerchandise.java
@@ -108,5 +108,7 @@
* 课包支付配置id
*/
private Integer coursePackageConfigId;
+ private Integer addUserId;
+ private Integer addType;
}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/UserCouponPayment.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/UserCouponPayment.java
index 23a9b6f..0458295 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/UserCouponPayment.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/UserCouponPayment.java
@@ -61,4 +61,7 @@
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date insertTime;
+
+ // 是否微信分账
+ private Integer isFenZhang;
}
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..376aca4 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,13 +12,21 @@
@FeignClient(value = "mb-cloud-other")
public interface StoreClient {
-
/**
- * 根据运营商id获取对应运营商商户号
+ * 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例
+ * @return
+ */
+ @PostMapping("/base/getProportionByOperatorId")
+ String getProportionByOperatorId(Integer id);
+ /**
+ * 根据运营商id获取对应运营商支付宝商户号
* @return
*/
@PostMapping("/base/getSMIDByOperatorId")
String getSMIDByOperatorId(Integer id);
+ // 根据运营商id获取微信商户号
+ @PostMapping("/base/getmerchantNumberByOperatorId")
+ String getmerchantNumberByOperatorId(Integer id);
@PostMapping("/store/queryByStoreId")
OperatorUser queryByStoreId(Integer storeId);
diff --git a/cloud-server-account/src/main/java/com/dsh/account/model/dto/Coupon.java b/cloud-server-account/src/main/java/com/dsh/account/model/dto/Coupon.java
index 2fae339..5b1dcf5 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/model/dto/Coupon.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/model/dto/Coupon.java
@@ -57,6 +57,7 @@
* 限领数量
*/
private Integer pickUpQuantity;
+ private Integer publisherType;
/**
* 开始时间
*/
@@ -105,6 +106,7 @@
* 状态(1=正常,2=冻结,3=删除)
*/
private Integer state;
+ private Integer cityManagerId;
/**
* 添加时间
*/
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 55afd69..d964181 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
@@ -157,6 +157,7 @@
@Resource
private IntroduceRewardsClient introduceRewardsClient;
+
private String aliAppid = "2021004105665036";//支付宝appid
private 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==";//支付宝开发者应用私钥
@@ -1407,7 +1408,12 @@
userCouponPaymentClient.addUserCouponPayment(userCouponPayment);
try {
if(exchangeType.getPayType() == 1){
- return weChatPaymentCoupon("购买优惠券", userCouponPayment);
+ String temp = "0";
+ if (coupon.getPublisherType()!=null && coupon.getPublisherType() != 2){
+ // 做分账
+ temp = "1";
+ }
+ return weChatPaymentCoupon("购买优惠券-"+temp, userCouponPayment);
}
if(exchangeType.getPayType() == 2){
return aliPaymentCoupon("购买优惠券", userCouponPayment);
@@ -1417,8 +1423,6 @@
}
}
}
-
-
System.out.println(exchangeType);
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
@@ -1629,9 +1633,9 @@
coursePackageOrder.setInsertTime(new Date());
coursePackageOrder.setOrderType(2);
paymentClient.savePaymentCoursePackage(coursePackageOrder);
- return WechatPayment(merchandise.getType(), merchandise.getCash().multiply(new BigDecimal(exchangeType.getStuIds().size())), code);
- } else {
- return WechatPayment(merchandise.getType(), merchandise.getCash().multiply(new BigDecimal(goodsNums)), code);
+ return WechatPayment(merchandise.getType(), merchandise.getCash().multiply(new BigDecimal(exchangeType.getStuIds().size())), code,merchandise.getId());
+ } else if (merchandise.getType() == 1){
+ return WechatPayment(merchandise.getType(), merchandise.getCash().multiply(new BigDecimal(goodsNums)), code,merchandise.getId());
}
} catch (Exception e) {
return ResultUtil.runErr();
@@ -1651,9 +1655,9 @@
case 1:
try {
if (merchandise.getType() == 2) {
- return WechatPayment(merchandise.getType(), merchandise.getCash().multiply(new BigDecimal(exchangeType.getStuIds().size())), code);
+ return WechatPayment(merchandise.getType(), merchandise.getCash().multiply(new BigDecimal(exchangeType.getStuIds().size())), code,merchandise.getId());
} else {
- return WechatPayment(merchandise.getType(), merchandise.getCash().multiply(new BigDecimal(goodsNums)), code);
+ return WechatPayment(merchandise.getType(), merchandise.getCash().multiply(new BigDecimal(goodsNums)), code,merchandise.getId());
}
} catch (Exception e) {
return ResultUtil.runErr();
@@ -1692,7 +1696,13 @@
public ResultUtil weChatPaymentCoupon(String body, UserCouponPayment userCouponPayment) throws Exception {
String code = userCouponPayment.getCode();
Double cash = userCouponPayment.getCash();
- ResultUtil weixinpay = payMoneyUtil.weixinpay(body, "", code, cash.toString(),
+ Integer couponId = userCouponPayment.getCouponId();
+ Coupon coupon = userConponClient.queryCouponById(couponId);
+ String temp ="0";
+ if (coupon.getPublisherType()!=null&&coupon.getPublisherType()!=2){
+ temp = "1";
+ }
+ ResultUtil weixinpay = payMoneyUtil.weixinpay(body+"-"+temp, "", code, cash.toString(),
"/base/coupon/weChatPaymentCouponCallback", "APP", "");
if (weixinpay.getCode() == 200) {
new Thread(new Runnable() {
@@ -1707,6 +1717,7 @@
Thread.sleep(wait);
UserCouponPayment userCouponPayment1 = userCouponPaymentClient.getUserCouponPayment(code);
if (userCouponPayment1.getStatus() == 2) {
+
break;
}
ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryWXOrder(code, "");
@@ -1747,6 +1758,38 @@
TAppUser user = appUserService.getById(userCouponPayment1.getUserId());
user.setIntegral(user.getIntegral() - userCouponPayment1.getIntegral().intValue());
appUserService.updateById(user);
+ }
+ // 休眠两分钟后再调用分账接口 避免提示订单正在处理中
+ Thread.sleep(120000);
+ if (coupon!=null){
+ if (coupon.getPublisherType()!=null&&coupon.getPublisherType()!=2){
+ if (coupon.getPublisherType() == 3){
+ // 门店 向上查询运营商
+ Store store = storeClient.queryStoreById(coupon.getCityManagerId());
+ if (store.getOperatorId()==null || store.getOperatorId()==0){
+ // 平台不分账
+ break;
+ }else{
+ // 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例
+ String proportionByOperatorId = storeClient.getProportionByOperatorId(store.getOperatorId());
+ String[] split = proportionByOperatorId.split(",");
+ String s1 = split[0];
+ if (!s1.equals("未设置")){
+ BigDecimal bigDecimal = new BigDecimal(s1);
+ // 分账比例
+ BigDecimal bigDecimal1 = bigDecimal.divide(new BigDecimal(100)).setScale(2);
+ // 微信商户号
+ String s2 = storeClient.getmerchantNumberByOperatorId(store.getOperatorId());
+ BigDecimal bigDecimal2 = new BigDecimal(cash);
+ ResultUtil fenzhang = payMoneyUtil.fenzhang(userCouponPayment1.getOrderNumber(), bigDecimal2.multiply(bigDecimal1), s2);
+ if (!fenzhang.getCode().equals(500)){
+ System.err.println("分账失败 原因是:"+fenzhang.getMsg());
+ }
+
+ }
+ }
+ }
+ }
}
break;
}
@@ -2080,9 +2123,39 @@
}
- private ResultUtil WechatPayment(Integer type, BigDecimal cash, String code) throws Exception {
+ private ResultUtil WechatPayment(Integer type, BigDecimal cash, String code,Integer id) throws Exception {
String name = (type == 1 ? "购买实体商品" : type == 2 ? "报名运动营": type == 3 ? "购买门票" : "购买优惠券");
- ResultUtil weixinpay = payMoneyUtil.weixinpay(name, "", code, cash.toString(),
+ PointsMerchandise pointsMerchandise = mcClient.selectPointsMerchandiseById(id);
+ // 分账表示 0否1是
+ String temp = "0";
+ switch (type){
+ case 1:
+ temp = "0";
+ break;
+ case 2:
+ // 判断课包属于平台还是运营商
+ CoursePackage coursePackage = cpageClient.queryCoursePackageById(pointsMerchandise.getCoursePackageId());
+ Store store = storeClient.queryStoreById(coursePackage.getStoreId());
+ if (store.getOperatorId() ==null || store.getOperatorId() == 0){
+ // 平台课包 不分账
+ }else{
+ temp = "1";
+ }
+ break;
+ case 3:
+ List<Integer> integers = mcsClient.queryPointMerStoreIds(pointsMerchandise.getId());
+ if (!integers.isEmpty()){
+ Store store1 = storeClient.queryStoreById(integers.get(0));
+ if (store1.getOperatorId() ==null || store1.getOperatorId() == 0){
+ // 平台门票 不分账
+ }else{
+ temp = "1";
+ }
+ }
+ // 查询门票指定的门店 属于平台还是运营商
+ break;
+ }
+ ResultUtil weixinpay = payMoneyUtil.weixinpay(name+"-"+temp, "", code, cash.toString(),
"/base/pointMer/exchangeGoodPaymentWeChatCallback", "APP", "");
if (weixinpay.getCode() == 200) {
new Thread(new Runnable() {
@@ -2097,6 +2170,8 @@
Thread.sleep(wait);
UserPointsMerchandise userPointsMerchandise = mcClient.queryUserPointMerchaseByCode(code).get(0);
if (userPointsMerchandise.getPayStatus() == 2) {
+
+
break;
}
ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryWXOrder(code, "");
@@ -2147,6 +2222,59 @@
paymentClient.addCoursePackageOrderStudent(addCoursePackageOrderStudent);
}
}
+ // 休眠两分钟后再调用分账接口 避免提示订单正在处理中
+ Thread.sleep(120000);
+ // 分账表示 0否1是
+ String temp = "0";
+ // 运营商id
+ Integer operatorId = 0;
+ switch (type){
+ case 1:
+ temp = "0";
+ break;
+ case 2:
+ // 判断课包属于平台还是运营商
+ CoursePackage coursePackage = cpageClient.queryCoursePackageById(pointsMerchandise.getCoursePackageId());
+ Store store = storeClient.queryStoreById(coursePackage.getStoreId());
+ if (store.getOperatorId() ==null || store.getOperatorId() == 0){
+ // 平台课包 不分账
+ }else{
+ temp = "1";
+ operatorId = store.getOperatorId();
+ }
+ break;
+ case 3:
+ List<Integer> integers = mcsClient.queryPointMerStoreIds(pointsMerchandise.getId());
+ if (!integers.isEmpty()){
+ Store store1 = storeClient.queryStoreById(integers.get(0));
+ if (store1.getOperatorId() ==null || store1.getOperatorId() == 0){
+ // 平台门票 不分账
+ }else{
+ temp = "1";
+ operatorId = store1.getOperatorId();
+ }
+ }
+ // 查询门票指定的门店 属于平台还是运营商
+ break;
+ }
+ if (operatorId != 0) {
+ // 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例
+ String proportionByOperatorId = storeClient.getProportionByOperatorId(operatorId);
+ String[] split = proportionByOperatorId.split(",");
+ String s1 = split[0];
+ if (!s1.equals("未设置")){
+ BigDecimal bigDecimal = new BigDecimal(s1);
+ // 分账比例
+ BigDecimal bigDecimal1 = bigDecimal.divide(new BigDecimal(100)).setScale(2);
+ // 微信商户号
+ String s2 = storeClient.getmerchantNumberByOperatorId(operatorId);
+
+ ResultUtil fenzhang = payMoneyUtil.fenzhang(transaction_id, cash.multiply(bigDecimal1), s2);
+ if (!fenzhang.getCode().equals(500)){
+ System.err.println("分账失败 原因是:"+fenzhang.getMsg());
+ }
+ }
+ }
break;
}
if ("USERPAYING".equals(s) || "NOTPAY".equals(s)) {
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 9219575..8b8a57b 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;
@@ -394,7 +398,7 @@
try {
switch (request.getPayType()) {
case 1:
- return WeChatPayment(code, request.getPayAmount(), hour);
+ return WeChatPayment(code, request.getPayAmount(), hour,request.getLessonId());
case 2:
return AlipayPayment(code, request.getPayAmount(), hour);
case 3:
@@ -419,8 +423,19 @@
}
- public ResultUtil WeChatPayment(String code, BigDecimal amount, Integer hour) throws Exception {
- ResultUtil weixinpay = payMoneyUtil.weixinpay("课包续费", "", code, amount.toString(),
+ public ResultUtil WeChatPayment(String code, BigDecimal amount, Integer hour,Integer lessonId) throws Exception {
+ // 判断这个课包是属于哪个运营商的
+ CoursePackage coursePackage = coursePackageClient.queryCoursePackageById(lessonId);
+ Integer storeId = coursePackage.getStoreId();
+ Store store = storeClient.queryStoreById(storeId);
+ // 是否分账 0否1是
+ int isFenZhang= 1;
+ String merchantNumber = "";
+ if (store.getOperatorId()==null || store.getOperatorId()==0){
+ // 平台
+ isFenZhang = 0;
+ }
+ ResultUtil weixinpay = payMoneyUtil.weixinpay("课包续费"+"-"+isFenZhang, "", code, amount.toString(),
"/base/coursePackage/wechatPaymentCallback", "APP", "");
if (weixinpay.getCode() == 200) {
new Thread(new Runnable() {
@@ -462,6 +477,26 @@
coursePackagePayment.setLaveClassHours(hour);
coursePackagePayment.setOrderNumber(transaction_id);
couPayClient.updatePaymentCoursePackage(coursePackagePayment);
+ if (store.getOperatorId()!=null && store.getOperatorId()!=0){
+ // 休眠两分钟后再调用分账接口 避免提示订单正在处理中
+ Thread.sleep(120000);
+ // 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例
+ String proportionByOperatorId = storeClient.getProportionByOperatorId(store.getOperatorId());
+ String[] split = proportionByOperatorId.split(",");
+ String s1 = split[0];
+ if (!s1.equals("未设置")){
+ BigDecimal bigDecimal = new BigDecimal(s1);
+ // 分账比例
+ BigDecimal bigDecimal1 = bigDecimal.divide(new BigDecimal(100)).setScale(2);
+ // 微信商户号
+ String s2 = storeClient.getmerchantNumberByOperatorId(store.getOperatorId());
+
+ ResultUtil fenzhang = payMoneyUtil.fenzhang(transaction_id, amount.multiply(bigDecimal1), s2);
+ if (!fenzhang.getCode().equals(500)){
+ System.err.println("分账失败 原因是:"+fenzhang.getMsg());
+ }
+ }
+ }
break;
}
if ("USERPAYING".equals(s) || "NOTPAY".equals(s)) {
@@ -542,14 +577,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)) {
@@ -565,7 +605,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 9922615..7802c17 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
@@ -36,6 +36,7 @@
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import javax.crypto.BadPaddingException;
@@ -88,6 +89,78 @@
private String certPath = "/usr/playpai/cert/weixin/apiclient_cert.p12";//微信证书
+
+
+ /**
+ * 发起分账
+ * @param order 微信订单号
+ * @return
+ */
+ public ResultUtil fenzhang(String order,BigDecimal amount,String merchantNumber) throws Exception {
+ Map<String, Object> map = new HashMap<>();
+ map.put("mch_id", mchId);
+ map.put("appid", appid);
+ String nonce_str = UUIDUtil.getRandomCode(16);
+ map.put("nonce_str", nonce_str);
+ map.put("transaction_id", order);
+ // 将这个字符串使用json格式拼接起来
+ Map<String, Object> body = new HashMap<>();
+ body.put("type", "MERCHANT_ID");
+ body.put("account", merchantNumber);
+ body.put("amount", amount);
+ body.put("description", "订单分账");
+ JSONObject jsonObject = new JSONObject(body);
+ String jsonString = jsonObject.toString();
+ map.put("receiver",jsonString);
+ String s = this.weixinSignature(map);
+ map.put("sign", s);
+ String url = "https://api.mch.weixin.qq.com/secapi/pay/profitsharing";
+ //设置请求头
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_XML);
+ StringBuffer xmlString = new StringBuffer();
+ Set<String> strings = map.keySet();
+ String[] keys = {};
+ keys = strings.toArray(keys);
+ Arrays.sort(keys);
+ xmlString.append("<xml>");
+ for (int l = 0; l < keys.length; l++) {
+ xmlString.append("<" + keys[l] + ">" + map.get(keys[l]) + "</" + keys[l] + ">");
+ }
+ xmlString.append("</xml>");
+
+ Map<String, String> map1 = null;
+ String body1 = null;
+ try {
+ body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ System.err.println("分账请求"+body1);
+ //将结果xml解析成map
+ body1 = body1.replaceAll("<!\\[CDATA\\[", "");
+ body1 = body1.replaceAll("]]>", "");
+ try {
+ map1 = this.xmlToMap(body1, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (DocumentException e) {
+ e.printStackTrace();
+ }
+ String return_code = map1.get("return_code");
+ if ("SUCCESS".equals(return_code)) {
+ String result_code = map1.get("result_code");
+ if ("SUCCESS".equals(result_code)) {
+ return ResultUtil.success();
+ } else {
+// System.err.println(map1.get("err_code_des"));
+ return ResultUtil.error(map1.get("err_code_des"));
+ }
+ } else {
+// System.err.println(map1.get("return_msg") + appid + "----" + mchId);
+ return ResultUtil.error(map1.get("return_msg"), new JSONObject());
+ }
+ }
/**
* 支付宝支付
@@ -300,7 +373,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("出现问题啦");
+ }
+ }
/**
* 支付成功后的回调处理逻辑
*
@@ -412,7 +525,17 @@
map.put("appid", appid);
map.put("mch_id", mchId);
map.put("nonce_str", nonce_str);
- map.put("body", body);
+ String temp = "";
+ if (body.split("-").length>1){
+ temp = body.split("-")[1];
+ map.put("body", body.split("-")[0]);
+ }else{
+ map.put("body", body);
+ }
+ if (StringUtils.hasLength(temp) && temp.equals("1")){
+ // 添加分账标识
+ map.put("profit_sharing", "Y");
+ }
map.put("attach", attach);//存储订单id
map.put("out_trade_no", out_trade_no);//存储的订单code
map.put("total_fee", i);
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandise.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandise.java
index 6b30671..3d7cd93 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandise.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandise.java
@@ -175,7 +175,12 @@
// 已兑换数量
@TableField(exist = false)
private Integer pickUpQuantity4;
-
+ // 添加人id 判断是平台添加还是运营商添加 用于判断分账
+ @TableField("addUserId")
+ private Integer addUserId;
+ // 添加人类型 1平台2运营商3门店 用于判断分账
+ @TableField("addType")
+ private Integer addType;
@Override
protected Serializable pkVal() {
return this.id;
diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java b/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java
index 82f7bde..db27a44 100644
--- a/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java
+++ b/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java
@@ -25,16 +25,14 @@
import com.dsh.competition.service.IParticipantService;
import com.dsh.competition.service.IPaymentCompetitionService;
import com.dsh.competition.service.UserCompetitionService;
-import com.dsh.competition.util.PayMoneyUtil;
-import com.dsh.competition.util.ResultUtil;
-import com.dsh.competition.util.TokenUtil;
-import com.dsh.competition.util.ToolUtil;
+import com.dsh.competition.util.*;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.Synchronized;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@@ -42,6 +40,7 @@
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.io.PrintWriter;
+import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
@@ -804,6 +803,29 @@
String payOrderNo = paymentCompetition.getPayOrderNo();
if (paymentCompetition.getPayType() == 1) {//微信支付
+ if (StringUtils.hasLength(paymentCompetition.getFenzhangNo())){
+ // 是分账订单 如果分账金额不为0 那么回退分账金额
+ if (paymentCompetition.getFenzhangAmount()!=null && paymentCompetition.getFenzhangAmount().compareTo(BigDecimal.ZERO)>0){
+ String randomCode = UUIDUtil.getRandomCode(16);
+ String randomCode1 = UUIDUtil.getRandomCode(16);
+ if (competition.getOperatorId()!=null && competition.getOperatorId()!=0){
+ // 微信商户号
+ String s2 =storeClient.getmerchantNumberByOperatorId(competition.getOperatorId());
+ ResultUtil resultUtil = payMoneyUtil.fenzhangRefund(paymentCompetition.getFenzhangNo(), paymentCompetition.getFenzhangAmount(), s2, randomCode, randomCode1);
+ if (!resultUtil.getCode().equals(500)){
+ System.err.println("分账回退失败 原因是:"+resultUtil.getMsg());
+ }else{
+ paymentCompetition.setFenzhangRefundNo(resultUtil.getMsg());
+ paymentCompetitionService.updateById(paymentCompetition);
+ }
+
+ }
+ }
+ }
+
+
+
+
Map<String, String> map = payMoneyUtil.wxRefund(payOrderNo, code, amount.toString(), amount.toString(),
"/base/competition/weChatCancelPaymentCompetitionCallback");
String return_code = map.get("return_code");
diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/entity/PaymentCompetition.java b/cloud-server-competition/src/main/java/com/dsh/competition/entity/PaymentCompetition.java
index 6b4a225..8498834 100644
--- a/cloud-server-competition/src/main/java/com/dsh/competition/entity/PaymentCompetition.java
+++ b/cloud-server-competition/src/main/java/com/dsh/competition/entity/PaymentCompetition.java
@@ -7,6 +7,7 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
+import java.math.BigDecimal;
import java.util.Date;
/**
@@ -62,6 +63,26 @@
@TableField("payOrderNo")
private String payOrderNo;
/**
+ * 分账流水号
+ */
+ @TableField("fenzhangNo")
+ private String fenzhangNo;
+ /**
+ * 分账业务号 存值表明已分账 未存表明未分账
+ */
+ @TableField("fenzhangOrderNo")
+ private String fenzhangOrderNo;
+ /**
+ * 分账金额
+ */
+ @TableField("fenzhangAmount")
+ private BigDecimal fenzhangAmount;
+ /**
+ * 分账回退流水号
+ */
+ @TableField("fenzhangRefundNo")
+ private String fenzhangRefundNo;
+ /**
* 退款时间
*/
@TableField("refundTime")
@@ -71,6 +92,7 @@
*/
@TableField("refundOrderNo")
private String refundOrderNo;
+
/**
* 状态(1=正常,2=冻结,3=删除)
*/
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..8fe6d08 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,12 +14,20 @@
@FeignClient("mb-cloud-other")
public interface StoreClient {
/**
+ * 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例
+ * @return
+ */
+ @PostMapping("/base/getProportionByOperatorId")
+ String getProportionByOperatorId(Integer id);
+ /**
* 根据运营商id获取对应运营商商户号
* @return
*/
@PostMapping("/base/getSMIDByOperatorId")
String getSMIDByOperatorId(Integer id);
-
+ // 根据运营商id获取微信商户号
+ @PostMapping("/base/getmerchantNumberByOperatorId")
+ String getmerchantNumberByOperatorId(Integer id);
/**
* 根据名称模糊搜索门店
*
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 9159174..413b0f5 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
@@ -297,20 +297,26 @@
userCompetitionService.save(userCompetition);
}
if (paymentCompetitionVo.getPayType() == 1) {//微信
- return weChatPaymentCompetition(code, money);
+ Competition byId = competitionService.getById(paymentCompetitionVo.getId());
+ Integer operatorId = byId.getOperatorId();
+ int temp = 0;
+ if (operatorId!=null && operatorId != 0){
+ temp =1;
+ }
+ return weChatPaymentCompetition(code, money,temp,operatorId);
}
if (paymentCompetitionVo.getPayType() == 2) {//支付宝
// 判断当前赛事属于哪个运营商
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());
@@ -365,8 +371,8 @@
* @return
* @throws Exception
*/
- public ResultUtil weChatPaymentCompetition(String code, BigDecimal money) throws Exception {
- ResultUtil weixinpay = payMoneyUtil.weixinpay("报名赛事", "", code, money.toString(),
+ public ResultUtil weChatPaymentCompetition(String code, BigDecimal money,Integer isFenZhang,Integer operatorId) throws Exception {
+ ResultUtil weixinpay = payMoneyUtil.weixinpay("报名赛事"+"-"+isFenZhang, "", code, money.toString(),
"/base/competition/weChatPaymentCompetitionCallback", "APP", "");
if (weixinpay.getCode() == 200) {
new Thread(new Runnable() {
@@ -414,6 +420,31 @@
Competition competition = cttService.getById(paymentCompetition.getCompetitionId());
competition.setApplicantsNumber(competition.getApplicantsNumber() + 1);
cttService.updateById(competition);
+ if (operatorId!=null && operatorId!=0){
+ // 休眠两分钟后再调用分账接口 避免提示订单正在处理中
+ Thread.sleep(120000);
+ // 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例
+ String proportionByOperatorId = storeClient.getProportionByOperatorId(operatorId);
+ String[] split = proportionByOperatorId.split(",");
+ String s1 = split[0];
+ if (!s1.equals("未设置")){
+ BigDecimal bigDecimal = new BigDecimal(s1);
+ // 分账比例
+ BigDecimal bigDecimal1 = bigDecimal.divide(new BigDecimal(100)).setScale(2);
+ // 微信商户号
+ String s2 = storeClient.getmerchantNumberByOperatorId(operatorId);
+ String nonce_str = UUIDUtil.getRandomCode(16);
+ paymentCompetition.setFenzhangOrderNo(nonce_str);
+ ResultUtil fenzhang = payMoneyUtil.fenzhang(transaction_id, money.multiply(bigDecimal1), s2,nonce_str);
+ if (!fenzhang.getCode().equals(500)){
+ System.err.println("分账失败 原因是:"+fenzhang.getMsg());
+ }else{
+ paymentCompetition.setFenzhangNo(fenzhang.getMsg());
+ paymentCompetition.setFenzhangAmount(money.multiply(bigDecimal1));
+ paymentCompetitionService.updateById(paymentCompetition);
+ }
+ }
+ }
break;
}
if ("USERPAYING".equals(s) || "NOTPAY".equals(s)) {
@@ -439,7 +470,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) {
@@ -491,6 +522,16 @@
// 结算资金到商户账号
payMoneyUtil.confirm(smid,code,tradeNo,money.toString());
+ if (operatorId == null || operatorId == 0){
+ // 属于平台的赛事 资金不做冻结 不做分账处理
+ payMoneyUtil.confirm1(smid,code,tradeNo,money.toString());
+ }else{
+ // 资金冻结
+ payMoneyUtil.confirm(smid,code,tradeNo,money.toString());
+ // 分账处理
+ extracted(operatorId, money, tradeNo);
+ }
+ // 结算资金到商户账号
//分账
// moneyOut(tradeNo, tradeNo,code);
break;
@@ -508,7 +549,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/service/impl/PaymentCompetitionServiceImpl.java b/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/PaymentCompetitionServiceImpl.java
index 60b0405..1b12afa 100644
--- a/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/PaymentCompetitionServiceImpl.java
+++ b/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/PaymentCompetitionServiceImpl.java
@@ -48,6 +48,7 @@
@Resource
private StoreClient storeClient;
+
@Autowired
private UserCompetitionService userCompetitionService;
@@ -248,6 +249,25 @@
String payOrderNo = paymentCompetition.getPayOrderNo();
if (paymentCompetition.getPayType() == 1) {//微信支付
+ if (StringUtils.hasLength(paymentCompetition.getFenzhangNo())){
+ // 是分账订单 如果分账金额不为0 那么回退分账金额
+ if (paymentCompetition.getFenzhangAmount()!=null && paymentCompetition.getFenzhangAmount().compareTo(BigDecimal.ZERO)>0){
+ String randomCode = UUIDUtil.getRandomCode(16);
+ String randomCode1 = UUIDUtil.getRandomCode(16);
+ if (competition.getOperatorId()!=null && competition.getOperatorId()!=0){
+ // 微信商户号
+ String s2 =storeClient.getmerchantNumberByOperatorId(competition.getOperatorId());
+ ResultUtil resultUtil = payMoneyUtil.fenzhangRefund(paymentCompetition.getFenzhangNo(), paymentCompetition.getFenzhangAmount(), s2, randomCode, randomCode1);
+ if (!resultUtil.getCode().equals(500)){
+ System.err.println("分账回退失败 原因是:"+resultUtil.getMsg());
+ }else{
+ paymentCompetition.setFenzhangRefundNo(resultUtil.getMsg());
+ paymentCompetitionMapper.updateById(paymentCompetition);
+ }
+
+ }
+ }
+ }
Map<String, String> map = payMoneyUtil.wxRefund(payOrderNo, code, amount.toString(), amount.toString(),
"/base/competition/weChatCancelPaymentCompetitionCallback");
String return_code = map.get("return_code");
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 e53be28..ec1574d 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
@@ -19,6 +19,7 @@
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
@@ -320,6 +321,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 +379,6 @@
return ResultUtil.error("出现问题啦");
}
}
-
/**
* 微信统一下单
*
@@ -362,13 +403,24 @@
map.put("appid", appid);
map.put("mch_id", mchId);
map.put("nonce_str", nonce_str);
- map.put("body", body);
+ String temp = "";
+ if (body.split("-").length>1){
+ temp = body.split("-")[1];
+ map.put("body", body.split("-")[0]);
+ }else{
+ map.put("body", body);
+ }
+ if (StringUtils.hasLength(temp) && temp.equals("1")){
+ // 添加分账标识
+ map.put("profit_sharing", "Y");
+ }
map.put("attach", attach);//存储订单id
map.put("out_trade_no", out_trade_no);//存储的订单code
map.put("total_fee", i);
map.put("spbill_create_ip", hostAddress);
map.put("notify_url", callbackPath + notify_url);
map.put("trade_type", tradeType);
+
if ("JSAPI".equals(tradeType)) {
map.put("openid", openId);
}
@@ -453,6 +505,76 @@
}
}
+ /**
+ * 发起分账
+ * @param order 微信订单号
+ * @return
+ */
+ public ResultUtil fenzhang(String order,BigDecimal amount,String merchantNumber,String nonceStr ) throws Exception {
+ Map<String, Object> map = new HashMap<>();
+ map.put("mch_id", mchId);
+ map.put("appid", appid);
+ map.put("nonce_str", nonceStr);
+ map.put("transaction_id", order);
+ // 将这个字符串使用json格式拼接起来
+ Map<String, Object> body = new HashMap<>();
+ body.put("type", "MERCHANT_ID");
+ body.put("account", merchantNumber);
+ body.put("amount", amount);
+ body.put("description", "订单分账");
+ JSONObject jsonObject = new JSONObject(body);
+ String jsonString = jsonObject.toString();
+ map.put("receiver",jsonString);
+ String s = this.weixinSignature(map);
+ map.put("sign", s);
+ String url = "https://api.mch.weixin.qq.com/secapi/pay/profitsharing";
+ //设置请求头
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_XML);
+ StringBuffer xmlString = new StringBuffer();
+ Set<String> strings = map.keySet();
+ String[] keys = {};
+ keys = strings.toArray(keys);
+ Arrays.sort(keys);
+ xmlString.append("<xml>");
+ for (int l = 0; l < keys.length; l++) {
+ xmlString.append("<" + keys[l] + ">" + map.get(keys[l]) + "</" + keys[l] + ">");
+ }
+ xmlString.append("</xml>");
+
+ Map<String, String> map1 = null;
+ String body1 = null;
+ try {
+ body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ System.err.println("分账请求"+body1);
+ //将结果xml解析成map
+ body1 = body1.replaceAll("<!\\[CDATA\\[", "");
+ body1 = body1.replaceAll("]]>", "");
+ try {
+ map1 = this.xmlToMap(body1, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (DocumentException e) {
+ e.printStackTrace();
+ }
+ String return_code = map1.get("return_code");
+ if ("SUCCESS".equals(return_code)) {
+ String result_code = map1.get("result_code");
+ if ("SUCCESS".equals(result_code)) {
+
+ return ResultUtil.success(map1.get("order_id"));
+ } else {
+// System.err.println(map1.get("err_code_des"));
+ return ResultUtil.error(map1.get("err_code_des"));
+ }
+ } else {
+// System.err.println(map1.get("return_msg") + appid + "----" + mchId);
+ return ResultUtil.error(map1.get("return_msg"), new JSONObject());
+ }
+ }
/**
* 微信支付成功后的回调处理
@@ -694,7 +816,73 @@
return map2;
}
}
+ /**
+ * 发起分账回退
+ * @param order 微信订单号
+ * @return
+ */
+ public ResultUtil fenzhangRefund(String order,BigDecimal amount,String merchantNumber,
+ String nonce_str,
+ String fenzhangRefundNo) throws Exception {
+ Map<String, Object> map = new HashMap<>();
+ map.put("mch_id", mchId);
+ map.put("appid", appid);
+ map.put("nonce_str", nonce_str);
+ map.put("order_id", order);
+ map.put("out_return_no", fenzhangRefundNo);
+ map.put("return_account_type", "MERCHANT_ID");
+ map.put("return_account", merchantNumber);
+ map.put("return_amount", amount);
+ map.put("description", "用户退款");
+ String s = this.weixinSignature(map);
+ map.put("sign", s);
+ String url = "https://api.mch.weixin.qq.com/secapi/pay/profitsharingreturn";
+ //设置请求头
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_XML);
+ StringBuffer xmlString = new StringBuffer();
+ Set<String> strings = map.keySet();
+ String[] keys = {};
+ keys = strings.toArray(keys);
+ Arrays.sort(keys);
+ xmlString.append("<xml>");
+ for (int l = 0; l < keys.length; l++) {
+ xmlString.append("<" + keys[l] + ">" + map.get(keys[l]) + "</" + keys[l] + ">");
+ }
+ xmlString.append("</xml>");
+ Map<String, String> map1 = null;
+ String body1 = null;
+ try {
+ body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ System.err.println("分账金额回退"+body1);
+ //将结果xml解析成map
+ body1 = body1.replaceAll("<!\\[CDATA\\[", "");
+ body1 = body1.replaceAll("]]>", "");
+ try {
+ map1 = this.xmlToMap(body1, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (DocumentException e) {
+ e.printStackTrace();
+ }
+ String return_code = map1.get("return_code");
+ if ("SUCCESS".equals(return_code)) {
+ String result_code = map1.get("result_code");
+ if ("SUCCESS".equals(result_code)) {
+ return ResultUtil.success(map1.get("return_no"));
+ } else {
+// System.err.println(map1.get("err_code_des"));
+ return ResultUtil.error(map1.get("err_code_des"));
+ }
+ } else {
+// System.err.println(map1.get("return_msg") + appid + "----" + mchId);
+ return ResultUtil.error(map1.get("return_msg"), new JSONObject());
+ }
+ }
/**
* 微信退款成功后的回调处理
diff --git a/cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackageOrder.java b/cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackageOrder.java
index 15072c0..9820879 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackageOrder.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackageOrder.java
@@ -120,7 +120,16 @@
*/
@TableField("orderType")
private Integer orderType;
-
+ /**
+ * 分账流水号
+ */
+ @TableField("fenzhangNo")
+ private String fenzhangNo;
+ /**
+ * 分账业务号 存值表明已分账 未存表明未分账
+ */
+ @TableField("fenzhangOrderNo")
+ private String fenzhangOrderNo;
@TableField(exist = false)
private Integer type;
}
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..fb0e5d4 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获取对应运营商商户号
@@ -22,6 +28,9 @@
*/
@PostMapping("/base/getSMIDByOperatorId")
String getSMIDByOperatorId(Integer id);
+ // 根据运营商id获取微信商户号
+ @PostMapping("/base/getmerchantNumberByOperatorId")
+ String getmerchantNumberByOperatorId(Integer 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 4a0b2a2..f842961 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
@@ -871,7 +871,7 @@
}
}
try {
- return WeChatPayment(code, money);
+ return WeChatPayment(code, money,request.getLessonId());
} catch (Exception e) {
return ResultUtil.runErr();
}
@@ -902,9 +902,18 @@
return ResultUtil.success();
}
-
- public ResultUtil WeChatPayment(String code, BigDecimal request) throws Exception {
- ResultUtil weixinpay = payMoneyUtil.weixinpay("课包续费", "", code, request.toString(),
+ public ResultUtil WeChatPayment(String code, BigDecimal request,Integer coursePackageId) throws Exception {
+ TCoursePackage byId = coursePackageService.getById(coursePackageId);
+ Integer storeId = byId.getStoreId();
+ Store store = storeClient.queryStoreById(storeId);
+ // 是否分账 0否1是
+ int isFenZhang= 1;
+ String merchantNumber = "";
+ if (store.getOperatorId()==null || store.getOperatorId()==0){
+ // 平台
+ isFenZhang = 0;
+ }
+ ResultUtil weixinpay = payMoneyUtil.weixinpay("课包续费"+"-"+isFenZhang, "", code, request.toString(),
"/base/coursePackage/wechatRegisteredCoursesCallback", "APP", "");
if (weixinpay.getCode() == 200) {
String finalCode = code;
@@ -955,6 +964,27 @@
.eq("classHours", coursePackageOrder1.getClassHours())
);
coursePackageService.addCoursePackageOrderStudent(coursePackageOrder1.getId(), coursePackagePaymentConfig);
+ if (store.getOperatorId()!=null && store.getOperatorId()!=0){
+ // 休眠两分钟后再调用分账接口 避免提示订单正在处理中
+ Thread.sleep(120000);
+ // 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例
+ String proportionByOperatorId = storeClient.getProportionByOperatorId(store.getOperatorId());
+ String[] split = proportionByOperatorId.split(",");
+ String s1 = split[0];
+ if (!s1.equals("未设置")){
+ BigDecimal bigDecimal = new BigDecimal(s1);
+ // 分账比例
+ BigDecimal bigDecimal1 = bigDecimal.divide(new BigDecimal(100)).setScale(2);
+ // 微信商户号
+ String s2 = storeClient.getmerchantNumberByOperatorId(store.getOperatorId());
+ String nonce_str = UUIDUtil.getRandomCode(16);
+
+ ResultUtil fenzhang = payMoneyUtil.fenzhang(transaction_id, request.multiply(bigDecimal1), s2,nonce_str);
+ if (!fenzhang.getCode().equals(500)){
+ System.err.println("分账失败 原因是:"+fenzhang.getMsg());
+ }
+ }
+ }
break;
}
if ("USERPAYING".equals(s) || "NOTPAY".equals(s)) {
@@ -972,7 +1002,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 获取对应的商户号
@@ -1033,13 +1079,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;
}
@@ -1057,6 +1107,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 c4e2001..6a4790d 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
@@ -942,8 +942,16 @@
coursePackageOrder.setPayUserId(uid);
coursePackageOrderService.updateById(coursePackageOrder);
}
-
- ResultUtil weixinpay = payMoneyUtil.weixinpay("报名运动营", coursePackagePaymentConfig.getId().toString(), code, paymentPrice.toString(),
+ TCoursePackage byId = coursePackageService.getById(paymentCourseVo.getId());
+ Integer storeId = byId.getStoreId();
+ Store store = storeClient.queryStoreById(storeId);
+ // 是否分账 0否1是
+ int isFenZhang= 1;
+ if (store.getOperatorId()==null || store.getOperatorId()==0){
+ // 平台
+ isFenZhang = 0;
+ }
+ ResultUtil weixinpay = payMoneyUtil.weixinpay("报名运动营"+"-"+isFenZhang, coursePackagePaymentConfig.getId().toString(), code, paymentPrice.toString(),
"/base/course/weChatPaymentCourseCallback", "APP", "");
if (weixinpay.getCode() == 200) {
String finalCode = code;
@@ -989,7 +997,36 @@
coursePackageOrderService.updateById(coursePackageOrder1);
//修改课时有效期
addCoursePackageOrderStudent(coursePackageOrder1.getId(), coursePackagePaymentConfig);
+ if (store.getOperatorId()!=null && store.getOperatorId()!=0){
+ // 休眠两分钟后再调用分账接口 避免提示订单正在处理中
+ Thread.sleep(120000);
+ // 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例
+ String proportionByOperatorId = storeClient.getProportionByOperatorId(store.getOperatorId());
+ String[] split = proportionByOperatorId.split(",");
+ String s1 = split[0];
+ if (!s1.equals("未设置")){
+ BigDecimal bigDecimal = new BigDecimal(s1);
+ // 分账比例
+ BigDecimal bigDecimal1 = bigDecimal.divide(new BigDecimal(100)).setScale(2);
+ // 微信商户号
+ String s2 = storeClient.getmerchantNumberByOperatorId(store.getOperatorId());
+ BigDecimal bigDecimal2 = new BigDecimal(paymentPrice);
+ String nonce_str = UUIDUtil.getRandomCode(16);
+ ResultUtil fenzhang = payMoneyUtil.fenzhang(transaction_id, bigDecimal2.multiply(bigDecimal1), s2,nonce_str);
+ if (!fenzhang.getCode().equals(500)){
+ System.err.println("分账失败 原因是:"+fenzhang.getMsg());
+ }else{
+ coursePackageOrder1.setFenzhangNo(fenzhang.getMsg());
+ coursePackageOrder1.setFenzhangOrderNo(nonce_str);
+ coursePackageOrderService.updateById(coursePackageOrder1);
+ }
+ }
+ }
+
+
+
break;
+
}
if ("USERPAYING".equals(s) || "NOTPAY".equals(s)) {
num++;
@@ -1115,18 +1152,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;
}
}
@@ -1144,7 +1184,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 742f9e5..8756908 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
@@ -20,6 +20,7 @@
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
@@ -95,6 +96,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\"" +
" }" +
"}");
AlipayTradeSettleConfirmResponse response = null;
@@ -353,7 +395,17 @@
map.put("appid", appid);
map.put("mch_id", mchId);
map.put("nonce_str", nonce_str);
- map.put("body", body);
+ String temp = "";
+ if (body.split("-").length>1){
+ temp = body.split("-")[1];
+ map.put("body", body.split("-")[0]);
+ }else{
+ map.put("body", body);
+ }
+ if (StringUtils.hasLength(temp) && temp.equals("1")){
+ // 添加分账标识
+ map.put("profit_sharing", "Y");
+ }
map.put("attach", attach);//存储订单id
map.put("out_trade_no", out_trade_no);//存储的订单code
map.put("total_fee", i);
@@ -443,7 +495,75 @@
return ResultUtil.error(map1.get("return_msg"), new JSONObject());
}
}
+ /**
+ * 发起分账
+ * @param order 微信订单号
+ * @return
+ */
+ public ResultUtil fenzhang(String order,BigDecimal amount,String merchantNumber,String nonceStr) throws Exception {
+ Map<String, Object> map = new HashMap<>();
+ map.put("mch_id", mchId);
+ map.put("appid", appid);
+ map.put("nonce_str", nonceStr);
+ map.put("transaction_id", order);
+ // 将这个字符串使用json格式拼接起来
+ Map<String, Object> body = new HashMap<>();
+ body.put("type", "MERCHANT_ID");
+ body.put("account", merchantNumber);
+ body.put("amount", amount);
+ body.put("description", "订单分账");
+ JSONObject jsonObject = new JSONObject(body);
+ String jsonString = jsonObject.toString();
+ map.put("receiver",jsonString);
+ String s = this.weixinSignature(map);
+ map.put("sign", s);
+ String url = "https://api.mch.weixin.qq.com/secapi/pay/profitsharing";
+ //设置请求头
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_XML);
+ StringBuffer xmlString = new StringBuffer();
+ Set<String> strings = map.keySet();
+ String[] keys = {};
+ keys = strings.toArray(keys);
+ Arrays.sort(keys);
+ xmlString.append("<xml>");
+ for (int l = 0; l < keys.length; l++) {
+ xmlString.append("<" + keys[l] + ">" + map.get(keys[l]) + "</" + keys[l] + ">");
+ }
+ xmlString.append("</xml>");
+ Map<String, String> map1 = null;
+ String body1 = null;
+ try {
+ body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ System.err.println("分账请求"+body1);
+ //将结果xml解析成map
+ body1 = body1.replaceAll("<!\\[CDATA\\[", "");
+ body1 = body1.replaceAll("]]>", "");
+ try {
+ map1 = this.xmlToMap(body1, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (DocumentException e) {
+ e.printStackTrace();
+ }
+ String return_code = map1.get("return_code");
+ if ("SUCCESS".equals(return_code)) {
+ String result_code = map1.get("result_code");
+ if ("SUCCESS".equals(result_code)) {
+ return ResultUtil.success();
+ } else {
+// System.err.println(map1.get("err_code_des"));
+ return ResultUtil.error(map1.get("err_code_des"));
+ }
+ } else {
+// System.err.println(map1.get("return_msg") + appid + "----" + mchId);
+ return ResultUtil.error(map1.get("return_msg"), new JSONObject());
+ }
+ }
/**
* 微信支付成功后的回调处理
diff --git a/cloud-server-management/pom.xml b/cloud-server-management/pom.xml
index 8568baa..ba20e3f 100644
--- a/cloud-server-management/pom.xml
+++ b/cloud-server-management/pom.xml
@@ -14,6 +14,18 @@
<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>
@@ -80,8 +92,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>
@@ -170,9 +182,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>
@@ -342,4 +354,4 @@
</repositories>
-</project>
+</project>
\ No newline at end of file
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/PointsMerchandise.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/PointsMerchandise.java
index 8b78abf..d52e25e 100644
--- a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/PointsMerchandise.java
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/PointsMerchandise.java
@@ -174,7 +174,12 @@
// 已兑换数量
@TableField(exist = false)
private Integer pickUpQuantity4;
-
+ @TableField("addUserId")
+ // 添加人id 判断是平台添加还是运营商添加 用于判断分账
+ private Integer addUserId;
+ @TableField("addType")
+ // 添加人类型 1平台2运营商3门店 用于判断分账
+ private Integer addType;
@Override
protected Serializable pkVal() {
return this.id;
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 a881797..ca128ff 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
@@ -6,23 +6,19 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.*;
-import com.alipay.api.request.AlipayMerchantIndirectAuthorderCreateRequest;
-import com.alipay.api.request.AlipayMerchantIndirectAuthorderQuerystatusRequest;
import com.alipay.api.request.AntMerchantExpandIndirectImageUploadRequest;
import com.alipay.api.request.AntMerchantExpandIndirectZftCreateRequest;
-import com.alipay.api.response.AlipayMerchantIndirectAuthorderCreateResponse;
-import com.alipay.api.response.AlipayMerchantIndirectAuthorderQuerystatusResponse;
import com.alipay.api.response.AntMerchantExpandIndirectImageUploadResponse;
import com.alipay.api.response.AntMerchantExpandIndirectZftCreateResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.dsh.course.feignClient.account.model.Coach;
import com.dsh.guns.core.base.controller.BaseController;
import com.dsh.guns.core.common.constant.factory.PageFactory;
import com.dsh.guns.core.util.SinataUtil;
import com.dsh.guns.modular.system.controller.util.MD5;
+import com.dsh.guns.modular.system.controller.util.MD5AndKL;
import com.dsh.guns.modular.system.model.*;
import com.dsh.guns.modular.system.service.*;
@@ -30,9 +26,12 @@
import com.dsh.guns.modular.system.util.PayMoneyUtil;
import com.dsh.guns.modular.system.util.ResultUtil;
-import com.github.binarywang.wxpay.service.BankService;
-import com.mysql.cj.x.protobuf.MysqlxExpr;
-import org.apache.poi.ss.formula.functions.T;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.binarywang.wxpay.v3.WechatPayUploadHttpPost;
+import com.wechat.pay.java.service.profitsharing.ProfitsharingService;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.http.client.methods.HttpPost;
+import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
@@ -40,9 +39,20 @@
import org.springframework.web.bind.annotation.*;
+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;
import java.util.stream.Collectors;
@@ -61,6 +71,8 @@
@Autowired
private IOperatorAuthService operatorAuthService;
@Autowired
+ private IOperatorAuthWxService operatorAuthWxService;
+ @Autowired
private IOperatorUserService operatorUserService;
@Autowired
private IUserService userService;
@@ -74,6 +86,9 @@
private 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==";//支付宝开发者应用私钥
private String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmu8n/4yTHWbn7VOrNc9OsLtDL1bEQ8gC1dHkj8Wy5z0mkaOsjJRIG/28ze12M0V8jdCKuuDr5Z1OPKiqf+XO3ypguEh+mYUVMBM/cZodDFQfTY1TKLWjvQCuaqlA+QUTCK6f7T7stsgyQ1o9Jj0rXZDz6PM4QHSTzjrLIBaeqM5WIBvH+fy/X+QG5Utd+/UT0kc0JyvuKhZ65yVUd/C9VcwJJAPliRsAQNrqYterwAJ9zvw9tF11wj9W0XgJ8Ccu4x3gR1vrlLRJJo/OA97RmxPQ+5hSacWQZCUd1dwiBq+YCrKVHGTj14izRHXrLc0yBlRXo7tBOIqcy3IsvKVthQIDAQAB";//支付宝支付公钥
private String aliAppid = "2021004105665036";//支付宝appid
+
+
+
/**
* 根据运营商id查询所有门店
*/
@@ -110,6 +125,14 @@
List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
model.addAttribute("provinceList",list);
return PREFIX + "Operator_add.html";
+ }
+ @RequestMapping("/bindWx/{id}")
+ public String bindWx(Model model,@PathVariable("id") Integer id) {
+
+ model.addAttribute("id",id);
+ model.addAttribute("merchantNumber",operatorService.getById(id).getMerchantNumber());
+ model.addAttribute("name",operatorService.getById(id).getMerchantName());
+ return PREFIX + "Operator_wx.html";
}
/**
* 跳转运营商编辑页面
@@ -161,10 +184,27 @@
List<Map<String,Object>> list = operatorService.listAll(page,userName,phone,type);
page.setRecords(list);
return super.packForBT(page);
+
+ }
+ private ProfitsharingService profitsharingService;
+ /**
+ * 手动填入微信商户号
+ */
+ @RequestMapping(value = "/merchantNumberWx")
+ @ResponseBody
+ public Object listAll(Integer id, String merchantNumber,String name) throws Exception {
+ TOperator byId = operatorService.getById(id);
+ byId.setMerchantNumber(merchantNumber);
+ operatorService.updateById(byId);
+ ResultUtil resultUtil = payMoneyUtil.addReceiver(merchantNumber, name);
+ if (resultUtil.getCode() == 500){
+ return ResultUtil.error(resultUtil.getMsg());
+ }
+ return SUCCESS_TIP;
}
/**
- * 跳转运营商商户去认证页面
+ * 支付宝跳转运营商商户去认证页面
*/
@RequestMapping("/proportionAuth/{id}")
public String proportionAuth(Model model,@PathVariable("id") Integer id) {
@@ -215,7 +255,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 +382,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 +536,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 +550,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;
+ }
/**
* 支付宝商户认证提交
@@ -513,25 +1010,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);
@@ -578,6 +1075,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";//支付宝支付公钥
@@ -624,6 +1122,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")
@@ -635,6 +1201,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);
+ }
+
/**
* 跳转运营商设置分账比例页面
*/
@@ -857,6 +1503,7 @@
}
+
/**
* 获取所有运营商
* @return
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/controller/code/TGoodsController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TGoodsController.java
index f78c454..60b87ac 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TGoodsController.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TGoodsController.java
@@ -481,6 +481,8 @@
}
}
PointsMerchandise pointsMerchandise = new PointsMerchandise();
+ pointsMerchandise.setAddUserId(UserExt.getUser().getObjectId());
+ pointsMerchandise.setAddType(UserExt.getUser().getObjectType());
pointsMerchandise.setType(typeAll);
pointsMerchandise.setName(name);
pointsMerchandise.setCoursePackageId(coursePackageId);
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/HttpClientUtil.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/HttpClientUtil.java
new file mode 100644
index 0000000..d299371
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/HttpClientUtil.java
@@ -0,0 +1,270 @@
+package com.dsh.guns.modular.system.controller.util;
+
+import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.ssl.SSLContexts;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.net.ssl.SSLContext;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.security.KeyStore;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * http工具类
+ */
+public class HttpClientUtil {
+
+ private static Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);
+
+ private static PoolingHttpClientConnectionManager connectionManager;
+
+
+ {
+ //1.创建连接池管理器
+ connectionManager = new PoolingHttpClientConnectionManager(60000,
+ TimeUnit.MILLISECONDS);
+ connectionManager.setMaxTotal(1000);
+ connectionManager.setDefaultMaxPerRoute(50);
+ }
+
+ /**
+ * 创建一个httpClient对象
+ */
+ private static CloseableHttpClient getHttpCline() {
+ return HttpClients.custom()
+ .setConnectionManager(connectionManager)
+ .disableAutomaticRetries()
+ .build();
+ }
+
+ private static RequestConfig getRequestConfig() {
+ RequestConfig.Builder builder = RequestConfig.custom();
+ builder.setSocketTimeout(60000)//3.1设置客户端等待服务端返回数据的超时时间
+ .setConnectTimeout(30000)//3.2设置客户端发起TCP连接请求的超时时间
+ .setExpectContinueEnabled(true)
+ .setConnectionRequestTimeout(30000);//3.3设置客户端从连接池获取链接的超时时间
+ return builder.build();
+ }
+
+
+ /**
+ * 创建一个POST请求实例
+ *
+ * @param url 请求地址
+ * @param params 请求参数
+ */
+ public static CloseableHttpResponse setPostHttpRequset(String url, Map<String, Object> params, Map<String, String> header, String contentType) throws Exception {
+ HttpPost httpPost = new HttpPost(url);
+ httpPost.setConfig(getRequestConfig());
+ if (null != header) {
+ for (String key : header.keySet()) {
+ httpPost.setHeader(key, header.get(key));
+ }
+ }
+ List<NameValuePair> list = new ArrayList<>();
+ if (null != params) {
+ Set<String> keys = params.keySet();
+ for (String key : keys) {
+ list.add(new BasicNameValuePair(key, null == params.get(key) ? null : params.get(key).toString()));
+ }
+ }
+ switch (contentType) {
+ case "form":
+ httpPost.setEntity(new UrlEncodedFormEntity(list, "UTF-8"));
+ break;
+ case "json":
+ ObjectMapper objectMapper = new ObjectMapper();
+ String s = objectMapper.writeValueAsString(params);
+ httpPost.setEntity(new StringEntity(s, ContentType.create(ContentType.APPLICATION_JSON.getMimeType(), Charset.forName("UTF-8"))));
+ break;
+ }
+ return getHttpCline().execute(httpPost);
+ }
+
+
+ /**
+ * 获取get请求实例
+ *
+ * @param url 请求地址
+ * @param params 请求参数
+ */
+ private static CloseableHttpResponse setGetHttpRequset(String url, Map<String, Object> params, Map<String, String> header) throws Exception {
+ StringBuffer sb = new StringBuffer();
+ String p = "";
+ if (null != params) {
+ Set<String> keys = params.keySet();
+ for (String key : keys) {
+ sb.append(key + "=" + params.get(key) + "&");
+ }
+ p = "?" + sb.substring(0, sb.length() - 1);
+ }
+ HttpGet httpGet = new HttpGet(url + p);
+ httpGet.setConfig(getRequestConfig());
+ if (null != header) {
+ for (String key : header.keySet()) {
+ httpGet.setHeader(key, header.get(key));
+ }
+ }
+ return getHttpCline().execute(httpGet);
+ }
+
+
+ /**
+ * 发送http请求
+ *
+ * @param mothed "GET、POST、PUT、HEAD、DELETE、HEAD、OPTIONS"
+ * @param url 请求地址
+ * @param params 请求参数
+ * @param header 请求头
+ * @param contentType 参数请求方式form/json
+ * @return
+ */
+ public static HttpResult pushHttpRequset(String mothed, String url, Map<String, Object> params, Map<String, String> header, String contentType) throws Exception {
+ String randome = UUID.randomUUID().toString();
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
+ logger.info(sdf.format(new Date()) + "----(" + randome + ")请求参数:" + JSON.toJSONString(params));
+ CloseableHttpResponse httpResponse = null;
+ switch (mothed) {
+ case "GET":
+ httpResponse = setGetHttpRequset(url, params, header);
+ break;
+ case "POST":
+ httpResponse = setPostHttpRequset(url, params, header, contentType);
+ break;
+ }
+ int statusCode = httpResponse.getStatusLine().getStatusCode();
+ String content = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
+ logger.info(sdf.format(new Date()) + "----(" + randome + ")返回结果:" + content);
+ HttpResult httpResult = HttpResult.getHttpResult(statusCode, content);
+ close(httpResponse);
+ return httpResult;
+ }
+
+
+ /**
+ * 发送XML请求
+ *
+ * @param url 请求地址
+ * @param xml XML数据
+ * @param header 自定义请求头
+ * @return
+ */
+ public static HttpResult pushHttpRequsetXml(String url, String xml, Map<String, String> header) throws Exception {
+ HttpPost httpPost = new HttpPost(url);
+ httpPost.setConfig(getRequestConfig());
+ for (String key : header.keySet()) {
+ httpPost.setHeader(key, header.get(key));
+ }
+ httpPost.setHeader("Content-Type", "application/xml");
+ httpPost.setEntity(new StringEntity(xml, "UTF-8"));
+ CloseableHttpResponse httpResponse = getHttpCline().execute(httpPost);
+ int statusCode = httpResponse.getStatusLine().getStatusCode();
+ String content = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
+ HttpResult httpResult = HttpResult.getHttpResult(statusCode, content);
+ close(httpResponse);
+ return httpResult;
+ }
+
+
+ /**
+ * 请求https发送XML请求
+ *
+ * @param url 接口路径
+ * @param xml 内容
+ * @param header 请求头
+ * @param certPassword 证书密码
+ * @param certPath 证书路径
+ * @param certType 证书类型
+ * @return
+ * @throws Exception
+ */
+ public static String pushHttpsRequsetXml(String url, String xml, Map<String, String> header, String certPassword, String certPath, String certType) throws Exception {
+ HttpPost httpPost = new HttpPost(url);
+ for (String key : header.keySet()) {
+ httpPost.setHeader(key, header.get(key));
+ }
+ httpPost.setHeader("Content-Type", "application/xml");
+ httpPost.setEntity(new StringEntity(xml, "UTF-8"));
+ CloseableHttpClient httpCline = initCert(certPassword, certPath, certType);
+ CloseableHttpResponse httpResponse = httpCline.execute(httpPost);
+ String content = null;
+ if (httpResponse.getStatusLine().getStatusCode() == 200) {
+ content = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
+ } else {
+ content = "返回状态码:" + httpResponse.getStatusLine() + "。" + EntityUtils.toString(httpResponse.getEntity());
+ }
+ close(httpResponse);
+ httpCline.close();
+ return content;
+ }
+
+
+ /**
+ * 初始化https对象(带证书)
+ *
+ * @param key 证书密码
+ * @param certPath 证书路径
+ * @param certType 证书类型
+ * @throws Exception
+ */
+ private static CloseableHttpClient initCert(String key, String certPath, String certType) throws Exception {
+ KeyStore keyStore = KeyStore.getInstance(certType);
+ InputStream inputStream = new FileInputStream(new File(certPath));
+ try {
+ keyStore.load(inputStream, key.toCharArray());
+ } finally {
+ inputStream.close();
+ }
+ SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, key.toCharArray()).build();
+ SSLConnectionSocketFactory sslsf =
+ new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, null,
+ SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
+ return HttpClients.custom().setSSLSocketFactory(sslsf).build();
+ }
+
+
+ /**
+ * 关闭资源
+ */
+ private static void close(CloseableHttpResponse httpResponse) {
+ try {
+ if (null != httpResponse) {
+ EntityUtils.consume(httpResponse.getEntity());//此处高能,通过源码分析,由EntityUtils是否回收HttpEntity
+ httpResponse.close();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (null != httpResponse) {
+ httpResponse.close();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/HttpResult.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/HttpResult.java
new file mode 100644
index 0000000..e977064
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/HttpResult.java
@@ -0,0 +1,32 @@
+package com.dsh.guns.modular.system.controller.util;
+
+import lombok.Data;
+
+/**
+ * http请求返回封装
+ */
+@Data
+public class HttpResult {
+ /**
+ * 返回状态码
+ */
+ private Integer code;
+ /**
+ * 返回结果
+ */
+ private String data;
+
+ /**
+ * 返回封装结果
+ *
+ * @param code
+ * @param data
+ * @return
+ */
+ public static HttpResult getHttpResult(Integer code, String data) {
+ HttpResult httpResult = new HttpResult();
+ httpResult.setCode(code);
+ httpResult.setData(data);
+ return httpResult;
+ }
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/MD5AndKL.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/MD5AndKL.java
new file mode 100644
index 0000000..20a0684
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/MD5AndKL.java
@@ -0,0 +1,111 @@
+package com.dsh.guns.modular.system.controller.util;
+
+import java.security.MessageDigest;
+
+public class MD5AndKL {
+
+ /**
+ * MD5加码。32位
+ *
+ * @param inStr
+ * @return
+ */
+ public static String MD5(String inStr) {
+ MessageDigest md5 = null;
+ try {
+ md5 = MessageDigest.getInstance("MD5");
+ } catch (Exception e) {
+ throw new RuntimeException(e.toString());
+ }
+ byte[] md5Bytes = md5.digest(inStr.getBytes());
+ StringBuffer hexValue = new StringBuffer();
+ for (int i = 0; i < md5Bytes.length; i++) {
+ int val = ((int) md5Bytes[i]) & 0xff;
+ if (val < 16) {
+ hexValue.append("0");
+ }
+ hexValue.append(Integer.toHexString(val));
+ }
+ return hexValue.toString();
+ }
+
+ /**
+ * 可逆的加密算法
+ *
+ * @param inStr
+ * @return
+ */
+ public static String KL(String inStr) {
+ char[] a = inStr.toCharArray();
+ for (int i = 0; i < a.length; i++) {
+ a[i] = (char) (a[i] ^ 't');
+ }
+ String s = new String(a);
+ return s;
+ }
+
+ /**
+ * 加密后解密
+ *
+ * @param inStr
+ * @return
+ */
+ public static String JM(String inStr) {
+ char[] a = inStr.toCharArray();
+ for (int i = 0; i < a.length; i++) {
+ a[i] = (char) (a[i] ^ 't');
+ }
+ String k = new String(a);
+ return k;
+ }
+
+
+ public static String byteArrayToHexString(byte b[]) {
+ StringBuffer resultSb = new StringBuffer();
+ for (int i = 0; i < b.length; i++)
+ resultSb.append(byteToHexString(b[i]));
+
+ return resultSb.toString();
+ }
+
+ private static String byteToHexString(byte b) {
+ int n = b;
+ if (n < 0)
+ n += 256;
+ int d1 = n / 16;
+ int d2 = n % 16;
+ return hexDigits[d1] + hexDigits[d2];
+ }
+
+ public static String MD5Encode(String origin, String charsetname) {
+ String resultString = null;
+ try {
+ resultString = new String(origin);
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ if (charsetname == null || "".equals(charsetname)) {
+ resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
+ } else {
+ resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));
+ }
+ } catch (Exception exception) {
+ exception.printStackTrace();
+ }
+ return resultString;
+ }
+
+ private static final String hexDigits[] = {"0", "1", "2", "3", "4", "5",
+ "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
+
+// public static void main(String args[]) {
+//
+// System.out.println("MD5后再加密:" + KL(MD5("123456")));
+// System.out.println(MD5("123456"));
+// // System.out.println("加密:" + KL(MD5("123456")));
+// // s = KL(s);
+// // System.out.println("解密:" + KL("81dc9bdb52d04dc20036dbd8313ed055"));
+// // System.out.println("解密:" + JM(KL(s)));
+// // System.out.println("解密为MD5后的:" + KL(KL(MD5(s))));
+// // System.out.println(JM("5d62957bb57d3e49dcf48a0df064be4c"));
+// // System.out.println(MD5AndKL.KL(MD5AndKL.MD5("admin"+"87654321")));
+// }
+}
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/model/TOperator.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TOperator.java
index 9e1d4e5..e3d98a7 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TOperator.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TOperator.java
@@ -30,6 +30,16 @@
private Integer id;
private String name;
+ /**
+ * 微信商户号
+ */
+ @TableField("merchantNumber")
+ private String merchantNumber;
+ /**
+ * 微信商户全称
+ */
+ @TableField("merchantName")
+ private String merchantName;
@TableField("userId")
private Integer userId;
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/TOperatorService.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/TOperatorService.java
index 6a4fce6..1b8806a 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/TOperatorService.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/TOperatorService.java
@@ -6,6 +6,7 @@
import com.dsh.guns.modular.system.model.Bank;
import com.dsh.guns.modular.system.model.CoachChangeStateVO;
import com.dsh.guns.modular.system.model.TOperator;
+import com.wechat.pay.java.service.profitsharing.model.AddReceiverResponse;
import java.util.List;
import java.util.Map;
@@ -25,4 +26,5 @@
int changeState(CoachChangeStateVO vo);
List<Bank> getBankList();
+
}
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/TOperatorServiceImpl.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TOperatorServiceImpl.java
index c5e4878..9ba12d6 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TOperatorServiceImpl.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TOperatorServiceImpl.java
@@ -1,18 +1,31 @@
package com.dsh.guns.modular.system.service.impl;
+import com.baomidou.mybatisplus.extension.api.R;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsh.course.mapper.TOperatorMapper;
+import com.dsh.guns.core.exception.ServiceException;
import com.dsh.guns.modular.system.model.Bank;
import com.dsh.guns.modular.system.model.CoachChangeStateVO;
import com.dsh.guns.modular.system.model.TOperator;
import com.dsh.guns.modular.system.service.TOperatorService;
+import com.wechat.pay.java.service.profitsharing.ProfitsharingService;
+import com.wechat.pay.java.service.profitsharing.model.AddReceiverRequest;
+import com.wechat.pay.java.service.profitsharing.model.AddReceiverResponse;
+import com.wechat.pay.java.service.profitsharing.model.ReceiverRelationType;
+import com.wechat.pay.java.service.profitsharing.model.ReceiverType;
+import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
/**
* <p>
@@ -24,7 +37,6 @@
*/
@Service
public class TOperatorServiceImpl extends ServiceImpl<TOperatorMapper, TOperator> implements TOperatorService {
-
@Autowired
private TOperatorMapper tOperatorMapper;
@Override
@@ -42,4 +54,7 @@
return tOperatorMapper.getBankList();
}
+
+
+
}
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/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/PayMoneyUtil.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/PayMoneyUtil.java
index db0815e..dc0f498 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/PayMoneyUtil.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/util/PayMoneyUtil.java
@@ -12,6 +12,9 @@
import com.alipay.api.request.*;
import com.alipay.api.response.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.dsh.course.util.UUIDUtil;
+import com.dsh.guns.modular.system.controller.util.HttpClientUtil;
+import com.dsh.guns.modular.system.controller.util.MD5AndKL;
import com.dsh.guns.modular.system.model.OperatorAuthAlipay;
import com.dsh.guns.modular.system.model.OperatorUser;
import com.dsh.guns.modular.system.service.IOperatorAuthService;
@@ -22,11 +25,18 @@
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.*;
+
+import static com.dsh.guns.modular.system.controller.util.MD5AndKL.byteArrayToHexString;
+
/**
* 第三方支付工具类
*/
@@ -40,13 +50,15 @@
private String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmu8n/4yTHWbn7VOrNc9OsLtDL1bEQ8gC1dHkj8Wy5z0mkaOsjJRIG/28ze12M0V8jdCKuuDr5Z1OPKiqf+XO3ypguEh+mYUVMBM/cZodDFQfTY1TKLWjvQCuaqlA+QUTCK6f7T7stsgyQ1o9Jj0rXZDz6PM4QHSTzjrLIBaeqM5WIBvH+fy/X+QG5Utd+/UT0kc0JyvuKhZ65yVUd/C9VcwJJAPliRsAQNrqYterwAJ9zvw9tF11wj9W0XgJ8Ccu4x3gR1vrlLRJJo/OA97RmxPQ+5hSacWQZCUd1dwiBq+YCrKVHGTj14izRHXrLc0yBlRXo7tBOIqcy3IsvKVthQIDAQAB";//支付宝支付公钥
- private String appid = "";//微信appid
+ private String smid = "2088330203191220";//平台支付宝商户号...
- private String appletsAppid = "";//微信小程序appid
+ private String appid = "wx41d32f362ba0f911";//微信appid
- private String mchId = "";//微信商户号
+ private String appSecret = "cf0ebf950f5926a69041a0e2bbe20f3e";
- private String key = "";//微信商户号
+ private String mchId = "1501481761";//微信商户号
+
+ private String key = "6f5e0c2dcabfa9c27b5da5836a362fef";//微信商户号
private String callbackPath = "https://online.daowepark.com:443/account";//支付回调网关地址
@@ -66,6 +78,269 @@
private IOperatorUserService operatorUserService;
/**
+ * 添加分账接收方
+ * @param number 商户号或者openId
+ * @param name 商户全称或者个人姓名
+ * @return
+ */
+ public ResultUtil addReceiver(String number,String name) throws Exception {
+ Map<String, Object> map = new HashMap<>();
+ map.put("mch_id", mchId);
+ map.put("appid", appid);
+ String nonce_str = UUIDUtil.getRandomCode(16);
+ map.put("nonce_str", nonce_str);
+ // 将这个字符串使用json格式拼接起来
+ Map<String, Object> body = new HashMap<>();
+ body.put("type", "MERCHANT_ID");
+ body.put("account", number);
+ body.put("name", name);
+ body.put("relation_type", "PARTNER");
+ JSONObject jsonObject = new JSONObject(body);
+ String jsonString = jsonObject.toString();
+ map.put("receiver",jsonString );
+ String s = this.weixinSignature(map);
+ map.put("sign", s);
+ String url = "https://api.mch.weixin.qq.com/pay/profitsharingaddreceiver";
+ //设置请求头
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_XML);
+ StringBuffer xmlString = new StringBuffer();
+ Set<String> strings = map.keySet();
+ String[] keys = {};
+ keys = strings.toArray(keys);
+ Arrays.sort(keys);
+ xmlString.append("<xml>");
+ for (int l = 0; l < keys.length; l++) {
+ xmlString.append("<" + keys[l] + ">" + map.get(keys[l]) + "</" + keys[l] + ">");
+ }
+ xmlString.append("</xml>");
+
+ Map<String, String> map1 = null;
+ String body1 = null;
+ try {
+ body1 = HttpClientUtil.pushHttpRequsetXml(url, xmlString.toString(), new HashMap<>()).getData();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ //将结果xml解析成map
+ body1 = body1.replaceAll("<!\\[CDATA\\[", "");
+ body1 = body1.replaceAll("]]>", "");
+ try {
+ map1 = this.xmlToMap(body1, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (DocumentException e) {
+ e.printStackTrace();
+ }
+ String return_code = map1.get("return_code");
+ if ("SUCCESS".equals(return_code)) {
+ String result_code = map1.get("result_code");
+ if ("SUCCESS".equals(result_code)) {
+ return ResultUtil.success();
+ } else {
+// System.err.println(map1.get("err_code_des"));
+ return ResultUtil.error(map1.get("err_code_des"));
+ }
+ } else {
+// System.err.println(map1.get("return_msg") + appid + "----" + mchId);
+ return ResultUtil.error(map1.get("return_msg"), new JSONObject());
+ }
+ }
+ /**
+ * 发起分账
+ * @param order 微信订单号
+ * @return
+ */
+ public ResultUtil fenzhang(String order) throws Exception {
+ Map<String, Object> map = new HashMap<>();
+ map.put("mch_id", mchId);
+ map.put("appid", appid);
+ String nonce_str = UUIDUtil.getRandomCode(16);
+ map.put("nonce_str", nonce_str);
+ map.put("transaction_id", order);
+ // 将这个字符串使用json格式拼接起来
+ Map<String, Object> body = new HashMap<>();
+ body.put("type", "MERCHANT_ID");
+ // todo 分账接收方 计算分账金额
+ body.put("account", "1233");
+ body.put("amount", "0");
+ body.put("description", "订单分账");
+ JSONObject jsonObject = new JSONObject(body);
+ String jsonString = jsonObject.toString();
+ map.put("receiver",jsonString);
+ String s = this.weixinSignature(map);
+ map.put("sign", s);
+ String url = "https://api.mch.weixin.qq.com/secapi/pay/profitsharing";
+ //设置请求头
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_XML);
+ StringBuffer xmlString = new StringBuffer();
+ Set<String> strings = map.keySet();
+ String[] keys = {};
+ keys = strings.toArray(keys);
+ Arrays.sort(keys);
+ xmlString.append("<xml>");
+ for (int l = 0; l < keys.length; l++) {
+ xmlString.append("<" + keys[l] + ">" + map.get(keys[l]) + "</" + keys[l] + ">");
+ }
+ xmlString.append("</xml>");
+
+ Map<String, String> map1 = null;
+ String body1 = null;
+ try {
+ body1 = HttpClientUtil.pushHttpRequsetXml(url, xmlString.toString(), new HashMap<>()).getData();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ //将结果xml解析成map
+ body1 = body1.replaceAll("<!\\[CDATA\\[", "");
+ body1 = body1.replaceAll("]]>", "");
+ try {
+ map1 = this.xmlToMap(body1, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (DocumentException e) {
+ e.printStackTrace();
+ }
+ String return_code = map1.get("return_code");
+ if ("SUCCESS".equals(return_code)) {
+ String result_code = map1.get("result_code");
+ if ("SUCCESS".equals(result_code)) {
+ return ResultUtil.success();
+ } else {
+// System.err.println(map1.get("err_code_des"));
+ return ResultUtil.error(map1.get("err_code_des"));
+ }
+ } else {
+// System.err.println(map1.get("return_msg") + appid + "----" + mchId);
+ return ResultUtil.error(map1.get("return_msg"), new JSONObject());
+ }
+ }
+ /**
+ * 删除分账接收方
+ * @param number 商户号或者openId
+ * @param name 商户全称或者个人姓名
+ * @return
+ */
+ public ResultUtil deleteReceiver(String number,String name) throws Exception {
+ Map<String, Object> map = new HashMap<>();
+ map.put("mch_id", mchId);
+ map.put("appid", appid);
+ String nonce_str = UUIDUtil.getRandomCode(16);
+ map.put("nonce_str", nonce_str);
+ // 将这个字符串使用json格式拼接起来
+ Map<String, Object> body = new HashMap<>();
+ body.put("type", "MERCHANT_ID");
+ body.put("account", number);
+ body.put("name", name);
+ body.put("relation_type", "PARTNER");
+ JSONObject jsonObject = new JSONObject(body);
+ String jsonString = jsonObject.toString();
+ map.put("receiver",jsonString );
+ String s = this.weixinSignature(map);
+ map.put("sign", s);
+ String url = "https://api.mch.weixin.qq.com/pay/profitsharingaddreceiver";
+ //设置请求头
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_XML);
+ StringBuffer xmlString = new StringBuffer();
+ Set<String> strings = map.keySet();
+ String[] keys = {};
+ keys = strings.toArray(keys);
+ Arrays.sort(keys);
+ xmlString.append("<xml>");
+ for (int l = 0; l < keys.length; l++) {
+ xmlString.append("<" + keys[l] + ">" + map.get(keys[l]) + "</" + keys[l] + ">");
+ }
+ xmlString.append("</xml>");
+
+ Map<String, String> map1 = null;
+ String body1 = null;
+ try {
+ body1 = HttpClientUtil.pushHttpRequsetXml(url, xmlString.toString(), new HashMap<>()).getData();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ //将结果xml解析成map
+ body1 = body1.replaceAll("<!\\[CDATA\\[", "");
+ body1 = body1.replaceAll("]]>", "");
+ try {
+ map1 = this.xmlToMap(body1, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (DocumentException e) {
+ e.printStackTrace();
+ }
+ String return_code = map1.get("return_code");
+ if ("SUCCESS".equals(return_code)) {
+ String result_code = map1.get("result_code");
+ if ("SUCCESS".equals(result_code)) {
+ return ResultUtil.success();
+ } else {
+// System.err.println(map1.get("err_code_des"));
+ return ResultUtil.error(map1.get("err_code_des"));
+ }
+ } else {
+// System.err.println(map1.get("return_msg") + appid + "----" + mchId);
+ return ResultUtil.error(map1.get("return_msg"), new JSONObject());
+ }
+ }
+ /**
+ * 微信下单的签名算法
+ *
+ * @param map
+ * @return
+ */
+ private String weixinSignature(Map<String, Object> map) {
+ try {
+ Set<Map.Entry<String, Object>> entries = map.entrySet();
+ List<Map.Entry<String, Object>> infoIds = new ArrayList<Map.Entry<String, Object>>(entries);
+ // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
+ Collections.sort(infoIds, new Comparator<Map.Entry<String, Object>>() {
+ public int compare(Map.Entry<String, Object> o1, Map.Entry<String, Object> o2) {
+ return (o1.getKey()).toString().compareTo(o2.getKey());
+ }
+ });
+ // 构造签名键值对的格式
+ StringBuilder sb = new StringBuilder();
+ for (Map.Entry<String, Object> item : infoIds) {
+ if (item.getKey() != null || item.getKey() != "") {
+ String key = item.getKey();
+ Object val = item.getValue();
+ if (!(val == "" || val == null)) {
+ sb.append(key + "=" + val + "&");
+ }
+ }
+ }
+ sb.append("key=" + key);
+ String sign = sha256_HMAC(sb.toString(), key).toUpperCase();
+ return sign;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+ /**
+ * sha256_HMAC加密
+ * @param message 消息
+ * @param secret 秘钥
+ * @return 加密后字符串
+ */
+ public String sha256_HMAC(String message, String secret) {
+ String hash = "";
+ try {
+ Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
+ SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
+ sha256_HMAC.init(secret_key);
+ byte[] bytes = sha256_HMAC.doFinal(message.getBytes());
+ hash = byteArrayToHexString(bytes);
+ } catch (Exception e) {
+ System.out.println("Error HmacSHA256 ===========" + e.getMessage());
+ }
+ return hash;
+ }
+
+ /**
* 处理直付通审核通过和拒绝消息
*/
public void getMessage() {
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/bootstrap.properties b/cloud-server-management/src/main/resources/bootstrap.properties
index f173039..70c8af5 100644
--- a/cloud-server-management/src/main/resources/bootstrap.properties
+++ b/cloud-server-management/src/main/resources/bootstrap.properties
@@ -31,4 +31,5 @@
feign.compression.request.enabled=true
feign.compression.response.enabled=true
-mybatis-plus.configuration.map-underscore-to-camel-case=false
\ No newline at end of file
+mybatis-plus.configuration.map-underscore-to-camel-case=false
+
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/Operator.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/Operator.html
index b132165..5a01801 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/Operator.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/Operator.html
@@ -40,6 +40,7 @@
<#button name="冻结" icon="fa-remove" clickFun="TSite.offShelf()" space="true"/>
<#button name="解冻" icon="fa-check" clickFun="TSite.onShelf()" space="true"/>
<#button name="重置密码" icon="fa-search" clickFun="TSite.reload()" space="true"/>
+ <#button name="绑定微信商户号" icon="fa-search" clickFun="TSite.bindWx()" space="true"/>
</div>
<#table id="TSiteTable"/>
</div>
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/WEB-INF/view/system/operator/Operator_wx.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/Operator_wx.html
new file mode 100644
index 0000000..fd8e561
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/Operator_wx.html
@@ -0,0 +1,81 @@
+@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">
+ <div class="row">
+ <input hidden id="id" value="${id}">
+ <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="merchantNumber" value="${merchantNumber}" placeholder="请输入" type="number">
+ </div>
+ <label class="col-sm-3 control-label">*微信商户全称:</label>
+ <div class="col-sm-9">
+ <input style="width: 300px" class="form-control" id="name" value="${name}" placeholder="请输入" type="text">
+ </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.merchantNumber()"/>
+ <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TSite.close()"/>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<script src="${ctxPath}/modular/system/operator/operator_add.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">
+
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop.html
index 56a376c..e32a26d 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop.html
@@ -69,7 +69,7 @@
@}
<#button name="免费福利" icon="fa-remove" clickFun="TCompetition.gift()" space="true"/>
<#button name="首页设置" icon="fa-remove" clickFun="TCompetition.indexSet()" space="true"/>
-
+
@if(role == '1'){
@if(shiro.hasPermission("/tHomeModule/tHomeModule_platformSet")){
<#button name="图文模块设置" icon="fa-edit" clickFun="TCompetition.platformSet()" space="true"/>
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/operator/operator.js b/cloud-server-management/src/main/webapp/static/modular/system/operator/operator.js
index e376ae5..529af05 100644
--- a/cloud-server-management/src/main/webapp/static/modular/system/operator/operator.js
+++ b/cloud-server-management/src/main/webapp/static/modular/system/operator/operator.js
@@ -19,7 +19,7 @@
*/
TSite.initColumn = function () {
return [
- {field: 'selectItem', checkbox: true},
+ {field: 'selectItem', radio: true},
{title: '序号', field: 'id', visible: true, align: 'center', valign: 'middle'},
{title: '运营商名称', field: 'name', visible: true, align: 'center', valign: 'middle',width:'20%',},
{title: '管理员姓名', field: 'userName', visible: true, align: 'center', valign: 'middle',
@@ -95,6 +95,19 @@
this.layerIndex = index;
}
};
+TSite.bindWx = function () {
+ if (this.check()) {
+ var index = layer.open({
+ type: 2,
+ title: "商户认证",
+ area: ['100%', '100%'], //宽高
+ fix: false, //不固定
+ maxmin: true,
+ content: Feng.ctxPath + '/operator/bindWx/' + TSite.seItem.id
+ });
+ this.layerIndex = index;
+ }
+};
/**
* 商户号认证页面回显
*/
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/operator/operator_add.js b/cloud-server-management/src/main/webapp/static/modular/system/operator/operator_add.js
index f4d67b0..5090314 100644
--- a/cloud-server-management/src/main/webapp/static/modular/system/operator/operator_add.js
+++ b/cloud-server-management/src/main/webapp/static/modular/system/operator/operator_add.js
@@ -100,7 +100,59 @@
}
};
+TSite.oneChange = function (e) {
+ console.log("进入!")
+ var oneId=$(e).val();
+ console.log(oneId)
+ var ajax = new $ax(Feng.ctxPath + "/tCompetition/onChange", function(data){
+ var content='<option value="">选择市</option>';
+ $.each(data, function(k,v) {
+ content += "<option value='"+v.code+"'>"+v.name+"</option>";
+ });
+ $("#cCode").empty().append(content);
+ });
+ if (oneId==""){
+ var temp = '<option value="">请先选择省</option>';
+ $("#cCode").empty().append(temp);
+ }
+ ajax.set("oneId",oneId);
+ ajax.start();
+}
+/**
+ * 关闭此对话框
+ */
+TSite.close = function() {
+ parent.layer.close(window.parent.TSite.layerIndex);
+}
+
+TSite.merchantNumber = function(){
+ if($("#merchantNumber").val() == "" || $("#merchantNumber").val() == null){
+ Feng.error("请填写微信商户号")
+ return;
+ }
+ if($("#name").val() == "" || $("#name").val() == null){
+ Feng.error("请填写微信商户全称")
+ return;
+ }
+ //提交信息
+ var ajax = new $ax(Feng.ctxPath + "/operator/merchantNumberWx", function(data){
+ console.log(data)
+ if (data.code == 500){
+ Feng.error(data.msg)
+ return
+ }
+ Feng.success("操作成功!");
+ window.parent.TSite.table.refresh();
+ TSite.close();
+ },function(data){
+ Feng.error("操作失败!" + data.responseJSON.message + "!");
+ });
+ ajax.set("id",$("#id").val());
+ ajax.set("merchantNumber",$("#merchantNumber").val());
+ ajax.set("name",$("#name").val());
+ ajax.start();
+};
TSite.oneChange = function (e) {
console.log("进入!")
var oneId=$(e).val();
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 bda7919..bf1a715 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
@@ -177,7 +177,8 @@
-
+ @Autowired
+ private IOperatorUserService operatorUserService;
@ResponseBody
@PostMapping("/api/game/payGame")
@ApiOperation(value = "支付游戏", tags = {"用户—游戏"})
@@ -195,6 +196,14 @@
Integer uid = tokenUtil.getUserIdFormRedis();
if (null == uid) {
return ResultUtil.tokenErr();
+ }
+ Site byId = siteService.getById(spaceId);
+ // 是否分账 0否1是
+ int isFenZhang= 1;
+ String merchantNumber = "";
+ if (byId.getOperatorId()==null || byId.getOperatorId()==0){
+ // 平台
+ isFenZhang = 0;
}
//判断当前用户是否是员工
AppUser appUser1 = appUserClient.queryAppUser(uid);
@@ -218,7 +227,7 @@
tGameRecord.setMoney(config.getCash());
gameRecordService.updateById(tGameRecord);
String params = uid + "_" + gameId + "_" + spaceId + "_" + sutuId+"_"+code+"_"+configId + "_" + gameType;
- ResultUtil weixinpay = payMoneyUtil.weixinpay("游戏支付", params, code, config.getCash().toString(),
+ ResultUtil weixinpay = payMoneyUtil.weixinpay("游戏支付-"+isFenZhang, params, code, config.getCash().toString(),
"/base/game/wechatPaymentGameCallback", "APP", "");
if (weixinpay.getCode() == 200) {
new Thread(new Runnable() {
@@ -262,7 +271,43 @@
}
gameRecordService.updateBatchById(list);
Integer integer = startGame(uid, gameType, gameId, spaceId, sutuId);
+ if (byId.getOperatorId()!=null && byId.getOperatorId()!=0){
+ // 休眠两分钟后再调用分账接口 避免提示订单正在处理中
+ Thread.sleep(120000);
+ // 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例
+ OperatorUser operatorId = operatorUserService.getOne(
+ new QueryWrapper<OperatorUser>().eq("operatorId",byId.getOperatorId())
+ );
+ if (operatorId.getWechatProportion() == null){
+ operatorId.setWechatProportion("0");
+ }
+ if (operatorId.getAlipayProportion() == null){
+ operatorId.setAlipayProportion("0");
+ }
+ String proportion= operatorId.getWechatProportion()+","+operatorId.getAlipayProportion();
+ String[] split = proportion.split(",");
+ String s1 = split[0];
+ if (!s1.equals("未设置")){
+ BigDecimal bigDecimal = new BigDecimal(s1);
+ // 分账比例
+ BigDecimal bigDecimal1 = bigDecimal.divide(new BigDecimal(100)).setScale(2);
+ // 微信商户号
+ String s2 =siteService.getmerchantNumberByOperatorId(byId.getOperatorId());
+ String nonce_str = UUIDUtil.getRandomCode(16);
+
+ ResultUtil fenzhang = payMoneyUtil.fenzhang(transaction_id, config.getCash().multiply(bigDecimal1), s2,nonce_str);
+ if (!fenzhang.getCode().equals(500)){
+ System.err.println("分账失败 原因是:"+fenzhang.getMsg());
+ }else{
+ tGameRecord.setFenzhangNo(fenzhang.getMsg());
+ tGameRecord.setFenzhangOrderNo(nonce_str);
+ tGameRecord.setFenzhangAmount(config.getCash().multiply(bigDecimal1));
+ gameRecordService.updateById(tGameRecord);
+ }
+ }
+ }
break;
+
}
if ("USERPAYING".equals(s) || "NOTPAY".equals(s)) {
num++;
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 b611816..3092149 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;
@@ -66,6 +67,8 @@
@Resource
private CityManagerClient cityManagerClient;
+ @Autowired
+ private IOperatorUserService operatorUserService;
@Autowired
private TGameConfigService gameConfigService;
@@ -75,6 +78,7 @@
@Resource
private CourseRecordClient courseRecordClient;
+
@Autowired
private RedisUtil redisUtil;
@@ -95,8 +99,32 @@
@RequestMapping("/base/getSMIDByOperatorId")
@ResponseBody
public String getSMIDByOperatorId(Integer id) {
- // 获取运营商的管理员
return siteService.getSMIDByOperatorId(id);
+ }
+ /**
+ * 通过运营商id查询运营商对应的微信商户号
+ */
+ @RequestMapping("/base/getmerchantNumberByOperatorId")
+ @ResponseBody
+ public String getmerchantNumberByOperatorId(Integer id) {
+ return siteService.getmerchantNumberByOperatorId(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();
}
/**
* 获取所有场地
@@ -686,10 +714,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/entity/SiteBooking.java b/cloud-server-other/src/main/java/com/dsh/other/entity/SiteBooking.java
index cbfc476..2653f40 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/entity/SiteBooking.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/entity/SiteBooking.java
@@ -8,6 +8,7 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
+import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@@ -191,4 +192,20 @@
private List<Integer> rid;
@TableField("addType")
private Integer addType;
+ /**
+ * 分账流水号
+ */
+ @TableField("fenzhangNo")
+ private String fenzhangNo;
+ /**
+ * 分账业务号 存值表明已分账 未存表明未分账
+ */
+ @TableField("fenzhangOrderNo")
+ private String fenzhangOrderNo;
+ // 分账金额
+ @TableField("fenzhangAmount")
+ private BigDecimal fenzhangAmount;
+ // 分账回退流水号
+ @TableField("fenzhangRefundNo")
+ private String fenzhangRefundNo;
}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/entity/TGameRecord.java b/cloud-server-other/src/main/java/com/dsh/other/entity/TGameRecord.java
index e814c0d..a639a50 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/entity/TGameRecord.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/entity/TGameRecord.java
@@ -62,7 +62,18 @@
private Date time;
-
+ /**
+ * 分账流水号
+ */
+ private String fenzhangNo;
+ /**
+ * 分账业务号 存值表明已分账 未存表明未分账
+ */
+ private String fenzhangOrderNo;
+ // 分账金额
+ private BigDecimal fenzhangAmount;
+ // 分账回退流水号
+ private String fenzhangRefundNo;
@Override
protected Serializable pkVal() {
return this.id;
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/mapper/SiteMapper.java b/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteMapper.java
index c677a2c..e82bac1 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteMapper.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteMapper.java
@@ -49,5 +49,6 @@
List<TSiteDTO> listExipre(@Param("query") ExpireSiteSearchVO vo);
String getSMIDByOperatorId(@Param("id")Integer id);
+ String getmerchantNumberByOperatorId(@Param("id")Integer id);
}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/service/ISiteService.java b/cloud-server-other/src/main/java/com/dsh/other/service/ISiteService.java
index 15295f6..76de886 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/service/ISiteService.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/service/ISiteService.java
@@ -102,5 +102,6 @@
Object changeState(SiteChangeStateVO vo);
String getSMIDByOperatorId(Integer id);
+ String getmerchantNumberByOperatorId(Integer id);
}
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 767ab40..0397da7 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;
@@ -25,6 +30,7 @@
import org.aspectj.weaver.ast.Var;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
@@ -462,7 +468,15 @@
public ResultUtil weChatPaymentSite(Double paymentPrice, SiteBooking siteBooking) throws Exception {
String code = siteBooking.getOrderNo();
Integer id = siteBooking.getId();
- ResultUtil weixinpay = payMoneyUtil.weixinpay("预约场地", id.toString(), code, paymentPrice.toString(),
+ Site byId = siteService.getById(siteBooking.getSiteId());
+ // 是否分账 0否1是
+ int isFenZhang= 1;
+ String merchantNumber = "";
+ if (byId.getOperatorId()==null || byId.getOperatorId()==0){
+ // 平台
+ isFenZhang = 0;
+ }
+ ResultUtil weixinpay = payMoneyUtil.weixinpay("预约场地-"+isFenZhang, id.toString(), code, paymentPrice.toString(),
"/base/site/weChatPaymentSiteCallback", "APP", "");
if (weixinpay.getCode() == 200) {
new Thread(new Runnable() {
@@ -501,6 +515,43 @@
siteBooking.setStatus(1);
siteBooking.setPayOrderNo(transaction_id);
siteBookingService.updateById(siteBooking);
+
+ if (byId.getOperatorId()!=null && byId.getOperatorId()!=0){
+ // 休眠两分钟后再调用分账接口 避免提示订单正在处理中
+ Thread.sleep(120000);
+ // 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例
+ OperatorUser operatorId = operatorUserService.getOne(
+ new QueryWrapper<OperatorUser>().eq("operatorId",byId.getOperatorId())
+ );
+ if (operatorId.getWechatProportion() == null){
+ operatorId.setWechatProportion("0");
+ }
+ if (operatorId.getAlipayProportion() == null){
+ operatorId.setAlipayProportion("0");
+ }
+ String proportion= operatorId.getWechatProportion()+","+operatorId.getAlipayProportion();
+ String[] split = proportion.split(",");
+ String s1 = split[0];
+ if (!s1.equals("未设置")){
+ BigDecimal bigDecimal = new BigDecimal(s1);
+ // 分账比例
+ BigDecimal bigDecimal1 = bigDecimal.divide(new BigDecimal(100)).setScale(2);
+ // 微信商户号
+ String s2 =siteService.getmerchantNumberByOperatorId(byId.getOperatorId());
+ String nonce_str = UUIDUtil.getRandomCode(16);
+ BigDecimal bigDecimal2 = new BigDecimal(paymentPrice);
+ ResultUtil fenzhang = payMoneyUtil.fenzhang(transaction_id, bigDecimal2.multiply(bigDecimal1), s2,nonce_str);
+ if (!fenzhang.getCode().equals(500)){
+ System.err.println("分账失败 原因是:"+fenzhang.getMsg());
+ }else{
+ siteBooking.setFenzhangNo(fenzhang.getMsg());
+ siteBooking.setFenzhangOrderNo(nonce_str);
+ siteBooking.setFenzhangAmount(bigDecimal2.multiply(bigDecimal1));
+ siteBookingService.updateById(siteBooking);
+ }
+ }
+ }
+
break;
}
if ("USERPAYING".equals(s) || "NOTPAY".equals(s)) {
@@ -518,6 +569,10 @@
}
private String smid = "2088330203191220";//平台支付宝商户号
+ @Autowired
+ private IOperatorUserService operatorUserService;
+ @Autowired
+ private StoreClient storeClient;
/**
* 课程支付宝支付
*
@@ -586,15 +641,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)) {
@@ -611,7 +667,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("调用失败");
+ }
+ }
/**
* 玩湃币支付
*
@@ -675,7 +777,7 @@
@Override
public ResultUtil cancelMySite(Integer uid, Integer id) throws Exception {
SiteBooking siteBooking = siteBookingService.getById(id);
-
+ Site byId = siteService.getById(siteBooking.getSiteId());
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
Date startTime = siteBooking.getStartTime();
if (format.format(new Date()).equals(format.format(startTime)) && siteBooking.getStatus() != 0) {
@@ -699,6 +801,26 @@
return ResultUtil.error("不能进行取消操作");
}
if (siteBooking.getPayType() == 1) {//微信支付
+ if (StringUtils.hasLength(siteBooking.getFenzhangNo())){
+ // 是分账订单 如果分账金额不为0 那么回退分账金额
+ if (siteBooking.getFenzhangAmount()!=null && siteBooking.getFenzhangAmount().compareTo(BigDecimal.ZERO)>0){
+ String randomCode = UUIDUtil.getRandomCode(16);
+ String randomCode1 = UUIDUtil.getRandomCode(16);
+ if (byId.getOperatorId()!=null && byId.getOperatorId()!=0){
+ // 休眠两分钟后再调用分账接口 避免提示订单正在处理中
+ // 微信商户号
+ String s2 =siteService.getmerchantNumberByOperatorId(byId.getOperatorId());
+ ResultUtil resultUtil = payMoneyUtil.fenzhangRefund(siteBooking.getFenzhangNo(), siteBooking.getFenzhangAmount(), s2, randomCode, randomCode1);
+ if (!resultUtil.getCode().equals(500)){
+ System.err.println("分账回退失败 原因是:"+resultUtil.getMsg());
+ }else{
+ siteBooking.setFenzhangRefundNo(resultUtil.getMsg());
+ siteBookingService.updateById(siteBooking);
+ }
+
+ }
+ }
+ }
Map<String, String> map = payMoneyUtil.wxRefund(siteBooking.getPayOrderNo(), siteBooking.getOrderNo(), siteBooking.getPayMoney().toString(),
siteBooking.getPayMoney().toString(), "/base/site/cancelMySiteCallback");
if (null == map) {
@@ -920,4 +1042,8 @@
public String getSMIDByOperatorId(Integer id) {
return siteMapper.getSMIDByOperatorId(id);
}
+ @Override
+ public String getmerchantNumberByOperatorId(Integer id) {
+ return siteMapper.getmerchantNumberByOperatorId(id);
+ }
}
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 84fcdae..a7b08c9 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
@@ -21,6 +21,7 @@
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import javax.crypto.BadPaddingException;
@@ -98,6 +99,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\"" +
" }" +
"}");
AlipayTradeSettleConfirmResponse response = null;
@@ -285,7 +327,6 @@
e.printStackTrace();
}
JSONObject alipay_trade_precreate_response = JSON.parseObject(response.getBody()).getJSONObject("alipay_trade_precreate_response");
-
System.err.print(alipay_trade_precreate_response.getString("qr_code"));
return ResultUtil.success(alipay_trade_precreate_response.getString("qr_code"));
}
@@ -403,7 +444,17 @@
map.put("appid", appid);
map.put("mch_id", mchId);
map.put("nonce_str", nonce_str);
- map.put("body", body);
+ String temp = "";
+ if (body.split("-").length>1){
+ temp = body.split("-")[1];
+ map.put("body", body.split("-")[0]);
+ }else{
+ map.put("body", body);
+ }
+ if (StringUtils.hasLength(temp) && temp.equals("1")){
+ // 添加分账标识
+ map.put("profit_sharing", "Y");
+ }
map.put("attach", attach);//存储订单id
map.put("out_trade_no", out_trade_no);//存储的订单code
map.put("total_fee", i);
@@ -494,7 +545,142 @@
return ResultUtil.error(map1.get("return_msg"), new JSONObject());
}
}
+ /**
+ * 发起分账
+ * @param order 微信订单号
+ * @return
+ */
+ public ResultUtil fenzhang(String order,BigDecimal amount,String merchantNumber,String nonce_str) throws Exception {
+ Map<String, Object> map = new HashMap<>();
+ map.put("mch_id", mchId);
+ map.put("appid", appid);
+ map.put("nonce_str", nonce_str);
+ map.put("transaction_id", order);
+ // 将这个字符串使用json格式拼接起来
+ Map<String, Object> body = new HashMap<>();
+ body.put("type", "MERCHANT_ID");
+ body.put("account", merchantNumber);
+ body.put("amount", amount);
+ body.put("description", "订单分账");
+ JSONObject jsonObject = new JSONObject(body);
+ String jsonString = jsonObject.toString();
+ map.put("receiver",jsonString);
+ String s = this.weixinSignature(map);
+ map.put("sign", s);
+ String url = "https://api.mch.weixin.qq.com/secapi/pay/profitsharing";
+ //设置请求头
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_XML);
+ StringBuffer xmlString = new StringBuffer();
+ Set<String> strings = map.keySet();
+ String[] keys = {};
+ keys = strings.toArray(keys);
+ Arrays.sort(keys);
+ xmlString.append("<xml>");
+ for (int l = 0; l < keys.length; l++) {
+ xmlString.append("<" + keys[l] + ">" + map.get(keys[l]) + "</" + keys[l] + ">");
+ }
+ xmlString.append("</xml>");
+ Map<String, String> map1 = null;
+ String body1 = null;
+ try {
+ body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ System.err.println("分账请求"+body1);
+ //将结果xml解析成map
+ body1 = body1.replaceAll("<!\\[CDATA\\[", "");
+ body1 = body1.replaceAll("]]>", "");
+ try {
+ map1 = this.xmlToMap(body1, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (DocumentException e) {
+ e.printStackTrace();
+ }
+ String return_code = map1.get("return_code");
+ if ("SUCCESS".equals(return_code)) {
+ String result_code = map1.get("result_code");
+ if ("SUCCESS".equals(result_code)) {
+ return ResultUtil.success();
+ } else {
+// System.err.println(map1.get("err_code_des"));
+ return ResultUtil.error(map1.get("err_code_des"));
+ }
+ } else {
+// System.err.println(map1.get("return_msg") + appid + "----" + mchId);
+ return ResultUtil.error(map1.get("return_msg"), new JSONObject());
+ }
+ }
+ /**
+ * 发起分账回退
+ * @param order 微信订单号
+ * @return
+ */
+ public ResultUtil fenzhangRefund(String order,BigDecimal amount,String merchantNumber,
+ String nonce_str,
+ String fenzhangRefundNo) throws Exception {
+ Map<String, Object> map = new HashMap<>();
+ map.put("mch_id", mchId);
+ map.put("appid", appid);
+ map.put("nonce_str", nonce_str);
+ map.put("order_id", order);
+ map.put("out_return_no", fenzhangRefundNo);
+ map.put("return_account_type", "MERCHANT_ID");
+ map.put("return_account", merchantNumber);
+ map.put("return_amount", amount);
+ map.put("description", "用户退款");
+ String s = this.weixinSignature(map);
+ map.put("sign", s);
+ String url = "https://api.mch.weixin.qq.com/secapi/pay/profitsharingreturn";
+ //设置请求头
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_XML);
+ StringBuffer xmlString = new StringBuffer();
+ Set<String> strings = map.keySet();
+ String[] keys = {};
+ keys = strings.toArray(keys);
+ Arrays.sort(keys);
+ xmlString.append("<xml>");
+ for (int l = 0; l < keys.length; l++) {
+ xmlString.append("<" + keys[l] + ">" + map.get(keys[l]) + "</" + keys[l] + ">");
+ }
+ xmlString.append("</xml>");
+
+ Map<String, String> map1 = null;
+ String body1 = null;
+ try {
+ body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ System.err.println("分账金额回退"+body1);
+ //将结果xml解析成map
+ body1 = body1.replaceAll("<!\\[CDATA\\[", "");
+ body1 = body1.replaceAll("]]>", "");
+ try {
+ map1 = this.xmlToMap(body1, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (DocumentException e) {
+ e.printStackTrace();
+ }
+ String return_code = map1.get("return_code");
+ if ("SUCCESS".equals(return_code)) {
+ String result_code = map1.get("result_code");
+ if ("SUCCESS".equals(result_code)) {
+ return ResultUtil.success(map1.get("return_no"));
+ } else {
+// System.err.println(map1.get("err_code_des"));
+ return ResultUtil.error(map1.get("err_code_des"));
+ }
+ } else {
+// System.err.println(map1.get("return_msg") + appid + "----" + mchId);
+ return ResultUtil.error(map1.get("return_msg"), new JSONObject());
+ }
+ }
/**
* 微信支付成功后的回调处理
diff --git a/cloud-server-other/src/main/resources/mapper/SiteMapper.xml b/cloud-server-other/src/main/resources/mapper/SiteMapper.xml
index 6b4d3e7..0a8266d 100644
--- a/cloud-server-other/src/main/resources/mapper/SiteMapper.xml
+++ b/cloud-server-other/src/main/resources/mapper/SiteMapper.xml
@@ -144,4 +144,7 @@
<select id="getSMIDByOperatorId" resultType="java.lang.String">
select alipayNum from t_operator_user where operatorId = #{id}
</select>
+ <select id="getmerchantNumberByOperatorId" resultType="java.lang.String">
+ select merchantNumber from t_operator where id = #{id}
+ </select>
</mapper>
--
Gitblit v1.7.1