2017-03-17 92 views
1

我一直在考慮在後臺沒有任何網站而不是付費頁面作爲C++桌面應用程序的一部分。 是否有可能遵循以下方案: 1.生成發票/銷售並通過REST API獲取某種類型的唯一ID以供事務處理。 2.使用唯一的ID重定向到PayPal網站到臨時付款頁面。 3.在後臺,通過REST API每隔幾分鐘檢查一次付款是否已完成。與沒有網站的PayPal集成

回答

1

我們終於找到了一種方法,這就是爲什麼我發佈這個答案以及我們開發的一些代碼(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 - 一個網址導致您希望在失敗/可以支付後顯示的網頁。

此功能是直截了當:

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開發。

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"; 

從貝服務器的結果是一個「令牌:

的快速結帳字符串(ExpChkoutStr)由使用成員變量的值和交易細節成一個字符串另一個函數生成「用來找出一個一次性的網頁(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; 

然後,我們使用默認的Web編程打開這個一次性的網頁瀏覽器:

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; 
}