如何使用 c# 在 paypal 中实现 DoDirectPayment

Posted

技术标签:

【中文标题】如何使用 c# 在 paypal 中实现 DoDirectPayment【英文标题】:How to implement DoDirectPayment in paypal using c# 【发布时间】:2013-02-14 16:23:33 【问题描述】:

我是贝宝的新手。我想为我的网站实现直接支付 api。意味着当我点击它时我会有一个购买按钮,它会展开,在那个 iframe 中,我将拥有 paypal 直接付款的 url。我已经写了类似的代码

     string address = "https://api-3t.sandbox.paypal.com/nvp?USER=user&COUNTRYCODE=US&ZIP=95131&STATE=CA&CITY=San Jose&FIRSTNAME=John&LASTNAME=Smith&STREET=1asfasdfSt&CVV2=123&ACCT=4683075410516684&IPADDRESS=192.168.0.62&PWD=1357635822&EXPDATE=042011&VERSION=58.0&SIGNATURE=signature&METHOD=DoDirectPayment&CREDITCARDTYPE=Visa&AMT=10.00&PAYMENTACTION=Sale&RETURNURL=http://returnurl&CANCELURL=http://cancnelurl";

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address);
        HttpWebResponse response2 = (HttpWebResponse)request.GetResponse();
        Stream stream = response2.GetResponseStream();
        StreamReader rdr = new StreamReader(stream);
        string req = rdr.ReadToEnd();

req 包含失败消息。我不知道我缺少什么凭据。 任何帮助表示赞赏。

【问题讨论】:

错误信息是什么意思?此外,您可能需要对查询字符串上的参数进行 URL 编码 响应包含TIMESTAMP=2013%2d02%2d28T13%3a05%3a22Z&CORRELATIONID=ddda63e952b88&ACK=Failure&VERSION=58%2e0&BUILD=5294323&L_ERRORCODE0=10562&L_SHORTMESSAGE0=Invalid%20Data&L_LONGMESSAGE0=This%20transaction%20cannot%20be%20processed%2e%20Please%20enter%20a%20valid%20credit%20card%20expiration%20year%2e&L_SEVERITYCODE0=Error&AMT=10%2e00&CURRENCYCODE=USD 当我对 url 进行编码时,它得到一个异常 Invalid Uri 【参考方案1】:
<html>
<head>
<title>PayPal Merchant SDK - DoDirectPayment API</title>
<link rel="stylesheet" href="../Common/sdk.css"/>
<script language="javascript">
    function generateCC()
        var cc_number = new Array(16);
        var cc_len = 16;
        var start = 0;
        var rand_number = Math.random();

        switch(document.DoDirectPaymentForm.creditCardType.value)
        
            case "Visa":
                cc_number[start++] = 4;
                break;
            case "Discover":
                cc_number[start++] = 6;
                cc_number[start++] = 0;
                cc_number[start++] = 1;
                cc_number[start++] = 1;
                break;
            case "MasterCard":
                cc_number[start++] = 5;
                cc_number[start++] = Math.floor(Math.random() * 5) + 1;
                break;
            case "Amex":
                cc_number[start++] = 3;
                cc_number[start++] = Math.round(Math.random()) ? 7 : 4 ;
                cc_len = 15;
                break;
        

        for (var i = start; i < (cc_len - 1); i++) 
            cc_number[i] = Math.floor(Math.random() * 10);
        

        var sum = 0;
        for (var j = 0; j < (cc_len - 1); j++) 
            var digit = cc_number[j];
            if ((j & 1) == (cc_len & 1)) digit *= 2;
            if (digit > 9) digit -= 9;
            sum += digit;
        

        var check_digit = new Array(0, 9, 8, 7, 6, 5, 4, 3, 2, 1);
        cc_number[cc_len - 1] = check_digit[sum % 10];

        document.DoDirectPaymentForm.creditCardNumber.value = "";
        for (var k = 0; k < cc_len; k++) 
            document.DoDirectPaymentForm.creditCardNumber.value += cc_number[k];
        
    
</script>
</head>
<body>
    <div id="wrapper">
        <div id="header">
            <h3>DoDirectPayment</h3>
            <div id="apidetails">Process a credit card payment.</div>
        </div>
        <div id="request_form">     
            <form method="POST" action="DoDirectPayment.php"
                name="DoDirectPaymentForm">
                <div class="params">
                    <div class="param_name">Payment type</div>
                    <div class="param_value">
                        <select name="paymentType">
                            <option value="Sale" selected="selected">Sale</option>
                            <option value="Authorization">Authorization</option>
                        </select>
                    </div>
                </div>
                <div class="params">
                    <div class="param_name">First name</div>
                    <div class="param_value">
                        <input type="text" name="firstName" value="John"/>
                    </div>
                </div>
                <div class="params">
                    <div class="param_name">Last name</div>
                    <div class="param_value">
                        <input type="text" name="lastName" value="Doe"/>
                    </div>
                </div>          
                <div class="params">
                    <div class="param_name">Card type</div>
                    <div class="param_value">
                        <select name="creditCardType"
                            onChange="javascript:generateCC(); return false;">
                                <option value="Visa" selected="selected">Visa</option>
                                <option value="MasterCard">MasterCard</option>
                                <option value="Discover">Discover</option>
                                <option value="Amex">American Express</option>
                        </select>               
                    </div>
                </div>
                <div class="params">
                    <div class="param_name">Card number</div>
                    <div class="param_value">
                        <input type="text" size="19" maxlength="19" name="creditCardNumber">
                    </div>
                </div>
                <div class="params">
                    <div class="param_name">Expiry date</div>
                    <div class="param_value">
                        <select name="expDateMonth">
                            <option value="01">01</option>
                            <option value="02">02</option>
                            <option value="03">03</option>
                            <option value="04">04</option>
                            <option value="05">05</option>
                            <option value="06">06</option>
                            <option value="07">07</option>
                            <option value="08">08</option>
                            <option value="09">09</option>
                            <option value="10">10</option>
                            <option value="11">11</option>
                            <option value="12">12</option>
                        </select>
                        <select name="expDateYear">                 
                            <option value="2013">2013</option>
                            <option value="2014" selected>2014</option>
                            <option value="2015">2015</option>
                            <option value="2016">2016</option>
                            <option value="2017">2017</option>
                            <option value="2018">2018</option>
                            <option value="2019">2019</option>
                            <option value="2020">2020</option>                      
                        </select>
                    </div>
                </div>
                <div class="params">
                    <div class="param_name">CVV</div>
                    <div class="param_value">
                        <input type="text" size="3" maxlength="4" name="cvv2Number" value="962">
                    </div>
                </div>
                <div class="params">
                    <div class="param_name">Amount</div>
                    <div class="param_value">
                         <input type="text" size="5" maxlength="7" name="amount" value="1.00"> USD
                    </div>
                </div>              
                <div class="section_header">Billing address</div>
                <div class="params">
                    <div class="param_name">Address 1</div>
                    <div class="param_value">
                        <input type="text" size="25" maxlength="100" name="address1" value="1 Main St">
                    </div>
                </div>
                <div class="params">
                    <div class="param_name">Address 2 (optional)</div>
                    <div class="param_value">
                        <input type="text" size="25" maxlength="100" name="address2" value="">
                    </div>
                </div>
                <div class="params">
                    <div class="param_name">City</div>
                    <div class="param_value">
                        <input type="text" size="25" maxlength="40" name="city" value="San Jose">
                    </div>
                </div>
                <div class="params">
                    <div class="param_name">State</div>
                    <div class="param_value">
                        <select id=state name="state">
                            <option value=""></option>
                            <option value="AK">AK</option>
                            <option value="AL">AL</option>
                            <option value="AR">AR</option>
                            <option value="AZ">AZ</option>
                            <option value="CA" selected>CA</option>
                            <option value="CO">CO</option>
                            <option value="CT">CT</option>
                            <option value="DC">DC</option>
                            <option value="DE">DE</option>
                            <option value="FL">FL</option>
                            <option value="GA">GA</option>
                            <option value="HI">HI</option>
                            <option value="IA">IA</option>
                            <option value="ID">ID</option>
                            <option value="IL">IL</option>
                            <option value="IN">IN</option>
                            <option value="KS">KS</option>
                            <option value="KY">KY</option>
                            <option value="LA">LA</option>
                            <option value="MA">MA</option>
                            <option value="MD">MD</option>
                            <option value="ME">ME</option>
                            <option value="MI">MI</option>
                            <option value="MN">MN</option>
                            <option value="MO">MO</option>
                            <option value="MS">MS</option>
                            <option value="MT">MT</option>
                            <option value="NC">NC</option>
                            <option value="ND">ND</option>
                            <option value="NE">NE</option>
                            <option value="NH">NH</option>
                            <option value="NJ">NJ</option>
                            <option value="NM">NM</option>
                            <option value="NV">NV</option>
                            <option value="NY">NY</option>
                            <option value="OH">OH</option>
                            <option value="OK">OK</option>
                            <option value="OR">OR</option>
                            <option value="PA">PA</option>
                            <option value="RI">RI</option>
                            <option value="SC">SC</option>
                            <option value="SD">SD</option>
                            <option value="TN">TN</option>
                            <option value="TX">TX</option>
                            <option value="UT">UT</option>
                            <option value="VA">VA</option>
                            <option value="VT">VT</option>
                            <option value="WA">WA</option>
                            <option value="WI">WI</option>
                            <option value="WV">WV</option>
                            <option value="WY">WY</option>
                            <option value="AA">AA</option>
                            <option value="AE">AE</option>
                            <option value="AP">AP</option>
                            <option value="AS">AS</option>
                            <option value="FM">FM</option>
                            <option value="GU">GU</option>
                            <option value="MH">MH</option>
                            <option value="MP">MP</option>
                            <option value="PR">PR</option>
                            <option value="PW">PW</option>
                            <option value="VI">VI</option>
                        </select>
                    </div>
                </div>
                <div class="params">
                    <div class="param_name">Zip code</div>
                    <div class="param_value">
                        <input type="text" size="10" maxlength="10" name="zip" value="95131"> (5 or 9 digits)
                    </div>
                </div>
                <div class="params">
                    <div class="param_name">Country</div>
                    <div class="param_value">
                        <input type="text" size="10" maxlength="10" name="country" value="US">
                    </div>
                </div>
                <div class="params">
                    <div class="param_name">Phone</div>
                    <div class="param_value">
                        <input type="text" size="10" maxlength="10" name="phone" value="">
                    </div>
                </div>
                <div class="params">
                    <div class="param_name">IPN listener URL</div>
                    <div class="param_value">
                        <input type="text" size="80" maxlength="200" name="notifyURL" value="">
                    </div>
                </div>

                <div class="params">
                    <div class="param_name"></div>
                    <div class="param_value">
                    </div>
                </div>
                <div class="submit">
                    <input type="submit" name="DoDirectPaymentBtn"
                        value="DoDirectPayment" />
                </div>                          
            </form>
            <a href="../index.php">Home</a>
        </div>
    </div>
    <script language="javascript">
        generateCC();
    </script>
</body>
</html>

【讨论】:

【参考方案2】:

正如已经提到的,您遇到的错误是因为您使用凭据的帐户上未启用 pro。 Express Checkout 不需要任何特殊的计费协议,这就是您的 Express Checkout 呼叫有效的原因。

我已在您的测试沙盒帐户上启用专业服务,您现在应该可以使用它进行测试了。

【讨论】:

嗯,谢谢。实际上我的要求是在同一个网站直接付款而不重定向到贝宝页面。我应该在我的代码中添加什么来获得该功能。对不起我的语言。 您需要为您的买家创建一个界面以输入帐单信息。然后让它将数据发布到执行 DoDirectPayment API 调用的页面,然后解析出响应。查看 PayPal SDK 的工作示例,买家界面的代码已经存在。 html页面有没有模板。我在哪里可以找到模板 唯一的例子是来自 SDK 的例子。我在下面提供了该页面的代码作为另一个答案,因为评论部分将您限制为只有这么多字符。请记住,您将需要修改一些代码,并删除生成信用卡号的代码以进行测试。【参考方案3】:

错误消息指出问题在于到期日期。

您传递的 EXPDATE=042011 在我看来就像过去的日期。

编辑:

10500 Invalid Configuration 由于商家配置无效,无法处理此交易。 在您未同意结算协议时发生。

10501 Invalid Configuration 由于商户配置无效,无法处理此交易。

在计费协议被禁用或不活动时发生。

【讨论】:

我已将日期更改为未来但没有成功 无效的商家配置我会期待的 我提供了相同的沙箱凭据。但它得到了同样的错误。相同的凭据也适用于 SetExpressCheckout。 这听起来像是您的帐户有问题,可能值得与他们联系以确保它已为此函数调用设置。 但是相同的凭据一直适用于 SetExpressCheckout 方法

以上是关于如何使用 c# 在 paypal 中实现 DoDirectPayment的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 应用程序中实现 Paypal Rest API

如何在 Rails 中实现 Paypal 回调? (获取 InvalidAuthenticityToken 错误)

如何在 android 中实现 Paypal Native Checkout SDK?

我想在 Rails 中实现 PayPal Digital Goods Express Checkout API

如何使用 C# 在 access 数据库中实现“右外连接”查询?

如何在 C# 中实现线程关联?