c# - VB.NET 中带有 Asp.Net Web 窗体的 PayPalCheckoutSDK 无法正常工作
问题描述
我一直在关注贝宝集成教程、官方贝宝开发人员和其他人。它们似乎都在 C# 中,这让我到目前为止进行了代码转换。他们也都使用 MVC,它使用控制器来接收来自客户端的请求。我正在使用没有 MVC 的 VB.NET 和 Web 表单,所以我很难找到任何有用的链接来解决我的问题。
当我点击贝宝智能按钮时,我得到的只是 ERR_CONNECTION_TIMED_OUT。我附上了我的代码。请有人帮我弄清楚我错过了什么。谢谢你。
贝宝客户端.vb:
Imports System
Imports PayPalCheckoutSdk.Core
Imports PayPalCheckoutSdk.Orders
Imports PayPalHttp
Imports System.IO
Imports System.Text
Imports System.Runtime.Serialization.Json
Imports Newtonsoft.Json
Imports System.Collections.Generic
Imports System.Threading.Tasks
Imports System.Net
Imports System.Net.Http.Headers
Imports System.Diagnostics
Namespace PayPalAccess
Public Class PayPalClient
Public Shared Function Environment() As PayPalEnvironment
Return New SandboxEnvironment("PAYPAL_SANDBOX_CLIENTID", "PAYPAL_SANDBOX_CLIENTSECRET")
End Function
Public Shared Function Client() As HttpClient
Return New PayPalHttpClient(Environment())
End Function
Public Shared Function Client(ByVal refreshToken As String) As HttpClient
Return New PayPalHttpClient(Environment(), refreshToken)
End Function
Public Shared Function ObjectToJSONString(ByVal serializableObject As Object) As String
Dim memoryStream As MemoryStream = New MemoryStream()
Dim writer = JsonReaderWriterFactory.CreateJsonWriter(memoryStream, Encoding.UTF8, True, True, " ")
Dim ser As DataContractJsonSerializer = New DataContractJsonSerializer(serializableObject.GetType(), New DataContractJsonSerializerSettings With {
.UseSimpleDictionaryFormat = True
})
ser.WriteObject(writer, serializableObject)
memoryStream.Position = 0
Dim sr As StreamReader = New StreamReader(memoryStream)
Return sr.ReadToEnd()
End Function
End Class
Public Class SmartButtonHttpResponse
Private ReadOnly _result As PayPalCheckoutSdk.Orders.Order
Public Sub New(ByVal httpResponse As PayPalHttp.HttpResponse)
Headers = httpResponse.Headers
StatusCode = httpResponse.StatusCode
_result = httpResponse.Result(Of PayPalCheckoutSdk.Orders.Order)()
End Sub
Public ReadOnly Property Headers As HttpHeaders
Public ReadOnly Property StatusCode As HttpStatusCode
Public Function Result() As PayPalCheckoutSdk.Orders.Order
Return _result
End Function
Public Property orderID As String
End Class
Public Class PayPalOrder
Public Shared Async Function CreateOrder(ByVal Optional debug As Boolean = False) As Task(Of HttpResponse)
Diagnostics.Debug.WriteLine("Creating PayPal Order...")
Dim request As New OrdersCreateRequest()
request.Prefer("return=representation")
request.RequestBody(BuildRequestBody())
Diagnostics.Debug.WriteLine("Built Request Body")
Dim response = Await PayPalClient.Client().Execute(request)
Diagnostics.Debug.WriteLine("Still Creating PayPal Order...")
If debug Then
Dim result = response.Result(Of Order)()
Diagnostics.Debug.WriteLine("Status: {0}", result.Status)
Diagnostics.Debug.WriteLine("Order Id: {0}", result.Id)
Diagnostics.Debug.WriteLine("Intent: {0}", result.Intent)
Diagnostics.Debug.WriteLine("Links:")
For Each link As LinkDescription In result.Links
System.Diagnostics.Debug.WriteLine(vbTab & "{0}: {1}" & vbTab & "Call Type: {2}", link.Rel, link.Href, link.Method)
Next
Dim amount As AmountWithBreakdown = result.PurchaseUnits(0).Amount
System.Diagnostics.Debug.WriteLine("Total Amount: {0} {1}", amount.CurrencyCode, amount.Value)
End If
Return response
End Function
Private Shared Function BuildRequestBody() As OrderRequest
Dim orderRequest As OrderRequest = New OrderRequest() With {
.CheckoutPaymentIntent = "CAPTURE",
.ApplicationContext = New ApplicationContext With {
.BrandName = "Assess Management Ltd",
.LandingPage = "BILLING",
.UserAction = "CONTINUE"
},
.PurchaseUnits = New List(Of PurchaseUnitRequest) From {
New PurchaseUnitRequest With {
.ReferenceId = "VAL1",
.Description = "Online Assessment",
.CustomId = "VAL1 - Online Assessment",
.AmountWithBreakdown = New AmountWithBreakdown With {
.CurrencyCode = "GBP",
.Value = "0.15",
.AmountBreakdown = New AmountBreakdown With {
.ItemTotal = New Money With {
.CurrencyCode = "GBP",
.Value = "0.15"
}
}
},
.Items = New List(Of Item) From {
New Item With {
.Name = "ValidateSkills Assessment",
.Description = "An Online Assessment",
.UnitAmount = New Money With {
.CurrencyCode = "GBP",
.Value = "0.15"
},
.Quantity = "1",
.Category = "ONLINE_SERVICES"
}
}
}
}
}
Return orderRequest
End Function
Private Shared Sub Main(ByVal args As String())
CreateOrder(True).Wait()
End Sub
End Class
End Namespace
贝宝支付.aspx:
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
<meta name="viewport" content="width=device-width, initial-scale=1"> <!-- Ensures optimal rendering on mobile devices. -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <!-- Optimal Internet Explorer compatibility -->
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<script
src="https://www.paypal.com/sdk/js?client-id=PAYPAL_SANDBOX_CLIENTID¤cy=GBP">
</script>
<div id="smart-payments-container"></div>
<script>
var orderId;
paypal.Buttons({
createOrder: function (data, actions) {
console.log("Going to server");
return fetch('PayPalPayment.aspx/CreatePaymentOrder', {
method: "post",
headers: {
"content-type": "application/json"
}
}).then(function (res) {
console.log(res);
return res.json();
}).then(function (data) {
return data.id;
});
},
onApprove: function (data, actions) {
console.log("success");
return actions.order.capture().then(function (details) {
alert('Transaction completed by ' + details.payer.name.given_name);
});
}
}).render('#smart-payments-container');
</script>
</asp:Content>
PayPalPayment.aspx.vb:
Imports System.Collections.Generic
Imports System.Threading.Tasks
'1. Import the PayPal SDK client that was created in `Set up Server-Side SDK`.
Imports PayPalCheckoutSdk.Core
Imports PayPalCheckoutSdk.Orders
Imports PayPalHttp
Imports System.Web.Services
Public Class PayPalPayment
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
End Sub
<WebMethod()>
Public Shared Function CreatePaymentOrder() As Task(Of HttpResponse)
Debug.WriteLine("Creating Payment Order...")
Dim response = PayPalAccess.PayPalOrder.CreateOrder()
Return response
End Function
End Class
解决方案
推荐阅读
- java - 我可以在运行时根据变量而不是在 xml 中添加按钮数吗
- java - 调试时,“this”在 Fragment 中不可用
- python - 如何使用熊猫跳过多次加载中的某些行
- python-3.x - 查找不允许我将字符串转换为浮点数的数据
- visual-studio-code - 始终在当前选项卡中从资源管理器打开文件
- machine-learning - 多类分类问题的精确与召回
- ruby-on-rails - Amazon Comprehend Medical 返回过滤值
- api - Varnish 不缓存简单的 GET 请求到后端
- c# - 在 C# 中序列化这些值以在 C++ 中作为已知结构正确读取时遇到问题
- javascript - 在javascript中的多模块上定义相同的变量名有什么问题吗