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

Commit c2ad2ef0 authored by jiangxiulong's avatar jiangxiulong

Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	liquidnet-bus-config/liquidnet-config/application-dev.yml
#	liquidnet-bus-config/liquidnet-config/application-test.yml
parents cf6166d3 b38d7199
package com.liquidnet.service.adam.constant;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AdamWechatConst {
/* =============================================================== | 变量配置 */
public static String zhengzaiAppletAppid;
public static String zhengzaiAppletSecret;
public static String zhengzaiServiceAppid;
public static String zhengzaiServiceSecret;
/* =============================================================== | API常量配置 */
public static final String API_URL_JS_CODE2SESSION = "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code";
public static final String API_URL_OAUTH2_ACCESS_TOKEN = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
/* =============================================================== | */
/* =============================================================== | */
@Value("${liquidnet.wechat.zhengzai.applet.appid}")
public void setZhengzaiAppletAppid(String zhengzaiAppletAppid) {
AdamWechatConst.zhengzaiAppletAppid = zhengzaiAppletAppid;
}
@Value("${liquidnet.wechat.zhengzai.applet.secret}")
public void setZhengzaiAppletSecret(String zhengzaiAppletSecret) {
AdamWechatConst.zhengzaiAppletSecret = zhengzaiAppletSecret;
}
@Value("${liquidnet.wechat.zhengzai.service.appid}")
public void setZhengzaiServiceAppid(String zhengzaiServiceAppid) {
AdamWechatConst.zhengzaiServiceAppid = zhengzaiServiceAppid;
}
@Value("${liquidnet.wechat.zhengzai.service.secret}")
public void setZhengzaiServiceSecret(String zhengzaiServiceSecret) {
AdamWechatConst.zhengzaiServiceSecret = zhengzaiServiceSecret;
}
}
......@@ -17,6 +17,8 @@ public class DragonConstant {
public static final String REFUND_REDIS_KET="dragon:refund:refundCode:";// 订单号对应回调地址
public static final String REDIS_KET_PAY_ORDERCODE="dragon:pay:orderCode:";// 订单编号
public static final String REDIS_KET_PAY_CODE="dragon:pay:code:";// 支付流水号
public enum PayChannelEnum{
ALIPAY("alipay","支付宝"),
......@@ -137,26 +139,52 @@ public class DragonConstant {
* 支付类型
*/
public enum PayTypeEnum{
PAYMENT_TYPE_APP_ALIPAY("APPALIPAY","App内支付宝支付"),
PAYMENT_TYPE_APP_WEPAY("APPWEPAY","App内微信支付"),
PAYMENT_TYPE_APP_IAP("APPIAP","App内IAP(In-App Purchase)支付,iOS虚拟道具支付"),
PAYMENT_TYPE_WAP_ALIPAY("WAPALIPAY","手机网页内支付宝支付"),
PAYMENT_TYPE_WAP_WEPAY("WAPWEPAY","手机网页调起微信支付"),
PAYMENT_TYPE_WEB_ALIPAY("WEBALIPAY","电脑网页内支付宝即时到账支付"),
PAYMENT_TYPE_WEB_WEPAY("WEBWEPAY","电脑网页内微信二维码支付,用户打开微信扫码支付"),
PAYMENT_TYPE_JS_WEPAY("JSWEPAY","微信内网页、微信公众号"),
PAYMENT_TYPE_APPLET_WEPAY("APPLETWEPAY","微信小程序");
PAYMENT_TYPE_APP_ALIPAY("APPALIPAY","alipay","app","App内支付宝支付"),
PAYMENT_TYPE_APP_WEPAY("APPWEPAY","wepay","app","App内微信支付"),
PAYMENT_TYPE_APP_IAP("APPIAP","applepay","app","App内IAP(In-App Purchase)支付,iOS虚拟道具支付"),
PAYMENT_TYPE_WAP_ALIPAY("WAPALIPAY","alipay","wap","手机网页内支付宝支付"),
PAYMENT_TYPE_WAP_WEPAY("WAPWEPAY","wepay","wap","手机网页调起微信支付"),
PAYMENT_TYPE_WEB_ALIPAY("WEBALIPAY","alipay","web","电脑网页内支付宝即时到账支付"),
PAYMENT_TYPE_WEB_WEPAY("WEBWEPAY","wepay","web","电脑网页内微信二维码支付,用户打开微信扫码支付"),
PAYMENT_TYPE_JS_WEPAY("JSWEPAY","wepay","js","微信内网页、微信公众号"),
PAYMENT_TYPE_APPLET_WEPAY("APPLETWEPAY","wepay","applet","微信小程序");
private String code;
private String message;
PayTypeEnum(String code, String message) {
private String payType;
private String deviceFrom;
PayTypeEnum(String code, String message,String payType,String deviceFrom) {
this.code = code;
this.message = message;
this.payType = payType;
this.deviceFrom = deviceFrom;
}
public String getCode() {
return code;
}
public static PayTypeEnum getEnumByCode(String code){
PayTypeEnum[] arry = PayTypeEnum.values();
for (int i = 0; i < arry.length; i++) {
if (arry[i].getCode().equals(code)) {
return arry[i];
}
}
return null;
}
public String getMessage() {
return message;
}
public String getPayType() {
return payType;
}
public String getDeviceFrom() {
return deviceFrom;
}
}
/**
......
package com.liquidnet.service.dragon.constant;
/**
* @author AnJiabin <anjiabin@zhengzai.tv>
* @version V1.0
* @Description: TODO
* @class: DragonErrorCodeEnum
* @Package com.liquidnet.service.dragon.constant
* @Copyright: LightNet @ Copyright (c) 2021
* @date 2021/7/13 20:25
*/
public enum DragonErrorCodeEnum {
TRADE_PAY_WAY_ERROR("PAY0010001","错误的支付方式"),
TRADE_WEIXIN_ERROR("PAY0010002","微信异常"),
TRADE_ORDER_ERROR("PAY0010003","错误的支付方式"),
TRADE_ORDER_STATUS_NOT_SUCCESS ("PAY0010004","交易不成功"),
TRADE_ALIPAY_ERROR ("PAY0010005","支付宝异常"),
TRADE_PARAM_ERROR("PAY0010006","支付参数异常"),
TRADE_ERROR_NOT_EXISTS("PAY0010007","订单不存在!"),
TRADE_ERROR_HAS_PAID("PAY0010008","订单已经支付成功!"),
TRADE_ALIPAY_SIGN_ERROR("PAY0010009","支付宝签名异常!"),
TRADE_WEPAY_SIGN_ERROR("PAY0020001","微信签名异常!");
private String code;
private String message;
DragonErrorCodeEnum(String code, String message) {
this.code = code;
this.message = message;
}
public String getCode() {
return code;
}
public String getMessage() {
return message;
}
}
package com.liquidnet.service.dragon.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class AliRefundCallBackBodyDto {
@JsonProperty("out_trade_no")
private String outTradeNo;
@JsonProperty("trade_no")
private String tradeNo;
@JsonProperty("out_request_no")
private String outRequestNo;
}
......@@ -19,7 +19,7 @@ public class NotifyUrlDto implements Serializable {
private String refundPrice;
// private String refundReason;
// private String refundType;
private String refundId;
// private String refundId;
private String refundAt;
private String refundError;
}
package com.liquidnet.service.dragon.dto;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class PayNotifyDto {
private Integer status;
private String type;
private String code;
private String paymentId;
private String orderCode;
private BigDecimal price;
private String paymentType;
}
......@@ -3,13 +3,16 @@ package com.liquidnet.service.dragon.service;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto;
import com.liquidnet.service.dragon.dto.DragonPayOrderQueryRespDto;
import javax.servlet.http.HttpServletRequest;
public interface IDragonOrdersService {
void sendRedisQueue();
ResponseDto<DragonPayBaseRespDto> dragonPay(DragonPayBaseReqDto dragonPayBaseReqDto);
void dragonNotify(HttpServletRequest request,String payType,String deviceFrom);
DragonPayOrderQueryRespDto checkOrderStatusByCode(String code);
DragonPayOrderQueryRespDto checkOrderStatusByOrderCode(String orderCode);
}
......@@ -87,6 +87,14 @@ liquidnet:
dysms:
accessKeyId: LTAI5tHt7yvm97G8zxackcMK
accessKeySecret: xC3i5qEptJ3JIIRaYLaKvhk4gVASfl
wechat:
zhengzai:
applet:
appid: wx4732efeaa2b08086
secret: 94562c1f92da1b6cb3f1327c8842c6d3
service:
appid: wx3498304dda39c5a1
secret: a1307fab0a5f2380086a7c636f7339ea
umeng:
ios:
appkey: 54fe819bfd98c546b50004f0
......
......@@ -87,6 +87,14 @@ liquidnet:
dysms:
accessKeyId: LTAI5tHt7yvm97G8zxackcMK
accessKeySecret: xC3i5qEptJ3JIIRaYLaKvhk4gVASfl
wechat:
zhengzai:
applet:
appid: wx4732efeaa2b08086
secret: 94562c1f92da1b6cb3f1327c8842c6d3
service:
appid: wx3498304dda39c5a1
secret: a1307fab0a5f2380086a7c636f7339ea
umeng:
ios:
appkey: 54fe819bfd98c546b50004f0
......
......@@ -26,9 +26,14 @@ liquidnet:
url: https://devdragon.zhengzai.tv/dragon
alipay:
gataway-url: https://openapi.alipay.com/gateway.do
appId: 2019082866535131
merchantPubKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmePaETscydypY3rV4mXa8MtcQIL5zjP1KxdusNkHpePeU61hAZxKn0Z8pDB1wNaTK72wgEWaORXeRp4YTbf4usHlW562Pe5wdiSutb3iT6EMJ5eBD4HLI9wWDgYBtwfHwS5JJFhf0eptP4R1XluLiMhmMynLwJvHepgkVrS3mN+jmoPRmKFhZHGIYDoWypBMbUKiFHWiToHK1n0NYHHIi4WgK2wt4Wj7nexQGD69W7ofRCirYmz35c/cNFUA1lqzOEKu2z7PpjA6jQV2GJolnJ4xXPJ8Dpgp4g/dgsGqRydlmFqZD71i/pDDpF0RfRKHL+WhWVhI1hqe6jLtvJE+zQIDAQAB
merchantPrivateKey: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCArhnBTpcAww8wSYBTwGp6oBvenzCCYFrugERgxJDZ7YnBZ3ZdiAaHjJ9PI0WymkpDr27FSg9czVbiH7G91zPq+8s9onrZi/l6cBZ2VjrwQ9BQPN2a8zHy8D6BfoKEV+PIicGz6hNPA7lgf04NgsXeWjeXnYD/IBTLZmnCxB2sPYo/0EN32mlSG9snO63HlPkoqn8ycw71a1cBrlQ+Y22fFnJAk/vrGoou8E0UHfL5zVE/up+ToOYW/eOKMFL/DSceCy32t9Za0RmpV3i2E9s8gBDewzT10Yf4+4mPUiTR6AhcLjqafAy2IaKPK57WZ6cGF9cGs9yq8bSTRpeNC4alAgMBAAECggEAH0Ms+qvPP94j6IVS6gYLWHNhkfp23JXwQZVkB2Z6EpgFKbmrJhoQDAp8Acv9+OBHPp52ePP/O3qfqxwsIIUSFfrKa9T3p7a8C6UDsAhPFWRETdobtLN05SK87NUBfImly2i8aKtruXycIveKzPmCfPzKGMmpN1Jh+vCMrUbcNqX8OUcxmhGvJwnQuBW4QEiepzl89Nl91iSwFmxaZoqLaB9lYUKke/z7FDHTpTWpZvtvxlZ0gvMVNLVp9NBNazolQ8eEjBG2PsQGD2cLUbM33mLTz+/VQjzZR3KXu5kQR9MloURILDsdxE1AyA4AkIXd4eMszEjA4Dv6CQK/jjrsgQKBgQDIiCt1OGmV2sqDBSn4nZNH7BzY3Hdnf+qsYUi+TXKhnQaT8XPKWZpKE/AcqsIKnANmO4sX0NL7ACBe7Rl1RcU9Mq5XuHhnkveFBVRRIHindzUfEN0WgdLy23qmJ2N+1i4FigelY0E5T2lojVb7wycAgAc6vflwE+eYf8W3968q0QKBgQCkRgsVCWWNMSLZeB0V9LV3Om2/UPWY/ovadTxAQtxg0Z75V6Wdu8u0hrYaPSeUK2ryaoE6HKgp7U8NiJGzgm2wpj7D2ysrPmhX5+CjiWkDMCuvWytVT7hLqhhLp7frZT39u8VhyfC8lE0xA67gAPsGSl1sBoZPwvvsmNAQ/h6rlQKBgQCtCtw9be2m88M3JnieYhOax8Po2u5qsLZoBBcKqLhXf7ISbhPWNFXwwJ29jxicoR5J1O3lIj09fVFxuLX0Pb3DXn2VksjLz8Wp0vx8eUHEeRis8xdleaf4C68du/WemOHjw8VvUWQSOVWjc/vwiumYA+K5LQAXWAXM0c1jP+e3UQKBgEWY/1z8TDATn0Yvo3MH6FIJSTIDJOqa/bmibdJ0AVZruUS+o4Y+aEGlyUU4n6og8wCdqv5p4b1Rs2pyb/hzy/FJndHw60s495A2x2/B6eHV6Mw0fhl42wYDnKOA/WUX0bnMcgXKPtpGoqWff9mb0L6LhyUbZpAodf95hr2MTIY5AoGBAIyPtYP6jRyR980h/Ud1MS0fBxymjQrR+kg3GWjnw0ZJJ8yFEXxDqLV8uLyXQKc89HGbI0cClWgZBTjfIPJ5U4Gl19Xlwx1SFrdgg5mGUqnMARTg7w1TG5QLSqNhZo2jgBM5FCJRbDUCO/MzLcFhTeGNva9yP7E7gW5/Dott9D7d
signtType: 2019082866535131
charset: 2019082866535131
wepay:
gataway-url: https://openapi.alipay.com/gateway.do
merchantId: 1551961491
appId: wx3498304dda39c5a1
parentKey: itIuO65O9yKmemOu3S8g1S4orqvCGwXK
partnerKey: itIuO65O9yKmemOu3S8g1S4orqvCGwXK
......@@ -23,12 +23,16 @@ liquidnet:
sslEnabled: false
database: test_ln_scene
dragon:
url: https://testdragon.zhengzai.tv/dragon
alipay:
gataway-url: https://openapi.alipay.com/gateway.do
notify-url: https://testdragon.zhengzai.tv/dragon/notify/alipay
appId: 2019082866535131
merchantPubKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmePaETscydypY3rV4mXa8MtcQIL5zjP1KxdusNkHpePeU61hAZxKn0Z8pDB1wNaTK72wgEWaORXeRp4YTbf4usHlW562Pe5wdiSutb3iT6EMJ5eBD4HLI9wWDgYBtwfHwS5JJFhf0eptP4R1XluLiMhmMynLwJvHepgkVrS3mN+jmoPRmKFhZHGIYDoWypBMbUKiFHWiToHK1n0NYHHIi4WgK2wt4Wj7nexQGD69W7ofRCirYmz35c/cNFUA1lqzOEKu2z7PpjA6jQV2GJolnJ4xXPJ8Dpgp4g/dgsGqRydlmFqZD71i/pDDpF0RfRKHL+WhWVhI1hqe6jLtvJE+zQIDAQAB
merchantPrivateKey: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCArhnBTpcAww8wSYBTwGp6oBvenzCCYFrugERgxJDZ7YnBZ3ZdiAaHjJ9PI0WymkpDr27FSg9czVbiH7G91zPq+8s9onrZi/l6cBZ2VjrwQ9BQPN2a8zHy8D6BfoKEV+PIicGz6hNPA7lgf04NgsXeWjeXnYD/IBTLZmnCxB2sPYo/0EN32mlSG9snO63HlPkoqn8ycw71a1cBrlQ+Y22fFnJAk/vrGoou8E0UHfL5zVE/up+ToOYW/eOKMFL/DSceCy32t9Za0RmpV3i2E9s8gBDewzT10Yf4+4mPUiTR6AhcLjqafAy2IaKPK57WZ6cGF9cGs9yq8bSTRpeNC4alAgMBAAECggEAH0Ms+qvPP94j6IVS6gYLWHNhkfp23JXwQZVkB2Z6EpgFKbmrJhoQDAp8Acv9+OBHPp52ePP/O3qfqxwsIIUSFfrKa9T3p7a8C6UDsAhPFWRETdobtLN05SK87NUBfImly2i8aKtruXycIveKzPmCfPzKGMmpN1Jh+vCMrUbcNqX8OUcxmhGvJwnQuBW4QEiepzl89Nl91iSwFmxaZoqLaB9lYUKke/z7FDHTpTWpZvtvxlZ0gvMVNLVp9NBNazolQ8eEjBG2PsQGD2cLUbM33mLTz+/VQjzZR3KXu5kQR9MloURILDsdxE1AyA4AkIXd4eMszEjA4Dv6CQK/jjrsgQKBgQDIiCt1OGmV2sqDBSn4nZNH7BzY3Hdnf+qsYUi+TXKhnQaT8XPKWZpKE/AcqsIKnANmO4sX0NL7ACBe7Rl1RcU9Mq5XuHhnkveFBVRRIHindzUfEN0WgdLy23qmJ2N+1i4FigelY0E5T2lojVb7wycAgAc6vflwE+eYf8W3968q0QKBgQCkRgsVCWWNMSLZeB0V9LV3Om2/UPWY/ovadTxAQtxg0Z75V6Wdu8u0hrYaPSeUK2ryaoE6HKgp7U8NiJGzgm2wpj7D2ysrPmhX5+CjiWkDMCuvWytVT7hLqhhLp7frZT39u8VhyfC8lE0xA67gAPsGSl1sBoZPwvvsmNAQ/h6rlQKBgQCtCtw9be2m88M3JnieYhOax8Po2u5qsLZoBBcKqLhXf7ISbhPWNFXwwJ29jxicoR5J1O3lIj09fVFxuLX0Pb3DXn2VksjLz8Wp0vx8eUHEeRis8xdleaf4C68du/WemOHjw8VvUWQSOVWjc/vwiumYA+K5LQAXWAXM0c1jP+e3UQKBgEWY/1z8TDATn0Yvo3MH6FIJSTIDJOqa/bmibdJ0AVZruUS+o4Y+aEGlyUU4n6og8wCdqv5p4b1Rs2pyb/hzy/FJndHw60s495A2x2/B6eHV6Mw0fhl42wYDnKOA/WUX0bnMcgXKPtpGoqWff9mb0L6LhyUbZpAodf95hr2MTIY5AoGBAIyPtYP6jRyR980h/Ud1MS0fBxymjQrR+kg3GWjnw0ZJJ8yFEXxDqLV8uLyXQKc89HGbI0cClWgZBTjfIPJ5U4Gl19Xlwx1SFrdgg5mGUqnMARTg7w1TG5QLSqNhZo2jgBM5FCJRbDUCO/MzLcFhTeGNva9yP7E7gW5/Dott9D7d
signtType: 2019082866535131
charset: 2019082866535131
wepay:
gataway-url: https://openapi.alipay.com/gateway.do
notify-url: https://testdragon.zhengzai.tv/dragon/notify/wepay
merchantId: 1551961491
appId: wx3498304dda39c5a1
parentKey: itIuO65O9yKmemOu3S8g1S4orqvCGwXK
\ No newline at end of file
partnerKey: itIuO65O9yKmemOu3S8g1S4orqvCGwXK
\ No newline at end of file
package com.liquidnet.service.dragon.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@EqualsAndHashCode(callSuper = false)
public class DragonOrderLogsDto implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* order_id
*/
private String orderId;
/**
* payment_type
*/
private String paymentType;
/**
* content
*/
private String content;
/**
* created_at
*/
private LocalDateTime createdAt;
/**
* updated_at
*/
private LocalDateTime updatedAt;
}
package com.liquidnet.service.dragon.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @author AnJiabin <anjiabin@zhengzai.tv>
* @version V1.0
* @Description: TODO
* @class: DragonOrdersDto
* @Package com.liquidnet.service.dragon.dto
* @Copyright: LightNet @ Copyright (c) 2021
* @date 2021/7/13 19:36
*/
@Data
public class DragonOrdersDto implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* status
*/
private Integer status;
/**
* code
*/
private String code;
/**
* type
*/
private String type;
/**
* price
*/
private BigDecimal price;
/**
* name
*/
private String name;
/**
* detail
*/
private String detail;
/**
* order_code
*/
private String orderCode;
/**
* client_ip
*/
private String clientIp;
/**
* notify_url
*/
private String notifyUrl;
/**
* payment_type
*/
private String paymentType;
/**
* payment_id
*/
private String paymentId;
/**
* payment_at
*/
private LocalDateTime paymentAt;
/**
* finished_at
*/
private LocalDateTime finishedAt;
/**
* created_at
*/
private LocalDateTime createdAt;
/**
* updated_at
*/
private LocalDateTime updatedAt;
/**
* deleted_at
*/
private LocalDateTime deletedAt;
}
......@@ -16,6 +16,7 @@ import com.liquidnet.commons.lang.constant.LnsEnum;
import com.liquidnet.commons.lang.core.JwtValidator;
import com.liquidnet.commons.lang.util.*;
import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.adam.constant.AdamWechatConst;
import com.liquidnet.service.adam.dto.AdamThirdPartParam;
import com.liquidnet.service.adam.dto.vo.AdamLoginInfoVo;
import com.liquidnet.service.adam.dto.vo.AdamUserInfoVo;
......@@ -331,41 +332,43 @@ public class AdamLoginController {
}
@ApiOperationSupport(order = 9)
@ApiOperation(value = "微信登录凭证校验", notes = "登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。更多使用方法详见 https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html")
@ApiOperation(value = "微信小程序登录凭证校验", notes = "这里仅用于获取OPENID使用。登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。更多使用方法详见 https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html")
@GetMapping(value = {"wxa/code2session"})
public ResponseDto<Object> wxaCode2Session(@RequestParam String jsCode) {
public ResponseDto<String> wxaCode2Session(@RequestParam String jsCode) {
String openId = null;
try {
String url = "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code";
url = url.replace("APPID", "wx4732efeaa2b08086").replace("SECRET", "94562c1f92da1b6cb3f1327c8842c6d3").replace("JSCODE", jsCode);
String url = AdamWechatConst.API_URL_JS_CODE2SESSION.replace("APPID", AdamWechatConst.zhengzaiAppletAppid)
.replace("SECRET", AdamWechatConst.zhengzaiAppletSecret).replace("JSCODE", jsCode);
String respJStr = HttpUtil.get(url, null);
JsonNode respJNode = JsonUtils.fromJson(respJStr, JsonNode.class);
if (null == respJNode) {
if (null == respJNode || !respJNode.get("errcode").textValue().equalsIgnoreCase("0")) {
log.warn("WX.API调用失败[{}]", respJStr);
return ResponseDto.success(null);
}
openId = respJNode.get("openid").asText();
} catch (Exception e) {
log.error("WX.API调用异常", e);
log.error("WX.API调用异常[jsCode:{}]", jsCode, e);
}
return ResponseDto.success(openId);
}
@ApiOperationSupport(order = 10)
@ApiOperation(value = "微信网站应用登录", notes = "方法详见 https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html")
@ApiOperation(value = "微信网站应用登录", notes = "这里仅用于获取OPENID使用。方法详见 https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html")
@GetMapping(value = {"wx/oauth2/access_token"})
public ResponseDto<String> wxOauth2AccessToken(@RequestParam String code) {
String openId = null;
try {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
url = url.replace("APPID", "wx3498304dda39c5a1").replace("SECRET", "a1307fab0a5f2380086a7c636f7339ea").replace("CODE", code);
String url = AdamWechatConst.API_URL_OAUTH2_ACCESS_TOKEN.replace("APPID", AdamWechatConst.zhengzaiServiceAppid)
.replace("SECRET", AdamWechatConst.zhengzaiServiceSecret).replace("CODE", code);
String respJStr = HttpUtil.get(url, null);
JsonNode respJNode = JsonUtils.fromJson(respJStr, JsonNode.class);
if (null == respJNode || !respJNode.get("errcode").isEmpty()) {
if (null == respJNode || !respJNode.get("errcode").textValue().equalsIgnoreCase("0")) {
log.warn("WX.API调用失败[{}]", respJStr);
return ResponseDto.success(null);
}
openId = respJNode.get("openid").asText();
} catch (Exception e) {
log.error("WX.API调用异常", e);
log.error("WX.API调用异常[code:{}]", code, e);
}
return ResponseDto.success(openId);
}
......
package com.liquidnet.service.consumer.dragon.service.receiver;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.consumer.dragon.service.IBaseDao;
import com.liquidnet.service.dragon.constant.DragonConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.stream.MapRecord;
import org.springframework.data.redis.connection.stream.StreamRecords;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.stream.StreamListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.HashMap;
@Slf4j
@Component
public class RedisPayReceiver implements StreamListener<String, MapRecord<String, String, String>> {
@Resource
IBaseDao baseDao;
@Autowired
StringRedisTemplate stringRedisTemplate;
@Override
public void onMessage(MapRecord<String, String, String> message) {
log.info("接受到来自redis PAY 的消息");
System.out.println("message id "+message.getId());
System.out.println("stream "+message.getStream());
System.out.println("body "+message.getValue());
log.info("接受到来自redis REFUND 的消息");
System.out.println("message id " + message.getId());
System.out.println("stream " + message.getStream());
System.out.println("body " + message.getValue());
consumerSqlDaoHandler(message.getValue().get("message"));
}
private void consumerSqlDaoHandler(String msg) {
try {
SqlMapping.SqlMessage sqlMessage = JsonUtils.fromJson(msg, SqlMapping.SqlMessage.class);
log.debug("CONSUMER SQL ==> Preparing:{}", JsonUtils.toJson(sqlMessage.getSqls()));
log.debug("CONSUMER SQL ==> Parameters:{}", JsonUtils.toJson(sqlMessage.getArgs()));
Boolean rstBatchSqls = baseDao.batchSqls(sqlMessage.getSqls(), sqlMessage.getArgs());
log.debug("CONSUMER SQL result of execution:{}", rstBatchSqls);
if (rstBatchSqls) {
//应答
} else {
sendMySqlRedis(msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 给 REDIS 队列发送消息 数据库相关
*
* @param msg 接收到的内容
* @return
*/
private boolean sendMySqlRedis(String msg) {
try {
HashMap<String, String> map = new HashMap<>();
map.put("message", msg);
MapRecord<String, String, String> record = StreamRecords.mapBacked(map).withStreamKey(DragonConstant.MysqlRedisQueueEnum.DRAGON_REFUND_KEY.getCode());
stringRedisTemplate.opsForStream().add(record);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
package com.liquidnet.service.dragon.channel.alipay.biz;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.dragon.constant.DragonConstant;
import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto;
import com.liquidnet.service.dragon.entity.DragonOrders;
import com.liquidnet.service.dragon.utils.MqHandleUtil;
import org.springframework.beans.factory.annotation.Autowired;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradeWapPayResponse;
import com.liquidnet.commons.lang.util.StringUtil;
import com.liquidnet.service.dragon.channel.alipay.req.AlipayTradePayReq;
import com.liquidnet.service.dragon.channel.alipay.sign.MD5;
import com.liquidnet.service.dragon.channel.strategy.biz.DragonPayBiz;
import com.liquidnet.service.dragon.utils.PayAlipayUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.*;
/**
* @author AnJiabin <anjiabin@zhengzai.tv>
......@@ -20,40 +28,142 @@ import java.time.LocalDateTime;
* @Copyright: LightNet @ Copyright (c) 2021
* @date 2021/7/10 16:21
*/
@Slf4j
@Component
public class AlipayBiz {
@Autowired
private MqHandleUtil mqHandleUtil;
public DragonOrders buildPayOrders(DragonPayBaseReqDto dragonPayBaseReqDto, DragonPayBaseRespDto respDto){
DragonOrders orders = new DragonOrders();
// orders.setMid();
orders.setStatus(Integer.valueOf(DragonConstant.PayStatusEnum.STATUS_UNPAID.getCode()));
orders.setCode(respDto.getCode());
orders.setType(dragonPayBaseReqDto.getType());
orders.setPrice(dragonPayBaseReqDto.getPrice());
orders.setName(dragonPayBaseReqDto.getName());
orders.setDetail(dragonPayBaseReqDto.getDetail());
orders.setOrderCode(dragonPayBaseReqDto.getOrderCode());
orders.setClientIp(dragonPayBaseReqDto.getClientIp());
orders.setNotifyUrl(dragonPayBaseReqDto.getNotifyUrl());
orders.setPaymentType(DragonConstant.PayTypeEnum.PAYMENT_TYPE_APP_IAP.getCode());
// orders.setPaymentId();
orders.setPaymentAt(LocalDateTime.now());
// orders.setFinishedAt();
orders.setCreatedAt(LocalDateTime.now());
// orders.setUpdatedAt();
// 修改退款订单
boolean insertResult = mqHandleUtil.sendMySqlRedis(
SqlMapping.get("dragon_orders.insert"),
new Object[]{orders.getStatus(), orders.getCode(), orders.getType()
, orders.getPrice(), orders.getName(), orders.getDetail()
, orders.getOrderCode(), orders.getClientIp()
, orders.getNotifyUrl(), orders.getPaymentType(),
orders.getPaymentId(), orders.getPaymentAt()
, orders.getFinishedAt(), orders.getCreatedAt()
, orders.getUpdatedAt()}
);
return orders;
public class AlipayBiz extends DragonPayBiz {
/**
* 支付宝支付
* @param alipayTradePayReq
* @return
*/
public static Map<String, Object> tradeWapPay(AlipayTradePayReq alipayTradePayReq) {
log.info("AlipayUtil.tradeWapPay-->> req : {}",alipayTradePayReq.toString());
String timeExpress = "5m";// 支付超时,线下扫码交易定义为5分钟
AlipayClient alipayClient = PayAlipayUtils.getInstance().getHttpClient();
SortedMap<String, Object> paramMap = new TreeMap<>();
paramMap.put("product_code", alipayTradePayReq.getProductCode());
paramMap.put("total_amount", alipayTradePayReq.getTotalAmount().toString());
paramMap.put("subject", alipayTradePayReq.getSubject());
paramMap.put("body", alipayTradePayReq.getBody());
paramMap.put("out_trade_no", alipayTradePayReq.getOutTradeNo());
paramMap.put("timeout_express", timeExpress);
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
request.setNotifyUrl(alipayTradePayReq.getNotifyUrl());
// request.setTimestamp(DateUtil.now());
log.info("bizContent :{}", JSONObject.toJSONString(paramMap));
request.setBizContent(JSONObject.toJSONString(paramMap));
try {
AlipayTradeWapPayResponse response = alipayClient.sdkExecute(request);
JSONObject responseJSON = JSONObject.parseObject(JSONObject.toJSONString(response));
log.info("AlipayUtil-->tradeWapPay-->支付宝返回结果:{}", responseJSON);
return responseJSON;
} catch (AlipayApiException e) {
log.error("支付宝支付异常:{}", e);
JSONObject resultJSON = new JSONObject();
resultJSON.put("outTradeNo", alipayTradePayReq.getOutTradeNo());
resultJSON.put("totalAmount", alipayTradePayReq.getTotalAmount().toString());
resultJSON.put("errorCode", "9999");
return resultJSON;
}
}
/**
* 支付宝支付
* @param alipayTradePayReq
* @return
*/
public static Map<String, Object> tradeAppPay(AlipayTradePayReq alipayTradePayReq) {
log.info("AlipayUtil.tradeAppPay-->> req : {}",alipayTradePayReq.toString());
String timeExpress = "5m";// 支付超时,线下扫码交易定义为5分钟
AlipayClient alipayClient = PayAlipayUtils.getInstance().getHttpClient();
SortedMap<String, Object> paramMap = new TreeMap<>();
paramMap.put("product_code", alipayTradePayReq.getProductCode());
paramMap.put("total_amount", alipayTradePayReq.getTotalAmount().toString());
paramMap.put("subject", alipayTradePayReq.getSubject());
paramMap.put("body", alipayTradePayReq.getBody());
paramMap.put("out_trade_no", alipayTradePayReq.getOutTradeNo());
paramMap.put("timeout_express", timeExpress);
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
request.setNotifyUrl(alipayTradePayReq.getNotifyUrl());
// request.setTimestamp(DateUtil.now());
log.info("bizContent :{}",JSONObject.toJSONString(paramMap));
request.setBizContent(JSONObject.toJSONString(paramMap));
try {
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
JSONObject responseJSON = JSONObject.parseObject(JSONObject.toJSONString(response));
log.info("AlipayUtil-->tradeAppPay-->支付宝返回结果:{}", responseJSON);
return responseJSON;
} catch (AlipayApiException e) {
log.error("支付宝支付异常:{}", e);
JSONObject resultJSON = new JSONObject();
resultJSON.put("outTradeNo", alipayTradePayReq.getOutTradeNo());
resultJSON.put("totalAmount", alipayTradePayReq.getTotalAmount().toString());
resultJSON.put("errorCode", "9999");
return resultJSON;
}
}
/**
* 订单查询
*
* @return
*/
public static Map<String, Object> tradeQuery(String outTradeNo) {
log.info("======>支付宝交易查询");
String charset = "UTF-8";
String format = "json";
String signType = "RSA2";
AlipayClient alipayClient = PayAlipayUtils.getInstance().getHttpClient();
SortedMap<String, Object> bizContentMap = new TreeMap<>();
bizContentMap.put("out_trade_no", outTradeNo);
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
request.setBizContent(JSONObject.toJSONString(bizContentMap));
try {
AlipayTradeQueryResponse response = alipayClient.execute(request);
JSONObject responseJSON = JSONObject.parseObject(JSONObject.toJSONString(response));
log.info("支付宝订单查询返回结果:{}", responseJSON);
return responseJSON;
} catch (AlipayApiException e) {
log.error("支付宝交易查询异常:{}", e);
return null;
}
}
private static String getSign(SortedMap<String, String> paramMap, String key) {
StringBuilder signBuilder = new StringBuilder();
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
if (!"sign".equals(entry.getKey()) && !"sign_type".equals(entry.getKey()) && !StringUtil.isEmpty(entry.getValue())) {
signBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
}
return MD5.sign(signBuilder.substring(0, signBuilder.length() - 1), key, "UTF-8");
}
public static Map<String , String> parseNotifyMsg(Map<String, String[]> requestParams){
Map<String,String> params = new HashMap<String,String>();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
params.put(name, valueStr);
}
return params;
}
}
package com.liquidnet.service.dragon.channel.alipay.config;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.IOException;
import java.util.Properties;
/**
* @author AnJiabin <anjiabin@zhengzai.tv>
* @version V1.0
* @Description: TODO
* @class: AlipayUtil
* @Package com.liquidnet.service.dragon.channel.alipay.config
* @Copyright: LightNet @ Copyright (c) 2021
* @date 2021/7/9 15:20
*/
public class AlipayConfigUtil {
private static final Log LOG = LogFactory.getLog(AlipayConfigUtil.class);
/**
* 通过静态代码块读取上传文件的验证格式配置文件,静态代码块只执行一次(单例)
*/
private static Properties properties = new Properties();
/**
* 私有构造方法
**/
private AlipayConfigUtil() {
}
static {
try {
// 从类路径下读取属性文件
properties.load(AlipayConfigUtil.class.getClassLoader()
.getResourceAsStream("alipay_config.properties"));
} catch (IOException e) {
LOG.error(e);
}
}
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
public static final String partner = (String) properties.get("partner");
// 收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号
public static final String seller_id = (String) properties.get("seller_id");
// MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
public static final String key = (String) properties.get("key");
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static final String notify_url = (String) properties.get("notify_url");
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static final String return_url = (String) properties.get("return_url");
// 签名方式
public static final String sign_type = (String) properties.get("sign_type");
// 调试用,创建TXT日志文件夹路径,见AlipayCore.java类中的logResult(String sWord)打印方法。
public static final String log_path = (String) properties.get("log_path");
// 字符编码格式 目前支持 gbk 或 utf-8
public static final String input_charset = (String) properties.get("input_charset");
// 支付类型 ,无需修改
public static final String payment_type = (String) properties.get("payment_type");
// 调用的接口名,无需修改
public static final String service = (String) properties.get("service");
//支付宝被扫地址
public static final String trade_pay_url = (String) properties.get("trade_pay_url");
//支付宝交易查询地址
public static final String trade_query_url = (String) properties.get("trade_query_url");
//app_id
public static final String app_id = (String) properties.get("app_id");
//商户私钥
public static final String mch_private_key = (String) properties.get("mch_private_key");
//支付宝公钥
public static final String ali_public_key = (String) properties.get("ali_public_key");
// 防钓鱼时间戳 若要使用请调用类文件submit中的query_timestamp函数
public static final String anti_phishing_key = "";
// 客户端的IP地址 非局域网的外网IP地址,如:221.0.0.1
public static final String exter_invoke_ip = "";
}
package com.liquidnet.service.dragon.channel.alipay.constant;
/**
* @author AnJiabin <anjiabin@zhengzai.tv>
* @version V1.0
* @Description: TODO
* @class: AlipayConstant
* @Package com.liquidnet.service.dragon.channel.alipay.constant
* @Copyright: LightNet @ Copyright (c) 2021
* @date 2021/7/13 20:52
*/
public class AlipayConstant {
public enum AlipayTradeStateEnum {
TRADE_CLOSED ("TRADE_CLOSED","交易关闭"),
TRADE_FINISHED ("TRADE_FINISHED","支付完成"),
TRADE_SUCCESS ("TRADE_SUCCESS","支付成功"),
WAIT_BUYER_PAY ("WAIT_BUYER_PAY","交易创建"),
FAIL("","支付失败");
private String code;
private String message;
AlipayTradeStateEnum(String code, String message) {
this.code = code;
this.message = message;
}
public String getCode() {
return code;
}
}
}
package com.liquidnet.service.dragon.channel.alipay.strategy.impl;
import com.liquidnet.service.dragon.channel.alipay.biz.AlipayBiz;
import com.liquidnet.service.dragon.channel.alipay.req.AlipayTradePayReq;
import com.liquidnet.service.dragon.channel.alipay.strategy.annotation.StrategyAlipayHandler;
import com.liquidnet.service.dragon.channel.alipay.util.AlipayUtil;
import com.liquidnet.service.dragon.constant.DragonConstant;
import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto;
import lombok.extern.slf4j.Slf4j;
......@@ -35,9 +35,12 @@ public class AlipayStrategyAppImpl extends AbstractAlipayStrategy {
@Autowired
StringRedisTemplate stringRedisTemplate;
@Autowired
private AlipayBiz alipayBiz;
@Override
protected Map<String, Object> executePay(AlipayTradePayReq alipayTradePayReq) {
return AlipayUtil.tradeAppPay(alipayTradePayReq);
return alipayBiz.tradeAppPay(alipayTradePayReq);
}
protected void setProductCode() {
......@@ -52,7 +55,7 @@ public class AlipayStrategyAppImpl extends AbstractAlipayStrategy {
@Override
DragonPayBaseRespDto buildResponseDto(DragonPayBaseRespDto payBaseRespDto, Map<String, Object> respResult) {
payBaseRespDto.getPayData().setOrderStr(alipayGatewayUrl + "?" + respResult.get("body"));
payBaseRespDto.getPayData().setOrderStr(respResult.get("body").toString());
return payBaseRespDto;
}
}
package com.liquidnet.service.dragon.channel.alipay.strategy.impl;
import com.liquidnet.service.dragon.channel.alipay.biz.AlipayBiz;
import com.liquidnet.service.dragon.channel.alipay.req.AlipayTradePayReq;
import com.liquidnet.service.dragon.channel.alipay.strategy.annotation.StrategyAlipayHandler;
import com.liquidnet.service.dragon.channel.alipay.util.AlipayUtil;
import com.liquidnet.service.dragon.constant.DragonConstant;
import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto;
import lombok.extern.slf4j.Slf4j;
......@@ -35,9 +35,12 @@ public class AlipayStrategyWapImpl extends AbstractAlipayStrategy {
@Autowired
StringRedisTemplate stringRedisTemplate;
@Autowired
private AlipayBiz alipayBiz;
@Override
protected Map<String, Object> executePay(AlipayTradePayReq alipayTradePayReq) {
return AlipayUtil.tradeWapPay(alipayTradePayReq);
return alipayBiz.tradeWapPay(alipayTradePayReq);
}
protected void setProductCode() {
......
package com.liquidnet.service.dragon.channel.alipay.util;
/**
* @author AnJiabin <anjiabin@zhengzai.tv>
* @version V1.0
* @Description: TODO
* @class: AlipayUtil
* @Package com.liquidnet.service.dragon.channel.alipay.util
* @Copyright: LightNet @ Copyright (c) 2021
* @date 2021/7/9 15:20
*/
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradeWapPayResponse;
import com.liquidnet.commons.lang.util.StringUtil;
import com.liquidnet.service.dragon.channel.alipay.config.AlipayConfigUtil;
import com.liquidnet.service.dragon.channel.alipay.req.AlipayTradePayReq;
import com.liquidnet.service.dragon.channel.alipay.sign.MD5;
import com.liquidnet.service.dragon.utils.PayAlipayUtils;
import lombok.extern.slf4j.Slf4j;
import java.util.*;
@Slf4j
public class AlipayUtil {
/**
* 支付宝支付
* @param alipayTradePayReq
* @return
*/
public static Map<String, Object> tradeWapPay(AlipayTradePayReq alipayTradePayReq) {
log.info("AlipayUtil.tradeWapPay-->> req : {}",alipayTradePayReq.toString());
String timeExpress = "5m";// 支付超时,线下扫码交易定义为5分钟
AlipayClient alipayClient = PayAlipayUtils.getInstance().getHttpClient();
SortedMap<String, Object> paramMap = new TreeMap<>();
paramMap.put("product_code", alipayTradePayReq.getProductCode());
paramMap.put("total_amount", alipayTradePayReq.getTotalAmount().toString());
paramMap.put("subject", alipayTradePayReq.getSubject());
paramMap.put("body", alipayTradePayReq.getBody());
paramMap.put("out_trade_no", alipayTradePayReq.getOutTradeNo());
paramMap.put("timeout_express", timeExpress);
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
request.setNotifyUrl(alipayTradePayReq.getNotifyUrl());
// request.setTimestamp(DateUtil.now());
log.info("bizContent :{}",JSONObject.toJSONString(paramMap));
request.setBizContent(JSONObject.toJSONString(paramMap));
try {
AlipayTradeWapPayResponse response = alipayClient.sdkExecute(request);
JSONObject responseJSON = JSONObject.parseObject(JSONObject.toJSONString(response));
log.info("AlipayUtil-->tradeWapPay-->支付宝返回结果:{}", responseJSON);
return responseJSON;
} catch (AlipayApiException e) {
log.error("支付宝支付异常:{}", e);
JSONObject resultJSON = new JSONObject();
resultJSON.put("outTradeNo", alipayTradePayReq.getOutTradeNo());
resultJSON.put("totalAmount", alipayTradePayReq.getTotalAmount().toString());
resultJSON.put("errorCode", "9999");
return resultJSON;
}
}
/**
* 支付宝支付
* @param alipayTradePayReq
* @return
*/
public static Map<String, Object> tradeAppPay(AlipayTradePayReq alipayTradePayReq) {
log.info("AlipayUtil.tradeAppPay-->> req : {}",alipayTradePayReq.toString());
String timeExpress = "5m";// 支付超时,线下扫码交易定义为5分钟
AlipayClient alipayClient = PayAlipayUtils.getInstance().getHttpClient();
SortedMap<String, Object> paramMap = new TreeMap<>();
paramMap.put("product_code", alipayTradePayReq.getProductCode());
paramMap.put("total_amount", alipayTradePayReq.getTotalAmount().toString());
paramMap.put("subject", alipayTradePayReq.getSubject());
paramMap.put("body", alipayTradePayReq.getBody());
paramMap.put("out_trade_no", alipayTradePayReq.getOutTradeNo());
paramMap.put("timeout_express", timeExpress);
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
request.setNotifyUrl(alipayTradePayReq.getNotifyUrl());
// request.setTimestamp(DateUtil.now());
log.info("bizContent :{}",JSONObject.toJSONString(paramMap));
request.setBizContent(JSONObject.toJSONString(paramMap));
try {
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
JSONObject responseJSON = JSONObject.parseObject(JSONObject.toJSONString(response));
log.info("AlipayUtil-->tradeAppPay-->支付宝返回结果:{}", responseJSON);
return responseJSON;
} catch (AlipayApiException e) {
log.error("支付宝支付异常:{}", e);
JSONObject resultJSON = new JSONObject();
resultJSON.put("outTradeNo", alipayTradePayReq.getOutTradeNo());
resultJSON.put("totalAmount", alipayTradePayReq.getTotalAmount().toString());
resultJSON.put("errorCode", "9999");
return resultJSON;
}
}
/**
* 订单查询
*
* @return
*/
public static Map<String, Object> tradeQuery(String outTradeNo) {
log.info("======>支付宝交易查询");
String charset = "UTF-8";
String format = "json";
String signType = "RSA2";
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfigUtil.trade_query_url, AlipayConfigUtil.app_id, AlipayConfigUtil.mch_private_key, format, charset, AlipayConfigUtil.ali_public_key, signType);
SortedMap<String, Object> bizContentMap = new TreeMap<>();
bizContentMap.put("out_trade_no", outTradeNo);
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
request.setBizContent(JSONObject.toJSONString(bizContentMap));
try {
AlipayTradeQueryResponse response = alipayClient.execute(request);
JSONObject responseJSON = JSONObject.parseObject(JSONObject.toJSONString(response));
log.info("支付宝订单查询返回结果:{}", responseJSON);
return responseJSON;
} catch (AlipayApiException e) {
log.error("支付宝交易查询异常:{}", e);
return null;
}
}
private static String getSign(SortedMap<String, String> paramMap, String key) {
StringBuilder signBuilder = new StringBuilder();
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
if (!"sign".equals(entry.getKey()) && !"sign_type".equals(entry.getKey()) && !StringUtil.isEmpty(entry.getValue())) {
signBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
}
return MD5.sign(signBuilder.substring(0, signBuilder.length() - 1), key, "UTF-8");
}
public static Map<String , String> parseNotifyMsg(Map<String, String[]> requestParams){
Map<String,String> params = new HashMap<String,String>();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
params.put(name, valueStr);
}
return params;
}
}
......@@ -3,6 +3,7 @@ package com.liquidnet.service.dragon.channel.strategy;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto;
import com.liquidnet.service.dragon.dto.DragonPayOrderQueryRespDto;
import javax.servlet.http.HttpServletRequest;
......@@ -20,4 +21,6 @@ public interface IPayChannelStrategy {
ResponseDto<DragonPayBaseRespDto> dragonPay(DragonPayBaseReqDto dragonPayBaseReqDto);
void dragonNotify(HttpServletRequest request,String payType,String deviceFrom);
DragonPayOrderQueryRespDto checkOrderStatus(String code);
}
package com.liquidnet.service.dragon.channel.strategy.biz;
import com.liquidnet.commons.lang.util.BeanUtil;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.dragon.constant.DragonConstant;
import com.liquidnet.service.dragon.dto.DragonOrdersDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto;
import com.liquidnet.service.dragon.entity.DragonOrders;
import com.liquidnet.service.dragon.utils.DataUtils;
import com.liquidnet.service.dragon.utils.MqHandleUtil;
import org.springframework.beans.factory.annotation.Autowired;
import java.time.LocalDateTime;
/**
* @author AnJiabin <anjiabin@zhengzai.tv>
* @version V1.0
* @Description: TODO
* @class: DragonPayBiz
* @Package com.liquidnet.service.dragon.channel.strategy.biz
* @Copyright: LightNet @ Copyright (c) 2021
* @date 2021/7/14 14:12
*/
public abstract class DragonPayBiz {
@Autowired
private MqHandleUtil mqHandleUtil;
@Autowired
private DataUtils dataUtils;
public DragonOrders buildPayOrders(DragonPayBaseReqDto dragonPayBaseReqDto, DragonPayBaseRespDto respDto){
//构造订单
DragonOrders orders = new DragonOrders();
// orders.setMid();
orders.setStatus(Integer.valueOf(DragonConstant.PayStatusEnum.STATUS_UNPAID.getCode()));
orders.setCode(respDto.getCode());
orders.setType(dragonPayBaseReqDto.getType());
orders.setPrice(dragonPayBaseReqDto.getPrice());
orders.setName(dragonPayBaseReqDto.getName());
orders.setDetail(dragonPayBaseReqDto.getDetail());
orders.setOrderCode(dragonPayBaseReqDto.getOrderCode());
orders.setClientIp(dragonPayBaseReqDto.getClientIp());
orders.setNotifyUrl(dragonPayBaseReqDto.getNotifyUrl());
orders.setPaymentType(DragonConstant.PayTypeEnum.PAYMENT_TYPE_APP_IAP.getCode());
// orders.setPaymentId();
orders.setPaymentAt(LocalDateTime.now());
// orders.setFinishedAt();
orders.setCreatedAt(LocalDateTime.now());
// orders.setUpdatedAt();
DragonOrdersDto ordersDto = new DragonOrdersDto();
BeanUtil.copy(orders,ordersDto);
//放到redis缓存中
dataUtils.createPayOrder(orders.getOrderCode(),orders.getCode(),ordersDto);
// 持久化到数据库
boolean insertResult = mqHandleUtil.sendMySqlRedis(
SqlMapping.get("dragon_orders.insert"),
new Object[]{orders.getStatus(), orders.getCode(), orders.getType()
, orders.getPrice(), orders.getName(), orders.getDetail()
, orders.getOrderCode(), orders.getClientIp()
, orders.getNotifyUrl(), orders.getPaymentType(),
orders.getPaymentId(), orders.getPaymentAt()
, orders.getFinishedAt(), orders.getCreatedAt()
, orders.getUpdatedAt()}
);
return orders;
}
}
package com.liquidnet.service.dragon.channel.strategy.impl;
import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.liquidnet.common.exception.LiquidnetServiceException;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.StringUtil;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.dragon.channel.alipay.biz.AlipayBiz;
import com.liquidnet.service.dragon.channel.alipay.constant.AlipayConstant;
import com.liquidnet.service.dragon.channel.alipay.strategy.AlipayStrategyContext;
import com.liquidnet.service.dragon.channel.alipay.util.AlipayUtil;
import com.liquidnet.service.dragon.channel.strategy.IPayChannelStrategy;
import com.liquidnet.service.dragon.channel.strategy.annotation.StrategyPayChannelHandler;
import com.liquidnet.service.dragon.constant.DragonConstant;
import com.liquidnet.service.dragon.constant.DragonErrorCodeEnum;
import com.liquidnet.service.dragon.dto.DragonOrdersDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto;
import com.liquidnet.service.dragon.dto.DragonPayOrderQueryRespDto;
import com.liquidnet.service.dragon.service.impl.DragonOrderRefundsServiceImpl;
import com.liquidnet.service.dragon.utils.DataUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
......@@ -33,6 +47,26 @@ public class PayChannelStrategyAlipayImpl implements IPayChannelStrategy {
@Autowired
private AlipayStrategyContext alipayStrategyContext;
@Autowired
private DataUtils dataUtils;
@Autowired
private AlipayBiz alipayBiz;
@Autowired
private DragonOrderRefundsServiceImpl dragonOrderRefundsService;
@Value("${liquidnet.dragon.alipay.appId}")
private String appId;
@Value("${liquidnet.dragon.alipay.merchantPubKey}")
private String merchantPubKey;
@Value("${liquidnet.dragon.alipay.merchantPrivateKey}")
private String merchantPrivateKey;
@Value("${liquidnet.dragon.alipay.signtType}")
private String signtType;
@Value("${liquidnet.dragon.alipay.charset}")
private String charset;
@Override
public ResponseDto<DragonPayBaseRespDto> dragonPay(DragonPayBaseReqDto dragonPayBaseReqDto) {
return alipayStrategyContext.getStrategy(dragonPayBaseReqDto.getDeviceFrom()).dragonPay(dragonPayBaseReqDto);
......@@ -42,8 +76,102 @@ public class PayChannelStrategyAlipayImpl implements IPayChannelStrategy {
public void dragonNotify(HttpServletRequest request,String payType,String deviceFrom) {
Map<String, String[]> requestParams = request.getParameterMap();
Map<String, String> notifyMap = new HashMap<String, String>();
notifyMap = AlipayUtil.parseNotifyMsg(requestParams);
notifyMap = alipayBiz.parseNotifyMsg(requestParams);
log.info("dragonNotify-->alipay json : {}", JSON.toJSONString(notifyMap));
log.info("接收到{}支付结果{}", payType, notifyMap);
String returnStr = null;
String code = notifyMap.get("out_trade_no");
//退款
if(notifyMap.containsKey("refund_fee") || notifyMap.containsKey("gmt_refund") || notifyMap.containsKey("out_biz_no")) {
returnStr = dragonOrderRefundsService.aliPayRefundCallBack(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())) {
throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_ERROR_HAS_PAID.getCode(),DragonErrorCodeEnum.TRADE_ERROR_HAS_PAID.getMessage());
}
try {
if (AlipaySignature.rsaCheckV1(notifyMap, merchantPubKey, "UTF-8", "RSA2")){
String tradeStatus = notifyMap.get("trade_status");
if (AlipayConstant.AlipayTradeStateEnum.TRADE_FINISHED.name().equals(tradeStatus)) {
// 判断该笔订单是否在商户网站中已经做过处理
// 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
// 请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
// 如果有做过处理,不执行商户的业务程序
// 注意:
// 退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
} else if (AlipayConstant.AlipayTradeStateEnum.TRADE_SUCCESS.name().equals(tradeStatus)) {
String gmtPaymentStr = notifyMap.get("gmt_payment");// 付款时间
LocalDateTime timeEnd = null;
if (!StringUtil.isEmpty(gmtPaymentStr)) {
timeEnd = DateUtil.Formatter.yyyyMMddHHmmss.parse(gmtPaymentStr);
}
completeSuccessOrder(dragonOrdersDto, notifyMap.get("trade_no"), timeEnd, notifyMap.toString());
returnStr = "success";
} else {
// completeFailOrder(dragonOrdersDto, notifyMap.toString());
returnStr = "fail";
}
} else {// 验证失败
throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_ALIPAY_SIGN_ERROR.getCode(),DragonErrorCodeEnum.TRADE_ALIPAY_SIGN_ERROR.getMessage());
}
} catch (AlipayApiException e) {
log.error("验签失败:" , e);
throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_ALIPAY_SIGN_ERROR.getCode(),DragonErrorCodeEnum.TRADE_ALIPAY_SIGN_ERROR.getMessage());
}
log.info("返回支付通道{}信息{}", payType, returnStr);
}
@Override
public DragonPayOrderQueryRespDto checkOrderStatus(String code) {
Map<String, Object> result = alipayBiz.tradeQuery(code);
DragonPayOrderQueryRespDto respDto = new DragonPayOrderQueryRespDto();
return respDto;
}
/**
* 支付成功方法
* @param dragonOrdersDto
* @param bankTrxNo
* @param timeEnd
* @param bankReturnMsg
*/
@Transactional(rollbackFor = Exception.class)
void completeSuccessOrder(DragonOrdersDto dragonOrdersDto, String bankTrxNo, LocalDateTime timeEnd, String bankReturnMsg) {
log.info("订单支付成功!");
dragonOrdersDto.setPaymentAt(timeEnd);
dragonOrdersDto.setPaymentId(bankTrxNo);// 设置银行流水号
// DragonOrdersDto.(bankReturnMsg);
dragonOrdersDto.setStatus(Integer.parseInt(DragonConstant.PayStatusEnum.STATUS_PAID.getCode()));
dataUtils.updateOrderStatus(dragonOrdersDto.getCode(),dragonOrdersDto);
String notifyUrl = dragonOrdersDto.getNotifyUrl();
}
/**
* 支付失败方法
*
* @param DragonOrdersDto
*/
// private void completeFailOrder(DragonOrdersDto dragonOrdersDto, String bankReturnMsg) {
// log.info("订单支付失败!");
//// DragonOrdersDto.(bankReturnMsg);
// dragonOrdersDto.setStatus(Integer.parseInt(DragonConstant.PayStatusEnum.STATUS_PAID.getCode()));
// dataUtils.updateOrderStatus(dragonOrdersDto.getCode(),dragonOrdersDto);
//
// String notifyUrl = dragonOrdersDto.getNotifyUrl();
// }
}
......@@ -6,6 +6,7 @@ import com.liquidnet.service.dragon.channel.strategy.annotation.StrategyPayChann
import com.liquidnet.service.dragon.constant.DragonConstant;
import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto;
import com.liquidnet.service.dragon.dto.DragonPayOrderQueryRespDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
......@@ -34,4 +35,9 @@ public class PayChannelStrategyApplepayImpl implements IPayChannelStrategy {
public void dragonNotify(HttpServletRequest request,String payType,String deviceFrom) {
}
@Override
public DragonPayOrderQueryRespDto checkOrderStatus(String code) {
return null;
}
}
package com.liquidnet.service.dragon.channel.strategy.impl;
import com.alibaba.fastjson.JSON;
import com.liquidnet.common.exception.LiquidnetServiceException;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.StringUtil;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.dragon.channel.strategy.IPayChannelStrategy;
import com.liquidnet.service.dragon.channel.strategy.annotation.StrategyPayChannelHandler;
import com.liquidnet.service.dragon.channel.wepay.constant.WepayConstant;
import com.liquidnet.service.dragon.channel.wepay.strategy.WepayStrategyContext;
import com.liquidnet.service.dragon.constant.DragonConstant;
import com.liquidnet.service.dragon.constant.DragonErrorCodeEnum;
import com.liquidnet.service.dragon.dto.DragonOrdersDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto;
import com.liquidnet.service.dragon.dto.DragonPayOrderQueryRespDto;
import com.liquidnet.service.dragon.utils.DataUtils;
import com.liquidnet.service.dragon.utils.PayWepayUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
......@@ -35,6 +45,9 @@ public class PayChannelStrategyWepayImpl implements IPayChannelStrategy {
@Autowired
private WepayStrategyContext wepayStrategyContext;
@Autowired
private DataUtils dataUtils;
@Override
public ResponseDto<DragonPayBaseRespDto> dragonPay(DragonPayBaseReqDto dragonPayBaseReqDto) {
return wepayStrategyContext.getStrategy(dragonPayBaseReqDto.getDeviceFrom()).dragonPay(dragonPayBaseReqDto);
......@@ -48,6 +61,39 @@ public class PayChannelStrategyWepayImpl implements IPayChannelStrategy {
try {
notifyMap = PayWepayUtils.parseXml(inputStream);
log.info("dragonNotify-->wepay json : {}", JSON.toJSONString(notifyMap));
log.info("接收到{}支付结果{}", payType, notifyMap);
String code = notifyMap.get("out_trade_no");
// 根据银行订单号获取支付信息
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())) {
throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_ERROR_HAS_PAID.getCode(),DragonErrorCodeEnum.TRADE_ERROR_HAS_PAID.getMessage());
}
String partnerKey = "";
String sign = notifyMap.remove("sign");
if (PayWepayUtils.notifySign(notifyMap, sign, partnerKey)) {// 根据配置信息验证签名
if (WepayConstant.WeixinTradeStateEnum.SUCCESS.getCode().equals(notifyMap.get("result_code"))) {// 业务结果
// 成功
String timeEndStr = notifyMap.get("time_end");
LocalDateTime timeEnd = null;
if (!StringUtil.isEmpty(timeEndStr)) {
timeEnd = DateUtil.Formatter.yyyyMMddHHmmss.parse(timeEndStr);
}
completeSuccessOrder(dragonOrdersDto, notifyMap.get("transaction_id"), timeEnd, notifyMap.toString());
// returnStr = "<xml>\n" + " <return_code><![CDATA[SUCCESS]]></return_code>\n" + " <return_msg><![CDATA[OK]]></return_msg>\n" + "</xml>";
} else {
// completeFailOrder(dragonOrdersDto, notifyMap.toString());
}
} else {
throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_WEPAY_SIGN_ERROR.getCode(),DragonErrorCodeEnum.TRADE_WEPAY_SIGN_ERROR.getMessage());
}
} catch (Exception e) {
e.printStackTrace();
}
......@@ -55,4 +101,24 @@ public class PayChannelStrategyWepayImpl implements IPayChannelStrategy {
e.printStackTrace();
}
}
@Override
public DragonPayOrderQueryRespDto checkOrderStatus(String code) {
DragonOrdersDto ordersDto = dataUtils.getPayOrderByCode(code);
DragonPayOrderQueryRespDto respDto = wepayStrategyContext.getStrategy(DragonConstant.PayTypeEnum.getEnumByCode(ordersDto.getPaymentType()).getDeviceFrom()).checkOrderStatus(code);
return respDto;
}
@Transactional(rollbackFor = Exception.class)
void completeSuccessOrder(DragonOrdersDto dragonOrdersDto, String bankTrxNo, LocalDateTime timeEnd, String bankReturnMsg) {
log.info("订单支付成功!");
dragonOrdersDto.setPaymentAt(timeEnd);
dragonOrdersDto.setPaymentId(bankTrxNo);// 设置银行流水号
// DragonOrdersDto.(bankReturnMsg);
dragonOrdersDto.setStatus(Integer.parseInt(DragonConstant.PayStatusEnum.STATUS_PAID.getCode()));
dataUtils.updateOrderStatus(dragonOrdersDto.getCode(),dragonOrdersDto);
String notifyUrl = dragonOrdersDto.getNotifyUrl();
}
}
package com.liquidnet.service.dragon.channel.wepay.biz;
import com.liquidnet.service.dragon.channel.wepay.req.WepayPrePayReq;
import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto;
import com.liquidnet.service.dragon.channel.strategy.biz.DragonPayBiz;
import com.liquidnet.service.dragon.channel.wepay.resp.WepayOrderQueryRespDto;
import com.liquidnet.service.dragon.utils.PayWepayUtils;
import com.liquidnet.service.dragon.utils.XmlUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
/**
* @author AnJiabin <anjiabin@zhengzai.tv>
* @version V1.0
......@@ -16,26 +29,48 @@ import org.springframework.stereotype.Component;
*/
@Slf4j
@Component
public class WepayBiz {
public WepayPrePayReq sealWeixinPerPay(DragonPayBaseReqDto dragonPayBaseReqDto) {
WepayPrePayReq WepayPrePayReq = new WepayPrePayReq();
// WepayPrePayReq.setAppid(appId);
// WepayPrePayReq.setMchId(mchId);
// WepayPrePayReq.setBody(productName);// 商品描述
// WepayPrePayReq.setAttach(remark);// 支付备注
// WepayPrePayReq.setOutTradeNo(bankOrderNo);// 银行订单号
//
// Integer totalFee = orderPrice.multiply(BigDecimal.valueOf(100d)).intValue();
// WepayPrePayReq.setTotalFee(totalFee);// 订单金额
// WepayPrePayReq.setTimeStart(DateUtil.parse(orderTime, "yyyyMMddHHmmss"));// 订单开始时间
//// WepayPrePayReq.setTimeExpire(DateUtil.formatDate(DateUtil.addMinute(orderTime, orderPeriod), "yyyyMMddHHmmss"));// 订单到期时间
// WepayPrePayReq.setNotifyUrl(WeixinConfigUtil.readConfig("notify_url"));// 通知地址
//// WepayPrePayReq.setTradeType("");// 交易类型
// WepayPrePayReq.setProductId(productId);// 商品ID
// WepayPrePayReq.setOpenid(openId);// 用户标识
// WepayPrePayReq.setSpbillCreateIp(orderIp);// 下单IP
return WepayPrePayReq;
public class WepayBiz extends DragonPayBiz{
@Value("${liquidnet.dragon.wepay.merchantId}")
private String merchantId;
@Autowired
private WepayBiz wepayBiz;
/**
* 订单查询
*
* @return
*/
public WepayOrderQueryRespDto tradeQuery(String outTradeNo,String appid) {
log.info("======>支付宝交易查询");
WepayOrderQueryRespDto respDto = null;
SortedMap<String, Object> paramMap = new TreeMap<>();
paramMap.put("appid", appid);
paramMap.put("mch_id", merchantId);
String nonce_str = PayWepayUtils.getInstance().getNonceStr();
paramMap.put("nonce_str", nonce_str);
paramMap.put("out_trade_no", outTradeNo);
String sign = PayWepayUtils.getInstance().createSign(paramMap);
paramMap.put("sign", sign);
Set<String> ks = paramMap.keySet();
String data = PayWepayUtils.getInstance().getRequestXml(paramMap);
try{
HttpPost httpost = new HttpPost("https://api.mch.weixin.qq.com/pay/orderquery");
httpost.setEntity(new StringEntity(data, "UTF-8"));
CloseableHttpResponse response = null;
response = PayWepayUtils.getInstance().getHttpClient().execute(httpost);
HttpEntity entity = response.getEntity();
//接受到返回信息
String xmlStr = EntityUtils.toString(response.getEntity(), "UTF-8");
EntityUtils.consume(entity);
log.info("dragonPay:wepay:wap response xmlStr: {} ",xmlStr);
respDto = XmlUtil.toBean(xmlStr, WepayOrderQueryRespDto.class);
}catch (Exception e){
log.error(e.getMessage());
}
return respDto;
}
}
/*
* Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.liquidnet.service.dragon.channel.wepay.config;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.IOException;
import java.util.Properties;
/**
* <b>功能说明:微信属性文件工具类
* </b>
* @author Peter
* <a href="http://www.roncoo.com">龙果学院(www.roncoo.com)</a>
*/
public class WeixinConfigUtil {
private static final Log LOG = LogFactory.getLog(WeixinConfigUtil.class);
/**
* 通过静态代码块读取上传文件的验证格式配置文件,静态代码块只执行一次(单例)
*/
private static Properties properties = new Properties();
private WeixinConfigUtil() {
}
// 通过类装载器装载进来
static {
try {
// 从类路径下读取属性文件
properties.load(WeixinConfigUtil.class.getClassLoader()
.getResourceAsStream("weixinpay_config.properties"));
} catch (IOException e) {
LOG.error(e);
}
}
/**
* 函数功能说明 :读取配置项 Administrator 2012-12-14 修改者名字 : 修改日期 : 修改内容 :
*
* @参数:
* @return void
* @throws
*/
public static String readConfig(String key) {
return (String) properties.get(key);
}
//app_id
public static final String appId = (String) properties.get("appId");
//商户号
public static final String mch_id = (String) properties.get("mch_id");
//商户秘钥
public static final String partnerKey = (String) properties.get("partnerKey");
//小程序支付
public static final String xAuthUrl = (String) properties.get("x_auth_url");
public static final String xGrantType = (String) properties.get("x_grant_type");
public static final String xAppId = (String) properties.get("x_appId");
public static final String xPartnerKey = (String) properties.get("x_partnerKey");
public static final String xPayKey = (String) properties.get("x_payKey");
public static final String xMchId = (String) properties.get("x_mch_id");
public static final String x_notify_url = (String) properties.get("x_notify_url");
}
package com.liquidnet.service.dragon.channel.wepay.constant;
/**
* @author AnJiabin <anjiabin@zhengzai.tv>
* @version V1.0
* @Description: TODO
* @class: WepayConstant
* @Package com.liquidnet.service.dragon.channel.wepay
* @Copyright: LightNet @ Copyright (c) 2021
* @date 2021/7/14 11:05
*/
public class WepayConstant {
public enum WeixinTradeStateEnum {
SUCCESS("SUCCESS","成功"), FAIL("FAIL","失败");
private String code;
private String message;
WeixinTradeStateEnum(String code, String message) {
this.code = code;
this.message = message;
}
public String getCode() {
return code;
}
}
}
package com.liquidnet.service.dragon.channel.wepay.resp;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class AliPayRefundReturnCallBackDto {
@JsonProperty("gmt_create")
private String gmtCreate;
@JsonProperty("charset")
private String charset;
@JsonProperty("seller_email")
private String sellerEmail;
@JsonProperty("gmt_payment")
private String gmtPayment;
@JsonProperty("notify_time")
private String notifyTime;
@JsonProperty("subject")
private String subject;
@JsonProperty("gmt_refund")
private String gmtRefund;
@JsonProperty("sign")
private String sign;
@JsonProperty("out_biz_no")
private String outBizNo;
@JsonProperty("body")
private String body;
@JsonProperty("buyer_id")
private String buyerId;
@JsonProperty("version")
private String version;
@JsonProperty("notify_id")
private String notifyId;
@JsonProperty("notify_type")
private String notifyType;
@JsonProperty("out_trade_no")
private String outTradeNo;
@JsonProperty("total_amount")
private String totalAmount;
@JsonProperty("trade_status")
private String tradeStatus;
@JsonProperty("refund_fee")
private String refundFee;
@JsonProperty("trade_no")
private String tradeNo;
@JsonProperty("auth_app_id")
private String authAppId;
@JsonProperty("buyer_logon_id")
private String buyerLogonId;
@JsonProperty("app_id")
private String appId;
@JsonProperty("sign_type")
private String signType;
@JsonProperty("seller_id")
private String sellerId;
}
package com.liquidnet.service.dragon.channel.wepay.resp;
import lombok.Data;
/**
* @author AnJiabin <anjiabin@zhengzai.tv>
* @version V1.0
* @Description: TODO
* @class: WepayPayOrderQueryRespDto
* @Package com.liquidnet.service.dragon.channel.wepay.resp
* @Copyright: LightNet @ Copyright (c) 2021
* @date 2021/7/14 13:21
*/
@Data
public class WepayOrderQueryRespDto {
}
......@@ -3,6 +3,7 @@ package com.liquidnet.service.dragon.channel.wepay.strategy;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto;
import com.liquidnet.service.dragon.dto.DragonPayOrderQueryRespDto;
/**
......@@ -16,4 +17,6 @@ import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto;
*/
public interface IWepayStrategy {
ResponseDto<DragonPayBaseRespDto> dragonPay(DragonPayBaseReqDto dragonPayBaseReqDto);
DragonPayOrderQueryRespDto checkOrderStatus(String code);
}
package com.liquidnet.service.dragon.channel.wepay.strategy.impl;
import com.liquidnet.common.exception.LiquidnetServiceException;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.dragon.channel.wepay.biz.WepayBiz;
import com.liquidnet.service.dragon.channel.wepay.constant.WepayConstant;
import com.liquidnet.service.dragon.channel.wepay.resp.WepayOrderQueryRespDto;
import com.liquidnet.service.dragon.channel.wepay.resp.WepayPayRespDto;
import com.liquidnet.service.dragon.channel.wepay.strategy.IWepayStrategy;
import com.liquidnet.service.dragon.constant.DragonErrorCodeEnum;
import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto;
import com.liquidnet.service.dragon.dto.DragonPayOrderQueryRespDto;
import com.liquidnet.service.dragon.utils.PayWepayUtils;
import com.liquidnet.service.dragon.utils.XmlUtil;
import lombok.extern.slf4j.Slf4j;
......@@ -14,7 +20,7 @@ import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.annotation.Autowired;
import java.math.BigDecimal;
import java.util.SortedMap;
......@@ -31,8 +37,8 @@ import java.util.TreeMap;
*/
@Slf4j
public abstract class AbstractWepayStrategy implements IWepayStrategy {
@Value("${liquidnet.dragon.wepay.parentKey}")
private String parentKey;
@Autowired
private WepayBiz wepayBiz;
@Override
public ResponseDto<DragonPayBaseRespDto> dragonPay(DragonPayBaseReqDto dragonPayBaseReqDto) {
......@@ -58,13 +64,22 @@ public abstract class AbstractWepayStrategy implements IWepayStrategy {
EntityUtils.consume(entity);
log.info("dragonPay:wepay:wap response xmlStr: {} ",xmlStr);
WepayPayRespDto respWepayDto= XmlUtil.toBean(xmlStr, WepayPayRespDto.class);
if(WepayConstant.WeixinTradeStateEnum.SUCCESS.getCode().equalsIgnoreCase(respWepayDto.getReturnCode())){
if(WepayConstant.WeixinTradeStateEnum.SUCCESS.getCode().equalsIgnoreCase(respWepayDto.getResultCode())){
//构造公共返回参数
DragonPayBaseRespDto respPayDto = this.buildCommonRespDto(dragonPayBaseReqDto,respWepayDto);
//构造自定义返回参数
this.buildResponseDto(respPayDto,respWepayDto);
//支付订单持久化
wepayBiz.buildPayOrders(dragonPayBaseReqDto,respPayDto);
return ResponseDto.success(respPayDto);
}else{
throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_PARAM_ERROR.getCode(),DragonErrorCodeEnum.TRADE_PARAM_ERROR.getMessage());
}
}else{
throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_PARAM_ERROR.getCode(),DragonErrorCodeEnum.TRADE_PARAM_ERROR.getMessage());
}
} catch (Exception e) {
e.printStackTrace();
}
......@@ -103,7 +118,7 @@ public abstract class AbstractWepayStrategy implements IWepayStrategy {
parameters.put("mch_id", PayWepayUtils.getInstance().getMerchantId());
parameters.put("nonce_str", nonceStr);
parameters.put("spbill_create_ip", dragonPayBaseReqDto.getClientIp());
parameters.put("total_fee", dragonPayBaseReqDto.getPrice().multiply(BigDecimal.valueOf(100L)).intValue());
parameters.put("total_fee", dragonPayBaseReqDto.getPrice().multiply(BigDecimal.valueOf(100L)).intValue()+"");
parameters.put("body", dragonPayBaseReqDto.getName());
parameters.put("detail", dragonPayBaseReqDto.getDetail());
parameters.put("out_trade_no", dragonPayBaseReqDto.getCode());
......@@ -135,4 +150,16 @@ public abstract class AbstractWepayStrategy implements IWepayStrategy {
* 设置notifyUrl
*/
protected abstract String getNotifyUrl();
@Override
public DragonPayOrderQueryRespDto checkOrderStatus(String code) {
WepayOrderQueryRespDto result = wepayBiz.tradeQuery(code,this.getAppid());
DragonPayOrderQueryRespDto respDto = new DragonPayOrderQueryRespDto();
respDto.setCode(code);
respDto.setOrderCode("");
respDto.setStatus("");
return respDto;
}
protected abstract String getAppid();
}
......@@ -37,6 +37,7 @@ public class WepayStrategyAppImpl extends AbstractWepayStrategy {
@Override
DragonPayBaseRespDto buildResponseDto(DragonPayBaseRespDto payBaseRespDto, WepayPayRespDto respDto) {
payBaseRespDto.getPayData().setMwebUrl(respDto.getMwebUrl());
payBaseRespDto.getPayData().setPackages("Sign=WXPay");
return payBaseRespDto;
}
......@@ -49,4 +50,9 @@ public class WepayStrategyAppImpl extends AbstractWepayStrategy {
protected String getNotifyUrl() {
return notifyUrl + "/notify/wepay/app";
}
@Override
protected String getAppid() {
return PayWepayUtils.getInstance().getAPP_ID();
}
}
......@@ -50,4 +50,9 @@ public class WepayStrategyAppletImpl extends AbstractWepayStrategy{
protected String getNotifyUrl() {
return notifyUrl + "/notify/wepay/applet";
}
@Override
protected String getAppid() {
return PayWepayUtils.getInstance().getAPPLET_APP_ID();
}
}
......@@ -50,4 +50,9 @@ public class WepayStrategyJsImpl extends AbstractWepayStrategy{
protected String getNotifyUrl() {
return notifyUrl + "/notify/wepay/js";
}
@Override
protected String getAppid() {
return PayWepayUtils.getInstance().getJS_APP_ID();
}
}
......@@ -49,4 +49,9 @@ public class WepayStrategyWapImpl extends AbstractWepayStrategy{
protected String getNotifyUrl() {
return notifyUrl + "/notify/wepay/wap";
}
@Override
protected String getAppid() {
return PayWepayUtils.getInstance().getWAP_APP_ID();
}
}
/*
* Copyright 2015-2102 RonCoo(http://www.roncoo.com) Group.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.liquidnet.service.dragon.channel.wepay.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.security.MessageDigest;
/**
* <b>功能说明:MD5签名工具类
* </b>
* @author Peter
* <a href="http://www.roncoo.com">龙果学院(www.roncoo.com)</a>
*/
public class MD5Util {
private static final Logger LOG = LoggerFactory.getLogger(MD5Util.class);
/**
* 私有构造方法,将该工具类设为单例模式.
*/
private MD5Util() {
}
private static final String[] hex = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
public static String encode(String password) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] byteArray = md5.digest(password.getBytes("utf-8"));
String passwordMD5 = byteArrayToHexString(byteArray);
return passwordMD5;
} catch (Exception e) {
LOG.error(e.toString());
}
return password;
}
private static String byteArrayToHexString(byte[] byteArray) {
StringBuffer sb = new StringBuffer();
for (byte b : byteArray) {
sb.append(byteToHexChar(b));
}
return sb.toString();
}
private static Object byteToHexChar(byte b) {
int n = b;
if (n < 0) {
n = 256 + n;
}
int d1 = n / 16;
int d2 = n % 16;
return hex[d1] + hex[d2];
}
}
//package com.liquidnet.service.dragon.channel.wepay.util;
//
//import com.liquidnet.commons.lang.util.StringUtil;
//import com.liquidnet.service.dragon.channel.wepay.req.WepayPrePayReq;
//import lombok.extern.slf4j.Slf4j;
//import org.dom4j.Document;
//import org.dom4j.Element;
//import org.dom4j.io.SAXReader;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import javax.net.ssl.HttpsURLConnection;
//import java.io.IOException;
//import java.io.InputStream;
//import java.io.InputStreamReader;
//import java.io.OutputStream;
//import java.net.MalformedURLException;
//import java.net.URL;
//import java.util.*;
//
///**
// * @author AnJiabin <anjiabin@zhengzai.tv>
// * @version V1.0
// * @Description: TODO
// * @class: WepayUtil
// * @Package com.liquidnet.service.dragon.channel.wepay.util
// * @Copyright: LightNet @ Copyright (c) 2021
// * @date 2021/7/9 15:20
// */
//@Slf4j
//public class WepayUtil {
// private static final Logger logger = LoggerFactory.getLogger(WepayUtil.class);
//
// private WepayUtil() {
//
// }
//
// /**
// * 生成随机字符串
// *
// * @return
// */
// public static String getnonceStr() {
// Random random = new Random();
// StringBuilder nonceStrBuilder = new StringBuilder();
// for (int i = 0; i < 31; i++) {
// nonceStrBuilder.append(random.nextInt(10));
// }
// return nonceStrBuilder.toString();
// }
//
// /**
// * 转xml格式
// *
// * @param paramMap
// * @return
// */
// public static String mapToXml(SortedMap<String, Object> paramMap) {
// StringBuilder dataBuilder = new StringBuilder("<xml>");
// for (Map.Entry<String, Object> entry : paramMap.entrySet()) {
// if (!StringUtil.isEmpty(entry.getValue())) {
// dataBuilder.append("<").append(entry.getKey()).append(">").append(entry.getValue()).append("</").append(entry.getKey()).append(">");
// }
// }
// dataBuilder.append("</xml>");
// logger.info("Map转Xml结果:{}", dataBuilder.toString());
// return dataBuilder.toString();
// }
//
// /**
// * 发送xml数据,获取返回结果
// *
// * @param requestUrl
// * @param requestMethod
// * @param xmlStr
// * @return
// */
// public static Map<String, Object> httpXmlRequest(String requestUrl, String requestMethod, String xmlStr) {
// // 将解析结果存储在HashMap中
// Map<String, Object> map = new HashMap<String, Object>();
// try {
// HttpsURLConnection urlCon = (HttpsURLConnection) (new URL(requestUrl)).openConnection();
// urlCon.setDoInput(true);
// urlCon.setDoOutput(true);
// // 设置请求方式(GET/POST)
// urlCon.setRequestMethod(requestMethod);
//
// if ("GET".equalsIgnoreCase(requestMethod)) {
// urlCon.connect();
// }
//
// urlCon.setRequestProperty("Content-Length", String.valueOf(xmlStr.getBytes().length));
// urlCon.setUseCaches(false);
// // 设置为gbk可以解决服务器接收时读取的数据中文乱码问题
// if (null != xmlStr) {
// OutputStream outputStream = urlCon.getOutputStream();
// outputStream.write(xmlStr.getBytes("UTF-8"));
// outputStream.flush();
// outputStream.close();
// }
// InputStream inputStream = urlCon.getInputStream();
// InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
// // 读取输入流
// SAXReader reader = new SAXReader();
// Document document = reader.read(inputStreamReader);
// // 得到xml根元素
// Element root = document.getRootElement();
// // 得到根元素的所有子节点
// @SuppressWarnings("unchecked")
// List<Element> elementList = root.elements();
// // 遍历所有子节点
// for (Element e : elementList) {
// map.put(e.getName(), e.getText());
// }
// log.info("微信查询返回结果:"+map.toString());
// inputStreamReader.close();
// inputStream.close();
// inputStream = null;
// urlCon.disconnect();
// } catch (MalformedURLException e) {
// log.error(e.getMessage());
// } catch (IOException e) {
// log.error(e.getMessage());
// } catch (Exception e) {
// log.error(e.getMessage());
// }
// return map;
// }
//
// /**
// * 生成预支付XML
// *
// * @param WepayPrePayReq
// * @param partnerKey
// * @return
// */
// public static String getPrePayXml(WepayPrePayReq WepayPrePayReq, String partnerKey) {
//
// getPrePaySign(WepayPrePayReq, partnerKey);// 生成预支付请求签名
//
// StringBuilder sb = new StringBuilder();
// sb.append("<xml><appid>").append(WepayPrePayReq.getAppid()).append("</appid>");
// sb.append("<body>").append(WepayPrePayReq.getBody()).append("</body>");
// sb.append("<device_info>").append(WepayPrePayReq.getDeviceInfo()).append("</device_info>");
// sb.append("<mch_id>").append(WepayPrePayReq.getMchId()).append("</mch_id>");
// sb.append("<nonce_str>").append(WepayPrePayReq.getNonceStr()).append("</nonce_str>");
// sb.append("<notify_url>").append(WepayPrePayReq.getNotifyUrl()).append("</notify_url>");
//// if (WeiXinTradeTypeEnum.NATIVE.name().equals(WepayPrePayReq.getTradeType())) {
//// sb.append("<product_id>").append(WepayPrePayReq.getProductId()).append("</product_id>");
//// } else if (WeiXinTradeTypeEnum.JSAPI.name().equals(WepayPrePayReq.getTradeType())) {
//// sb.append("<openid>").append(WepayPrePayReq.getOpenid()).append("</openid>");
//// }
// sb.append("<out_trade_no>").append(WepayPrePayReq.getOutTradeNo()).append("</out_trade_no>");
// sb.append("<spbill_create_ip>").append(WepayPrePayReq.getSpbillCreateIp()).append("</spbill_create_ip>");
// sb.append("<time_start>").append(WepayPrePayReq.getTimeStart()).append("</time_start>");
// sb.append("<time_expire>").append(WepayPrePayReq.getTimeExpire()).append("</time_expire>");
// sb.append("<total_fee>").append(WepayPrePayReq.getTotalFee()).append("</total_fee>");
//// sb.append("<trade_type>").append(WepayPrePayReq.getTradeType().name()).append("</trade_type>");
// sb.append("<sign>").append(WepayPrePayReq.getSign()).append("</sign>");
// sb.append("</xml>");
//
// return sb.toString();
// }
//
// /**
// * 微信拼接签名参数
// *
// * @param appid 公众账号ID
// * @param mch_id 商户号
// * @param device_info 设备号
// * @param trade_type 交易类型
// * @param prePay 预支付返回Map
// * @param partnerKey 签名EY
// * @return
// */
// public static String geWeiXintPrePaySign(String appid, String mch_id, String device_info, String trade_type,
// Map<String, Object> prePay, String partnerKey) {
// Map<String, Object> preParams = new HashMap<String, Object>();
// if (!StringUtil.isEmpty(prePay.get("return_code"))) {
// preParams.put("return_code", prePay.get("return_code"));
// }
// if (!StringUtil.isEmpty(prePay.get("return_msg"))) {
// preParams.put("return_msg", prePay.get("return_msg"));
// }
// if (!StringUtil.isEmpty(prePay.get("appid"))) {
// preParams.put("appid", appid);
// }
// if (!StringUtil.isEmpty(prePay.get("mch_id"))) {
// preParams.put("mch_id", mch_id);
// }
// if (!StringUtil.isEmpty(prePay.get("device_info"))) {
// preParams.put("device_info", device_info);
// }
// if (!StringUtil.isEmpty(prePay.get("nonce_str"))) {
// preParams.put("nonce_str", prePay.get("nonce_str"));
// }
// if (!StringUtil.isEmpty(prePay.get("result_code"))) {
// preParams.put("result_code", prePay.get("result_code"));
// }
// if ("FAIL".equals(prePay.get("result_code"))) {
// if (!StringUtil.isEmpty(prePay.get("err_code"))) {
// preParams.put("err_code", prePay.get("err_code"));
// }
// if (!StringUtil.isEmpty(prePay.get("err_code_des"))) {
// preParams.put("err_code_des", prePay.get("err_code_des"));
// }
// }
// if (!StringUtil.isEmpty(prePay.get("trade_type"))) {
// preParams.put("trade_type", trade_type);
// }
// if (!StringUtil.isEmpty(prePay.get("prepay_id"))) {
// preParams.put("prepay_id", prePay.get("prepay_id"));
// }
// if (!StringUtil.isEmpty(prePay.get("code_url"))) {
// preParams.put("code_url", prePay.get("code_url"));
// }
// String argPreSign = getStringByMap(preParams) + "&key=" + partnerKey;
// String preSign = MD5Util.encode(argPreSign).toUpperCase();
// return preSign;
// }
//
// public static boolean notifySign(Map<String, String> result, String sign, String partnerKey) {
// String argNotifySign = getStringByStringMap(result) + "&key=" + partnerKey;
// String notifySign = MD5Util.encode(argNotifySign).toUpperCase();
// if (notifySign.equals(sign)) {
// return true;
// } else {
// return false;
// }
// }
//
// /**
// * 获取预支付请求签名
// *
// * @param WepayPrePayReq
// * @param partnerKey
// * @return
// */
// private static void getPrePaySign(WepayPrePayReq WepayPrePayReq, String partnerKey) {
//
// Map<String, Object> prePayMap = new HashMap<String, Object>();
// prePayMap.put("appid", WepayPrePayReq.getAppid());// 公众账号ID
// prePayMap.put("mch_id", WepayPrePayReq.getMchId()); // 商户号
// prePayMap.put("device_info", WepayPrePayReq.getDeviceInfo());
// prePayMap.put("nonce_str", WepayPrePayReq.getNonceStr()); // 随机字符串
// prePayMap.put("body", WepayPrePayReq.getBody()); // 商品描述
// prePayMap.put("out_trade_no", WepayPrePayReq.getOutTradeNo()); // 商户订单号
// prePayMap.put("total_fee", WepayPrePayReq.getTotalFee()); // 总金额
// prePayMap.put("spbill_create_ip", WepayPrePayReq.getSpbillCreateIp()); // 终端IP
// prePayMap.put("time_start", WepayPrePayReq.getTimeStart()); // 开始时间
// prePayMap.put("time_expire", WepayPrePayReq.getTimeExpire()); // 截止时间
// prePayMap.put("notify_url", WepayPrePayReq.getNotifyUrl()); // 接收财付通通知的URL
//// prePayMap.put("trade_type", WepayPrePayReq.getTradeType().name()); // 交易类型
//// if (WeiXinTradeTypeEnum.NATIVE.name().equals(WepayPrePayReq.getTradeType())) {
//// prePayMap.put("product_id", WepayPrePayReq.getProductId()); // 商品ID
//// } else if (WeiXinTradeTypeEnum.JSAPI.name().equals(WepayPrePayReq.getTradeType())) {
//// prePayMap.put("openid", WepayPrePayReq.getOpenid()); // openid
//// }
//
// String argPreSign = getStringByMap(prePayMap) + "&key=" + partnerKey;
// String preSign = MD5Util.encode(argPreSign).toUpperCase();
// WepayPrePayReq.setSign(preSign);
// }
//
// /**
// * 根据Map获取排序拼接后的字符串
// *
// * @param map
// * @return
// */
// public static String getStringByMap(Map<String, Object> map) {
// SortedMap<String, Object> smap = new TreeMap<String, Object>(map);
// StringBuffer sb = new StringBuffer();
// for (Map.Entry<String, Object> m : smap.entrySet()) {
// sb.append(m.getKey()).append("=").append(m.getValue()).append("&");
// }
// sb.delete(sb.length() - 1, sb.length());
// return sb.toString();
// }
//
// public static String getStringByStringMap(Map<String, String> map) {
// SortedMap<String, Object> smap = new TreeMap<String, Object>(map);
// StringBuffer sb = new StringBuffer();
// for (Map.Entry<String, Object> m : smap.entrySet()) {
// sb.append(m.getKey()).append("=").append(m.getValue()).append("&");
// }
// sb.delete(sb.length() - 1, sb.length());
// return sb.toString();
// }
//
// /**
// * 解析微信发来的请求(XML)
// *
// * @param inputStream
// * @return
// * @throws Exception
// */
// @SuppressWarnings("unchecked")
// public static Map<String, String> parseXml(InputStream inputStream) throws Exception {
//
// if (inputStream == null) {
// return null;
// }
//
// Map<String, String> map = new HashMap<String, String>();// 将解析结果存储在HashMap中
// SAXReader reader = new SAXReader();// 读取输入流
// Document document = reader.read(inputStream);
// Element root = document.getRootElement();// 得到xml根元素
// List<Element> elementList = root.elements();// 得到根元素的所有子节点
// for (Element e : elementList) { // 遍历所有子节点
// map.put(e.getName(), e.getText());
// }
//
// inputStream.close(); // 释放资源
// inputStream = null;
//
// return map;
// }
//
// /**
// * 订单查询
// *
// * @param outTradeNo
// * @return
// */
// public static Map<String, Object> orderQuery(String outTradeNo, String appId, String MchId, String partnerKey) {
// Random random = new Random();
// Map<String, Object> paramMap = new HashMap<>();
// paramMap.put("appid", appId);
// paramMap.put("mch_id", MchId);
// String nonce_str = "";
// for (int i = 0; i < 31; i++) {
// nonce_str += random.nextInt(10);
// }
// paramMap.put("nonce_str", nonce_str);
// paramMap.put("out_trade_no", outTradeNo);
// String signStr = getStringByMap(paramMap) + "&key=" + partnerKey;
// paramMap.put("sign", MD5Util.encode(signStr).toUpperCase());
// Set<String> ks = paramMap.keySet();
// StringBuilder sb = new StringBuilder("<xml>");
// for (String key : ks) {
// sb.append("<" + key + ">" + paramMap.get(key) + "</" + key + ">");
// }
// sb.append("</xml>");
// Map<String, Object> resultMap = httpXmlRequest("https://api.mch.weixin.qq.com/pay/orderquery", "POST",
// sb.toString());
// return resultMap;
// }
//}
......@@ -106,10 +106,7 @@ public class PayController {
})
@ResponseBody
public ResponseDto<DragonPayOrderQueryRespDto> checkOrder(@RequestParam(value = "code") @NotNull(message = "支付编号不能为空!") String code){
DragonPayOrderQueryRespDto respDto = new DragonPayOrderQueryRespDto();
respDto.setCode(code);
respDto.setOrderCode("");
respDto.setStatus(DragonConstant.PayStatusEnum.STATUS_PAID.getCode());
DragonPayOrderQueryRespDto respDto = dragonOrdersService.checkOrderStatusByCode(code);
return ResponseDto.success(respDto);
}
}
package com.liquidnet.service.dragon.controller;
import com.liquidnet.service.dragon.service.IDragonOrderRefundsService;
import com.liquidnet.service.dragon.service.IDragonOrdersService;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
......
package com.liquidnet.service.dragon.service.impl;
import com.alibaba.fastjson.JSON;
import com.alipay.api.request.AlipayTradeFastpayRefundQueryRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.HttpUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.dragon.channel.wepay.resp.AliPayRefundReturnCallBackDto;
import com.liquidnet.service.dragon.channel.wepay.resp.WePayRefundReturnCallBackDto;
import com.liquidnet.service.dragon.channel.wepay.resp.WePayRefundReturnCallBackInfoDto;
import com.liquidnet.service.dragon.constant.DragonConstant;
import com.liquidnet.service.dragon.dto.DragonRefundAppDto;
import com.liquidnet.service.dragon.dto.DragonRefundChannelDto;
import com.liquidnet.service.dragon.dto.NotifyUrlDto;
import com.liquidnet.service.dragon.dto.RefundContentDto;
import com.liquidnet.service.dragon.dto.*;
import com.liquidnet.service.dragon.channel.wepay.resp.WePayRefundReturnDto;
import com.liquidnet.service.dragon.service.IDragonOrderRefundsService;
import com.liquidnet.service.dragon.utils.PayAlipayUtils;
......@@ -321,7 +322,6 @@ public class DragonOrderRefundsServiceImpl implements IDragonOrderRefundsService
contentDto.setResponse(response.getBody());
channelDto.setContent(contentDto);
return channelDto;
} catch (Exception e) {
e.printStackTrace();
log.error("");
......@@ -383,7 +383,7 @@ public class DragonOrderRefundsServiceImpl implements IDragonOrderRefundsService
dto.setRefundCode(info.getOutTradeNo());
dto.setRefundPrice(info.getRefundFee());
// dto.setRefundReason();
dto.setRefundId(info.getRefundId());
// dto.setRefundId(info.getRefundId());
// dto.setRefundType(info.getrefund);
dto.setRefundAt(refundAt);
dto.setRefundError(callBackDto.getReturnMsg());
......@@ -404,6 +404,69 @@ public class DragonOrderRefundsServiceImpl implements IDragonOrderRefundsService
}
}
public String aliPayRefundCallBack(String jsonStr) {
LocalDateTime nowTime = LocalDateTime.now();
try {
AliPayRefundReturnCallBackDto callBackDto = JsonUtils.fromJson(jsonStr, AliPayRefundReturnCallBackDto.class);
AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();//创建API对应的request类
request.setBizContent("{" +
"\"out_trade_no\":\"" + callBackDto.getOutTradeNo() + "\"," +
"\"trade_no\":\"" + callBackDto.getTradeNo() + "\"," +
"\"out_request_no\":\"" + callBackDto.getOutBizNo() + "\"}"); //设置业务参数
AlipayTradeFastpayRefundQueryResponse response = PayAlipayUtils.getInstance().getHttpClient().execute(request);
log.debug("AlipayTradeFastpayRefundQueryRequest -> data = " + JSON.toJSONString(response));
if (response.isSuccess()) {
try {
sendMySqlRedis(
SqlMapping.get("dragon_order_refund_log.insert"),
new Object[]{response.getOutRequestNo(), response.getRefundReason(), jsonStr, nowTime, nowTime}
);
log.debug("SEND MQ INSERT");
sendMySqlRedis(
SqlMapping.get("dragon_order_refund_success.update"),
new Object[]{nowTime, callBackDto.getGmtRefund(), DragonConstant.RefundStatusEnum.STATUS_REFUNDED.getCode(), response.getOutRequestNo()}
);
log.debug("SEND MQ UPDATE");
NotifyUrlDto dto = new NotifyUrlDto();
if (response.getMsg().equalsIgnoreCase("SUCCESS")) {
dto.setStatus(1);
} else {
dto.setStatus(0);
}
dto.setOrderRefundCode(response.getOutRequestNo());
dto.setRefundCode(response.getOutTradeNo());
dto.setRefundPrice(response.getRefundAmount());
dto.setRefundAt(callBackDto.getGmtRefund());
dto.setRefundPrice(response.getRefundAmount());
dto.setRefundError("");
log.debug("SEND NOTIFTURL = "+ JSON.toJSONString(dto));
sendNotifyUrl(dto);
return "success";
} catch (Exception e) {
e.printStackTrace();
log.error("");
return "fail";
}
} else {
log.error("response.isSuccess() -> fail ");
return "fail";
}
} catch (Exception e) {
e.printStackTrace();
log.error("");
return "fail";
}
}
/**
* out_biz_no -> orderRefundCode
* trade_no -> paymentId
* orderCode -> 不存在
* code -> out_trade_no
*
*/
/**
* 给 REDIS 队列发送消息 数据库相关
*
......@@ -438,7 +501,7 @@ public class DragonOrderRefundsServiceImpl implements IDragonOrderRefundsService
params.add("refundAt", notifyUrlDto.getRefundAt());
params.add("refundCode", notifyUrlDto.getRefundCode());
params.add("refundError", notifyUrlDto.getRefundError());
params.add("refundId", notifyUrlDto.getRefundId());
// params.add("refundId", notifyUrlDto.getRefundId());
params.add("refundPrice", notifyUrlDto.getRefundPrice());
params.add("status", notifyUrlDto.getStatus().toString());
String response = HttpUtil.post((String) redisUtil.get(DragonConstant.REFUND_REDIS_KET + notifyUrlDto.getOrderRefundCode()), params);
......
package com.liquidnet.service.dragon.service.impl;
import com.liquidnet.common.exception.LiquidnetServiceException;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.commons.lang.util.StringUtil;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.dragon.channel.strategy.PayChannelStrategyContext;
import com.liquidnet.service.dragon.constant.DragonConstant;
import com.liquidnet.service.dragon.constant.DragonErrorCodeEnum;
import com.liquidnet.service.dragon.dto.DragonOrdersDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto;
import com.liquidnet.service.dragon.dto.DragonPayOrderQueryRespDto;
import com.liquidnet.service.dragon.service.IDragonOrdersService;
import com.liquidnet.service.dragon.utils.DataUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.stream.MapRecord;
import org.springframework.data.redis.connection.stream.StreamRecords;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
@Slf4j
@Service
......@@ -25,17 +29,8 @@ public class DragonOrdersServiceImpl implements IDragonOrdersService {
@Autowired
private PayChannelStrategyContext payChannelStrategyContext;
@Override
public void sendRedisQueue() {
try {
HashMap<String ,String> map = new HashMap<>();
map.put("message","测试 redis 订阅信息1");
MapRecord<String, String, String> record = StreamRecords.mapBacked(map).withStreamKey("dragon-pay");
stringRedisTemplate.opsForStream().add(record);
}catch (Exception e){
e.printStackTrace();
}
}
@Autowired
private DataUtils dataUtils;
@Override
public ResponseDto<DragonPayBaseRespDto> dragonPay(DragonPayBaseReqDto dragonPayBaseReqDto) {
......@@ -48,4 +43,18 @@ public class DragonOrdersServiceImpl implements IDragonOrdersService {
public void dragonNotify(HttpServletRequest request,String payType,String deviceFrom) {
payChannelStrategyContext.getStrategy(payType).dragonNotify(request,payType,deviceFrom);
}
@Override
public DragonPayOrderQueryRespDto checkOrderStatusByCode(String code) {
DragonOrdersDto ordersDto = dataUtils.getPayOrderByCode(code);
if(StringUtil.isEmpty(ordersDto)){
throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_ERROR_NOT_EXISTS.getCode(),DragonErrorCodeEnum.TRADE_ERROR_NOT_EXISTS.getMessage());
}
return payChannelStrategyContext.getStrategy(DragonConstant.PayTypeEnum.getEnumByCode(ordersDto.getPaymentType()).getPayType()).checkOrderStatus(code);
}
@Override
public DragonPayOrderQueryRespDto checkOrderStatusByOrderCode(String orderCode) {
return null;
}
}
package com.liquidnet.service.dragon.utils;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.service.dragon.constant.DragonConstant;
import com.liquidnet.service.dragon.dto.DragonOrdersDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class DataUtils {
@Autowired
private RedisUtil redisUtil;
public void createPayOrder(String orderCode, String code, DragonOrdersDto ordersDto) {
if (redisUtil.hasKey(DragonConstant.REDIS_KET_PAY_ORDERCODE + orderCode)) {
} else {
redisUtil.set(DragonConstant.REDIS_KET_PAY_ORDERCODE + orderCode, code);
redisUtil.set(DragonConstant.REDIS_KET_PAY_CODE + code, ordersDto);
}
}
public DragonOrdersDto getPayOrderByCode(String code){
if (!redisUtil.hasKey(DragonConstant.REDIS_KET_PAY_CODE + code)) {
//TODO 是否降级处理
}
return (DragonOrdersDto) redisUtil.get(DragonConstant.REDIS_KET_PAY_CODE + code);
}
public DragonOrdersDto getPayOrderByOrderCode(String orderCode){
if (!redisUtil.hasKey(DragonConstant.REDIS_KET_PAY_ORDERCODE + orderCode)) {
//TODO 是否降级处理
}
//获取支付订单号
String code = (String)redisUtil.get(DragonConstant.REDIS_KET_PAY_ORDERCODE + orderCode);
return (DragonOrdersDto) redisUtil.get(DragonConstant.REDIS_KET_PAY_CODE + code);
}
public void updateOrderStatus(String code,DragonOrdersDto dragonOrdersDto){
redisUtil.set(DragonConstant.REDIS_KET_PAY_CODE + code, dragonOrdersDto);
}
}
......@@ -25,7 +25,7 @@ public class PayWepayUtils {
private static PayWepayUtils instance = new PayWepayUtils();
private final String merchantId = "1551961491";
private final String parentKey = "itIuO65O9yKmemOu3S8g1S4orqvCGwXK";
private final String partnerKey = "itIuO65O9yKmemOu3S8g1S4orqvCGwXK";
private final String APP_ID="wx86f9777acf2cb585";
private final String WEB_APP_ID="wx3498304dda39c5a1";
......@@ -121,7 +121,7 @@ public class PayWepayUtils {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + parentKey);
sb.append("key=" + partnerKey);
return MD5Utils.md5(sb.toString()).toUpperCase();
}
......@@ -147,7 +147,7 @@ public class PayWepayUtils {
public String unCodeReqInfo(String reqInfo) {
try {
Cipher cipher ;
String key = MD5Utils.md5(parentKey);
String key = MD5Utils.md5(partnerKey);
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
Security.addProvider(new BouncyCastleProvider());
......@@ -185,4 +185,28 @@ public class PayWepayUtils {
return map;
}
public String getPartnerKey() {
return this.partnerKey;
}
public static boolean notifySign(Map<String, String> result, String sign, String partnerKey) {
String argNotifySign = getStringByStringMap(result) + "&key=" + partnerKey;
String notifySign = MD5Utils.md5(argNotifySign).toUpperCase();
if (notifySign.equals(sign)) {
return true;
} else {
return false;
}
}
public static String getStringByStringMap(Map<String, String> map) {
SortedMap<String, Object> smap = new TreeMap<String, Object>(map);
StringBuffer sb = new StringBuffer();
for (Map.Entry<String, Object> m : smap.entrySet()) {
sb.append(m.getKey()).append("=").append(m.getValue()).append("&");
}
sb.delete(sb.length() - 1, sb.length());
return sb.toString();
}
}
......@@ -5,7 +5,7 @@ dragon_order_refund_error.update=UPDATE `dragon_order_refunds` SET updated_at =
dragon_order_refund_success.update=UPDATE `dragon_order_refunds` SET updated_at = ? , refund_at=? , status=? WHERE order_refund_code = ?
dragon_order_refund_call_back.update=UPDATE `dragon_order_refunds` SET updated_at = ? , finished_at=? , status=? WHERE order_refund_code = ?
# ------------------------创建退款订单日志----------------------------
dragon_order_refund_log.insert=INSERT INTO `dragon_order_refunds`(`order_refund_id` ,`refund_type` ,`content`,`created_at`,`updated_at`)VALUES(?,?,?,?,?);
dragon_order_refund_log.insert=INSERT INTO `dragon_order_refund_logs`(`order_refund_id` ,`refund_type` ,`content`,`created_at`,`updated_at`)VALUES(?,?,?,?,?);
dragon_orders.insert=INSERT INTO DRAGON_ORDERS (ID, STATUS, CODE, TYPE, PRICE, NAME, DETAIL, ORDER_CODE, CLIENT_IP, NOTIFY_URL, PAYMENT_TYPE,PAYMENT_ID, PAYMENT_AT, FINISHED_AT, CREATED_AT, UPDATED_AT, DELETED_AT)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
......
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