使用 Amazon FPS ( WinForms,ASP.NET 和 C# )

分享于 

18分钟阅读

Web开发

  繁體

介绍

Amazon Web服务 是开发人员可以用来构建具有良好性能。可以伸缩性和成本效益的应用程序的一组服务。 亚马逊( 灵活的付款服务) 有限的测试是这些 Web服务的一个,它是专门为开发人员建立的。 它允许在任何两个实体之间进行资金转移,并且建立在亚马逊基础设施支付的基础之上。 本文中的示例应用程序是一个小型商店示例,它在 C# 中实现了 Amazon FPS。 用户授权进入亚马逊帐户,而不是传统的信用卡签名。

背景

Amazon灵活支付服务( FPS ) 有限测试版是专门为开发者构建的在线支付方法。 它是建立在可靠的亚马逊和可以伸缩的支付基础设施之上的。 它支持诸如信用卡。银行账户借记和亚马逊平衡付款转移等支付方法。 这些支付方法有不同的费用。 资金的发件人和收件人最初声明付款指令。 Amazon FPS还允许小额支付,因此可以将许多交易累积到单个事务中。 信用卡不同,交易金额可能非常少。 当大量单个事务聚合成单个事务时,可以保存事务处理成本。 funds的sender不支付任何交易费用。 然而,对于接收方来说,事务处理费用是按信用卡。银行帐户借记或者亚马逊支付的平衡。 现有的Amazon.com 客户可以在从亚马逊支付的网站购买任何东西时使用他们的登录信息。 这样,他们就不必在每次买东西时都在所有的付款信息上加密,也就是用信用卡。

使用这里应用程序所需做

Amazon Web Services 开发人员帐户的I。register

首先,转到这里链接: https://aws-portal.amazon.com/gp/aws/developer/registration/index.html?

  • 你必须按照前三个步骤来创建 Amazon.com 帐户,因为它已经被解释。 填写完所有细节并成功创建帐户后,电子邮件将被发送到你的帐户中。 点击链接后,你将被重定向到 Amazon.com 网站主页。 帐户详细信息如下所示:

  • 单击顶部的Web服务 帐户选项卡,然后单击访问标识符,查看AWS访问密钥ID和密钥访问密钥,如下所示:

  • 你的访问密钥ID和密钥访问密钥如下所示:

请点击Show链接to查看你的秘密访问密钥。

  • 现在,单击 X.509 证书下的Create新建tab创建一个新证书。 以下屏幕将显示:

  • 单击 yes tab创建一个新证书,将显示以下屏幕:

下载 private 密钥文件和 X.509 证书。 文件将以 。pem格式保存,然后将文件保存在同一个文件夹中。 需要使用OpenSSL加密这些文件以使用P12格式进行加密。 下载 OpenSSL,进入 http://www.openssl.org 并下载最新版本的OpenSSL并将文件的内容解压缩到与保存的private 密钥文件和保存的证书文件相同的文件夹中。 然后,打开命令提示符并输入以下命令:

openssl pkcs12 -export -inkey your_private_key_file.pem 
 -in your_X.509_certificate_file.pem 
 -name"YOUR KeyStorePassword" -out afps-sdk-keystore.p12

这里, your_private_key_file和 your_X.509_certificate_file 是 private 键的名称以及你下载的证书。 现在,去 app.config。

<!-- AWS Access Credentials --><addkey="AWSAccessKeyID"value="YOUR AWSAccessKeyID"/><addkey="AWSSecretAccessKey"value="YOUR AWSSecretAccessKey"/><!-- Keystore --><addkey="KeyStoreLocation"value="YOUR afps-sdk-keystore.p12 Location"/><addkey="KeyStorePassword"value="YOUR KeyStorePassword"/>
II。注册 Amazon FPS沙箱环境

要创建Amazon付款沙箱帐户,请转到以下链接: https://aws-portal.amazon.com/gp/aws/payments/sandbox/index.htm

使用以前创建的Amazon.com 帐户登录。 然后为你创建一个帐户。

III。安装 Visual Studio 2005 IV。 安装 ASP.NET 2.0 V。安装 Web服务 增强 3.0. 确保计算机上安装了 IIS

有关详细信息,请访问: http://developer.amazonwebservices.com/connect/entry.jspa?entryID=913&ref=featured

应用程序的工作原理

以下部分显示了序列图的帮助,以及应用程序如何工作的步骤:

设置呼叫者和收件人令牌

上面 图显示了安装调用方和接收方令牌的过程。 这个 AmazonFPSUI 类是用户界面类,它告诉 AmazonFPSManager 类调用者和收件人令牌需要设置。 然后,AmazonFPSManager 类在 InstallPaymentInstruction 方法中发送一个web请求,该请求为:

  • 建立Web服务调用所需的令牌,以及
  • 通过指示"来电者"或者"收件人"来建立付款指示。

在这里代码示例中,存储起调用方的作用。 然后,需要设置收件人令牌以接收付款。 在这种情况下,商店也是收件人。 使用 InstallRecipientInstruction 方法设置收件人令牌。 这将保存在应用程序配置文件( app.config ) 中。 下面的源代码演示了一个示例:

/* AmazonFPSManager.cs */staticclass AmazonFPSManager
{#region Propertieprivatestatic AmazonFPSInfo m_AccountFPSInfo = null;
 privatestatic AmazonFPSInfo AccountFPSInfo
 {
 get {
 if (m_AccountFPSInfo == null)
 {
 m_AccountFPSInfo = new AmazonFPSInfo();
 m_AccountFPSInfo.CallerToken = 
 ComfigurationUtillity.GetAppSettings("CallerTokenID");
 m_AccountFPSInfo.RecipientToken = 
 ComfigurationUtillity.GetAppSettings("RecipientTokenID");
 m_AccountFPSInfo.AWSAccessKeyID = 
 ComfigurationUtillity.GetAppSettings("AWSAccessKeyID");
 m_AccountFPSInfo.AWSSecretAccessKey = 
 ComfigurationUtillity.GetAppSettings("AWSSecretAccessKey");
 m_AccountFPSInfo.RecipientName = Settings.TOKENFRIENDLYNAME;
 }
 return m_AccountFPSInfo;
 }
 }
 #endregion#region Setuppublicstatic AmazonFPSInfo Setup(string keyStoreLocation, string keyStorePassword)
 {
 string callerToken = InstallPaymentInstruction(Roles.Caller, 
 keyStoreLocation, keyStorePassword);
 string recipientToken = InstallPaymentInstruction(Roles.Recipient, 
 keyStoreLocation, keyStorePassword);
 AmazonFPSInfo retInfo = new AmazonFPSInfo();
 AccountFPSInfo.CallerToken = callerToken;
 AccountFPSInfo.RecipientToken = recipientToken;
 return retInfo;
 }
 privatestaticstring InstallPaymentInstruction(Roles role, 
 string keyStoreLocation, string keyStorePassword)
 {
 InstallPaymentInstructionRequest paymentReq = 
 new InstallPaymentInstructionRequest();
 paymentReq.TokenType = TokenType.Unrestricted;
 paymentReq.TokenFriendlyName = Settings.TOKENFRIENDLYNAME;
 paymentReq.CallerReference = Settings.CallerReference;
 if (role.Equals(Roles.Caller))
 paymentReq.PaymentInstruction = "MyRole == 'Caller';";
 else paymentReq.PaymentInstruction = "MyRole == 'Recipient';";
 AmazonFPSWse clientAgent = 
 AmazonFPSProxy.GetInstance(ComfigurationUtillity.GetAppSettings(
 "WebserviceEndpoint"), keyStoreLocation, keyStorePassword);
 InstallPaymentInstructionResponse paymentRes = 
 //clientAgent.InstallPaymentInstruction(paymentReq);if (paymentRes == null)
 {
 thrownew ApplicationException("InstallPaymentInstruction Call failed");
 }
 elseif (paymentRes.Status == ResponseStatus.Failure)
 {
 ApplicationException ex = 
 new ApplicationException("Caller Token Creation Failed.");
 ex.Data.Add("Is Retriable", paymentRes.Errors[0].IsRetriable);
 ex.Data.Add("Type", paymentRes.Errors[0].ErrorType);
 ex.Data.Add("Code", paymentRes.Errors[0].ErrorCode);
 ex.Data.Add("Reason", paymentRes.Errors[0].ReasonText);
 throw ex;
 }
 return paymentRes.TokenId;
 }
 #endregion/* ComfigurationUtility.cs */class ComfigurationUtillity
{
 publicstaticvoid UpdateAppSettings(string key, stringvalue)
 {
 Configuration config = 
 ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
 config.AppSettings.Settings[key].Value = value;
 config.Save(ConfigurationSaveMode.Modified);
 ConfigurationManager.RefreshSection("appSettings");
 }
 publicstaticstring GetAppSettings(string key)
 {
 System.Configuration.Configuration config = 
 //ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);return config.AppSettings.Settings[key].Value;
 }
}

在发送方过程中签名

上面 图表显示在他想从商店购买某些东西时为发件人( 采购员) 设置令牌的过程。 AmazonFPSUI 在方法中发送标记,参数 PaymentReasonPaymentMethodAmazonFPSManager。 这里,付款原因可以能是买方购买的任何产品,付款方式是用信用卡或者现金付款。 AmazonFPSManager 管理发生的所有事务。 AmazonFPSManager 类将调用方和收件人令牌,( 如上所述)。收件人 NAME 和收件人的访问键发送到 AmazonFPSInfo 类。 AWS访问密钥用于标识收件人。 对收件人进行身份验证后,将URL发送回用户界面并将用户定向到亚马逊登录页面。 这里,用户登录Amazon帐户,用户的身份验证后,买方的令牌ID被发送到 AmazonFPSSenderInfo 类中。 然后,使用签名的URL将购买者重定向回网站。 下面是签名的URL及其参数的示例:

/* AmazonFPSManager.cs */#region SignInpublicstaticstring SignIn(string paymentReason, double amout, string paymentMethod)
{
 string returnUrl = ComfigurationUtillity.GetAppSettings("ReturnUrl");
 string cbuiPipelineUrl = ComfigurationUtillity.GetAppSettings("CBUIPipelineUrl");
 string pipelineName = Pipeline.SINGLE_USE;
 SortedDictionary<string> parameters = new SortedDictionary<string,>();
 parameters.Add("transactionAmount", amout.ToString());
 parameters.Add("callerKey", AccountFPSInfo.AWSAccessKeyID);
 parameters.Add("callerReference", Settings.CallerReference);
 parameters.Add("pipelineName", pipelineName);
 parameters.Add("recipientToken", AccountFPSInfo.RecipientToken);
 parameters.Add("paymentReason", paymentReason);
 parameters.Add("paymentMethod", paymentMethod);
 parameters.Add("returnURL", returnUrl);
 // Build Signature without"awsSignature" oarameter first!string signature = 
 BuildSignature(AccountFPSInfo.AWSSecretAccessKey, parameters);
 // Add back to the uri parameters.Add("awsSignature", signature);
 return ConstructSignedURL(cbuiPipelineUrl, parameters);
}publicstaticstring ConstructSignedURL(string cbuiPipelineUrl, 
 SortedDictionary<string, > parameters)
{
 StringBuilder unsignedUrl = new StringBuilder();
 unsignedUrl.AppendFormat("{0}", cbuiPipelineUrl);
 bool first = true;
 foreach (KeyValuePair<string,/> varin parameters)
 {
 unsignedUrl.AppendFormat("{2}{0}={1}", var.Key, 
 var.Value, (first? "?" : //"&")); first = false;
 }
 return unsignedUrl.ToString();
}privatestaticstring PrepareUrlEncode(string val)
{
 if (HttpUtility.UrlEncode(val).IndexOf('%')!= -1)
 {
 String[] strs = HttpUtility.UrlEncode(val.Trim()).Split(new char[] { '%'//}); StringBuilder retEncodedVAl = new StringBuilder(strs[0]);
 for (int k = 1; k < strs.Length; k++)
 {
 retEncodedVAl.Append('%');
 retEncodedVAl.Append(strs[k].Substring(0, 2).ToUpper() + 
 strs//[k].Substring(2, strs[k].Length - 2));// ASCII Key A, B, C, D, E, F to upper case }
 return retEncodedVAl.ToString();
 }
 else {
 return HttpUtility.UrlEncode(val.Trim());
 }
}privatestaticstring BuildSignature(string secretKey, 
 SortedDictionary<string,> parameters)
{
 StringBuilder sortedParams = 
 new StringBuilder(@"/cobranded//-ui/actions/start");
 bool first = true;
 foreach (KeyValuePair<string,/> varin parameters)
 {
 sortedParams.AppendFormat("{2}{0}={1}", var.Key.Trim(), 
 //PrepareUrlEncode//(var.Value), (first?"?" :"&")); first = false;
 }
 return CalculateHMAC(secretKey, sortedParams.ToString());
}internalstaticstring CalculateHMAC(String secretKey, String parametersToHash)
{
 ASCIIEncoding ae = new ASCIIEncoding();
 HMACSHA1 signature = new HMACSHA1(ae.GetBytes(secretKey));
 return Convert.ToBase64String(signature.ComputeHash(
 ae.GetBytes(parametersToHash.ToCharArray())));
}#endregion

付款过程

上面 图表首先显示了从上一个图中获得发送者令牌to的详细信息,然后对 WebRequest 类进行处理。 事务的结果存储在 AmazonPaymentInfo 类中。 然后 AmzonFPSManager 类检查 payResponse 对象以查看事务是否成功。 payResponse 是类 payResponse的一个实例。 payResponse 是一个代理类,它定义 TransactionResponseResponseStatusServiceErrorrequestIdField。 相应地将响应返回给浏览器。 然后,TransactionId 存储在 AmazonPaymentInfo 类中。

付款请求

示例应用程序中使用的下列代码显示了如何处理付费请求。涉及的各种参数和 behind的事务响应细节:

/* AmazonFPSManager.cs */#region Pay Methodinternalstatic AmazonPaymentInfo ProcessPayment(
 AmazonFPSSenderInfo amazonFPSSenderInfo, double amountRaw)
{
 PayRequest payRequest = new PayRequest();
 payRequest.CallerTokenId = AccountFPSInfo.CallerToken;
 payRequest.RecipientTokenId = AccountFPSInfo.RecipientToken;
 payRequest.SenderTokenId = amazonFPSSenderInfo.SenderToken;
 Amount amount = new Amount();
 amount.Amount1 = amountRaw.ToString();
 payRequest.TransactionAmount = amount;
 payRequest.ChargeFeeTo = amazonFPSSenderInfo.ChargeFeeTo;
 payRequest.CallerReference = Settings.CallerReference;
 payRequest.TransactionDate = System.DateTime.Now;
 payRequest.CallerDescription = Settings.TOKENFRIENDLYNAME;
 payRequest.RecipientDescription = 
 "Tiny Point of Sale: Amazon Flexible Payments Service (Amazon FPS)";
 payRequest.RecipientReference = "keng@mycosservices.com";
 payRequest.SenderDescription = string.Format("Custome name : {0}, Email address {1}", 
 amazonFPSSenderInfo.CustomerName, 
 amazonFPSSenderInfo.EmailAddress);
 payRequest.SenderReference = amazonFPSSenderInfo.EmailAddress;
 AmazonFPSWse clientAgent = AmazonFPSProxy.GetInstance();
 PayResponse payResponse = clientAgent.Pay(payRequest);
 TransactionResponse transactionResponse = payResponse.TransactionResponse;
 AmazonPaymentInfo amazonPaymentInfo = new AmazonPaymentInfo();
 amazonPaymentInfo.TransectionId = transactionResponse.TransactionId;
 amazonPaymentInfo.TransectionStatus = transactionResponse.Status.ToString();
 if (payResponse.Status.Equals(ResponseStatus.Success))
 {
 amazonPaymentInfo.IsSuccess = true;
 amazonPaymentInfo.Message = string.Format("Status detail : {0}", 
 transactionResponse.StatusDetail);
 }
 elseif (payResponse.Status.Equals(ResponseStatus.Failure))
 {
 amazonPaymentInfo.IsSuccess = false;
 amazonPaymentInfo.Message = string.Format("Error message : {0}", 
 string.Concat(payResponse.Errors));
 }
 return amazonPaymentInfo;
}#endregion

使用代码

这里应用程序是 Windows 应用程序。 因这里,为了实现它作为一个 ASP.NET web应用程序,你可以下载代码( 单个类) 并使用一个web窗体来调用。


asp  asp-net  Using  亚马逊  Winforms  FPS  
相关文章