gpt4 book ai didi

rest - 在没有网站的情况下与 PayPal 集成

转载 作者:太空宇宙 更新时间:2023-11-03 15:58:15 24 4
gpt4 key购买 nike

我正在考虑在后台集成,除了支付页面之外没有任何网站作为 c++ 桌面应用程序的一部分。是否可以遵循以下场景:1. 生成发票/销售并通过 REST API 为即将到来的交易获取某种唯一 ID。2. 使用唯一 ID 将 Paypal 网站重定向到临时支付页面。3. 在后台,每隔几分钟通过 REST API 检查是否已付款。

最佳答案

我们终于找到了一种方法,这就是为什么我发布这个答案以及我们开发的一些代码(POC)的原因。这是一个内置支付处理引擎的 POC,它允许您接受任何信用卡持有人(无论是 PayPal 客户)的付款,并为解锁软件产品或特定功能付费。

要处理付款,您需要申请 PayPal developer并获取您自己的 PayPal 凭据。然后您将收到 2 套凭据。一个用于测试(“沙盒”),另一个用于现实生活。

首先你可以使用沙盒来测试API

Void InitPayPal(BOOL Sandbox, LPTSTR User, LPTSTR password, LPTSTR signature, LPTSTR successUrl, LPTSTR failedURL)

沙盒 – 表示您是使用 PayPal 的沙盒帐户测试您的集成,还是上线。

用户 – 您的 Paypal 用户名

密码 – 您的 Paypal 密码

签名 – 您的 Paypal 签名

successUrl – 指向您希望在成功付款后显示的网页的 url。

failedURL – 指向您希望在付款失败/取消后显示的网页的 URL。

这个函数很简单:

void InitPayPal(BOOL Sandbox, LPTSTR User, LPTSTR password, LPTSTR signature, LPTSTR successUrl, LPTSTR failedURL, LPWSTR ProductName)
{
m_sandbox = Sandbox;
m_user = User;
m_password = password;
m_signature = signature;
m_SuccessURL = successUrl;
m_FailureURL = failedURL;
m_ProductName = ProductName;
CUR_CHAR = L"$";
SYSTEMTIME st;
GetSystemTime(&st);
g_tPayStart = CTime(st);
InitilizedPaypal = TRUE;
}

发起付款当您希望从您的程序发起付款时,您可以调用我编写的以下函数,该函数通常构建一个字符串 (ExpChkoutStr) 并使用以下 PayPal API 调用:

// Send string to PayPal server
WinHttpClient WinClient1(ExpChkoutStr.GetBuffer());
WinClient1.SetRequireValidSslCertificates(false);
WinClient1.SendHttpRequest(L"GET");
httpResponseContent1 = WinClient1.GetResponseContent();
CString strTransactionRet = UrlDecode(httpResponseContent1.c_str());

WinHTTP classCheng Shi 开发.

Express Checkout 字符串 (ExpChkoutStr) 由另一个函数生成,该函数将成员变量的值和交易详情合并为一个字符串:

CString result;
result = (m_sandbox) ? PAYPAL_SANDBOX_HTTPS : PAYPAL_REAL_HTTPS;
result += Q_USER;
result += m_user;
result += AND_PASSWORD;
result += m_password;
result += AND_SIGNATURE;
result += m_signature;
result += AND_PAYMENTAMOUNT;
result += strAmount;
result += L"&METHOD=SetExpressCheckout";
result += AND_RETURN_URL;
result += m_SuccessURL;
result += AND_CANCEL_URL;
result += m_FailureURL;
result += AND_VERSION;
result += L"&NOSHIPPING=1";
result += L"&ADDROVERRIDE=0&BRANDNAME=Secured Globe, Inc.";
result += L"&PAYMENTREQUEST_0_DESC=";
result += L"Item name: " + strUnits + L"(" + UnitName + L") ";
result += L"Price: " + strAmount;
result += L"&NOTETOBUYER=Here you can add a note to the buyer";

PayPal 服务器的结果是一个“ token ”,用于确定必须打开的一次性网页 (LinkToOpen),以便最终用户确认购买:

// Extract token from response
CString sToken = ExtractElement(strTransactionRet, L"TOKEN");

if (sToken == L"")
{
wprintf(L"Internal error: (Paypal): no token was generated (%s)", strTransactionRet);
MessageBox(NULL, L"Internal payment processing error", L"", MB_OK);
return FALSE;
}
CString LinkToOpen = (m_sandbox) ? SANDBOX_PAYPAL_CHECKOUT : REAL_PAYPAL_CHECKOUT;

LinkToOpen += L"&token=";
LinkToOpen += sToken;

然后我们使用默认网络浏览器以编程方式打开这个一次性网页:

STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));

CString command_line;
command_line.Format(L"cmd.exe /c start \"link\" \"%s\" ", LinkToOpen);
// LinkToOpen
if (!CreateProcess(NULL, // No module name (use command line)
command_line.GetBuffer(),
NULL, // Process handle not inheritable
NULL, // Thread handle not inhberitable
FALSE, // Set handle inheritance to FALSE
NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi) // Pointer to PROCESS_INFORMATION structure
)
{
wprintf(L"CreateProcess failed (%d).\n", GetLastError());
// At this stage you would want to mark this transaction as "failed"
return FALSE;
}

然后剩下的就是维护一个包含所有未决交易的小型数据库,并跟进每个交易,直到它成功、失败、取消或超时为止。

为了从 PayPal 服务器响应中提取元素,我们编写了这个小函数:

CString ExtractElement(CString EntireString, CString ElementName)
{
CString result = L"";
CString WhatToFind = ElementName + L"=";
int foundToken = EntireString.Find(WhatToFind);
if (foundToken > -1)
{
int EndToken = EntireString.Find(L"&", foundToken);
if (EndToken != -1)
{
result = EntireString.Mid(foundToken + ElementName.GetLength()+1, EndToken - foundToken - ElementName.GetLength()-1);
}
}

return result;
}

关于rest - 在没有网站的情况下与 PayPal 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42858509/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com