vendoo_v1.0/Vendoo/EbayWebServiceManager.swift
Okechi Onyeje 544a7baa87 Working on posting a listing to ebay
Paypal sandbox account not linking, so cannot proceed until able to get this working
2016-08-17 10:22:15 -04:00

419 lines
20 KiB
Swift
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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("&amp;", 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)")
}
}
}