c# - 如何在 C# Winforms 应用程序中发送 PayPal REST API 退款?

标签 c# winforms paypal paypal-rest-sdk

我在网上发现很少有关于在 C# 中实现 PayPal REST API 的文档。

我已经完成了获取访问 token 的第一步,但我一直看到发送 API 调用的方法相互冲突,而且我尝试过的方法都不起作用。

这是我当前的代码:

                private async void cmdRefund_Click(object sender, EventArgs e)
        {
            //var apiContext = Configuration.GetAPIContext();

            string AccessToken;
            string Nonce;
            string AppID;
            string TokenType;
            try
            {
                // ClientId of your Paypal app API

                //This is the live ID
                string APIClientId = "AZxxxx-8";


                //this is the live secret Key
                string APISecret = "Exxxx39";


                using (var client = new HttpClient())
                {
                    var byteArray = Encoding.UTF8.GetBytes(APIClientId + ":" + APISecret);

                    client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
                    //this is the live url
                    var url = new Uri("https://api.paypal.com/v1/oauth2/token", UriKind.Absolute);

                    client.DefaultRequestHeaders.IfModifiedSince = DateTime.UtcNow;

                    var requestParams = new List<KeyValuePair<string, string>>
                                {
                                    new KeyValuePair<string, string>("grant_type", "client_credentials")
                                };

                    var content = new FormUrlEncodedContent(requestParams);
                    var webresponse = await client.PostAsync(url, content);
                    var resp = await webresponse.Content.ReadAsStringAsync();
                    MessageBox.Show(resp);
                    if (resp.IndexOf("access_token") == -1)
                    {
                        MessageBox.Show("PayPal Authorization Failed.");
                        return;
                    }
                    AccessToken = resp.Substring(resp.IndexOf("access_token") + 15);
                    AccessToken = AccessToken.Substring(0, AccessToken.IndexOf("\""));

                    Nonce = resp.Substring(resp.IndexOf("nonce") + 8);
                    Nonce = Nonce.Substring(0, Nonce.IndexOf("\""));
                    AppID = resp.Substring(resp.IndexOf("app_id") + 9);
                    AppID = AppID.Substring(0, AppID.IndexOf("\""));
                    TokenType = resp.Substring(resp.IndexOf("token_type") + 13);
                    TokenType = TokenType.Substring(0, TokenType.IndexOf("\""));
                    MessageBox.Show("Access Token: \r\n" + AccessToken + "\r\nNonce:\r\n" + Nonce + "\r\nAppID:\r\n" + AppID + "\r\nToken Type:\r\n" + TokenType);
                    // response will deserialized using Jsonconver
                    //return JsonConvert.DeserializeObject<PayPalGetTokenResponse>(resp);
                }
            }
            catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return;
                }
                //Authorization has been achieved here - now I want to process a refund
                    var apiContext = new APIContext(AccessToken);

            Amount refundAmount = new Amount();
            refundAmount.total = "0.01";
            refundAmount.currency = "USD";

            Refund refund = new Refund();
            refund.amount = refundAmount;
            string saleId = "9XY489008U7836633";

   //*************THIS NEXT LINE CAUSES AN ERROR

            Refund refundforreal = Sale.Refund(apiContext, saleId, refund);
   //*************  

            string refundId = refund.id;


                }

最后一行导致错误:“PayPal.IdentityException:'远程服务器返回错误:(401)未经授权。'”

据我所知,我的访问 token 是完全有效的,但这不起作用。我应该注意,我试图获取信息和退款的交易不是通过 REST API 进行的,而只是通过我们网站上集成的常规 PayPal 界面进行的。我不知道这是否会导致问题,但这是我需要做的。

我在 Visual Studios 2017 中使用用 C# 编写的 Windows 窗体应用程序,因为我要替换旧的 VB6 程序,该程序要求用户在程序的浏览器中登录 PayPal session ,并且需要用某些东西替换该程序这对我们的员工来说既可用又熟悉,并且通过使用 REST API 而不是在 WebBrowser 控件中填写字段的旧方法更具前瞻性。

************编辑************ - 我将其添加为跟进:

我听取了@shamanthGowdraShankaramurthy 的建议并使用了 Postman 并设法完成了我想做的事情,所以谢谢 - 这确实帮助我知道至少我想做的事情是可能的。

我仍然不知道如何在 C# 中执行 POST。我想也许我会远离 SDK 中内置的“退款”对象,而是尝试以其他方式发布。

我在 Postman 中使用的 url 是:https://api.paypal.com/v1/payments/sale/9XY489008U7836633/refund

我将其作为正文发送,以对我的测试交易进行 0.01 美元的退款: { “数量”: { “总计”:“0.01”, “货币:美元” }, “invoice_number”:“INV-1234567” }'

我使用我从工作代码中获得的访问 token 向 POST 添加了不记名 token 授权。

最后,在 Postman 中,我将 body 从“Text”更改为“JSON (application/json)”。

如何将所有这些元素(URL、我的不记名 token 、正文和正文是 json 的信息)合并到 C# winforms 应用程序的 POST 中?

最佳答案

万一其他人正在寻找这个,答案比我想象的要简单得多。我认为我没有使用可通过 PayPal SDK 轻松获得的 AccessToken 搞砸了自己。

首先,确保您已正确设置 App.Config 文件:

<!-- PayPal SDK settings -->
  <paypal>
    <settings>
//specify sandbox or live
      <add name="mode" value="sandbox" /> 
      <add name="clientId" value="insert_clientid_key_here" />
      <add name="clientSecret" value="Insert_client_secret_key_here" />
    </settings>
  </paypal>

这就是我使退款工作所需的全部代码:

    private void cmdRefund_Click(object sender, EventArgs e)
    {
        var config = ConfigManager.Instance.GetProperties();
        var accessToken = new OAuthTokenCredential(config).GetAccessToken();
        var apiContext = new APIContext(accessToken);
        Amount refundAmount = new Amount();
        refundAmount.total = "0.01";
        refundAmount.currency = "USD";
        RefundRequest refund = new RefundRefundRequest();
        refund.amount = refundAmount;
        string saleId = "9XY489008U7836633";
        Refund refundforreal = Sale.Refund(apiContext, saleId, refund);
        MessageBox.Show("Refund status:" + refundforreal.state + "\r\n" + "Txn #:" + refundforreal.id);
    }

关于c# - 如何在 C# Winforms 应用程序中发送 PayPal REST API 退款?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49015630/

相关文章:

c# - 分配数据源时避免 UI 锁定/卡住?

c# - winform的优化

php - 与 PayPal-PHP-SDK 的订阅集成

php - PayPal IPN 不断返回 'INVALID' 代码,无论我做什么

c# - ASP.NET Core 声明是否可靠且安全,不会被篡改?

.net - 防止自动选择文本框焦点

c# - 改进在 sql server 中读取 XML 字符串

android - Paypal 集成登录失败错误?

c# - 如何创建像这样的 C# delegate double callable `f(a + k * h)` ?

c# - 在C#中调用exe程序