|
|
@@ -5,11 +5,15 @@ import cn.hutool.http.Header;
|
|
|
import cn.hutool.http.HttpRequest;
|
|
|
import cn.hutool.http.HttpResponse;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import com.fdkankan.pay.entity.PaypalConfig;
|
|
|
import com.fdkankan.pay.service.IPaypalConfigService;
|
|
|
+import com.fdkankan.pay.util.CacheUtil;
|
|
|
+import com.fdkankan.pay.util.paypal.restApi.vo.EventTypeVo;
|
|
|
import com.fdkankan.pay.util.paypal.restApi.vo.Product;
|
|
|
+import com.fdkankan.pay.util.paypal.restApi.vo.WebhookVo;
|
|
|
import com.fdkankan.pay.util.paypal.restApi.vo.plan.*;
|
|
|
import com.fdkankan.pay.util.paypal.restApi.vo.subscription.*;
|
|
|
import com.paypal.api.payments.EventType;
|
|
|
@@ -18,9 +22,11 @@ import com.paypal.api.payments.Webhook;
|
|
|
import com.paypal.api.payments.WebhookList;
|
|
|
import com.paypal.base.rest.APIContext;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import javax.annotation.PostConstruct;
|
|
|
import java.io.IOException;
|
|
|
import java.io.InputStream;
|
|
|
import java.io.OutputStreamWriter;
|
|
|
@@ -37,9 +43,56 @@ public class RestApiPaypalService {
|
|
|
IPaypalConfigService paypalConfigService;
|
|
|
|
|
|
/**
|
|
|
+ * 启动创建webhooks
|
|
|
+ * https://testeur.4dkankan.com/service/pay/paypal/webhook
|
|
|
+ */
|
|
|
+ @PostConstruct
|
|
|
+ public void createWebhooks() {
|
|
|
+ log.info("--------------项目启动初始化webhook-------------");
|
|
|
+ List<PaypalConfig> list = paypalConfigService.list();
|
|
|
+ for (PaypalConfig paypalConfig : list) {
|
|
|
+ if(StringUtils.isBlank(paypalConfig.getWebhookId())){
|
|
|
+ try {
|
|
|
+ Map<String,String> map = new HashMap<>(4);
|
|
|
+ map.put("Content-Type","application/json");
|
|
|
+ WebhookVo webhookVo = new WebhookVo();
|
|
|
+ webhookVo.setUrl(CacheUtil.mainUrl +"/service/pay/paypal/webhook");
|
|
|
+ webhookVo.getEvent_types().add(new EventTypeVo("CATALOG.PRODUCT.CREATED"));
|
|
|
+ webhookVo.getEvent_types().add(new EventTypeVo("BILLING.PLAN.CREATED"));
|
|
|
+ webhookVo.getEvent_types().add(new EventTypeVo("BILLING.PLAN.ACTIVATED"));
|
|
|
+ webhookVo.getEvent_types().add(new EventTypeVo("BILLING.SUBSCRIPTION.CREATED"));
|
|
|
+ webhookVo.getEvent_types().add(new EventTypeVo("BILLING.SUBSCRIPTION.EXPIRED"));
|
|
|
+ webhookVo.getEvent_types().add(new EventTypeVo("BILLING.SUBSCRIPTION.SUSPENDED"));
|
|
|
+ webhookVo.getEvent_types().add(new EventTypeVo("PAYMENT.SALE.COMPLETED"));
|
|
|
+
|
|
|
+ String string = JSONObject.toJSONString(webhookVo);
|
|
|
+ String body = HttpRequest.post(paypalConfig.getBaseUrl() + "/v1/notifications/webhooks")
|
|
|
+ .addHeaders(map)
|
|
|
+ .basicAuth(paypalConfig.getClientId(), paypalConfig.getSecret())
|
|
|
+ .body(string)
|
|
|
+ .execute().body();
|
|
|
+ log.info("paypal-createWebhooks:{}",body);
|
|
|
+ JSONObject resp = JSONObject.parseObject(body);
|
|
|
+ String webhookId = resp.getString("id");
|
|
|
+ paypalConfig.setWebhookId(webhookId);
|
|
|
+
|
|
|
+ LambdaUpdateWrapper<PaypalConfig> wrapper = new LambdaUpdateWrapper<>();
|
|
|
+ wrapper.eq(PaypalConfig::getId,paypalConfig.getId());
|
|
|
+ wrapper.set(PaypalConfig::getWebhookId,webhookId);
|
|
|
+ paypalConfigService.update(wrapper);
|
|
|
+
|
|
|
+ }catch (Exception e){
|
|
|
+ log.info("paypal-createWebhooks:error:",e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* 获取token
|
|
|
*/
|
|
|
- public String getToken(PaypalConfig paypalConfig) {
|
|
|
+ public static String getToken(PaypalConfig paypalConfig) {
|
|
|
String body = HttpRequest.post(paypalConfig.getBaseUrl() + "/v1/oauth2/token")
|
|
|
.basicAuth(paypalConfig.getClientId(), paypalConfig.getSecret())
|
|
|
.form("grant_type", "client_credentials")
|
|
|
@@ -215,7 +268,7 @@ public class RestApiPaypalService {
|
|
|
/**
|
|
|
* 取消订阅
|
|
|
*/
|
|
|
- public void cancelSubscriptions(PaypalConfig paypalConfig,String subscriptionsId) throws Exception {
|
|
|
+ public static void cancelSubscriptions(PaypalConfig paypalConfig, String subscriptionsId) throws Exception {
|
|
|
Map<String,String> map = new HashMap<>(4);
|
|
|
map.put("Content-Type","application/json");
|
|
|
map.put("Authorization",getToken(paypalConfig));
|
|
|
@@ -224,67 +277,19 @@ public class RestApiPaypalService {
|
|
|
.basicAuth(paypalConfig.getClientId(),paypalConfig.getSecret())
|
|
|
.execute();
|
|
|
// 订阅正常创建
|
|
|
+ log.info("resp:{}",response);
|
|
|
if (response.getStatus() == 201) {
|
|
|
JSONObject respObj = JSONObject.parseObject(response.body());
|
|
|
System.out.println(respObj);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
- //https://testeur.4dkankan.com/service/pay/paypal/webhook
|
|
|
- public String createWebhooks(PaypalConfig paypalConfig) {
|
|
|
- try {
|
|
|
- Map<String,String> map = new HashMap<>(4);
|
|
|
- map.put("Content-Type","application/json");
|
|
|
- String string = "{ \"url\": \"https://testeur.4dkankan.com/service/pay/paypal/webhook\", " +
|
|
|
- "\"event_types\": " +
|
|
|
- "[ { \"name\": \"CATALOG.PRODUCT.CREATED\" }," +
|
|
|
- " { \"name\": \"BILLING.PLAN.CREATED\" } ," +
|
|
|
- " { \"name\": \"BILLING.PLAN.ACTIVATED\" }, " +
|
|
|
- " { \"name\": \"BILLING.SUBSCRIPTION.CREATED\" } ," +
|
|
|
- " { \"name\": \"BILLING.SUBSCRIPTION.CANCELLED\" } ," +
|
|
|
- " { \"name\": \"BILLING.SUBSCRIPTION.EXPIRED\" }, " +
|
|
|
- " { \"name\": \"BILLING.SUBSCRIPTION.SUSPENDED\" } ," +
|
|
|
- " { \"name\": \"PAYMENT.SALE.COMPLETED\" } " +
|
|
|
- "] }";
|
|
|
- String body = HttpRequest.post(paypalConfig.getBaseUrl() + "/v1/notifications/webhooks")
|
|
|
- .addHeaders(map)
|
|
|
- .basicAuth(paypalConfig.getClientId(), paypalConfig.getSecret())
|
|
|
- .body(string)
|
|
|
- .execute().body();
|
|
|
- log.info("paypal-createWebhooks:{}",body);
|
|
|
- JSONObject resp = JSONObject.parseObject(body);
|
|
|
- return resp.getString("id");
|
|
|
- }catch (Exception e){
|
|
|
- log.info("paypal-createWebhooks:error:",e);
|
|
|
- }
|
|
|
- return null;
|
|
|
- }
|
|
|
|
|
|
- public static void main(String[] args) throws IOException {
|
|
|
- try {
|
|
|
- Map<String,String> map = new HashMap<>(4);
|
|
|
- map.put("Content-Type","application/json");
|
|
|
- String string = "{ \"url\": \"https://testeur.4dkankan.com/service/pay/paypal/webhook\", " +
|
|
|
- "\"event_types\": " +
|
|
|
- "[ { \"name\": \"CATALOG.PRODUCT.CREATED\" }," +
|
|
|
- " { \"name\": \"BILLING.PLAN.CREATED\" } ," +
|
|
|
- " { \"name\": \"BILLING.PLAN.ACTIVATED\" }, " +
|
|
|
- " { \"name\": \"BILLING.SUBSCRIPTION.CREATED\" } ," +
|
|
|
- " { \"name\": \"BILLING.SUBSCRIPTION.CANCELLED\" } ," +
|
|
|
- " { \"name\": \"BILLING.SUBSCRIPTION.EXPIRED\" }, " +
|
|
|
- " { \"name\": \"BILLING.SUBSCRIPTION.SUSPENDED\" } ," +
|
|
|
- " { \"name\": \"PAYMENT.SALE.COMPLETED\" } " +
|
|
|
- "] }";
|
|
|
- String body = HttpRequest.post("https://api.paypal.com" + "/v1/notifications/webhooks")
|
|
|
- .addHeaders(map)
|
|
|
- .basicAuth("AZJEGWlvvI2q52bR4k_mC1ftW8tEnlaJj30huGQTBsdAjwmKlMDiEiMixVKbfrdw6fB55NSj_BAE8FPP",
|
|
|
- "EL-RGNmsbFpcKT7QuIlxMxX7MQplp8rCyaGDZ5KOCMQ9BkOhY5OYZyVInAeHT8_4tXoPth8tOEZY_3s_")
|
|
|
- .body(string)
|
|
|
- .execute().body();
|
|
|
- log.info("paypal-createProduct:{}",body);
|
|
|
- //3DV94823N4765920R
|
|
|
- }catch (Exception e){
|
|
|
- log.info("paypal-createProduct:error:",e);
|
|
|
- }
|
|
|
+
|
|
|
+ public static void main(String[] args) throws Exception {
|
|
|
+ PaypalConfig paypalConfig = new PaypalConfig();
|
|
|
+ paypalConfig.setBaseUrl("https://api.paypal.com");
|
|
|
+ paypalConfig.setClientId("AZJEGWlvvI2q52bR4k_mC1ftW8tEnlaJj30huGQTBsdAjwmKlMDiEiMixVKbfrdw6fB55NSj_BAE8FPP");
|
|
|
+ paypalConfig.setSecret("EL-RGNmsbFpcKT7QuIlxMxX7MQplp8rCyaGDZ5KOCMQ9BkOhY5OYZyVInAeHT8_4tXoPth8tOEZY_3s_");
|
|
|
}
|
|
|
}
|