2017-04-18 60 views
0

我試圖聯繫巴克萊支付API,我可以發送POST請求其返回,我想將用戶重定向到使用郵遞員的頁面。無法發送後在角度2,這是工作的郵遞員

然而,相同的請求發送從角度2的應用程序,返回:

的XMLHttpRequest不能加載https://test.barclaycardsmartpay.com/hpp/pay.shtml。請求的資源上沒有「Access-Control-Allow-Origin」標題。因此不允許訪問原產地'http://localhost:4200'。

我覺得這個錯誤消息是誘餌,因爲如果CORS是問題的話,我不知道爲什麼它會在郵遞員來工作。也許是因爲我試圖達到的API接受SOAP請求,我試圖從本地主機執行此操作,無法通過該API進行訪問(以提供雙向連接?)。

在我的角度的應用程序,我的帖子是這樣的:

let paymentPost : iSmartPayment = { 
    merchantSig: "23XJ9auO4brdZMzPXoe+Lml4H5PfQERgrImns6s4FdQ=", 
    merchantReference: "abc", 
    paymentAmount: "1", 
    currencyCode: "GBP", 
    shipBeforeDate: "2018-01-01", 
    skinCode: "neXEF4Y2", 
    merchantAccount: "GroupEdTest",  
    sessionValidity: "2018-01-01T00:00:00Z", 
    merchantReturnData: "http://www.mywebsiteUrl.com.s3-website.eu-west-2.amazonaws.com/#/transactionhistory", 
    shopperEmail: "[email protected]", 
    shopperReference: "Sam" 

    } 

return this.http.post('https://test.barclaycardsmartpay.com/hpp/pay.shtml', JSON.stringify(paymentPost)).map((response: Response) => { 
     console.log('TODO: process response', response); 
     return response.json(); 
    }).catch(this.handleError); 

注意,我在後已經改變了一些值,以保持數據的機密性。

任何想法可能是我的問題在這裏?

+3

郵遞員不具有相同的瀏覽器,通過瀏覽器CORS進行Ajax調用時到位服務器的限制。這是一個CORs問題。另外,你是否真的需要將你的有效負載串聯起來?你應該能夠直接發佈對象。 –

+0

謝謝你的注意事項。謝謝,我會調查如何更改Cors選項 – Sam

+0

這個問題似乎不是Cors。我現在做這個,而不是一個立場HTML表單發佈,它正在工作。我很高興使用html方法,但我很想找到解決這個問題的方法。 – Sam

回答

0

發帖之前,您不需要JSON.stringify身體。

let url: string = 'https://test.barclaycardsmartpay.com/hpp/pay.shtml'; 

let paymentPost : iSmartPayment = { 
    merchantSig: "23XJ9auO4brdZMzPXoe+Lml4H5PfQERgrImns6s4FdQ=", 
    merchantReference: "abc", 
    paymentAmount: "1", 
    currencyCode: "GBP", 
    shipBeforeDate: "2018-01-01", 
    skinCode: "neXEF4Y2", 
    merchantAccount: "GroupEdTest",  
    sessionValidity: "2018-01-01T00:00:00Z", 
    merchantReturnData: "http://www.mywebsiteUrl.com.s3-website.eu-west-2.amazonaws.com/#/transactionhistory", 
    shopperEmail: "[email protected]", 
    shopperReference: "Sam" 

    } 

return this.http.post(url, paymentPost).map((response: Response) => response.json()).catch(this.handleError); 

如果不工作,也可能是OPTIONS請求角發生故障的帖子之前發送。

0

我有同樣的問題做了大量的研究,這裏是你可能需要的。

從您的問題參考。

的XMLHttpRequest無法加載https://test.barclaycardsmartpay.com/hpp/pay.shtml。請求的資源上沒有「Access-Control-Allow-Origin」標題。因此不允許訪問原產地'http://localhost:4200'。

這些例外只說明瞭跨URL請求不能共享數據。但是您可以調用GET方法,因爲它不需要將數據從客戶端發送到服務器。但是在POST的情況下,我們需要將數據從客戶端發送到服務器,而瀏覽器由於CORS而限制通過不同域發送的數據。

爲了解決這個問題,以下是需要做的,從API方面,我們必須增加在web.config文件中的配置,並在Global.aspx文件中的設置是什麼。

<httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept,Authorization" /> 
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> 
    </customHeaders> 
</httpProtocol> 

全局文件

protected void Application_BeginRequest() 
    { 
     if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS") 
     { 
      Response.Flush(); 
     } 
    }