हम लारवेल और पुनरावृत्ति का उपयोग करके एक साइट बनाते हैं। भाग २

शुभ दोपहर, हब्र! पहले भाग का अध्ययन करने के बाद, मैंने दूसरे की तलाश शुरू की, लेकिन यह वहां नहीं था, इसलिए मैंने खुद ही अनुवाद लिखने का फैसला किया। तो चलिए शुरू करते हैं।



परिचय


इस श्रृंखला के पहले भाग में, हमने लारवेल पर आधारित सदस्यता वाली साइट की नंगे रीढ़ बनाई। हमने भूमिकाओं के साथ एक साइट भी बनाई और पंजीकृत उपयोगकर्ताओं के लिए भूमिकाओं का वितरण बनाया। अब हम उस बिंदु पर आ गए हैं जहां हम पंजीकरण, प्राधिकरण और निकास को बना और निष्पादित कर सकते हैं।

इस भाग में, हम अपने भुगतान किए गए सदस्यता योजनाओं को अनुकूलित करने के लिए Recurly को एकीकृत करेंगे।



काम पर लगना



दो पुनरावर्ती पुस्तकालय हैं - PHP क्लाइंट लाइब्रेरी जिसे हमने पहले संगीतकार (पहले भाग में) और पुन: आरएस जेएस का उपयोग करके स्थापित किया था। Recurly JS गतिशील रूप से एकीकरण के लिए एक क्लाइंट लाइब्रेरी है जो मानचित्रों से जानकारी को सुरक्षित रूप से संसाधित करता है।

मानचित्र की जानकारी को हमारे वेब एप्लिकेशन में नहीं, बल्कि हमारे सर्वर में होस्ट किया जाता है, जो हमारे सिरदर्द को कम करता है।



Recurly JS लाइब्रेरी डाउनलोड करें और बिल्ड फ़ोल्डर से पब्लिक / js / libs फ़ोल्डर में recurly.min.js कॉपी करें और समापन टैग से पहले इसे लेआउट में जोड़ें:

<script src="/js/libs/recurly.min.js"></script> </body>
      
      





हमें सीएसएस शैलियों का उपयोग भी करना चाहिए जो भुगतान फ़ॉर्म प्रदर्शित करने के लिए उपयोग किए जाते हैं। Css / recurly डायरेक्टरी में डायरेक्टरी बनाएं और थीम डायरेक्टरी को उसमें कॉपी करें, और फिर हम इसे अपने लेआउट के संबंधित सेक्शन में रेफर करेंगे।

 <link href="/css/recurly/themes/default/recurly.css" rel="stylesheet">
      
      





जब आप Recurly के साथ खाता बनाने के बाद पहली बार लॉग इन करते हैं, तो आपको अपनी सदस्यता योजनाएं बनाने के लिए कहा जाएगा। पहले भाग में, हमने सदस्यता के तीन अलग-अलग स्तर बनाए - कांस्य, रजत और स्वर्ण। आप हमेशा उन्हें बदल सकते हैं या नए जोड़ सकते हैं, लेकिन इस तथ्य में कोई बुराई नहीं है कि हम इसे अभी करेंगे।



कांस्य नामक एक योजना बनाएं; सावधान रहें कि कोड योजना "कांस्य" (लोअरकेस) पर सेट है। मूल्य निर्धारित करें - मैंने प्रति माह £ 4.99 लिखा था, लेकिन आप अपनी पसंद की कोई भी राशि और / या समय सीमा चुन सकते हैं। यदि आवश्यक हो, तो आप एक बार शुल्क या नि: शुल्क परीक्षण अवधि स्थापित कर सकते हैं।



सिल्वर (कोड: "सिल्वर") और गोल्ड (कोड: "गोल्ड") प्लान सेट करने के लिए प्रक्रिया को दो बार दोहराएं। मैंने प्रति माह न्यूनतम £ 9.99 और £ 14.99 प्रति माह निर्धारित किया है।



अब Recurly व्यवस्थापक पैनल पर जाएं, जहां कई चीजें हैं जिन्हें हमें कॉन्फ़िगर करने की आवश्यकता है, साथ ही साथ अपने एप्लिकेशन को कॉन्फ़िगर करने के लिए आवश्यक जानकारी भी ढूंढें। बाईं ओर एपीआई एक्सेस पर क्लिक करें। API एक्सेस सक्षम करें पर क्लिक करें। अपनी API कुंजी, और अपना उप डोमेन लिखें।



अब बाईं ओर Recurly.js पर जाएं (डेवलपर के तहत)। Recurly.js और पारदर्शी पोस्ट API सक्षम करें पर क्लिक करें। अपनी गुप्त कुंजी लिखें।



अब ऐप / कॉन्फिगर / recurly.php फोल्डर में Recurly कॉन्फिगरेशन फ़ाइल बनाएँ , जो आपने अभी-अभी लिखे तीन अंकों के कोड के साथ उन मानों की जगह ले जो आपकी पसंद की डिफ़ॉल्ट मुद्रा प्रदर्शित करता है (उदाहरण के लिए, USD, GBP, AUD):

 <?php return array( 'api_key' => 'YOUR-API-KEY', 'private_key' => 'YOUR-PRIVATE-KEY', 'subdomain' => 'YOUR-SUBDOMAIN', 'default_currency' => 'XYZ' );
      
      





अब बाईं ओर पॉप-अप नोटिफिकेशन पर चलते हैं। कॉन्फ़िगर बटन पर क्लिक करें। उदाहरण के लिए, www.example.com/recurly सहित अपने एप्लिकेशन का URL दर्ज करें / पुनरावृत्ति करें । HTTP प्राधिकरण उपयोगकर्ता नाम और HTTP पासवर्ड प्राधिकरण क्षेत्रों को अभी के लिए खाली छोड़ दें।



पंजीकरण पृष्ठ



अब, एक पंजीकरण पृष्ठ बनाते हैं जो संभावित ग्राहकों को अपने लिए एक योजना चुनने की अनुमति देगा। इस पथ एप्लिकेशन के साथ साइनअप.ब्लेड . php फ़ाइल बनाएं / निम्न सामग्री के साथ घर / दृश्य :

 @extends('layouts.default') @section('content') <h1>Signup</h1> <p>Please select your plan...</p> <div class="row-fluid pricing-table pricing-three-column"> <div class="span4 plan"> <div class="plan-name-bronze"> <h2>Bronze</h2> <span>£4.99 / Month</span> </div> <ul> <li class="plan-feature">Feature #1</li> <li class="plan-feature">Feature #2</li> <li class="plan-feature"><a href="/user/register/bronze" class="btn btn-primary btn-plan-select"><i class="icon-white icon-ok"></i> Select</a></li> </ul> </div> <div class="span4 plan"> <div class="plan-name-silver"> <h2>Silver <span class="badge badge-warning">Popular</span></h2> <span>£9.99 / Month</span> </div> <ul> <li class="plan-feature">Feature #1</li> <li class="plan-feature">Feature #2</li> <li class="plan-feature"><a href="/user/register/silver" class="btn btn-primary btn-plan-select"><i class="icon-white icon-ok"></i> Select</a></li> </ul> </div> <div class="span4 plan"> <div class="plan-name-gold"> <h2>Gold</h2> <span>£4.99 / Month</span> </div> <ul> <li class="plan-feature">Feature #1</li> <li class="plan-feature">Feature #2</li> <li class="plan-feature"><a href="/user/register/gold" class="btn btn-primary btn-plan-select"><i class="icon-white icon-ok"></i> Select</a></li> </ul> </div> </div> @stop
      
      





बेशक, यदि आप समय पर मूल्य अपडेट सुनिश्चित करना चाहते हैं, तो आपको Recurly API का उपयोग करने और इस डेटा को टेम्पलेट में स्वचालित रूप से भरने की आवश्यकता है।

अब निम्नलिखित पंक्तियों को css / style.css में जोड़ें:

 .pricing-table .plan { background-color: #f3f3f3; text-align: center; } .plan:hover { background-color: #fff; } .plan { color: #fff; background-color: #5e5f59; padding: 20px; } .plan-name-bronze { background-color: #665D1E; color: #fff; padding: 20px; } .plan-name-silver { background-color: #C0C0C0; color: #fff; padding: 20px; } .plan-name-gold { background-color: #FFD700; color: #fff; padding: 20px; } .pricing-table-bronze { background-color: #f89406; color: #fff; padding: 20px; } .pricing-table .plan .plan-name span { font-size: 20px; } .pricing-table .plan ul { list-style: none; margin: 0; } .pricing-table .plan ul li.plan-feature { border-top: 1px solid #c5c8c0; padding: 15px 10px; } .pricing-three-column { margin: 0 auto; width: 80%; } .pricing-variable-height .plan { display: inline-block; float: none; margin-left: 2%; vertical-align: bottom; zoom:1; *display:inline; } .plan-mouseover .plan-name { background-color: #4e9a06 !important; } .btn-plan-select { font-size: 18px; padding: 8px 25px; }
      
      





अंत में, एप्लिकेशन / मार्गों में एक मार्ग बनाएं

 Route::get('/signup', function() { return View::make('home/signup'); });
      
      







भुगतान स्वीकार करें





इसलिए हमें भुगतान स्वीकृति बिंदु, अर्थात् पंजीकरण पृष्ठ - भुगतान मिला।

सबसे पहले, उपयोगकर्ता को बदल दें या कॉलबैक के POST को पंजीकृत करें । होम पेज पर रीडायरेक्ट करने के बजाय, हम उपयोगकर्ता को भुगतान पृष्ठ पर ले जाएंगे। इन पंक्तियों को बदलें:

 return Redirect::to('/')->with( 'success', 'Welcome to the site, . Auth::user()->name . '!' );
      
      





इन्हें:

 Session::put('register_user', $user); return Redirect::to('/user/register/payment');
      
      





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

 @yield('scripts')
      
      





अब एक नया मार्ग बनाएँ:

 Route::get('/user/register/payment', function() { Recurly_js::$privateKey = Config::get('recurly.private_key'); $plan = 'bronze'; // todo: get this from vars $user = Session::get('register_user'); $signature = Recurly_js::sign(array( 'account' => array( 'account_code' => 'user_' . $user->id ), 'subscription' => array( 'plan_code' => $plan, 'currency' => Config::get('recurly.default_currency') ) )); return View::make('user/register')->with(array( 'plan' => $plan, 'subdomain' => Config::get('recurly.subdomain'), 'currency' => Config::get('recurly.default_currency'), 'signature' => $signature )); });
      
      





इस कोड पर कुछ नोट:



भुगतान पृष्ठ में दो भाग होते हैं, पहला भाग साधारण HTML है:

 @extends('layouts.default') @section('content') <div id="recurly-subscribe"> </div> @stop
      
      





Recurly.js अपने ग्राहक-जनित भुगतान फ़ॉर्म कोड को इस div में इंजेक्ट करता है।



अगला, हम जावास्क्रिप्ट को उस अनुभाग में जोड़ेंगे जो लेआउट टेम्पलेट के नीचे आउटपुट प्राप्त करता है:

 @section('scripts') <script> Recurly.config({ subdomain: '{{ $subdomain }}', currency: '{{ $currency }}' }); Recurly.buildSubscriptionForm({ target: '#recurly-subscribe', // Signature must be generated server-side with a utility // method provided in client libraries. signature: '{{ $signature }}', successURL: '/user/register/confirm', planCode: '{{ $plan }}', distinguishContactFromBillingInfo: true, collectCompany: false, termsOfServiceURL: 'http://www.example.com/terms', acceptPaypal: true, acceptedCards: ['mastercard', 'discover', 'american_express', 'visa'], account: { firstName: 'Joe', lastName: 'User', email: 'test@example.net', phone: '555-555-5555' }, billingInfo: { firstName: 'Joe', lastName: 'User', address1: '123 somestreet', address2: '45', city: 'San Francisco', zip: '94107', state: 'CA', country: 'US', cardNumber: '4111-1111-1111-1111', CVV: '123' } }); </script> @stop
      
      





यहां जादू होता है - पुनर्भुगतान एक भुगतान फ़ॉर्म बनाता है और आईडी # रिकर्वली-सदस्यता के साथ एक डिव में प्रदर्शित करता है, जिसे जानकारी के एक टुकड़े की आवश्यकता होती है, हम उस फॉर्म में आए जिसे उत्पन्न हस्ताक्षर की आवश्यकता होती है।

फिर, कॉलबैक जो कि फॉर्म को सफलतापूर्वक सबमिट करने के बाद Recurly रिटर्न करता है, जिसे उत्तराधिकार में निम्नलिखित मापदंडों के साथ परिभाषित किया गया है:

 Route::post('/user/register/confirm', function() { $recurly_token = Input::get('recurly_token'); Recurly_js::$privateKey = Config::get('recurly.private_key'); $result = Recurly_js::fetch($recurly_token); var_dump($result); });
      
      





और फिर, हम कॉन्फ़िगरेशन से गुप्त कुंजी के साथ Recurly.js को इनिशियलाइज़ करते हैं, और इसका उपयोग टोकन द्वारा दर्शाई गई वस्तु को पुनः प्राप्त करने के लिए करते हैं जो Recurly POST वैरिएबल (recurly_token) के रूप में भेजता है। यह Recurly_Subscription का एक उदाहरण होगा, जिसमें से विभिन्न जानकारी निकाली जा सकती है। डेटा पर एक नज़र डालने के लिए मैं var_dump () का उपयोग करके यह अनुमान लगाता हूं।



आरंभ करने के लिए, आइए जानें कि उपयोगकर्ता ने क्या सदस्यता ली है:

 $plan_code = $result->plan->plan_code;
      
      





अब, आपको उपयुक्त भूमिका खोजने की आवश्यकता है, आप पर ध्यान दें - हमने उन्हें "कांस्य", "रजत" और "स्वर्ण" नाम दिए।

 $role = Role::where('name', '=', $plan_code)->first();
      
      





तब हमें सत्र से उपयोगकर्ता मिलता है (और फिर उसे सत्र से हटा दें):

 $user = Session::get('register_user'); Session::forget('register_user');
      
      





अगला, हम संबंधित नए उपयोगकर्ता के लिए एक भूमिका प्रदान करते हैं:

 $user->roles()->attach($role);
      
      





फिर, हमें स्थगित भूमिका को हटा देना चाहिए:

 $role_pending = $role_pending = Role::where('name', '=', 'pending')->first(); DB::table('role_user')->where('user_id', '=', $user->id)->where('role_id', '=', $role_pending->id)->delete();
      
      





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



खाता प्रबंधन पृष्ठ



आइए एक सरल पृष्ठ बनाएं जिससे उपयोगकर्ता अपने खाते का प्रबंधन कर सकते हैं।

जाहिर है, इसके लिए उपयोगकर्ता को लॉग इन करना होगा, इसलिए हमें एक प्रमाणीकरण फ़िल्टर लागू करना होगा।

प्रत्येक संरक्षित पृष्ठ के लिए इस फ़िल्टर को निर्दिष्ट करने के बजाय, हम सभी संबंधित मार्गों को एक समूह में रख सकते हैं, जैसे:

 Route::group(array('before' => 'auth'), function() { Route::get('/user/account', function() { // User must be logged in }); Route::get('user/account/billing', function() { // User must be logged in }); });
      
      





खाता पृष्ठ कॉल करना सरल है:

 Route::get('/user/account', function() { return View::make('user/account/index'); });
      
      





अब पता फॉर्म ऐप / विचारों / उपयोगकर्ता / खाता / index.blade.php का है :

 @extends('layouts.default') @section('content') <h1>Your Account</h1> <ul> <li><a href="/user/account/edit">Edit your account information</a></li> <li><a href="/user/account/plan">Update your subscription plan</a></li> <li><a href="/user/account/billing">Update your Billing information</a></li> </ul> @stop
      
      





चलो बिलिंग पृष्ठ को अपडेट करके शुरू करते हैं। बेशक, हम लोगों की भुगतान जानकारी को संग्रहीत नहीं करते हैं, क्योंकि भुगतान पृष्ठ पर, आपके वेब एप्लिकेशन के पास कुछ समय के बाद पुन: निवेश करने के लिए नई जानकारी की घोषणा (POSTing) करके, आपके लिए एक फॉर्म को बनाएगा और भर देगा।

 Route::get('user/account/billing', function() { Recurly_js::$privateKey = Config::get('recurly.private_key'); $account_code = 'user_' . Auth::user()->id; $signature = Recurly_js::sign( array('account' => array('account_code' => $account_code)) ); return View::make('user/account/billing')->with(array( 'subdomain' => Config::get('recurly.subdomain'), 'currency' => Config::get('recurly.default_currency'), 'account_code' => $account_code, 'signature' => $signature )); });
      
      





यह इस अर्थ में भुगतान पृष्ठ के समान है कि हम हस्ताक्षर (विभिन्न सूचनाओं का उपयोग करते हुए) और दृश्य में कई मापदंडों से गुजरते हुए Recurly.js पुस्तकालयों को आरंभ करते हैं।

पथ ऐप / विचार / उपयोगकर्ता / खाता / बिलिंग.ब्लेड.php

भुगतान पृष्ठ पर बहुत समान पैटर्न का अनुसरण करता है:

 @extends('layouts.default') @section('content') <div id="recurly-billing"> </div> @stop @section('scripts') <script> Recurly.config({ subdomain: '{{ $subdomain }}', currency: '{{ $currency }}' }); Recurly.buildBillingInfoUpdateForm({ target: '#recurly-billing', successURL: '/user/account/billing/confirm', accountCode: '{{ $account_code }}', signature: '{{ $signature }}' }); </script> @stop
      
      





अंत में, उपयोगकर्ता द्वारा भुगतान की जानकारी के लिए एक बहुत ही सरल कॉलबैक:

 Route::post('user/account/billing/confirm', function() { return Redirect::to('/user/account')->with('success', 'Your billing information has been updated.'); });
      
      





और यहाँ यह है! उपयोगकर्ता अपनी बिलिंग जानकारी अपडेट कर सकते हैं!

मैंने खाता संपादन लागू नहीं किया। यह काफी सरल है, और इसे अपने लिए एक अभ्यास बना रहने दें।



सूचनाएं पुश करें





Recurly API के लिए अनुरोध करने की क्षमताओं के अलावा, पिंग सेवा एक अधिसूचना है जिसमें एक घटना होती है।

इन सूचनाओं को मोबाइल विविधता के साथ भ्रमित नहीं होना चाहिए, हालांकि - वे पूरी तरह से अलग हैं।

अनिवार्य रूप से, सेवा URI को एक POST अनुरोध भेजती है, और अनुरोध निकाय के रूप में XML दस्तावेज़ भेजता है। आप आवश्यक जानकारी निकालने और तदनुसार कार्य करने के लिए Recurly पुस्तकालयों का उपयोग कर सकते हैं। इन सूचनाओं को विस्तार से पुनरावर्ती दस्तावेज में वर्णित किया गया है।



सूचना मिलने पर हमारे कॉलबैक फ़ंक्शन को परिभाषित करें:

 Route::post('recurly', function(){ $xml = file_get_contents ("php://input"); $notification = new Recurly_PushNotification($xml); switch ($notification->type) { // ... process notification } });
      
      





आप शायद समझ गए कि जैसे ही किसी ने साइन अप किया और सेवा के लिए भुगतान किया, वह अपरिभाषित ग्राहक बना हुआ है, और यह स्पष्ट नहीं है कि उनकी सदस्यता जारी है या नहीं। तो, सबसे अधिक ब्याज सदस्यता रद्द करने की सूचना है। हम निष्क्रिय सदस्यता को पहचानने और संबंधित भूमिकाओं को रद्द करने के लिए Recurly से एक अधिसूचना का उपयोग कर सकते हैं। उदाहरण के लिए:

 switch ($notification->type) { case 'canceled_subscription_notification': // get the account code $account_code = $notification->account->account_code; // extract the user ID (account_code format is user_ID) $user_id = intval(substr($account_code, (strpos($account_code, '_')+1))); // find the user in question $user = User::find($user_id); // get the plan code $plan_code = $notification->subscription->plan->plan_code; // find the corresponding role... $role = Role::where('name', '=', $plan_code)->first(); // ...and revoke it DB::table('role_user')->where('user_id', '=', $user->id)->where('role_id', '=', $role)->delete(); break; // ... process notification }
      
      







अधिसूचना के प्रकार के आधार पर आपके द्वारा किए जा सकने वाले कई अन्य काम हैं।

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



यह वह जगह है जहां मूल लेख समाप्त होता है। मेरे लेख को पढ़ने वाले सभी को धन्यवाद। कुछ जगहों पर, मुझे समझ नहीं आया कि लेखक क्या कहना चाहता है, आप इसे पढ़ते समय समझेंगे। यदि आप परिणाम में रुचि रखते हैं, तो मैं जीथब पर पोस्ट करूँगा जो मुझे मिला (अब, दुर्भाग्य से मैं इसे पोस्ट नहीं कर सकता - दूसरे भाग में अभ्यास समाप्त करने का समय नहीं है)। आपके समय के लिए धन्यवाद!



All Articles