Bir sisteme weepay sanal pos kodlarken woocommerce eklentilerinden kopya çekeyim dedim entegrasyon açıklamaları yeterli gelmeyince ama şunu fark ettim.
Callback kısmında hash kontrolü yok weepayde, ödemeyi onların tarafında oluşturulan id ile doğruluyoruz. Woocommerce kodlarında paymentId yi post ile çekip doğrulamışlar ama orderId yi de hiç doğrulamadan post içinden alıp eğer ödeme gerçekleştiyse başarılı yapıyorlar.
yani şu şekilde şöyle bir açık oluşabilir diye düşündüm. 200 tllik ürün aldım ve callback kısmında post içinde ki değerleri kopyaladım sadece orderId yi 5000 liralık siparişimin idsi olarak değiştirdim postu tekrar gönderdim o üründe ben ödeme yapmadan tamamlanmış olacak.
çünkü arkaplanda sadece paymentId yi kontrol ederek ödenmiş mi diye kontrol ediyor, o paymentId de ki orderId yi çekmiyor veya karşılaştırmıyor.
hash tarzı bir kontrol olmadığı için order id değişseydi hash uyuşmayacaktı.
GetOrderData fonksiyonuna paymentId yanına birde orderId eklenerek apiye istek gönderse düzelir sanırım ya da kodlar içinde apiden gelen order id ile işlemlere devam etse.
eğer ben gözümden bir yer kaçırdıysam ya da açık yoksa konuyu sileceğim
https://weepay.co/Entegrasyon/HazirM...merce#moduller
eklentiyi buradan indirdim tam kontrol etmek isteyen olursa
kod
public function check_weepay_response()
{
global $woocommerce;
try {
$paymentStatus = wc_clean($_POST['paymentStatus']);
if ($paymentStatus == true) {
$orderId = wc_clean($_POST['orderId']);
$order = new WC_Order($orderId);
$paymentId = wc_clean($_POST['paymentId']);
$Result = $this->GetOrderData($paymentId);
$installment = $Result->data->installement;
if ($Result->paymentStatus == 'SUCCESS') {
if ($installment > 1) {
$order_amount = $order->get_total();
$order_amount = round($order_amount, 2);
$installment_fee = $Result->data->price - $order_amount;
$order_fee = new stdClass();
$order_fee->id = 'Installment Fee';
$order_fee->name = __('Installment Fee', 'weepay-payment');
$order_fee->amount = $installment_fee;
$order_fee->taxable = false;
$order_fee->tax = 0;
$order_fee->tax_data = array();
$order_fee->tax_class = '';
$fee_id = $order->add_fee($order_fee);
$order->calculate_totals(true);
update_post_meta($order_id, 'weepay_installment_number', esc_sql($installment));
update_post_meta($order_id, 'weepay_installment_fee', $installment_fee);
}
$orderMessage = 'Payment ID: ' . $paymentId;
$order->add_order_note($orderMessage, 0, true);
$order->payment_complete();
WC()->cart->empty_cart();
$woocommerce->cart->empty_cart();
$checkoutOrderUrl = $order->get_checkout_order_received_url();
$redirectUrl = add_query_arg(array('msg' => 'Thank You', 'type' => 'woocommerce-message'), $checkoutOrderUrl);
return wp_redirect($redirectUrl);
} else {
$errorMessage = 'FAILURE';
throw new \Exception($errorMessage);
}
} else if (isset($_POST['message'])) {
$message = sanitize_text_field($_POST['message']);
$errorMessage = isset($message) ? $requestResponse->errorMessage : 'Failed';
throw new \Exception($errorMessage);
}
} catch (\Exception $th) {
$message = $th->getMessage();
$message = sanitize_text_field($_POST['message']);
$message = !empty($message) ? $message : "Invalid Request";
$order = new WC_Order($_POST['orderId']);
$order->update_status('failed', sprintf(__('weepay payment failed', 'weepay-payment'), $message));
$order->add_order_note($message, 0, true);
wc_add_notice(__($message, 'weepay-payment'), 'error');
$redirectUrl = $woocommerce->cart->get_cart_url();
return wp_redirect($redirectUrl);
}
}
function GetOrderData($id_order)
{
$weepayArray = array();
$weepayArray['Auth'] = array(
'bayiId' => $this->weepay_payment_bayi_id,
'apiKey' => $this->weepay_payment_bayi_api,
'secretKey' => $this->weepay_payment_bayi_secret,
);
$weepayArray['Data'] = array(
'paymentId' => $id_order,
);
$weepayEndPoint = "https://api.weepay.co/GetPayment/Detail";
return json_decode($this->curlPostExt(json_encode($weepayArray), $weepayEndPoint, true));
}