1、接入paypal

2、修改支付宝支付
This commit is contained in:
2024-03-01 17:31:26 +08:00
parent e28502a00c
commit ee96759832
32 changed files with 1379 additions and 163 deletions

View File

@@ -0,0 +1,51 @@
package com.ai.da.common.config;
import com.paypal.core.PayPalEnvironment;
import com.paypal.core.PayPalHttpClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import java.util.Iterator;
@Configuration
@Slf4j
@PropertySource("classpath:paypal-sandbox.properties")
public class PayPalClient {
public PayPalHttpClient client(String mode, String clientId, String clientSecret) {
log.info("mode={}, clientId={}, clientSecret={}", mode, clientId, clientSecret);
PayPalEnvironment environment = mode.equals("live") ? new PayPalEnvironment.Live(clientId, clientSecret) : new PayPalEnvironment.Sandbox(clientId, clientSecret);
return new PayPalHttpClient(environment);
}
/**
* @param jo
* @param pre
* @return
*/
/*public String prettyPrint(JSONObject jo, String pre) {
Iterator<?> keys = jo.keys();
StringBuilder pretty = new StringBuilder();
while (keys.hasNext()) {
String key = (String) keys.next();
pretty.append(String.format("%s%s: ", pre, StringUtils.capitalize(key)));
if (jo.get(key) instanceof JSONObject) {
pretty.append(prettyPrint(jo.getJSONObject(key), pre + "\t"));
} else if (jo.get(key) instanceof JSONArray) {
int sno = 1;
for (Object jsonObject : jo.getJSONArray(key)) {
pretty.append(String.format("\n%s\t%d:\n", pre, sno++));
pretty.append(prettyPrint((JSONObject) jsonObject, pre + "\t\t"));
}
} else {
pretty.append(String.format("%s\n", jo.getString(key)));
}
}
return pretty.toString();
}*/
}

View File

@@ -0,0 +1,177 @@
package com.ai.da.common.constant;
public class PayPalCheckoutConstant {
public static String MODE = "sandbox";
public static final String CAPTURE = "CAPTURE";
/**
* 该标签将覆盖PayPal网站上PayPal帐户中的公司名称
*/
public static final String BRANDNAME = "AIDA";
/**
* LOGIN。当客户单击PayPal Checkout时客户将被重定向到页面以登录PayPal并批准付款。
* BILLING。当客户单击PayPal Checkout时客户将被重定向到一个页面以输入信用卡或借记卡以及完成购买所需的其他相关账单信息
* NO_PREFERENCE。当客户单击“ PayPal Checkout”时将根据其先前的交互方式将其重定向到页面以登录PayPal并批准付款或重定向至页面以输入信用卡或借记卡以及完成购买所需的其他相关账单信息使用PayPal。
* 默认值NO_PREFERENCE
*/
public static final String LANDINGPAGE = "NO_PREFERENCE";
/**
* CONTINUE。将客户重定向到PayPal付款页面后将出现“ 继续”按钮。当结帐流程启动时最终金额未知时,请使用此选项,并且您想将客户重定向到商家页面而不处理付款。
* PAY_NOW。将客户重定向到PayPal付款页面后出现“ 立即付款”按钮。当启动结帐时知道最终金额并且您要在客户单击“ 立即付款”时立即处理付款时,请使用此选项。
*/
public static final String USERACTION = "PAY_NOW";
/**
* GET_FROM_FILE。使用贝宝网站上客户提供的送货地址。
* NO_SHIPPING。从PayPal网站编辑送货地址。推荐用于数字商品
* SET_PROVIDED_ADDRESS。使用商家提供的地址。客户无法在PayPal网站上更改此地址
*/
// public static final String SHIPPINGPREFERENCE = "SET_PROVIDED_ADDRESS";
public static final String SHIPPINGPREFERENCE = "NO_SHIPPING";
/**
* 交易异常
*/
public static final String FAILURE = "failure";
/**
* 交易成功
*/
public static final String SUCCESS = "success";
/**
* ipn回调。支付成功
*/
public static final String PAYMENT_STATUS_COMPLETED = "Completed";
/**
* ipn回调。退款成功
*/
public static final String PAYMENT_STATUS_REFUNDED = "Refunded";
/**
* ipn回调。待定
*/
public static final String PAYMENT_STATUS_PENDING = "Pending";
/**
* ipn回调付款因退款或其他类型的冲销而被冲销。资金已从您的帐户余额中删除并退还给买方
*/
public static final String PAYMENT_STATUS_REVERSED = "Reversed";
/**
* ipn回调, 撤销已被取消。例如,您赢得了与客户的纠纷,并且撤回的交易资金已退还给您
*/
public static final String PAYMENT_STATUS_CANCELED_REVERSAL = "Canceled_Reversal";
/**
* ipn回调付款被拒绝
*/
public static final String PAYMENT_STATUS_DENIED = "Denied";
/**
* ipn回调 此授权已过期,无法捕获
*/
public static final String PAYMENT_STATUS_EXPIRED = "Expired";
/**
* ipn回调 德国的ELV付款是通过Express Checkout进行的
*/
public static final String PAYMENT_STATUS_CREATED = "Created";
/**
* ipn回调 付款失败。仅当付款是通过您客户的银行帐户进行的。
*/
public static final String PAYMENT_STATUS_FAILED = "Failed";
/**
* ipn回调付款已被接受
*/
public static final String PAYMENT_STATUS_PROCESSED = "Processed";
/**
* ipn回调此授权已失效
*/
public static final String PAYMENT_STATUS_VOIDED = "Voided";
//订单状态
/**
* 1、支付完成;捕获的付款的资金已记入收款人的PayPal帐户
* 2、退款完成;该交易的资金已记入客户的帐户
*/
public static final String STATE_COMPLETED = "COMPLETED";
/**
* 部分退款;少于所捕获付款金额的金额已部分退还给付款人。
*/
public static final String STATE_PARTIALLY_REFUNDED = "PARTIALLY_REFUNDED";
/**
* 1、支付待定;捕获的付款资金尚未记入收款人的PayPal帐户。有关更多信息请参见status.details。
* 2、退款待定;有关更多信息请参见status_details.reason。
*/
/**
* 支付待定:
* capture_status_details
* reason 枚举
* 捕获的付款状态为PENDING或DENIED的原因。可能的值为
* BUYER_COMPLAINT。付款人与贝宝PayPal对此捕获的付款提出了争议。
* CHARGEBACK。响应于付款人与用于支付此已捕获付款的金融工具的发行人对此已捕获的付款提出异议已收回的资金被撤回。
* ECHECK。由尚未结清的电子支票支付的付款人。
* INTERNATIONAL_WITHDRAWAL。访问您的在线帐户。在您的“帐户概览”中接受并拒绝此笔付款。
* OTHER。无法提供其他特定原因。有关此笔付款的更多信息请在线访问您的帐户或联系PayPal。
* PENDING_REVIEW。捕获的付款正在等待人工审核。
*手动收取RECEIVING_PREFERENCE_MANDATES_MANUAL_ACTION。收款人尚未为其帐户设置适当的接收首选项。有关如何接受或拒绝此付款的更多信息请在线访问您的帐户。通常在某些情况下提供此原因例如当所捕获付款的货币与收款人的主要持有货币不同时。
* REFUNDED。收回的资金已退还。
* TRANSACTION_APPROVED_AWAITING_FUNDING。付款人必须将这笔付款的资金汇出。通常此代码适用于手动EFT。
* UNILATERAL。收款人没有PayPal帐户。
* VERIFICATION_REQUIRED。收款人的PayPal帐户未通过验证。
*/
/**
* 退款待定
* 退款具有“PENDING”或“FAILED”状态的原因。 可能的值为:
* ECHECK。客户的帐户通过尚未结清的eCheck进行注资。
*/
public static final String STATE_PENDING = "PENDING";
/**
* 退款;大于或等于此捕获的付款金额的金额已退还给付款人
*/
public static final String STATE_REFUNDED = "REFUNDED";
/**
* 支付拒绝
*/
public static final String STATE_DENIED = "DENIED";
/**
* 退款失败
*/
public static final String STATE_FAILED = "FAILED";
/**
* 争议状态
*/
public static final String BUYER_COMPLAINT = "BUYER_COMPLAINT";
/**
* 沙箱环境请求网关地址
*/
public static final String SANDBOX = "https://api.sandbox.paypal.com";
/**
* 生产环境请求网关地址
*/
public static final String LIVE = "https://api.paypal.com";
/**
* 添加物流信息请求路径
*/
public static final String ADD_TRACK_URL = "/v1/shipping/trackers-batch";
/**
* 修改物流信息请求路径
*/
public static final String UPDATE_TRACK_URL = "/v1/shipping/trackers/";
public final static String CMD_NOTIFY_VALIDATE = "_notify-validate";
public final static String WEBHOOK_ID = "31797347YC028794L";
public final static String PAYPAL_TOKEN_KEY = "PayPalAccessToken";
}

View File

@@ -0,0 +1,40 @@
package com.ai.da.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
public enum CurrencyCodesEnum {
AUSTRALIAN_DOLLAR("AUD"),
BRAZILIAN_REAL("BRL"),
CANADIAN_DOLLAR("CAD"),
CHINESE_RENMENBI("CNY"),
CZECH_KORUNA("CZK"),
DANISH_KRONE("DKK"),
EURO("EUR"),
HONG_KONG_DOLLAR("HKD"),
HUNGARIAN_FORINT("HUF"),
ISRAELI_NEW_SHEKEL("ILS"),
JAPANESE_YEN("JPY"),
MALAYSIAN_RINGGIT("MYR"),
MEXICAN_PESO("MXN"),
NEW_TAIWAN_DOLLAR("TWD"),
NEW_ZEALAND_DOLLAR("NZD"),
NORWEGIAN_KRONE("NOK"),
PHILIPPINE_PESO("PHP"),
POLISH_ZLOTY("PLN"),
POUND_STERLING("GBP"),
RUSSIAN_RUBLE("RUB"),
SINGAPORE_DOLLAR("SGD"),
SWEDISH_KRONA("SEK"),
SWISS_FRANC("CHF"),
THAI_BAHT("THB"),
UNITED_STATES_DOLLAR("USD");
private String code;
CurrencyCodesEnum(String code) {
this.code = code;
}
}

View File

@@ -20,7 +20,7 @@ public enum OrderStatusEnum {
/**
* 已关闭
*/
CLOSED("超时已关闭"),
TIMEOUT_CLOSED("超时已关闭"),
/**
* 已取消

View File

@@ -0,0 +1,24 @@
package com.ai.da.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum PayPalOrderStatusEnum {
CREATED("CREATED"),
SAVED("SAVED"),
APPROVED("APPROVED"),
VOIDED("VOIDED"),
COMPLETED("COMPLETED"),
PAYER_ACTION_REQUIRED("PAYER_ACTION_REQUIRED");
private final String status;
}

View File

@@ -11,11 +11,15 @@ public enum PayTypeEnum {
*/
WXPAY("微信"),
/**
* 支付宝
*/
ALIPAY("支付宝");
ALIPAY("支付宝"),
/**
* PayPal
*/
PAYPAL("PayPal");
/**
* 类型

View File

@@ -48,7 +48,7 @@ public class AuthenticationFilter extends OncePerRequestFilter {
"/api/third/party/addNoLoginRequiredNew","/api/third/party/deleteNoLoginRequiredNew",
"/api/third/party/existNoLoginRequired","/api/third/party/getRedirectUrl",
// "/api/python/chatStream",
"/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify"
"/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify","/api/paypal/ipn/back"
);
@Override

View File

@@ -29,7 +29,7 @@ public class AliPayTask {
log.info("orderConfirm 被执行......");
List<OrderInfo> orderInfoList = orderInfoService.getNoPayOrderByDuration(1, PayTypeEnum.ALIPAY.getType());
List<OrderInfo> orderInfoList = orderInfoService.getNoPayOrderByDuration(5, PayTypeEnum.ALIPAY.getType());
for (OrderInfo orderInfo : orderInfoList) {
String orderNo = orderInfo.getOrderNo();

View File

@@ -9,6 +9,7 @@ import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@Slf4j
@Component
@@ -17,6 +18,10 @@ public class RedisUtil {
@Resource
private RedisTemplate<String, String> redisTemplate;
public Boolean hasKey(String key){
return redisTemplate.hasKey(key);
}
//- - - - - - - - - - - - - - - - - - - - - ZSet类型 - - - - - - - - - - - - - - - - - - - -
/**
@@ -123,4 +128,14 @@ public class RedisUtil {
public Long removeFromMap(String key, String hashKeys) {
return redisTemplate.opsForHash().delete(key, hashKeys);
}
//- - - - - - - - - - - - - - - - - - - - - String类型 - - - - - - - - - - - - - - - - - - - -
public void addToString(String key, String value, Long expiresIn){
redisTemplate.opsForValue().set(key,value,expiresIn, TimeUnit.SECONDS);
}
public String getFromString(String key){
return redisTemplate.opsForValue().get(key);
}
}

View File

@@ -0,0 +1,30 @@
package com.ai.da.common.utils.paypalRequest;
import com.alibaba.fastjson.JSONObject;
import com.paypal.http.HttpRequest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.HashMap;
@Component
public class AuthenticationRequest extends HttpRequest<HashMap> {
public AuthenticationRequest() {
super("/v1/oauth2/token", "POST", HashMap.class);
this.header("Content-Type", "application/x-www-form-urlencoded");
body();
}
public AuthenticationRequest authorization(String clientId, String clientSecret) {
this.header(clientId, clientSecret);
return this;
}
public AuthenticationRequest body() {
HashMap<String, String> body = new HashMap<>();
body.put("grant_type", "client_credentials");
this.requestBody(body);
return this;
}
}

View File

@@ -0,0 +1,26 @@
package com.ai.da.common.utils.paypalRequest;
import com.ai.da.model.dto.WebhookVerifyDTO;
import com.alibaba.fastjson.JSONObject;
import com.paypal.http.HttpRequest;
import com.paypal.orders.OrdersCreateRequest;
import java.io.Serializable;
import java.util.HashMap;
public class WebhookVerifyRequest extends HttpRequest<HashMap> {
public WebhookVerifyRequest() {
super("/v1/notifications/verify-webhook-signature", "POST", HashMap.class);
this.header("Content-Type", "application/json");
}
public WebhookVerifyRequest authorization(String authorization) {
this.header("Authorization", "Bearer " + String.valueOf(authorization));
return this;
}
public WebhookVerifyRequest requestBody(HashMap<String,String> webhookVerify) {
super.requestBody(webhookVerify);
return this;
}
}