2013-05-08 4 views
2

Microsoft предоставляет реализацию C#, но у меня проблемы с переносом на Java.Windows Store - проверка чеков с помощью Java

C реализация #: http://msdn.microsoft.com/en-us/library/windows/apps/jj649137.aspx

сертификат (скачать с Microsoft):

-----BEGIN CERTIFICATE----- 
MIIDyTCCArGgAwIBAgIQNP+YKvSo8IVArhlhpgc/xjANBgkqhkiG9w0BAQsFADCB 
jjELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1Jl 
ZG1vbmQxHjAcBgNVBAoMFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEWMBQGA1UECwwN 
V2luZG93cyBTdG9yZTEgMB4GA1UEAwwXV2luZG93cyBTdG9yZSBMaWNlbnNpbmcw 
HhcNMTExMTE3MjMwNTAyWhcNMzYxMTEwMjMxMzQ0WjCBjjELMAkGA1UEBhMCVVMx 
EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1JlZG1vbmQxHjAcBgNVBAoM 
FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEWMBQGA1UECwwNV2luZG93cyBTdG9yZTEg 
MB4GA1UEAwwXV2luZG93cyBTdG9yZSBMaWNlbnNpbmcwggEiMA0GCSqGSIb3DQEB 
AQUAA4IBDwAwggEKAoIBAQCcr4/vgqZFtzMqy3jO0XHjBUNx6j7ZTXEnNpLl2VSe 
zVQA9KK2RlvroXKhYMUUdJpw+txm1mqi/W7D9QOYTq1e83GLhWC9IRh/OSmSYt0e 
kgVLB+icyRH3dtpYcJ5sspU2huPf4I/Nc06OuXlMsD9MU4Ug9IBD2HSDBEquhGRo 
xV64YuEH4645oB14LlEay0+JZlkKZ/mVhx/sdzSBfrda1X/Ckc7SOgnTSM3d/DnO 
5DKwV2WYn+7i/rBqe4/op6IqQMrPpHyem9Sny+i0xiUMA+1IwkX0hs0gvHM6zDww 
TMDiTapbCy9LnmMx65oMq56hhsQydLEmquq8lVYUDEzLAgMBAAGjITAfMB0GA1Ud 
DgQWBBREzrOBz7zw+HWskxonOXAPMa6+NzANBgkqhkiG9w0BAQsFAAOCAQEAeVtN 
4c6muxO6yfht9SaxEfleUBIjGfe0ewLBp00Ix7b7ldJ/lUQcA6y+Drrl7vjmkHQK 
OU3uZiFbCxTvgTcoz9o+1rzR/WPXmqH5bqu6ua/UrobGKavAScqqI/G6o56Xmx/y 
oErWN0VapN370crKJvNWxh3yw8DCl+W0EcVRiWX5lFsMBNBbVpK4Whp+VhkSJilu 
iRpe1B35Q8EqOz/4RQkOpVI0dREnuSYkBy/h2ggCtiQ5yfvH5zCdcfhFednYDevS 
axmt3W5WuHz8zglkg+OQ3qpXaXySRlrmLdxEmWu2MOiZbQkU2ZjBSQmvFAOy0dd6 
P1YLS4+Eyh5drQJc0Q== 
-----END CERTIFICATE----- 

Образец квитанции (предоставляемые Microsoft):

<Receipt Version="1.0" ReceiptDate="2012-08-30T23:10:05Z" CertificateId="b809e47cd0110a4db043b3f73e83acd917fe1336" ReceiptDeviceId="4e362949-acc3-fe3a-e71b-89893eb4f528"> 
    <AppReceipt Id="8ffa256d-eca8-712a-7cf8-cbf5522df24b" AppId="55428GreenlakeApps.CurrentAppSimulatorEventTest_z7q3q7z11crfr" PurchaseDate="2012-06-04T23:07:24Z" LicenseType="Full" /> 
    <ProductReceipt Id="6bbf4366-6fb2-8be8-7947-92fd5f683530" ProductId="Product1" PurchaseDate="2012-08-30T23:08:52Z" ExpirationDate="2012-09-02T23:08:49Z" ProductType="Durable" AppId="55428GreenlakeApps.CurrentAppSimulatorEventTest_z7q3q7z11crfr" /> 
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
     <SignedInfo> 
      <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> 
      <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>cdiU06eD8X/w1aGCHeaGCG9w/kWZ8I099rw4mmPpvdU=</DigestValue> 
      </Reference> 
     </SignedInfo> 
     <SignatureValue>SjRIxS/2r2P6ZdgaR9bwUSa6ZItYYFpKLJZrnAa3zkMylbiWjh9oZGGng2p6/gtBHC2dSTZlLbqnysJjl7mQp/A3wKaIkzjyRXv3kxoVaSV0pkqiPt04cIfFTP0JZkE5QD/vYxiWjeyGp1dThEM2RV811sRWvmEs/hHhVxb32e8xCLtpALYx3a9lW51zRJJN0eNdPAvNoiCJlnogAoTToUQLHs72I1dECnSbeNPXiG7klpy5boKKMCZfnVXXkneWvVFtAA1h2sB7ll40LEHO4oYN6VzD+uKd76QOgGmsu9iGVyRvvmMtahvtL1/pxoxsTRedhKq6zrzCfT8qfh3C1w==</SignatureValue> 
    </Signature> 
</Receipt> 

Java реализация:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
Document doc = dbf.newDocumentBuilder().parse(new FileInputStream("/XMLFile1.xml")); 

NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature"); 
if (nl.getLength() == 0) { 
    throw new Exception("Cannot find Signature element"); 
} 

String base64CertString = "MIIDyTCCArG... // Copied from certificate without new lines and -- BEGIN .. END stuff ... 
byte data[] = Base64.decodeBase64(base64CertString); 
CertificateFactory f = CertificateFactory.getInstance("X.509"); 
X509Certificate certificate = (X509Certificate) f.generateCertificate(new ByteArrayInputStream(data)); 

certificate.checkValidity(); // Validates OK! 

PublicKey pk = certificate.getPublicKey();   

// document containing the XMLSignature 
DOMValidateContext valContext = new DOMValidateContext(pk, nl.item(0)); 

String providerName = System.getProperty("jsr105Provider", "org.jcp.xml.dsig.internal.dom.XMLDSigRI"); 
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInstance()); 

XMLSignature signature = fac.unmarshalXMLSignature(valContext); 
boolean valid = signature.validate(valContext); 

// Check core validation status 
if (valid == false) { 
    System.out.println("Signature failed core validation"); 
    boolean sv = signature.getSignatureValue().validate(valContext); 
    System.out.println("signature validation status: " + sv); 
    // check the validation status of each Reference 
    @SuppressWarnings("rawtypes") 
    Iterator i = signature.getSignedInfo().getReferences().iterator(); 
    for (int j=0; i.hasNext(); j++) { 
     boolean refValid = ((Reference) i.next()).validate(valContext); 
     System.out.println("ref["+j+"] validity status: " + refValid); 
    }    
} else { 
    System.out.println("Signature passed core validation"); 
} 

Подтверждение не выполняется как для проверки подписи, так и для проверки ссылочной позиции. Зачем?

ответ

2

если вы используете Java, чтобы проверить квитанцию, вы должны удалить пробелы между символами «>» и «<», то вам успех

0

я его работы путем обрезки каждой строки XML, используя этот код:

private static String trim(String input) { 
    BufferedReader reader = new BufferedReader(new StringReader(input)); 
    StringBuilder result = new StringBuilder(); 

    try { 
     String line; 
     while ((line = reader.readLine()) != null) { 
      result.append(line.trim()); 
     } 

     return result.toString(); 
    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } 
} 
Смежные вопросы