2016-12-24 13 views
6

को सत्यापित करने में सक्षम नहीं है, मैंने भुगतान प्राप्त करने के लिए कई वर्षों पहले पेपैल भुगतान मानक जोड़े को एकीकृत किया है।पेपैल भुगतान मानक रिटर्न मोबाइल उपकरणों से POST के बजाय GET प्राप्त करते हैं, इसलिए

मेरा आवेदन Asp.Net में है। यह वर्तमान में सैंडबॉक्स मोड में है।

मेरे पास मेरी वेबसाइट में पेबैल साइट पर सभी आवश्यक पैरामीटर के साथ पेपैल साइट पर एक पे नाउ बटन है। जब उपयोगकर्ता बटन पर क्लिक करता है तो यह पेपैल पर रीडायरेक्ट करता है, तो उसका उपयोगकर्ता अपने खाते या डेबिट/क्रेडिट कार्ड के माध्यम से भुगतान कर सकता है। और सफल लेनदेन उपयोगकर्ता को मेरे आवेदन पर वापस भेज दिया जाता है। जब उपयोगकर्ता मेरे आवेदन पर वापस आता है तो मुझे Request.Form संग्रह में "payment_status" जैसे विभिन्न पैरामीटर मिल रहे हैं। मैं प्रतिक्रिया को मान्य करता हूं और तदनुसार सफलता/विफलता संदेश दिखाता हूं।

जब उपयोगकर्ता डेस्कटॉप में ब्राउज़र पर होता है तो ऊपर प्रवाह ठीक काम कर रहा है।

लेकिन जब उपयोगकर्ता मोबाइल उपकरणों में है और मोबाइल ब्राउज़र के साथ काम कर रहा है। उपयोगकर्ता पेपैल मोबाइल अनुकूल पेज पर उतरा है। वहां उपयोगकर्ता अपने खाते के साथ भुगतान करता है। फिर सफलता संदेश दिखाया गया है। लेकिन जब उपयोगकर्ता को मेरे एप्लिकेशन पर रीडायरेक्ट किया जाता है तो मुझे Request.Form संग्रह में कोई मान नहीं मिलता है। जिसके कारण मैं पेपैल से प्रतिक्रिया को सत्यापित करने में सक्षम नहीं हूं।

आगे मैंने सीखा है कि डेस्कटॉप ब्राउज़र पर पेपैल मेरी वेबसाइट पर POST विधि के माध्यम से प्रतिक्रिया देता है, इसलिए Request.Form में डेटा होता है।

जबकि मोबाइल ब्राउज़र के मामले में पेपैल जीईटी विधि के माध्यम से प्रतिक्रिया देता है, इसलिए Request.Form में कोई डेटा नहीं है।

क्यों पेपैल जीईटी के माध्यम से प्रतिक्रिया देता है? ऐसे मामले में डेटा क्वेरीस्ट्रिंग में भी उपलब्ध नहीं है, तो मैं प्रतिक्रिया कैसे सत्यापित कर सकता हूं, भुगतान सफल है या नहीं?

मैंने दस्तावेज़ पढ़ा है और यह कहता है कि मोबाइल पेपैल भुगतान मानक के लिए अन्य विशिष्ट सेटिंग नहीं हैं।

मैं चेकआउट या किसी अन्य कॉन्फ़िगरेशन को व्यक्त करने के लिए माइग्रेट नहीं करना चाहता हूं।

इसके अलावा मैंने एसओ पर कई धागे खोजे हैं और मुझे कोई उचित समाधान नहीं मिला है जो मेरी ज़रूरत को पूरा करता है इसलिए एक नया प्रश्न पूछता है।

+0

paypal IPN इस्तेमाल करने की कोशिश –

उत्तर

2

मैं अपने वेबएपीआई Asp.NET परियोजना में पेपैल के लिए इस तरह से किया है .. यह आपकी मदद उम्मीद:

[AllowAnonymous] 
     [HttpPost] 
     [Route("api/PayPal/IPN")] 
     [ResponseType(typeof(OrderPayPalDTO))] 
     public async Task<IHttpActionResult> PayPalIPN() 
     { 
      try 
      { 
       decimal tot; 

       var data = this.Request.Content.ReadAsStringAsync().Result; 
       if (data == null) return BadRequest(); 

       // Parse the query string variables into a NameValueCollection. 
       NameValueCollection qscoll = HttpUtility.ParseQueryString(data); 
       PayPalViewModel payPalModel = new PayPalViewModel(); 

       var payPal = payPalModel.ToPayPalVM(qscoll); //HRE IS A EXTENSION METHOD TO MAP to a CLASS 

       if (payPal == null) return InternalServerError(new Exception()); 

       //Try cast total from paypal 
       if (!decimal.TryParse(payPal.mc_gross, out tot)) return InternalServerError(new Exception(Constant.Error.PAYMENT_ERROR_TOTAL_CAST)); 




       // If status is Ok /or Completed 
       if (payPal.payment_status.Equals(Constant.PaymentStatus.PAYED) || payPal.payment_status.Equals(Constant.PaymentStatus.COMPLETED)) 
       { 
        // update payment 
        bool ok = await this.UpdatePayment(order, user); 
        if (!ok) return InternalServerError(new Exception(Constant.Error.PAYMENT_ERROR_UPDATE)); 
       } 

       return Ok(order); 
      } 
      catch (Exception ex) 
      { 
       _logger.LogException(ex); 
       return (Constant.CONFIGURATION_GLOBALS.IS_DEVELOPMENT_MODE) 
        ? InternalServerError(ex) 
        : InternalServerError(new Exception(Constant.Error.ERROR_GENERIC_500)); 
      } 
     } 

और मेरे नक्शाकार और वर्ग PayPalViewModel

public class PayPalViewModel 
    { 
     public string mc_gross { get; set; } 
     public string custom { get; set; } 
     public string payment_status { get; set; } 

     public string payment_type { get; set; } 
     public string mc_currency { get; set; } 

     public string payer_id { get; set; } 
     public DateTime payment_date { get; set; } 
     public string payment_gross { get; set; } 

     /// <summary> 
     /// ToPayPalVM From NameValueCollection 
     /// </summary> 
     /// <returns></returns> 
     public PayPalViewModel ToPayPalVM(NameValueCollection qscoll) 
     { 
      if (qscoll == null) return null; 
      DateTime date = DateTime.Now; 
      string mcGross = qscoll["mc_gross"]; 
      string paymentType = qscoll["payment_type"]; 
      string mcCurrency = qscoll["mc_currency"]; 
      string paymentStatus = qscoll["payment_status"]; 
      string payerId = qscoll["payer_id"]; 
      string paymentDate = qscoll["payment_date"]; 
      string paymentGross = qscoll["payment_gross"]; 
      string cust = qscoll["custom"]; 

      var datePay = DateTime.TryParse(paymentDate, out date); 

      return new PayPalViewModel 
      { 
       mc_gross = mcGross, 
       custom = cust, 
       payment_status = paymentStatus, 
       payment_type = paymentType, 
       mc_currency = mcCurrency, 
       payer_id = payerId, 
       payment_gross = paymentGross, 
       payment_date = (datePay) ? date : DateTime.Now 
      }; 
     } 
    } 
+0

हाय क्या आपने मोबाइल ब्राउज़र से सर्फ करते समय इस कोड को चेक किया है? क्योंकि जब मोबाइल ब्राउज़र पर पेपैल पोस्ट के बजाय जीईटी करता है। मुझे आश्चर्य है कि यह एपीआई विधि कैसे आती है PayPalIPN() GET में हिट हो जाती है। कृपया मुझे बताएं कि जब पेपैल आपकी साइट पर भुगतान करने के बाद आपके आवेदन पर रीडायरेक्ट करता है, तो किस फॉर्म में आपको जीईटी या पोस्ट के रूप में प्रतिक्रिया मिल रही है? –

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