mirror of
https://bitbucket.org/vendoo/vendoo_v1.0.git
synced 2025-12-25 11:47:40 +00:00
419 lines
20 KiB
Swift
419 lines
20 KiB
Swift
//
|
||
// EbayWebServiceManager.swift
|
||
// Vendoo
|
||
//
|
||
// Created by Okechi Onyeje on 6/3/16.
|
||
// Copyright © 2016 Okechi Onyeje. All rights reserved.
|
||
//
|
||
|
||
import Foundation
|
||
import Locksmith
|
||
|
||
protocol EbayWebServiceManagerDelegate {
|
||
func signInUser(string: String!)
|
||
}
|
||
|
||
class EbayWebServiceManager: NSObject {
|
||
|
||
|
||
|
||
//API Manager class variables
|
||
//----------------------------------------------//
|
||
let baseURL = "https://api.sandbox.ebay.com/ws/api.dll"
|
||
|
||
private var apiKey: String!
|
||
private var devKey: String!
|
||
private var certID: String!
|
||
private var mutableData: NSMutableData = NSMutableData()
|
||
private var currentElementName:NSString = ""
|
||
private var catID: NSString!
|
||
private var userEmail:String = (NSUserDefaults.standardUserDefaults().objectForKey("email") as? String)!
|
||
private var signinURL: String!
|
||
private var xmlResponseDictionary: Dictionary<String, AnyObject!> = Dictionary<String, AnyObject!>()
|
||
var delegate: EbayWebServiceManagerDelegate?
|
||
var isAuthorized: Bool = NSUserDefaults.standardUserDefaults().boolForKey("ebayAuthorized")
|
||
static var settingsDictionary = Dictionary<String , AnyObject>()
|
||
private var completion: ServiceResponse!
|
||
//---------------------------------------------//
|
||
|
||
|
||
override init(){
|
||
super.init()
|
||
if let path = NSBundle.mainBundle().pathForResource("Services", ofType: "plist"), dict = NSDictionary(contentsOfFile: path) as? [String: AnyObject] {
|
||
|
||
self.apiKey = ((dict["Ebay"] as! Dictionary<String, AnyObject>)["consumerKey"] as! String)
|
||
self.devKey = ((dict["Ebay"] as! Dictionary<String, AnyObject>)["devID"] as! String)
|
||
self.certID = ((dict["Ebay"] as! Dictionary<String, AnyObject>)["CertID"] as! String)
|
||
self.signinURL = ((dict["Ebay"] as! Dictionary<String, AnyObject>)["signin"] as! String)
|
||
|
||
if(self.isAuthorized){
|
||
let dictionary = Locksmith.loadDataForUserAccount(self.userEmail, inService: "vendoo_oauth_ebay")
|
||
self.xmlResponseDictionary["eBayAuthToken"] = dictionary?["ebay_oauth"] as? String
|
||
|
||
}
|
||
//set default posting settings for ebay
|
||
if(NSUserDefaults.standardUserDefaults().boolForKey("ebayDefaultsOverriden")) {
|
||
|
||
EbayWebServiceManager.settingsDictionary = (NSUserDefaults.standardUserDefaults().objectForKey("ebaySettings") as? Dictionary<String, AnyObject>)!
|
||
}
|
||
else{
|
||
|
||
EbayWebServiceManager.settingsDictionary = ([
|
||
"listingType":"FixedPriceItem",
|
||
"condition":"1500",
|
||
"listingDuration":"Days_7",
|
||
"ebaySite":"US",
|
||
"currency":"USD",
|
||
"shipping": [
|
||
"shippingType": "Flat",
|
||
"freeShipping": "true",
|
||
"shippingServicePriority": "1",
|
||
"shippingService":"UPSGround",
|
||
"shippingServiceAdditionalCost":"0.00"
|
||
],
|
||
"payment":"PayPal",
|
||
"return":"ReturnsNotAccepted",
|
||
"postalCode":"00000"
|
||
|
||
] as Dictionary<String, AnyObject>)
|
||
|
||
NSUserDefaults.standardUserDefaults().setObject(EbayWebServiceManager.settingsDictionary, forKey: "ebaySettings")
|
||
|
||
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "ebayDefaultsOverriden")
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
|
||
func reinit() {
|
||
|
||
EbayWebServiceManager.settingsDictionary = (NSUserDefaults.standardUserDefaults().objectForKey("ebaySettings") as? Dictionary<String, AnyObject>)!
|
||
}
|
||
|
||
}
|
||
|
||
|
||
//MARK: - authentication methods
|
||
extension EbayWebServiceManager {
|
||
|
||
private func requestMaker(soapMessage: String!, theRequest: NSMutableURLRequest!) {
|
||
let msgLength = soapMessage.characters.count
|
||
theRequest.addValue("text/xml", forHTTPHeaderField: "Content-Type")
|
||
theRequest.addValue(String(msgLength), forHTTPHeaderField: "Content-Length")
|
||
theRequest.addValue("967", forHTTPHeaderField: "X-EBAY-API-COMPATIBILITY-LEVEL")
|
||
theRequest.addValue(self.devKey, forHTTPHeaderField: "X-EBAY-API-DEV-NAME")
|
||
theRequest.addValue(self.certID, forHTTPHeaderField: "X-EBAY-API-CERT-NAME")
|
||
theRequest.addValue(self.apiKey, forHTTPHeaderField: "X-EBAY-API-APP-NAME")
|
||
theRequest.addValue("0", forHTTPHeaderField: "X-EBAY-API-SITEID")
|
||
theRequest.addValue("", forHTTPHeaderField: "SOAPAction")
|
||
theRequest.HTTPMethod = "POST"
|
||
theRequest.HTTPBody = soapMessage.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) // or false
|
||
let connection = NSURLConnection(request: theRequest, delegate: self, startImmediately: true)
|
||
connection!.start()
|
||
|
||
if (connection == true) {
|
||
var mutableData : Void = NSMutableData.initialize()
|
||
}
|
||
}
|
||
|
||
func authorizeApp(){
|
||
|
||
let soapMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
|
||
"<GetSessionIDRequest xmlns=\"urn:ebay:apis:eBLBaseComponents\">" +
|
||
"<RuName>Kroleo-Kroleo-Vendoo-S-ktqeobkk</RuName>" +
|
||
"</GetSessionIDRequest>"
|
||
|
||
let url = NSURL(string: self.baseURL)
|
||
let theRequest = NSMutableURLRequest(URL: url!)
|
||
theRequest.addValue("GetSessionID", forHTTPHeaderField: "X-EBAY-API-CALL-NAME")
|
||
|
||
self.requestMaker(soapMessage, theRequest: theRequest)
|
||
|
||
|
||
}
|
||
|
||
func deauthorizeApp(){
|
||
let soapMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
|
||
"<RevokeTokenRequest xmlns=\"urn:ebay:apis:eBLBaseComponents\">" +
|
||
"<RequesterCredentials>" +
|
||
"<eBayAuthToken>\(self.xmlResponseDictionary["eBayAuthToken"])</eBayAuthToken>" +
|
||
"</RequesterCredentials></RevokeTokenRequest>"
|
||
|
||
let url = NSURL(string: self.baseURL)
|
||
let theRequest = NSMutableURLRequest(URL: url!)
|
||
theRequest.addValue("RevokeToken", forHTTPHeaderField: "X-EBAY-API-CALL-NAME")
|
||
|
||
self.requestMaker(soapMessage, theRequest: theRequest)
|
||
|
||
//delete token from locksmith keychain
|
||
do{
|
||
try Locksmith.deleteDataForUserAccount(self.userEmail, inService: "vendoo_oauth_ebay")
|
||
print("account credentials deleted for ebay")
|
||
NSUserDefaults.standardUserDefaults().setBool(false, forKey: "ebayAuthorized")
|
||
self.isAuthorized = false
|
||
|
||
}
|
||
catch{
|
||
(error)
|
||
print(error)
|
||
//could not save data to keychain
|
||
print("account credentials could not be deleted")
|
||
|
||
}
|
||
}
|
||
|
||
private func getPaypalEmail(onCompletion: ServiceResponse){
|
||
var soapMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
|
||
"<GetUserPreferencesRequest xmlns=\"urn:ebay:apis:eBLBaseComponents\">" +
|
||
"<RequesterCredentials>" +
|
||
"<eBayAuthToken>\(self.xmlResponseDictionary["eBayAuthToken"] as! String)</eBayAuthToken>" +
|
||
"</RequesterCredentials>"
|
||
|
||
soapMessage = soapMessage + "<ShowBidderNoticePreferences>true</ShowBidderNoticePreferences>" +
|
||
"<ShowCombinedPaymentPreferences>true</ShowCombinedPaymentPreferences>" +
|
||
"<ShowDispatchCutoffTimePreferences>true</ShowDispatchCutoffTimePreferences>" +
|
||
"<ShoweBayPLUSPreference>true</ShoweBayPLUSPreference>" +
|
||
"<ShowEmailShipmentTrackingNumberPreference>true</ShowEmailShipmentTrackingNumberPreference>" +
|
||
"<ShowEndOfAuctionEmailPreferences>true</ShowEndOfAuctionEmailPreferences>" +
|
||
"<ShowGlobalShippingProgramListingPreference>true</ShowGlobalShippingProgramListingPreference>" +
|
||
"<ShowGlobalShippingProgramPreference>true</ShowGlobalShippingProgramPreference>" +
|
||
"<ShowOutOfStockControlPreference>true</ShowOutOfStockControlPreference>" +
|
||
"<ShowOverrideGSPServiceWithIntlServicePreference>true</ShowOverrideGSPServiceWithIntlServicePreference>" +
|
||
"<ShowPickupDropoffPreferences>true</ShowPickupDropoffPreferences>" +
|
||
"<ShowPurchaseReminderEmailPreferences>true</ShowPurchaseReminderEmailPreferences>" +
|
||
"<ShowRequiredShipPhoneNumberPreference>true</ShowRequiredShipPhoneNumberPreference>" +
|
||
"<ShowSellerExcludeShipToLocationPreference>true</ShowSellerExcludeShipToLocationPreference>" +
|
||
"<ShowSellerFavoriteItemPreferences>true</ShowSellerFavoriteItemPreferences>" +
|
||
"<ShowSellerPaymentPreferences>true</ShowSellerPaymentPreferences>" +
|
||
"<ShowSellerProfilePreferences>true</ShowSellerProfilePreferences>" +
|
||
"<ShowSellerReturnPreferences>true</ShowSellerReturnPreferences>" +
|
||
"<ShowUnpaidItemAssistanceExclusionList>true</ShowUnpaidItemAssistanceExclusionList>" +
|
||
"<ShowUnpaidItemAssistancePreference>true</ShowUnpaidItemAssistancePreference>" +
|
||
"<ErrorLanguage>en_US</ErrorLanguage>" +
|
||
"<MessageID> string </MessageID><WarningLevel>High</WarningLevel>" +
|
||
"</GetUserPreferencesRequest>"
|
||
|
||
let url = NSURL(string: self.baseURL)
|
||
let theRequest = NSMutableURLRequest(URL: url!)
|
||
theRequest.addValue("GetUserPreferences", forHTTPHeaderField: "X-EBAY-API-CALL-NAME")
|
||
self.completion = onCompletion
|
||
self.requestMaker(soapMessage, theRequest: theRequest)
|
||
}
|
||
|
||
func listItem(params: [String: String]){
|
||
var dict = EbayWebServiceManager.settingsDictionary
|
||
//@TODO: Make sure to get paypal email for user if user has paypal selected
|
||
var emailRetrievalGroup = dispatch_group_create()
|
||
var soapMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
|
||
"<AddItemRequest xmlns=\"urn:ebay:apis:eBLBaseComponents\">" +
|
||
"<RequesterCredentials>" +
|
||
"<eBayAuthToken>\(self.xmlResponseDictionary["eBayAuthToken"] as! String)</eBayAuthToken>" +
|
||
"</RequesterCredentials>"
|
||
|
||
if((dict["payment"] as? String) == "PayPal") {
|
||
dispatch_group_enter(emailRetrievalGroup)
|
||
|
||
self.getPaypalEmail({
|
||
(any, error) -> Void in
|
||
dispatch_group_leave(emailRetrievalGroup)
|
||
})
|
||
|
||
dispatch_group_notify(emailRetrievalGroup, dispatch_get_main_queue(), {
|
||
soapMessage = soapMessage + "<Item>" +
|
||
"<StartPrice>\(params["price"])</StartPrice>" +
|
||
"<ConditionID>\(dict["condition"])</ConditionID>" +
|
||
"<Country>US</Country>" +
|
||
"<Currency>USD</Currency>" +
|
||
"<DispatchTimeMax>3</DispatchTimeMax>" +
|
||
"<ListingDuration>\(dict["listingDuration"])</ListingDuration>" +
|
||
"<ListingType>\(dict["listingType"])</ListingType>" +
|
||
"<PaymentMethods>\(dict["payment"])</PaymentMethods>" +
|
||
"<PayPalEmailAddress>\(dict["paypal_email"])</PayPalEmailAddress>" +
|
||
"<PostalCode>\(dict["postalCode"])</PostalCode>" +
|
||
"<Quantity>\(params["quantity"])</Quantity>" +
|
||
"<ReturnPolicy>" +
|
||
"<ReturnsAcceptedOption>\(dict["return"])</ReturnsAcceptedOption>" +
|
||
"<Description>Vendoo requires seller to set up return policy manually.</Description>" +
|
||
"</ReturnPolicy>" +
|
||
"<ShippingDetails>" +
|
||
"<ShippingServiceOptions>" +
|
||
"<ShippingServicePriority>\(dict["shipping"]!["shippingServicePriority"])</ShippingServicePriority>" +
|
||
"<ShippingService>\(dict["shipping"]!["shippingService"])</ShippingService>" +
|
||
"<ShippingServiceCost>0.00</ShippingServiceCost>" +
|
||
"<ShippingServiceAdditionalCost>\(dict["shipping"]!["shippingServiceAdditionalCost"])</ShippingServiceAdditionalCost>" +
|
||
"</ShippingServiceOptions>" +
|
||
"</ShippingDetails>" +
|
||
"<Site>US</Site>" +
|
||
"</Item></AddItemRequest>"
|
||
|
||
let url = NSURL(string: self.baseURL)
|
||
let theRequest = NSMutableURLRequest(URL: url!)
|
||
theRequest.addValue("AddItem", forHTTPHeaderField: "X-EBAY-API-CALL-NAME")
|
||
|
||
self.requestMaker(soapMessage, theRequest: theRequest)
|
||
|
||
})
|
||
}
|
||
}
|
||
|
||
func fetchToken() {
|
||
let soapMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
|
||
"<FetchTokenRequest xmlns=\"urn:ebay:apis:eBLBaseComponents\"><SessionID>\(self.xmlResponseDictionary["SessionID"] as! String!)</SessionID></FetchTokenRequest>"
|
||
|
||
let url = NSURL(string: self.baseURL)
|
||
let theRequest = NSMutableURLRequest(URL: url!)
|
||
theRequest.addValue("FetchToken", forHTTPHeaderField: "X-EBAY-API-CALL-NAME")
|
||
|
||
self.requestMaker(soapMessage, theRequest: theRequest)
|
||
}
|
||
}
|
||
|
||
extension EbayWebServiceManager: NSURLConnectionDelegate {
|
||
|
||
func connection(connection: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
|
||
mutableData.length = 0;
|
||
print(response)
|
||
}
|
||
|
||
func connection(connection: NSURLConnection!, didReceiveData data: NSData!) {
|
||
mutableData.appendData(data)
|
||
print(data)
|
||
}
|
||
|
||
func connectionDidFinishLoading(connection: NSURLConnection!) {
|
||
let response = NSString(data: mutableData, encoding: NSUTF8StringEncoding)
|
||
|
||
|
||
print(response)
|
||
var response_fixed = response!.stringByReplacingOccurrencesOfString("&", withString: "and")
|
||
let data_fixed = response_fixed.dataUsingEncoding(NSUTF8StringEncoding)
|
||
print(response_fixed)
|
||
let xmlParser = NSXMLParser(data: data_fixed!)
|
||
xmlParser.delegate = self
|
||
xmlParser.parse()
|
||
xmlParser.shouldResolveExternalEntities = true
|
||
}
|
||
|
||
func connection(connection: NSURLConnection, willSendRequestForAuthenticationChallenge challenge: NSURLAuthenticationChallenge) {
|
||
|
||
challenge.sender!.performDefaultHandlingForAuthenticationChallenge!(challenge)
|
||
|
||
}
|
||
}
|
||
|
||
extension EbayWebServiceManager: NSXMLParserDelegate {
|
||
|
||
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
|
||
currentElementName = elementName
|
||
}
|
||
|
||
func parser(parser: NSXMLParser, foundCharacters string: String) {
|
||
switch (self.currentElementName) {
|
||
case "SessionID":
|
||
self.xmlResponseDictionary["SessionID"] = string
|
||
var str = "\(signinURL)&SessID=\(string)"
|
||
self.signinURL = str
|
||
print(self.signinURL)
|
||
print((self.currentElementName as String) + " : " + string)
|
||
self.delegate?.signInUser(self.signinURL)
|
||
break
|
||
case "eBayAuthToken":
|
||
self.xmlResponseDictionary["eBayAuthToken"] = string
|
||
print(string)
|
||
|
||
//save token to locksmith keychain
|
||
do{
|
||
try Locksmith.saveData(["ebay_oauth" : string], forUserAccount: self.userEmail, inService: "vendoo_oauth_ebay")
|
||
print("account credentials saved")
|
||
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "ebayAuthorized")
|
||
self.isAuthorized = true
|
||
|
||
//Test authentication
|
||
let soapmessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
|
||
"<GetUserRequest xmlns=\"urn:ebay:apis:eBLBaseComponents\">" +
|
||
"<RequesterCredentials><eBayAuthToken>\(string)</eBayAuthToken>" +
|
||
"</RequesterCredentials></GetUserRequest>"
|
||
|
||
/*
|
||
*<?xml version="1.0" encoding="utf-8"?>
|
||
<GetUserRequest xmlns="urn:ebay:apis:eBLBaseComponents">
|
||
<!-- Call-specific Input Fields -->
|
||
<IncludeFeatureEligibility> boolean </IncludeFeatureEligibility>
|
||
<ItemID> ItemIDType (string) </ItemID>
|
||
<UserID> string </UserID>
|
||
<!-- Standard Input Fields -->
|
||
<DetailLevel> DetailLevelCodeType </DetailLevel>
|
||
<!-- ... more DetailLevel values allowed here ... -->
|
||
<ErrorLanguage> string </ErrorLanguage>
|
||
<MessageID> string </MessageID>
|
||
<Version> string </Version>
|
||
<WarningLevel> WarningLevelCodeType </WarningLevel>
|
||
</GetUserRequest>
|
||
*/
|
||
|
||
let url = NSURL(string: self.baseURL)
|
||
let theRequest = NSMutableURLRequest(URL: url!)
|
||
theRequest.addValue("GetUser", forHTTPHeaderField: "X-EBAY-API-CALL-NAME")
|
||
|
||
self.requestMaker(soapmessage, theRequest: theRequest)
|
||
|
||
}
|
||
catch{
|
||
(error)
|
||
print(error)
|
||
//could not save data to keychain
|
||
print("account credentials could not be saved")
|
||
|
||
}
|
||
|
||
break
|
||
case "HardExpirationTime" :
|
||
print(string)
|
||
break
|
||
case "UserID" :
|
||
print(string)
|
||
EbayWebServiceManager.settingsDictionary["userID"] = string
|
||
NSUserDefaults.standardUserDefaults().setObject(EbayWebServiceManager.settingsDictionary, forKey: "ebaySettings")
|
||
print(self.xmlResponseDictionary["eBayAuthToken"])
|
||
let soapmessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
|
||
"<GetCategoriesRequest xmlns=\"urn:ebay:apis:eBLBaseComponents\">" +
|
||
"<RequesterCredentials><eBayAuthToken>\(self.xmlResponseDictionary["eBayAuthToken"] as! String)</eBayAuthToken>" +
|
||
"</RequesterCredentials><CategorySiteID>0</CategorySiteID><DetailLevel>ReturnAll</DetailLevel><LevelLimit>1</LevelLimit>" +
|
||
"</GetCategoriesRequest>"
|
||
|
||
let url = NSURL(string: self.baseURL)
|
||
let theRequest = NSMutableURLRequest(URL: url!)
|
||
theRequest.addValue("GetCategories", forHTTPHeaderField: "X-EBAY-API-CALL-NAME")
|
||
|
||
self.requestMaker(soapmessage, theRequest: theRequest)
|
||
break
|
||
case "CategoryID" :
|
||
self.catID = string
|
||
break
|
||
case "CategoryName" :
|
||
if((EbayWebServiceManager.settingsDictionary["categories"]) == nil) {
|
||
EbayWebServiceManager.settingsDictionary["categories"] = Dictionary<String , String>()
|
||
}
|
||
var dict: Dictionary<String, String> = (EbayWebServiceManager.settingsDictionary["categories"]!) as! Dictionary<String, String>
|
||
|
||
dict[string] = self.catID as String
|
||
EbayWebServiceManager.settingsDictionary["categories"] = dict
|
||
NSUserDefaults.standardUserDefaults().setObject(EbayWebServiceManager.settingsDictionary, forKey: "ebaySettings")
|
||
break
|
||
|
||
case "DefaultPayPalEmailAddress":
|
||
var dict = (EbayWebServiceManager.settingsDictionary)
|
||
dict["paypal_email"] = string
|
||
EbayWebServiceManager.settingsDictionary = dict
|
||
NSUserDefaults.standardUserDefaults().setObject(EbayWebServiceManager.settingsDictionary, forKey: "ebaySettings")
|
||
self.completion(nil, nil)
|
||
break
|
||
default:
|
||
//print(string)
|
||
print("\(self.currentElementName):\(string)")
|
||
}
|
||
|
||
}
|
||
}
|