PHP Güncel veriyi çeker, sizde farklı bir muhabbet var.
Uygulamada gösterilen fiyat ile PHP tarafında kaydedilen fiyatın aynı kaynaktan gelmesi gerekiyor. Fiyat bilgisini tek bir yerden (örnek veritabanı / db ) alıp hem uygulamada göstermeli hem de satın alım işleminde kullanmalısınız.
Android:
// Satın alma işlemi tamamlandığında çağrılacak fonksiyon
fun onPurchaseComplete(purchase: Purchase) {
val priceText = purchase.originalJson.getPriceText() // Kullanıcının gördüğü fiyat
val actualPrice = purchase.originalJson.getActualPrice() // Gerçek fiyat (örn: "4999000" mikro birim cinsinden)
val currency = purchase.originalJson.getCurrency() // Para birimi (örn: "TRY")
// Sunucuya gönderilecek isteği güncelleyin
@FormUrlEncoded
@POST("action/InAppBilling.php")
fun inAppBilling(
@Field("type") type: String,
@Field("orderId") orderId: String,
@Field("productId") productId: String,
@Field("priceText") priceText: String,
@Field("actualPrice") actualPrice: String,
@Field("currency") currency: String
): Call<Status_Model>
// İsteği gönderin
apiService.inAppBilling(
type = "purchase",
orderId = purchase.orderId,
productId = purchase.sku,
priceText = priceText,
actualPrice = actualPrice,
currency = currency
).enqueue(/* ... */)
}PHP:
private function addKredi(){
// Gelen fiyat bilgilerini al
$priceText = $_POST["priceText"];
$actualPrice = $_POST["actualPrice"];
$currency = $_POST["currency"];
// Ürün ID'sine göre beklenen fiyatı al
$expectedPrice = $this->getExpectedPrice($this->product["id"], $currency);
// Fiyat doğrulaması yap
if ($this->validatePrice($actualPrice, $expectedPrice)) {
// Fiyat doğruysa işleme devam et
$updateStatus = $this->db->updatePrePare("kullanicilar", "kredi=kredi+".$this->product["kredi"], "id=:id",
["id" => $this->userId]);
$this->statusModel->setKredi($this->product["kredi"]);
$this->statusModel->setStatus($updateStatus);
$this->db->addLog(
$this->userId,
$this->userEmail,
$this->product["id"],
"buy-kredi",
$this->product["kredi"],
$this->product["kredi"]." Kredi Satın Aldı (".$this->product["productId"].")",
$priceText." Ödeme yapıldı",
$updateStatus,
$actualPrice,
$currency
);
} else {
// Fiyat doğru değilse hata loglama veya işlemi reddetme
$this->logPriceError($this->product["id"], $expectedPrice, $actualPrice, $currency);
}
}
private function getExpectedPrice($productId, $currency) {
// Veritabanından veya başka bir kaynaktan beklenen fiyatı al
// Örnek: return $this->db->query("SELECT price FROM products WHERE id = ? AND currency = ?", [$productId, $currency])->fetchColumn();
}
private function validatePrice($actualPrice, $expectedPrice) {
// Fiyat doğrulama mantığı (örneğin, %1 tolerans ile)
$tolerance = 0.01; // %1 tolerans
$minAcceptable = $expectedPrice * (1 - $tolerance);
$maxAcceptable = $expectedPrice * (1 + $tolerance);
return ($actualPrice >= $minAcceptable && $actualPrice <= $maxAcceptable);
}
private function logPriceError($productId, $expectedPrice, $actualPrice, $currency) {
// Fiyat uyuşmazlığını logla
error_log("Price mismatch for product $productId: Expected $expectedPrice $currency, got $actualPrice $currency");
}Bu kodları deneyin bakalım sonuç ne olacak.