From 3cb61867769d091f7e20ade8701b6593b82141ad Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期四, 26 九月 2024 14:40:10 +0800
Subject: [PATCH] 玩湃微信商户分账
---
cloud-server-management/src/main/webapp/static/modular/system/operator/operator_add.js | 5
cloud-server-other/src/main/java/com/dsh/other/util/PayMoneyUtil.java | 89 ++
cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/Operator_wx.html | 7
cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java | 3
cloud-server-management/src/main/webapp/WEB-INF/view/system/tCompetition/TCompetition_edit.html | 2
cloud-server-course/src/main/java/com/dsh/course/util/PayMoneyUtil.java | 77 ++
cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java | 58 ++
cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/CouponClient.java | 8
cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java | 2
cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java | 2
cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackagePaymentService.java | 2
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/OperatorController.java | 13
cloud-server-course/src/main/java/com/dsh/course/util/httpClinet/HttpClientUtil.java | 55 ++
cloud-server-account/src/main/java/com/dsh/account/util/httpClinet/HttpClientUtil.java | 35 +
cloud-server-competition/src/main/java/com/dsh/competition/util/httpClinet/HttpClientUtil.java | 42 +
cloud-server-management/src/main/webapp/WEB-INF/view/system/operatorUser/OperatorUser.html | 2
cloud-server-competition/src/main/java/com/dsh/competition/util/PayMoneyUtil.java | 85 ++
cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java | 56 +-
cloud-server-management/src/main/webapp/static/modular/system/tCompetition/tCompetition_info.js | 14
cloud-server-account/src/main/java/com/dsh/account/controller/UseBenefitsController.java | 1
cloud-server-other/src/main/java/com/dsh/other/entity/TGameRecord.java | 10
cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java | 11
cloud-server-management/src/main/resources/mapper/TOperatorUserMapper.xml | 14
cloud-server-course/src/main/java/com/dsh/course/feignclient/other/StoreClient.java | 9
cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/Operator.html | 2
cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java | 26 -
cloud-server-competition/src/main/java/com/dsh/competition/feignclient/other/StoreClient.java | 9
cloud-server-other/src/main/java/com/dsh/other/controller/GameController.java | 92 ++-
cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java | 89 +++
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCompetitionController.java | 44 +
cloud-server-management/src/main/webapp/WEB-INF/view/system/tCompetition/TCompetition_add.html | 23
cloud-server-account/src/main/java/com/dsh/account/service/impl/TAppUserServiceImpl.java | 274 +++++++---
cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java | 43 -
cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackagePaymentServiceImpl.java | 127 +++-
cloud-server-course/src/main/java/com/dsh/course/model/vo/request/ClasspaymentRequest.java | 6
cloud-server-competition/src/main/java/com/dsh/competition/service/impl/PaymentCompetitionServiceImpl.java | 6
cloud-server-other/src/main/java/com/dsh/other/util/HttpClientUtil.java | 34 +
cloud-server-account/src/main/java/com/dsh/account/feignclient/other/StoreClient.java | 9
cloud-server-account/src/main/java/com/dsh/account/service/TAppUserService.java | 2
cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java | 31 +
40 files changed, 1,043 insertions(+), 376 deletions(-)
diff --git a/cloud-server-account/src/main/java/com/dsh/account/controller/UseBenefitsController.java b/cloud-server-account/src/main/java/com/dsh/account/controller/UseBenefitsController.java
index 88665d2..499eada 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/controller/UseBenefitsController.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/controller/UseBenefitsController.java
@@ -428,6 +428,7 @@
@PostMapping("/base/coupon/weChatPaymentCouponCallback")
public void weChatPaymentCouponCallback(HttpServletRequest request, HttpServletResponse response){
try {
+ System.err.println("进入回调");
Map<String, String> map = payMoneyUtil.weixinpayCallback(request);
if(null != map){
String code = map.get("out_trade_no");
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 376aca4..ab30047 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
@@ -4,6 +4,7 @@
import com.dsh.account.feignclient.course.model.QueryStoreList;
import com.dsh.account.feignclient.other.model.*;
import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -16,8 +17,8 @@
* 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例
* @return
*/
- @PostMapping("/base/getProportionByOperatorId")
- String getProportionByOperatorId(Integer id);
+ @PostMapping("/base/getProportionByOperatorId/{id}")
+ String getProportionByOperatorId(@PathVariable("id") Integer id);
/**
* 根据运营商id获取对应运营商支付宝商户号
* @return
@@ -25,8 +26,8 @@
@PostMapping("/base/getSMIDByOperatorId")
String getSMIDByOperatorId(Integer id);
// 根据运营商id获取微信商户号
- @PostMapping("/base/getmerchantNumberByOperatorId")
- String getmerchantNumberByOperatorId(Integer id);
+ @PostMapping("/base/getmerchantNumberByOperatorId/{id}")
+ String getmerchantNumberByOperatorId(@PathVariable("id")Integer id);
@PostMapping("/store/queryByStoreId")
OperatorUser queryByStoreId(Integer storeId);
diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/TAppUserService.java b/cloud-server-account/src/main/java/com/dsh/account/service/TAppUserService.java
index 339e7b0..9664571 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/service/TAppUserService.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/service/TAppUserService.java
@@ -157,7 +157,7 @@
* @param orderNumber
* @return
*/
- ResultUtil paymentCouponCallback(String code, String orderNumber);
+ ResultUtil paymentCouponCallback(String code, String orderNumber) throws Exception;
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 d964181..0e39c85 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
@@ -130,6 +130,7 @@
@Resource
private UserConponClient ucponClient;
+
@Resource
private CoursePackageClient cpageClient;
@@ -1363,11 +1364,9 @@
}
//查询该用户是否超出限领数量
Integer usercounts = userConponClient.queryCounts1(queryIds);
-
if (usercounts == coupon.getPickUpQuantity()) {
return new ResultUtil<>(0, "限领数量已达最大");
}
-
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
//生成支付订单
@@ -1423,7 +1422,7 @@
}
}
}
- System.out.println(exchangeType);
+ System.out.println("兑换积分商品"+exchangeType);
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
@@ -1540,6 +1539,7 @@
return ResultUtil.success(returnModel);
}
+ System.err.println("兑换方式"+exchangeType);
switch (exchangeType.getExchangeType()) {
// 积分
case 1:
@@ -1636,6 +1636,8 @@
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());
+ }else if(merchandise.getType() == 3){
+ return WechatPayment(merchandise.getType(), merchandise.getCash().multiply(new BigDecimal(goodsNums)), code,merchandise.getId());
}
} catch (Exception e) {
return ResultUtil.runErr();
@@ -1702,6 +1704,7 @@
if (coupon.getPublisherType()!=null&&coupon.getPublisherType()!=2){
temp = "1";
}
+ System.err.println("购买优惠券");
ResultUtil weixinpay = payMoneyUtil.weixinpay(body+"-"+temp, "", code, cash.toString(),
"/base/coupon/weChatPaymentCouponCallback", "APP", "");
if (weixinpay.getCode() == 200) {
@@ -1758,38 +1761,6 @@
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;
}
@@ -1902,7 +1873,8 @@
* @return
*/
@Override
- public ResultUtil paymentCouponCallback(String code, String orderNumber) {
+ public ResultUtil paymentCouponCallback(String code, String orderNumber) throws Exception {
+ System.err.println("进入回调");
UserCouponPayment userCouponPayment1 = userCouponPaymentClient.getUserCouponPayment(code);
if (userCouponPayment1.getStatus() == 2) {
return ResultUtil.success();
@@ -1927,8 +1899,70 @@
vo.setRemark("兑换优惠券");
vo.setType(2);
userIntegralChangesService.saveUserIntegralChanges(vo);
-
}
+ Coupon coupon = ucponClient.queryCouponById(userCouponPayment1.getCouponId());
+ // 创建一个两分钟后执行的线程
+ new Thread(() -> {
+ try {
+ Thread.sleep(120000);
+ if (coupon!=null){
+ if (coupon.getPublisherType()!=null&&coupon.getPublisherType()!=2){
+ if (coupon.getPublisherType() == 1){
+ System.err.println("进入分账逻辑");
+ // 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例
+ String proportionByOperatorId = storeClient.getProportionByOperatorId(coupon.getCityManagerId());
+ System.err.println("分账比例:"+proportionByOperatorId);
+ 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(coupon.getCityManagerId());
+ System.err.println("商户号"+s2);
+ System.err.println("分账比例"+bigDecimal1);
+ System.err.println("分账金额"+coupon.getCash().multiply(bigDecimal1));
+ ResultUtil fenzhang = payMoneyUtil.fenzhang(userCouponPayment1.getOrderNumber(), coupon.getCash().multiply(bigDecimal1), s2,"");
+ if (!fenzhang.getCode().equals(200)){
+ System.err.println("分账失败 原因是:"+fenzhang.getMsg());
+ }
+
+ }
+ } else if (coupon.getPublisherType() == 3){
+ // 门店 向上查询运营商
+ Store store = storeClient.queryStoreById(coupon.getCityManagerId());
+ if (store.getOperatorId()==null || store.getOperatorId()==0){
+ // 平台不分账
+ }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());
+ ResultUtil fenzhang = payMoneyUtil.fenzhang(userCouponPayment1.getOrderNumber(), coupon.getCash().multiply(bigDecimal1), s2,"购买优惠券分账");
+ if (!fenzhang.getCode().equals(200)){
+ System.err.println("分账失败 原因是:"+fenzhang.getMsg());
+ }else{
+ System.err.println("分账成功");
+ return;
+ }
+
+ }
+ }
+ }
+ }
+ }
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ }).start();
+
return ResultUtil.success();
}
@@ -2125,7 +2159,10 @@
private ResultUtil WechatPayment(Integer type, BigDecimal cash, String code,Integer id) throws Exception {
String name = (type == 1 ? "购买实体商品" : type == 2 ? "报名运动营": type == 3 ? "购买门票" : "购买优惠券");
+ System.err.println("微信支付:"+name);
+
PointsMerchandise pointsMerchandise = mcClient.selectPointsMerchandiseById(id);
+ System.err.println("查询积分商品"+pointsMerchandise);
// 分账表示 0否1是
String temp = "0";
switch (type){
@@ -2155,8 +2192,10 @@
// 查询门票指定的门店 属于平台还是运营商
break;
}
+ System.err.println("支付");
ResultUtil weixinpay = payMoneyUtil.weixinpay(name+"-"+temp, "", code, cash.toString(),
"/base/pointMer/exchangeGoodPaymentWeChatCallback", "APP", "");
+ System.err.println("提交支付"+weixinpay);
if (weixinpay.getCode() == 200) {
new Thread(new Runnable() {
@Override
@@ -2222,59 +2261,6 @@
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)) {
@@ -2293,7 +2279,9 @@
@Override
public ResultUtil exchangeAddPaymentCallback(String code, String orderNumber) {
+ System.err.println("进入回调"+code);
UserPointsMerchandise userPointsMerchandise = mcClient.queryUserPointMerchaseByCode(code).get(0);
+ System.err.println("商品"+userPointsMerchandise);
if (userPointsMerchandise.getPayStatus() == 2) {
return ResultUtil.success();
}
@@ -2328,7 +2316,113 @@
paymentClient.addCoursePackageOrderStudent(addCoursePackageOrderStudent);
}
}
+ // 创建一个2分钟后执行的线程
+ new Thread(() -> {
+ try {
+ // 休眠两分钟后再调用分账接口 避免提示订单正在处理中
+ Thread.sleep(1000 * 60 * 2);
+ // 分账表示 0否1是
+ String temp = "0";
+ // 运营商id
+ Integer operatorId = 0;
+ System.err.println("商品"+pointsMerchandise);
+ switch (pointsMerchandise.getType()){
+ 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());
+ System.err.println("门店ids"+integers);
+ if (!integers.isEmpty()){
+ Store store1 = storeClient.queryStoreById(integers.get(0));
+ if (store1.getOperatorId() ==null || store1.getOperatorId() == 0){
+ // 平台门票 不分账
+ }else{
+ temp = "1";
+ operatorId = store1.getOperatorId();
+ }
+ }
+ // 查询门票指定的门店 属于平台还是运营商
+ break;
+ }
+ System.err.println("运营商id"+operatorId);
+ if (operatorId != 0) {
+ //课程
+ if(pointsMerchandise.getType() == 2){
+ //课程
+ CoursePackageOrder coursePackageOrder1 = paymentClient.getCoursePackageOrderByCode(code);
+ if(null != coursePackageOrder1){
+ coursePackageOrder1.setPayStatus(2);
+ coursePackageOrder1.setOrderNumber(orderNumber);
+ coursePackageOrder1.setAppUserId(null);
+ paymentClient.updateCoursePackageOrder(coursePackageOrder1);
+ GetCoursePackagePaymentConfig getCoursePackagePaymentConfig = new GetCoursePackagePaymentConfig();
+ getCoursePackagePaymentConfig.setCoursePackageId(coursePackageOrder1.getCoursePackageId());
+ getCoursePackagePaymentConfig.setClassHours(coursePackageOrder1.getClassHours());
+ CoursePackagePaymentConfig coursePackagePaymentConfig = paymentClient.getCoursePackagePaymentConfig(getCoursePackagePaymentConfig);
+
+ AddCoursePackageOrderStudent addCoursePackageOrderStudent = new AddCoursePackageOrderStudent();
+ addCoursePackageOrderStudent.setCoursePackageOrderId(coursePackageOrder1.getId());
+ addCoursePackageOrderStudent.setCoursePackagePaymentConfig(coursePackagePaymentConfig);
+ paymentClient.addCoursePackageOrderStudent(addCoursePackageOrderStudent);
+ // 根据运营商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(orderNumber, coursePackageOrder1.getCashPayment().multiply(bigDecimal1), s2,"运动营商品");
+ if (!fenzhang.getCode().equals(200)){
+ System.err.println("分账失败 原因是:"+fenzhang.getMsg());
+ }
+ }
+ }
+ }else{
+ System.err.println("门票");
+ // 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例
+ String proportionByOperatorId = storeClient.getProportionByOperatorId(operatorId);
+ System.err.println("分账比例"+proportionByOperatorId);
+ 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);
+ System.err.println("微信商户号"+s2);
+
+ ResultUtil fenzhang = payMoneyUtil.fenzhang(orderNumber, pointsMerchandise.getCash().multiply(bigDecimal1), s2,"门票");
+ if (!fenzhang.getCode().equals(200)){
+ System.err.println("分账失败 原因是:"+fenzhang.getMsg());
+ }
+ }
+ }
+
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }).start();
return ResultUtil.success();
}
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 8b8a57b..9dacfdf 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
@@ -491,7 +491,7 @@
// 微信商户号
String s2 = storeClient.getmerchantNumberByOperatorId(store.getOperatorId());
- ResultUtil fenzhang = payMoneyUtil.fenzhang(transaction_id, amount.multiply(bigDecimal1), s2);
+ ResultUtil fenzhang = payMoneyUtil.fenzhang(transaction_id, amount.multiply(bigDecimal1), s2,"课包续费分账");
if (!fenzhang.getCode().equals(500)){
System.err.println("分账失败 原因是:"+fenzhang.getMsg());
}
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 7802c17..e6f6192 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
@@ -2,6 +2,7 @@
import cn.hutool.core.util.RandomUtil;
import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
@@ -39,10 +40,7 @@
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
+import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
@@ -55,6 +53,8 @@
import java.security.NoSuchProviderException;
import java.security.Security;
import java.util.*;
+
+import static com.dsh.account.util.akeylogin.Md5Util.byteArrayToHexString;
/**
* 第三方支付工具类
@@ -90,29 +90,45 @@
private String certPath = "/usr/playpai/cert/weixin/apiclient_cert.p12";//微信证书
-
+// public static void main(String[] args) {
+// Map<String, Object> body = new HashMap<>();
+// body.put("type", "MERCHANT_ID");
+// body.put("account", "1231232121");
+// body.put("amount", "asda");
+// body.put("description", "订单分账");
+// JSONObject jsonObject = new JSONObject(body);
+// JSONArray objects = new JSONArray();
+// objects.add(jsonObject);
+// System.err.println(objects);
+// System.err.println(objects.toJSONString());
+// }
/**
* 发起分账
* @param order 微信订单号
* @return
*/
- public ResultUtil fenzhang(String order,BigDecimal amount,String merchantNumber) throws Exception {
+ public ResultUtil fenzhang(String order,BigDecimal amount,String merchantNumber,String description) throws Exception {
Map<String, Object> map = new HashMap<>();
map.put("mch_id", mchId);
map.put("appid", appid);
String nonce_str = UUIDUtil.getRandomCode(16);
+ String out_order_no = UUIDUtil.getRandomCode(16);
+ map.put("out_order_no", out_order_no);
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", "订单分账");
+ int i = amount.multiply(new BigDecimal("100")).intValue();
+ body.put("amount", i);
+ body.put("description", description);
JSONObject jsonObject = new JSONObject(body);
- String jsonString = jsonObject.toString();
- map.put("receiver",jsonString);
- String s = this.weixinSignature(map);
+ JSONArray objects = new JSONArray();
+ objects.add(jsonObject);
+ map.put("receivers",objects.toJSONString());
+ String s = this.weixinSignature1(map);
map.put("sign", s);
String url = "https://api.mch.weixin.qq.com/secapi/pay/profitsharing";
//设置请求头
@@ -132,7 +148,7 @@
Map<String, String> map1 = null;
String body1 = null;
try {
- body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
+ body1 = HttpClientUtil.pushHttpsRequsetXml1(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
} catch (Exception e) {
e.printStackTrace();
}
@@ -1454,7 +1470,54 @@
}
return null;
}
-
+ private String weixinSignature1(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;
+ }
/**
* 微信退款成功后的解密
diff --git a/cloud-server-account/src/main/java/com/dsh/account/util/httpClinet/HttpClientUtil.java b/cloud-server-account/src/main/java/com/dsh/account/util/httpClinet/HttpClientUtil.java
index c66d006..098ebbe 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/util/httpClinet/HttpClientUtil.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/util/httpClinet/HttpClientUtil.java
@@ -219,7 +219,39 @@
httpCline.close();
return content;
}
-
+ public static String pushHttpsRequsetXml1(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 = initCert1(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;
+ }
+ private static CloseableHttpClient initCert1(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, null, null,
+ SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
+ return HttpClients.custom().setSSLSocketFactory(sslsf).build();
+ }
/**
* 初始化https对象(带证书)
@@ -245,6 +277,7 @@
}
+
/**
* 关闭资源
*/
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java
index 219f9f3..39b6df5 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java
@@ -189,6 +189,17 @@
return null;
}
}
+ @ResponseBody
+ @PostMapping("/coupon/queryUserCouponById")
+ public Integer queryUserCouponById(@RequestBody Long id) {
+ try {
+ Integer couponId = userCouponService.getById(id).getCouponId();
+ return couponId;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
@Autowired
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 db27a44..70acfbd 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
@@ -460,7 +460,34 @@
Competition competition = cttService.getById(paymentCompetition.getCompetitionId());
competition.setApplicantsNumber(competition.getApplicantsNumber() + 1);
cttService.updateById(competition);
+ if (competition.getOperatorId()!=null && competition.getOperatorId()!=0){
+ // 休眠两分钟后再调用分账接口 避免提示订单正在处理中
+ Thread.sleep(120000);
+ // 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例
+ String proportionByOperatorId = storeClient.getProportionByOperatorId(competition.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(competition.getOperatorId());
+ String nonce_str = UUIDUtil.getRandomCode(16);
+ paymentCompetition.setFenzhangOrderNo(nonce_str);
+ BigDecimal bigDecimal2 = new BigDecimal(paymentCompetition.getAmount());
+ ResultUtil fenzhang = payMoneyUtil.fenzhang(transaction_id, bigDecimal2.multiply(bigDecimal1), s2,nonce_str,"报名赛事分账");
+ if (!fenzhang.getCode().equals(200)){
+ System.err.println("分账失败 原因是:"+fenzhang.getData()+"-"+fenzhang.getMsg());
+ }else{
+ paymentCompetition.setFenzhangNo(fenzhang.getData().toString());
+ paymentCompetition.setFenzhangAmount(bigDecimal2.multiply(bigDecimal1));
+ paymentCompetitionService.updateById(paymentCompetition);
+ }
+ }
+ }
}
+
PrintWriter out = response.getWriter();
out.write(result);
@@ -812,10 +839,10 @@
// 微信商户号
String s2 =storeClient.getmerchantNumberByOperatorId(competition.getOperatorId());
ResultUtil resultUtil = payMoneyUtil.fenzhangRefund(paymentCompetition.getFenzhangNo(), paymentCompetition.getFenzhangAmount(), s2, randomCode, randomCode1);
- if (!resultUtil.getCode().equals(500)){
+ if (!resultUtil.getCode().equals(200)){
System.err.println("分账回退失败 原因是:"+resultUtil.getMsg());
}else{
- paymentCompetition.setFenzhangRefundNo(resultUtil.getMsg());
+ paymentCompetition.setFenzhangRefundNo(resultUtil.getData().toString());
paymentCompetitionService.updateById(paymentCompetition);
}
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 8fe6d08..0b66da1 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
@@ -3,6 +3,7 @@
import com.dsh.competition.entity.OperatorUser;
import com.dsh.competition.feignclient.other.model.Store;
import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.List;
@@ -17,8 +18,8 @@
* 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例
* @return
*/
- @PostMapping("/base/getProportionByOperatorId")
- String getProportionByOperatorId(Integer id);
+ @PostMapping("/base/getProportionByOperatorId/{id}")
+ String getProportionByOperatorId(@PathVariable("id") Integer id);
/**
* 根据运营商id获取对应运营商商户号
* @return
@@ -26,8 +27,8 @@
@PostMapping("/base/getSMIDByOperatorId")
String getSMIDByOperatorId(Integer id);
// 根据运营商id获取微信商户号
- @PostMapping("/base/getmerchantNumberByOperatorId")
- String getmerchantNumberByOperatorId(Integer id);
+ @PostMapping("/base/getmerchantNumberByOperatorId/{id}")
+ String getmerchantNumberByOperatorId(@PathVariable("id")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 413b0f5..54ef1fc 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
@@ -420,31 +420,7 @@
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)) {
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 1b12afa..81b6967 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
@@ -258,10 +258,10 @@
// 微信商户号
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());
+ if (!resultUtil.getCode().equals(200)){
+ System.err.println("分账回退失败 原因是:"+resultUtil.getData().toString());
}else{
- paymentCompetition.setFenzhangRefundNo(resultUtil.getMsg());
+ paymentCompetition.setFenzhangRefundNo(resultUtil.getData().toString());
paymentCompetitionMapper.updateById(paymentCompetition);
}
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 ec1574d..4ed40c1 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
@@ -1,6 +1,7 @@
package com.dsh.competition.util;
import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
@@ -21,10 +22,7 @@
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
+import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
@@ -36,6 +34,8 @@
import java.security.NoSuchProviderException;
import java.security.Security;
import java.util.*;
+
+import static com.dsh.competition.util.akeylogin.Md5Util.byteArrayToHexString;
/**
* 第三方支付工具类
@@ -510,22 +510,27 @@
* @param order 微信订单号
* @return
*/
- public ResultUtil fenzhang(String order,BigDecimal amount,String merchantNumber,String nonceStr ) throws Exception {
+ public ResultUtil fenzhang(String order,BigDecimal amount,String merchantNumber,String nonceStr,String description) 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);
+ String out_order_no = UUIDUtil.getRandomCode(16);
+ map.put("out_order_no", out_order_no);
// 将这个字符串使用json格式拼接起来
Map<String, Object> body = new HashMap<>();
+ // 将这个字符串使用json格式拼接起来
body.put("type", "MERCHANT_ID");
body.put("account", merchantNumber);
- body.put("amount", amount);
- body.put("description", "订单分账");
+ int i = amount.multiply(new BigDecimal("100")).intValue();
+ body.put("amount", i);
+ body.put("description", description);
JSONObject jsonObject = new JSONObject(body);
- String jsonString = jsonObject.toString();
- map.put("receiver",jsonString);
- String s = this.weixinSignature(map);
+ JSONArray objects = new JSONArray();
+ objects.add(jsonObject);
+ map.put("receivers",objects.toJSONString());
+ String s = this.weixinSignature1(map);
map.put("sign", s);
String url = "https://api.mch.weixin.qq.com/secapi/pay/profitsharing";
//设置请求头
@@ -545,7 +550,7 @@
Map<String, String> map1 = null;
String body1 = null;
try {
- body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
+ body1 = HttpClientUtil.pushHttpsRequsetXml1(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
} catch (Exception e) {
e.printStackTrace();
}
@@ -832,9 +837,10 @@
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);
+ BigDecimal multiply = amount.multiply(new BigDecimal("100"));
+ map.put("return_amount", multiply.intValue());
+ map.put("description", "用户报名赛事退款");
+ String s = this.weixinSignature1(map);
map.put("sign", s);
String url = "https://api.mch.weixin.qq.com/secapi/pay/profitsharingreturn";
//设置请求头
@@ -854,7 +860,7 @@
Map<String, String> map1 = null;
String body1 = null;
try {
- body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
+ body1 = HttpClientUtil.pushHttpsRequsetXml1(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
} catch (Exception e) {
e.printStackTrace();
}
@@ -1278,7 +1284,54 @@
return sb.toString();
}
-
+ private String weixinSignature1(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;
+ }
/**
* 微信下单的签名算法
*
diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/util/httpClinet/HttpClientUtil.java b/cloud-server-competition/src/main/java/com/dsh/competition/util/httpClinet/HttpClientUtil.java
index 97b9b6a..f797a93 100644
--- a/cloud-server-competition/src/main/java/com/dsh/competition/util/httpClinet/HttpClientUtil.java
+++ b/cloud-server-competition/src/main/java/com/dsh/competition/util/httpClinet/HttpClientUtil.java
@@ -218,7 +218,25 @@
httpCline.close();
return content;
}
-
+ public static String pushHttpsRequsetXml1(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 = initCert1(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对象(带证书)
@@ -242,6 +260,28 @@
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
return HttpClients.custom().setSSLSocketFactory(sslsf).build();
}
+ /**
+ * 初始化https对象(带证书)
+ *
+ * @param key 证书密码
+ * @param certPath 证书路径
+ * @param certType 证书类型
+ * @throws Exception
+ */
+ private static CloseableHttpClient initCert1(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, null, null,
+ SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
+ return HttpClients.custom().setSSLSocketFactory(sslsf).build();
+ }
/**
diff --git a/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java
index effc10e..d18b5ab 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java
@@ -1173,10 +1173,11 @@
public ResultUtil continuationOperation(ClasspaymentRequest request) {
try {
Integer userId = tokenUtil.getUserIdFormRedis();
+ System.err.println("续课参数"+request);
if (null == userId) {
return ResultUtil.tokenErr();
}
- Integer couponId = request.getConponId();
+ Long couponId = request.getConponId();
if (couponId == null || couponId == 0) {
request.setConponId(null);
}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/CouponClient.java b/cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/CouponClient.java
index a724d7c..4b535a7 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/CouponClient.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/CouponClient.java
@@ -24,6 +24,14 @@
*/
@PostMapping("/coupon/queryCouponById")
Coupon queryCouponById(Integer id);
+ /**
+ * 根据领取优惠券记录id获取优惠券
+ *
+ * @param id
+ * @return
+ */
+ @PostMapping("/coupon/queryUserCouponById")
+ Integer queryUserCouponById(Long id);
@PostMapping("/base/userConpon/queryCouponRules")
Map<String, Object> getCouponRules(@RequestBody Integer couponId);
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 fb0e5d4..ff8a9cc 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
@@ -4,6 +4,7 @@
import com.dsh.course.feignclient.other.model.GetDistanceVo;
import com.dsh.course.feignclient.other.model.Store;
import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -19,8 +20,8 @@
* 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例
* @return
*/
- @PostMapping("/base/getProportionByOperatorId")
- String getProportionByOperatorId(Integer id);
+ @PostMapping("/base/getProportionByOperatorId/{id}")
+ String getProportionByOperatorId(@PathVariable("id")Integer id);
/**
* 根据运营商id获取对应运营商商户号
@@ -29,8 +30,8 @@
@PostMapping("/base/getSMIDByOperatorId")
String getSMIDByOperatorId(Integer id);
// 根据运营商id获取微信商户号
- @PostMapping("/base/getmerchantNumberByOperatorId")
- String getmerchantNumberByOperatorId(Integer id);
+ @PostMapping("/base/getmerchantNumberByOperatorId/{id}")
+ String getmerchantNumberByOperatorId(@PathVariable("id") Integer id);
/**
* 根据名称模糊搜索门店
*
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/vo/request/ClasspaymentRequest.java b/cloud-server-course/src/main/java/com/dsh/course/model/vo/request/ClasspaymentRequest.java
index 9f2495d..977b4eb 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/model/vo/request/ClasspaymentRequest.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/vo/request/ClasspaymentRequest.java
@@ -20,13 +20,17 @@
private Integer useConpon;
@ApiModelProperty(value = "优惠券Id")
- private Integer conponId;
+ private Long conponId;
@ApiModelProperty(value = "支付记录id")
private Long coursePayId;
@ApiModelProperty(value = "课时数")
private Integer courseHoursNum;
+ @ApiModelProperty(value = "支付价格")
+ private Double cash;
+ @ApiModelProperty(value = "玩湃币支付价格")
+ private Integer playPaiCoin;
}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackagePaymentService.java b/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackagePaymentService.java
index 7f5910b..4f1b620 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackagePaymentService.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackagePaymentService.java
@@ -95,7 +95,7 @@
*/
List<RecordAppoint> obtainStuClassDetails(Integer stuId, Integer appUserId, Integer pageNum);
- ResultUtil insertVipPaymentCallback(String code, String orderNumber);
+ ResultUtil insertVipPaymentCallback(String code, String orderNumber) throws Exception;
List<BillingRequest> queryAmountDatas(Integer appUserId, String monthStart, String monthEnd);
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java b/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java
index 779d552..4b76d7b 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java
@@ -109,7 +109,7 @@
* @param trade_no
* @return
*/
- ResultUtil paymentCourseCallback(String code, String trade_no, String attach) throws AlipayApiException;
+ ResultUtil paymentCourseCallback(String code, String trade_no, String attach) throws Exception;
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 52544e2..121df37 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
@@ -798,11 +798,13 @@
@Override
public ResultUtil ContinuationOrpaymentCourse(Integer userId, ClasspaymentRequest request) {
+ System.err.println("请求参数"+request);
AppUser appUser = appuClient.queryAppUser(userId);
CoursePackageOrder coursePackageOrder = coursePackageOrderService.getById(request.getCoursePayId());
+ System.err.println("上次支付记录"+coursePackageOrder);
String code = "";
- BigDecimal money = coursePackageOrder.getCashPayment();
- Integer wpGold = coursePackageOrder.getPlayPaiCoin();
+ BigDecimal money = BigDecimal.valueOf(request.getCash());
+ Integer wpGold = request.getPlayPaiCoin();
if (coursePackageOrder.getPayStatus() == 1) {
code = coursePackageOrder.getCode();
coursePackageOrder.setPayType(request.getPayType());
@@ -815,11 +817,13 @@
CoursePackagePaymentConfig paymentConfig = cpConfigMapper.selectOne(new QueryWrapper<CoursePackagePaymentConfig>()
.eq("coursePackageId", request.getLessonId())
.eq("classHours", request.getCourseHoursNum()));
+ System.err.println("价格配置"+paymentConfig);
TCoursePackageDiscount coursePackageDiscount = tcpdMapper.selectOne(new QueryWrapper<TCoursePackageDiscount>()
.eq("coursePackageId", request.getLessonId())
.eq("type", 2)
.eq("auditStatus", 1)
.eq("coursePackagePaymentConfigId", paymentConfig.getCoursePackageId()));
+ System.err.println("折扣"+coursePackageDiscount);
if (ToolUtil.isNotEmpty(coursePackageDiscount)) {
String content = coursePackageDiscount.getContent();
JSONObject jsonObject = JSON.parseObject(content);
@@ -837,7 +841,7 @@
newPayment.setAppUserId(appUser.getId());
newPayment.setStudentIds(request.getStuId().toString());
newPayment.setCoursePackageId(request.getLessonId());
- newPayment.setClassHours(coursePackageOrder.getClassHours());
+ newPayment.setClassHours(request.getCourseHoursNum());
newPayment.setOriginalPrice(coursePackageOrder.getOriginalPrice());
if (request.getUseConpon() == 1) {
newPayment.setUserCouponId(Long.valueOf(request.getUseConpon()));
@@ -848,27 +852,37 @@
newPayment.setPayType(request.getPayType());
newPayment.setState(1);
newPayment.setInsertTime(new Date());
+ if (request.getCash()!=null && request.getCash()!=0){
+ newPayment.setCashPayment(BigDecimal.valueOf(request.getCash()));
+ }
+ newPayment.setPlayPaiCoin(request.getPlayPaiCoin());
newPayment.setOrderType(1);
+ newPayment.setUserCouponId(request.getConponId());
coursePackageOrderService.save(newPayment);
code = newPayment.getCode();
}
+ System.err.println("选择");
switch (request.getPayType()) {
case 1:
if (request.getUseConpon() == 1) {
- Coupon coupon = client.queryCouponById(request.getConponId());
- if (coupon.getType() == 1) {
- Map<String, Object> couponRules = client.getCouponRules(coupon.getId());
- Double conditionalAmount = (Double) couponRules.get("conditionalAmount");
- Double deductionAmount = (Double) couponRules.get("deductionAmount");
- if (money.compareTo(BigDecimal.valueOf(conditionalAmount)) >= 0) {
- money = BigDecimal.valueOf(deductionAmount);
- }
- }
- if (coupon.getType() == 2) {
- Map<String, Object> couponRules = client.getCouponRules(coupon.getId());
- Object amount = couponRules.get("deductionAmount");
- money = BigDecimal.valueOf((Double) amount);
- }
+ Integer coupon1 = client.queryUserCouponById(request.getConponId());
+ System.err.println("优惠券id"+coupon1);
+ Coupon coupon = client.queryCouponById(coupon1);
+ System.err.println("优惠券信息"+coupon);
+// if (coupon.getType() == 1) {
+// Map<String, Object> couponRules = client.getCouponRules(coupon.getId());
+// Double conditionalAmount = (Double) couponRules.get("conditionalAmount");
+// Double deductionAmount = (Double) couponRules.get("deductionAmount");
+// if (money.compareTo(BigDecimal.valueOf(conditionalAmount)) >= 0) {
+// money = BigDecimal.valueOf(deductionAmount);
+// }
+// }
+// if (coupon.getType() == 2) {
+// Map<String, Object> couponRules = client.getCouponRules(coupon.getId());
+// System.err.println("优惠券规则"+couponRules);
+// Object amount = couponRules.get("conditionalAmount");
+// money = BigDecimal.valueOf((Double) amount);
+// }
}
try {
return WeChatPayment(code, money,request.getLessonId());
@@ -877,7 +891,8 @@
}
case 2:
if (request.getUseConpon() == 1) {
- Coupon coupon = client.queryCouponById(request.getConponId());
+ Integer coupon1 = client.queryUserCouponById(request.getConponId());
+ Coupon coupon = client.queryCouponById(coupon1);
if (coupon.getType() == 1) {
Map<String, Object> couponRules = client.getCouponRules(coupon.getId());
Double conditionalAmount = (Double) couponRules.get("conditionalAmount");
@@ -892,8 +907,10 @@
money = BigDecimal.valueOf((Double) amount);
}
}
+
return AlipayPayment(code, money);
case 3:
+ System.err.println("选择");
PlaypaiGoldPayment(appUser, code, wpGold);
break;
default:
@@ -903,9 +920,14 @@
}
public ResultUtil WeChatPayment(String code, BigDecimal request,Integer coursePackageId) throws Exception {
+ System.err.println("code-------------"+code);
+ System.err.println("request---------------"+request);
+ System.err.println("coursePackageId-------------"+coursePackageId);
TCoursePackage byId = coursePackageService.getById(coursePackageId);
+ System.err.println("课包"+coursePackageId);
Integer storeId = byId.getStoreId();
Store store = storeClient.queryStoreById(storeId);
+ System.err.println("门店查询"+store);
// 是否分账 0否1是
int isFenZhang= 1;
String merchantNumber = "";
@@ -913,6 +935,7 @@
// 平台
isFenZhang = 0;
}
+ System.err.println("拉起支付");
ResultUtil weixinpay = payMoneyUtil.weixinpay("课包续费"+"-"+isFenZhang, "", code, request.toString(),
"/base/coursePackage/wechatRegisteredCoursesCallback", "APP", "");
if (weixinpay.getCode() == 200) {
@@ -964,27 +987,7 @@
.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)) {
@@ -1155,17 +1158,31 @@
}
public ResultUtil PlaypaiGoldPayment(AppUser appUser, String code, Integer wpGold) {
- TCoursePackagePayment packagePayment = this.baseMapper.selectOne(new QueryWrapper<TCoursePackagePayment>()
+ System.err.println("进入玩湃支付");
+ CoursePackageOrder packagePayment = coursePackageOrderService.getOne(new QueryWrapper<CoursePackageOrder>()
.eq("code", code));
+ System.err.println("支付"+packagePayment);
+ System.err.println("用户信息"+appUser);
+ System.err.println("code"+code);
+ System.err.println("wpGold"+wpGold);
if (appUser.getPlayPaiCoins() < wpGold) {
return ResultUtil.error("玩湃币不足!");
}
packagePayment.setPayStatus(2);
packagePayment.setPayUserId(appUser.getId());
packagePayment.setPlayPaiCoin(wpGold);
- this.baseMapper.updateById(packagePayment);
+ System.err.println("扣去玩湃币");
+ try {
+ System.err.println("修改");
+ boolean b = coursePackageOrderService.updateById(packagePayment);
+ }catch (Exception e){
+ System.err.println("报错"+e.getCause());
+ System.err.println("报错"+e.getMessage());
+ e.printStackTrace();
+ }
appUser.setPlayPaiCoins(ToolUtil.isNotEmpty(appUser.getPlayPaiCoins()) ? appUser.getPlayPaiCoins() - wpGold : wpGold);
+
appuClient.updateAppUser(appUser);
return ResultUtil.success();
}
@@ -1316,7 +1333,7 @@
}
@Override
- public ResultUtil insertVipPaymentCallback(String code, String orderNumber) {
+ public ResultUtil insertVipPaymentCallback(String code, String orderNumber) throws Exception {
CoursePackageOrder coursePackageOrder1 = coursePackageOrderService.getOne(new QueryWrapper<CoursePackageOrder>()
.eq("code", code).eq("state", 1));
if (coursePackageOrder1.getPayStatus() == 2) {
@@ -1332,10 +1349,30 @@
.eq("classHours", coursePackageOrder1.getClassHours())
);
coursePackageService.addCoursePackageOrderStudent(coursePackageOrder1.getId(), coursePackagePaymentConfig);
- try {
- coursePackageService.moneyOut(orderNumber,orderNumber,code);
- } catch (AlipayApiException e) {
- e.printStackTrace();
+ TCoursePackage byId = coursePackageService.getById(coursePackageOrder1.getCoursePackageId());
+ Integer storeId = byId.getStoreId();
+ Store store = storeClient.queryStoreById(storeId);
+
+ 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(orderNumber, coursePackageOrder1.getCashPayment().multiply(bigDecimal1), s2,nonce_str);
+ if (!fenzhang.getCode().equals(200)){
+ System.err.println("分账失败 原因是:"+fenzhang.getData());
+ }
+ }
}
return ResultUtil.success();
}
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 6a4790d..2404704 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
@@ -997,31 +997,7 @@
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);
- }
- }
- }
+
@@ -1363,7 +1339,7 @@
* @return
*/
@Override
- public ResultUtil paymentCourseCallback(String code, String trade_no, String attach) throws AlipayApiException {
+ public ResultUtil paymentCourseCallback(String code, String trade_no, String attach) throws Exception {
CoursePackageOrder coursePackageOrder1 = coursePackageOrderService.getOne(new QueryWrapper<CoursePackageOrder>()
.eq("code", code).eq("state", 1));
if (coursePackageOrder1.getPayStatus() == 2) {
@@ -1376,7 +1352,33 @@
CoursePackagePaymentConfig coursePackagePaymentConfig = coursePackagePaymentConfigService.getById(attach);
addCoursePackageOrderStudent(coursePackageOrder1.getId(), coursePackagePaymentConfig);
- moneyOut(trade_no,trade_no,code);
+ TCoursePackage byId = coursePackageService.getById(coursePackageOrder1.getCoursePackageId());
+ Store store = storeClient.queryStoreById(byId.getStoreId());
+// moneyOut(trade_no,trade_no,code);
+ 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(trade_no, coursePackageOrder1.getCashPayment().multiply(bigDecimal1), s2,nonce_str);
+ if (!fenzhang.getCode().equals(200)){
+ System.err.println("分账失败 原因是:"+fenzhang.getData().toString());
+ }else{
+ coursePackageOrder1.setFenzhangNo(fenzhang.getData().toString());
+ coursePackageOrder1.setFenzhangOrderNo(nonce_str);
+ coursePackageOrderService.updateById(coursePackageOrder1);
+ }
+ }
+ }
return ResultUtil.success();
}
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 8756908..a8021ef 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
@@ -1,6 +1,7 @@
package com.dsh.course.util;
import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
@@ -22,10 +23,7 @@
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
+import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
@@ -38,6 +36,8 @@
import java.security.NoSuchProviderException;
import java.security.Security;
import java.util.*;
+
+import static com.dsh.course.util.akeylogin.Md5Util.byteArrayToHexString;
/**
* 第三方支付工具类
@@ -495,6 +495,8 @@
return ResultUtil.error(map1.get("return_msg"), new JSONObject());
}
}
+
+
/**
* 发起分账
* @param order 微信订单号
@@ -506,16 +508,20 @@
map.put("appid", appid);
map.put("nonce_str", nonceStr);
map.put("transaction_id", order);
+ String out_order_no = UUIDUtil.getRandomCode(16);
+ map.put("out_order_no", out_order_no);
// 将这个字符串使用json格式拼接起来
Map<String, Object> body = new HashMap<>();
body.put("type", "MERCHANT_ID");
body.put("account", merchantNumber);
- body.put("amount", amount);
- body.put("description", "订单分账");
+ int i = amount.multiply(new BigDecimal("100")).intValue();
+ body.put("amount", i);
+ body.put("description", "购买课包分账");
JSONObject jsonObject = new JSONObject(body);
- String jsonString = jsonObject.toString();
- map.put("receiver",jsonString);
- String s = this.weixinSignature(map);
+ JSONArray objects = new JSONArray();
+ objects.add(jsonObject);
+ map.put("receivers",objects.toJSONString());
+ String s = this.weixinSignature1(map);
map.put("sign", s);
String url = "https://api.mch.weixin.qq.com/secapi/pay/profitsharing";
//设置请求头
@@ -535,7 +541,7 @@
Map<String, String> map1 = null;
String body1 = null;
try {
- body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
+ body1 = HttpClientUtil.pushHttpsRequsetXml1(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
} catch (Exception e) {
e.printStackTrace();
}
@@ -554,7 +560,7 @@
if ("SUCCESS".equals(return_code)) {
String result_code = map1.get("result_code");
if ("SUCCESS".equals(result_code)) {
- return ResultUtil.success();
+ return ResultUtil.success(map1.get("order_id"));
} else {
// System.err.println(map1.get("err_code_des"));
return ResultUtil.error(map1.get("err_code_des"));
@@ -1237,7 +1243,54 @@
}
return null;
}
-
+ private String weixinSignature1(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;
+ }
/**
* 微信下单的签名算法
diff --git a/cloud-server-course/src/main/java/com/dsh/course/util/httpClinet/HttpClientUtil.java b/cloud-server-course/src/main/java/com/dsh/course/util/httpClinet/HttpClientUtil.java
index d4b0bfe..0e969e4 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/util/httpClinet/HttpClientUtil.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/util/httpClinet/HttpClientUtil.java
@@ -242,6 +242,61 @@
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
return HttpClients.custom().setSSLSocketFactory(sslsf).build();
}
+ /**
+ * 请求https发送XML请求
+ *
+ * @param url 接口路径
+ * @param xml 内容
+ * @param header 请求头
+ * @param certPassword 证书密码
+ * @param certPath 证书路径
+ * @param certType 证书类型
+ * @return
+ * @throws Exception
+ */
+ public static String pushHttpsRequsetXml1(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 = initCert1(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 initCert1(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, null, null,
+ SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
+ return HttpClients.custom().setSSLSocketFactory(sslsf).build();
+ }
/**
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 a5d0e85..2173819 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
@@ -132,6 +132,11 @@
model.addAttribute("id",id);
model.addAttribute("merchantNumber",operatorService.getById(id).getMerchantNumber());
model.addAttribute("name",operatorService.getById(id).getMerchantName());
+ OperatorUser one = operatorUserService.lambdaQuery()
+ .eq(OperatorUser::getOperatorId, id).one();
+ if (one!=null){
+ model.addAttribute("wechatProportion",one.getWechatProportion());
+ }
return PREFIX + "Operator_wx.html";
}
/**
@@ -192,11 +197,17 @@
*/
@RequestMapping(value = "/merchantNumberWx")
@ResponseBody
- public Object listAll(Integer id, String merchantNumber,String name) throws Exception {
+ public Object listAll(Integer id, String merchantNumber,String name,String wechatProportion) throws Exception {
TOperator byId = operatorService.getById(id);
byId.setMerchantNumber(merchantNumber);
byId.setMerchantName(name);
operatorService.updateById(byId);
+ OperatorUser one = operatorUserService.lambdaQuery()
+ .eq(OperatorUser::getOperatorId, id).one();
+ if (one!=null){
+ one.setWechatProportion(wechatProportion);
+ operatorUserService.updateById(one);
+ }
ResultUtil resultUtil = payMoneyUtil.addReceiver(merchantNumber, name);
if (resultUtil.getCode() == 500){
return ResultUtil.error(resultUtil.getMsg());
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCompetitionController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCompetitionController.java
index d79ad0d..8d60d0d 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCompetitionController.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCompetitionController.java
@@ -139,7 +139,6 @@
@RequestMapping("/tCompetition_add")
public String tCompetitionAdd(Model model) {
List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
- model.addAttribute("list",list);
List<TOperator> list1 = tOperatorService.list();
model.addAttribute("yysList",list1);
@@ -152,13 +151,12 @@
// 查询这个运营商管理的省
TOperator id = tOperatorService.getOne(new QueryWrapper<TOperator>().eq("id", UserExt.getUser().getObjectId()));
if (id.getType()==1){
- // 全国
- List<TCity> list3 = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
- model.addAttribute("province",list3);
+
}else{
// 找到他管理的省
List<TOperatorCity> list4 = operatorCityService.list(new QueryWrapper<TOperatorCity>().eq("operatorId", UserExt.getUser().getObjectId()).eq("pid", 0));
- model.addAttribute("province",list4);
+ List<Integer> collect = list4.stream().map(TOperatorCity::getCode).collect(Collectors.toList());
+ list = cityService.list(new LambdaQueryWrapper<TCity>().in(TCity::getCode, collect));
}
model.addAttribute("operator",objectId);
// 查询当前运营商管理了哪些门店
@@ -172,6 +170,8 @@
if (UserExt.getUser().getObjectType()==3) model.addAttribute("operator",byId.getOperatorId());
List<TOperator> list2 = tOperatorService.list();
model.addAttribute("yysList",list2);
+ model.addAttribute("list",list);
+
return PREFIX + "TCompetition_add.html";
}
@@ -206,10 +206,39 @@
model.addAttribute("storeIds",integers);
List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
+
TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, competition.getProvinceCode()));
List<TCity> list1 = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId,one.getId()));
List<TStore> list2 = storeService.list(new LambdaQueryWrapper<TStore>().eq(TStore::getCityCode,competition.getCityCode()));
+ if (UserExt.getUser().getObjectType()==2){
+ // 查询这个运营商管理的省
+ TOperator id1 = tOperatorService.getOne(new QueryWrapper<TOperator>().eq("id", UserExt.getUser().getObjectId()));
+ if (id1.getType()==1){
+
+ }else{
+ // 找到他管理的省
+ List<TOperatorCity> list4 = operatorCityService.list(new QueryWrapper<TOperatorCity>().eq("operatorId", UserExt.getUser().getObjectId()).eq("pid", 0));
+ List<Integer> collect = list4.stream().map(TOperatorCity::getCode).collect(Collectors.toList());
+ list = cityService.list(new LambdaQueryWrapper<TCity>().in(TCity::getCode, collect));
+ // 找到他管理的市
+ TOperatorCity one1 = operatorCityService.lambdaQuery().eq(TOperatorCity::getCode, competition.getProvinceCode())
+ .eq(TOperatorCity::getOperatorId, UserExt.getUser().getObjectId()).one();
+
+ List<TOperatorCity> list3 = operatorCityService.lambdaQuery().eq(TOperatorCity::getPid, one1.getId())
+ .eq(TOperatorCity::getOperatorId, UserExt.getUser().getObjectId()).list();
+ if (list3.isEmpty()){
+ // 管理整个市区
+ }else{
+ List<Integer> collect1 = list3.stream().map(TOperatorCity::getCode).collect(Collectors.toList());
+ list1 = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId,one.getId())
+ .in(TCity::getCode, collect1));
+ }
+
+ }
+ list2 = storeService.list(new LambdaQueryWrapper<TStore>().eq(TStore::getCityCode,competition.getCityCode())
+ .eq(TStore::getOperatorId,UserExt.getUser().getObjectId()));
+ }
model.addAttribute("list",list);
model.addAttribute("list1",list1);
model.addAttribute("list2",list2);
@@ -437,6 +466,11 @@
@ResponseBody
public Object oneChangeNext(Integer oneId) {
try {
+ if (UserExt.getUser().getObjectType() == 2){
+ return storeService.list(new LambdaQueryWrapper<TStore>().eq(TStore::getCityCode, oneId)
+ .eq(TStore::getOperatorId, UserExt.getUser().getObjectId()));
+
+ }
return storeService.list(new LambdaQueryWrapper<TStore>().eq(TStore::getCityCode, oneId));
}catch (Exception e){
e.printStackTrace();
diff --git a/cloud-server-management/src/main/resources/mapper/TOperatorUserMapper.xml b/cloud-server-management/src/main/resources/mapper/TOperatorUserMapper.xml
index ce5f4a2..79aa256 100644
--- a/cloud-server-management/src/main/resources/mapper/TOperatorUserMapper.xml
+++ b/cloud-server-management/src/main/resources/mapper/TOperatorUserMapper.xml
@@ -20,20 +20,6 @@
t1.name AS operatorName,
t2.name AS userName,
t2.phone,
- t3.wechat AS platform,
- t3.wechatProportion AS proportion,
- t3.wechatNum AS number,
- t3.wechatAudit AS audit,
- t3.wechatType AS type
- FROM t_operator_user t3
- LEFT JOIN t_operator t1 ON t3.operatorId = t1.id
- LEFT JOIN sys_user t2 ON t1.userId = t2.id AND t2.objectType = 2
- UNION ALL
- SELECT t3.id,
- t1.id AS operatorId,
- t1.name AS operatorName,
- t2.name AS userName,
- t2.phone,
t3.alipay AS platform,
t3.alipayProportion AS proportion,
t3.alipayNum AS number,
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 5a01801..8958336 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,7 +40,9 @@
<#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"/>
+ @if(shiro.hasPermission("/operator/merchantNumberWx")){
<#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/Operator_wx.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/Operator_wx.html
index fd8e561..ab77e4d 100644
--- 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
@@ -58,6 +58,13 @@
<div class="col-sm-9">
<input style="width: 300px" class="form-control" id="name" value="${name}" placeholder="请输入" type="text">
</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="wechatProportion" value="${wechatProportion}" placeholder="请输入" type="number">
+ </div>
+ </div>
</div>
</div>
</div>
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/operatorUser/OperatorUser.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/operatorUser/OperatorUser.html
index f34b0b5..2bc8448 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/operatorUser/OperatorUser.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/operatorUser/OperatorUser.html
@@ -24,7 +24,7 @@
</div>
<select style="width: 300px" class="form-control" id="platform" name = "platform">
<option value="">全部</option>
- <option value="1">微信</option>
+
<option value="2">支付宝</option>
</select>
</div>
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCompetition/TCompetition_add.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCompetition/TCompetition_add.html
index 258661a..025eb76 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCompetition/TCompetition_add.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCompetition/TCompetition_add.html
@@ -46,6 +46,7 @@
<div class="ibox-content">
<input hidden id="operator" value="${operator}">
+ <input hidden id="type" value="${type}">
<div class="form-horizontal" id="carInfoForm">
@if(type==1){
@@ -106,7 +107,27 @@
</div>
</div>
</div>
-
+ @}
+ @if(type==2){
+ <div class="form-group" >
+ <label class="col-sm-3 control-label">所在省:</label>
+ <div class="col-sm-9">
+ <select class="form-control" id="pCode1" name="pCode" onchange="TCarInfoDlg.oneChange9(this)">
+ <option value="">选择省</option>
+ @for(i in list){
+ <option value="${i.code}" >${i.name}</option>
+ @}
+ </select>
+ </div>
+ </div>
+ <div class="form-group" >
+ <label class="col-sm-3 control-label">举办市:</label>
+ <div class="col-sm-9">
+ <select class="form-control" id="cCode1" name="cCode" onchange="TCarInfoDlg.oneChangeNext(this)">
+ <option value="">选择市</option>
+ </select>
+ </div>
+ </div>
@}
@if(type==1){
<div class="form-group" id="shop">
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCompetition/TCompetition_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCompetition/TCompetition_edit.html
index c55380a..dfcb68d 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCompetition/TCompetition_edit.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCompetition/TCompetition_edit.html
@@ -55,6 +55,8 @@
<input hidden id="type" value="${item.status}">
@if(objectType==1){
<#label id="types" name="当前状态" type="text" />
+ @}
+ @if(objectType!=3){
<div class="form-group" id="provinceCode">
<label class="col-sm-3 control-label">举办省:</label>
<div class="col-sm-9">
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 5090314..ded86b3 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
@@ -135,6 +135,10 @@
Feng.error("请填写微信商户全称")
return;
}
+ if($("#wechatProportion").val() == "" || $("#wechatProportion").val() == null){
+ Feng.error("请填写微信分账比例")
+ return;
+ }
//提交信息
var ajax = new $ax(Feng.ctxPath + "/operator/merchantNumberWx", function(data){
console.log(data)
@@ -151,6 +155,7 @@
ajax.set("id",$("#id").val());
ajax.set("merchantNumber",$("#merchantNumber").val());
ajax.set("name",$("#name").val());
+ ajax.set("wechatProportion",$("#wechatProportion").val());
ajax.start();
};
TSite.oneChange = function (e) {
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tCompetition/tCompetition_info.js b/cloud-server-management/src/main/webapp/static/modular/system/tCompetition/tCompetition_info.js
index bc9e345..4030ebb 100644
--- a/cloud-server-management/src/main/webapp/static/modular/system/tCompetition/tCompetition_info.js
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tCompetition/tCompetition_info.js
@@ -249,7 +249,19 @@
}
}
}
-
+ console.log("当前登陆人"+$("#type").val())
+ if ($("#type").val()==2){
+ pCode = $("#pCode1").val();
+ if($("#pCode1").val()==""){
+ Feng.info("请选择省");
+ return;
+ }
+ cCode = $("#cCode1").val();
+ if($("#cCode1").val()==""){
+ Feng.info("请选择市");
+ return;
+ }
+ }
var shopId = $("#shopId").val();
if(shopId==""){
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 bf1a715..b5c911a 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
@@ -198,10 +198,12 @@
return ResultUtil.tokenErr();
}
Site byId = siteService.getById(spaceId);
+ Store byId1 = storeService.getById(byId.getStoreId());
+
// 是否分账 0否1是
int isFenZhang= 1;
String merchantNumber = "";
- if (byId.getOperatorId()==null || byId.getOperatorId()==0){
+ if (byId1.getOperatorId()==null || byId1.getOperatorId()==0){
// 平台
isFenZhang = 0;
}
@@ -221,14 +223,17 @@
tGameRecord.setUserId(uid);
tGameRecord.setNumber(code);
tGameRecord.setTime(new Date());
+ tGameRecord.setSiteId(spaceId);
gameRecordService.save(tGameRecord);
+ System.err.println("启动游戏支付");
if (type == 1) {
tGameRecord.setMoney(config.getCash());
gameRecordService.updateById(tGameRecord);
String params = uid + "_" + gameId + "_" + spaceId + "_" + sutuId+"_"+code+"_"+configId + "_" + gameType;
ResultUtil weixinpay = payMoneyUtil.weixinpay("游戏支付-"+isFenZhang, params, code, config.getCash().toString(),
"/base/game/wechatPaymentGameCallback", "APP", "");
+ System.err.println("启动游戏支付");
if (weixinpay.getCode() == 200) {
new Thread(new Runnable() {
@Override
@@ -271,41 +276,7 @@
}
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;
}
@@ -507,11 +478,15 @@
}
+ @Resource
+ private StoreService storeService;
@ResponseBody
@PostMapping("/base/game/wechatPaymentGameCallback")
- public void wechatPaymentGameCallback(HttpServletRequest request, HttpServletResponse response){
+ public void wechatPaymentGameCallback(HttpServletRequest request, HttpServletResponse response) throws Exception {
+ System.err.println("进入游戏回调");
Map<String, String> map = payMoneyUtil.weixinpayCallback(request);
+ System.err.println("回调参数"+map);
if(null != map){
String out_trade_no = map.get("out_trade_no");
String transaction_id = map.get("transaction_id");
@@ -537,6 +512,51 @@
gameRecordService.updateBatchById(list);
String[] s = attach.split("_");
Integer integer = startGame(Integer.valueOf(s[0]), Integer.valueOf(s[6]), Integer.valueOf(s[1]), Integer.valueOf(s[2]), Integer.valueOf(s[3]));
+ TGameRecord one = gameRecordService.getOne(new QueryWrapper<TGameRecord>().eq("number", out_trade_no).eq("payType", 1));
+ System.err.println("游戏支付记录"+one);
+ if (one!=null){
+ Integer gameId = one.getGameId();
+ Site byId1 = siteService.getById(one.getSiteId());
+ Store byId = storeService.getById(byId1.getStoreId());
+ if (byId!=null){
+ 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, one.getMoney().multiply(bigDecimal1), s2,nonce_str,"玩游戏分账");
+ if (!fenzhang.getCode().equals(200)){
+ System.err.println("分账失败 原因是:"+fenzhang.getMsg());
+ }else{
+ one.setFenzhangNo(fenzhang.getData().toString());
+ one.setFenzhangOrderNo(nonce_str);
+ one.setFenzhangAmount(one.getMoney().multiply(bigDecimal1));
+ gameRecordService.updateById(one);
+ }
+ }
+ }
+ }
+
+ }
PrintWriter out = null;
try {
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 3092149..1eb56f6 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
@@ -35,6 +35,7 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
+import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
@@ -93,6 +94,7 @@
+
/**
* 通过运营商id查询运营商对应的支付宝商户号
*/
@@ -104,17 +106,17 @@
/**
* 通过运营商id查询运营商对应的微信商户号
*/
- @RequestMapping("/base/getmerchantNumberByOperatorId")
+ @RequestMapping("/base/getmerchantNumberByOperatorId/{id}")
@ResponseBody
- public String getmerchantNumberByOperatorId(Integer id) {
+ public String getmerchantNumberByOperatorId(@PathVariable("id")Integer id) {
return siteService.getmerchantNumberByOperatorId(id);
}
/**
* 根据运营商id获取对应运营商分账比例 返回格式: 微信分账比例,支付宝分账比例
*/
- @RequestMapping("/base/getProportionByOperatorId")
+ @RequestMapping("/base/getProportionByOperatorId/{id}")
@ResponseBody
- public String getProportionByOperatorId(Integer id) {
+ public String getProportionByOperatorId(@PathVariable("id")Integer id) {
OperatorUser operatorId = operatorUserService.getOne(
new QueryWrapper<OperatorUser>().eq("operatorId",id)
);
@@ -124,6 +126,7 @@
if (operatorId.getAlipayProportion() == null){
operatorId.setAlipayProportion("0");
}
+ System.err.println("查询分账比例"+operatorId);
return operatorId.getWechatProportion()+","+operatorId.getAlipayProportion();
}
/**
@@ -350,6 +353,7 @@
@PostMapping("/base/site/weChatPaymentSiteCallback")
public void weChatPaymentSiteCallback(HttpServletRequest request, HttpServletResponse response) {
try {
+ System.err.println("预约场地回调");
Map<String, String> map = payMoneyUtil.weixinpayCallback(request);
if (null != map) {
String code = map.get("out_trade_no");
@@ -361,12 +365,49 @@
siteBooking.setStatus(1);
siteBooking.setPayOrderNo(transaction_id);
siteBookingService.updateById(siteBooking);
-
+ Store byId = service.getById(siteBooking.getStoreId());
+ if (byId.getOperatorId()!=null && byId.getOperatorId()!=0){
+ System.err.println("预约场地分账");
+ // 休眠两分钟后再调用分账接口 避免提示订单正在处理中
+ 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(siteBooking.getPayMoney());
+ ResultUtil fenzhang = payMoneyUtil.fenzhang(transaction_id, bigDecimal2.multiply(bigDecimal1), s2,nonce_str,"预约场地分账");
+ if (!fenzhang.getCode().equals(200)){
+ System.err.println("分账失败 原因是:"+fenzhang.getMsg());
+ }else{
+ siteBooking.setFenzhangNo(fenzhang.getData().toString());
+ siteBooking.setFenzhangOrderNo(nonce_str);
+ siteBooking.setFenzhangAmount(bigDecimal2.multiply(bigDecimal1));
+ siteBookingService.updateById(siteBooking);
+ }
+ }
+ }
PrintWriter out = response.getWriter();
out.write(result);
out.flush();
out.close();
}
+
}
} catch (Exception e) {
e.printStackTrace();
@@ -506,12 +547,15 @@
public ResultUtil<Map<String, Object>> queryMySiteById(Integer id) {
try {
HashMap<String, Object> map = new HashMap<>();
+ System.err.println("预约id"+id);
SiteBooking siteBooking = siteBookingService.getById(id);
+ System.err.println("预约"+siteBooking);
Integer storeId = siteBooking.getStoreId();
Store byId1 = service.getById(storeId);
Site site = siteService.getById(siteBooking.getSiteId());
map.put("siteName", byId1.getName());
SiteType siteType = siteTypeService.getById(site.getSiteTypeId());
+ System.err.println("预约类型"+siteType);
map.put("siteType", siteType.getName());
map.put("shopName", byId1.getName());
map.put("shopAddress", byId1.getAddress());
@@ -541,7 +585,9 @@
BeanUtils.copyProperties(siteBooking, siteBookingVo);
siteBookingVo.setStartTime(siteBooking.getStartTime().getTime());
siteBookingVo.setEndTime(siteBooking.getEndTime().getTime());
- siteBookingVo.setPayTime(siteBooking.getPayTime().getTime());
+ if (siteBooking.getPayTime()!=null){
+ siteBookingVo.setPayTime(siteBooking.getPayTime().getTime());
+ }
map.put("data", siteBookingVo);
map.put("ids", ids);
return ResultUtil.success(map);
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 a639a50..dbaddfc 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
@@ -45,6 +45,11 @@
*/
@TableField("payType")
private Integer payType;
+ /**
+ * 场地id
+ */
+ @TableField("siteId")
+ private Integer siteId;
/**
* 金额
@@ -62,17 +67,22 @@
private Date time;
+
/**
* 分账流水号
*/
+ @TableField("fenzhangNo")
private String fenzhangNo;
/**
* 分账业务号 存值表明已分账 未存表明未分账
*/
+ @TableField("fenzhangOrderNo")
private String fenzhangOrderNo;
// 分账金额
+ @TableField("fenzhangAmount")
private BigDecimal fenzhangAmount;
// 分账回退流水号
+ @TableField("fenzhangRefundNo")
private String fenzhangRefundNo;
@Override
protected Serializable pkVal() {
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 0397da7..6cc0dff 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
@@ -516,41 +516,7 @@
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;
}
@@ -807,12 +773,11 @@
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());
+ ResultUtil resultUtil = payMoneyUtil.fenzhangRefund(siteBooking.getFenzhangNo(), siteBooking.getFenzhangAmount().multiply(new BigDecimal("100")), s2, randomCode, randomCode1);
+ if (!resultUtil.getCode().equals(200)){
+ System.err.println("分账回退失败 原因是:"+resultUtil.getMsg()+resultUtil.getData());
}else{
siteBooking.setFenzhangRefundNo(resultUtil.getMsg());
siteBookingService.updateById(siteBooking);
diff --git a/cloud-server-other/src/main/java/com/dsh/other/util/HttpClientUtil.java b/cloud-server-other/src/main/java/com/dsh/other/util/HttpClientUtil.java
index b33680b..f4fe16c 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/util/HttpClientUtil.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/util/HttpClientUtil.java
@@ -244,7 +244,39 @@
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
return HttpClients.custom().setSSLSocketFactory(sslsf).build();
}
-
+ public static String pushHttpsRequsetXml1(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 = initCert1(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;
+ }
+ private static CloseableHttpClient initCert1(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, null, null,
+ SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
+ return HttpClients.custom().setSSLSocketFactory(sslsf).build();
+ }
/**
* 关闭资源
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 a7b08c9..6d03524 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
@@ -1,6 +1,7 @@
package com.dsh.other.util;
import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
@@ -24,10 +25,7 @@
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
+import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
@@ -39,6 +37,8 @@
import java.security.NoSuchProviderException;
import java.security.Security;
import java.util.*;
+
+import static com.dsh.other.util.akeylogin.Md5Util.byteArrayToHexString;
/**
* 第三方支付工具类
@@ -550,22 +550,28 @@
* @param order 微信订单号
* @return
*/
- public ResultUtil fenzhang(String order,BigDecimal amount,String merchantNumber,String nonce_str) throws Exception {
+ public ResultUtil fenzhang(String order,BigDecimal amount,String merchantNumber,
+ String nonce_str,String description) 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);
+ String out_order_no = UUIDUtil.getRandomCode(16);
+ map.put("out_order_no", out_order_no);
// 将这个字符串使用json格式拼接起来
Map<String, Object> body = new HashMap<>();
body.put("type", "MERCHANT_ID");
+ int i = amount.multiply(new BigDecimal("100")).intValue();
+ body.put("amount", i);
+ body.put("type", "MERCHANT_ID");
body.put("account", merchantNumber);
- body.put("amount", amount);
- body.put("description", "订单分账");
+ body.put("description", description);
JSONObject jsonObject = new JSONObject(body);
- String jsonString = jsonObject.toString();
- map.put("receiver",jsonString);
- String s = this.weixinSignature(map);
+ JSONArray objects = new JSONArray();
+ objects.add(jsonObject);
+ map.put("receivers",objects.toJSONString());
+ String s = this.weixinSignature1(map);
map.put("sign", s);
String url = "https://api.mch.weixin.qq.com/secapi/pay/profitsharing";
//设置请求头
@@ -585,7 +591,7 @@
Map<String, String> map1 = null;
String body1 = null;
try {
- body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
+ body1 = HttpClientUtil.pushHttpsRequsetXml1(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
} catch (Exception e) {
e.printStackTrace();
}
@@ -604,7 +610,7 @@
if ("SUCCESS".equals(return_code)) {
String result_code = map1.get("result_code");
if ("SUCCESS".equals(result_code)) {
- return ResultUtil.success();
+ return ResultUtil.success(map1.get("order_id"));
} else {
// System.err.println(map1.get("err_code_des"));
return ResultUtil.error(map1.get("err_code_des"));
@@ -630,9 +636,9 @@
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("return_amount", amount.intValue());
+ map.put("description", "用户取消预约场地退款");
+ String s = this.weixinSignature1(map);
map.put("sign", s);
String url = "https://api.mch.weixin.qq.com/secapi/pay/profitsharingreturn";
//设置请求头
@@ -652,7 +658,7 @@
Map<String, String> map1 = null;
String body1 = null;
try {
- body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
+ body1 = HttpClientUtil.pushHttpsRequsetXml1(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
} catch (Exception e) {
e.printStackTrace();
}
@@ -887,7 +893,7 @@
Map<String, String> map1 = null;
String body1 = null;
try {
- body1 = HttpClientUtil.pushHttpsRequsetXml(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
+ body1 = HttpClientUtil.pushHttpsRequsetXml1(url, xmlString.toString(), new HashMap<>(), mchId, certPath, "PKCS12");
} catch (Exception e) {
e.printStackTrace();
}
@@ -1295,7 +1301,54 @@
return map;
}
-
+ private String weixinSignature1(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;
+ }
/**
* 获取请求内容
*
--
Gitblit v1.7.1