工商银行微信支付回调问题处理

This commit is contained in:
彭勇平 2025-03-28 15:33:54 +08:00
parent 4901db65ac
commit a0e8cc603a
3 changed files with 123 additions and 35 deletions

View file

@ -1,5 +1,6 @@
package com.sqx.modules.pay.controller.app; package com.sqx.modules.pay.controller.app;
import com.alibaba.fastjson.JSONObject;
import com.sqx.common.utils.Result; import com.sqx.common.utils.Result;
import com.sqx.modules.app.annotation.Login; import com.sqx.modules.app.annotation.Login;
import com.sqx.modules.orders.entity.Orders; import com.sqx.modules.orders.entity.Orders;
@ -17,6 +18,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.*; import java.io.*;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* @author fang * @author fang
@ -143,18 +145,21 @@ public class ApiWeiXinPayController {
@PostMapping("/notifyJsApi") @PostMapping("/notifyJsApi")
@ApiOperation("微信回调") @ApiOperation("微信回调")
public void notifyJsApi(HttpServletRequest req, HttpServletResponse resp) { public void notifyJsApi(@RequestParam Map<String, String> params, HttpServletResponse resp) {
PrintWriter out = null; PrintWriter out = null;
try { try {
String result = wxService.icbcPayBack(req,3); log.info("icbc支付回调参数: {}", JSONObject.toJSONString(params));
String result = wxService.icbcPayBack(params,3);
resp.setContentType("application/json; charset=utf-8"); resp.setContentType("application/json; charset=utf-8");
out = resp.getWriter(); out = resp.getWriter();
out.write(result); out.write(result);
} catch (Exception e) { } catch (Exception e) {
log.error("【工商银行】微信支付回调处理失败,请检查原因!!!,{}", e.getMessage()); log.error("【工商银行】微信支付回调处理失败,请检查原因!!!,{}", e.getMessage());
} finally { } finally {
out.flush(); if(out != null){
out.close(); out.flush();
out.close();
}
} }
// String resXml = ""; // String resXml = "";
// try { // try {
@ -192,10 +197,11 @@ public class ApiWeiXinPayController {
@PostMapping("/notifyJsApiShop") @PostMapping("/notifyJsApiShop")
@ApiOperation("微信回调") @ApiOperation("微信回调")
public void notifyJsApiShop(HttpServletRequest req, HttpServletResponse resp) { public void notifyJsApiShop(@RequestParam Map<String, String> params, HttpServletResponse resp) {
PrintWriter out = null; PrintWriter out = null;
try { try {
String result = wxService.icbcPayBack(req,4); log.info("icbc支付回调参数: {}", JSONObject.toJSONString(params));
String result = wxService.icbcPayBack(params,4);
resp.setContentType("application/json; charset=utf-8"); resp.setContentType("application/json; charset=utf-8");
out = resp.getWriter(); out = resp.getWriter();
out.write(result); out.write(result);

View file

@ -3,9 +3,11 @@ package com.sqx.modules.pay.service;
import com.sqx.common.utils.Result; import com.sqx.common.utils.Result;
import com.sqx.modules.orders.entity.Orders; import com.sqx.modules.orders.entity.Orders;
import com.sqx.modules.task.entity.HelpOrder; import com.sqx.modules.task.entity.HelpOrder;
import org.springframework.web.bind.annotation.RequestBody;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
@ -26,7 +28,7 @@ public interface WxService {
String payBack(String resXml,Integer type); String payBack(String resXml,Integer type);
String icbcPayBack(HttpServletRequest request, Integer type) throws Exception; String icbcPayBack(@RequestBody Map<String, String> params, Integer type) throws Exception;
boolean refund(String ordersNo); boolean refund(String ordersNo);

View file

@ -12,7 +12,9 @@ import com.github.wxpay.sdk.WXPayUtil;
import com.icbc.api.DefaultIcbcClient; import com.icbc.api.DefaultIcbcClient;
import com.icbc.api.IcbcApiException; import com.icbc.api.IcbcApiException;
import com.icbc.api.IcbcConstants; import com.icbc.api.IcbcConstants;
import com.icbc.api.UiIcbcClient;
import com.icbc.api.request.CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1; import com.icbc.api.request.CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1;
import com.icbc.api.request.CardbusinessAggregatepayB2cOnlineUiConsumepurchaseshowpayRequestV1;
import com.icbc.api.response.CardbusinessAggregatepayB2cOnlineConsumepurchaseResponseV1; import com.icbc.api.response.CardbusinessAggregatepayB2cOnlineConsumepurchaseResponseV1;
import com.icbc.api.utils.IcbcSignature; import com.icbc.api.utils.IcbcSignature;
import com.icbc.api.utils.WebUtils; import com.icbc.api.utils.WebUtils;
@ -60,6 +62,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -663,16 +666,19 @@ public class WxServiceImpl implements WxService {
return xmlBack; return xmlBack;
} }
private static final String ICBC_MCH_ID = "150537540002";//商户编号 // private static final String ICBC_MCH_ID = "150537540002";//商户编号
private static final String ICBC_MER_PRTCL_NO = "150537540002";//收单产品协议编号 private static final String ICBC_MCH_ID = "150537540003";//商户编号
// private static final String ICBC_MER_PRTCL_NO = "150537540004";//收单产品协议编号
private static final String ICBC_MER_PRTCL_NO = "150537540003";//收单产品协议编号
private static final String ICBC_APPID = "11000000000000051225"; private static final String ICBC_APPID = "11000000000000051225";
private static final String MY_PRIVATE_KEY = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCx24qZDrnPwAOwFJDmBcdEn+gkPj3tIfDi9nptHobqIPIwwZwtsQ20FxzYTG4QCcuFw4iDGb/VL4oxY4cjkWKjlAkVe6eyFdffiA2+toXK/Nu/U/UkcknHxeNE8CGyf/iV+yEwEiiWZ7zjNvXPGcWG+6IZkk4H9iOKwh2xbk3sd50em95meIxgKDOsaKoJ3VvCJs4ajNt8ly+V6B/at7qMF20XoQG7Qtmm1FCv05QVEH3JIYLg7N4TllYEAxKrTz4Wr4/qiiQ/dVRl6pxkDodJ/8UraFfYbsuOizeGZpAaj8lgkljwD9k32ov1X3GSNbG8EZTMJ7mSH5VWGI+w1Eh7AgMBAAECggEAZQwoOEFHjCK5daaZlDYgOnrnNwAtyrYH18rVT32ShR5muxCknMkE0hZ3iuQRfAc0nDC1NFbCyGoUB29WbfzBn9IRPyVb5y/Fz/fKZ1nntaXna1JV6nkMNfXV42rSmklegEeHWXpXmOwjQqwNB7bKpJ/+Pq0CrD9JfiI/IHlcyEVShNTR3SCxpye8Vkca1/HOBcI/aRLJ0t/xkKBXfkJOpUo7QLvEwhqZN0m/Z+AE84TNNscKNDiNmWDCfntFFzuFIbjYXUrkZwWNDU+LCYtOZ6/WXLrFpp2UoeVdJACBxAHqmaNSZltgavH3swDkMswSwj/gt7lK4k/U8rpp3uw3sQKBgQDW5ddgyyXoADRLyvNiqjRNBayaekdgUZwjs3mMQ9tkAuk+hWCGPNHAM+iIkSmjP5x3ajBrLKAPpN1/iJ0aloi9CAICXCoD4B/lfANc6njZxeIWKEZjV4hUYfXsGp57EHGlgDlAKk727IxfsHJeW7gq9KX5aao1qHyT8Yo8FhyzjwKBgQDT4BQ2o4rBCF0okJDJXgF9WexI3LD+N02Tfd9Yuz8zWaM5wgPw2EDPnwp7jrlA6IcCgn/xlAWCZAHzvD/CIg33BH0bqB9LDkJHHNwmCscczw55jwa2RXJfQFDSZ2lFggAB/01ByyU0ex1Px/Q+p2ykueYbWmQV8xst7ZL03Yu2VQKBgF1417fYZQKGpDibbEXsNpeR8kO3EDjLBplYxXPHSDQ2N/Hj3dpFtg5eBbTxPyUs1Af0/l5/qJdlZJrGd19LPurKAuW35OaOpBETYfsWWb6Pngl5NzSarEfX3Dn4UhrBSk1senp4bKRmu6AbhYOZbX/xrgfQeCKiyJ0pILGGBLHtAoGBAJiHXIXpPl6w8r/dMx6EOnZPYjciCZk5nvNrTnrGcj05brSJ4+RjCmVtjVJd8Se1PlykLg9wDHdOH8mj4BKWCY+m/5oFcmHKJhSjxijs4WLv/O+t85sMa8X+uzB9md+cMv09GhUfde1OJE/nFwJz7Va5LdrLO/pBRXPO8FivlYDxAoGBAKnjcXz3rDyXIQZSG7f81P7FudPeHbX4aywI9yWHzXjcHADVwniEBLxR0oE35Wu0gAcmnGB7aJxNqBgIBrc4VU8yJA896gKaneq20JCVKBcfB6EuHJwK31MF/YCA4JnHhuqaJ91JMnOWHkn/6DJlxbvIc+VDtW7czkvhgFS73JDN"; //应用私钥 private static final String MY_PRIVATE_KEY = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCx24qZDrnPwAOwFJDmBcdEn+gkPj3tIfDi9nptHobqIPIwwZwtsQ20FxzYTG4QCcuFw4iDGb/VL4oxY4cjkWKjlAkVe6eyFdffiA2+toXK/Nu/U/UkcknHxeNE8CGyf/iV+yEwEiiWZ7zjNvXPGcWG+6IZkk4H9iOKwh2xbk3sd50em95meIxgKDOsaKoJ3VvCJs4ajNt8ly+V6B/at7qMF20XoQG7Qtmm1FCv05QVEH3JIYLg7N4TllYEAxKrTz4Wr4/qiiQ/dVRl6pxkDodJ/8UraFfYbsuOizeGZpAaj8lgkljwD9k32ov1X3GSNbG8EZTMJ7mSH5VWGI+w1Eh7AgMBAAECggEAZQwoOEFHjCK5daaZlDYgOnrnNwAtyrYH18rVT32ShR5muxCknMkE0hZ3iuQRfAc0nDC1NFbCyGoUB29WbfzBn9IRPyVb5y/Fz/fKZ1nntaXna1JV6nkMNfXV42rSmklegEeHWXpXmOwjQqwNB7bKpJ/+Pq0CrD9JfiI/IHlcyEVShNTR3SCxpye8Vkca1/HOBcI/aRLJ0t/xkKBXfkJOpUo7QLvEwhqZN0m/Z+AE84TNNscKNDiNmWDCfntFFzuFIbjYXUrkZwWNDU+LCYtOZ6/WXLrFpp2UoeVdJACBxAHqmaNSZltgavH3swDkMswSwj/gt7lK4k/U8rpp3uw3sQKBgQDW5ddgyyXoADRLyvNiqjRNBayaekdgUZwjs3mMQ9tkAuk+hWCGPNHAM+iIkSmjP5x3ajBrLKAPpN1/iJ0aloi9CAICXCoD4B/lfANc6njZxeIWKEZjV4hUYfXsGp57EHGlgDlAKk727IxfsHJeW7gq9KX5aao1qHyT8Yo8FhyzjwKBgQDT4BQ2o4rBCF0okJDJXgF9WexI3LD+N02Tfd9Yuz8zWaM5wgPw2EDPnwp7jrlA6IcCgn/xlAWCZAHzvD/CIg33BH0bqB9LDkJHHNwmCscczw55jwa2RXJfQFDSZ2lFggAB/01ByyU0ex1Px/Q+p2ykueYbWmQV8xst7ZL03Yu2VQKBgF1417fYZQKGpDibbEXsNpeR8kO3EDjLBplYxXPHSDQ2N/Hj3dpFtg5eBbTxPyUs1Af0/l5/qJdlZJrGd19LPurKAuW35OaOpBETYfsWWb6Pngl5NzSarEfX3Dn4UhrBSk1senp4bKRmu6AbhYOZbX/xrgfQeCKiyJ0pILGGBLHtAoGBAJiHXIXpPl6w8r/dMx6EOnZPYjciCZk5nvNrTnrGcj05brSJ4+RjCmVtjVJd8Se1PlykLg9wDHdOH8mj4BKWCY+m/5oFcmHKJhSjxijs4WLv/O+t85sMa8X+uzB9md+cMv09GhUfde1OJE/nFwJz7Va5LdrLO/pBRXPO8FivlYDxAoGBAKnjcXz3rDyXIQZSG7f81P7FudPeHbX4aywI9yWHzXjcHADVwniEBLxR0oE35Wu0gAcmnGB7aJxNqBgIBrc4VU8yJA896gKaneq20JCVKBcfB6EuHJwK31MF/YCA4JnHhuqaJ91JMnOWHkn/6DJlxbvIc+VDtW7czkvhgFS73JDN"; //应用私钥
private static final String APIGW_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCMpjaWjngB4E3ATh+G1DVAmQnIpiPEFAEDqRfNGAVvvH35yDetqewKi0l7OEceTMN1C6NPym3zStvSoQayjYV+eIcZERkx31KhtFu9clZKgRTyPjdKMIth/wBtPKjL/5+PYalLdomM4ONthrPgnkN4x4R0+D4+EBpXo8gNiAFsNwIDAQAB"; private static final String APIGW_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCMpjaWjngB4E3ATh+G1DVAmQnIpiPEFAEDqRfNGAVvvH35yDetqewKi0l7OEceTMN1C6NPym3zStvSoQayjYV+eIcZERkx31KhtFu9clZKgRTyPjdKMIth/wBtPKjL/5+PYalLdomM4ONthrPgnkN4x4R0+D4+EBpXo8gNiAFsNwIDAQAB";
private static final String DECIVE_INFO = "qHYmicPTZyKO452IV4A2stOozmLj2aYu"; private static final String DECIVE_INFO = "qHYmicPTZyKO452IV4A2stOozmLj2aYu";
private static final String ICBC_URL = "https://gw.open.icbc.com.cn/" ; //https://gw-sandbox.open.icbc.com.cn https://gw.open.icbc.com.cn
private Result icbcPay(Double moneys, Integer classify, Long userId, String outTradeNo, HttpServletRequest httpRequest, Integer shop) throws Exception{ private Result icbcPay(Double moneys, Integer classify, Long userId, String outTradeNo, HttpServletRequest httpRequest, Integer shop) throws Exception{
UserEntity userEntity = userService.queryByUserId(userId); UserEntity userEntity = userService.queryByUserId(userId);
String url = "https://gw.open.icbc.com.cn/" ; //https://gw-sandbox.open.icbc.com.cn https://gw.open.icbc.com.cn
String action = "api/cardbusiness/aggregatepay/b2c/online/consumepurchase/V1"; String action = "api/cardbusiness/aggregatepay/b2c/online/consumepurchase/V1";
// UiIcbcClient client = new UiIcbcClient(APP_ID, IcbcConstants.SIGN_TYPE_RSA2, MY_PRIVATE_KEY, IcbcConstants.CHARSET_UTF8); // UiIcbcClient client = new UiIcbcClient(APP_ID, IcbcConstants.SIGN_TYPE_RSA2, MY_PRIVATE_KEY, IcbcConstants.CHARSET_UTF8);
@ -680,7 +686,7 @@ public class WxServiceImpl implements WxService {
DefaultIcbcClient client = new DefaultIcbcClient(ICBC_APPID, IcbcConstants.SIGN_TYPE_RSA2, MY_PRIVATE_KEY, APIGW_PUBLIC_KEY); DefaultIcbcClient client = new DefaultIcbcClient(ICBC_APPID, IcbcConstants.SIGN_TYPE_RSA2, MY_PRIVATE_KEY, APIGW_PUBLIC_KEY);
CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1 request = new CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1(); CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1 request = new CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1();
request.setServiceUrl(url + action); request.setServiceUrl(ICBC_URL + action);
CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1.CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1Biz bizContent = new CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1.CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1Biz(); CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1.CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1Biz bizContent = new CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1.CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1Biz();
request.setBizContent(bizContent); request.setBizContent(bizContent);
@ -732,6 +738,7 @@ public class WxServiceImpl implements WxService {
CardbusinessAggregatepayB2cOnlineConsumepurchaseResponseV1 response; CardbusinessAggregatepayB2cOnlineConsumepurchaseResponseV1 response;
try { try {
log.info("----调用icbc支付{}", JSONObject.toJSONString(request));
response = client.execute(request); response = client.execute(request);
log.info("----调用icbc支付回调{}", JSONObject.toJSONString(response)); log.info("----调用icbc支付回调{}", JSONObject.toJSONString(response));
if (response.getReturnCode() == 0) { if (response.getReturnCode() == 0) {
@ -771,11 +778,11 @@ public class WxServiceImpl implements WxService {
} }
@Override @Override
public String icbcPayBack(HttpServletRequest request, Integer type) throws Exception { public String icbcPayBack(@RequestBody Map<String, String> reqParams, Integer type) throws Exception {
log.info("工商支付回调:");
//接收参数 //接收参数
JSONObject bizContent = JSON.parseObject(request.getParameter("biz_content")); JSONObject bizContent = JSONObject.parseObject(String.valueOf(reqParams.get("biz_content")));
String msgId = bizContent.getString("msg_id"); String msgId = bizContent.getString("msg_id");
log.info("icbc 支付回调业务参数: {}", bizContent);
//应答参数 //应答参数
JSONObject responseBizContent = new JSONObject(); JSONObject responseBizContent = new JSONObject();
@ -787,10 +794,10 @@ public class WxServiceImpl implements WxService {
String transactionId = bizContent.getString("third_trade_no"); String transactionId = bizContent.getString("third_trade_no");
String appid = type == 3 ? commonInfoService.findOne(45).getValue() : commonInfoService.findOne(239).getValue(); String appid = type == 3 ? commonInfoService.findOne(45).getValue() : commonInfoService.findOne(239).getValue();
String notifyUrl = (type == 3 ? "/sqx_fast/app/wxPay/notifyJsApiShop" : "/sqx_fast/app/wxPay/notifyJsApi"); String notifyUrl = (type == 3 ? "/sqx_fast/app/wxPay/notifyJsApi" : "/sqx_fast/app/wxPay/notifyJsApiShop");
//返回码 //返回码
String returnCode = bizContent.getString("return_code"); String returnCode = bizContent.getString("return_code");
if (this.icbcCheckSign(request, notifyUrl)) { if (this.icbcCheckSign(reqParams, notifyUrl)) {
if ("0".equals(returnCode)) { if ("0".equals(returnCode)) {
// log.error("微信支付订单号" + notifyMap.get("transaction_id")); // log.error("微信支付订单号" + notifyMap.get("transaction_id"));
// String transactionId = notifyMap.get("transaction_id"); // String transactionId = notifyMap.get("transaction_id");
@ -964,6 +971,7 @@ public class WxServiceImpl implements WxService {
responseBizContent.put("return_code", 0); responseBizContent.put("return_code", 0);
responseBizContent.put("return_msg", "success"); responseBizContent.put("return_msg", "success");
}else { }else {
log.info("icbc支付回调签名错误");
responseBizContent.put("return_code", -1); responseBizContent.put("return_code", -1);
responseBizContent.put("return_msg", "icbc sign not pass."); responseBizContent.put("return_msg", "icbc sign not pass.");
} }
@ -979,23 +987,78 @@ public class WxServiceImpl implements WxService {
return resp.toJSONString(); return resp.toJSONString();
} }
private boolean icbcCheckSign(HttpServletRequest request, String path) { private Result icbcPayUI(Double moneys, Integer classify, Long userId, String outTradeNo, HttpServletRequest httpRequest, Integer shop) throws Exception{
UserEntity userEntity = userService.queryByUserId(userId);
//回调
String notifyUrl = commonInfoService.findOne(19).getValue() + (shop != null ? "/sqx_fast/app/wxPay/notifyJsApiShop" : "/sqx_fast/app/wxPay/notifyJsApi");
//微信商户号mchId
String mchId = commonInfoService.findOne(76).getValue();
//openid
String openId = shop != null ? userEntity.getShopOpenId() : userEntity.getOpenId();
//商户appid
String mchAppid = shop != null ? commonInfoService.findOne(239).getValue() : commonInfoService.findOne(45).getValue();
//后台服务名称
String name = commonInfoService.findOne(12).getValue();
//订单金额
String money = String.valueOf(AmountCalUtils.mul(moneys, 100).intValue());
UiIcbcClient client = new UiIcbcClient(ICBC_APPID, IcbcConstants.SIGN_TYPE_RSA2, MY_PRIVATE_KEY, IcbcConstants.CHARSET_UTF8);
CardbusinessAggregatepayB2cOnlineUiConsumepurchaseshowpayRequestV1 request = new CardbusinessAggregatepayB2cOnlineUiConsumepurchaseshowpayRequestV1();
//根据测试环境和生产环境替换相应ip和端口
request.setServiceUrl(ICBC_URL + "ui/cardbusiness/aggregatepay/b2c/online/ui/consumepurchaseshowpay/V1");
CardbusinessAggregatepayB2cOnlineUiConsumepurchaseshowpayRequestV1.CardbusinessAggregatepayB2cOnlineUiConsumepurchaseshowpayRequestV1Biz bizContent = new CardbusinessAggregatepayB2cOnlineUiConsumepurchaseshowpayRequestV1.CardbusinessAggregatepayB2cOnlineUiConsumepurchaseshowpayRequestV1Biz();
request.setBizContent(bizContent);
// bizContent.setAttach("");
bizContent.setBody(name); //微信商品描述
bizContent.setIcbc_appid(ICBC_APPID);
bizContent.setMer_id(ICBC_MCH_ID);
bizContent.setMer_prtcl_no(ICBC_MER_PRTCL_NO);
// bizContent.setMer_acct("");
// bizContent.setNotify_type("");
bizContent.setNotify_url(notifyUrl);
bizContent.setOpenId(openId);
bizContent.setOrder_amt(money);
bizContent.setOut_trade_no(outTradeNo);
// bizContent.setPay_limit("");
// bizContent.setResult_type("");
// bizContent.setReturn_url("");
bizContent.setSaledepname(name); // 门店名称
// bizContent.setSubject("");
bizContent.setShop_appid(mchAppid);
// bizContent.setOrder_apd_inf("");
// bizContent.setDetail(name);
// bizContent.setCust_name("xxx");
// bizContent.setCust_cert_type("x");
// bizContent.setCust_cert_no("xxxx");
// bizContent.setGoods_tag("xxx");
bizContent.setStart_datetime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
bizContent.setExpireTime("120");
String result = "";
try {
result = client.buildPostForm(request);
} catch (IcbcApiException e) {
return Result.error("获取订单失败" + e.getMessage());
}
return Result.success().put("data", result);
}
private boolean icbcCheckSign(Map<String, String> reqParams, String path) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
String sign = request.getParameter("sign"); String sign = reqParams.get("sign");
params.put("from", request.getParameter("from")); params.put("from", reqParams.get("from"));
params.put("api", request.getParameter("api")); params.put("api", reqParams.get("api"));
params.put("app_id", request.getParameter("app_id")); params.put("app_id", reqParams.get("app_id"));
params.put("charset", request.getParameter("charset")); params.put("charset", reqParams.get("charset"));
params.put("format", request.getParameter("format")); params.put("format", reqParams.get("format"));
params.put("timestamp", request.getParameter("timestamp")); params.put("timestamp", reqParams.get("timestamp"));
params.put("biz_content", request.getParameter("biz_content")); params.put("biz_content", reqParams.get("biz_content"));
//目前上行网关签名暂时仅支持RSA //目前上行网关签名暂时仅支持RSA
params.put("sign_type", request.getParameter("sign_type")); params.put("sign_type", reqParams.get("sign_type"));
String signStr= WebUtils.buildOrderedSignStr(path, params); String signStr= WebUtils.buildOrderedSignStr(path, params);
try { try {
//注意此次用的是RSA和下单时不一样 //注意此次用的是RSA和下单时不一样
return IcbcSignature.verify(signStr, IcbcConstants.SIGN_TYPE_RSA, APIGW_PUBLIC_KEY, request.getParameter("charset"), sign); return IcbcSignature.verify(signStr, IcbcConstants.SIGN_TYPE_RSA, APIGW_PUBLIC_KEY, reqParams.get("charset"), sign);
} catch (IcbcApiException e) { } catch (IcbcApiException e) {
return false; return false;
} }
@ -1138,13 +1201,30 @@ public class WxServiceImpl implements WxService {
} }
public static void main(String[] args) { public static void main(String[] args) throws IcbcApiException {
String timestamp = DateUtil.format(DateUtil.date(), "yyyy-MM-dd HH:mm:ss"); String notifyUrl = (true ? "/sqx_fast/app/wxPay/notifyJsApi" : "/sqx_fast/app/wxPay/notifyJsApiShop");
String rawToken = "100000002" + "2ry7EXwNHE3zOtUpEUqj1BdkFGuIna67TmKExNxG" + "1740728660";
String hashedToken = DigestUtil.sha256Hex(rawToken); String jsonStr = "{\"api\":\"/api/cardbusiness/aggregatepay/b2c/online/consumepurchase/V1\",\"app_id\":\"11000000000000051225\",\"biz_content\":\"{\\\"access_type\\\":\\\"9\\\",\\\"attach\\\":\\\"\\\",\\\"bank_disc_amt\\\":\\\"0\\\",\\\"card_flag\\\":\\\"\\\",\\\"card_kind\\\":\\\"\\\",\\\"card_no\\\":\\\"\\\",\\\"coupon_amt\\\":\\\"0\\\",\\\"cust_id\\\":\\\"\\\",\\\"decr_flag\\\":\\\"\\\",\\\"ecoupon_amt\\\":\\\"0\\\",\\\"mer_disc_amt\\\":\\\"0\\\",\\\"mer_id\\\":\\\"150537540003\\\",\\\"msg_id\\\":\\\"050200155087883006188152791\\\",\\\"open_id\\\":\\\"ow8NuxGas0u7FrZkg-DWi-F1ABwM\\\",\\\"order_id\\\":\\\"150537540003000522503280002157\\\",\\\"out_trade_no\\\":\\\"1000001823360698\\\",\\\"pay_time\\\":\\\"20250328150403\\\",\\\"pay_type\\\":\\\"9\\\",\\\"payment_amt\\\":\\\"10\\\",\\\"point_amt\\\":\\\"0\\\",\\\"return_code\\\":\\\"0\\\",\\\"return_msg\\\":\\\"交易成功\\\",\\\"third_party_coupon_amt\\\":\\\"0\\\",\\\"third_party_discount_amt\\\":\\\"0\\\",\\\"third_trade_no\\\":\\\"4200002667202503283423055973\\\",\\\"total_amt\\\":\\\"10\\\",\\\"total_disc_amt\\\":\\\"0\\\"}\",\"charset\":\"UTF-8\",\"format\":\"json\",\"from\":\"icbc-api\",\"sign\":\"H1wXn/2399BQr3FOpbqdGkNCpiSbi3njGdXsWV5x8nGEzMR+CTuO8ynB+KbsVivmeHX3UERZe0Z1mAtwibIZsJ1S7Li3Hl+XwdjHbBDi7Nkpj/ZHN0iEY7NK4X+b87ZuA2edXjr5Fo2btj7yjPNwr9c5C0C7madncHRziWidjFg=\",\"sign_type\":\"RSA\",\"timestamp\":\"2025-03-28 15:05:56\"}";
String encodedToken = cn.hutool.core.codec.Base64.encode(hashedToken); JSONObject reqParams = JSONObject.parseObject(jsonStr);
System.out.println(System.currentTimeMillis()/1000); // System.out.println(jsonObject.getJSONObject("biz_content"));
System.out.println(hashedToken); Map<String, String> params = new HashMap<>();
System.out.println(encodedToken); String sign = reqParams.getString("sign");
params.put("from", reqParams.getString("from"));
params.put("api", reqParams.getString("api"));
params.put("app_id", reqParams.getString("app_id"));
params.put("charset", reqParams.getString("charset"));
params.put("format", reqParams.getString("format"));
params.put("timestamp", reqParams.getString("timestamp"));
params.put("biz_content", reqParams.getString("biz_content"));
// //目前上行网关签名暂时仅支持RSA
params.put("sign_type", reqParams.getString("sign_type"));
System.out.println(params);
//
String signStr= WebUtils.buildOrderedSignStr(notifyUrl, params);
System.out.println(signStr);
Boolean flag = IcbcSignature.verify(signStr, IcbcConstants.SIGN_TYPE_RSA, APIGW_PUBLIC_KEY, reqParams.getString("charset"), sign);
System.out.println(flag);
} }
} }