Не удается получить токен 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 = "")