diff --git a/gan-modules/ruoyi-gan/pom.xml b/gan-modules/ruoyi-gan/pom.xml index 4bb078e..0ce8fa0 100644 --- a/gan-modules/ruoyi-gan/pom.xml +++ b/gan-modules/ruoyi-gan/pom.xml @@ -111,7 +111,22 @@ org.projectlombok lombok - + + com.github.wechatpay-apiv3 + wechatpay-java + 0.2.12 + + + com.squareup.okhttp3 + okhttp + 4.9.3 + + + + dom4j + dom4j + 1.6.1 + diff --git a/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/controller/PayController.java b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/controller/PayController.java new file mode 100644 index 0000000..9ab3848 --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/controller/PayController.java @@ -0,0 +1,125 @@ +package com.ruoyi.app.controller; + +import com.ruoyi.app.domain.AppDynamicComment; +import com.ruoyi.app.domain.AppOrder; +import com.ruoyi.app.domain.AppOrderArg; +import com.ruoyi.app.domain.dto.KeyUtil; +import com.ruoyi.app.domain.dto.PayConfig; +import com.ruoyi.app.domain.dto.PayUtils; +import com.ruoyi.app.domain.dto.WeChatPrepayResult; +import com.ruoyi.app.domain.vo.AppDynamicCommentVo; +import com.ruoyi.app.mapper.AppOrderMapper; +import com.ruoyi.app.service.IAppDynamicCommentService; +import com.ruoyi.app.service.IPayService; +import com.ruoyi.common.core.utils.poi.ExcelUtil; +import com.ruoyi.common.core.web.controller.BaseController; +import com.ruoyi.common.core.web.domain.AjaxResult; +import com.ruoyi.common.core.web.page.TableDataInfo; +import com.ruoyi.common.log.annotation.Log; +import com.ruoyi.common.log.enums.BusinessType; +import com.ruoyi.common.security.annotation.RequiresPermissions; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.Date; +import java.util.List; +import java.util.SortedMap; +import java.util.TreeMap; + +/** + * 动态评论Controller + * + * @author wyh + * @date 2024-04-24 + */ +@RestController +@RequestMapping("/pay") +@Api(tags = "支付" , description = "支付") +@Slf4j +public class PayController extends BaseController +{ + @Autowired + private IPayService payService; + + @Autowired + private AppOrderMapper appOrderMapper; + + /** + * 查询动态评论列表 + */ + @PostMapping("/wechatPrePay") + @ApiOperation(value = "微信支付", notes = "微信支付", httpMethod = "POST") + public AjaxResult wechatPrePay(AppOrderArg appOrderArg) { + Integer price = appOrderArg.getPrice(); + + PayConfig payConfig = getPayConfigByAppid(); + String orderNo = KeyUtil.generateUniqueKey(); + + WeChatPrepayResult prePayResult = new WeChatPrepayResult(); + String nonce_str = PayUtils.getRandomString(20); + long timeStamp = System.currentTimeMillis()/1000; + String prePayId = ""; + + System.out.println("orderNo:" + orderNo); + + try { + prePayId = payService.getPrepayId(orderNo, price, nonce_str, timeStamp,payConfig); + log.info("=========prepayid===>>"+prePayId); + } catch (Exception e) { + log.info("==========prepayRequest===>>>error"); + } + + if(prePayId == null|| "".equals(prePayId)){ + prePayResult.setCode("001"); + return AjaxResult.error("支付失败"); + } + SortedMap ps = new TreeMap(); + ps.put("appId", payConfig.getAPPID());//app_id + ps.put("timeStamp",timeStamp);//北京时间时间戳 + ps.put("nonceStr", nonce_str);//自定义不重复的长度不长于32位 + ps.put("package", "prepay_id="+prePayId); + ps.put("signType", "MD5"); + String paySign = PayUtils.createSign(payConfig.getAPP_KEY(), ps); + if (paySign==null || "".equals(paySign)) { + prePayResult.setCode("002"); + return AjaxResult.error("支付失败"); + } + + AppOrder order = new AppOrder(); + order.setOutTradeNo(orderNo); + order.setPrice(price); + order.setAppId(payConfig.getAPPID()); + order.setUserId(appOrderArg.getUserId()); + order.setPayStatus(1); + order.setPaySoure(appOrderArg.getPaySoure()); + order.setMchId(payConfig.MCH_ID); + order.setCreateTime(new Date()); + order.setLevel(appOrderArg.getLevel()); + appOrderMapper.insertAppOrder(order); + + prePayResult.setCode("000"); + prePayResult.setNonceStr(nonce_str); + prePayResult.setTimeStamp(String.valueOf(timeStamp)); + prePayResult.setPackageStr("prepay_id="+ prePayId); + prePayResult.setSignType("MD5"); + prePayResult.setPaySign(paySign); + prePayResult.setOrderNo(order.getOutTradeNo()); + log.info("=====>>>返回给小程序的数据:"+prePayResult.toString()); + return AjaxResult.success(prePayResult); + } + + public PayConfig getPayConfigByAppid() { + PayConfig payConfig = new PayConfig(); + payConfig.setAPPID(payConfig.getAPPID()); + payConfig.setMCH_ID(payConfig.getMCH_ID()); + payConfig.setWechat_notify_url(payConfig.getWechat_notify_url()); + payConfig.setBody(payConfig.body); + payConfig.setAPP_KEY(payConfig.getAPP_KEY()); + payConfig.setPayUrl(payConfig.payUrl); + return payConfig; + } +} diff --git a/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/AppOrder.java b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/AppOrder.java new file mode 100644 index 0000000..ee7278b --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/AppOrder.java @@ -0,0 +1,172 @@ +package com.ruoyi.app.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.core.annotation.Excel; +import com.ruoyi.common.core.web.domain.BaseEntity; + +/** + * 订单对象 app_order + * + * @author wyh + * @date 2024-04-25 + */ +@Data +public class AppOrder extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** */ + private Long id; + + /** 订单号 */ + @Excel(name = "订单号") + private String outTradeNo; + + /** 小程序id */ + @Excel(name = "小程序id") + private String appId; + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private Long userId; + + /** 支付状态: 1待付款 2:已付款 */ + @Excel(name = "支付状态: 1待付款 2:已付款") + private int payStatus; + + /** 支付类型: 1微信2支付宝3兑换码 */ + @Excel(name = "支付类型: 1微信2支付宝3兑换码") + private int paySoure; + + /** 微信订单号 */ + @Excel(name = "微信订单号") + private String tradeNo; + + /** 支付金额 */ + @Excel(name = "支付金额") + private int price; + + /** 商户id */ + @Excel(name = "商户id") + private String mchId; + + @Excel(name = "会员等级,1-7天,2-一个月,3-一年") + private int level; + + /** 支付时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "支付时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date payTime; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + public void setOutTradeNo(String outTradeNo) + { + this.outTradeNo = outTradeNo; + } + + public String getOutTradeNo() + { + return outTradeNo; + } + public void setAppId(String appId) + { + this.appId = appId; + } + + public String getAppId() + { + return appId; + } + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getUserId() + { + return userId; + } + public void setPayStatus(int payStatus) + { + this.payStatus = payStatus; + } + + public int getPayStatus() + { + return payStatus; + } + public void setPaySoure(int paySoure) + { + this.paySoure = paySoure; + } + + public int getPaySoure() + { + return paySoure; + } + public void setTradeNo(String tradeNo) + { + this.tradeNo = tradeNo; + } + + public String getTradeNo() + { + return tradeNo; + } + public void setPrice(int price) + { + this.price = price; + } + + public int getPrice() + { + return price; + } + public void setMchId(String mchId) + { + this.mchId = mchId; + } + + public String getMchId() + { + return mchId; + } + public void setPayTime(Date payTime) + { + this.payTime = payTime; + } + + public Date getPayTime() + { + return payTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("outTradeNo", getOutTradeNo()) + .append("appId", getAppId()) + .append("userId", getUserId()) + .append("payStatus", getPayStatus()) + .append("paySoure", getPaySoure()) + .append("tradeNo", getTradeNo()) + .append("price", getPrice()) + .append("mchId", getMchId()) + .append("payTime", getPayTime()) + .append("createTime", getCreateTime()) + .toString(); + } +} diff --git a/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/AppOrderArg.java b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/AppOrderArg.java new file mode 100644 index 0000000..74eeab2 --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/AppOrderArg.java @@ -0,0 +1,37 @@ +package com.ruoyi.app.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.annotation.Excel; +import com.ruoyi.common.core.web.domain.BaseEntity; +import lombok.Data; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.util.Date; + +/** + * 订单对象 app_order + * + * @author wyh + * @date 2024-04-25 + */ +@Data +public class AppOrderArg extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private Long userId; + + /** 支付类型: 1微信2支付宝3兑换码 */ + @Excel(name = "支付类型: 1微信2支付宝3兑换码") + private int paySoure; + + /** 支付金额 */ + @Excel(name = "支付金额") + private int price; + + @Excel(name = "会员等级,1-7天,2-一个月,3-一年") + private int level; +} diff --git a/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/AppOrderPay.java b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/AppOrderPay.java new file mode 100644 index 0000000..d1602ad --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/AppOrderPay.java @@ -0,0 +1,135 @@ +package com.ruoyi.app.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.core.annotation.Excel; +import com.ruoyi.common.core.web.domain.BaseEntity; + +/** + * 订单记录对象 app_order_pay + * + * @author wyh + * @date 2024-04-25 + */ +public class AppOrderPay extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** */ + private Long id; + + /** 小程序id */ + @Excel(name = "小程序id") + private String appid; + + /** 订单号 */ + @Excel(name = "订单号") + private String outtradeno; + + /** 结果码 */ + @Excel(name = "结果码") + private String resultcode; + + /** 字符串 */ + @Excel(name = "字符串") + private String noncestr; + + /** 支付金额 */ + @Excel(name = "支付金额") + private String totalfee; + + /** 微信订单号 */ + @Excel(name = "微信订单号") + private String transactionid; + + /** 时间 */ + @Excel(name = "时间") + private String timeend; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + public void setAppid(String appid) + { + this.appid = appid; + } + + public String getAppid() + { + return appid; + } + public void setOuttradeno(String outtradeno) + { + this.outtradeno = outtradeno; + } + + public String getOuttradeno() + { + return outtradeno; + } + public void setResultcode(String resultcode) + { + this.resultcode = resultcode; + } + + public String getResultcode() + { + return resultcode; + } + public void setNoncestr(String noncestr) + { + this.noncestr = noncestr; + } + + public String getNoncestr() + { + return noncestr; + } + public void setTotalfee(String totalfee) + { + this.totalfee = totalfee; + } + + public String getTotalfee() + { + return totalfee; + } + public void setTransactionid(String transactionid) + { + this.transactionid = transactionid; + } + + public String getTransactionid() + { + return transactionid; + } + public void setTimeend(String timeend) + { + this.timeend = timeend; + } + + public String getTimeend() + { + return timeend; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("appid", getAppid()) + .append("outtradeno", getOuttradeno()) + .append("resultcode", getResultcode()) + .append("noncestr", getNoncestr()) + .append("totalfee", getTotalfee()) + .append("transactionid", getTransactionid()) + .append("timeend", getTimeend()) + .toString(); + } +} diff --git a/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/AppUser.java b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/AppUser.java index 560be43..3e34aca 100644 --- a/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/AppUser.java +++ b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/AppUser.java @@ -149,6 +149,8 @@ public class AppUser extends BaseEntity @Excel(name = "其他信息") private String other; + private int isMember; + public void setId(Long id) { this.id = id; diff --git a/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/AppUserExtends.java b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/AppUserExtends.java new file mode 100644 index 0000000..4323400 --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/AppUserExtends.java @@ -0,0 +1,116 @@ +package com.ruoyi.app.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.core.annotation.Excel; +import com.ruoyi.common.core.web.domain.BaseEntity; + +/** + * App用户动态图片信息对象 app_user_extends + * + * @author wyh + * @date 2024-04-25 + */ +public class AppUserExtends extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 关联用户id */ + @Excel(name = "关联用户id") + private Long userId; + + /** 会员等级,1-7天,2-一个月,3-一年 */ + @Excel(name = "会员等级,1-7天,2-一个月,3-一年") + private Long level; + + /** 开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date startTime; + + /** 结束时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date endTime; + + /** 注册码 */ + @Excel(name = "注册码") + private String code; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getUserId() + { + return userId; + } + public void setLevel(Long level) + { + this.level = level; + } + + public Long getLevel() + { + return level; + } + public void setStartTime(Date startTime) + { + this.startTime = startTime; + } + + public Date getStartTime() + { + return startTime; + } + public void setEndTime(Date endTime) + { + this.endTime = endTime; + } + + public Date getEndTime() + { + return endTime; + } + public void setCode(String code) + { + this.code = code; + } + + public String getCode() + { + return code; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("userId", getUserId()) + .append("level", getLevel()) + .append("remark", getRemark()) + .append("createTime", getCreateTime()) + .append("updateTime", getUpdateTime()) + .append("createBy", getCreateBy()) + .append("updateBy", getUpdateBy()) + .append("startTime", getStartTime()) + .append("endTime", getEndTime()) + .append("code", getCode()) + .toString(); + } +} diff --git a/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/dto/HelperUtil.java b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/dto/HelperUtil.java new file mode 100644 index 0000000..d82ab88 --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/dto/HelperUtil.java @@ -0,0 +1,69 @@ +package com.ruoyi.app.domain.dto; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; + +@Component +@Slf4j +public class HelperUtil { + + enum RequestMethod { + POST, GET, PUT + } + + //采用post的方式 + public static String post(String url, String body) { + String content = getServerResponse(url, body, RequestMethod.POST); + return content; + } + + // 取得服务端返回数据 + private static String getServerResponse(String url, String body, RequestMethod method) { + StringBuilder sb = new StringBuilder(); + OutputStream out = null; + BufferedReader in = null; + try { + URL address = new URL(url); + HttpURLConnection conn = (HttpURLConnection) address.openConnection(); + conn.setDoInput(true); + conn.setDoOutput(true); + conn.setUseCaches(false); + byte[] requestStringBytes = body.getBytes("UTF-8"); + conn.setRequestProperty("Content-length", "" + requestStringBytes.length); + conn.setRequestProperty("Connection", "Keep-Alive");// 维持长连接 + conn.setRequestProperty("Charset", "UTF-8"); + if (method == RequestMethod.POST) { + conn.setRequestMethod("POST"); + } else if (method == RequestMethod.PUT) { + conn.setRequestMethod("PUT"); + } + byte[] bytes = body.getBytes("UTF-8"); + if (bytes.length > 0) { + out = conn.getOutputStream(); + out.write(bytes); + out.flush(); + } + if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); + String line = ""; + while ((line = in.readLine()) != null) { + sb.append(line); + } + } + if (out != null) + out.close(); + if (in != null) + in.close(); + } catch (Exception ex) { + log.info("错误:" + ex); + } + return sb.toString(); + } + +} \ No newline at end of file diff --git a/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/dto/KeyUtil.java b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/dto/KeyUtil.java new file mode 100644 index 0000000..990d3e8 --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/dto/KeyUtil.java @@ -0,0 +1,22 @@ +package com.ruoyi.app.domain.dto; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Random; + +public class KeyUtil { + + public static synchronized String generateUniqueKey(){ + Random random = new Random(); + // 随机数的量 自由定制,这是9位随机数 + Integer r = random.nextInt(900000000) + 100000000; + + // 返回 17位时间 + DateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + String timeStr = sdf.format(new Date()); + + return timeStr + r; + } + +} diff --git a/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/dto/PayConfig.java b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/dto/PayConfig.java new file mode 100644 index 0000000..663f7df --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/dto/PayConfig.java @@ -0,0 +1,29 @@ +package com.ruoyi.app.domain.dto; + +import lombok.Data; +import lombok.ToString; + +/** + * @author heisenbergluck@outlook.com + * @date 2021/6/7 0007 16:27 + */ + +@Data +@ToString +public class PayConfig { + + //商户APPID + public String APPID = "wx55ff808ba0e28b1d"; + //商户账户 + public String MCH_ID = "1646646755"; + //异步回调地址 + public String wechat_notify_url = "127.0.0.1"; + //商品描述 + public String body = "二手车"; + + public String APP_KEY = "Zzvi53pvCLUdFtvQ3EB0QLHQeKTctZ1c"; + + public String payUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";//下单 + public static String PAY_API_UNIFIEDORDER = "https://api.mch.weixin.qq.com/pay/unifiedorder";//下单 + +} diff --git a/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/dto/PayUtils.java b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/dto/PayUtils.java new file mode 100644 index 0000000..90e2c61 --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/dto/PayUtils.java @@ -0,0 +1,135 @@ +package com.ruoyi.app.domain.dto; +import lombok.extern.slf4j.Slf4j; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; + + +import java.security.MessageDigest; +import java.util.*; + +@Slf4j +public class PayUtils { + + //随机字符串生成 + public static String getRandomString(int length) { + String base = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + Random random = new Random(); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < length; i++) { + int number = random.nextInt(base.length()); + sb.append(base.charAt(number)); + } + return sb.toString(); + } + + //请求xml组装 + public static String getRequestXml(SortedMap parameters){ + StringBuffer sb = new StringBuffer(); +// sb.append(""); + sb.append(""); + Set es = parameters.entrySet(); + Iterator it = es.iterator(); + while(it.hasNext()) { + Map.Entry entry = (Map.Entry)it.next(); + String key = (String)entry.getKey(); + String value = String.valueOf(entry.getValue()); + if ("attach".equalsIgnoreCase(key)||"body".equalsIgnoreCase(key)||"sign".equalsIgnoreCase(key)) { + sb.append("<"+key+">"+""); + }else { + sb.append("<"+key+">"+value+""); + } + } + sb.append(""); + return sb.toString(); + } + + + /** + * 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。 + */ + public static String createSign(String APP_KEY,SortedMap parameters){ + log.info("APP_KEY="+APP_KEY); + StringBuffer sb = new StringBuffer(); + Set es = parameters.entrySet(); + Iterator it = es.iterator(); + while(it.hasNext()) { + Map.Entry entry = (Map.Entry)it.next(); + String k = (String)entry.getKey(); + Object v = entry.getValue(); + if(null != v && !"".equals(v) + && !"sign".equals(k) && !"key".equals(k)) { + sb.append(k + "=" + v + "&"); + } + } + sb.append("key=" + APP_KEY); + String sign = md5Encode(sb.toString(), "UTF-8").toUpperCase(); + return sign; + } + + + public static WeChatPayResult getResultByXml(String response) { + WeChatPayResult wexinResult = new WeChatPayResult(); + Document document; + try { + document = DocumentHelper.parseText(response); + Element root = document.getRootElement(); + String cashFee = root.element("cash_fee").getText(); + String totalFee = root.element("total_fee").getText(); + wexinResult.setAppid(root.element("appid").getText()); + wexinResult.setBankType(root.element("bank_type").getText()); + wexinResult.setCashFee(cashFee); + wexinResult.setMchId(root.element("mch_id").getText()); + wexinResult.setNonceStr(root.element("nonce_str").getText()); + wexinResult.setOpenid(root.element("openid").getText()); + wexinResult.setOutTradeNo(root.element("out_trade_no").getText()); + wexinResult.setResultCode(root.element("result_code").getText()); + wexinResult.setReturnCode(root.element("return_code").getText()); + wexinResult.setSign(root.element("sign").getText()); + wexinResult.setTimeEnd(root.element("time_end").getText()); + wexinResult.setTotalFee(totalFee); + wexinResult.setTradeType(root.element("trade_type").getText()); + wexinResult.setTransactionId(root.element("transaction_id").getText()); + return wexinResult; + } catch (Exception ex) { + log.info("解析失败"); + } + return null; + } + + public static String md5Encode(String origin, String charsetname) { + String resultString = null; + try { + resultString = new String(origin); + MessageDigest md = MessageDigest.getInstance("MD5"); + if (charsetname == null || "".equals(charsetname)) + resultString = byteArrayToHexString(md.digest(resultString + .getBytes())); + else + resultString = byteArrayToHexString(md.digest(resultString + .getBytes(charsetname))); + } catch (Exception exception) { + } + return resultString; + } + + private static String byteArrayToHexString(byte b[]) { + StringBuffer resultSb = new StringBuffer(); + for (int i = 0; i < b.length; i++) + resultSb.append(byteToHexString(b[i])); + + return resultSb.toString(); + } + + private static String byteToHexString(byte b) { + int n = b; + if (n < 0) + n += 256; + int d1 = n / 16; + int d2 = n % 16; + return hexDigits[d1] + hexDigits[d2]; + } + + private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; +} diff --git a/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/dto/WeChatPayResult.java b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/dto/WeChatPayResult.java new file mode 100644 index 0000000..a66df1d --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/dto/WeChatPayResult.java @@ -0,0 +1,39 @@ +package com.ruoyi.app.domain.dto; + +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +public class WeChatPayResult { + + //应用id + private String appid; + //付款银行 + private String bankType; + //现金支付金额 + private String cashFee; + //商户号 + private String mchId; + //随机字符串 + private String nonceStr; + //用户标识 + private String openid; + //商户订单号 + private String outTradeNo; + //业务结果 + private String resultCode; + //同步状态码 + private String returnCode; + //签名 + private String sign; + //支付完成时间 + private String timeEnd; + //总金额 + private String totalFee; + //交易类型 + private String tradeType; + //微信支付订单号 + private String transactionId; + +} diff --git a/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/dto/WeChatPrepayResult.java b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/dto/WeChatPrepayResult.java new file mode 100644 index 0000000..33d0ef8 --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/domain/dto/WeChatPrepayResult.java @@ -0,0 +1,22 @@ +package com.ruoyi.app.domain.dto; + +import lombok.Data; + + +@Data +public class WeChatPrepayResult { + + public String code;// 返回给app状态码 000 请求成功 001 prePayId没有取到 002 签名为空 + + public String packageStr;//统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=* + + public String nonceStr;// 随机字符串 + + public String timeStamp;//时间戳从1970年1月1日00:00:00至今的秒数,即当前的时间 + + public String signType;//签名类型,默认为MD5,支持HMAC-SHA256和MD5。注意此处需与统一下单的签名类型一致 + + public String paySign;//签名 + + public String orderNo; +} diff --git a/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/mapper/AppOrderMapper.java b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/mapper/AppOrderMapper.java new file mode 100644 index 0000000..378a217 --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/mapper/AppOrderMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.app.mapper; + +import java.util.List; +import com.ruoyi.app.domain.AppOrder; + +/** + * 订单Mapper接口 + * + * @author wyh + * @date 2024-04-25 + */ +public interface AppOrderMapper +{ + /** + * 查询订单 + * + * @param id 订单主键 + * @return 订单 + */ + public AppOrder selectAppOrderById(Long id); + + /** + * 查询订单列表 + * + * @param appOrder 订单 + * @return 订单集合 + */ + public List selectAppOrderList(AppOrder appOrder); + + /** + * 新增订单 + * + * @param appOrder 订单 + * @return 结果 + */ + public int insertAppOrder(AppOrder appOrder); + + /** + * 修改订单 + * + * @param appOrder 订单 + * @return 结果 + */ + public int updateAppOrder(AppOrder appOrder); + + /** + * 删除订单 + * + * @param id 订单主键 + * @return 结果 + */ + public int deleteAppOrderById(Long id); + + /** + * 批量删除订单 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteAppOrderByIds(Long[] ids); +} diff --git a/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/mapper/AppOrderPayMapper.java b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/mapper/AppOrderPayMapper.java new file mode 100644 index 0000000..f869961 --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/mapper/AppOrderPayMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.app.mapper; + +import java.util.List; +import com.ruoyi.app.domain.AppOrderPay; + +/** + * 订单记录Mapper接口 + * + * @author wyh + * @date 2024-04-25 + */ +public interface AppOrderPayMapper +{ + /** + * 查询订单记录 + * + * @param id 订单记录主键 + * @return 订单记录 + */ + public AppOrderPay selectAppOrderPayById(Long id); + + /** + * 查询订单记录列表 + * + * @param appOrderPay 订单记录 + * @return 订单记录集合 + */ + public List selectAppOrderPayList(AppOrderPay appOrderPay); + + /** + * 新增订单记录 + * + * @param appOrderPay 订单记录 + * @return 结果 + */ + public int insertAppOrderPay(AppOrderPay appOrderPay); + + /** + * 修改订单记录 + * + * @param appOrderPay 订单记录 + * @return 结果 + */ + public int updateAppOrderPay(AppOrderPay appOrderPay); + + /** + * 删除订单记录 + * + * @param id 订单记录主键 + * @return 结果 + */ + public int deleteAppOrderPayById(Long id); + + /** + * 批量删除订单记录 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteAppOrderPayByIds(Long[] ids); +} diff --git a/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/mapper/AppUserExtendsMapper.java b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/mapper/AppUserExtendsMapper.java new file mode 100644 index 0000000..e26949d --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/mapper/AppUserExtendsMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.app.mapper; + +import java.util.List; +import com.ruoyi.app.domain.AppUserExtends; + +/** + * App用户动态图片信息Mapper接口 + * + * @author wyh + * @date 2024-04-25 + */ +public interface AppUserExtendsMapper +{ + /** + * 查询App用户动态图片信息 + * + * @param id App用户动态图片信息主键 + * @return App用户动态图片信息 + */ + public AppUserExtends selectAppUserExtendsById(Long id); + + /** + * 查询App用户动态图片信息列表 + * + * @param appUserExtends App用户动态图片信息 + * @return App用户动态图片信息集合 + */ + public List selectAppUserExtendsList(AppUserExtends appUserExtends); + + /** + * 新增App用户动态图片信息 + * + * @param appUserExtends App用户动态图片信息 + * @return 结果 + */ + public int insertAppUserExtends(AppUserExtends appUserExtends); + + /** + * 修改App用户动态图片信息 + * + * @param appUserExtends App用户动态图片信息 + * @return 结果 + */ + public int updateAppUserExtends(AppUserExtends appUserExtends); + + /** + * 删除App用户动态图片信息 + * + * @param id App用户动态图片信息主键 + * @return 结果 + */ + public int deleteAppUserExtendsById(Long id); + + /** + * 批量删除App用户动态图片信息 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteAppUserExtendsByIds(Long[] ids); +} diff --git a/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/mapper/AppUserExtendsMapper.xml b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/mapper/AppUserExtendsMapper.xml new file mode 100644 index 0000000..3f83452 --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/mapper/AppUserExtendsMapper.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + select id, user_id, level, remark, create_time, update_time, create_by, updateBy, start_time, end_time, code from app_user_ extends + + + + + + + + insert into app_user_ extends + + user_id, + level, + remark, + create_time, + update_time, + create_by, + updateBy, + start_time, + end_time, + code, + + + #{userId}, + #{level}, + #{remark}, + #{createTime}, + #{updateTime}, + #{createBy}, + #{updateBy}, + #{startTime}, + #{endTime}, + #{code}, + + + + + update app_user_ extends + + user_id = #{userId}, + level = #{level}, + remark = #{remark}, + create_time = #{createTime}, + update_time = #{updateTime}, + create_by = #{createBy}, + updateBy = #{updateBy}, + start_time = #{startTime}, + end_time = #{endTime}, + code = #{code}, + + where id = #{id} + + + + delete from app_user_ extends where id = #{id} + + + + delete from app_user_ extends where id in + + #{id} + + + \ No newline at end of file diff --git a/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/service/IPayService.java b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/service/IPayService.java new file mode 100644 index 0000000..65ff53f --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/service/IPayService.java @@ -0,0 +1,28 @@ +package com.ruoyi.app.service; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.app.domain.dto.PayConfig; + +public interface IPayService { + JSONObject code2session(String code); + + /** + * 获取微信预支付的prepayid + * + * @param orderId + * @param orderMoney + * @param nonce_str + * @param timeStamp + * @return + */ + String getPrepayId(String orderId, int orderMoney, String nonce_str, long timeStamp, PayConfig weChatConfig); + /** + * 查询微信支付 + * @param oid + * @param nonce_str + * @return + */ + boolean isPayOrder(String oid, String nonce_str, PayConfig weChatConfig); + + String getAccessToken(); +} diff --git a/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/service/impl/PayServiceImpl.java b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/service/impl/PayServiceImpl.java new file mode 100644 index 0000000..55127ca --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/java/com/ruoyi/app/service/impl/PayServiceImpl.java @@ -0,0 +1,76 @@ +package com.ruoyi.app.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.app.domain.dto.HelperUtil; +import com.ruoyi.app.domain.dto.PayConfig; +import com.ruoyi.app.domain.dto.PayUtils; +import com.ruoyi.app.service.IPayService; +import lombok.extern.slf4j.Slf4j; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; +import org.springframework.stereotype.Service; + +import java.util.SortedMap; +import java.util.TreeMap; + +@Slf4j +@Service +public class PayServiceImpl implements IPayService { + @Override + public JSONObject code2session(String code) { + return null; + } + + @Override + public String getPrepayId(String orderId, int orderMoney, String nonce_str, long timeStamp, PayConfig weChatConfig) { + //long fee = (long) (orderMoney * 100); // 转换为分 + long fee = (long) (orderMoney); + SortedMap parameterMap = new TreeMap(); + parameterMap.put("appid", weChatConfig.getAPPID()); + parameterMap.put("mch_id", weChatConfig.getMCH_ID()); + parameterMap.put("nonce_str", nonce_str); + parameterMap.put("body", weChatConfig.getBody()); + parameterMap.put("out_trade_no", orderId); + parameterMap.put("total_fee", fee); + parameterMap.put("spbill_create_ip","127.0.0.1"); + parameterMap.put("notify_url", weChatConfig.getWechat_notify_url()); + parameterMap.put("trade_type", "APP"); + //parameterMap.put("openid", openId); + String sign = PayUtils.createSign(weChatConfig.getAPP_KEY(), parameterMap); + log.info("sign:" + sign); + parameterMap.put("sign", sign); + String body = PayUtils.getRequestXml(parameterMap); + String response = ""; + try { + response = HelperUtil.post(weChatConfig.payUrl, body); + } catch (Exception e) { + log.info(e.getMessage()); + } + log.info("微信支付下单请求的数据" + body); + log.info("微信支付下单返回的数据" + response); + Document document; + try { + document = DocumentHelper.parseText(response); + Element root = document.getRootElement(); + Element prepay = root.element("prepay_id"); + if (prepay != null) { + String prepayId = prepay.getTextTrim(); + return prepayId; + } + } catch (Exception ex) { + + } + return ""; + } + + @Override + public boolean isPayOrder(String oid, String nonce_str, PayConfig weChatConfig) { + return false; + } + + @Override + public String getAccessToken() { + return null; + } +} diff --git a/gan-modules/ruoyi-gan/src/main/resources/mapper/app/AppOrderMapper.xml b/gan-modules/ruoyi-gan/src/main/resources/mapper/app/AppOrderMapper.xml new file mode 100644 index 0000000..3b0bfe6 --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/resources/mapper/app/AppOrderMapper.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + select id, out_trade_no, app_id, user_id, pay_status, pay_soure, trade_no, price, mch_id, pay_time, create_time,level from app_order + + + + + + + + insert into app_order + + out_trade_no, + app_id, + user_id, + pay_status, + pay_soure, + trade_no, + price, + mch_id, + pay_time, + create_time, + level, + + + #{outTradeNo}, + #{appId}, + #{userId}, + #{payStatus}, + #{paySoure}, + #{tradeNo}, + #{price}, + #{mchId}, + #{payTime}, + #{createTime}, + #{level}, + + + + + update app_order + + out_trade_no = #{outTradeNo}, + app_id = #{appId}, + user_id = #{userId}, + pay_status = #{payStatus}, + pay_soure = #{paySoure}, + trade_no = #{tradeNo}, + price = #{price}, + mch_id = #{mchId}, + pay_time = #{payTime}, + create_time = #{createTime}, + + where id = #{id} + + + + delete from app_order where id = #{id} + + + + delete from app_order where id in + + #{id} + + + \ No newline at end of file diff --git a/gan-modules/ruoyi-gan/src/main/resources/mapper/app/AppOrderPayMapper.xml b/gan-modules/ruoyi-gan/src/main/resources/mapper/app/AppOrderPayMapper.xml new file mode 100644 index 0000000..02222f7 --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/resources/mapper/app/AppOrderPayMapper.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + select id, appid, outtradeno, resultcode, noncestr, totalfee, transactionid, timeend from app_order_pay + + + + + + + + insert into app_order_pay + + appid, + outtradeno, + resultcode, + noncestr, + totalfee, + transactionid, + timeend, + + + #{appid}, + #{outtradeno}, + #{resultcode}, + #{noncestr}, + #{totalfee}, + #{transactionid}, + #{timeend}, + + + + + update app_order_pay + + appid = #{appid}, + outtradeno = #{outtradeno}, + resultcode = #{resultcode}, + noncestr = #{noncestr}, + totalfee = #{totalfee}, + transactionid = #{transactionid}, + timeend = #{timeend}, + + where id = #{id} + + + + delete from app_order_pay where id = #{id} + + + + delete from app_order_pay where id in + + #{id} + + + \ No newline at end of file diff --git a/gan-modules/ruoyi-gan/src/main/resources/mapper/app/AppUserDynamicMapper.xml b/gan-modules/ruoyi-gan/src/main/resources/mapper/app/AppUserDynamicMapper.xml index 7cc540b..a19bf28 100644 --- a/gan-modules/ruoyi-gan/src/main/resources/mapper/app/AppUserDynamicMapper.xml +++ b/gan-modules/ruoyi-gan/src/main/resources/mapper/app/AppUserDynamicMapper.xml @@ -48,7 +48,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" u.school as "school", u.major as "major", u.start_time as "startTime", - u.end_time as "endTime" + u.end_time as "endTime", + u.is_member as "isMember" from app_user_dynamic a left join app_user u on u.id = a.user_id diff --git a/gan-modules/ruoyi-gan/src/main/resources/mapper/app/AppUserExtendsMapper.xml b/gan-modules/ruoyi-gan/src/main/resources/mapper/app/AppUserExtendsMapper.xml new file mode 100644 index 0000000..2986e14 --- /dev/null +++ b/gan-modules/ruoyi-gan/src/main/resources/mapper/app/AppUserExtendsMapper.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + select id, user_id, level, remark, create_time, update_time, create_by, updateBy, start_time, end_time, code from app_user_extends + + + + + + + + insert into app_user_extends + + user_id, + level, + remark, + create_time, + update_time, + create_by, + updateBy, + start_time, + end_time, + code, + + + #{userId}, + #{level}, + #{remark}, + #{createTime}, + #{updateTime}, + #{createBy}, + #{updateBy}, + #{startTime}, + #{endTime}, + #{code}, + + + + + update app_user_extends + + user_id = #{userId}, + level = #{level}, + remark = #{remark}, + create_time = #{createTime}, + update_time = #{updateTime}, + create_by = #{createBy}, + updateBy = #{updateBy}, + start_time = #{startTime}, + end_time = #{endTime}, + code = #{code}, + + where id = #{id} + + + + delete from app_user_extends where id = #{id} + + + + delete from app_user_extends where id in + + #{id} + + + \ No newline at end of file diff --git a/gan-modules/ruoyi-gan/src/main/resources/mapper/app/AppUserMapper.xml b/gan-modules/ruoyi-gan/src/main/resources/mapper/app/AppUserMapper.xml index 3b8c9c2..2516561 100644 --- a/gan-modules/ruoyi-gan/src/main/resources/mapper/app/AppUserMapper.xml +++ b/gan-modules/ruoyi-gan/src/main/resources/mapper/app/AppUserMapper.xml @@ -38,6 +38,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + a.id as "id", @@ -71,11 +72,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" a.idea as "idea", a.is_partner as "isPartner", a.hobby as "hobby", - a.other as "other" + a.other as "other", + a.is_member as "isMember" - select id, username, password, nickname, email, phone, address, create_time, update_time, avatar_url, education, school, major, start_time, end_time, experience, company_name, industry, job_time, job_name, job_type, skill_id, job_content, type from app_user + select id, username, password, nickname, email, phone, address, create_time, update_time, avatar_url, education, school, major, start_time, end_time, experience, company_name, industry, job_time, job_name, job_type, skill_id, job_content, type,is_member from app_user