diff --git a/pom.xml b/pom.xml
index 7dfdf99..4dc1cdb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,6 +15,7 @@
wxapp-server
1.8
+ 2.6
@@ -25,6 +26,11 @@
org.springframework.boot
spring-boot-starter-test
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
com.auth0
java-jwt
@@ -56,13 +62,17 @@
fastjson
1.2.83
-
+
- com.github.wxpay
- wxpay-sdk
- 0.0.3
+ com.github.wechatpay-apiv3
+ wechatpay-apache-httpclient
+ 0.4.8
+
+
+ commons-lang
+ commons-lang
+ ${commons.lang}
-
diff --git a/src/main/java/com/bigdata/wxappserver/config/WxPayConfig.java b/src/main/java/com/bigdata/wxappserver/config/WxPayConfig.java
deleted file mode 100644
index c405ae8..0000000
--- a/src/main/java/com/bigdata/wxappserver/config/WxPayConfig.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.bigdata.wxappserver.config;
-
-import com.github.wxpay.sdk.WXPayConfig;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-
-/**
- * Created with IntelliJ IDEA.
- *
- * @Author: Cool
- * @Date: 2024/08/31/20:53
- * @Description:
- */
-public class WxPayConfig implements WXPayConfig {
-
- private byte[] certData;
-
- public void MyConfig() throws Exception {
- //此处暂时用不到,这里是读取证书的地方
- }
-
- @Override
- public String getAppID() {
- return "wx865aefa5a7115ae0";
- }
-
- @Override
- public String getMchID() {
- //申请普通商户时分配给你的商户号
- return "这里是你的商户号";
- }
-
- @Override
- public String getKey() {
- //这里的key 就是你在支付平台设置的API密钥
- return "这是就是你的Key了";
- }
-
- @Override
- public InputStream getCertStream() {
- ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);
- return certBis;
- }
- @Override
- public int getHttpConnectTimeoutMs() {
- return 8000;
- }
- @Override
- public int getHttpReadTimeoutMs() {
- return 10000;
- }
-}
-
diff --git a/src/main/java/com/bigdata/wxappserver/controller/OrderController.java b/src/main/java/com/bigdata/wxappserver/controller/OrderController.java
index 15eaa02..d9b596c 100644
--- a/src/main/java/com/bigdata/wxappserver/controller/OrderController.java
+++ b/src/main/java/com/bigdata/wxappserver/controller/OrderController.java
@@ -2,12 +2,10 @@ package com.bigdata.wxappserver.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
+import com.bigdata.wxappserver.result.Result;
import com.bigdata.wxappserver.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
/**
* Created with IntelliJ IDEA.
@@ -43,4 +41,15 @@ public class OrderController {
return orderService.delete(id);
}
+ /**
+ * 订单支付
+ *
+ * @param
+ * @return
+ */
+ @PutMapping("/payment")
+ public Result payment(@RequestBody JSONObject jsonObject) throws Exception {
+ return orderService.payment(jsonObject);
+ }
+
}
diff --git a/src/main/java/com/bigdata/wxappserver/controller/PayController.java b/src/main/java/com/bigdata/wxappserver/controller/PayController.java
deleted file mode 100644
index 8d4132b..0000000
--- a/src/main/java/com/bigdata/wxappserver/controller/PayController.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.bigdata.wxappserver.controller;
-
-import com.bigdata.wxappserver.config.WxPayConfig;
-import com.github.wxpay.sdk.WXPay;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.HashMap;
-import java.util.Map;
-
-@RestController
-@RequestMapping("pay")
-public class PayController {
-
- @RequestMapping("payment")
- public Object getPayment(HttpServletRequest request, @RequestParam("totalFee") String totalFee, String tradeno) throws Exception {
-// 获取到当前登录用户,因为这里我保存了openid , 方法大家可以自己处理,这里就不展示了
-// User user = User.getCurrentUserInfo().getUser();
- //当前就是我们自己配置的支付配置。appid 商户号 key 什么的;
- WxPayConfig config = new WxPayConfig();
- //当前类是官方为我们封装的一些使用的方法
- WXPay wxpay = new WXPay(config);
- //获取到 IP
- String clientIp = getIpAddress(request);
- System.err.println(clientIp);
- //封装请求参数 参数说明看API文档,当前就不进行讲解了
- Map data = new HashMap<>();
- data.put("body", "腾讯充值中心-QQ会员充值");
- data.put("out_trade_no", "2016090910595900000012");
- data.put("device_info", "12345679"); //此处设备或商品编号
- data.put("fee_type", "CNY"); // 货币类型 人民币
-
- // 支付中没有小数点,起步以分做为单们,当前为1 分钱,所以自行调整金额 ,这里可以做为传参,
- //选取商品金额传到后端来
- data.put("total_fee", "1");
-
- data.put("spbill_create_ip", "123.12.12.123");
- data.put("notify_url", "http://www.example.com/wxpay/notify");
- data.put("trade_type", "JSAPI"); // 此处指定JSAPI
- data.put("product_id", "12");
- data.put("openid", "这是是登录获取到的openId 必传");
- //调用统一下单方法
- Map order = wxpay.unifiedOrder(data);
- //获取到需要的参数返回小程序
- return order;
-
-
- }
-
- // 获取 IP
- public static String getIpAddress(HttpServletRequest request) {
- String ip = request.getHeader("x-forwarded-for");
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
- ip = request.getHeader("Proxy-Client-IP");
- }
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
- ip = request.getHeader("WL-Proxy-Client-IP");
- }
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
- ip = request.getHeader("HTTP_CLIENT_IP");
- }
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
- ip = request.getHeader("HTTP_X_FORWARDED_FOR");
- }
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
- ip = request.getRemoteAddr();
- }
- return ip;
- }
-
-}
diff --git a/src/main/java/com/bigdata/wxappserver/controller/PayNotifyController.java b/src/main/java/com/bigdata/wxappserver/controller/PayNotifyController.java
new file mode 100644
index 0000000..c26fa3c
--- /dev/null
+++ b/src/main/java/com/bigdata/wxappserver/controller/PayNotifyController.java
@@ -0,0 +1,118 @@
+package com.bigdata.wxappserver.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.bigdata.wxappserver.properties.WeChatProperties;
+import com.bigdata.wxappserver.service.OrderService;
+import com.wechat.pay.contrib.apache.httpclient.util.AesUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.entity.ContentType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+
+/**
+ * 支付回调相关接口
+ */
+@RestController
+@RequestMapping("/notify")
+@Slf4j
+public class PayNotifyController {
+ @Autowired
+ private OrderService orderService;
+ @Autowired
+ private WeChatProperties weChatProperties;
+
+ /**
+ * 支付成功回调
+ *
+ * @param request
+ */
+ @RequestMapping("/paySuccess")
+ public void paySuccessNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {
+ //读取数据
+ String body = readData(request);
+ log.info("支付成功回调:{}", body);
+
+ //数据解密
+ String plainText = decryptData(body);
+ log.info("解密后的文本:{}", plainText);
+
+ JSONObject jsonObject = JSON.parseObject(plainText);
+ String outTradeNo = jsonObject.getString("out_trade_no");//商户平台订单号
+ String transactionId = jsonObject.getString("transaction_id");//微信支付交易号
+
+ log.info("商户平台订单号:{}", outTradeNo);
+ log.info("微信支付交易号:{}", transactionId);
+
+ //业务处理,修改订单状态、来单提醒
+ orderService.paySuccess(outTradeNo);
+
+ //给微信响应
+ responseToWeixin(response);
+ }
+
+ /**
+ * 读取数据
+ *
+ * @param request
+ * @return
+ * @throws Exception
+ */
+ private String readData(HttpServletRequest request) throws Exception {
+ BufferedReader reader = request.getReader();
+ StringBuilder result = new StringBuilder();
+ String line = null;
+ while ((line = reader.readLine()) != null) {
+ if (result.length() > 0) {
+ result.append("\n");
+ }
+ result.append(line);
+ }
+ return result.toString();
+ }
+
+ /**
+ * 数据解密
+ *
+ * @param body
+ * @return
+ * @throws Exception
+ */
+ private String decryptData(String body) throws Exception {
+ JSONObject resultObject = JSON.parseObject(body);
+ JSONObject resource = resultObject.getJSONObject("resource");
+ String ciphertext = resource.getString("ciphertext");
+ String nonce = resource.getString("nonce");
+ String associatedData = resource.getString("associated_data");
+
+ AesUtil aesUtil = new AesUtil(weChatProperties.getApiV3Key().getBytes(StandardCharsets.UTF_8));
+ //密文解密
+ String plainText = aesUtil.decryptToString(associatedData.getBytes(StandardCharsets.UTF_8),
+ nonce.getBytes(StandardCharsets.UTF_8),
+ ciphertext);
+
+ return plainText;
+ }
+
+ /**
+ * 给微信响应
+ *
+ * @param response
+ */
+ private void responseToWeixin(HttpServletResponse response) throws Exception {
+ response.setStatus(200);
+ HashMap