验证Windows Phone应用程序内购买收据

时间:2013-04-09 21:18:49

标签: c# xml

我正在使用Windows Phone 8应用。我的应用将包括应用内购买。我正在努力理解收据的概念。根据我的理解,在有人在我的应用程序内购买产品后,会生成收据。

<?xml version="1.0"?>
<Receipt Version="1.0" CertificateId="{Identifier1}" xmlns="http://schemas.microsoft.com/windows/2012/store/receipt">
  <ProductReceipt PurchasePrice="${PurchaseAmount}" PurchaseDate="{DateTime}" Id="{Guid1}" AppId="{Guid2}" ProductId="{ProductName}" ProductType="Consumable" PublisherUserId="{Identifier2}" PublisherDeviceId="{Identifier3}" MicrosoftProductId="{Guid3}" />
  <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo>
      <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
      <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
      <Reference URI="">
        <Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /></Transforms>
    <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
    <DigestValue>{Identifier4}</DigestValue>
      </Reference>
    </SignedInfo>

    <SignatureValue>{HashedValue}</SignatureValue>
  </Signature>
</Receipt>

大!我不知道如何判断这张收据是否来自微软的服务器。有人可以向我解释如何验证吗?我看到了这一点:http://code.msdn.microsoft.com/wpapps/In-app-purchase-receipt-c3e0bce4然而,这对我来说没有意义。我不明白示例中的证书。 “IapReceiptProduction.cer”是一套固定的东西吗?或者只是这个样本?

如果这是一个愚蠢的问题,我很抱歉。

1 个答案:

答案 0 :(得分:6)

“收据”XML元素中的“CertificateId”属性确定用于对Windows应用商店收据进行签名的证书。获得CertificateID(样本中的“{Identifier1}”)后,您可以从下面的代码示例中指定的URL下载所需的证书作为“certificateUrl”。这是您以编程方式下载证书的方式:

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

您可以看到更多此代码示例here。该示例中包含“IapReceiptProduction.cer”,只是为了显示收据验证的工作原理,而无需通过代码下载证书。获得证书后,您可以使用System.Security.Cryptography.Xml.SignedXml API验证收据,如您链接的代码示例所示。