使用C#调用Dwolla场外网关/直接提交
本文关键字:提交 网关 调用 Dwolla 使用 | 更新日期: 2023-09-27 18:26:40
我正试图通过"直接提交"工作流利用Dwolla的场外网关(https://developers.dwolla.com/dev/pages/gateway#submit-直接)到我的自定义ASPX/C#的网站。
我已经能够使用他们提供的脚本成功地将Dwolla按钮添加到ASPX页面:
<script
src="https://www.dwolla.com/scripts/button.min.js" class="dwolla_button" type="text/javascript"
data-key="ConsumerKeyObtainedFromDwolla"
data-redirect="RedirectPage.aspx"
data-label="Dwolla"
data-name="MyNameGoesHere"
data-description="MyDescriptionGoesHere"
data-amount="123.45"
data-shipping="0"
data-tax="0"
data-guest-checkout="true"
data-type="freetype"
>
</script>
然而,我还需要在同一页面上包含一个PayPal按钮,并且不希望脚本输入标签发生冲突。我还想轻松地填充变量(例如消费者密钥、时间戳和订单ID的HMAC-SHA1十六进制哈希)并进行一些计算,而不必在javascript中这样做。所以我的目标是在页面后面的C#代码中完成这一切。
我的第一步是简单地从PayPal脚本中删除表单标签,并添加一个带有PayPal PostBackURL的ASP按钮。这起到了作用,所以我进一步完全从ASPX中重构了PayPal部分,并实现了C#代码,以基于PayPal脚本的核心构建重定向URL:
string txtRedirectURL = "";
txtRedirectURL += "https://www.paypal.com/cgi-bin/webscr?&cmd=_xclick";
txtRedirectURL += "&business=A1B2C3D4";
txtRedirectURL += "&lc=US";
...
txtRedirectURL += "&item_name=abcdefg";
txtRedirectURL += "&amount=123.45";
txtRedirectURL += "¤cy_code=USD";
Response.Redirect(txtRedirectURL);
这样做效果很好,所以我希望对Dwolla使用的脚本也能做到这一点(如上所述)。不幸的是,这种方法没有被证明是成功的。我尝试的第一个选项是根据Dwolla脚本中的数据字段模拟PayPal重定向:
string txtRedirectURL = "";
txtRedirectURL += "https://www.dwolla.com/payment/pay?";
txtRedirectURL += "key=ConsumerKeyObtainedFromDwolla";
txtRedirectURL += "&label=Dwolla";
txtRedirectURL += "&name=MyNameGoesHere";
txtRedirectURL += "&description=MyDescriptionGoesHere";
txtRedirectURL += "&amount=123.45";
txtRedirectURL += "&shipping=0.00";
txtRedirectURL += "&tax=0.00";
Response.Redirect(txtRedirectURL);
这确实尝试将我导航到Dwolla的https://www.dwolla.com/payment/pay页面,但它最终把我导航到了Dwolla的404页面(哭泣的蓝色考拉熊)。我还添加了以下行的各种版本,以获得更好的成功:
txtRedirectURL += "&signature=HMACSHA1Hash;
txtRedirectURL += "&test=true";
txtRedirectURL += "&destinationid=UserIDObtainedFromDwolla";
txtRedirectURL += "&orderid=999;
txtRedirectURL += "×tamp=" + txtTimeStamp;
txtRedirectURL += "&allowFundingSources=true";
我的假设是:
我的URL中有一些东西在把东西扔出去,Dwolla的错误处理把我扔到了404页面,而不是显示错误(正如我在玩按钮时看到的那样)
button.min.js脚本正在做一些我需要在C#中重新创建的时髦的事情。我已经复习过了,但不知道缺失的一步可能是什么。
我还尝试了一种更直接的方法,尝试从C#内部执行脚本:
string dwollaScript = "<script
src="https://www.dwolla.com/scripts/button.min.js" class="dwolla_button" type="text/javascript"
data-key="ConsumerKeyObtainedFromDwolla"
data-redirect="RedirectPage.aspx"
data-label="Dwolla"
data-name="MyNameGoesHere"
data-description="MyDescriptionGoesHere"
data-amount="123.45"
data-shipping="0"
data-tax="0"
data-guest-checkout="true"
data-type="freetype"
>
</script>";
System.Web.UI.ScriptManager.RegisterStartupScript(this, this.GetType(), "123", dwollaScript.ToString(), false);
当绑定到按钮点击时,它会成功启动,但它所做的只是在我的页面上显示一个Dwolla按钮。它不像普通的Dwolla按钮那样引导我到Dwolla。
有什么想法吗?
首先,一个重要的注意事项:
更好的解决方案是使用服务器到服务器的签出请求,而不是直接提交,因为它不允许用户修改任何请求的参数。您只需要POST到端点并接收一个签出ID,您可以使用该ID生成一个供用户遵循的签出URL。不需要JS欺骗。
我想你可能会发现这个Dwolla C#包装器很有用。它同时支持网关请求和回调处理。
要回答您的问题:
看起来你正试图https://www.dwolla.com/payment/pay使用querystring变量中的checkout参数,这不是请求checkout会话的有效方式。
"直接提交"工作流要求您创建一个表单,该表单将POST到https://www.dwolla.com/payment/pay.例如:
<form accept-charset="UTF-8" action="https://www.dwolla.com/payment/pay" method="post">
<input id="key" name="key" type="hidden" value="abcdefg" />
<input id="signature" name="signature" type="hidden" value="abcd" />
<input id="callback" name="callback" type="hidden"
value="http://www.mywebsite.com/callback.aspx" />
<input id="redirect" name="redirect" type="hidden"
value="http://www.mywebsite.com/redirect.aspx" />
<input id="test" name="test" type="hidden" value="true" />
<input id="name" name="name" type="hidden" value="Purchase" />
<input id="description" name="description" type="hidden"
value="Description" />
<input id="destinationid" name="destinationid" type="hidden"
value="812-111-1111" />
<input id="amount" name="amount" type="hidden" value="1.00" />
<input id="shipping" name="shipping" type="hidden" value="0.00" />
<input id="tax" name="tax" type="hidden" value="0.00" />
<input id="orderid" name="orderid" type="hidden" value="188375" />
<input id="timestamp" name="timestamp" type="hidden"
value="1323302400" />
<button type="submit">Submit Order</button>
</form>