[英]how to wait for the response from paypal after the payment is successful?
我想集成一个支付系统,但我不知道一旦这个人支付了我应该如何等待贝宝的响应。 网上所有的例子都是基于asp.net的,我不认为我们可以做同样的事情............ ..................................................... ..................................................
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;
using PayPalCheckoutSdk.Core;
using PayPalCheckoutSdk.Orders;
using PayPalCheckoutSdk.Payments;
using PayPalHttp;
namespace Discord.Modules
{
public class PaypalPayment
{
private static OrderRequest BuildRequestBody()
{
OrderRequest orderRequest = new OrderRequest()
{
CheckoutPaymentIntent = "CAPTURE",
ApplicationContext = new ApplicationContext
{
BrandName = "EXAMPLE INC",
LandingPage = "BILLING",
CancelUrl = "https://www.example.com",
ReturnUrl = "https://www.example.com",
UserAction = "CONTINUE",
ShippingPreference = "SET_PROVIDED_ADDRESS"
},
PurchaseUnits = new List<PurchaseUnitRequest>
{
new PurchaseUnitRequest{
ReferenceId = "PUHF",
Description = "Sporting Goods",
CustomId = "CUST-HighFashions",
SoftDescriptor = "HighFashions",
AmountWithBreakdown = new AmountWithBreakdown
{
CurrencyCode = "USD",
Value = "220.00",
AmountBreakdown = new AmountBreakdown
{
ItemTotal = new PayPalCheckoutSdk.Orders.Money
{
CurrencyCode = "USD",
Value = "180.00"
},
Shipping = new PayPalCheckoutSdk.Orders.Money
{
CurrencyCode = "USD",
Value = "20.00"
},
Handling = new PayPalCheckoutSdk.Orders.Money
{
CurrencyCode = "USD",
Value = "10.00"
},
TaxTotal = new PayPalCheckoutSdk.Orders.Money
{
CurrencyCode = "USD",
Value = "20.00"
},
ShippingDiscount = new PayPalCheckoutSdk.Orders.Money
{
CurrencyCode = "USD",
Value = "10.00"
}
}
},
Items = new List<Item>
{
new Item
{
Name = "T-shirt",
Description = "Green XL",
Sku = "sku01",
UnitAmount = new PayPalCheckoutSdk.Orders.Money
{
CurrencyCode = "USD",
Value = "90.00"
},
Tax = new PayPalCheckoutSdk.Orders.Money
{
CurrencyCode = "USD",
Value = "10.00"
},
Quantity = "1",
Category = "PHYSICAL_GOODS"
},
new Item
{
Name = "Shoes",
Description = "Running, Size 10.5",
Sku = "sku02",
UnitAmount = new PayPalCheckoutSdk.Orders.Money
{
CurrencyCode = "USD",
Value = "45.00"
},
Tax = new PayPalCheckoutSdk.Orders.Money
{
CurrencyCode = "USD",
Value = "5.00"
},
Quantity = "2",
Category = "PHYSICAL_GOODS"
}
},
ShippingDetail = new ShippingDetail
{
Name = new Name
{
FullName = "John Doe"
},
AddressPortable = new AddressPortable
{
AddressLine1 = "123 Townsend St",
AddressLine2 = "Floor 6",
AdminArea2 = "San Francisco",
AdminArea1 = "CA",
PostalCode = "94107",
CountryCode = "US"
}
}
}
}
};
return orderRequest;
}
public async static Task<HttpResponse> CreateOrder(bool debug = false)
{
var request = new OrdersCreateRequest();
request.Headers.Add("prefer", "return=representation");
request.RequestBody(BuildRequestBody());
var client = PayPalClient.client();
var response = await client.Execute(request);
if (debug)
{
var result = response.Result<Order>();
Console.WriteLine("Status: {0}", result.Status);
Console.WriteLine("Order Id: {0}", result.Id);
Console.WriteLine("Intent: {0}", result.CheckoutPaymentIntent);
Console.WriteLine("Links:");
foreach (PayPalCheckoutSdk.Orders.LinkDescription link in result.Links)
{
Console.WriteLine("\t{0}: {1}\tCall Type: {2}", link.Rel, link.Href, link.Method);
}
AmountWithBreakdown amount = result.PurchaseUnits[0].AmountWithBreakdown;
Console.WriteLine("Total Amount: {0} {1}", amount.CurrencyCode, amount.Value);
Console.WriteLine("Response JSON: \n {0}", PayPalClient.ObjectToJSONString(result));
}
return response;
}
public async static Task<HttpResponse> CaptureOrder(string OrderId, bool debug = false)
{
var request = new OrdersCaptureRequest(OrderId);
request.Prefer("return=representation");
request.RequestBody(new OrderActionRequest());
var client = PayPalClient.client();
var response = await client.Execute(request);
if (debug)
{
var result = response.Result<Order>();
Console.WriteLine("Status: {0}", result.Status);
Console.WriteLine("Order Id: {0}", result.Id);
Console.WriteLine("Intent: {0}", result.CheckoutPaymentIntent);
Console.WriteLine("Links:");
foreach (PayPalCheckoutSdk.Orders.LinkDescription link in result.Links)
{
Console.WriteLine("\t{0}: {1}\tCall Type: {2}", link.Rel, link.Href, link.Method);
}
Console.WriteLine("Capture Ids: ");
foreach (PurchaseUnit purchaseUnit in result.PurchaseUnits)
{
foreach (PayPalCheckoutSdk.Orders.Capture capture in purchaseUnit.Payments.Captures)
{
Console.WriteLine("\t {0}", capture.Id);
}
}
AmountWithBreakdown amount = result.PurchaseUnits[0].AmountWithBreakdown;
Console.WriteLine("Buyer:");
Console.WriteLine("\tEmail Address: {0}\n\tName: {1} {2}\n",
result.Payer.Email,
result.Payer.Name.GivenName,
result.Payer.Name.Surname);
Console.WriteLine("Response JSON:\n{0}", PayPalClient.ObjectToJSONString(result));
}
return response;
}
public static async Task asdasd()
{
Console.WriteLine("Running Capture Intent Flow..");
var createOrderResponse = CreateOrder(true).Result;
var createOrderResult = createOrderResponse.Result<Order>();
Console.WriteLine("Status: {0}", createOrderResult.Status);
Console.WriteLine("Order Id: {0}", createOrderResult.Id);
Console.WriteLine("Intent: {0}", createOrderResult.CheckoutPaymentIntent);
Console.WriteLine("Links:");
foreach (PayPalCheckoutSdk.Orders.LinkDescription link in createOrderResult.Links)
{
Console.WriteLine("\t{0}: {1}\tCall Type: {2}", link.Rel, link.Href, link.Method);
}
AmountWithBreakdown amount = createOrderResult.PurchaseUnits[0].AmountWithBreakdown;
Console.WriteLine("Total Amount: {0} {1}", amount.CurrencyCode, amount.Value);
Console.WriteLine("Copy approve link and paste it in browser. Login with buyer account and follow the instructions.\nOnce approved hit enter...\n");
Console.Read();
Console.WriteLine("Capturing the payment...");
var captureOrderResponse = CaptureOrder(createOrderResult.Id, true).Result;
var captureOrderResult = captureOrderResponse.Result<Order>();
var captureId = "";
Console.WriteLine("Status: {0}", captureOrderResult.Status);
Console.WriteLine("Order Id: {0}", captureOrderResult.Id);
Console.WriteLine("Intent: {0}", captureOrderResult.CheckoutPaymentIntent);
Console.WriteLine("Links:");
foreach (PayPalCheckoutSdk.Orders.LinkDescription link in captureOrderResult.Links)
{
Console.WriteLine("\t{0}: {1}\tCall Type: {2}", link.Rel, link.Href, link.Method);
}
foreach (PurchaseUnit purchaseUnit in captureOrderResult.PurchaseUnits)
{
foreach (PayPalCheckoutSdk.Orders.Capture capture in purchaseUnit.Payments.Captures)
{
captureId = capture.Id;
}
}
AmountWithBreakdown captureAmount = captureOrderResult.PurchaseUnits[0].AmountWithBreakdown;
Console.WriteLine("Buyer:");
Console.WriteLine("\tEmail Address: {0}\n\tName: {1} {2}",
captureOrderResult.Payer.Email, captureOrderResult.Payer.Name.GivenName, captureOrderResult.Payer.Name.Surname);
Console.WriteLine("Refunding the Order....");
var refundOrderResponse = CapturesRefund(captureId, true).Result;
var refundOrderResult = refundOrderResponse.Result<PayPalCheckoutSdk.Payments.Refund>();
Console.WriteLine("Status: {0}", refundOrderResult.Status);
Console.WriteLine("Refund Id: {0}", refundOrderResult.Id);
Console.WriteLine("Links:");
foreach (PayPalCheckoutSdk.Payments.LinkDescription link in refundOrderResult.Links)
{
Console.WriteLine("\t{0}: {1}\tCall Type: {2}", link.Rel, link.Href, link.Method);
}
}
public async static Task<HttpResponse> CapturesRefund(string CaptureId, bool debug = false)
{
var request = new CapturesRefundRequest(CaptureId);
request.Prefer("return=representation");
RefundRequest refundRequest = new RefundRequest()
{
Amount = new PayPalCheckoutSdk.Payments.Money
{
Value = "20.00",
CurrencyCode = "USD"
}
};
request.RequestBody(refundRequest);
var response = await PayPalClient.client().Execute(request);
if (debug)
{
var result = response.Result<PayPalCheckoutSdk.Payments.Refund>();
Console.WriteLine("Status: {0}", result.Status);
Console.WriteLine("Refund Id: {0}", result.Id);
Console.WriteLine("Links:");
foreach (PayPalCheckoutSdk.Payments.LinkDescription link in result.Links)
{
Console.WriteLine("\t{0}: {1}\tCall Type: {2}", link.Rel, link.Href, link.Method);
}
Console.WriteLine("Response JSON: \n {0}", PayPalClient.ObjectToJSONString(result));
}
return response;
}
}
public class PayPalClient
{
/**
Setting up PayPal environment with credentials with sandbox cerdentails.
For Live, this should be LiveEnvironment Instance.
*/
public static PayPalEnvironment environment()
{
return new SandboxEnvironment(
System.Environment.GetEnvironmentVariable("") != null ?
System.Environment.GetEnvironmentVariable("") : "",
System.Environment.GetEnvironmentVariable("") != null ?
System.Environment.GetEnvironmentVariable("") : "");
}
/**
Returns PayPalHttpClient instance which can be used to invoke PayPal API's.
*/
public static HttpClient client()
{
return new PayPalHttpClient(environment());
}
public static HttpClient client(string refreshToken)
{
return new PayPalHttpClient(environment(), refreshToken);
}
/**
This method can be used to Serialize Object to JSON string.
*/
public static String ObjectToJSONString(Object serializableObject)
{
MemoryStream memoryStream = new MemoryStream();
var writer = JsonReaderWriterFactory.CreateJsonWriter(
memoryStream, Encoding.UTF8, true, true, " ");
DataContractJsonSerializer ser = new DataContractJsonSerializer(serializableObject.GetType(), new DataContractJsonSerializerSettings { UseSimpleDictionaryFormat = true });
ser.WriteObject(writer, serializableObject);
memoryStream.Position = 0;
StreamReader sr = new StreamReader(memoryStream);
return sr.ReadToEnd();
}
}
}
private static OrderRequest BuildRequestBody()
{
OrderRequest orderRequest = new OrderRequest()
{
CheckoutPaymentIntent = "CAPTURE",
ApplicationContext = new ApplicationContext
{
BrandName = "EXAMPLE INC",
LandingPage = "BILLING",
CancelUrl = "https://www.example.com",
ReturnUrl = "https://www.example.com",
UserAction = "CONTINUE",
ShippingPreference = "SET_PROVIDED_ADDRESS"
},
PurchaseUnits = new List<PurchaseUnitRequest>
{
new PurchaseUnitRequest{
ReferenceId = "PUHF",
Description = "Sporting Goods",
CustomId = "CUST-HighFashions",
SoftDescriptor = "HighFashions",
AmountWithBreakdown = new AmountWithBreakdown
{
CurrencyCode = "USD",
Value = "220.00",
AmountBreakdown = new AmountBreakdown
{
ItemTotal = new PayPalCheckoutSdk.Orders.Money
{
CurrencyCode = "USD",
Value = "180.00"
},
Shipping = new PayPalCheckoutSdk.Orders.Money
{
CurrencyCode = "USD",
Value = "20.00"
},
Handling = new PayPalCheckoutSdk.Orders.Money
{
CurrencyCode = "USD",
Value = "10.00"
},
TaxTotal = new PayPalCheckoutSdk.Orders.Money
{
CurrencyCode = "USD",
Value = "20.00"
},
ShippingDiscount = new PayPalCheckoutSdk.Orders.Money
{
CurrencyCode = "USD",
Value = "10.00"
}
}
},
Items = new List<Item>
{
new Item
{
Name = "T-shirt",
Description = "Green XL",
Sku = "sku01",
UnitAmount = new PayPalCheckoutSdk.Orders.Money
{
CurrencyCode = "USD",
Value = "90.00"
},
Tax = new PayPalCheckoutSdk.Orders.Money
{
CurrencyCode = "USD",
Value = "10.00"
},
Quantity = "1",
Category = "PHYSICAL_GOODS"
},
new Item
{
Name = "Shoes",
Description = "Running, Size 10.5",
Sku = "sku02",
UnitAmount = new PayPalCheckoutSdk.Orders.Money
{
CurrencyCode = "USD",
Value = "45.00"
},
Tax = new PayPalCheckoutSdk.Orders.Money
{
CurrencyCode = "USD",
Value = "5.00"
},
Quantity = "2",
Category = "PHYSICAL_GOODS"
}
},
ShippingDetail = new ShippingDetail
{
Name = new Name
{
FullName = "John Doe"
},
AddressPortable = new AddressPortable
{
AddressLine1 = "123 Townsend St",
AddressLine2 = "Floor 6",
AdminArea2 = "San Francisco",
AdminArea1 = "CA",
PostalCode = "94107",
CountryCode = "US"
}
}
}
}
};
return orderRequest;
}
public async static Task<HttpResponse> CreateOrder(bool debug = false)
{
var request = new OrdersCreateRequest();
request.Headers.Add("prefer", "return=representation");
request.RequestBody(BuildRequestBody());
var client = PayPalClient.client();
var response = await client.Execute(request);
if (debug)
{
var result = response.Result<Order>();
Console.WriteLine("Status: {0}", result.Status);
Console.WriteLine("Order Id: {0}", result.Id);
Console.WriteLine("Intent: {0}", result.CheckoutPaymentIntent);
Console.WriteLine("Links:");
foreach (PayPalCheckoutSdk.Orders.LinkDescription link in result.Links)
{
Console.WriteLine("\t{0}: {1}\tCall Type: {2}", link.Rel, link.Href, link.Method);
}
AmountWithBreakdown amount = result.PurchaseUnits[0].AmountWithBreakdown;
Console.WriteLine("Total Amount: {0} {1}", amount.CurrencyCode, amount.Value);
Console.WriteLine("Response JSON: \n {0}", PayPalClient.ObjectToJSONString(result));
}
return response;
}
public async static Task<HttpResponse> CaptureOrder(string OrderId, bool debug = false)
{
var request = new OrdersCaptureRequest(OrderId);
request.Prefer("return=representation");
request.RequestBody(new OrderActionRequest());
var client = PayPalClient.client();
var response = await client.Execute(request);
if (debug)
{
var result = response.Result<Order>();
Console.WriteLine("Status: {0}", result.Status);
Console.WriteLine("Order Id: {0}", result.Id);
Console.WriteLine("Intent: {0}", result.CheckoutPaymentIntent);
Console.WriteLine("Links:");
foreach (PayPalCheckoutSdk.Orders.LinkDescription link in result.Links)
{
Console.WriteLine("\t{0}: {1}\tCall Type: {2}", link.Rel, link.Href, link.Method);
}
Console.WriteLine("Capture Ids: ");
foreach (PurchaseUnit purchaseUnit in result.PurchaseUnits)
{
foreach (PayPalCheckoutSdk.Orders.Capture capture in purchaseUnit.Payments.Captures)
{
Console.WriteLine("\t {0}", capture.Id);
}
}
AmountWithBreakdown amount = result.PurchaseUnits[0].AmountWithBreakdown;
Console.WriteLine("Buyer:");
Console.WriteLine("\tEmail Address: {0}\n\tName: {1} {2}\n",
result.Payer.Email,
result.Payer.Name.GivenName,
result.Payer.Name.Surname);
Console.WriteLine("Response JSON:\n{0}", PayPalClient.ObjectToJSONString(result));
}
return response;
}
public static async Task asdasd()
{
Console.WriteLine("Running Capture Intent Flow..");
var createOrderResponse = CreateOrder(true).Result;
var createOrderResult = createOrderResponse.Result<Order>();
Console.WriteLine("Status: {0}", createOrderResult.Status);
Console.WriteLine("Order Id: {0}", createOrderResult.Id);
Console.WriteLine("Intent: {0}", createOrderResult.CheckoutPaymentIntent);
Console.WriteLine("Links:");
foreach (PayPalCheckoutSdk.Orders.LinkDescription link in createOrderResult.Links)
{
Console.WriteLine("\t{0}: {1}\tCall Type: {2}", link.Rel, link.Href, link.Method);
}
AmountWithBreakdown amount = createOrderResult.PurchaseUnits[0].AmountWithBreakdown;
Console.WriteLine("Total Amount: {0} {1}", amount.CurrencyCode, amount.Value);
Console.WriteLine("Copy approve link and paste it in browser. Login with buyer account and follow the instructions.\nOnce approved hit enter...\n");
Console.Read();
Console.WriteLine("Capturing the payment...");
var captureOrderResponse = CaptureOrder(createOrderResult.Id, true).Result;
var captureOrderResult = captureOrderResponse.Result<Order>();
var captureId = "";
Console.WriteLine("Status: {0}", captureOrderResult.Status);
Console.WriteLine("Order Id: {0}", captureOrderResult.Id);
Console.WriteLine("Intent: {0}", captureOrderResult.CheckoutPaymentIntent);
Console.WriteLine("Links:");
foreach (PayPalCheckoutSdk.Orders.LinkDescription link in captureOrderResult.Links)
{
Console.WriteLine("\t{0}: {1}\tCall Type: {2}", link.Rel, link.Href, link.Method);
}
foreach (PurchaseUnit purchaseUnit in captureOrderResult.PurchaseUnits)
{
foreach (PayPalCheckoutSdk.Orders.Capture capture in purchaseUnit.Payments.Captures)
{
captureId = capture.Id;
}
}
AmountWithBreakdown captureAmount = captureOrderResult.PurchaseUnits[0].AmountWithBreakdown;
Console.WriteLine("Buyer:");
Console.WriteLine("\tEmail Address: {0}\n\tName: {1} {2}",
captureOrderResult.Payer.Email, captureOrderResult.Payer.Name.GivenName, captureOrderResult.Payer.Name.Surname);
Console.WriteLine("Refunding the Order....");
var refundOrderResponse = CapturesRefund(captureId, true).Result;
var refundOrderResult = refundOrderResponse.Result<PayPalCheckoutSdk.Payments.Refund>();
Console.WriteLine("Status: {0}", refundOrderResult.Status);
Console.WriteLine("Refund Id: {0}", refundOrderResult.Id);
Console.WriteLine("Links:");
foreach (PayPalCheckoutSdk.Payments.LinkDescription link in refundOrderResult.Links)
{
Console.WriteLine("\t{0}: {1}\tCall Type: {2}", link.Rel, link.Href, link.Method);
}
}
public async static Task<HttpResponse> CapturesRefund(string CaptureId, bool debug = false)
{
var request = new CapturesRefundRequest(CaptureId);
request.Prefer("return=representation");
RefundRequest refundRequest = new RefundRequest()
{
Amount = new PayPalCheckoutSdk.Payments.Money
{
Value = "20.00",
CurrencyCode = "USD"
}
};
request.RequestBody(refundRequest);
var response = await PayPalClient.client().Execute(request);
if (debug)
{
var result = response.Result<PayPalCheckoutSdk.Payments.Refund>();
Console.WriteLine("Status: {0}", result.Status);
Console.WriteLine("Refund Id: {0}", result.Id);
Console.WriteLine("Links:");
foreach (PayPalCheckoutSdk.Payments.LinkDescription link in result.Links)
{
Console.WriteLine("\t{0}: {1}\tCall Type: {2}", link.Rel, link.Href, link.Method);
}
Console.WriteLine("Response JSON: \n {0}", PayPalClient.ObjectToJSONString(result));
}
return response;
}
}
public class PayPalClient
{
/**
Setting up PayPal environment with credentials with sandbox cerdentails.
For Live, this should be LiveEnvironment Instance.
*/
public static PayPalEnvironment environment()
{
return new SandboxEnvironment(
System.Environment.GetEnvironmentVariable("") != null ?
System.Environment.GetEnvironmentVariable("") : "",
System.Environment.GetEnvironmentVariable("") != null ?
System.Environment.GetEnvironmentVariable("") : "");
}
/**
Returns PayPalHttpClient instance which can be used to invoke PayPal API's.
*/
public static HttpClient client()
{
return new PayPalHttpClient(environment());
}
public static HttpClient client(string refreshToken)
{
return new PayPalHttpClient(environment(), refreshToken);
}
/**
This method can be used to Serialize Object to JSON string.
*/
public static String ObjectToJSONString(Object serializableObject)
{
MemoryStream memoryStream = new MemoryStream();
var writer = JsonReaderWriterFactory.CreateJsonWriter(
memoryStream, Encoding.UTF8, true, true, " ");
DataContractJsonSerializer ser = new DataContractJsonSerializer(serializableObject.GetType(), new DataContractJsonSerializerSettings { UseSimpleDictionaryFormat = true });
ser.WriteObject(writer, serializableObject);
memoryStream.Position = 0;
StreamReader sr = new StreamReader(memoryStream);
return sr.ReadToEnd();
}
}
}
您的代码已经在使用 Checkout-NET-SDK(抽象了 v2/checkout/orders PayPal REST API)来创建和捕获 PayPal 订单。 捕获 API 响应提供成功或失败的即时通知。 特别是purchase_units[0].payments.captures[0].id
是 PayPal 交易 ID,以及应该保存在数据库中的内容。 此时还应验证订单总额。
另外,您似乎正在使用旧的基于重定向的流程进行审批。 相反,请遵循PayPal Checkout 集成指南,并通过服务器上的 2 个路由(url 路径)执行创建订单和捕获订单 API 步骤。 这两个路由都应该只返回 JSON 数据(没有 HTML 或文本)。 第二条路线将订单 ID 作为输入参数(路径或正文变量),如前所述,应检查操作结果以验证金额是否正确并存储其生成的付款详细信息,以及执行任何必要的业务逻辑(例如在将返回的 JSON 转发给前端调用者之前立即发送确认电子邮件或预订产品)。 如果发生错误,也转发它的 JSON 详细信息,因为前端必须处理这种情况。
将这 2 条路由与此前端审批流程配对: https ://developer.paypal.com/demo/checkout/#/pattern/server。 (如果您需要从客户端向服务器发送任何其他数据,例如项目数组或选定的选项,请在获取中添加一个body
参数,其值为 JSON 字符串或对象)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.