记得上下班打卡 | git大法好,push需谨慎

Commit 01c02875 authored by zhengfuxin's avatar zhengfuxin

开发支付回调

parent 8403c480
...@@ -29,6 +29,8 @@ public enum DragonErrorCodeEnum { ...@@ -29,6 +29,8 @@ public enum DragonErrorCodeEnum {
TRADE_WEPAY_SIGN_ERROR("PAY0020001","微信签名异常!"), TRADE_WEPAY_SIGN_ERROR("PAY0020001","微信签名异常!"),
TRADE_DOUYINPAY_SIGN_ERROR("PAY0030001","抖音签名异常!"),
TRADE_WEPAY_QUERY_ERROR("PAY0020002","微信订单查询失败!"); TRADE_WEPAY_QUERY_ERROR("PAY0020002","微信订单查询失败!");
private String code; private String code;
......
package com.liquidnet.service.dragon.channel.strategy.impl; package com.liquidnet.service.dragon.channel.strategy.impl;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.liquidnet.common.exception.LiquidnetServiceException; import com.liquidnet.common.exception.LiquidnetServiceException;
import com.liquidnet.commons.lang.util.DateUtil; import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.StringUtil; import com.liquidnet.commons.lang.util.StringUtil;
...@@ -18,6 +19,7 @@ import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto; ...@@ -18,6 +19,7 @@ import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto; import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto;
import com.liquidnet.service.dragon.dto.DragonPayOrderQueryRespDto; import com.liquidnet.service.dragon.dto.DragonPayOrderQueryRespDto;
import com.liquidnet.service.dragon.utils.DataUtils; import com.liquidnet.service.dragon.utils.DataUtils;
import com.liquidnet.service.dragon.utils.PayDouYinpayUtils;
import com.liquidnet.service.dragon.utils.PayWepayUtils; import com.liquidnet.service.dragon.utils.PayWepayUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -27,6 +29,7 @@ import javax.servlet.http.HttpServletRequest; ...@@ -27,6 +29,7 @@ import javax.servlet.http.HttpServletRequest;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
...@@ -60,58 +63,48 @@ public class PayChannelStrategyDouYinImpl extends AbstractPayChannelStrategyImpl ...@@ -60,58 +63,48 @@ public class PayChannelStrategyDouYinImpl extends AbstractPayChannelStrategyImpl
@Override @Override
public String dragonNotify(HttpServletRequest request,String payType,String deviceFrom) { public String dragonNotify(HttpServletRequest request,String payType,String deviceFrom) {
String returnStr = "<xml>\n" + " <return_code><![CDATA[FAIL]]></return_code>\n" + " <return_msg><![CDATA[FAIL]]></return_msg>\n" + "</xml>";;
try {
InputStream inputStream = request.getInputStream();// 从request中取得输入流
Map<String, String> notifyMap = new HashMap<String, String>();
try {
notifyMap = PayWepayUtils.parseXml(inputStream);
log.info("dragonNotify-->wepay json : {}", JSON.toJSONString(notifyMap));
log.info("接收到{}支付结果{}", payType, notifyMap);
String code = notifyMap.get("out_trade_no");
//持久化通知记录
dragonServiceCommonBiz.createDragonOrderLogs(code,dragonPayBiz.getPaymentType(payType,deviceFrom),JSON.toJSONString(notifyMap));
// 根据银行订单号获取支付信息
DragonOrdersDto dragonOrdersDto = dataUtils.getPayOrderByCode(code);
if (dragonOrdersDto == null) {
throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_ERROR_NOT_EXISTS.getCode(),DragonErrorCodeEnum.TRADE_ERROR_NOT_EXISTS.getMessage());
}
if (DragonConstant.PayStatusEnum.STATUS_PAID.getCode().equals(dragonOrdersDto.getStatus())) { JSONObject jsonObject=PayDouYinpayUtils.getJsonObject(request);
throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_ERROR_HAS_PAID.getCode(),DragonErrorCodeEnum.TRADE_ERROR_HAS_PAID.getMessage()); try {
} log.info("dragonNotify-->douYinPay json : {}", JSON.toJSONString(jsonObject));
log.info("接收到{}支付结果{}", payType, JSON.toJSONString(jsonObject));
String sign = notifyMap.remove("sign"); if(!jsonObject.getString("type").equals("payment")){
boolean notifyResult = false; throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_PARAM_ERROR.getCode(),DragonErrorCodeEnum.TRADE_PARAM_ERROR.getMessage());
if (PayWepayUtils.getInstance().notifySign(notifyMap, sign)) {// 根据配置信息验证签名 }
if (WepayConstant.WeixinTradeStateEnum.SUCCESS.getCode().equals(notifyMap.get("result_code"))) {// 业务结果 JSONObject msg=jsonObject.getJSONObject("msg");
// 成功 // Map msg= (Map) map.get("msg");
String timeEndStr = notifyMap.get("time_end"); String code =msg.get("cp_orderno").toString();
LocalDateTime timeEnd = null; //持久化通知记录
if (!StringUtil.isEmpty(timeEndStr)) { dragonServiceCommonBiz.createDragonOrderLogs(code,dragonPayBiz.getPaymentType(payType,deviceFrom),JSON.toJSONString(jsonObject));
timeEnd = DateUtil.Formatter.yyyyMMddHHmmssTrim.parse(timeEndStr); // 根据银行订单号获取支付信息
} DragonOrdersDto dragonOrdersDto = dataUtils.getPayOrderByCode(code);
notifyResult = this.completeSuccessOrder(dragonOrdersDto, notifyMap.get("transaction_id"), timeEnd, notifyMap.toString()); if (dragonOrdersDto == null) {
} else { throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_ERROR_NOT_EXISTS.getCode(),DragonErrorCodeEnum.TRADE_ERROR_NOT_EXISTS.getMessage());
notifyResult = this.completeFailOrder(dragonOrdersDto, notifyMap.toString()); }
} if (DragonConstant.PayStatusEnum.STATUS_PAID.getCode().equals(dragonOrdersDto.getStatus())) {
if(notifyResult){ throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_ERROR_HAS_PAID.getCode(),DragonErrorCodeEnum.TRADE_ERROR_HAS_PAID.getMessage());
returnStr = "<xml>\n" + " <return_code><![CDATA[SUCCESS]]></return_code>\n" + " <return_msg><![CDATA[OK]]></return_msg>\n" + "</xml>"; }
} String sign = msg.get("msg_signature").toString();
boolean notifyResult = false;
if (PayDouYinpayUtils.getInstance().notifySign( sign,jsonObject)) {// 根据配置信息验证签名
//抖音回调 就代表成功了
this.completeSuccessOrder(dragonOrdersDto,"", LocalDateTime.now(), JSON.toJSONString(jsonObject));
/*if (WepayConstant.WeixinTradeStateEnum.SUCCESS.getCode().equals(notifyMap.get("result_code"))) {// 业务结果
// 成功
notifyResult = this.completeSuccessOrder(dragonOrdersDto, notifyMap.get("transaction_id"), timeEnd, notifyMap.toString());
} else { } else {
log.error("wepay notify fail code:{} msg:{} ",DragonErrorCodeEnum.TRADE_WEPAY_SIGN_ERROR.getCode(),DragonErrorCodeEnum.TRADE_WEPAY_SIGN_ERROR.getMessage()); notifyResult = this.completeFailOrder(dragonOrdersDto, notifyMap.toString());
} }
} catch (Exception e) { if(notifyResult){
e.printStackTrace(); returnStr = "<xml>\n" + " <return_code><![CDATA[SUCCESS]]></return_code>\n" + " <return_msg><![CDATA[OK]]></return_msg>\n" + "</xml>";
}*/
} else {
log.error("wepay notify fail code:{} msg:{} ",DragonErrorCodeEnum.TRADE_DOUYINPAY_SIGN_ERROR.getCode(),DragonErrorCodeEnum.TRADE_DOUYINPAY_SIGN_ERROR.getMessage());
} }
} catch (IOException e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
return returnStr; return "";
} }
@Override @Override
......
package com.liquidnet.service.dragon.utils; package com.liquidnet.service.dragon.utils;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.internal.util.file.IOUtils; import com.alipay.api.internal.util.file.IOUtils;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.liquidnet.commons.lang.util.MD5Utils; import com.liquidnet.commons.lang.util.MD5Utils;
import org.apache.http.client.config.RequestConfig; import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.Registry; import org.apache.http.config.Registry;
...@@ -21,8 +24,11 @@ import org.dom4j.io.SAXReader; ...@@ -21,8 +24,11 @@ import org.dom4j.io.SAXReader;
import javax.crypto.Cipher; import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
import javax.net.ssl.SSLContext; import javax.net.ssl.SSLContext;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.security.KeyStore; import java.security.KeyStore;
import java.security.MessageDigest; import java.security.MessageDigest;
...@@ -149,7 +155,7 @@ public class PayDouYinpayUtils { ...@@ -149,7 +155,7 @@ public class PayDouYinpayUtils {
} }
return hexValue.toString(); return hexValue.toString();
} }
public String createSign(SortedMap<String, Object> paramsMap) { public String createSign(Map<String, Object> paramsMap) {
List<String> paramsArr = new ArrayList<>(); List<String> paramsArr = new ArrayList<>();
for (Map.Entry<String, Object> entry : paramsMap.entrySet()) { for (Map.Entry<String, Object> entry : paramsMap.entrySet()) {
String key = entry.getKey(); String key = entry.getKey();
...@@ -186,40 +192,36 @@ public class PayDouYinpayUtils { ...@@ -186,40 +192,36 @@ public class PayDouYinpayUtils {
} }
return md5FromStr(signStr.toString()); return md5FromStr(signStr.toString());
} }
/*public static String md5FromStr(String inStr) {
MessageDigest md5;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return "";
}
byte[] byteArray = inStr.getBytes(StandardCharsets.UTF_8);
byte[] md5Bytes = md5.digest(byteArray);
StringBuilder hexValue = new StringBuilder();
for (byte md5Byte : md5Bytes) {
int val = ((int) md5Byte) & 0xff;
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}*/
public String getPartnerKey() { public String getPartnerKey() {
return this.partnerKey; return this.partnerKey;
} }
public boolean notifySign(Map<String, String> result, String sign) { public boolean notifySign(String sign, JSONObject jsonObject) {
String argNotifySign = getStringByStringMap(result) + "&key=" + this.partnerKey; Map<String, Object> map = new HashMap<>();
String notifySign = MD5Utils.md5(argNotifySign).toUpperCase(); //循环转换
if (notifySign.equals(sign)) { for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
map.put(entry.getKey(), entry.getValue());
}
String signBack=PayDouYinpayUtils.getInstance().createSign(map);
if(sign.equals(signBack))
return true; return true;
} else { else
return false; return false;
}
public static JSONObject getJsonObject(HttpServletRequest request) {
String param= null;
JSONObject jsonObject=null;
try {
BufferedReader streamReader = new BufferedReader( new InputStreamReader(request.getInputStream(), "UTF-8"));
StringBuilder responseStrBuilder = new StringBuilder();
String inputStr;
while ((inputStr = streamReader.readLine()) != null)
responseStrBuilder.append(inputStr);
jsonObject = JSONObject.parseObject(responseStrBuilder.toString());
} catch (Exception e) {
e.printStackTrace();
} }
return jsonObject;
} }
public static String getStringByStringMap(Map<String, String> map) { public static String getStringByStringMap(Map<String, String> map) {
...@@ -232,15 +234,19 @@ public class PayDouYinpayUtils { ...@@ -232,15 +234,19 @@ public class PayDouYinpayUtils {
return sb.toString(); return sb.toString();
} }
public static void main(String[] args) { public static void main(String[] args) {
SortedMap<String, Object> paramMap = new TreeMap<String, Object>(); String s="{\n" +
paramMap.put("appid", "wx86f9777acf2cb585"); " \"timestamp\":1602507471,\n" +
paramMap.put("partnerid", "1551961491"); " \"nonce\":\"797\",\n" +
paramMap.put("prepayid", "wx26131443671359787bb3996a1fa0fc0000"); " \"msg\":\"{\\\"appid\\\":\\\"tt07e3715e98c9aac0\\\",\\\"cp_orderno\\\":\\\"out_order_no_1\\\",\\\"cp_extra\\\":\\\"\\\",\\\"way\\\":\\\"2\\\",\\\"payment_order_no\\\":\\\"2021070722001450071438803941\\\",\\\"total_amount\\\":9980,\\\"status\\\":\\\"SUCCESS\\\",\\\"seller_uid\\\":\\\"69631798443938962290\\\",\\\"extra\\\":\\\"null\\\",\\\"item_id\\\":\\\"\\\"}\",\n" +
paramMap.put("package", "Sign=WXPay"); " \"msg_signature\":\"52fff5f7a4bf4a921c2daf83c75cf0e716432c73\",\n" +
paramMap.put("noncestr", "rGcsOnNdZ4d9zu6k3yCbVJRG8Ombp8VW"); " \"type\":\"payment\"\n" +
paramMap.put("timestamp", "1627276483"); "}";
String sign = PayDouYinpayUtils.getInstance().createSign(paramMap); JSONObject jsonObject = JSONObject.parseObject(s);
System.out.println("1627274771===="+sign); System.out.println(jsonObject.getString("type"));
JSONObject msg = jsonObject.getJSONObject("msg");
System.out.println(msg.getString("cp_orderno"));
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment