转到贝宝REST API请求

问题描述:

因此,进出口目前使用的围棋和进出口试图创建Paypal进行支付我一直想这个代码转到贝宝REST API请求

payer := &Payer{"paypal"} 
    amount := &Amount{"EUR", "12"} 
    trans := &Transactions{amount, "A super test"} 
    uris := &Redirect_urls{"http://localhost", "http://localhost"} 
    p := &Payment{"sale", payer, trans, uris} 
    response, err := json.Marshal(p) 
    if err != nil { 
     log.Println("Error at PaypalPayment - buy controller") 
     log.Fatal(err) 
    } 
    log.Println(string(response)) 

    client := &http.Client{} 
    buf := bytes.NewBuffer(response) 
    req, err := http.NewRequest("POST", "https://api.sandbox.paypal.com/v1/payments/payment", buf) 
    if err != nil { 
     log.Println("Error at PaypalPayment - buy controller - 2") 
     log.Fatal(err) 
    } 
    req.Header.Set("Content-Type", "application/json") 
    req.Header.Set("Authorization", "Bearer " + token.Access_token) 
    resp, err := client.Do(req) 
    if err != nil { 
     log.Println("Error at PaypalPayment - buy controller - 3") 
     log.Fatal(err) 
    } 
    body, err := ioutil.ReadAll(resp.Body) 
    if err != nil { 
     log.Println("Error at PaypalPayment - buy controller - 4") 
     log.Fatal(err) 
    } 
    log.Println(string(body)) 

我已经得到了访问令牌,问题是即时得到的这个错误响应本体(最后一行)

MALFORMED_REQUEST

使用IM中的请求是此(视的println)

{ 
    "Intent":"sale", 
    "Payer":{ 
     "Payment_method":"paypal" 
    }, 
    "Transactions":{ 
     "Amount":{ 
     "Currency":"EUR", 
     "Total":"12" 
     }, 
     "Description":"Super test" 
    }, 
    "Redirect_urls":{ 
     "Return_url":"http://localhost", 
     "Cancel_url":"http://localhost" 
    } 
} 

我的眼神似乎是一个不错的请求......不知道我在想念 Error image

+0

我不知道这是问题,但使用localhost作为重定向url可能是不允许的。大多数服务器都会因为这样的目的而发送请求失败,因为它可能会暴露安全漏洞。你能链接到这个请求的文档吗?为了说出它的好坏,我必须能够将它与API的期望进行比较。此外,来自响应机构的状态代码和任何其他信息通常都会有所帮助。 – evanmcdonnal

+0

https://developer.paypal.com/docs/api/#create-a-payment多数民众赞成在请求应该看起来像 - 至于使用本地主机好问题不存在(我猜),因为它说它的格式不正确 –

+0

paypal文档上的错误MALFORMED_REQUEST表示传入的JSON请求没有映射到API请求 –

问题是交易需要是一个数组。我是多么瞎了

Transactions []*Transactions `json:"transactions"` 

正如指出的@jcbwlkr你外壳不匹配什么是在文档。如果你的类型没有json标签,你必须添加它们。您必须在Go中保留属性名称大写,因为它将字段标记为正在导出。如果你不熟悉这个,搜索“未导出的对导出的字段golang”

例如,你的Payment结构定义需要看起来像这样;

type Payment struct { 
    Amount *Amount `json:"amount"` 
    Transactions *Transactions `json:"transactions"` 
    RdUrls *Redirect_urls `json:"redirect_urls"` 
} 

此外,仅供参考,您可以使用嵌套那些声明付款声明,所以你不必分配到的AmountTransactionsRedirect_urls本地实例,以做声明。

这就像;

p := &Payment{"sale", payer, &Transactions{amount, "A super test"}, uris} 
+0

我试图仍然得到格式不正确的请求 –

+0

@AlvaroCarvajalNakosmai你是否递归地通过所有类型应用它?注意它们的所有属性名称都较低。如果是这种情况,我看不出你的模式和他们的例子中实现的模式之间有什么区别。 – evanmcdonnal

+0

是的所有的结构。不知道还有什么可以做 –