Не удается получить токен Payfort SDK, следуя документации

Я слежу за документацией Payfort (кстати, это очень плохая документация) https://docs.payfort.com/docs/mobile-sdk/build/index.html
интегрировать его в свой проект, и я использовал POST для указанного URL, но я не могу получить токен SDK, и все, что я получаю, это ответ без тела, так что если кто-нибудь может сказать мне, как генерировать токен SDK или что я делаю не так в следующем коде.

Вот ответ на запрос POST

            Response{protocol=http/1.1, code=200, message=OK, url=https://sbpaymentservices.payfort.com/FortAPI/paymentApi}

вот сообщение, которое я получаю в обратном вызове onFailure

       E/Failure: {amount=100, response_code=00044, payment_option=VISA, order_description=DESCRIPTION, customer_ip=172.150.16.10, eci=ECOMMERCE, language=en, command=PURCHASE, response_message=Token name does not exist, sdk_token=sdk_token, merchant_reference=AGH-0008707682, customer_email=ghazalayah1995@yahoo.com, currency=SAR, customer_name=Sam, status=00}

вот код

Модифицированный сервисный интерфейс

     public interface Services {

@FormUrlEncoded
@Headers("Content-Type: application/json")
@POST("paymentApi")
Call<PayFortData> postRequest(@Field("language") String language,
                             @Field("device_id") String device_id,
                              @Field("service_command") String serviceCommand,
                              @Field("signature") String signature,
                              @Field("access_code") String access_code ,
                              @Field("merchant_identifier") String merchant_identifier);

}

PayFortActivity.class

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;

import com.payfort.fort.android.sdk.base.FortSdk;
import com.payfort.fort.android.sdk.base.callbacks.FortCallBackManager;
import com.payfort.fort.android.sdk.base.callbacks.FortCallback;
import com.payfort.sdk.android.dependancies.base.FortInterfaces;

import org.json.JSONObject;

      import java.io.BufferedReader;
  import java.io.InputStreamReader;
  import java.util.HashMap;
  import java.util.Map;


  import retrofit2.Call;
  import retrofit2.Callback;
  import retrofit2.Response;
  import retrofit2.Retrofit;
  import retrofit2.converter.gson.GsonConverterFactory;

  import static com.payfort.sdk.android.dependancies.commons.Constants.FORT_PARAMS.SDK_TOKEN;

public class PayFortActivity extends AppCompatActivity {


private static final String TAG = "PayFortActivity.this";
private FortCallBackManager fortCallback = null;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_pay_fort);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    // create Fort callback instance
    fortCallback = FortCallback.Factory.create();

    Log.e( "onCreate: ", SDK_TOKEN);

    // Generating deviceId
    String deviceId = FortSdk.getDeviceId(PayFortActivity.this);
    Log.d("DeviceId ", deviceId);
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://sbpaymentservices.payfort.com/FortAPI/")
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    Services service = retrofit.create(Services.class);

    Call<PayFortData> repos = service.postRequest("ar",deviceId,SDK_TOKEN,
           "7cad05f0212ed933c9a5d5dffa31661acf2c827a" ,
            "zx0IPmPy5jp1vAz8Kpg7",
            "CycHZxVj");
    repos.enqueue(new Callback<PayFortData>() {
        @Override
        public void onResponse(Call<PayFortData> call, Response<PayFortData> response) {
            Log.e( "onResponse: ",response.toString() );
        }

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

        }
    } );





      //      prepare payment request
         FortRequest fortrequest = new FortRequest();
         fortrequest.setRequestMap(collectRequestMap(SDK_TOKEN));
         fortrequest.setShowResponsePage(true); // to [display/use] 
                       the SDK response page

   //      execute payment request
         callSdk(fortrequest);
     }





   private Map<String, String> collectRequestMap(String sdkToken) {
    Map<String, String> requestMap = new HashMap<>();
    requestMap.put("command", "PURCHASE");
    requestMap.put("customer_email", "ghazalayah1995@yahoo.com");
    requestMap.put("currency", "SAR");
    requestMap.put("amount", "100");
    requestMap.put("language", "en");
    requestMap.put("merchant_reference", "AGH-0008707682");
    requestMap.put("customer_name", "Sam");
    requestMap.put("customer_ip", "172.150.16.10");
    requestMap.put("payment_option", "VISA");
    requestMap.put("eci", "ECOMMERCE");
    requestMap.put("order_description", "DESCRIPTION");
    requestMap.put("sdk_token", sdkToken);
         return requestMap;
     }

     private void callSdk(FortRequest fortrequest) {

         try {
             FortSdk.getInstance().registerCallback(PayFortActivity.this,fortrequest,
                     FortSdk.ENVIRONMENT.TEST, 5, fortCallback, new FortInterfaces.OnTnxProcessed() {
                 @Override
                 public void onCancel(Map<String, String> requestParamsMap, Map<String,
                             String> responseMap) {
     //TODO: handle me
                         Log.d("Cancelled ", responseMap.toString());
                     }

                     @Override
                     public void onSuccess(Map<String, String> requestParamsMap, Map<String,
                             String> fortResponseMap) {
     //TODO: handle me
                         Log.i("Success ", fortResponseMap.toString());
                     }

                     @Override
                     public void onFailure(Map<String, String> requestParamsMap, Map<String,
                             String> fortResponseMap) {
     //TODO: handle me
                         Log.e("Failure ", fortResponseMap.toString());
                     }

                 });
             } catch (Exception e) {
                 Log.e("execute Payment", "call FortSdk", e);
             }

         }


         @Override
         public void onActivityResult(int requestCode, int resultCode, Intent data) {
             super.onActivityResult(requestCode, resultCode, data);
             fortCallback.onActivityResult(requestCode, resultCode, data);
         }


     }

PayFortData

            package com.example.testat;

            import com.google.gson.annotations.Expose;
            import com.google.gson.annotations.SerializedName;

            /**
             * Created by agh on 26/02/18.
             */

            public class PayFortData {

                public String paymentResponse = "";
                //Response Params
                @SerializedName("access_code")
                @Expose
                public String accessCode;
                @SerializedName("sdk_token")
                @Expose
                public String sdkToken;
                @SerializedName("response_message")
                @Expose
                public String responseMessage;
                @SerializedName("status")
                @Expose
                public String status;
                @SerializedName("response_code")
                @Expose
                public String responseCode;
                @SerializedName("device_id")
                @Expose
                public String deviceId;
                @SerializedName("language")
                @Expose
                public String language;
                @SerializedName("service_command")
                @Expose
                public String serviceCommand;
                @SerializedName("signature")
                @Expose
                public String signature;
                @SerializedName("merchant_identifier")
                @Expose
                public String merchantIdentifier;


                @SerializedName("eci")
                @Expose
                public String eci;
                @SerializedName("card_number")
                @Expose
                public String cardNumber;
                @SerializedName("fort_id")
                @Expose
                public String fortId;
                @SerializedName("customer_email")
                @Expose
                public String customerEmail;
                @SerializedName("customer_ip")
                @Expose
                public String customerIp;
                @SerializedName("currency")
                @Expose
                public String currency;
                @SerializedName("amount")
                @Expose
                public String amount;
                @SerializedName("merchant_reference")
                @Expose
                public String merchantReference;
                @SerializedName("command")
                @Expose
                public String command;
                @SerializedName("payment_option")
                @Expose
                public String paymentOption;
                @SerializedName("expiry_date")
                @Expose
                public String expiryDate;
                @SerializedName("authorization_code")
                @Expose
                public String authorizationCode;

                public String getSdkToken() {
                    return sdkToken;
                }
            }

1 ответ

Эта ошибка связана с тем, что вы не передаете токен SDK, ранее сохраненный в postRequest() к callSdk() метод.

Вам следует позвонить callSdk() в обратном вызове успеха postRequest после того, как вы получите токен SDK.

Вы не должны использовать @FormUrlEncoded или же @FieldВы должны передать параметры запроса в теле следующим образом:

@POST("paymentApi")
Call <FortTokenResponse> fortSdkToken(@Body FortTokenRequest payload);

куда FortTokenRequest содержит параметры тела.

FortTokenRequest.kt

data class FortTokenRequest(val service_command: String = "", 
                        val access_code: String = "",
                        val merchant_identifier: String = "",
                        val language: String = "", // en/ ar
                        val device_id: String = "",
                        val signature: String = "")
Другие вопросы по тегам