From 83b0db735a2726ae0c8e9fe08ae5bcfef8ec2b27 Mon Sep 17 00:00:00 2001 From: yangjun <1173114630@qq.com> Date: Mon, 19 May 2025 13:36:05 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ConfigMaterialCategoryController.java | 4 ++++ .../ConfigMaterialCategoryServiceImpl.java | 24 ++++++++++--------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/controller/ConfigMaterialCategoryController.java b/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/controller/ConfigMaterialCategoryController.java index d8670da..edf8292 100644 --- a/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/controller/ConfigMaterialCategoryController.java +++ b/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/controller/ConfigMaterialCategoryController.java @@ -10,6 +10,8 @@ import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang.StringUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.query.QueryRuleEnum; @@ -83,6 +85,8 @@ public class ConfigMaterialCategoryController extends JeecgController queryWrapper = QueryGenerator.initQueryWrapper(configMaterialCategory, req.getParameterMap()); + queryWrapper.eq(StringUtils.isNotBlank(configMaterialCategory.getCategoryId()),"category_id",configMaterialCategory.getCategoryId()); + queryWrapper.eq(StringUtils.isNotBlank(configMaterialCategory.getTypeId()),"type_id",configMaterialCategory.getTypeId()); Page page = new Page(pageNo, pageSize); IPage pageList = configMaterialCategoryService.selectMaterialList(page, queryWrapper); return Result.OK(pageList); diff --git a/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/service/impl/ConfigMaterialCategoryServiceImpl.java b/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/service/impl/ConfigMaterialCategoryServiceImpl.java index ebcadd3..befe81a 100644 --- a/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/service/impl/ConfigMaterialCategoryServiceImpl.java +++ b/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/service/impl/ConfigMaterialCategoryServiceImpl.java @@ -37,19 +37,21 @@ public class ConfigMaterialCategoryServiceImpl extends ServiceImpl selectMaterialList(Page page, QueryWrapper queryWrapper) { IPage pageList = baseMapper.selectMaterialList(page,queryWrapper); List list = pageList.getRecords(); - //按照list 的categoryId字段获取相同数据开始和结束标记 - String categoryId = list.get(0).getCategoryId(); - int outerStart = 0; // 一级分组起始索引 - for (int i = 0; i < list.size(); i++) { - ConfigMaterialCategory configMaterialCategory = list.get(i); - // 当遇到不同的categoryId时处理当前分组 - if (!configMaterialCategory.getCategoryId().equals(categoryId)) { - processAllGroups(list, outerStart, i - 1); // 处理完整个一级分组 - outerStart = i; // 重置一级起始位置 - categoryId = configMaterialCategory.getCategoryId(); + if(list.size()>0){ + //按照list 的categoryId字段获取相同数据开始和结束标记 + String categoryId = list.get(0).getCategoryId(); + int outerStart = 0; // 一级分组起始索引 + for (int i = 0; i < list.size(); i++) { + ConfigMaterialCategory configMaterialCategory = list.get(i); + // 当遇到不同的categoryId时处理当前分组 + if (!configMaterialCategory.getCategoryId().equals(categoryId)) { + processAllGroups(list, outerStart, i - 1); // 处理完整个一级分组 + outerStart = i; // 重置一级起始位置 + categoryId = configMaterialCategory.getCategoryId(); + } } + processAllGroups(list, outerStart, list.size() - 1); // 处理最后一组 } - processAllGroups(list, outerStart, list.size() - 1); // 处理最后一组 return pageList; } From 9ec69e8875cdfc2a27087c8b3e91afee93d20b15 Mon Sep 17 00:00:00 2001 From: yangjun <1173114630@qq.com> Date: Thu, 22 May 2025 16:48:57 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nursing-unit-admin/nu-admin-biz/pom.xml | 11 + .../controller/WechatPay2Controller.java | 76 ++++ .../controller/WechatPayController.java | 345 ++++++++++++++++++ .../nu/modules/wechart/entity/WXConfig.java | 89 +++++ .../wechart/entity/WechatpayConfig.java | 38 ++ .../org/jeecg/config/shiro/ShiroConfig.java | 2 + .../ConfigMaterialCategoryController.java | 1 - .../ConfigMaterialInfoController.java | 1 - .../ConfigMaterialMedicationController.java | 1 - .../ConfigMaterialTypeController.java | 1 - .../nu-system-start/apiclient_key.pem | 28 ++ .../src/main/resources/application-dev.yml | 14 + .../src/main/resources/application-uat.yml | 2 +- pom.xml | 20 +- 14 files changed, 614 insertions(+), 15 deletions(-) create mode 100644 nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java create mode 100644 nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPayController.java create mode 100644 nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/entity/WXConfig.java create mode 100644 nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/entity/WechatpayConfig.java create mode 100644 nursing-unit-system/nu-system-start/apiclient_key.pem diff --git a/nursing-unit-admin/nu-admin-biz/pom.xml b/nursing-unit-admin/nu-admin-biz/pom.xml index d76ec65..60bf3dd 100644 --- a/nursing-unit-admin/nu-admin-biz/pom.xml +++ b/nursing-unit-admin/nu-admin-biz/pom.xml @@ -10,6 +10,17 @@ nu-admin-biz + + + com.github.wechatpay-apiv3 + wechatpay-apache-httpclient + 0.4.9 + + + com.github.wxpay + wxpay-sdk + 0.0.3 + com.nursingunit.boot nu-admin-local-api diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java new file mode 100644 index 0000000..f635384 --- /dev/null +++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java @@ -0,0 +1,76 @@ +package com.nu.modules.wechart.controller; + + +import cn.hutool.core.util.IdUtil; +import com.github.wxpay.sdk.WXPay; +import com.github.wxpay.sdk.WXPayConstants; +import com.github.wxpay.sdk.WXPayUtil; +import com.nu.modules.wechart.entity.WXConfig; +import com.nu.modules.wechart.entity.WechatpayConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/weiXinPay2") +@Slf4j +public class WechatPay2Controller { + @Autowired + public WechatpayConfig wechatpayConfig; + + + /** + * Native下单 + * 调用统一下单API,生成支付二维码 + */ + @PostMapping("/native") + public Map nativePay() throws Exception { + log.info("生成订单"); + //生成订单 + log.info("存入数据库..."); + + log.info("调用统一下单API"); + // 订单号 + String orderNo = IdUtil.simpleUUID(); + // 请求body参数 看官方文档 + WXConfig config = new WXConfig(); + config.setAppId(wechatpayConfig.getAppid()); + config.setMchId(wechatpayConfig.getMchId()); + config.setKey(wechatpayConfig.getApiV3Key()); + + Map paramsMap = new HashMap<>(); + paramsMap.put("appid", wechatpayConfig.getAppid()); + paramsMap.put("mchid", wechatpayConfig.getMchId()); + paramsMap.put("description", "iPhone 15 Pro Max 5G"); + paramsMap.put("out_trade_no", orderNo); + // 回调的地址 + paramsMap.put("notify_url",wechatpayConfig.getNotifyDomain()+"/native/notify"); + + Map amountMap = new HashMap(); + //订单总金额,单位为分。 + amountMap.put("total", 1); + //CNY:人民币,境内商户号仅支持人民币。 + amountMap.put("currency", "CNY"); + paramsMap.put("total_fee", 1+""); + paramsMap.put("trade_type", "JSAPI"); + String generateNonceStr = WXPayUtil.generateNonceStr(); + paramsMap.put("nonce_str", generateNonceStr); + String body = "body"; + paramsMap.put("body", body); + paramsMap.put("sign", WXPayUtil.generateSignature(paramsMap, wechatpayConfig.getApiV3Key(), WXPayConstants.SignType.MD5)); + + log.info("请求参数:" + paramsMap); + + + + WXPay wxpay = new WXPay(config); + Map response = wxpay.unifiedOrder(paramsMap); + for (String key : response.keySet()) { + log.info("微信支付订单微信返回参数:keys:" + key + " value:" + response.get(key).toString()); + } + return null; + } +} diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPayController.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPayController.java new file mode 100644 index 0000000..c078de5 --- /dev/null +++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPayController.java @@ -0,0 +1,345 @@ +package com.nu.modules.wechart.controller; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.json.JSONUtil; +import com.github.wxpay.sdk.WXPayUtil; +import com.nu.modules.wechart.entity.WechatpayConfig; +import com.wechat.pay.contrib.apache.httpclient.util.AesUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.GeneralSecurityException; +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/weiXinPay") +@Slf4j +public class WechatPayController { + + + @Resource + public WechatpayConfig wechatpayConfig; + + + /** + * Native下单 + * 调用统一下单API,生成支付二维码 + */ + @PostMapping("/native") + public Map nativePay() throws Exception { + log.info("生成订单"); + //生成订单 + log.info("存入数据库..."); + + log.info("调用统一下单API"); + //调用统一下单API + HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/native"); + + // 订单号 + String orderNo = IdUtil.simpleUUID(); + // 请求body参数 看官方文档 + Map paramsMap = new HashMap(); + paramsMap.put("appid", wechatpayConfig.getAppid()); + paramsMap.put("mchid", wechatpayConfig.getMchId()); + paramsMap.put("description", "iPhone 15 Pro Max 5G"); + paramsMap.put("out_trade_no", orderNo); + // 回调的地址 + paramsMap.put("notify_url",wechatpayConfig.getNotifyDomain()+"/native/notify"); + Map amountMap = new HashMap(); + //订单总金额,单位为分。 + amountMap.put("total", 1); + //CNY:人民币,境内商户号仅支持人民币。 + amountMap.put("currency", "CNY"); + + paramsMap.put("amount", amountMap); + + + + //将参数转换成json字符串 + String jsonParams = JSONUtil.toJsonStr(paramsMap); + log.info("请求参数:" + jsonParams); + + StringEntity entity = new StringEntity(jsonParams,"utf-8"); + entity.setContentType("application/json"); + httpPost.setEntity(entity); + httpPost.setHeader("Accept", "application/json"); + httpPost.setHeader("Authorization", "WECHATPAY2-SHA256-RSA2048 "+ jsonParams); + //创建httpclient对象 + CloseableHttpClient wxPayClient = HttpClients.createDefault(); + //完成签名并执行请求 + CloseableHttpResponse response = wxPayClient.execute(httpPost); + try { + String bodyAsString = EntityUtils.toString(response.getEntity());//响应体 + int statusCode = response.getStatusLine().getStatusCode();//响应状态码 + if (statusCode == 200) { //处理成功 + log.info("成功, 返回结果 = " + bodyAsString); + } else if (statusCode == 204) { //处理成功,无返回Body + log.info("成功"); + } else { + log.info("Native下单失败,响应码 = " + statusCode+ ",返回结果 = " + + bodyAsString); + throw new IOException("request failed"); + } + //响应结果 + Map resultMap = JSONUtil.toBean(bodyAsString,HashMap.class); + //二维码 + String codeUrl = resultMap.get("code_url"); + Map map = new HashMap<>(); + map.put("codeUrl", codeUrl); + map.put("orderNo", orderNo.toString()); + return map; + } finally { + response.close(); + } + } + /** + * 支付通知 + * 微信支付通过支付通知接口将用户支付成功消息通知给商户 + */ + @PostMapping("/native/notify") + public Map nativeNotify(@RequestBody Map signalRes, HttpServletResponse response){ + Map map = new HashMap<>();//应答对象 + log.info("支付通知的完整数据 ===> {}", signalRes); + try { + //用密文解密出明文 + Map resource=(Map)signalRes.get("resource"); + String ciphertext=resource.get("ciphertext"); + String associatedData=resource.get("associated_data"); + String nonce=resource.get("nonce"); + // 拿到明文 + String plainText=new AesUtil(wechatpayConfig.getApiV3Key().getBytes(StandardCharsets.UTF_8)).decryptToString(associatedData.getBytes(StandardCharsets.UTF_8),nonce.getBytes(StandardCharsets.UTF_8),ciphertext); + //转换 + HashMap data= JSONUtil.toBean(plainText,HashMap.class); + log.info("解密后的完整数据:{}",data); + //处理订单 + log.info("处理订单..."); + //成功应答:成功应答必须为200或204,否则就是失败应答 + response.setStatus(200); + map.put("code", "SUCCESS"); + } catch (GeneralSecurityException e) { + response.setStatus(500); + map.put("code", "FAIL"); + map.put("message","失败"); + } + return map; + } + /** + * 查询订单 + * @param orderNo + * @return + * @throws Exception + */ + @GetMapping("/query/{orderNo}") + public String queryOrder(@PathVariable String orderNo) throws Exception { + log.info("查询订单"); + String url = String.format("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/%s", orderNo); + url = url+"?mchid="+wechatpayConfig.getMchId(); + HttpGet httpGet = new HttpGet(url); + httpGet.setHeader("Accept", "application/json"); + + //创建httpclient对象 + CloseableHttpClient wxPayClient = HttpClients.createDefault(); + //完成签名并执行请求 + CloseableHttpResponse response = wxPayClient.execute(httpGet); + try { + String bodyAsString = EntityUtils.toString(response.getEntity());//响应体 + int statusCode = response.getStatusLine().getStatusCode();//响应状态码 + if (statusCode == 200) { //处理成功 + log.info("成功, 返回结果 = " + bodyAsString); + } else if (statusCode == 204) { //处理成功,无返回Body + log.info("成功"); + } else { + log.info("查单接口调用,响应码 = " + statusCode+ ",返回结果 = " + bodyAsString); + throw new IOException("request failed"); + } + return bodyAsString; + } finally { + response.close(); + } + + } + /** + * 用户取消订单 + * @param orderNo 订单id + */ + @PostMapping("/cancel/{orderNo}") + public String cancel(@PathVariable String orderNo) throws Exception { + log.info("用户取消订单"); + //创建远程请求对象 + String url = String.format("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/%s/close", orderNo); + HttpPost httpPost = new HttpPost(url); + + //组装json请求体 + Map paramsMap = new HashMap<>(); + paramsMap.put("mchid", wechatpayConfig.getMchId()); + String jsonParams = JSONUtil.toJsonStr(paramsMap); + log.info("请求参数 ===> {}", jsonParams); + + //将请求参数设置到请求对象中 + StringEntity entity = new StringEntity(jsonParams,"utf-8"); + entity.setContentType("application/json"); + httpPost.setEntity(entity); + httpPost.setHeader("Accept", "application/json"); + + //创建httpclient对象 + CloseableHttpClient wxPayClient = HttpClients.createDefault(); + //完成签名并执行请求 + CloseableHttpResponse response = wxPayClient.execute(httpPost); + try { + int statusCode = response.getStatusLine().getStatusCode();//响应状态码 + if (statusCode == 200) { //处理成功 + log.info("成功200"); + } else if (statusCode == 204) { //处理成功,无返回Body + log.info("成功204"); + } else { + log.info("Native下单失败,响应码 = " + statusCode); + throw new IOException("request failed"); + } + return "订单取消成功"; + } finally { + response.close(); + } + } + /** + * 申请退款 + * @param orderNo 订单编号 + */ + @PostMapping("/refunds/{orderNo}") + public Map refunds(@PathVariable String orderNo) throws Exception { + + log.info("创建退款单记录..."); + //根据订单编号创建退款单 + + log.info("调用退款API"); + + //调用统一下单API + HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/refund/domestic/refunds"); + + // 请求body参数 + Map paramsMap = new HashMap(); + paramsMap.put("out_trade_no", orderNo);//订单编号 + + // 给它一个退款单号 + paramsMap.put("out_refund_no", "tk202412120001");//退款单编号 + paramsMap.put("reason", "买了不发货");//退款原因 + paramsMap.put("notify_url", wechatpayConfig.getNotifyDomain()+"/refunds/notify");//退款通知地址 + + Map amountMap = new HashMap(); + amountMap.put("refund", 1);//退款金额 + amountMap.put("total", 1);//原订单金额 + amountMap.put("currency", "CNY");//退款币种 + paramsMap.put("amount", amountMap); + + //将参数转换成json字符串 + String jsonParams = JSONUtil.toJsonStr(paramsMap); + log.info("请求参数 ===> {}" + jsonParams); + + StringEntity entity = new StringEntity(jsonParams, "utf-8"); + entity.setContentType("application/json");//设置请求报文格式 + httpPost.setEntity(entity);//将请求报文放入请求对象 + httpPost.setHeader("Accept", "application/json");//设置响应报文格式 + + //创建httpclient对象 + CloseableHttpClient wxPayClient = HttpClients.createDefault(); + //完成签名并执行请求,并完成验签 + CloseableHttpResponse response = wxPayClient.execute(httpPost); + + try { + //解析响应结果 + String bodyAsString = EntityUtils.toString(response.getEntity()); + int statusCode = response.getStatusLine().getStatusCode(); + if (statusCode == 200) { + log.info("成功, 退款返回结果 = " + bodyAsString); + } else if (statusCode == 204) { + log.info("成功"); + } else { + throw new RuntimeException("退款异常, 响应码 = " + statusCode + ", 退款返回结果 = " + bodyAsString); + } + log.info("更新订单状态......"); + log.info("更新退款单......"); + return JSONUtil.toBean(bodyAsString,Map.class); + } finally { + response.close(); + } + } + /** + * 退款结果通知 + * 退款状态改变后,微信会把相关退款结果发送给商户。 + */ + @PostMapping("/refunds/notify") + public String refundsNotify(@RequestBody Map signalRes, HttpServletResponse response){ + log.info("退款通知执行"); + Map map = new HashMap<>();//应答对象 + try { + Map resource=(Map)signalRes.get("resource"); + String ciphertext=resource.get("ciphertext"); + String associatedData=resource.get("associated_data"); + String nonce=resource.get("nonce"); + // 拿到明文 + String plainText=new AesUtil(wechatpayConfig.getApiV3Key().getBytes(StandardCharsets.UTF_8)).decryptToString(associatedData.getBytes(StandardCharsets.UTF_8),nonce.getBytes(StandardCharsets.UTF_8),ciphertext); + + //转换 + HashMap data= JSONUtil.toBean(plainText,HashMap.class); + log.info("解密后的完整数据:{}",data); + log.info("处理退款单................................"); + log.info("更新订单状态................................"); + + //成功应答 + response.setStatus(200); + map.put("code", "SUCCESS"); + map.put("message", "成功"); + return JSONUtil.toJsonStr(map); + } catch (Exception e) { + e.printStackTrace(); + //失败应答 + response.setStatus(500); + map.put("code", "ERROR"); + map.put("message", "失败"); + return JSONUtil.toJsonStr(map); + } + } + /** + * 查询退款 + * @param refundNo 退款订单 + */ + @GetMapping("/query-refund/{refundNo}") + public String queryRefund(@PathVariable String refundNo) throws Exception { + + log.info("查询退款接口调用 ===> {}", refundNo); + String url = String.format("https://api.mch.weixin.qq.com/v3/refund/domestic/refunds/%s", refundNo); + //创建远程Get 请求对象 + HttpGet httpGet = new HttpGet(url); + httpGet.setHeader("Accept", "application/json"); + //创建httpclient对象 + CloseableHttpClient wxPayClient = HttpClients.createDefault(); + //完成签名并执行请求 + CloseableHttpResponse response = wxPayClient.execute(httpGet); + try { + String bodyAsString = EntityUtils.toString(response.getEntity()); + int statusCode = response.getStatusLine().getStatusCode(); + if (statusCode == 200) { + log.info("成功, 查询退款返回结果 = " + bodyAsString); + } else if (statusCode == 204) { + log.info("成功"); + } else { + throw new RuntimeException("查询退款异常, 响应码 = " + statusCode+ ", 查询退款返回结果 = " + bodyAsString); + } + return bodyAsString; + } finally { + response.close(); + } + } + +} diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/entity/WXConfig.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/entity/WXConfig.java new file mode 100644 index 0000000..06224b1 --- /dev/null +++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/entity/WXConfig.java @@ -0,0 +1,89 @@ +package com.nu.modules.wechart.entity; + +import com.github.wxpay.sdk.WXPayConfig; +import lombok.Data; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +/** + * @author fang + * @date 2020/2/26 + */ +@Data +public class WXConfig implements WXPayConfig { + private byte[] certData; + + public String appId; + public String key; + public String mchId; + + /*public WXConfigUtil() throws Exception { + String certPath = ClassUtils.getDefaultClassLoader().getResource("").getPath()+"/weixin/apiclient_cert.p12";//从微信商户平台下载的安全证书存放的路径 + File file = new File(certPath); + InputStream certStream = new FileInputStream(file); + this.certData = new byte[(int) file.length()]; + certStream.read(this.certData); + certStream.close(); + }*/ + + public byte[] getCertData() { + return certData; + } + + public void setCertData(byte[] certData) { + this.certData = certData; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public void setKey(String key) { + this.key = key; + } + + public String getMchId() { + return mchId; + } + + public void setMchId(String mchId) { + this.mchId = mchId; + } + + @Override + public String getAppID() { + return this.appId; + } + + //parnerid,商户号 + @Override + public String getMchID() { + return this.mchId; + } + + @Override + public String getKey() { + return this.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/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/entity/WechatpayConfig.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/entity/WechatpayConfig.java new file mode 100644 index 0000000..00bb7b0 --- /dev/null +++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/entity/WechatpayConfig.java @@ -0,0 +1,38 @@ +package com.nu.modules.wechart.entity; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +@Configuration +@Slf4j +@Data +public class WechatpayConfig { + // 商户ID + @Value("${wxpay.mch-id}") + private String mchId; + + // 商户API证书序列号 + @Value("${wxpay.mch-serial-no}") + private String mchSerialNo; + + // 商户私钥文件 + @Value("${wxpay.private-key-path}") + private String privateKeyPath; + + // APIv3密钥 + @Value("${wxpay.api-v3-key}") + private String apiV3Key; + + // APPID + @Value("${wxpay.appid}") + private String appid; + + // 接收结果通知地址 + @Value("${wxpay.notify-domain}") + private String notifyDomain; + + + +} diff --git a/nursing-unit-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java b/nursing-unit-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java index cbbaa42..e0937cd 100644 --- a/nursing-unit-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java +++ b/nursing-unit-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java @@ -113,6 +113,8 @@ public class ShiroConfig { filterChainDefinitionMap.put("/sys/checkAuth", "anon"); //授权接口排除 filterChainDefinitionMap.put("/h5Api/nuBizAdvisoryInfo/**", "anon"); //授权接口排除 filterChainDefinitionMap.put("/h5Api/nuBaseInfo/**", "anon"); //授权接口排除 + filterChainDefinitionMap.put("/weiXinPay/**", "anon"); //微信支付接口 + filterChainDefinitionMap.put("/weiXinPay2/**", "anon"); //微信支付接口 //update-begin--Author:scott Date:20221116 for:排除静态资源后缀 filterChainDefinitionMap.put("/", "anon"); diff --git a/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/controller/ConfigMaterialCategoryController.java b/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/controller/ConfigMaterialCategoryController.java index edf8292..5b8b39d 100644 --- a/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/controller/ConfigMaterialCategoryController.java +++ b/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/controller/ConfigMaterialCategoryController.java @@ -175,7 +175,6 @@ public class ConfigMaterialCategoryController extends JeecgController${commonmark.version} - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - 2021.0.5.0 - + + + + + - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - 2021.0.5.0 - + + + + + org.springframework.boot From 3b5ae8d03e8fb30b6007d1093495bd24e73066ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E7=A3=8A?= <45566618@qq.com> Date: Thu, 22 May 2025 18:14:55 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98v3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WechatPay2Controller.java | 151 ++++++++++++------ 1 file changed, 102 insertions(+), 49 deletions(-) diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java index f635384..4be0b73 100644 --- a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java +++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java @@ -1,17 +1,17 @@ package com.nu.modules.wechart.controller; - import cn.hutool.core.util.IdUtil; -import com.github.wxpay.sdk.WXPay; -import com.github.wxpay.sdk.WXPayConstants; -import com.github.wxpay.sdk.WXPayUtil; -import com.nu.modules.wechart.entity.WXConfig; import com.nu.modules.wechart.entity.WechatpayConfig; +import com.wechat.pay.java.core.Config; +import com.wechat.pay.java.core.RSAAutoCertificateConfig; + +import com.wechat.pay.java.service.payments.jsapi.JsapiService; +import com.wechat.pay.java.service.payments.jsapi.model.Amount; +import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest; +import com.wechat.pay.java.service.payments.jsapi.model.PrepayResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; - -import java.util.HashMap; import java.util.Map; @RestController @@ -28,49 +28,102 @@ public class WechatPay2Controller { */ @PostMapping("/native") public Map nativePay() throws Exception { - log.info("生成订单"); - //生成订单 - log.info("存入数据库..."); +// log.info("生成订单"); +// //生成订单 +// log.info("存入数据库..."); +// +// log.info("调用统一下单API"); +// // 订单号 +// String orderNo = IdUtil.simpleUUID(); +// // 请求body参数 看官方文档 +// WXConfig config = new WXConfig(); +// config.setAppId(wechatpayConfig.getAppid()); +// config.setMchId(wechatpayConfig.getMchId()); +// config.setKey(wechatpayConfig.getApiV3Key()); +// +// Map paramsMap = new HashMap<>(); +// paramsMap.put("appid", wechatpayConfig.getAppid()); +// paramsMap.put("mchid", wechatpayConfig.getMchId()); +// paramsMap.put("description", "测试微信jsapi支付"); +// paramsMap.put("out_trade_no", orderNo); +// // 回调的地址 +// paramsMap.put("notify_url",wechatpayConfig.getNotifyDomain()+"/native/notify"); +// +// Map amountMap = new HashMap(); +// //订单总金额,单位为分。 +// amountMap.put("total", 1); +// //CNY:人民币,境内商户号仅支持人民币。 +// amountMap.put("currency", "CNY"); +// paramsMap.put("total_fee", 1+""); +//// paramsMap.put("amount", amountMap.toString()); +// Map payer = new HashMap(); +// payer.put("openid", "oE3S76LTNliVGdi63ciiV9T2pqAU"); +// paramsMap.put("payer", payer.toString()); +// paramsMap.put("trade_type", "JSAPI"); +// String generateNonceStr = WXPayUtil.generateNonceStr(); +// paramsMap.put("nonce_str", generateNonceStr); +// +// String body = "护理单元"; +// paramsMap.put("body", body); +// +// log.info("请求参数1:" + paramsMap.toString()); +// +// Set keySet = paramsMap.keySet(); +// String[] keyArray = (String[])keySet.toArray(new String[keySet.size()]); +// Arrays.sort(keyArray); +// StringBuilder sb = new StringBuilder(); +// String[] var6 = keyArray; +// int var7 = keyArray.length; +// +// for(int var8 = 0; var8 < var7; ++var8) { +// String k = var6[var8]; +// if (!k.equals("sign") && ((String)paramsMap.get(k)).trim().length() > 0) { +// sb.append(k).append("=").append(((String)paramsMap.get(k)).trim()).append("&"); +// } +// } +// +// sb.append("key=").append( wechatpayConfig.getApiV3Key()); +// log.info("xml1:" + sb.toString()); +// +// String xml2 = WXPayUtil.mapToXml(paramsMap); +// log.info("xml2:" + xml2); +// +// String sign = WXPayUtil.generateSignature(paramsMap, wechatpayConfig.getApiV3Key(), WXPayConstants.SignType.MD5); +// log.info("sign:" + sign); +// paramsMap.put("sign", sign); +// +// log.info("请求参数2:" + paramsMap); +// +// WXPay wxpay = new WXPay(config); +// Map response = wxpay.unifiedOrder(paramsMap); +// for (String key : response.keySet()) { +// log.info("微信支付订单微信返回参数:keys:" + key + " value:" + response.get(key).toString()); +// } +// return null; - log.info("调用统一下单API"); - // 订单号 - String orderNo = IdUtil.simpleUUID(); - // 请求body参数 看官方文档 - WXConfig config = new WXConfig(); - config.setAppId(wechatpayConfig.getAppid()); - config.setMchId(wechatpayConfig.getMchId()); - config.setKey(wechatpayConfig.getApiV3Key()); - - Map paramsMap = new HashMap<>(); - paramsMap.put("appid", wechatpayConfig.getAppid()); - paramsMap.put("mchid", wechatpayConfig.getMchId()); - paramsMap.put("description", "iPhone 15 Pro Max 5G"); - paramsMap.put("out_trade_no", orderNo); - // 回调的地址 - paramsMap.put("notify_url",wechatpayConfig.getNotifyDomain()+"/native/notify"); - - Map amountMap = new HashMap(); - //订单总金额,单位为分。 - amountMap.put("total", 1); - //CNY:人民币,境内商户号仅支持人民币。 - amountMap.put("currency", "CNY"); - paramsMap.put("total_fee", 1+""); - paramsMap.put("trade_type", "JSAPI"); - String generateNonceStr = WXPayUtil.generateNonceStr(); - paramsMap.put("nonce_str", generateNonceStr); - String body = "body"; - paramsMap.put("body", body); - paramsMap.put("sign", WXPayUtil.generateSignature(paramsMap, wechatpayConfig.getApiV3Key(), WXPayConstants.SignType.MD5)); - - log.info("请求参数:" + paramsMap); - - - - WXPay wxpay = new WXPay(config); - Map response = wxpay.unifiedOrder(paramsMap); - for (String key : response.keySet()) { - log.info("微信支付订单微信返回参数:keys:" + key + " value:" + response.get(key).toString()); - } + Config config = + new RSAAutoCertificateConfig.Builder() + .merchantId(wechatpayConfig.getMchId()) + .privateKeyFromPath(wechatpayConfig.getPrivateKeyPath()) + .merchantSerialNumber(wechatpayConfig.getMchSerialNo()) + .apiV3Key(wechatpayConfig.getApiV3Key()) + .build(); + // 构建service + JsapiService service = new JsapiService.Builder().config(config).build(); + // request.setXxx(val)设置所需参数,具体参数可见Request定义 + PrepayRequest request = new PrepayRequest(); + Amount amount = new Amount(); + amount.setTotal(1); + request.setAmount(amount); + request.setAppid(wechatpayConfig.getAppid()); + request.setMchid(wechatpayConfig.getMchId()); + request.setDescription("测试商品标题"); + request.setNotifyUrl(wechatpayConfig.getNotifyDomain()); + request.setOutTradeNo(IdUtil.simpleUUID()); + // 调用下单方法,得到应答 + PrepayResponse response = service.prepay(request); + String prepayId = response.getPrepayId(); + log.info("prepayId:" + prepayId); return null; } } From f0f177f9b65bfcce80566280d26c513704fd090d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E7=A3=8A?= <45566618@qq.com> Date: Fri, 23 May 2025 08:53:11 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98v3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nursing-unit-admin/nu-admin-biz/pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/nursing-unit-admin/nu-admin-biz/pom.xml b/nursing-unit-admin/nu-admin-biz/pom.xml index 60bf3dd..d70c790 100644 --- a/nursing-unit-admin/nu-admin-biz/pom.xml +++ b/nursing-unit-admin/nu-admin-biz/pom.xml @@ -16,6 +16,13 @@ wechatpay-apache-httpclient 0.4.9 + + + com.github.wechatpay-apiv3 + wechatpay-java + 0.2.17 + + com.github.wxpay wxpay-sdk From e3acaaed1005353fc1e5bcccf9f105e160b31bb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E7=A3=8A?= <45566618@qq.com> Date: Fri, 23 May 2025 09:05:25 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98v3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nu/modules/wechart/controller/WechatPay2Controller.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java index 4be0b73..083f2d4 100644 --- a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java +++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java @@ -7,6 +7,7 @@ import com.wechat.pay.java.core.RSAAutoCertificateConfig; import com.wechat.pay.java.service.payments.jsapi.JsapiService; import com.wechat.pay.java.service.payments.jsapi.model.Amount; +import com.wechat.pay.java.service.payments.jsapi.model.Payer; import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest; import com.wechat.pay.java.service.payments.jsapi.model.PrepayResponse; import lombok.extern.slf4j.Slf4j; @@ -120,6 +121,9 @@ public class WechatPay2Controller { request.setDescription("测试商品标题"); request.setNotifyUrl(wechatpayConfig.getNotifyDomain()); request.setOutTradeNo(IdUtil.simpleUUID()); + Payer payer = new Payer(); + payer.setOpenid("oE3S76LTNliVGdi63ciiV9T2pqAU"); + request.setPayer(payer); // 调用下单方法,得到应答 PrepayResponse response = service.prepay(request); String prepayId = response.getPrepayId(); From d9808f2ca55bc5606cd2cf5c6037ea442380c998 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E7=A3=8A?= <45566618@qq.com> Date: Fri, 23 May 2025 10:28:57 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98v3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WechatPay2Controller.java | 31 ++++++++++++++----- .../src/main/resources/application-dev.yml | 2 +- .../main/resources/cert}/apiclient_key.pem | 0 pom.xml | 24 +++++++------- 4 files changed, 37 insertions(+), 20 deletions(-) rename nursing-unit-system/nu-system-start/{ => src/main/resources/cert}/apiclient_key.pem (100%) diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java index 083f2d4..8097c6d 100644 --- a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java +++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java @@ -6,13 +6,13 @@ import com.wechat.pay.java.core.Config; import com.wechat.pay.java.core.RSAAutoCertificateConfig; import com.wechat.pay.java.service.payments.jsapi.JsapiService; -import com.wechat.pay.java.service.payments.jsapi.model.Amount; -import com.wechat.pay.java.service.payments.jsapi.model.Payer; -import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest; -import com.wechat.pay.java.service.payments.jsapi.model.PrepayResponse; +import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension; +import com.wechat.pay.java.service.payments.jsapi.model.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; import java.util.Map; @RestController @@ -126,8 +126,25 @@ public class WechatPay2Controller { request.setPayer(payer); // 调用下单方法,得到应答 PrepayResponse response = service.prepay(request); - String prepayId = response.getPrepayId(); - log.info("prepayId:" + prepayId); - return null; + log.info("prepayId:" + response.getPrepayId()); + Map map = prepayWithRequestPayment(request); + return map; + } + + /** + * 返回调起支付的参数 + * @return + */ + private Map prepayWithRequestPayment(PrepayRequest request){ + Map map = new HashMap<>(); + JsapiServiceExtension jse = new JsapiServiceExtension.Builder().build(); + PrepayWithRequestPaymentResponse response = jse.prepayWithRequestPayment(request); + map.put("appId",response.getAppId()); + map.put("timeStamp",response.getTimeStamp()); + map.put("nonceStr",response.getNonceStr()); + map.put("package",response.getPackageVal()); + map.put("signType",response.getSignType()); + map.put("paySign",response.getPaySign()); + return map; } } diff --git a/nursing-unit-system/nu-system-start/src/main/resources/application-dev.yml b/nursing-unit-system/nu-system-start/src/main/resources/application-dev.yml index ef650d9..4e27e04 100644 --- a/nursing-unit-system/nu-system-start/src/main/resources/application-dev.yml +++ b/nursing-unit-system/nu-system-start/src/main/resources/application-dev.yml @@ -387,4 +387,4 @@ wxpay: # 接收结果通知地址 notify-domain: http://r2agtr.natappfree.cc # 商户私钥文件路径 - private-key-path: apiclient_key.pem \ No newline at end of file + private-key-path: c://apiclient_key.pem \ No newline at end of file diff --git a/nursing-unit-system/nu-system-start/apiclient_key.pem b/nursing-unit-system/nu-system-start/src/main/resources/cert/apiclient_key.pem similarity index 100% rename from nursing-unit-system/nu-system-start/apiclient_key.pem rename to nursing-unit-system/nu-system-start/src/main/resources/cert/apiclient_key.pem diff --git a/pom.xml b/pom.xml index ed7f346..6472460 100644 --- a/pom.xml +++ b/pom.xml @@ -153,18 +153,18 @@ ${commonmark.version} - - - - - - - - - - - - + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + 2021.0.5.0 + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + 2021.0.5.0 + + org.springframework.boot spring-boot-starter-amqp From ab756cda3dfe2b00ca88ace3e7a02ca6e9014819 Mon Sep 17 00:00:00 2001 From: yangjun <1173114630@qq.com> Date: Tue, 27 May 2025 14:08:19 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=B7=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WechatPay2Controller.java | 150 ----- .../controller/WechatPayController.java | 532 ++++++++---------- .../src/main/resources/application-dev.yml | 2 +- .../src/main/resources/application-uat.yml | 15 + 4 files changed, 258 insertions(+), 441 deletions(-) delete mode 100644 nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java deleted file mode 100644 index 8097c6d..0000000 --- a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPay2Controller.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.nu.modules.wechart.controller; - -import cn.hutool.core.util.IdUtil; -import com.nu.modules.wechart.entity.WechatpayConfig; -import com.wechat.pay.java.core.Config; -import com.wechat.pay.java.core.RSAAutoCertificateConfig; - -import com.wechat.pay.java.service.payments.jsapi.JsapiService; -import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension; -import com.wechat.pay.java.service.payments.jsapi.model.*; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.HashMap; -import java.util.Map; - -@RestController -@RequestMapping("/weiXinPay2") -@Slf4j -public class WechatPay2Controller { - @Autowired - public WechatpayConfig wechatpayConfig; - - - /** - * Native下单 - * 调用统一下单API,生成支付二维码 - */ - @PostMapping("/native") - public Map nativePay() throws Exception { -// log.info("生成订单"); -// //生成订单 -// log.info("存入数据库..."); -// -// log.info("调用统一下单API"); -// // 订单号 -// String orderNo = IdUtil.simpleUUID(); -// // 请求body参数 看官方文档 -// WXConfig config = new WXConfig(); -// config.setAppId(wechatpayConfig.getAppid()); -// config.setMchId(wechatpayConfig.getMchId()); -// config.setKey(wechatpayConfig.getApiV3Key()); -// -// Map paramsMap = new HashMap<>(); -// paramsMap.put("appid", wechatpayConfig.getAppid()); -// paramsMap.put("mchid", wechatpayConfig.getMchId()); -// paramsMap.put("description", "测试微信jsapi支付"); -// paramsMap.put("out_trade_no", orderNo); -// // 回调的地址 -// paramsMap.put("notify_url",wechatpayConfig.getNotifyDomain()+"/native/notify"); -// -// Map amountMap = new HashMap(); -// //订单总金额,单位为分。 -// amountMap.put("total", 1); -// //CNY:人民币,境内商户号仅支持人民币。 -// amountMap.put("currency", "CNY"); -// paramsMap.put("total_fee", 1+""); -//// paramsMap.put("amount", amountMap.toString()); -// Map payer = new HashMap(); -// payer.put("openid", "oE3S76LTNliVGdi63ciiV9T2pqAU"); -// paramsMap.put("payer", payer.toString()); -// paramsMap.put("trade_type", "JSAPI"); -// String generateNonceStr = WXPayUtil.generateNonceStr(); -// paramsMap.put("nonce_str", generateNonceStr); -// -// String body = "护理单元"; -// paramsMap.put("body", body); -// -// log.info("请求参数1:" + paramsMap.toString()); -// -// Set keySet = paramsMap.keySet(); -// String[] keyArray = (String[])keySet.toArray(new String[keySet.size()]); -// Arrays.sort(keyArray); -// StringBuilder sb = new StringBuilder(); -// String[] var6 = keyArray; -// int var7 = keyArray.length; -// -// for(int var8 = 0; var8 < var7; ++var8) { -// String k = var6[var8]; -// if (!k.equals("sign") && ((String)paramsMap.get(k)).trim().length() > 0) { -// sb.append(k).append("=").append(((String)paramsMap.get(k)).trim()).append("&"); -// } -// } -// -// sb.append("key=").append( wechatpayConfig.getApiV3Key()); -// log.info("xml1:" + sb.toString()); -// -// String xml2 = WXPayUtil.mapToXml(paramsMap); -// log.info("xml2:" + xml2); -// -// String sign = WXPayUtil.generateSignature(paramsMap, wechatpayConfig.getApiV3Key(), WXPayConstants.SignType.MD5); -// log.info("sign:" + sign); -// paramsMap.put("sign", sign); -// -// log.info("请求参数2:" + paramsMap); -// -// WXPay wxpay = new WXPay(config); -// Map response = wxpay.unifiedOrder(paramsMap); -// for (String key : response.keySet()) { -// log.info("微信支付订单微信返回参数:keys:" + key + " value:" + response.get(key).toString()); -// } -// return null; - - Config config = - new RSAAutoCertificateConfig.Builder() - .merchantId(wechatpayConfig.getMchId()) - .privateKeyFromPath(wechatpayConfig.getPrivateKeyPath()) - .merchantSerialNumber(wechatpayConfig.getMchSerialNo()) - .apiV3Key(wechatpayConfig.getApiV3Key()) - .build(); - // 构建service - JsapiService service = new JsapiService.Builder().config(config).build(); - // request.setXxx(val)设置所需参数,具体参数可见Request定义 - PrepayRequest request = new PrepayRequest(); - Amount amount = new Amount(); - amount.setTotal(1); - request.setAmount(amount); - request.setAppid(wechatpayConfig.getAppid()); - request.setMchid(wechatpayConfig.getMchId()); - request.setDescription("测试商品标题"); - request.setNotifyUrl(wechatpayConfig.getNotifyDomain()); - request.setOutTradeNo(IdUtil.simpleUUID()); - Payer payer = new Payer(); - payer.setOpenid("oE3S76LTNliVGdi63ciiV9T2pqAU"); - request.setPayer(payer); - // 调用下单方法,得到应答 - PrepayResponse response = service.prepay(request); - log.info("prepayId:" + response.getPrepayId()); - Map map = prepayWithRequestPayment(request); - return map; - } - - /** - * 返回调起支付的参数 - * @return - */ - private Map prepayWithRequestPayment(PrepayRequest request){ - Map map = new HashMap<>(); - JsapiServiceExtension jse = new JsapiServiceExtension.Builder().build(); - PrepayWithRequestPaymentResponse response = jse.prepayWithRequestPayment(request); - map.put("appId",response.getAppId()); - map.put("timeStamp",response.getTimeStamp()); - map.put("nonceStr",response.getNonceStr()); - map.put("package",response.getPackageVal()); - map.put("signType",response.getSignType()); - map.put("paySign",response.getPaySign()); - return map; - } -} diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPayController.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPayController.java index c078de5..20e4d97 100644 --- a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPayController.java +++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/wechart/controller/WechatPayController.java @@ -1,35 +1,57 @@ package com.nu.modules.wechart.controller; import cn.hutool.core.util.IdUtil; -import cn.hutool.json.JSONUtil; -import com.github.wxpay.sdk.WXPayUtil; +import cn.hutool.json.JSONObject; +import com.nu.modules.bizEmployeesInfo.entity.BizEmployeesInfo; import com.nu.modules.wechart.entity.WechatpayConfig; -import com.wechat.pay.contrib.apache.httpclient.util.AesUtil; +import com.wechat.pay.java.core.Config; +import com.wechat.pay.java.core.RSAAutoCertificateConfig; + +import com.wechat.pay.java.core.exception.ServiceException; +import com.wechat.pay.java.core.notification.NotificationConfig; +import com.wechat.pay.java.core.notification.NotificationParser; +import com.wechat.pay.java.service.payments.jsapi.JsapiService; +import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension; +import com.wechat.pay.java.service.payments.jsapi.model.*; +import com.wechat.pay.java.service.payments.model.Transaction; +import io.swagger.models.auth.In; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import javax.annotation.Resource; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.security.GeneralSecurityException; +import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; +import com.wechat.pay.java.core.notification.RequestParam; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.util.EntityUtils; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; @RestController @RequestMapping("/weiXinPay") @Slf4j public class WechatPayController { - - - @Resource + @Autowired public WechatpayConfig wechatpayConfig; @@ -38,308 +60,238 @@ public class WechatPayController { * 调用统一下单API,生成支付二维码 */ @PostMapping("/native") - public Map nativePay() throws Exception { - log.info("生成订单"); - //生成订单 - log.info("存入数据库..."); + public Map nativePay(@RequestBody Map params) throws Exception { - log.info("调用统一下单API"); - //调用统一下单API - HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/native"); + Config config = + new RSAAutoCertificateConfig.Builder() + .merchantId(wechatpayConfig.getMchId()) + .privateKeyFromPath(wechatpayConfig.getPrivateKeyPath()) + .merchantSerialNumber(wechatpayConfig.getMchSerialNo()) + .apiV3Key(wechatpayConfig.getApiV3Key()) + .build(); + // 构建service + JsapiService service = new JsapiService.Builder().config(config).build(); + PrepayRequest request = new PrepayRequest(); + String title = params.get("title"); + String openId = params.get("openId"); + String amountPrice = params.get("amountPrice"); - // 订单号 - String orderNo = IdUtil.simpleUUID(); - // 请求body参数 看官方文档 - Map paramsMap = new HashMap(); - paramsMap.put("appid", wechatpayConfig.getAppid()); - paramsMap.put("mchid", wechatpayConfig.getMchId()); - paramsMap.put("description", "iPhone 15 Pro Max 5G"); - paramsMap.put("out_trade_no", orderNo); - // 回调的地址 - paramsMap.put("notify_url",wechatpayConfig.getNotifyDomain()+"/native/notify"); - Map amountMap = new HashMap(); - //订单总金额,单位为分。 - amountMap.put("total", 1); - //CNY:人民币,境内商户号仅支持人民币。 - amountMap.put("currency", "CNY"); - - paramsMap.put("amount", amountMap); - - - - //将参数转换成json字符串 - String jsonParams = JSONUtil.toJsonStr(paramsMap); - log.info("请求参数:" + jsonParams); - - StringEntity entity = new StringEntity(jsonParams,"utf-8"); - entity.setContentType("application/json"); - httpPost.setEntity(entity); - httpPost.setHeader("Accept", "application/json"); - httpPost.setHeader("Authorization", "WECHATPAY2-SHA256-RSA2048 "+ jsonParams); - //创建httpclient对象 - CloseableHttpClient wxPayClient = HttpClients.createDefault(); - //完成签名并执行请求 - CloseableHttpResponse response = wxPayClient.execute(httpPost); - try { - String bodyAsString = EntityUtils.toString(response.getEntity());//响应体 - int statusCode = response.getStatusLine().getStatusCode();//响应状态码 - if (statusCode == 200) { //处理成功 - log.info("成功, 返回结果 = " + bodyAsString); - } else if (statusCode == 204) { //处理成功,无返回Body - log.info("成功"); - } else { - log.info("Native下单失败,响应码 = " + statusCode+ ",返回结果 = " + - bodyAsString); - throw new IOException("request failed"); - } - //响应结果 - Map resultMap = JSONUtil.toBean(bodyAsString,HashMap.class); - //二维码 - String codeUrl = resultMap.get("code_url"); - Map map = new HashMap<>(); - map.put("codeUrl", codeUrl); - map.put("orderNo", orderNo.toString()); - return map; - } finally { - response.close(); - } - } - /** - * 支付通知 - * 微信支付通过支付通知接口将用户支付成功消息通知给商户 - */ - @PostMapping("/native/notify") - public Map nativeNotify(@RequestBody Map signalRes, HttpServletResponse response){ - Map map = new HashMap<>();//应答对象 - log.info("支付通知的完整数据 ===> {}", signalRes); - try { - //用密文解密出明文 - Map resource=(Map)signalRes.get("resource"); - String ciphertext=resource.get("ciphertext"); - String associatedData=resource.get("associated_data"); - String nonce=resource.get("nonce"); - // 拿到明文 - String plainText=new AesUtil(wechatpayConfig.getApiV3Key().getBytes(StandardCharsets.UTF_8)).decryptToString(associatedData.getBytes(StandardCharsets.UTF_8),nonce.getBytes(StandardCharsets.UTF_8),ciphertext); - //转换 - HashMap data= JSONUtil.toBean(plainText,HashMap.class); - log.info("解密后的完整数据:{}",data); - //处理订单 - log.info("处理订单..."); - //成功应答:成功应答必须为200或204,否则就是失败应答 - response.setStatus(200); - map.put("code", "SUCCESS"); - } catch (GeneralSecurityException e) { - response.setStatus(500); - map.put("code", "FAIL"); - map.put("message","失败"); - } + Amount amount = new Amount(); + amount.setTotal(Integer.parseInt(amountPrice)); + request.setAmount(amount); + request.setAppid(wechatpayConfig.getAppid()); + request.setMchid(wechatpayConfig.getMchId()); + request.setDescription(title); + request.setNotifyUrl(wechatpayConfig.getNotifyDomain()); + request.setOutTradeNo(IdUtil.simpleUUID()); + Payer payer = new Payer(); + payer.setOpenid(openId); + request.setPayer(payer); + // 调用下单方法,得到应答 + PrepayResponse response = service.prepay(request); + log.info("prepayId:" + response.getPrepayId()); + Map map = prepayWithRequestPayment(request,config); return map; } + + + /** + * 返回调起支付的参数 + * @return + */ + private Map prepayWithRequestPayment(PrepayRequest request,Config config){ + Map map = new HashMap<>(); + JsapiServiceExtension jse = new JsapiServiceExtension.Builder().config(config).build(); + PrepayWithRequestPaymentResponse response = jse.prepayWithRequestPayment(request); + map.put("appId",response.getAppId()); + map.put("timeStamp",response.getTimeStamp()); + map.put("nonceStr",response.getNonceStr()); + map.put("package",response.getPackageVal()); + map.put("signType",response.getSignType()); + map.put("paySign",response.getPaySign()); + return map; + } + @PostMapping("/callback") + public String courseNative(HttpServletRequest request, HttpServletResponse response) { + + System.out.println("11111111111111"); + NotificationConfig config = + new RSAAutoCertificateConfig.Builder() + .merchantId(wechatpayConfig.getMchId()) + .apiV3Key(wechatpayConfig.getApiV3Key()) + .merchantSerialNumber(wechatpayConfig.getMchSerialNo()) + .privateKeyFromPath(wechatpayConfig.getPrivateKeyPath()) + .build(); + System.out.println("222222222222222"+config); + // 从请求头中获取信息 + String timestamp = request.getHeader("Wechatpay-Timestamp"); + String nonce = request.getHeader("Wechatpay-Nonce"); + String signature = request.getHeader("Wechatpay-Signature"); + String singType = request.getHeader("Wechatpay-Signature-Type"); + String wechatPayCertificateSerialNumber = request.getHeader("Wechatpay-Serial"); + + System.out.println("333333333333333"); + String requestBody = getRequestBody(request); + + System.out.println("333333333333333"+requestBody); + // 初始化解析器 NotificationParser + NotificationParser parser = new NotificationParser(config); + System.out.println("444444444444444444444" + parser); + RequestParam requestParam = new RequestParam.Builder() + .serialNumber(wechatPayCertificateSerialNumber) + .nonce(nonce) + .signature(signature) + .timestamp(timestamp) + .signType(singType) + .body(requestBody) + .build(); + System.out.println("555555555555555555555" + requestParam); + try { + // 这个Transaction是微信包里面的 + Transaction decryptObject = parser.parse( requestParam, Transaction.class); + + System.out.println("666666666666666666:"+decryptObject); + return decryptObject.getTradeState().toString(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + + } + // 获取请求头里的数据 + private String getRequestBody(HttpServletRequest request) { + StringBuffer sb = new StringBuffer(); + try ( + ServletInputStream inputStream = request.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + ) { + String line; + while ((line = reader.readLine()) != null) { + sb.append(line); + } + } catch (IOException e) { + System.out.println("读取数据流异常:"+e); + } + return sb.toString(); + } /** * 查询订单 - * @param orderNo + * @param params * @return - * @throws Exception */ - @GetMapping("/query/{orderNo}") - public String queryOrder(@PathVariable String orderNo) throws Exception { - log.info("查询订单"); - String url = String.format("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/%s", orderNo); - url = url+"?mchid="+wechatpayConfig.getMchId(); - HttpGet httpGet = new HttpGet(url); - httpGet.setHeader("Accept", "application/json"); + @PostMapping("/queryOrderById") + public Map queryOrderById(@RequestBody Map params) throws Exception { - //创建httpclient对象 - CloseableHttpClient wxPayClient = HttpClients.createDefault(); - //完成签名并执行请求 - CloseableHttpResponse response = wxPayClient.execute(httpGet); - try { - String bodyAsString = EntityUtils.toString(response.getEntity());//响应体 - int statusCode = response.getStatusLine().getStatusCode();//响应状态码 - if (statusCode == 200) { //处理成功 - log.info("成功, 返回结果 = " + bodyAsString); - } else if (statusCode == 204) { //处理成功,无返回Body - log.info("成功"); - } else { - log.info("查单接口调用,响应码 = " + statusCode+ ",返回结果 = " + bodyAsString); - throw new IOException("request failed"); - } - return bodyAsString; - } finally { - response.close(); + + + Config config = + new RSAAutoCertificateConfig.Builder() + .merchantId(wechatpayConfig.getMchId()) + .privateKeyFromPath(wechatpayConfig.getPrivateKeyPath()) + .merchantSerialNumber(wechatpayConfig.getMchSerialNo()) + .apiV3Key(wechatpayConfig.getApiV3Key()) + .build(); + String prepay_id = params.get("prepay_id"); + Map map = new HashMap<>(); + if(StringUtils.isEmpty(prepay_id)){ + map.put("code","400"); + map.put("msg","参数错误,prepay_id为空!"); + return map; } + // 构建service + JsapiService service = new JsapiService.Builder().config(config).build(); + QueryOrderByIdRequest queryRequest = new QueryOrderByIdRequest(); + queryRequest.setMchid(wechatpayConfig.getMchId()); + queryRequest.setTransactionId(prepay_id); - } - /** - * 用户取消订单 - * @param orderNo 订单id - */ - @PostMapping("/cancel/{orderNo}") - public String cancel(@PathVariable String orderNo) throws Exception { - log.info("用户取消订单"); - //创建远程请求对象 - String url = String.format("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/%s/close", orderNo); - HttpPost httpPost = new HttpPost(url); - - //组装json请求体 - Map paramsMap = new HashMap<>(); - paramsMap.put("mchid", wechatpayConfig.getMchId()); - String jsonParams = JSONUtil.toJsonStr(paramsMap); - log.info("请求参数 ===> {}", jsonParams); - - //将请求参数设置到请求对象中 - StringEntity entity = new StringEntity(jsonParams,"utf-8"); - entity.setContentType("application/json"); - httpPost.setEntity(entity); - httpPost.setHeader("Accept", "application/json"); - - //创建httpclient对象 - CloseableHttpClient wxPayClient = HttpClients.createDefault(); - //完成签名并执行请求 - CloseableHttpResponse response = wxPayClient.execute(httpPost); try { - int statusCode = response.getStatusLine().getStatusCode();//响应状态码 - if (statusCode == 200) { //处理成功 - log.info("成功200"); - } else if (statusCode == 204) { //处理成功,无返回Body - log.info("成功204"); - } else { - log.info("Native下单失败,响应码 = " + statusCode); - throw new IOException("request failed"); - } - return "订单取消成功"; - } finally { - response.close(); + Transaction result = service.queryOrderById(queryRequest); + System.out.println(result.getTradeState()); + map.put("code","200"); + map.put("msg",result); + } catch (ServiceException e) { + // API返回失败, 例如ORDER_NOT_EXISTS + System.out.printf("code=[%s], message=[%s]\n", e.getErrorCode(), e.getErrorMessage()); + System.out.printf("reponse body=[%s]\n", e.getResponseBody()); } + return map; } - /** - * 申请退款 - * @param orderNo 订单编号 - */ - @PostMapping("/refunds/{orderNo}") - public Map refunds(@PathVariable String orderNo) throws Exception { - log.info("创建退款单记录..."); - //根据订单编号创建退款单 - log.info("调用退款API"); - //调用统一下单API - HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/refund/domestic/refunds"); + public static final String GET_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token";// 获取access - // 请求body参数 - Map paramsMap = new HashMap(); - paramsMap.put("out_trade_no", orderNo);//订单编号 - - // 给它一个退款单号 - paramsMap.put("out_refund_no", "tk202412120001");//退款单编号 - paramsMap.put("reason", "买了不发货");//退款原因 - paramsMap.put("notify_url", wechatpayConfig.getNotifyDomain()+"/refunds/notify");//退款通知地址 - - Map amountMap = new HashMap(); - amountMap.put("refund", 1);//退款金额 - amountMap.put("total", 1);//原订单金额 - amountMap.put("currency", "CNY");//退款币种 - paramsMap.put("amount", amountMap); - - //将参数转换成json字符串 - String jsonParams = JSONUtil.toJsonStr(paramsMap); - log.info("请求参数 ===> {}" + jsonParams); - - StringEntity entity = new StringEntity(jsonParams, "utf-8"); - entity.setContentType("application/json");//设置请求报文格式 - httpPost.setEntity(entity);//将请求报文放入请求对象 - httpPost.setHeader("Accept", "application/json");//设置响应报文格式 - - //创建httpclient对象 - CloseableHttpClient wxPayClient = HttpClients.createDefault(); - //完成签名并执行请求,并完成验签 - CloseableHttpResponse response = wxPayClient.execute(httpPost); - - try { - //解析响应结果 - String bodyAsString = EntityUtils.toString(response.getEntity()); - int statusCode = response.getStatusLine().getStatusCode(); - if (statusCode == 200) { - log.info("成功, 退款返回结果 = " + bodyAsString); - } else if (statusCode == 204) { - log.info("成功"); - } else { - throw new RuntimeException("退款异常, 响应码 = " + statusCode + ", 退款返回结果 = " + bodyAsString); + // 获取token + public static String getToken(String apiurl, String appid, String secret) + { + String turl = String.format( + "%s?grant_type=client_credential&appid=%s&secret=%s", apiurl, + appid, secret); + System.out.println("turl:" + turl); + HttpClient client = new DefaultHttpClient(); + HttpGet get = new HttpGet(turl); + System.out.println("get:" + get); + JsonParser jsonparer = new JsonParser();// 初始化解析json格式的对象 + String result = null; + try + { + HttpResponse res = client.execute(get); + System.out.println("res:" + res); + String responseContent = null; // 响应内容 + HttpEntity entity = res.getEntity(); + System.out.println("entity:" + entity); + responseContent = EntityUtils.toString(entity, "UTF-8"); + JsonObject json = jsonparer.parse(responseContent) + .getAsJsonObject(); + System.out.println("json:" + json); + // 将json字符串转换为json对象 + if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) + { + if (json.get("errcode") != null) + {// 错误时微信会返回错误码等信息,{"errcode":40013,"errmsg":"invalid appid"} + } + else + {// 正常情况下{"access_token":"ACCESS_TOKEN","expires_in":7200} + result = json.get("access_token").getAsString(); + } } - log.info("更新订单状态......"); - log.info("更新退款单......"); - return JSONUtil.toBean(bodyAsString,Map.class); - } finally { - response.close(); } - } - /** - * 退款结果通知 - * 退款状态改变后,微信会把相关退款结果发送给商户。 - */ - @PostMapping("/refunds/notify") - public String refundsNotify(@RequestBody Map signalRes, HttpServletResponse response){ - log.info("退款通知执行"); - Map map = new HashMap<>();//应答对象 - try { - Map resource=(Map)signalRes.get("resource"); - String ciphertext=resource.get("ciphertext"); - String associatedData=resource.get("associated_data"); - String nonce=resource.get("nonce"); - // 拿到明文 - String plainText=new AesUtil(wechatpayConfig.getApiV3Key().getBytes(StandardCharsets.UTF_8)).decryptToString(associatedData.getBytes(StandardCharsets.UTF_8),nonce.getBytes(StandardCharsets.UTF_8),ciphertext); - - //转换 - HashMap data= JSONUtil.toBean(plainText,HashMap.class); - log.info("解密后的完整数据:{}",data); - log.info("处理退款单................................"); - log.info("更新订单状态................................"); - - //成功应答 - response.setStatus(200); - map.put("code", "SUCCESS"); - map.put("message", "成功"); - return JSONUtil.toJsonStr(map); - } catch (Exception e) { + catch (Exception e) + { e.printStackTrace(); - //失败应答 - response.setStatus(500); - map.put("code", "ERROR"); - map.put("message", "失败"); - return JSONUtil.toJsonStr(map); } - } - /** - * 查询退款 - * @param refundNo 退款订单 - */ - @GetMapping("/query-refund/{refundNo}") - public String queryRefund(@PathVariable String refundNo) throws Exception { - - log.info("查询退款接口调用 ===> {}", refundNo); - String url = String.format("https://api.mch.weixin.qq.com/v3/refund/domestic/refunds/%s", refundNo); - //创建远程Get 请求对象 - HttpGet httpGet = new HttpGet(url); - httpGet.setHeader("Accept", "application/json"); - //创建httpclient对象 - CloseableHttpClient wxPayClient = HttpClients.createDefault(); - //完成签名并执行请求 - CloseableHttpResponse response = wxPayClient.execute(httpGet); - try { - String bodyAsString = EntityUtils.toString(response.getEntity()); - int statusCode = response.getStatusLine().getStatusCode(); - if (statusCode == 200) { - log.info("成功, 查询退款返回结果 = " + bodyAsString); - } else if (statusCode == 204) { - log.info("成功"); - } else { - throw new RuntimeException("查询退款异常, 响应码 = " + statusCode+ ", 查询退款返回结果 = " + bodyAsString); - } - return bodyAsString; - } finally { - response.close(); + finally + { + // 关闭连接 ,释放资源 + client.getConnectionManager().shutdown(); + return result; } } + + @PostMapping("/getUserInfo") + public JSONObject getWxUserInfo(@RequestBody Map params) throws Exception { +// String accessToken = getToken(GET_TOKEN_URL, "wx8fc3e4305d2fbf0b", "3bf3dd4ec72f591432db6b28c2c044e5");// 获取token + String accessToken = params.get("access_token"); + String openid = params.get("openid"); + System.out.println("---------token-------"+accessToken); + // 构造请求URL + String requestUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openid + "&lang=zh_CN"; + + // 发送HTTP请求,并获取返回结果 + HttpGet httpGet = new HttpGet(requestUrl); + System.out.println("---------httpGet-------"+httpGet); + CloseableHttpClient httpClient = HttpClients.createDefault(); + System.out.println("---------httpClient-------"+httpClient); + CloseableHttpResponse httpResponse = httpClient.execute(httpGet); + System.out.println("---------httpResponse-------"+httpResponse); + HttpEntity httpEntity = httpResponse.getEntity(); + System.out.println("---------httpEntity-------"+httpEntity); + String responseJson = EntityUtils.toString(httpEntity, "UTF-8"); + System.out.println("---------responseJson-------"+responseJson); + // 解析返回结果,获取手机号 + JSONObject jsonObject = new JSONObject(responseJson); + System.out.println("---------jsonObject-------"+jsonObject); + return jsonObject; + } } diff --git a/nursing-unit-system/nu-system-start/src/main/resources/application-dev.yml b/nursing-unit-system/nu-system-start/src/main/resources/application-dev.yml index 4e27e04..f9a86b5 100644 --- a/nursing-unit-system/nu-system-start/src/main/resources/application-dev.yml +++ b/nursing-unit-system/nu-system-start/src/main/resources/application-dev.yml @@ -385,6 +385,6 @@ wxpay: # 商户API证书序列号 mch-serial-no: 3E51C9D24F64CE50E9273E544561D29684AB21C7 # 接收结果通知地址 - notify-domain: http://r2agtr.natappfree.cc + notify-domain: https://www.focusnu.com/nursing-unit_0010507/weiXinPay/wx/callback # 商户私钥文件路径 private-key-path: c://apiclient_key.pem \ No newline at end of file diff --git a/nursing-unit-system/nu-system-start/src/main/resources/application-uat.yml b/nursing-unit-system/nu-system-start/src/main/resources/application-uat.yml index a4b7a0b..3647ebf 100644 --- a/nursing-unit-system/nu-system-start/src/main/resources/application-uat.yml +++ b/nursing-unit-system/nu-system-start/src/main/resources/application-uat.yml @@ -372,3 +372,18 @@ tplink: username: administrator password: Root@123.. uploadpath: / + +# 微信支付 +wxpay: + # APIv3密钥 + api-v3-key: asdfiuzwe3534565478WETDSAFRWEq1E + # APPID + appid: wx8fc3e4305d2fbf0b + # 商户ID + mch-id: 1717618860 + # 商户API证书序列号 + mch-serial-no: 3E51C9D24F64CE50E9273E544561D29684AB21C7 + # 接收结果通知地址 + notify-domain: https://www.focusnu.com/nursing-unit_0010507/weiXinPay/callback + # 商户私钥文件路径 + private-key-path: /opt/nu001/apiclient_key.pem \ No newline at end of file