Ошибка синтаксического анализа JSON: синтаксическая ошибка, ожидайте {, фактическая ошибка, позиция 0, fastjson-версия 1.2.57 при использовании RoyalPay SDK - PullRequest
2 голосов
/ 30 апреля 2019

Я пытаюсь использовать RoyalPay SDK для создания заказа и оплаты Alipay. Код ответа - 200, но я не могу разобрать JSON в ответе.

Как мне решить эту проблему?

Код, с помощью которого я создаю запрос API:

    interface RoyalPayApi {

    @FormUrlEncoded
    @Headers("Accept: application/json", "Content-Type: application/json")
    @PUT("/api/v1.0/gateway/partners/{partner_code}/app_orders/{order_id}")
    fun createRoyalPaySDKOrder(@Path(value = "partner_code", encoded = true) partner_code: String, @Path(value = "order_id", encoded = true) order_id: String,
                               @Query("time") time: Long, @Query("nonce_str") nonce_str: String, @Query("sign") sign: String,
                               @Field("description") description: String,
                               @Field("price") price: Int,
                               @Field("currency") currency: String,
                               @Field("channel") channel: String,
                               @Field("operator") operator: String,
                               @Field("system") system: String): Call<JSONObject> // com.alibaba.fastjson.JSONObject
}

Код, который я получаю дооснащения:

fun createService(): RoyalPayApi {
        val retrofit = Retrofit.Builder()
        .baseUrl(ROYAL_PAY_ADDRESS)
        .addConverterFactory(FastJsonConverterFactory.create())
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .build()

    return retrofit.create(RoyalPayApi::class.java)
}

Код отправки запроса и получения ответа:

 var api = createService()
    var call = api.createRoyalPaySDKOrder(ROYAL_PAY_PARTNER_CODE, order_id, time, ROYAL_PAY_NONCE_STR, sign,
        description, price, "AUD", channel, "kate", "android")

    call.enqueue(object : Callback<JSONObject>{
        override fun onResponse(call: Call<JSONObject>, response: Response<JSONObject>) {
            val str = ""
        }

        override fun onFailure(call: Call<JSONObject>, t: Throwable) {
            val str = ""
        }
    })

Это ответ, который я получил:

enter image description here

Это тело ответа (китайский здесь не должен влиять на понимание):

enter image description here

Сюда входит необработанный ответ (с использованием com.google.gson.JsonObject):

enter image description here

Необработанный ответ с использованием com.alibaba.fastjson.JSONObject enter image description here

если изменить JSONObject на String, он просто вернет строковую версию ошибки :(: enter image description here

1 Ответ

0 голосов
/ 30 апреля 2019

Сервер ожидает запрос JSON Body. Вы аннотируете свои данные с помощью @Field, в результате чего запрос будет сформирован как queryString.

т.е. Ваше тело запроса будет выглядеть примерно так:

description=foo&price=123...

вместо этого:

{
    "description": "foo",
    "price": 123,
    ...
}

Чтобы достичь того, что вы хотите, отметьте этот вопрос здесь . Первый ответ работает напрямую с объектами Java, но вы также можете использовать второй ответ, если не хотите работать с пользовательскими классами.

...