首页 > 解决方案 > 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&currency=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

标签: c#asp.netvb.netpaypalpaypal-rest-sdk

解决方案


推荐阅读