2014-04-30 3 views
5

के साथ एक ही ऑर्डरिड हमें ट्रिगर.io के भुगतान मॉड्यूल में एक अजीब समस्या का सामना करना पड़ा है। प्रवाह आईओएस भुगतान के साथ पूरी तरह से काम करता है लेकिन एंड्रॉइड में, कुछ इन-ऐप भुगतान कॉलबैक को एक ही सेकंड में दो बार बुलाया जाता है। रसीद हस्ताक्षर अलग हैं लेकिन ऑर्डरिड, अधिसूचना, खरीदार और डेवलपर सभी लोड रहें। जब हम रसीद को सत्यापित करने का प्रयास करते हैं तो यह सत्य और सही साबित होता है। लेकिन जब हम वित्तीय रिपोर्ट देखते हैं, तो हम केवल दो के बजाय एक भुगतान देखते हैं (क्योंकि शायद यह सिर्फ एक भुगतान है लेकिन अलग-अलग हस्ताक्षर क्यों?)।Trigger.IO इन-ऐप भुगतान डुप्लिकेट कॉलबैक अलग हस्ताक्षर

ट्रिगर.ओओ कॉलबैक को दो बार क्यों बुला रहा है जो उत्पाद को दो बार खरीदा जाता है? एंड्रॉइड एक भुगतान के लिए 2 अलग और पुष्टि योग्य रसीद क्यों लौट रहा है? क्या यह एंड्रॉइड साइड या ट्रिगर.ओ साइड पर एक बग है, क्योंकि मेरे पास javascipt का उपयोग करके कॉलबैक को कॉल करने का कोई तरीका नहीं है? या यह एक ज्ञात हैक प्रयास है?

हमें ऐसे मामले का भी सामना करना पड़ा जहां कोई कॉलबैक नहीं कहा गया था, जबकि क्रेडिट कार्ड को सफलतापूर्वक चार्ज किया गया था। क्या यह एक बग है या इस मामले के लिए कोई कामकाज है?

if(forge.is.android()) 
forge.payments.purchaseProduct("someproductname", paymentSuccess, paymentError); 

और यहाँ कॉलबैक फ़ंक्शन है:

function paymentCallback(data, confirm){ 

    forge.request.ajax({ 
     url: "someurl.php", 
     dataType: "json", 
     data:"function=logPayment&action=PaymentCallbackStart", 
     success: function (data) { 
      hideLoader(); 
     }, 
     error: function (error) { 
      hideLoader(); 
     } 
    }); 

    var productId = data.productId; 
    var orderId = data.orderId; 
    var signed_data; 

    if(forge.is.android()) 
    { 
     var state = data.purchaseState; 
     var receipt = encodeURIComponent(data.receipt.signature); 
     signed_data = encodeURIComponent(data.receipt.data); 
    } 
    else if(forge.is.ios()) 
    { 
     var state = data.PurchaseState; 
     var receipt = data.receipt.data; 
    } 

    forge.request.ajax({ 
     url: "someurl.php", 
     dataType: "json", 
     data:"function=logPayment&data=" + encodeURIComponent("birthday=" + gbirthday + "&birthhour=" + gbirthhour + "&name=" + gname + "&gender=" + ggender + "&birthday2=" + gbirthday2 + "&birthhour2=" + gbirthhour2 + "&name2=" + gname2 + "&gender2=" + ggender2 + "&content=" + text + "&ProductID=" + qs.ProductID + "&userId=" + guserId + "&data=" + JSON.stringify(data)) + "&action=PaymentCallback", 
     success: function (data) { 
      hideLoader(); 
     }, 
     error: function (error) { 
      hideLoader(); 

     } 
    });  

    if(state == "PURCHASED") 
    { 
     if(typeof gbirthday != "undefined") 
     { 
      var text = $('#imessagem').val(); 
      forge.request.ajax({ 
       url: "someurl.php", 
       dataType: "json", 
       data:"function=askQuestion&birthday=" + encodeURIComponent(gbirthday) + "&birthhour=" + encodeURIComponent(gbirthhour) + "&name=" + encodeURIComponent(gname) + "&gender=" + ggender + "&birthday2=" + encodeURIComponent(gbirthday2) + "&birthhour2=" + encodeURIComponent(gbirthhour2) + "&name2=" + encodeURIComponent(gname2) + "&gender2=" + ggender2 + "&content=" + encodeURIComponent(text) + "&ProductID=" + qs.ProductID + "&userId=" + guserId + "&signed_data=" + signed_data + "&receipt=" + receipt, 
       success: function (data) { 
        processPayment(productId,orderId) 
        hideLoader(); 
       }, 
       error: function (error) { 
        hideLoader(); 

        forge.request.ajax({ 
         url: "someurl.php", 
         dataType: "json", 
         data:"function=logPayment&data=" + encodeURIComponent(JSON.stringify(error)) + "&action=PaymentQuestionError", 
         success: function (data) { 
          hideLoader(); 
         }, 
         error: function (error) { 
          hideLoader(); 

         } 
        });      

       } 
      }); 

      forge.request.ajax({ 
       url: "someurl.php", 
       dataType: "json", 
       data:"function=logPayment&data=" + encodeURIComponent(JSON.stringify(data)) + "&action=Payment", 
       success: function (data) { 
        hideLoader();     }, 
       error: function (error) { 
        hideLoader(); 

       } 
      });    
     } 
     if(forge.is.android()) 
     processPayment(productId,orderId); 
    } 
    else 
    { 
     if(forge.is.ios()) 
     processPayment(productId,orderId); 
    } 
    confirm(); 
} 

उत्तर

1

यह एक पुनरावृत्ति हमले कहा जाता है

यहाँ कोड मैं एक खरीद की शुरुआत कर रहा हूँ है। आम तौर पर यदि आप भुगतान प्राप्त करते हैं तो आप अपने डेटाबेस को अपडेट करेंगे (कॉलबैक, उदाहरण के लिए पेपैल के लिए आईपीएन)। यदि वे बार-बार वही आदेश कहते हैं तो हमला विफल हो जाएगा क्योंकि स्थिति पहले ही सत्य पर सेट हो चुकी है।

पहले के दिनों में यह एक आम हमला था।

पढ़ें निम्नलिखित लेख:

संपादित करें: मैं तुम्हें कॉलबैक के बाद अपने डेटाबेस में एक डालने कर लगता है? कॉलबैक से पहले ऑर्डर डालना बेहतर है (वास्तविक चेकआउट से पहले) और अपनी तालिका में एक स्टेटस फ़ील्ड बनाएं जो गलत पर सेट हो। जब कॉलबैक सफल हो जाता है तो आपको स्थिति अपडेट करनी होगी और इसे सही पर सेट करना होगा।

ईजी। मैं एक पिज्जा ऑर्डर करना चाहता हूं (मालिक सिस्टम में अपना ऑर्डर देता है)। मेरी रसीद मेरा भुगतान का सबूत है (कॉलबैक)। जब पिज्जा तैयार होता है तो मैं इसे खाता हूं लेकिन मुझे अभी भी भूख लगी है। मैं पिज्जाबॉय में वापस जाता हूं और मैं एक नया पूछता हूं (मैं इसे एक हजार बार दोहरा सकता हूं)। एक साधारण समाधान मेरी रसीद को नष्ट करना होगा या उस पर हस्ताक्षर डालना होगा (अद्यतन स्थिति) और मैं फिर से एक ही पिज्जा को ऑर्डर करने में सक्षम नहीं होगा।

संपादित करें संपादित करें: जब आप पेपैल को चार्जबैक 'हमले' (http://forums.whirlpool.net.au/archive/2214159) से अवगत रहें।

13/05/2014: इस समय मुझे केवल एक ही चीज़ यह है कि आपका AJAX data property गलत स्वरूपित है। यह एक स्ट्रिंग नहीं बल्कि एक वस्तु है। शायद असली समस्या नहीं है। यदि आपको हमेशा कॉलबैक नहीं मिलता है और आप सुनिश्चित हैं कि आपका अनुरोध Google सर्वर को हिट करता है तो मुझे लगता है कि यह उनकी तरफ (या Trigger.IO) पर एक समस्या है। मैं आपको यह सुनिश्चित करने के लिए ट्रिगर.आईओ से संपर्क करने की सलाह दूंगा कि आपका अनुरोध वास्तव में उनके सर्वर को हिट करता है। यदि ऐसा होता है, तो आप इस समस्या के बारे में Google से संपर्क कर सकते हैं और देख सकते हैं कि वे आपके सभी अनुरोध प्राप्त करते हैं या नहीं।

forge.request.ajax({ 
    url: "someurl.php", 
    dataType: "json", 
    data:{ 
     function(watchOut!! 'function' is a reserved keyword!!) : 'logPayment', 
     action : 'PaymentCallbackStart' 
    }, 
    success: function (data) { 
     hideLoader(); 
    }, 
    error: function (error) { 
     hideLoader(); 
    } 
}); 
+0

मैं भुगतान से पहले एक सम्मिलित कर रहा हूं और हस्ताक्षर और आदेश आईडी के साथ इसे सत्य में सेट कर रहा हूं। समस्या एक ही खरीद अनुरोध के एकाधिक जमा नहीं है, लेकिन कॉलबैक की कई दीक्षा। मैंने इस मुद्दे में कुछ और खोला है और पता चला है कि एंड्रॉइड कॉलबैक भेज रहा है, यह दूसरी खरीद से पहले कुछ खरीद (कनेक्शन समस्याएं, ऐप क्रैश इत्यादि) के लिए नहीं था, नई खरीद के कॉलबैक के साथ। इसलिए गायब ऑर्डर एकाधिक कॉलबैक दीक्षा के साथ दिखाई देते हैं। –

+0

यहां Google पर संबंधित समस्या है: https://code.google.com/p/marketbilling/issues/detail?id=14&colspec=ID%20Type%20Status%20Google%20Priority%20Milestone%20Owner%20 सारांश इसलिए प्रश्न है: क्या इस समस्या के लिए एक ज्ञात कामकाज है? चूंकि मैं खरीद से मेल नहीं खा सकता (हम कुछ प्रश्न पूछते हैं और उन्हें खरीद अनुरोध के साथ भेजते हैं) अगर इसे बाद में भेजा जाता है, तो मुझे इस मुद्दे को ठीक करने के लिए क्या करना चाहिए? –

+0

क्या आप कुछ कोड प्रदान कर सकते हैं जहां आप कॉल और कॉलबैक फ़ंक्शन बनाते हैं? – GuyT

संबंधित मुद्दे