{"action":"created","comment":{"url":"https://api.github.com/repos/ePages-de/epages-docs/pulls/comments/34876323","id":34876323,"diff_hunk":"@@ -0,0 +1,85 @@\n+---\n+layout: post\n+title: \"Challenges of integrating third-parties\"\n+date: \"2015-07-20 07:20:17\"\n+icon: cloud\n+tags: integration third-party API webservice\n+categories: tech-stories\n+authors: [\"Ulf B.\"]\n+---\n+\n+Third-party applications are an important part of the service that ePages offers.\n+As our applications are built on an internal application platform, ePages developers are highly dependent on third-party services.\n+Read further, why it is not the easiest thing to integrate third-parties and how we tackle this.\n+\n+# The use case\n+\n+{% image blog-third-party-overview.png %}{% endimage %}\n+\n+Example: A customer buys something. They could choose e.g. PayPal as payment method and DHL as delivery method.\n+The customer could also obtain an insurance with Trusted Shops.\n+(Read further [here](http://www.epages.com/en/partner/technology-partner/) to get an overview of our technology partners.)\n+A checkout alone can easily have three third-party dependencies.\n+\n+The merchant, in turn, receives information via server-sided callbacks, if an order has been already paid.\n+They can generate shipping labels via the web service of a third-party shipping method or synchronise his online shop with ERP-software.\n+These are just a few examples of third-party integrations at ePages.\n+There are a lot more uses cases where both customer and merchant can use third-party services.\n+\n+Payment, deliveries, market places, marketing or tax calculation - for many applications, specialised services are available that have to be integrated into the platform at various locations.\n+In every of these areas new startup companies are founded that offer new services.\n+At the same time, also existing companies expand their service portfolio in order not to lose the connection in the dynamic e-commerce market.\n+These circumstances keep us busy not only in integrating periodically new services but also in maintaining the existing integrations.\n+\n+If companies expand abroad, as it is the case at ePages, it might be required to include additional services, to being attractive for the merchants in that specific country.\n+We integrated USPS and FedEx, since it would not make any sense to enter the US market without an integration of the most important US shipping agents.\n+\n+# Third-party libraries vs Third-party web services\n+\n+Today's software is mostly based on third-party components, as there are already proven solutions in place that can be easily reused.\n+Furthermore, these project are supported by great communities that continuously develop the software and often are absolute experts in this respective field.\n+\n+However, with regards to third-party components we have to distinguish between third-party library and third-party web service.\n+Third-party libraries are integrated directly into the code base and remain unchanged until consciously a new library version will be included.\n+\n+Working with third-party web services is more complex.\n+Even if a third-party web service, other than a third-party library, is not directly expands the code base, one must never forget:\n+By integrating a third-party service, this service will be part of the own software.\n+The software will be expanded by functionality that is dependent on the availability of the third-party web service and acts as expected.\n+This fact puts special demands on the developers.\n+\n+# The challenge\n+\n+Mostly one knows only the endpoint of the third-party API and only a more or less useful documentation is available.\n+The problem is, that not only the web service itself, but also both, the endpoint and the documentation, can change every time.\n+You will only notice the change, if something does not work anymore.\n+Sometimes an SDK exists for the API that should facilitate working with it.\n+But sometimes the SDK does not support the latest API version or the required programming language is not available.\n+\n+Often the documentation was only produced in the national language of the API developers making it impossible to understand the content.\n+The result is that integration problems cannot be fixed by our developers in Barcelona if the documentation is e.g. only available in German.\n+\n+# The approach\n+\n+Ideally, we are in direct contact with the developers of the respective third-party to clarify any questions or concerns.\n+Unfortunately, that is not always the case and we have to find it out by ourselves with the trial-and-error method or reverse engineering.\n+\n+When working with a SOAP API, the WSDL-file that describes the service, provides many helpful information.\n+Using a tool such as SoapUI, such a file can be analysed easily.\n+Even test requests can be sent via the SoapUI.\n+\n+For such tests, the third-party provides special test accounts.\n+Unfortunately, these are sometimes only valid for a limited period of time.\n+This is only then noticed, if the account is required again, e.g. if after some time problems with an integration arise that have to be fixed on short notice.\n+\n+To test our integrations we are writing Unit tests as well as integration and Selenium tests.\n+By carrying out these test we are alerted to these problems already at an early stage.\n+\n+Some companies even operate special test platforms with a separate endpoint.\n+What sounds like a very depeloper-friendly offer, has a major disadvantage: doing the tests on one system and using a different system for production.\n+Ideally, the test system should act exactly as the live-system, but that is not always the case.\n+This is especially annoying if after the rollout customers report problems that did not arise on the test platform.","path":"_posts/2015-07-20-third-party-integration.md","position":81,"original_position":81,"commit_id":"ef9b1c0a5b4035950b9beeedca0b97c6f196de6a","original_commit_id":"ef9b1c0a5b4035950b9beeedca0b97c6f196de6a","user":{"login":"maletzke","id":12544259,"avatar_url":"https://avatars.githubusercontent.com/u/12544259?v=3","gravatar_id":"","url":"https://api.github.com/users/maletzke","html_url":"https://github.com/maletzke","followers_url":"https://api.github.com/users/maletzke/followers","following_url":"https://api.github.com/users/maletzke/following{/other_user}","gists_url":"https://api.github.com/users/maletzke/gists{/gist_id}","starred_url":"https://api.github.com/users/maletzke/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/maletzke/subscriptions","organizations_url":"https://api.github.com/users/maletzke/orgs","repos_url":"https://api.github.com/users/maletzke/repos","events_url":"https://api.github.com/users/maletzke/events{/privacy}","received_events_url":"https://api.github.com/users/maletzke/received_events","type":"User","site_admin":false},"body":"I don't know about this part. Sounds a bit like we're blaming the others for bugs","created_at":"2015-07-17T09:50:22Z","updated_at":"2015-07-17T09:50:22Z","html_url":"https://github.com/ePages-de/epages-docs/pull/162#discussion_r34876323","pull_request_url":"https://api.github.com/repos/ePages-de/epages-docs/pulls/162","_links":{"self":{"href":"https://api.github.com/repos/ePages-de/epages-docs/pulls/comments/34876323"},"html":{"href":"https://github.com/ePages-de/epages-docs/pull/162#discussion_r34876323"},"pull_request":{"href":"https://api.github.com/repos/ePages-de/epages-docs/pulls/162"}}},"pull_request":{"url":"https://api.github.com/repos/ePages-de/epages-docs/pulls/162","id":40027431,"html_url":"https://github.com/ePages-de/epages-docs/pull/162","diff_url":"https://github.com/ePages-de/epages-docs/pull/162.diff","patch_url":"https://github.com/ePages-de/epages-docs/pull/162.patch","issue_url":"https://api.github.com/repos/ePages-de/epages-docs/issues/162","number":162,"state":"open","locked":false,"title":"Create blog post on third-party integration","user":{"login":"BirgitBader","id":10460958,"avatar_url":"https://avatars.githubusercontent.com/u/10460958?v=3","gravatar_id":"","url":"https://api.github.com/users/BirgitBader","html_url":"https://github.com/BirgitBader","followers_url":"https://api.github.com/users/BirgitBader/followers","following_url":"https://api.github.com/users/BirgitBader/following{/other_user}","gists_url":"https://api.github.com/users/BirgitBader/gists{/gist_id}","starred_url":"https://api.github.com/users/BirgitBader/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BirgitBader/subscriptions","organizations_url":"https://api.github.com/users/BirgitBader/orgs","repos_url":"https://api.github.com/users/BirgitBader/repos","events_url":"https://api.github.com/users/BirgitBader/events{/privacy}","received_events_url":"https://api.github.com/users/BirgitBader/received_events","type":"User","site_admin":false},"body":"@ubep Please give your feedback on the blog post.","created_at":"2015-07-15T14:18:21Z","updated_at":"2015-07-17T09:50:22Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b560182c3dce3cac628cf212026ebf2083ca30a3","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/ePages-de/epages-docs/pulls/162/commits","review_comments_url":"https://api.github.com/repos/ePages-de/epages-docs/pulls/162/comments","review_comment_url":"https://api.github.com/repos/ePages-de/epages-docs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ePages-de/epages-docs/issues/162/comments","statuses_url":"https://api.github.com/repos/ePages-de/epages-docs/statuses/ef9b1c0a5b4035950b9beeedca0b97c6f196de6a","head":{"label":"BirgitBader:blogpost-third-party","ref":"blogpost-third-party","sha":"ef9b1c0a5b4035950b9beeedca0b97c6f196de6a","user":{"login":"BirgitBader","id":10460958,"avatar_url":"https://avatars.githubusercontent.com/u/10460958?v=3","gravatar_id":"","url":"https://api.github.com/users/BirgitBader","html_url":"https://github.com/BirgitBader","followers_url":"https://api.github.com/users/BirgitBader/followers","following_url":"https://api.github.com/users/BirgitBader/following{/other_user}","gists_url":"https://api.github.com/users/BirgitBader/gists{/gist_id}","starred_url":"https://api.github.com/users/BirgitBader/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BirgitBader/subscriptions","organizations_url":"https://api.github.com/users/BirgitBader/orgs","repos_url":"https://api.github.com/users/BirgitBader/repos","events_url":"https://api.github.com/users/BirgitBader/events{/privacy}","received_events_url":"https://api.github.com/users/BirgitBader/received_events","type":"User","site_admin":false},"repo":{"id":36428815,"name":"epages-docs","full_name":"BirgitBader/epages-docs","owner":{"login":"BirgitBader","id":10460958,"avatar_url":"https://avatars.githubusercontent.com/u/10460958?v=3","gravatar_id":"","url":"https://api.github.com/users/BirgitBader","html_url":"https://github.com/BirgitBader","followers_url":"https://api.github.com/users/BirgitBader/followers","following_url":"https://api.github.com/users/BirgitBader/following{/other_user}","gists_url":"https://api.github.com/users/BirgitBader/gists{/gist_id}","starred_url":"https://api.github.com/users/BirgitBader/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BirgitBader/subscriptions","organizations_url":"https://api.github.com/users/BirgitBader/orgs","repos_url":"https://api.github.com/users/BirgitBader/repos","events_url":"https://api.github.com/users/BirgitBader/events{/privacy}","received_events_url":"https://api.github.com/users/BirgitBader/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/BirgitBader/epages-docs","description":"Source of ePages Developer Portal","fork":true,"url":"https://api.github.com/repos/BirgitBader/epages-docs","forks_url":"https://api.github.com/repos/BirgitBader/epages-docs/forks","keys_url":"https://api.github.com/repos/BirgitBader/epages-docs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/BirgitBader/epages-docs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/BirgitBader/epages-docs/teams","hooks_url":"https://api.github.com/repos/BirgitBader/epages-docs/hooks","issue_events_url":"https://api.github.com/repos/BirgitBader/epages-docs/issues/events{/number}","events_url":"https://api.github.com/repos/BirgitBader/epages-docs/events","assignees_url":"https://api.github.com/repos/BirgitBader/epages-docs/assignees{/user}","branches_url":"https://api.github.com/repos/BirgitBader/epages-docs/branches{/branch}","tags_url":"https://api.github.com/repos/BirgitBader/epages-docs/tags","blobs_url":"https://api.github.com/repos/BirgitBader/epages-docs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/BirgitBader/epages-docs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/BirgitBader/epages-docs/git/refs{/sha}","trees_url":"https://api.github.com/repos/BirgitBader/epages-docs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/BirgitBader/epages-docs/statuses/{sha}","languages_url":"https://api.github.com/repos/BirgitBader/epages-docs/languages","stargazers_url":"https://api.github.com/repos/BirgitBader/epages-docs/stargazers","contributors_url":"https://api.github.com/repos/BirgitBader/epages-docs/contributors","subscribers_url":"https://api.github.com/repos/BirgitBader/epages-docs/subscribers","subscription_url":"https://api.github.com/repos/BirgitBader/epages-docs/subscription","commits_url":"https://api.github.com/repos/BirgitBader/epages-docs/commits{/sha}","git_commits_url":"https://api.github.com/repos/BirgitBader/epages-docs/git/commits{/sha}","comments_url":"https://api.github.com/repos/BirgitBader/epages-docs/comments{/number}","issue_comment_url":"https://api.github.com/repos/BirgitBader/epages-docs/issues/comments{/number}","contents_url":"https://api.github.com/repos/BirgitBader/epages-docs/contents/{+path}","compare_url":"https://api.github.com/repos/BirgitBader/epages-docs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/BirgitBader/epages-docs/merges","archive_url":"https://api.github.com/repos/BirgitBader/epages-docs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/BirgitBader/epages-docs/downloads","issues_url":"https://api.github.com/repos/BirgitBader/epages-docs/issues{/number}","pulls_url":"https://api.github.com/repos/BirgitBader/epages-docs/pulls{/number}","milestones_url":"https://api.github.com/repos/BirgitBader/epages-docs/milestones{/number}","notifications_url":"https://api.github.com/repos/BirgitBader/epages-docs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/BirgitBader/epages-docs/labels{/name}","releases_url":"https://api.github.com/repos/BirgitBader/epages-docs/releases{/id}","created_at":"2015-05-28T09:40:10Z","updated_at":"2015-05-28T09:40:11Z","pushed_at":"2015-07-17T07:43:29Z","git_url":"git://github.com/BirgitBader/epages-docs.git","ssh_url":"git@github.com:BirgitBader/epages-docs.git","clone_url":"https://github.com/BirgitBader/epages-docs.git","svn_url":"https://github.com/BirgitBader/epages-docs","homepage":"https://developer.epages.com/","size":29971,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"ePages-de:develop","ref":"develop","sha":"04d5b677a3275e6779f4d5b803e539d1abc77293","user":{"login":"ePages-de","id":1125854,"avatar_url":"https://avatars.githubusercontent.com/u/1125854?v=3","gravatar_id":"","url":"https://api.github.com/users/ePages-de","html_url":"https://github.com/ePages-de","followers_url":"https://api.github.com/users/ePages-de/followers","following_url":"https://api.github.com/users/ePages-de/following{/other_user}","gists_url":"https://api.github.com/users/ePages-de/gists{/gist_id}","starred_url":"https://api.github.com/users/ePages-de/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ePages-de/subscriptions","organizations_url":"https://api.github.com/users/ePages-de/orgs","repos_url":"https://api.github.com/users/ePages-de/repos","events_url":"https://api.github.com/users/ePages-de/events{/privacy}","received_events_url":"https://api.github.com/users/ePages-de/received_events","type":"Organization","site_admin":false},"repo":{"id":30595510,"name":"epages-docs","full_name":"ePages-de/epages-docs","owner":{"login":"ePages-de","id":1125854,"avatar_url":"https://avatars.githubusercontent.com/u/1125854?v=3","gravatar_id":"","url":"https://api.github.com/users/ePages-de","html_url":"https://github.com/ePages-de","followers_url":"https://api.github.com/users/ePages-de/followers","following_url":"https://api.github.com/users/ePages-de/following{/other_user}","gists_url":"https://api.github.com/users/ePages-de/gists{/gist_id}","starred_url":"https://api.github.com/users/ePages-de/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ePages-de/subscriptions","organizations_url":"https://api.github.com/users/ePages-de/orgs","repos_url":"https://api.github.com/users/ePages-de/repos","events_url":"https://api.github.com/users/ePages-de/events{/privacy}","received_events_url":"https://api.github.com/users/ePages-de/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ePages-de/epages-docs","description":"Source of ePages Developer Portal","fork":false,"url":"https://api.github.com/repos/ePages-de/epages-docs","forks_url":"https://api.github.com/repos/ePages-de/epages-docs/forks","keys_url":"https://api.github.com/repos/ePages-de/epages-docs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ePages-de/epages-docs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ePages-de/epages-docs/teams","hooks_url":"https://api.github.com/repos/ePages-de/epages-docs/hooks","issue_events_url":"https://api.github.com/repos/ePages-de/epages-docs/issues/events{/number}","events_url":"https://api.github.com/repos/ePages-de/epages-docs/events","assignees_url":"https://api.github.com/repos/ePages-de/epages-docs/assignees{/user}","branches_url":"https://api.github.com/repos/ePages-de/epages-docs/branches{/branch}","tags_url":"https://api.github.com/repos/ePages-de/epages-docs/tags","blobs_url":"https://api.github.com/repos/ePages-de/epages-docs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ePages-de/epages-docs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ePages-de/epages-docs/git/refs{/sha}","trees_url":"https://api.github.com/repos/ePages-de/epages-docs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ePages-de/epages-docs/statuses/{sha}","languages_url":"https://api.github.com/repos/ePages-de/epages-docs/languages","stargazers_url":"https://api.github.com/repos/ePages-de/epages-docs/stargazers","contributors_url":"https://api.github.com/repos/ePages-de/epages-docs/contributors","subscribers_url":"https://api.github.com/repos/ePages-de/epages-docs/subscribers","subscription_url":"https://api.github.com/repos/ePages-de/epages-docs/subscription","commits_url":"https://api.github.com/repos/ePages-de/epages-docs/commits{/sha}","git_commits_url":"https://api.github.com/repos/ePages-de/epages-docs/git/commits{/sha}","comments_url":"https://api.github.com/repos/ePages-de/epages-docs/comments{/number}","issue_comment_url":"https://api.github.com/repos/ePages-de/epages-docs/issues/comments{/number}","contents_url":"https://api.github.com/repos/ePages-de/epages-docs/contents/{+path}","compare_url":"https://api.github.com/repos/ePages-de/epages-docs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ePages-de/epages-docs/merges","archive_url":"https://api.github.com/repos/ePages-de/epages-docs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ePages-de/epages-docs/downloads","issues_url":"https://api.github.com/repos/ePages-de/epages-docs/issues{/number}","pulls_url":"https://api.github.com/repos/ePages-de/epages-docs/pulls{/number}","milestones_url":"https://api.github.com/repos/ePages-de/epages-docs/milestones{/number}","notifications_url":"https://api.github.com/repos/ePages-de/epages-docs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ePages-de/epages-docs/labels{/name}","releases_url":"https://api.github.com/repos/ePages-de/epages-docs/releases{/id}","created_at":"2015-02-10T14:20:56Z","updated_at":"2015-05-28T09:54:48Z","pushed_at":"2015-07-17T09:19:57Z","git_url":"git://github.com/ePages-de/epages-docs.git","ssh_url":"git@github.com:ePages-de/epages-docs.git","clone_url":"https://github.com/ePages-de/epages-docs.git","svn_url":"https://github.com/ePages-de/epages-docs","homepage":"https://developer.epages.com/","size":18318,"stargazers_count":1,"watchers_count":1,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":7,"mirror_url":null,"open_issues_count":8,"forks":7,"open_issues":8,"watchers":1,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/ePages-de/epages-docs/pulls/162"},"html":{"href":"https://github.com/ePages-de/epages-docs/pull/162"},"issue":{"href":"https://api.github.com/repos/ePages-de/epages-docs/issues/162"},"comments":{"href":"https://api.github.com/repos/ePages-de/epages-docs/issues/162/comments"},"review_comments":{"href":"https://api.github.com/repos/ePages-de/epages-docs/pulls/162/comments"},"review_comment":{"href":"https://api.github.com/repos/ePages-de/epages-docs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ePages-de/epages-docs/pulls/162/commits"},"statuses":{"href":"https://api.github.com/repos/ePages-de/epages-docs/statuses/ef9b1c0a5b4035950b9beeedca0b97c6f196de6a"}}}}