2017-03-17 4 views
1

私は、デスクトップアプリケーションの一部として支払いページ以外のウェブサイトを使わずにバックグラウンドでの統合を考えていました。 以下のシナリオを実行することは可能でしょうか: 1.請求書/販売を生成し、REST APIを使用して、トランザクションの一意のIDを取得します。 2.ユニークIDを使用して、PayPalのWebサイトをアドホック支払いページにリダイレクトします。 3.支払いが行われた場合、バックグラウンドでREST APIを使用して数分ごとにチェックします。ウェブサイトのないPayPalとの統合

答えて

1

最終的に道を見つけました。私はこれを私たちが開発したいくつかのコード(POC)と共に公開するのです。これは、PayPalの顧客であるかどうかに関係なく、クレジットカード所有者からの支払いを受け取り、ソフトウェア製品のロックを解除するか、特定の機能を支払うことを可能にする組み込み支払い処理エンジンのPOCです。

お支払いを処理するには、PayPal developerとして申請し、自分のPayPal認証情報を取得する必要があります。その後、2組の資格情報を受け取ります。 1つはテスト用(「サンドボックス」)、もう1つは実生活用です。

あなたがAPIに

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

サンドボックスをテストするためにサンドボックスを使用することができます最初に - あなたがPayPalのサンドボックスのアカウントを使用して統合をテストする、またはライブ予定されているかどうかを示します。

ユーザー - あなたのPayPalユーザー名

パスワード - あなたのPayPalパスワード

署名 - あなたはペイパル署名

successUrl - どのWebページにつながるURLお支払いが完了した後に表示されることを希望します。

failedURL - 失敗した/未払いの支払い後に表示したいWebページにつながるURL。

この関数は単純です:支払い あなたがあなたのプログラムからの支払いを開始することを希望する場合は、あなたが私は一般的に、文字列(ExpChkoutStr)を構築している書いた次の関数を呼び出しを開始

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

// 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によって開発されました:と、次のPayPalのAPI呼び出しを使用します。ペイパルサーバからの結果が「トークン

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)は、単一の文字列にメンバ変数値と取引の詳細を使用する他の関数によって生成されます「エンドユーザーが購入を確認するために開いておく必要があり、その1回のウェブページ(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を使用して、この1回限りのWebページを開きますブラウザ:0

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; 
} 
は、その後残りは保留中のすべてのトランザクションの小さなデータベースを維持し、それは、失敗したキャンセルまたはタイムアウトが経過した場合、のいずれかで成功するまで、それらのそれぞれをフォローアップすることです。

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; 
} 
:PayPalのサーバーの応答から要素を抽出するには

、我々はこの小さな関数を書きました