3

我正在开发一个 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”是固定的吗?或者只是为了这个样本?

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

4

1 回答 1

6

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

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

于 2013-05-08T14:10:46.967 回答