2015-01-14 12 views
7

पर सत्यापन मुझे सर्वर-साइड पर सेब रसीद को सत्यापित करने में कोई समस्या है। मैंने इंटरनेट में समाधान खोजने की कोशिश की, लेकिन सफल नहीं हुआ।ऐप्पल इन-ऐप खरीद रसीद - सर्वर-साइड

तो, विवरण: सबसे पहले, आईओएस 7 के लिए आवेदन किया गया है। दूसरा, मेरे पास कुछ आइटम हैं (प्रकार = गैर-नवीनीकरण सदस्यता)। तो उपयोगकर्ता एक या एकाधिक आइटम खरीद सकता है और फिर उसे मैन्युअल रूप से नवीनीकृत करना चाहिए (फिर से खरीदना)।

एप्लीकेशन सर्वर साइड करने के लिए एक रसीद भेजता है, मैं एप्पल के लिए एक अनुरोध बनाने के लिए और साथ in_app प्राप्तियों का एक बहुत परिणाम मिलता है। कुछ ऐसा:

"in_app":[ 
{ 
"quantity":"1", "product_id":"...", "transaction_id":"...", 
"original_transaction_id":"...", "purchase_date":"...", 
"purchase_date_ms":"...", "purchase_date_pst":"...", 
"original_purchase_date":"...", 
"original_purchase_date_ms":"...", "original_purchase_date_pst":"...", 
"is_trial_period":"..."}, 
{ 
"quantity":"1", "product_id":"...", 
"transaction_id":"...","original_transaction_id":"...", 
"purchase_date":"...", "purchase_date_ms":"...", 
"purchase_date_pst":"...", "original_purchase_date":"...", 
"original_purchase_date_ms":"...", "original_purchase_date_pst":"...", 
"is_trial_period":"..."} 
] 

तो, "in_app" में प्रत्येक "रसीद" में network_id है। लेकिन मैं वर्तमान खरीद के लेनदेन की पहचान कैसे कर सकता हूं? मैं इसे भी मान्य करना चाहता हूं और यह सुनिश्चित करना चाहता हूं कि यह अद्वितीय है।

मेरी चिंता यह है कि: अगर किसी को एक वैध रसीद मिलेगी, तो वह हमारे सर्वर-साइड एपीआई को हैक करने में सक्षम होगा और उसी वैध रसीद के साथ असीमित खरीदारी की असीमित संख्या बनायेगा।

क्या मुझे किसी भी तरह से "मूल" रसीद के लेन-देन के लिए डिक्रिप्ट और जांच करनी चाहिए, जिसे मैं सत्यापन के लिए ऐप्पल को भेजता हूं?

किसी भी मदद/सुझावों की अत्यधिक सराहना की जाएगी। अग्रिम धन्यवाद।

सादर, Maksim

+0

LOL मैं सिर्फ एक ही सवाल पूछने के लिए आदमी था .. मैं इस पाया और देखा कि आप इस पूछा 8 घंटे पहले ... यह सिर्फ sux, मैं एक सुराग भी क्या से कोई लेना देना नहीं है गलती उन सभी रसीदें ... – Adrian

+0

और मैं वही तरह की जांच करना चाहता हूं जो आप यहां करना चाहते थे। मुझे उम्मीद है कि कोई इसे देखता है और जवाब देता है! : \ – Adrian

+3

मुझे लगता है कि कुंजी * एप * पक्ष पर वर्तमान खरीद की लेनदेन आईडी प्राप्त करना है और उसे सर्वर तक रसीद के साथ भेजना है। आप लेनदेन ऑब्जेक्ट से ऐप पक्ष पर लेनदेन आईडी प्राप्त कर सकते हैं। –

उत्तर

0

@Doug स्मिथ

https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html

तो आप इस पेज पर विभिन्न क्षेत्रों के माध्यम से जाना है, तो आप पाएंगे

वास्तविक लेन-देन पहचानकर्ता :: एक लेनदेन के लिए जो पिछले लेनदेन को पुनर्स्थापित करता है, मूल लेनदेन के लेनदेन पहचानकर्ता। अन्यथा, लेनदेन पहचानकर्ता के समान। यह मान मूल लेनदेन के लेन-देन इंडेंटिफायर संपत्ति से मेल खाता है। ऑटो-नवीकरणीय सदस्यता के लिए नवीनीकरण की श्रृंखला में सभी रसीदों के पास इस फ़ील्ड के लिए समान मूल्य है।

  1. रसीद कि आप iTunes सर्वर के साथ सत्यापित कर रहें की वास्तविक लेन-देन पहचानकर्ता, सहयोगी:

तो अपने गैर ऑटो अक्षय सदस्यता के लिए, आप अपने सर्वर साइड पर दो बातें का ट्रैक रखने के लिए है यह आपके डेटाबेस में उपयोगकर्ता आईडी के साथ।

  • चाहे ग्राहक पक्ष से प्राप्त अनुरोध आपको खरीद या पुनर्स्थापना खरीद का है।
  • एक बार जब आप आप के साथ इन दो चीजों है, तो आप नीचे की तरह इन दोनों मानकों के आधार पर अपने तर्क लिख सकते हैं:

    :: एक अनुरोध प्रकार "खरीद" का है और आप पहले से ही वास्तविक लेन-देन पहचानकर्ता है किसी अन्य उपयोगकर्ता आईडी से जुड़ी उस रसीद के, आप उस खरीद को अवरुद्ध कर सकते हैं।

    :: यदि कोई अनुरोध "पुनर्स्थापना खरीद" प्रकार का है और अनुरोध उसी उपयोगकर्ता आईडी से आ रहा है जिसके विरुद्ध मूल लेनदेन पहचानकर्ता आपके डीबी में जुड़ा हुआ है, तो उसे अन्यथा उसकी बहाली को अवरुद्ध करने की अनुमति दें।

    इसके अलावा, आप अपनी आवश्यकताओं के अनुसार इन चीजों के आधार पर अपना तर्क प्राप्त कर सकते हैं।

    यदि आपको कोई और संदेह है तो मुझे बताएं।

    +0

    मेरा मुद्दा यह है कि 'ट्रांजैक्शन_आईडी' संपत्ति रसीद JSON में मूल से कभी अपडेट नहीं होती है। –

    +0

    लेकिन आप JSON में दो दो शब्दकोश प्राप्त करते हैं। एक लेनदेन के लिए मूल लेनदेन और अन्य एक के अनुरूप है जो आपने अभी किया है। –

    0

    प्रत्येक नए लेनदेन सेब के लिए एक नई रसीद जो अद्वितीय है, उसे एन्कोड करें ताकि कोई भी डेटा फोर्ज नहीं कर सके।

    पूरा लेनदेन एन्कोड से लेनदेन रसीद प्राप्त करें और इसे अपने सर्वर पर भेजें, और सर्वर की तरफ इसे डीकोड करें और एक सेब के साथ मेल करें सर्वर पर भेजें।

    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
    { 
        _transactionArray = transactions; 
        for (SKPaymentTransaction * transaction in transactions) 
        { 
         switch (transaction.transactionState) 
         { 
          case SKPaymentTransactionStatePurchased: { 
           NSData *receipt = transaction.transactionReceipt; 
           [self sendReceiptToServer]; 
          } break; 
    
          case SKPaymentTransactionStateFailed: { 
           // finish this transaction 
          } break; 
    
          case SKPaymentTransactionStateRestored: 
           NSData *receipt = transaction.transactionReceipt; 
           [self sendReceiptToServer:receipt]; 
          } break; 
    
          default: 
           break; 
         } 
        }; 
    } 
    
    
    -(void)sendReceiptToServer:(NSData *)receipt { 
        // encode receipt 
        // send receipt to server 
        // add success and error callback 
    } 
    
    -(void) receiptSuccess { 
        // finish transaction here 
    } 
    
    -(void) receiptError { 
        // try again sending receipt to server 
    } 
    
    +0

    इस कोड के साथ कुछ समस्याएं: 1) '- [एसकेपेमेंट ट्रांज़ेक्शन लेनदेन रसीद]' आईओएस 7 के बाद से हटा दिया गया है, इसके बजाय '[[NSBundle mainBundle] appStoreReceiptURL] 'का उपयोग किया जाना चाहिए। 2) लेनदेन को पूरा होने की स्थिति के बावजूद समाप्त किया जाना चाहिए, इस प्रकार '- [SKPaymentQueue finishTransaction:]' सभी मामलों में (डिफ़ॉल्ट मामले को छोड़कर) लागू किया जाना चाहिए। –

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