html如何点击跳出购买成功,使用收据验证产品购买状态 (HTML)

使用收据验证产品购买状态 (HTML)

12/11/2015

本文内容

[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]

每个导致成功的产品购买的 Windows 应用商店交易都可以选择返回交易收据。此收据向客户提供所列出的产品和货币成本的信息。

有权访问此信息可支持以下方案:你的应用需要验证用户是否购买了你的应用,或者是否已从 Windows 应用商店进行了应用内产品购买。例如,请设想一个提供下载内容的游戏。如果购买了该游戏内容的用户要在其他设备上玩这个游戏,则需要验证该用户是否已经拥有此项内容。操作方法如下。

索要收据

cdiU06eD8X/w1aGCHeaGCG9w/kWZ8I099rw4mmPpvdU=

SjRIxS/2r2P6ZdgaR9bwUSa6ZItYYFpKLJZrnAa3zkMylbiWjh9oZGGng2p6/gtBHC2dSTZlLbqnysJjl7mQp/A3wKaIkzjyRXv3kxoVaSV0pkqiPt04cIfFTP0JZkE5QD/vYxiWjeyGp1dThEM2RV811sRWvmEs/hHhVxb32e8xCLtpALYx3a9lW51zRJJN0eNdPAvNoiCJlnogAoTToUQLHs72I1dECnSbeNPXiG7klpy5boKKMCZfnVXXkneWvVFtAA1h2sB7ll40LEHO4oYN6VzD+uKd76QOgGmsu9iGVyRvvmMtahvtL1/pxoxsTRedhKq6zrzCfT8qfh3C1w==

产品收据如下所示。

Uvi8jkTYd3HtpMmAMpOm94fLeqmcQ2KCrV1XmSuY1xI=

TT5fDET1X9nBk9/yKEJAjVASKjall3gw8u9N5Uizx4/Le9RtJtv+E9XSMjrOXK/TDicidIPLBjTbcZylYZdGPkMvAIc3/1mdLMZYJc+EXG9IsE9L74LmJ0OqGH5WjGK/UexAXxVBWDtBbDI2JLOaBevYsyy+4hLOcTXDSUA4tXwPa2Bi+BRoUTdYE2mFW7ytOJNEs3jTiHrCK6JRvTyU9lGkNDMNx9loIr+mRks+BSf70KxPtE9XCpCvXyWa/Q1JaIyZI7llCH45Dn4SKFn6L/JBw8G8xSTrZ3sBYBKOnUDbSCfc8ucQX97EyivSPURvTyImmjpsXDm2LBaEgAMADg==

你可以使用任一收据示例来测试自己的验证代码。

验证收据

取得收据后,你需要通过后端系统(Web 服务或类似对象)来验证该收据。以下是该验证过程的一个 .NET Framework 示例。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Security.Cryptography;

using System.Security.Cryptography.X509Certificates;

using System.Xml;

using System.IO;

using System.Security.Cryptography.Xml;

using System.Net;

namespace ReceiptVerificationSample

{

public sealed class RSAPKCS1SHA256SignatureDescription : SignatureDescription

{

public RSAPKCS1SHA256SignatureDescription()

{

base.KeyAlgorithm = typeof(RSACryptoServiceProvider).FullName;

base.DigestAlgorithm = typeof(SHA256Managed).FullName;

base.FormatterAlgorithm = typeof(RSAPKCS1SignatureFormatter).FullName;

base.DeformatterAlgorithm = typeof(RSAPKCS1SignatureDeformatter).FullName;

}

public override AsymmetricSignatureDeformatter CreateDeformatter(AsymmetricAlgorithm key)

{

if (key == null)

{

throw new ArgumentNullException("key");

}

RSAPKCS1SignatureDeformatter deformatter = new RSAPKCS1SignatureDeformatter(key);

deformatter.SetHashAlgorithm("SHA256");

return deformatter;

}

public override AsymmetricSignatureFormatter CreateFormatter(AsymmetricAlgorithm key)

{

if (key == null)

{

throw new ArgumentNullException("key");

}

RSAPKCS1SignatureFormatter formatter = new RSAPKCS1SignatureFormatter(key);

formatter.SetHashAlgorithm("SHA256");

return formatter;

}

}

class Program

{

// Utility function to read the bytes from an HTTP response

private static int ReadResponseBytes(byte[] responseBuffer, Stream resStream)

{

int count = 0;

int numBytesRead = 0;

int numBytesToRead = responseBuffer.Length;

do

{

count = resStream.Read(responseBuffer, numBytesRead, numBytesToRead);

numBytesRead += count;

numBytesToRead -= count;

} while (count > 0);

return numBytesRead;

}

public static X509Certificate2 RetrieveCertificate(string certificateId)

{

const int MaxCertificateSize = 10000;

// We are attempting to retrieve the following url. The getAppReceiptAsync website at

// http://msdn.microsoft.com/en-us/library/windows/apps/windows.applicationmodel.store.currentapp.getappreceiptasync.aspx

// lists the following format for the certificate url.

String certificateUrl = String.Format("https://go.microsoft.com/fwlink/?LinkId=246509&cid={0}", certificateId);

// Make an HTTP GET request for the certificate

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(certificateUrl);

request.Method = "GET";

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

// Retrieve the certificate out of the response stream

byte[] responseBuffer = new byte[MaxCertificateSize];

Stream resStream = response.GetResponseStream();

int bytesRead = ReadResponseBytes(responseBuffer, resStream);

if (bytesRead < 1)

{

//TODO: Handle error here

}

return new X509Certificate2(responseBuffer);

}

static bool ValidateXml(XmlDocument receipt, X509Certificate2 certificate)

{

// Create the signed XML object.

SignedXml sxml = new SignedXml(receipt);

// Get the XML Signature node and load it into the signed XML object.

XmlNode dsig = receipt.GetElementsByTagName("Signature", SignedXml.XmlDsigNamespaceUrl)[0];

if (dsig == null)

{

// If signature is not found return false

System.Console.WriteLine("Signature not found.");

return false;

}

sxml.LoadXml((XmlElement)dsig);

// Check the signature

bool isValid = sxml.CheckSignature(certificate, true);

return isValid;

}

static void Main(string[] args)

{

// .NET does not support SHA256-RSA2048 signature verification by default, so register this algorithm for verification

CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription), "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256");

// Load the receipt that needs to be verified as an XML document

XmlDocument xmlDoc = new XmlDocument();

xmlDoc.Load("..\\..\\receipt.xml");

// The certificateId attribute is present in the document root, retrieve it

XmlNode node = xmlDoc.DocumentElement;

string certificateId = node.Attributes["CertificateId"].Value;

// Retrieve the certificate from the official site.

// NOTE: For sake of performance, you would want to cache this certificate locally.

// Otherwise, every single call will incur the delay of certificate retrieval.

X509Certificate2 verificationCertificate = RetrieveCertificate(certificateId);

try

{

// Validate the receipt with the certificate retrieved earlier

bool isValid = ValidateXml(xmlDoc, verificationCertificate);

System.Console.WriteLine("Certificate valid: " + isValid);

}

catch (Exception ex)

{

System.Console.WriteLine(ex.ToString());

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
网趣网上购物系统HTML静态版 V2012介绍: 一、采用先进的AJAX与XML技术相融合全站静态生成! 网趣网上购物系统HTML静态版 V2012是一套最为先进的网上开店软件!系统采用先进的AJAX技术与XML技术相融生成静态,速度更快!软件代码多重过滤可以第一时间被搜索引擎收录,独特的静态生成算法可以大大减轻服务器的负担,无论在生成速度还是安全方面都达到国内领先水平。 二、生成过程更简单易用、更直观方便! 网趣HTML静态版V2012采用更为直观的静态生成模式!所有静态生成均在一个页面完成。系统生成静态统一采用百分比及进度条直观显示,全站静态生成显示动态进度,以及生成的百度比!生成过程随时掌控,使之更直观的呈现在人们面前! 三、静态生成与动态跟踪技术。实时显示页面信息! 网趣HTML静态版V2012运用先进的技术手段,在生成HTM文件的基础上,准确的显示用户当前的登陆状态、新闻的浏览率、用户的身份以及相应的价格级别等信息!完美解决了HTM文件不能实时显示动态信息的瓶颈。 四、多种智能HTM生成规则,方便用户管理! 系统在生成静态HTM的基础上,以用户为出发点,加入多种智能静态生成。静态生成页面实时显示未生成的数据。例如原来有500件商品并已生成静态,今天刚添加完一百件,系统实时显示未生成静态的数据,而且可以只生成这一百件商品而无须全部生成,大大节约了时间。同时还增加ID段生成功能,根据商品起始ID进行生成静态,非常方便! 五、独特的静态生成与强大的SEO优化于一体! 事实证明,HTML静态文件快速被搜索引擎收录,网趣HTML静态版V2012在采用先进的AJAX与XML技术生成的前提下,同时兼备了强大的SEO优化于一体,使您的网店推广变的尤为轻松!从此让您的网店在搜索引擎中脱颖而出! 总结HTML静态版的功能优势如下: √ 第一时间被搜索引擎收录,让客户第一时间找到您! √ 大大减轻服务器负担,同等环境下,HTML静态版浏览速度要比ASP高出近10倍!即使在服务器负载较重的情况下,也不会让您漏失客户! √ 更安全!HTML静态版不存在任何漏洞,让您高枕无忧。 √ 更易维护和管理,HTML静态页面后台只须轻轻一点,即可全部生成,方便快捷! √ 是电子商务时代所趋,目前较为流行的购物站均采用静态化的HTML,采用HTML静态版已是大势所趋。 六、HTML静态版拥有6套风格独特的模板 Html静态版拥有6套不同色调的模板,后台只须轻轻一点,整站风格即可瞬间更换,从此摆脱风格单一、枯燥的界面,每天给客户以新的感觉、新的享受! 七、购物系统HTML版支持三级级分类设置 网趣网上购物系统支持的三级分类设置,后台可以轻松对商品进行分类的明细化设置,添加商品,可以方便得设置一、二、三级分类的属性,对于商品较少的购物站,用户也可以只用2级分类,使购物系统的适应人群弹性更强,网站的导航分类一目了然,是购物系统最好的明细分类地图,用户可以方便得查看整站所有的类别信息。 八、支持商品图片自动删除功能 率先支持商品图片自动清除功能,众所周知,随着商品不断的上架与删除,会有很多冗余的图片占留空间,Html静态版支持删除商品的同时商品图片也随之自动删除,更节约空间,如果您的空间够大,图片也可以进行保留,后台可以方便得控制 九、率先支持Excel批量导入商品 网趣HTML静态版率先支持Excel批量导入商品功能,只须下载Excel模板按要求进行添加商品即可,添加完后通过批量添加商品功能,上传Excel文件即可一次性批量添加完成,非常方便。特别适合经常在本地来完成Excel添加,然后集中批量上传的用户。同时配合程序独有的批量修改功能,管理商品变的特别轻松与方便! 十、全屏幕设计的流行风格 采用目前流行的全屏幕设计风格, 流行而时尚,独特且新颖!优美的外观设计、给用户以美的视觉冲击,这是您网店成功的第一步! 十一、强大的商品输出Excel 功能 网趣支持商品数据导出Excel 电子表格功能!所有商品数据可直接输出至Excel 中,对于管理员进行帐务分析、数据备份有着举足轻重的使用! 十二、支持贝宝支付接口 贝宝是全球优秀的在线支付提供商,支持国内、国外银行卡支付,网趣系统现已整合贝宝支付接口,目前程序已经支持7种在线支付接口,后台可自由切换使用。 十三、现已整合财付通支付接口 财付通是腾讯推出的一款功能强大的在线支付工具,应用户的强烈要求,现已整合。程序目前拥有7种在线支付接口,后台自由切换使用,极其方便! 十四、订单自动通知功能! 有新订单产生,程序具有自动邮件通知功能,可以把订单信息发送到管理员邮箱,同时也会自动发送给客户信箱,可以直接登陆邮箱就可以查收订单!! 同时新用户
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值