lsw 10 bulan lalu
induk
melakukan
63c33a141f

+ 4 - 3
admin-ui/src/views/work/enterprise/index.vue

@@ -26,7 +26,7 @@
     <el-table :data="response.rows" border @selection-change="selects" height="calc(100vh - 270px)">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="公司名称" align="center" prop="name" />
-      <el-table-column label="法定代表人" align="center" prop="legalPerson" />
+      <el-table-column label="法定代表人" align="center" prop="legalPerson" width="110"/>
       <el-table-column label="电话" align="center" prop="phone" />
       <el-table-column label="邮箱" align="center" prop="email" />
       <el-table-column label="注册资本" align="center" prop="capital" width="100" />
@@ -48,7 +48,7 @@
           </el-popover>
         </template>
       </el-table-column>
-      <el-table-column label="营业执照" align="center" prop="p1">
+      <el-table-column label="营业执照" align="center" prop="p1" width="90">
         <template slot-scope="scope">
           <preview v-model="scope.row.p1"></preview>
         </template>
@@ -59,7 +59,7 @@
           <el-tag type="success" v-if="scope.row.recommend == 1">是</el-tag>
         </template>
       </el-table-column>
-      <el-table-column label="是否认证" align="center" width="130">
+      <el-table-column label="是否认证" align="center" width="110">
         <template slot-scope="scope">
           <el-tag type="danger" v-if="scope.row.state == 0">待认证</el-tag>
           <el-tag type="success" v-if="scope.row.state == 1" :title="'充值时间:' + scope.row.updateTime">认证成功</el-tag>
@@ -71,6 +71,7 @@
           </el-popover>
         </template>
       </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
       <el-table-column label="操作" align="center" width="180">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-view" @click="op('detail', scope.row)">详情</el-button>

+ 1 - 1
admin-ui/src/views/work/news/edit.vue

@@ -4,7 +4,7 @@
       <el-row>
         <el-col :span="16">
           <el-form-item label="标题" prop="title">
-            <el-input v-model="form.title" placeholder="请输入标题" clearable maxlength="30" show-word-limit />
+            <el-input v-model="form.title" placeholder="请输入标题" clearable/>
           </el-form-item>
         </el-col>
         <el-col :span="8">

+ 30 - 0
app/pages/other/setting.vue

@@ -1,6 +1,7 @@
 <template>
 	<view class="main pt0">
 		<button class="btn" @click="exit()">退出登陆</button>
+		<button class="btn" @click="pay()">支付测试</button>
 	</view>
 </template>
 
@@ -10,6 +11,35 @@ export default {
 		return {};
 	},
 	methods: {
+		pay() {
+			this.http.request({
+				url: '/app/wxPay/jsApiPay',
+				method: 'POST',
+				success: (res) => {
+					wx.requestPayment({
+						appId: res.data.data.appId,
+						nonceStr: res.data.data.nonceStr,
+						package: res.data.data.package,
+						paySign: res.data.data.paySign,
+						timeStamp: res.data.data.timeStamp,
+						signType: res.data.data.signType,
+						success: (r) => {
+							uni.showModal({
+								title: '提示',
+								content: '下单成功',
+								showCancel: false,
+								success: (res) => {
+									uni.navigateBack({ delta: 2 });
+								}
+							});
+						},
+						fail: (r) => {
+							console.log("asd:"+JSON.stringify(r));
+						}
+					});
+				}
+			});
+		},
 		exit() {
 			uni.showModal({
 				title: '提示',

+ 11 - 0
ruoyi-admin/pom.xml

@@ -91,6 +91,17 @@
             <artifactId>knife4j-spring-boot-starter</artifactId>
             <version>3.0.3</version>
         </dependency>
+        <!--微信支付-->
+        <dependency>
+            <groupId>com.github.javen205</groupId>
+            <artifactId>IJPay-WxPay</artifactId>
+            <version>2.9.10</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.9</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>

+ 0 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/News.java

@@ -10,7 +10,6 @@ import lombok.experimental.Accessors;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
 import java.util.Date;
 /**
  * @author lsw
@@ -25,7 +24,6 @@ public class News{
     private Long id;
 
     @NotBlank(message = "标题不能为空")
-    @Size(max = 30, message = "标题长度不能超过30个字符")
     @ApiModelProperty(value = "标题")
     private String title;
 

+ 7 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/dto/PayDto.java

@@ -0,0 +1,7 @@
+package com.ruoyi.web.work.domain.dto;
+
+import lombok.Data;
+
+@Data
+public class PayDto {
+}

+ 106 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/wxpay/WxPayBean.java

@@ -0,0 +1,106 @@
+package com.ruoyi.web.work.wxpay;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+
+@Component
+@PropertySource("classpath:/wxpay/wxpay.properties")
+@ConfigurationProperties(prefix = "v3")
+public class WxPayBean {
+    private String appId;
+    private String keyPath;
+    private String publicKeyPath;
+    private String certPath;
+    private String certP12Path;
+    private String platformCertPath;
+    private String mchId;
+    private String apiKey;
+    private String apiKey3;
+    private String domain;
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public String getKeyPath() {
+        return keyPath;
+    }
+
+    public void setKeyPath(String keyPath) {
+        this.keyPath = keyPath;
+    }
+
+    public String getPublicKeyPath() {
+        return publicKeyPath;
+    }
+
+    public void setPublicKeyPath(String publicKeyPath) {
+        this.publicKeyPath = publicKeyPath;
+    }
+
+    public String getCertPath() {
+        return certPath;
+    }
+
+    public void setCertPath(String certPath) {
+        this.certPath = certPath;
+    }
+
+    public String getCertP12Path() {
+        return certP12Path;
+    }
+
+    public void setCertP12Path(String certP12Path) {
+        this.certP12Path = certP12Path;
+    }
+
+    public String getPlatformCertPath() {
+        return platformCertPath;
+    }
+
+    public void setPlatformCertPath(String platformCertPath) {
+        this.platformCertPath = platformCertPath;
+    }
+
+    public String getMchId() {
+        return mchId;
+    }
+
+    public void setMchId(String mchId) {
+        this.mchId = mchId;
+    }
+
+    public String getApiKey() {
+        return apiKey;
+    }
+
+    public void setApiKey(String apiKey) {
+        this.apiKey = apiKey;
+    }
+
+    public String getApiKey3() {
+        return apiKey3;
+    }
+
+    public void setApiKey3(String apiKey3) {
+        this.apiKey3 = apiKey3;
+    }
+
+    public String getDomain() {
+        return domain;
+    }
+
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+
+    @Override
+    public String toString() {
+        return "WxPayV3Bean{" + "keyPath='" + keyPath + '\'' + ", certPath='" + certPath + '\'' + ", certP12Path='" + certP12Path + '\'' + ", platformCertPath='" + platformCertPath + '\'' + ", mchId='" + mchId + '\'' + ", apiKey='" + apiKey + '\'' + ", apiKey3='" + apiKey3 + '\'' + ", domain='" + domain + '\'' + '}';
+    }
+}

+ 190 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/wxpay/WxPayController.java

@@ -0,0 +1,190 @@
+package com.ruoyi.web.work.wxpay;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.ContentType;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.ijpay.core.IJPayHttpResponse;
+import com.ijpay.core.enums.AuthTypeEnum;
+import com.ijpay.core.enums.RequestMethodEnum;
+import com.ijpay.core.kit.HttpKit;
+import com.ijpay.core.kit.PayKit;
+import com.ijpay.core.kit.WxPayKit;
+import com.ijpay.core.utils.DateTimeZoneUtil;
+import com.ijpay.wxpay.WxPayApi;
+import com.ijpay.wxpay.enums.WxDomainEnum;
+import com.ijpay.wxpay.enums.v3.BasePayApiEnum;
+import com.ijpay.wxpay.model.v3.Amount;
+import com.ijpay.wxpay.model.v3.Payer;
+import com.ijpay.wxpay.model.v3.UnifiedOrderModel;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.web.work.api.config.BaseController;
+import com.ruoyi.web.work.domain.dto.PayDto;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.beans.Transient;
+import java.nio.charset.StandardCharsets;
+import java.security.cert.X509Certificate;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/app/wxPay")
+public class WxPayController extends BaseController {
+    @Resource
+    WxPayBean wxPayV3Bean;
+
+
+
+    private String serialNo;
+
+    /**
+     * PC扫码支付
+     *
+     * @param dto
+     * @return
+     */
+    @Log(title = "在线捐赠", businessType = BusinessType.PAY)
+    @PostMapping("/pay")
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult pay(@Validated @RequestBody PayDto dto) {
+        try {
+     /*       Project project = projectService.getById(dto.getProjectId());
+            if (project == null) {
+                return AjaxResult.error("捐赠项目不存在");
+            }*/
+            String orderNum = PayKit.generateStr();
+            UnifiedOrderModel unifiedOrderModel = new UnifiedOrderModel();
+            unifiedOrderModel.setAppid(wxPayV3Bean.getAppId());
+            unifiedOrderModel.setMchid(wxPayV3Bean.getMchId());
+            unifiedOrderModel.setDescription("测试支付");
+            unifiedOrderModel.setOut_trade_no(orderNum);
+            unifiedOrderModel.setTime_expire(DateTimeZoneUtil.dateToTimeZone(System.currentTimeMillis() + 1000 * 60 * 3));
+            unifiedOrderModel.setAttach("爱心捐款");
+            unifiedOrderModel.setNotify_url(wxPayV3Bean.getDomain().concat("/app/wxPay/payNotify"));
+            unifiedOrderModel.setAmount(new Amount().setTotal(1));
+            IJPayHttpResponse response = WxPayApi.v3(RequestMethodEnum.POST, WxDomainEnum.CHINA.toString(), BasePayApiEnum.NATIVE_PAY.toString(), wxPayV3Bean.getMchId(), getSerialNumber(), null, wxPayV3Bean.getKeyPath(), JSONUtil.toJsonStr(unifiedOrderModel), AuthTypeEnum.RSA.getCode());
+            boolean verifySignature = WxPayKit.verifySignature(response, wxPayV3Bean.getPlatformCertPath());
+            if (response.getStatus() == 200 && verifySignature) {
+                //保存订单信息
+               /* Donate donate = new Donate();
+                BeanUtils.copyProperties(dto, donate);
+                donate.setState(0);
+                donate.setOrderNum(orderNum);
+                donateService.save(donate);*/
+                return AjaxResult.success("成功", response.getBody());
+            }
+            return AjaxResult.error("系统异常");
+        } catch (Exception e) {
+            throw new ServiceException("系统异常");
+        }
+    }
+    /**
+     * 公众号或者订阅号支付
+     *
+     * @param dto
+     * @return
+     */
+    @PostMapping("/jsApiPay")
+    @Transient
+    public AjaxResult jsApiPay() {
+        try {
+/*            if (StringUtils.isEmpty(dto.getOpenId())) {
+                return AjaxResult.error("openId不能为空");
+            }
+            Project project = projectService.getById(dto.getProjectId());
+            if (project == null) {
+                return AjaxResult.error("捐赠项目不存在");
+            }*/
+            String orderNum = PayKit.generateStr();
+            UnifiedOrderModel unifiedOrderModel = new UnifiedOrderModel();
+            unifiedOrderModel.setAppid(wxPayV3Bean.getAppId());
+            unifiedOrderModel.setMchid(wxPayV3Bean.getMchId());
+            unifiedOrderModel.setDescription("测试支付");
+            unifiedOrderModel.setOut_trade_no(orderNum);
+            unifiedOrderModel.setTime_expire(DateTimeZoneUtil.dateToTimeZone(System.currentTimeMillis() + 1000 * 60 * 3));
+            unifiedOrderModel.setAttach("爱心捐款");
+            unifiedOrderModel.setAmount(new Amount().setTotal(1));
+            unifiedOrderModel.setNotify_url(wxPayV3Bean.getDomain().concat("/app/wxPay/payNotify"));
+            unifiedOrderModel.setPayer(new Payer().setOpenid(getUser().getOpenId()));
+            IJPayHttpResponse response = WxPayApi.v3(RequestMethodEnum.POST, WxDomainEnum.CHINA.toString(), BasePayApiEnum.JS_API_PAY.toString(), wxPayV3Bean.getMchId(), getSerialNumber(), null, wxPayV3Bean.getKeyPath(), JSONUtil.toJsonStr(unifiedOrderModel));
+            System.out.println("统一下单响应:" + response);
+            if (response.getStatus() == 200) {
+                String body = response.getBody();
+                JSONObject jsonObject = JSONObject.parseObject(body);
+                Map<String, String> map = WxPayKit.jsApiCreateSign(wxPayV3Bean.getAppId(), jsonObject.getString("prepay_id"), wxPayV3Bean.getKeyPath());
+                //保存支付订单
+               /* Donate donate = new Donate();
+                BeanUtils.copyProperties(dto, donate);
+                donate.setState(0);
+                donate.setOrderNum(orderNum);
+                donateService.save(donate);*/
+                return AjaxResult.success(map);
+            }
+            return AjaxResult.error("系统异常222");
+        } catch (Exception e) {
+            System.out.println("asd:"+e.getMessage());
+            e.printStackTrace();
+            throw new ServiceException("系统异常");
+        }
+    }
+
+    @Log(title = "在线捐赠通知", businessType = BusinessType.PAY)
+    @PostMapping(value = "/payNotify")
+    public void payNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {
+        Map<String, String> map = new HashMap<>(12);
+        try {
+            String timestamp = request.getHeader("Wechatpay-Timestamp");
+            String nonce = request.getHeader("Wechatpay-Nonce");
+            String serialNo = request.getHeader("Wechatpay-Serial");
+            String signature = request.getHeader("Wechatpay-Signature");
+            String result = HttpKit.readData(request);
+            // 需要通过证书序列号查找对应的证书,verifyNotify 中有验证证书的序列号
+            JSONObject res = JSONObject.parseObject(WxPayKit.verifyNotify(serialNo, result, signature, nonce, timestamp, wxPayV3Bean.getApiKey3(), wxPayV3Bean.getPlatformCertPath()));
+            System.out.println("支付通知明文:" + res.toJSONString());
+            if (res != null && res.getString("trade_state").equals("SUCCESS")) {
+/*               Donate donate = donateService.selectByOrderNum(res.getString("out_trade_no"));
+                if (donate != null) {
+                    donate.setState(1);
+                    donateService.clearCache();
+                    donateService.updateById(donate);
+                    response.setStatus(200);
+                    map.put("code", "SUCCESS");
+                    map.put("message", "SUCCESS");
+                }*/
+            } else {
+                response.setStatus(500);
+                map.put("code", "ERROR");
+                map.put("message", "签名错误");
+            }
+            response.setHeader("Content-type", ContentType.JSON.toString());
+            response.getOutputStream().write(JSONUtil.toJsonStr(map).getBytes(StandardCharsets.UTF_8));
+            response.flushBuffer();
+        } catch (Exception e) {
+            throw new ServiceException("系统异常");
+        }
+    }
+
+    /**
+     * 获取证书序列号
+     *
+     * @return
+     */
+    private String getSerialNumber() {
+        if (StrUtil.isEmpty(serialNo)) {
+            X509Certificate certificate = PayKit.getCertificate(wxPayV3Bean.getCertPath());
+            if (certificate != null) {
+                serialNo = certificate.getSerialNumber().toString(16).toUpperCase();
+            }
+        }
+        return serialNo;
+    }
+}

TEMPAT SAMPAH
ruoyi-admin/src/main/resources/wxpay/apiclient_cert.p12


+ 25 - 0
ruoyi-admin/src/main/resources/wxpay/apiclient_cert.pem

@@ -0,0 +1,25 @@
+-----BEGIN CERTIFICATE-----
+MIIELjCCAxagAwIBAgIUYH/jIVu7QRQ6MYMnOxh4lumJRK0wDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMjQwNjIxMDgwNDMxWhcNMjkwNjIwMDgwNDMxWjCBhzETMBEGA1UEAwwK
+MTY3NzA4MzcwNDEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMTMwMQYDVQQL
+DCrlub/opb/mib/mj73ml7bku6PmlbDmja7mnI3liqHmnInpmZDlhazlj7gxCzAJ
+BgNVBAYTAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBALR/VWHYZh9XlzPXBai3+NHxKacLTrcFi22J6o/P+H860D/W
+4BEkaya0hUwjO4bU3FD6zDGPLk7B6HWuvubPREBSfbnrGZ0sRNvu3D88kxmGTwcT
+k75T7XPva8e5i86CBIurqc2c7jh4Gt52vriQzlXSZb828fWn9iOEBZCOX750M5rM
+SgokbQ+qtNYDFkhwP54s/IQN+fP6vn0jeGnyhro8UdPy8tvdfhc+hvv5I1NxbLP8
+9Wd3MStJqj9h6YoGP/E4qmHGFQytizsPr11CmumFzHPh+Zf3loA+aPfhewfHjYf6
+HTSl5g7qpvTSOGNDUJaWNsdaFwgweCmglGTZHxsCAwEAAaOBuTCBtjAJBgNVHRME
+AjAAMAsGA1UdDwQEAwID+DCBmwYDVR0fBIGTMIGQMIGNoIGKoIGHhoGEaHR0cDov
+L2V2Y2EuaXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUw
+REJDMDRCMDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyJnNnPUhBQ0M0NzFCNjU0MjJF
+MTJCMjdBOUQzM0E4N0FEMUNERjU5MjZFMTQwMzcxMA0GCSqGSIb3DQEBCwUAA4IB
+AQBqy3zGwJrXag0XwxYedTe7JnNZRMqP8EOV2kp6C9673UshladGyumDyHVoFoma
+fVBLunO6+xtz+janzMqUkpizSRDJVivBrp7H1X72uG6AglKygQqHfuAWaJCOroUj
+/IllF4FUU1v81hegH7XcOceW4B41OzxLtOiyas6MXz4NgNeoz5w1NiYu7yn1qI+1
+VX0QK0iCE+74wv1YTBDDIBIyDZI+5Sdz6s63ZPnoIKgeQ9VJ5OuBiluvLzo/SIp4
+6X9iuCGzHakdLMJP8tgrjGPKfq1ES0Ls9nNBWQ3djsWAeWGLKfDzxn4+iZgG2hpq
+JpBeYfT1ldDHf4J92S/gZaH+
+-----END CERTIFICATE-----

+ 28 - 0
ruoyi-admin/src/main/resources/wxpay/apiclient_key.pem

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC0f1Vh2GYfV5cz
+1wWot/jR8SmnC063BYttieqPz/h/OtA/1uARJGsmtIVMIzuG1NxQ+swxjy5Oweh1
+rr7mz0RAUn256xmdLETb7tw/PJMZhk8HE5O+U+1z72vHuYvOggSLq6nNnO44eBre
+dr64kM5V0mW/NvH1p/YjhAWQjl++dDOazEoKJG0PqrTWAxZIcD+eLPyEDfnz+r59
+I3hp8oa6PFHT8vLb3X4XPob7+SNTcWyz/PVndzErSao/YemKBj/xOKphxhUMrYs7
+D69dQprphcxz4fmX95aAPmj34XsHx42H+h00peYO6qb00jhjQ1CWljbHWhcIMHgp
+oJRk2R8bAgMBAAECggEAaPtex+g7jaM+eJJp4jYO7N0d4uC6yczZyb5bxYWq/SVS
+Fq9957qM8BgzJ5Oefc+0zQzyUyj6QCicckZPFqQbCGZyZf6OCVLEQj9trwImdMQf
+lvgWCK97/uCUibgrztLknfAcdVD/ZazFw/rA90ySFmynbU4h8UXd7c5OBkQo//ZP
+X+5O9B3WhXeI2GwS8M52lC32rq2hjCqLhZhm6ZUMVLxFqxbGBJrKjhzwkbkK7oGU
+7K+oHqMG4tnPZ3OZqaG3qJFdHx44M0kmiMReqNa/TRYucA3o1KXB8NdPGPIcQm7I
+uZKfuhInXt1GTcTpH8ayBo3ak3IFSa0ztP2OgBdAEQKBgQDpVjKZOlOKQP3lTUKm
+cfmRDBiyHJVU7X14on0hYchn5A6PeagRJcFweY/1N0zTD1IQ/KyY0Nb39rT9CZfj
+8MxKzdjzKSC0rVyuO6SDpkmKb4vm7CHPlsSu9odrpShXhRh0MLRjhwJ3nqWRAr7o
+vo/NTpLDkNNPZ5OFXCC2DdpdtQKBgQDGB0/4VY2FNF4+tf9zVmur/MQK0Bqvu2P7
+iLcZg3hnD9MhhcTSubekMhvOnFN4VjLPxDtID/Zu3fCac1rFUXoZmqSY0kx8/Fp7
+VZsE8SMowzlkipv8X13QzplYeIauHINsgmFD+47e7KwnpFYhEfHWqJqGeqmysGEB
+dKpUlXgLjwKBgQCCbW1BG0pBGI0TVHlyAnmG62UOgk2yuEGPYfxh4X+dGuxMpKse
+UqVrEng2kJ+/xmuQFT0A+pN+7YdDfc5KWnpHQgMIALBIbjNFLQ+LizLGUA26mblY
+iSUNy73snNgM+9escuESVRA6/xH7GbbO8F3/W/FLobOMShA61kFuohWylQKBgC9R
+l/5TExn9RXferUe2IsxZ/c5Ho9jSAjYcmQPzslWOJnkgKcPgtMz7XEGmgRuEHWgg
+D7pMdipPxiph3hLAQVjU5vfNaJGFC2nlLsGjjS80VwZ7SIKplxVKCMJnKmd4UL8g
++HTyK1WBYDGoxxvn2c3dQ+9WaC5Wjxd19S14+dJpAoGACXL00ULCrC/fYepKAaSy
+oelhabGxXM7VvlYTro9lywP0kCgzgDpA0vJLD1VSgbHifz1Xs0OZnMSWxyLZdiB0
+/xzqDcxEVnWgsl4fXJ7Q+iWs56NW2pdRnC+XJhvOChvhd0oPqFs0HkXJFLbkayu0
+aicuqccH8hIFMBJSwD8k2+U=
+-----END PRIVATE KEY-----

+ 25 - 0
ruoyi-admin/src/main/resources/wxpay/platformCert.pem

@@ -0,0 +1,25 @@
+-----BEGIN CERTIFICATE-----
+MIIELjCCAxagAwIBAgIUYH/jIVu7QRQ6MYMnOxh4lumJRK0wDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMjQwNjIxMDgwNDMxWhcNMjkwNjIwMDgwNDMxWjCBhzETMBEGA1UEAwwK
+MTY3NzA4MzcwNDEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMTMwMQYDVQQL
+DCrlub/opb/mib/mj73ml7bku6PmlbDmja7mnI3liqHmnInpmZDlhazlj7gxCzAJ
+BgNVBAYTAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBALR/VWHYZh9XlzPXBai3+NHxKacLTrcFi22J6o/P+H860D/W
+4BEkaya0hUwjO4bU3FD6zDGPLk7B6HWuvubPREBSfbnrGZ0sRNvu3D88kxmGTwcT
+k75T7XPva8e5i86CBIurqc2c7jh4Gt52vriQzlXSZb828fWn9iOEBZCOX750M5rM
+SgokbQ+qtNYDFkhwP54s/IQN+fP6vn0jeGnyhro8UdPy8tvdfhc+hvv5I1NxbLP8
+9Wd3MStJqj9h6YoGP/E4qmHGFQytizsPr11CmumFzHPh+Zf3loA+aPfhewfHjYf6
+HTSl5g7qpvTSOGNDUJaWNsdaFwgweCmglGTZHxsCAwEAAaOBuTCBtjAJBgNVHRME
+AjAAMAsGA1UdDwQEAwID+DCBmwYDVR0fBIGTMIGQMIGNoIGKoIGHhoGEaHR0cDov
+L2V2Y2EuaXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUw
+REJDMDRCMDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyJnNnPUhBQ0M0NzFCNjU0MjJF
+MTJCMjdBOUQzM0E4N0FEMUNERjU5MjZFMTQwMzcxMA0GCSqGSIb3DQEBCwUAA4IB
+AQBqy3zGwJrXag0XwxYedTe7JnNZRMqP8EOV2kp6C9673UshladGyumDyHVoFoma
+fVBLunO6+xtz+janzMqUkpizSRDJVivBrp7H1X72uG6AglKygQqHfuAWaJCOroUj
+/IllF4FUU1v81hegH7XcOceW4B41OzxLtOiyas6MXz4NgNeoz5w1NiYu7yn1qI+1
+VX0QK0iCE+74wv1YTBDDIBIyDZI+5Sdz6s63ZPnoIKgeQ9VJ5OuBiluvLzo/SIp4
+6X9iuCGzHakdLMJP8tgrjGPKfq1ES0Ls9nNBWQ3djsWAeWGLKfDzxn4+iZgG2hpq
+JpBeYfT1ldDHf4J92S/gZaH+
+-----END CERTIFICATE-----

+ 9 - 0
ruoyi-admin/src/main/resources/wxpay/wxpay.properties

@@ -0,0 +1,9 @@
+v3.appId=wxf07c98cd41e54b21
+v3.keyPath=wxpay/apiclient_key.pem
+v3.certPath=wxpay/apiclient_cert.pem
+v3.certP12Path=wxpay/apiclient_cert.p12
+v3.platformCertPath=wxpay/platformCert.pem
+v3.mchId=1677083704
+v3.apiKey3=lswgahsz0826eidwkseewZxgew999999
+v3.apiKey=lswgahsz0826eidwkseewZxgew999999
+v3.domain=https://gahsz.com/prod-api

+ 4 - 0
ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java

@@ -69,4 +69,8 @@ public enum BusinessType {
      * 下载
      */
     DOWNLOAD,
+    /**
+     * 在线支付
+     */
+    PAY,
 }