首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无需网站即可与PayPal集成

无需网站即可与PayPal集成
EN

Stack Overflow用户
提问于 2017-03-17 21:14:09
回答 1查看 41关注 0票数 1

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

EN

回答 1

Stack Overflow用户

发布于 2018-01-12 22:37:47

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

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

首先,您可以使用沙箱来测试API

代码语言:javascript
复制
Void InitPayPal(BOOL Sandbox, LPTSTR User, LPTSTR password, LPTSTR signature, LPTSTR successUrl, LPTSTR failedURL)

沙盒-表明您是使用贝宝的沙盒帐户测试您的集成,还是上线。

user -您的PayPal用户名

password -您的PayPal密码

signature -您的PayPal签名

successUrl -指向一个网页的url,您希望在成功付款后显示该网页。

failedURL -指向您希望在支付失败/取消后显示的网页的url。

这个函数很简单:

代码语言:javascript
复制
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 调用:

代码语言:javascript
复制
// 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());

是由开发的。

Express Checkout字符串(ExpChkoutStr)是由另一个函数生成的,该函数将成员变量的值和事务详细信息合并为一个字符串:

代码语言:javascript
复制
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服务器的结果是一个“令牌”,用于确定必须打开才能让最终用户确认购买的一次性网页(LinkToOpen ):

代码语言:javascript
复制
// 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;

然后,我们使用默认web浏览器以编程方式打开此一次性web页面:

代码语言:javascript
复制
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服务器响应中提取元素,我们编写了以下小函数:

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42858509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档