From df4733091b30b0434a04dacd0e844663114d4cfe Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期三, 09 七月 2025 17:51:56 +0800 Subject: [PATCH] 修改支付宝支付和bug修改 --- cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java | 279 +++++++++++++++++++++++++++---------------------------- 1 files changed, 139 insertions(+), 140 deletions(-) diff --git a/cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java b/cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java index 4b32bb9..733d682 100644 --- a/cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java +++ b/cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java @@ -4,10 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.alipay.api.AlipayApiException; -import com.alipay.api.AlipayClient; -import com.alipay.api.CertAlipayRequest; -import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.*; import com.alipay.api.domain.*; import com.alipay.api.request.*; import com.alipay.api.response.*; @@ -26,6 +23,10 @@ //import com.github.binarywang.wxpay.service.ProfitSharingV3Service; //import com.github.binarywang.wxpay.service.WxPayService; +import com.dsh.account.util.wx.PartnerAppPrepay; +import com.dsh.account.util.wx.WXPayUtility; +import com.dsh.account.util.wx.WeChatV3SignUtil; +import com.dsh.account.util.wx.WxV3PayConfig; import org.apache.commons.collections.map.HashedMap; import org.apache.http.client.methods.CloseableHttpResponse; import org.bouncycastle.jce.provider.BouncyCastleProvider; @@ -55,7 +56,21 @@ import java.util.*; import static com.dsh.account.util.akeylogin.Md5Util.byteArrayToHexString; +import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayClient; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.AlipayConfig; +import com.alipay.api.domain.SettleDetailInfo; +import com.alipay.api.response.AlipayTradeSettleConfirmResponse; +import com.alipay.api.domain.SettleConfirmExtendParams; +import com.alipay.api.request.AlipayTradeSettleConfirmRequest; +import com.alipay.api.domain.AlipayTradeSettleConfirmModel; +import com.alipay.api.domain.SettleInfo; +import com.alipay.api.FileItem; +import java.util.Base64; +import java.util.ArrayList; +import java.util.List; /** * 第三方支付工具类 */ @@ -181,57 +196,8 @@ /** * 支付宝支付 */ - public ResultUtil alipay(String smid,String body, String subject, String passbackParams, String outTradeNo, String amount, String notifyUrl) { -// //构造client -// CertAlipayRequest certAlipayRequest = new CertAlipayRequest (); -// //设置网关地址 -// certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); -// //设置应用Id -// certAlipayRequest.setAppId(aliAppid); -// //设置应用私钥 -// certAlipayRequest.setPrivateKey(appPrivateKey); -// //设置请求格式,固定值json -// certAlipayRequest.setFormat("json"); -// //设置字符集 -// certAlipayRequest.setCharset("UTF-8"); -// //设置签名类型 -// certAlipayRequest.setSignType("RSA2"); -// //设置应用公钥证书路径 -// certAlipayRequest.setCertPath(app_cert_path); -// //设置支付宝公钥证书路径 -// certAlipayRequest.setAlipayPublicCertPath(alipay_cert_path); -// //设置支付宝根证书路径 -// certAlipayRequest.setRootCertPath(alipay_root_cert_path); -// //构造client -// AlipayClient alipayClient = null; -// try { -// alipayClient = new DefaultAlipayClient(certAlipayRequest); -// } catch (AlipayApiException e) { -// e.printStackTrace(); -// } -// //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay -// AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest (); -// //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 -// AlipayTradeAppPayModel model = new AlipayTradeAppPayModel (); -// model.setBody(body); -// model.setSubject (subject); -// model.setOutTradeNo (outTradeNo); -// model.setTimeoutExpress ("30m" ); -// model.setTotalAmount (amount); -// model.setProductCode ( "QUICK_MSECURITY_PAY" ); -// model.setPassbackParams(passbackParams);//自定义参数 -// request.setBizModel ( model ); -// request.setNotifyUrl (callbackPath + notifyUrl); -// try { -// //这里和普通的接口调用不同,使用的是sdkExecute -// AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); -// Map<String, String> map = new HashMap<>(); -// map.put("orderString", response.getBody()); -// System.out.println(map);//就是orderString 可以直接给客户端请求,无需再做处理。 -// return ResultUtil.success(map); -// } catch (AlipayApiException e ) { -// e.printStackTrace(); -// } + public ResultUtil alipay(String smid,String body, String subject, + String passbackParams, String outTradeNo, String amount, String notifyUrl) { //实例化客户端 AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", aliAppid, appPrivateKey, "json", "UTF-8", alipay_public_key, "RSA2"); @@ -258,49 +224,15 @@ SubMerchant subMerchant = new SubMerchant(); subMerchant.setMerchantId(smid); model.setSubMerchant(subMerchant); - ExtendParams extendParams = new ExtendParams(); - extendParams.setRoyaltyFreeze("true");// 冻结资金 用于后续分账处理 - model.setExtendParams(extendParams); - //分账 -// Integer coursePackagePayments = coursePackageClient.queryByCode(outTradeNo); -// Integer paymentCompetitions = competitionsClient.queryByCode(outTradeNo); -// Integer siteBookings = siteClient.queryByCode(outTradeNo); -// List<Integer> stores = new ArrayList<>(); -// stores.add(coursePackagePayments); -// stores.add(paymentCompetitions); -// stores.add(siteBookings); -// -// OperatorUser operatorUser = siteClient.queryOperator(stores); -// -// String alipayProportion = operatorUser.getAlipayProportion(); -// String alipayNum = operatorUser.getAlipayNum(); -// -// ExtendParams extendParams = new ExtendParams(); -//// extendParams.setSysServiceProviderId("YOUR_SERVICE_PROVIDER_ID"); -// model.setExtendParams(extendParams); -// -// RoyaltyInfo royaltyInfo = new RoyaltyInfo(); -//// royaltyInfo.setRoyaltyType("transfer"); -// -// -// RoyaltyDetailInfos royaltyDetailInfo1 = new RoyaltyDetailInfos(); -// royaltyDetailInfo1.setTransOutType("userId"); -// royaltyDetailInfo1.setTransOut(aliAppid); -// royaltyDetailInfo1.setTransInType("loginName"); -// royaltyDetailInfo1.setTransIn("18398968484"); -// -// royaltyDetailInfo1.setDesc("分账描述1"); -// royaltyDetailInfo1.setAmountPercentage(alipayProportion); -// List<RoyaltyDetailInfos> royaltyDetailInfos = new ArrayList<>(); -// -// -// -// royaltyInfo.setRoyaltyDetailInfos(royaltyDetailInfos); -// model.setRoyaltyInfo(royaltyInfo); -// System.err.println("=================="+royaltyInfo); - // + + if (!smid.equals("2088330203191220")){ + ExtendParams extendParams = new ExtendParams(); + extendParams.setRoyaltyFreeze("true"); + model.setExtendParams(extendParams); + } request.setBizModel(model); request.setNotifyUrl(callbackPath + notifyUrl); + System.err.println("回调地址:"+callbackPath + notifyUrl); try { //这里和普通的接口调用不同,使用的是sdkExecute AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); @@ -349,45 +281,63 @@ return ResultUtil.success(alipay_trade_precreate_response.getString("qr_code")); } // 直付通模式 alipay.trade.settle.confirm(统一收单确认结算接口) - public ResultUtil confirm(String smid1,String code, String outTradeNo, String amount) { - AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", - aliAppid, - appPrivateKey, - "json", - "GBK", - alipay_public_key, - "RSA2"); + public ResultUtil confirm(String smid1,String code, String outTradeNo, String amount) throws AlipayApiException { + // 初始化SDK + AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); + + // 构造请求参数以调用接口 AlipayTradeSettleConfirmRequest request = new AlipayTradeSettleConfirmRequest(); - request.setBizContent("{" + - " \"out_request_no\":\""+code+"\"," + - " \"trade_no\":\""+outTradeNo+"\"," + - " \"settle_info\":{" + - " \"settle_detail_infos\":[" + - " {" + - " \"trans_in_type\":\"defaultSettle\"," + - " \"settle_entity_id\":\""+smid1+"\"," + - " \"settle_entity_type\":\"SecondMerchant\"," + - " \"amount\":"+amount+"," + - " }" + - " ]" + - " }," + - " \"extend_params\":{" + - " \"royalty_freeze\":\"false\"" + - " }" + - "}"); - AlipayTradeSettleConfirmResponse response = null; - try { - response = alipayClient.execute(request); - } catch (AlipayApiException e) { - e.printStackTrace(); - } - if(response.isSuccess()){ + AlipayTradeSettleConfirmModel model = new AlipayTradeSettleConfirmModel(); + + // 设置确认结算请求流水号 + model.setOutRequestNo(code); + + // 设置支付宝交易号 + model.setTradeNo(outTradeNo); + + // 设置描述结算信息 + SettleInfo settleInfo = new SettleInfo(); + List<SettleDetailInfo> settleDetailInfos = new ArrayList<SettleDetailInfo>(); + SettleDetailInfo settleDetailInfos0 = new SettleDetailInfo(); + settleDetailInfos0.setAmount(amount); + settleDetailInfos0.setTransIn(smid1); + settleDetailInfos0.setSettleEntityType("SecondMerchant"); + settleDetailInfos0.setSettleEntityId(smid1); + settleDetailInfos0.setTransInType("defaultSettle"); + settleDetailInfos.add(settleDetailInfos0); + settleInfo.setSettleDetailInfos(settleDetailInfos); + model.setSettleInfo(settleInfo); + request.setBizModel(model); + System.err.println("结算金额"+amount); + // 第三方代调用模式下请设置app_auth_token + // request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->"); + + AlipayTradeSettleConfirmResponse response = alipayClient.execute(request); + System.out.println("返回体"+response.getBody()); + + + if (response.isSuccess()) { System.out.println("调用成功"); - return ResultUtil.success(); } else { System.out.println("调用失败"); - return ResultUtil.error("出现问题啦"); + // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接 + // String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response); + // System.out.println(diagnosisUrl); } + return ResultUtil.success(response.getBody()); + } + private static AlipayConfig getAlipayConfig() { + String privateKey = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCi5i9nW/hGLJ3A06cZxTQdviFC7THpdSihoTYGLr9q006hu0V26ecBMY/o4w5bvIX0Ok/yofmZsVcCJpAPvbXL/uqVrIjnRRxXiaeBFThlxoBUTdunvbUSDYfzlEhJr5NvUKI6H6lz2niXlQGx4qy8Hau4ccWit9kM8jwUvsBVQoFgJA+xrjMvooA7YLopQtpOD+UJr5thApTSf1xrnr1W12yolTLEH15JmNV372cqXrYUuqnY0QsaPtxeqJUGAOcGdVLllQ7easEznP8DFBvDdHATcmp2SHNQDUEWN6MCVPbMgY06NQVqAXxqjTAYSVh+6TRu6bofPmpYC3TZB003AgMBAAECggEBAJAcR2+PA3NBYUYHeFrqBRMS8uX8ZR19kjZ7IgoSLTFaQsP9opRylPSPXhrPVBKAE5leRQAHn4MCSlESwHvMfxo7KFjFTFAc6dffZZpipYQUOc9bGampwJh58/3e/pyBgVMG6J23CPf/HJQtNFSkjd/V9+ayb/9l2dUEL3bC0fAZ/dbx8HsxdLw8wn3fLlWLj68hOMqa2deCZe3JdSVsPbeWqkh56FFsMLug0Nd+Ar4TgRl9/jnhXF0JWiD0LmPUYLhboY7EfUBzN4w1iYbDi1P+3zvoOYsiVKAXox9GMhQ2VzOO2UcSTuizSza2e98mGpabl/GpKmCz+RDFjtkX6eECgYEA2MyCij65eO3aGIm3FUe93DULRBYTfX8qJQSJq2WOWA3mmQlEW6L3O2B5/lG2h+8WmN6iLEs9eHpgycGYp7vAqgrANEn16ACVcuyx0scFtrZfZ+kmHMzFfiUWxJjVYk/6YngsGVBLdw6ueM42C8TTP67X9tU5TdVGoGWuqEj4W98CgYEAwFqwprXOch5Pqk/RPbb49r0Ou03K/UbciWnWWKzUhFFNS8MdlQPoDvQZbMwHLeWsa2VhaKITK3x5biLQb3U+0GLOn6lTvEyrEUH+ucREyLgVYTRAvwBPtnvlrzpyxPk2HnslQjju8WrvvLLBMKWUjlTrTOzhaHT21gz3pHMiOakCgYEAhLmfaXdBITGshb054sNLDtdCkGpbgEcrzAHdLps769iGxkYQHXHFngpQZUwtTUcoNGqIKknd1jZFrv7gsD+XkgKG7PwimehRlkwmCX5ilxtLiVgJRzRt6+5U5AMVD90a0tHzXYP0z2yjj73fBJF5KtGl0a10KZxaYrQdm1UhB00CgYBZZgzx/k9rtHC8LAqIj1CYhHejT92G53c6Gkl3vyOqN4sgKhfGmSEySfrDGPRBPZxr8ZtbIPCd5mUdberH0osWGMYFaJI1UsCy7aQwvGpniz7MhZeN7dweaOjwDs8mgtjHQ96mL4XGCDhR0BZ/wIURvZ/6iaGdhbbu9unlsWj3uQKBgQCmZYdsbbZkd3ev6f8rwyvMz+DrCQyYpY44cegBYuJgrZiQnL2fJioeN7ixX0UM48SfwsZEIrzshP/LGAwnc2MdjxKUl4jLN8SEe0NAjXOnz9Zaw740+aOmLpXcLWdP4uM2gIhWsvW1tEkQZCXmm7c9s/RsU8Pmzv+YL3+fSijOzA=="; + String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmu8n/4yTHWbn7VOrNc9OsLtDL1bEQ8gC1dHkj8Wy5z0mkaOsjJRIG/28ze12M0V8jdCKuuDr5Z1OPKiqf+XO3ypguEh+mYUVMBM/cZodDFQfTY1TKLWjvQCuaqlA+QUTCK6f7T7stsgyQ1o9Jj0rXZDz6PM4QHSTzjrLIBaeqM5WIBvH+fy/X+QG5Utd+/UT0kc0JyvuKhZ65yVUd/C9VcwJJAPliRsAQNrqYterwAJ9zvw9tF11wj9W0XgJ8Ccu4x3gR1vrlLRJJo/OA97RmxPQ+5hSacWQZCUd1dwiBq+YCrKVHGTj14izRHXrLc0yBlRXo7tBOIqcy3IsvKVthQIDAQAB"; + AlipayConfig alipayConfig = new AlipayConfig(); + alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do"); + alipayConfig.setAppId("2021004105665036"); + alipayConfig.setPrivateKey(privateKey); + alipayConfig.setFormat("json"); + alipayConfig.setAlipayPublicKey(alipayPublicKey); + alipayConfig.setCharset("UTF-8"); + alipayConfig.setSignType("RSA2"); + return alipayConfig; } // 资金冻结 做分账处理 public ResultUtil confirm1(String smid,String code, String outTradeNo, String amount) { @@ -547,17 +497,10 @@ map.put("appid", appid); map.put("mch_id", mchId); map.put("nonce_str", nonce_str); - String temp = ""; - if (body.split("-").length>1){ - temp = body.split("-")[1]; - map.put("body", body.split("-")[0]); - }else{ + map.put("body", body); - } - if (StringUtils.hasLength(temp) && temp.equals("1")){ - // 添加分账标识 - map.put("profit_sharing", "Y"); - } + + map.put("attach", attach);//存储订单id map.put("out_trade_no", out_trade_no);//存储的订单code map.put("total_fee", i); @@ -649,6 +592,62 @@ return ResultUtil.error(map1.get("return_msg"), new JSONObject()); } } + public ResultUtil weixinpayV3(String subMchid,String description, String outTradeNo, String notifyUrl, String totalFee) throws Exception { + int i = new BigDecimal(totalFee).multiply(new BigDecimal("100")).intValue(); + // TODO: 请准备商户开发必要参数,参考:https://pay.weixin.qq.com/doc/v3/partner/4013080340 + PartnerAppPrepay client = new PartnerAppPrepay( +// "1681873607", // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考https://pay.weixin.qq.com/doc/v3/partner/4013080340 +// "55714944F7A7E52526F708280B176DCC838F371A", // 商户API证书序列号,如何获取请参考https://pay.weixin.qq.com/doc/v3/partner/4013058924 +// "E:\\wanpai\\1681873607_20250424_cert\\apiclient_key.pem", // 商户API证书私钥文件路径,本地文件路径 +// "PUB_KEY_ID_0116818736072025042400351694002605", // 微信支付公钥ID,如何获取请参考https://pay.weixin.qq.com/doc/v3/partner/4013038589 +// "E:\\wanpai\\pub_key.pem" // 微信支付公钥文件路径,本地文件路径 + + "1681873607", // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考https://pay.weixin.qq.com/doc/v3/partner/4013080340 + "55714944F7A7E52526F708280B176DCC838F371A", // 商户API证书序列号,如何获取请参考https://pay.weixin.qq.com/doc/v3/partner/4013058924 + "/usr/playpai/server/wxV3/1681873607_20250424_cert/apiclient_key.pem", // 商户API证书私钥文件路径,本地文件路径 + "PUB_KEY_ID_0116818736072025042400351694002605", // 微信支付公钥ID,如何获取请参考https://pay.weixin.qq.com/doc/v3/partner/4013038589 + "/usr/playpai/server/wxV3/pub_key.pem" // 微信支付公钥文件路径,本地文件路径 + ); + + PartnerAppPrepay.PartnerAPIv3CommonPrepayRequest request = new PartnerAppPrepay.PartnerAPIv3CommonPrepayRequest(); + request.spAppid = appid;// appid + request.spMchid = WxV3PayConfig.Mch_ID;// 服务商商户号 + request.subMchid = subMchid;// 子商户号 + request.description = description;// 描述 + request.outTradeNo = outTradeNo;// 订单号 + request.notifyUrl = callbackPath+notifyUrl;// 回调地址 + request.amount = new PartnerAppPrepay.CommonAmountInfo(); + request.amount.total = (long) i;// 金额 单位分 + request.amount.currency = "CNY"; + String prepayId =""; + Map<String, Object> map3 = new HashMap<>(); + try { + PartnerAppPrepay.PartnerAPIv3AppPrepayResponse response = client.run(request); + // TODO: 请求成功,继续业务逻辑 + System.err.println("微信申请成功,预支付ID: " + response.prepayId); + prepayId = response.prepayId; + } catch (WXPayUtility.ApiException e) { + // TODO: 请求失败,根据状态码执行不同的逻辑 + e.printStackTrace(); + } + map3.put("appid", appid); + map3.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000)); + String nonce_str = UUIDUtil.getRandomCode(16); + map3.put("noncestr", nonce_str); + map3.put("prepayid", prepayId); + // 构造待签名字符串 + String message = WeChatV3SignUtil.buildSignMessage(map3); + // 私钥路径(pem 文件) + String privateKeyPath = "/usr/playpai/server/wxV3/1681873607_20250424_cert/apiclient_key.pem"; +// String privateKeyPath = "E:\\wanpai\\1681873607_20250424_cert\\apiclient_key.pem"; + // 生成签名 + String sign = WeChatV3SignUtil.signWithPrivateKey(message, privateKeyPath); + map3.put("sign", sign); + map3.put("package", "Sign=WXPay"); + map3.put("partnerid", WxV3PayConfig.Mch_ID);// 服务商商户号 + System.err.println(map3); + return ResultUtil.success(map3); + } @Resource -- Gitblit v1.7.1