带改造的 Paypal REST Api

Posted

技术标签:

【中文标题】带改造的 Paypal REST Api【英文标题】:Paypal REST Api with retrofit 【发布时间】:2020-12-24 10:52:10 【问题描述】:

我正在尝试使用 Paypal REST api 进行改造,但出现以下错误

"name":"INVALID_REQUEST","message":"Request is not well-formed, syntactically incorrect, or violates schema.","debug_id":"2689a7ff7bf28","details":["field":"/purchase_units","value":"","location":"body","issue":"MISSING_REQUIRED_PARAMETER","description":"A required field / parameter is missing.","field":"/intent","value":"","location":"body","issue":"MISSING_REQUIRED_PARAMETER","description":"A required field / parameter is missing."],"links":["href":"https://developer.paypal.com/docs/api/orders/v2/#error-MISSING_REQUIRED_PARAMETER","rel":"information_link","encType":"application/json"]

这里是请求正文

Requestmethod=POST, url=https://api.sandbox.paypal.com/v2/checkout/orders/?%2Fintent=CAPTURE&%2Fpurchase_units=%5B%7B%22currency_code%22%3A%22USD%22%2C%22value%22%3A%22100%22%7D%5D, tags=class retrofit2.Invocation=c.shobaky.tofahaway.orderRequest.Order() [application/json, Bearer A21AAJ-S4HTuRR7ip1zAflRxUBsIVeEkxAAVWM7ZEB7uvn8g-0GBk6Swa3gwWMIiQYBtsXUssvzKWHv6IHDHYIQjREv6ToYow, CAPTURE, ["currency_code":"USD","value":"100"]]

这里是代码

 Gson gson = new GsonBuilder()
            .setLenient()
            .create();
    Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.sandbox.paypal.com/v2/checkout/")
            .addConverterFactory(GsonConverterFactory.create(gson)).build();
    orderRequest Order = retrofit.create(orderRequest.class);


    JSONArray Purchase = new JSONArray();
    JSONObject Amount = new JSONObject();
    try 
        Amount.put("currency_code","USD");
        Amount.put("value","100");
     catch (JSONException e) 
        e.printStackTrace();
    
    Purchase.put(Amount);


    Call<String> call = Order.Order("application/json","Bearer A21AAJ-S4HTuRR7ip1zAflRxUBsIVeEkxAAVWM7ZEB7uvn8g-0GBk6Swa3gwWMIiQYBtsXUssvzKWHv6IHDHYIQjREv6ToYow","CAPTURE",Purchase);
    call.enqueue(this);



@Override
public void onResponse(Call<String> call, Response<String> response) 
    try 
        Log.d("RESPONEPYPAL",call.request().toString()+response.errorBody().string());
     catch (IOException e) 
        e.printStackTrace();
    


@Override
public void onFailure(Call<String> call, Throwable t) 


我通过传递客户端 ID 和秘密 ID 使用 curl 获得了访问令牌,所以我几乎可以肯定这与授权无关,它看起来与“意图”和“购买单位”有关

更新 我在上一个请求之前使用了这个请求,也没有工作

method=POST, url=https://api.sandbox.paypal.com/v2/checkout/orders/, tags=class retrofit2.Invocation=c.shobaky.tofahaway.orderRequest.Order() [application/json, Bearer A21AAJQvfCFvMKkiWA9anZaEU_hBJ0Pb_TPOQtjqtCjFc39nc_rX6Y5RsCKoYbseMjgiCeGPMhyD5Omqw2tUlgh2EZT-9kiXQ, CAPTURE, ["amount":"currency_code":"USD","value":"100"]]

【问题讨论】:

错误消息是“请求格式不正确、语法不正确或违反架构”。所以你的错误可能是拼写错误或缺少任何参数,也可以使用 curl 或 postman 尝试此请求并验证一次。如果它有效,您可以轻松调试您的请求。 我实际上只是将 curl 代码从 paypal 文档翻译成 Java:/ 我确实像你说的那样,我使用了文档 curl 代码并且不起作用 【参考方案1】:

cURL 在 windows 提示符下无法正常工作,所以我使用了 power shell 并且运行良好!

【讨论】:

【参考方案2】:

您的“请求正文”不仅显示带有查询字符串参数的 URL,这是错误的,而且您还向 PayPal 发送了一个空的 POST 正文,这是带有 purchase_units 数组的格式良好的 JSON 需要的地方成为。

【讨论】:

是的,抱歉,对于查询参数,我只是在调试,但我尝试将其编码发送,对于 purchase_units,它只有必填字段“金额”,其中有两个我要发送的必填字段但在我的问题中,我忘记在购买数组中包含“金额”,但我尝试了,但没有奏效 (1) 您根本没有向 PayPal 发送任何 POST 数据——只是一个空白字符串。 (2) 您尝试发送的数据(但尚未实际发送)是错误的,您需要它与developer.paypal.com/docs/api/orders/v2/#orders_create 示例中的内容相同,包括键名。 好吧,抱歉,我的请求中的这些字段是什么?捕获,["amount":"currency_code":"USD","value":"100"] 我不知道,但它们没有被传输 我如何以及何时在改造界面中使用查询而不是字段注释,它们出现在 URL 中?!无论如何,我认为我发现了问题,可能是因为它必须在一个变量中,我正在尝试使用正文注释发送它们

以上是关于带改造的 Paypal REST Api的主要内容,如果未能解决你的问题,请参考以下文章

改造:用杰克逊反序列化失败,没有任何错误

服务化改造实践 | 如何在 Dubbo 中支持 REST

Android:带有改造和单元测试的网络调用

PayPal智能支付按钮与服务器端REST API集成

优雅对API进行内部升级改造

如何从 WCF REST Web 服务中的改造中获取来自@Part List<MultipartBody.Part> 发布请求的文件?