2012-12-02 17 views
5

PHP kullanarak Windows 8 uygulamaları sunucu tarafında yapılan uygulama içi satın alımları doğrulamamız gerekiyor. MSDN documentation page yalnızca C# örneğine sahiptir. Şu anda bir gün, PHP'de yapmanın bir yolunu arayarak geçirdim. Başarı yok. Tüm internet üzerinde bu konuyla ilgili sadece .NET örnekleri var.Windows 8 alımlarını (makbuzlar) PHP kullanarak doğrulama

İmzalı XML ve x509 hakkında bazı kısmi bilgiler buldum, bazı kütüphaneler (xmlseclibs - yararsız, sha256'yı desteklemeyen openssl_ * işlevlerini kullanır; phpseclib - ümit verici görünüyor ancak dökümantasyon ve örnekler yardımsızdır).

İmzalı XML, RSA ve x509 hakkında her şeyi öğrenmeden bir şekilde yapmak mümkün mü? Şu anda neredeyse her şeyi okudum ama her yer sadece kodlama hakkında bilgi. Doğrulama hakkında bir şey yok.

+0

Bu işi aldınız mı? –

cevap

1

WP8 IAP makbuzu xmlseclibs kütüphanesini kullanarak doğrulamayı başardım.

Ayrıca, php curl etkin olmalıdır.

do { 
    $doc = new DOMDocument(); 

    $xml = $_POST['receipt_data']; // your receipt xml here! 

    // strip unwanted chars - IMPORTANT!!! 
    $xml = str_replace(array("\n","\t", "\r"), "", $xml); 
    //some (probably mostly WP8) receipts have unnecessary spaces instead of tabs 
    $xml = preg_replace('/\s+/', " ", $xml); 
    $xml = str_replace("> <", "><", $xml); 

    $doc->loadXML($xml); 
    $receipt = $doc->getElementsByTagName('Receipt')->item(0); 
    $certificateId = $receipt->getAttribute('CertificateId'); 

    $ch = curl_init("https://lic.apps.microsoft.com/licensing/certificateserver/?cid=$certificateId"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 

    $publicKey = curl_exec($ch); 
    $errno = curl_errno($ch); 
    $errmsg = curl_error($ch); 
    curl_close($ch); 

    if ($errno != 0) { 
     $verifyFailed = true; 
     break; 
    } 

    // Verify xml signature 
    require('./xmlseclibs.php'); 
    $objXMLSecDSig = new XMLSecurityDSig(); 
    $objDSig = $objXMLSecDSig->locateSignature($doc); 
    if (!$objDSig) { 
     $verifyFailed = true; 
     break; 
    } 
    try { 
     $objXMLSecDSig->canonicalizeSignedInfo(); 
     $retVal = $objXMLSecDSig->validateReference(); 
     if (!$retVal) { 
      throw new Exception("Error Processing Request", 1); 
     } 
     $objKey = $objXMLSecDSig->locateKey(); 
     if (!$objKey) { 
      throw new Exception("Error Processing Request", 1); 
     } 
     $key = NULL; 
     $objKeyInfo = XMLSecEnc::staticLocateKeyInfo($objKey, $objDSig); 
     if (! $objKeyInfo->key && empty($key)) { 
      $objKey->loadKey($publicKey); 
     } 
     if (!$objXMLSecDSig->verify($objKey)) { 
      throw new Exception("Error Processing Request", 1); 
     } 
    } catch (Exception $e) { 
     $verifyFailed = true; 
     break; 
    } 

    $productReceipt = $doc->getElementsByTagName('ProductReceipt')->item(0); 
    $prodictId = $productReceipt->getAttribute('ProductId'); 
    $purchaseDate = $productReceipt->getAttribute('PurchaseDate'); 
} while(0); 

if ($verifyFailed) { 
    // invalid receipt 
} else { 
    // valid receipt 
} 
-1

Kendiniz için konuşun. Phpseclib'in belgelerine "kendi örneğini oluştur" yaklaşımını seviyorum.

Bu, phpseclib'in gerçekten bu durumda kullanılabileceğini sanmıyorum. Yani SignatureValue etiketiniz var. Bu imza neyi kapsar? XML İmzaları ile anlaşmam, imzanın XML'in normalleştirilmiş bir formunu kapsamasıdır. Bir XML doc xmlseclibsnormalizes ama phpseclib bir kripto lib değil - bir XML lib değil.

+0

Beni yanlış anlamayın, kaba olmak istemedim, phpseclib güçlü bir kütüphaneye benziyor. Ancak, x509-> loadCA ('...') 'da neyin yükleneceği gibi daha ayrıntılı örnekler kaçırdım; vb. MS belgelerinde yazdığı gibi sağlanan sertifikayla xml imzasını doğrulamak için kullanmak istedim. Ve bu lib tarafından doğrulama (bir şekilde) mümkün olmalıdır. Bu örneği buldum [link] (http://phpseclib.sourceforge.net/x509/examples.html#validate ,loadx509,signoself,selfsetdnprop,csrload,crlload,issuersetdnprop,subjsetdnprop,) Ama ne kullanacağımı bilmiyorum doğrulama için. – Speedy

+0

Sanırım phpseclib'in diğer X.509 uygulamalarına karşı nasıl doğrulanabileceğini tartışmasını beklemek mantıksız. phpseclib'in web sitesi phpseclib - diğer yazılım paketlerini değil - belgelemelidir. Http://phpseclib.sourceforge.net/interop.html: Amaçlarınıza hizmet etmesi gereken bir birlikte çalışabilirlik sayfası sağladığını söyledi. –