gpt4 book ai didi

php - 使用 PHP 验证 Windows 8 购买(收据)

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:50:33 25 4
gpt4 key购买 nike

我需要使用 PHP 验证在 Windows 8 应用服务器端进行的应用内购买。 MSDN 的 documentation page仅在 C# 中有示例。现在我已经花了一整天的时间来寻找一种用 PHP 来完成它的方法。没有成功。在整个 Internet 上,只有关于此主题的 .NET 示例。

我发现了一些关于签名 XML 和 x509 的部分信息,一些库(xmlseclibs - 无用,使用不支持 sha256 的 openssl_* 函数;phpseclib - 看起来很有前途,但他们的文档和示例很差,没有帮助)。

是否可以在不学习有关签名 XML、RSA 和 x509 的所有知识的情况下以某种方式做到这一点?现在我已经阅读了几乎所有内容,但到处都是关于编码的信息。与验证无关。

最佳答案

我设法使用 xmlseclibs 验证了 WP8 IAP 收据图书馆。

此外,您需要启用 php curl。

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
}

关于php - 使用 PHP 验证 Windows 8 购买(收据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13672076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com