问题描述
这是APIInterface的代码:
@Multipart
@POST("paytm")
@Headers({"Content-Type: application/json;charset=UTF-8"})
Call<Token_Res> generatetokenCall(
@HeaderMap Map<String,String> header,@Part("code") RequestBody language,@Part ("MID") RequestBody mid,@Part("ORDER_ID") RequestBody order_id,@Part("AMOUNT") RequestBody amount
);
这是我的改造课程:
package com.csk.jagdishshop.paytm;
import com.csk.jagdishshop.BuildConfig;
import com.csk.jagdishshop.NullOnEmptyConverterFactory;
import com.csk.jagdishshop.retrofit.APIService;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Call;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class ServiceWrapper {
private APIService mServiceInterface;
public ServiceWrapper(Interceptor mInterceptorheader) {
mServiceInterface = getRetrofit(mInterceptorheader).create(APIService.class);
}
public Retrofit getRetrofit(Interceptor mInterceptorheader) {
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient mOkHttpClient = null;
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(1201,TimeUnit.SECONDS);
builder.readTimeout(901,TimeUnit.SECONDS);
if (BuildConfig.DEBUG) {
// HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(loggingInterceptor);
}
mOkHttpClient = builder.build();
Gson gson = new GsonBuilder().setLenient().create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://jagdishshop.com/api/")
.addConverterFactory(new NullOnEmptyConverterFactory())
.addConverterFactory(GsonConverterFactory.create(gson))
.client(mOkHttpClient)
.build();
return retrofit;
}
public Call<Token_Res> getTokenCall(Map<String,String code,String mid,String order_id,String amount) {
return mServiceInterface.generatetokenCall(
header,convertPlainString(code),convertPlainString(mid),convertPlainString(order_id),convertPlainString(amount)
);
}
// convert aa param into plain text
public RequestBody convertPlainString(String data){
RequestBody plainString = RequestBody.create(data,MediaType.parse("text/plain"));
return plainString;
}
}
这是网络呼叫活动: getToken()方法用于从Paytm服务器生成令牌。为此,我在自己的服务器上使用了init_transaction.PHP文件和PaytmCehcsum.PHP文件,并对此进行了请求。标头用于Authorization:token以验证用户。
private void getToken(){
Map<String,String> header = new HashMap<>();
header.put("Authorization",token);
header.put("X-Requested-With","XMLHttpRequest");
Log.e(TAG," get token start");
progressBar.setVisibility(View.VISIBLE);
ServiceWrapper serviceWrapper = new ServiceWrapper(null);
Call<Token_Res> call = serviceWrapper.getTokenCall(header,"12345",midString,orderIdString,txnAmountString);
call.enqueue(new Callback<Token_Res>() {
@Override
public void onResponse(Call<Token_Res> call,Response<Token_Res> response) {
Log.e(TAG," respo "+ response.isSuccessful());
Log.e(TAG,"response :"+response.body());
progressBar.setVisibility(View.GONE);
try {
if (response.isSuccessful() && response.body()!=null){
if (response.body().getBody().getTxnToken()!="") {
Log.e(TAG," transaction token : "+response.body().getBody().getTxnToken());
startPaytmPayment(response.body().getBody().getTxnToken());
}else {
Log.e(TAG," Token status false");
}
}
}catch (Exception e){
Log.e(TAG," error in Token Res "+e.toString());
}
}
@Override
public void onFailure(Call<Token_Res> call,Throwable t) {
progressBar.setVisibility(View.GONE);
Log.e(TAG," response error "+t.toString());
}
});
}
public void startPaytmPayment (String token){
txnTokenString = token;
String host = "https://securegw.paytm.in/";
String orderDetails = "MID: " + midString + ",OrderId: " + orderIdString + ",TxnToken: " + txnTokenString
+ ",Amount: " + txnAmountString;
//Log.e(TAG,"order details "+ orderDetails);
String callBackUrl = host + "theia/paytmCallback?ORDER_ID="+orderIdString;
Log.e(TAG," callback URL "+callBackUrl);
PaytmOrder paytmOrder = new PaytmOrder(orderIdString,txnTokenString,txnAmountString,callBackUrl);
TransactionManager transactionManager = new TransactionManager(paytmOrder,new PaytmPaymentTransactionCallback(){
@Override
public void onTransactionResponse(Bundle bundle) {
Log.e(TAG,"Response (onTransactionResponse) : "+bundle.toString());
}
@Override
public void networkNotAvailable() {
Log.e(TAG,"network not available ");
}
@Override
public void onErrorProceed(String s) {
Log.e(TAG," onErrorProcess "+s.toString());
}
@Override
public void clientAuthenticationFailed(String s) {
Log.e(TAG,"Clientauth "+s);
}
@Override
public void someUIErrorOccurred(String s) {
Log.e(TAG," UI error "+s);
}
@Override
public void onErrorLoadingWebPage(int i,String s,String s1) {
Log.e(TAG," error loading web "+s+"--"+s1);
}
@Override
public void onBackpressedCancelTransaction() {
Log.e(TAG,"backPress ");
}
@Override
public void onTransactionCancel(String s,Bundle bundle) {
Log.e(TAG," transaction cancel "+s);
}
});
transactionManager.setShowPaymentUrl(host + "theia/api/v1/showPaymentPage");
transactionManager.startTransaction(this,ActivityRequestCode);
}
@Override
public void onActivityResult(int requestCode,int resultCode,Intent data) {
Log.e(TAG," result code "+resultCode);
super.onActivityResult(requestCode,resultCode,data);
if (requestCode == ActivityRequestCode && data != null) {
Bundle bundle = data.getExtras();
if (bundle != null) {
for (String key : bundle.keySet()) {
Log.e(TAG,key + " : " + (bundle.get(key) != null ? bundle.get(key) : "NULL"));
}
}
Log.e(TAG," data "+ data.getStringExtra("nativeSdkForMerchantMessage"));
Log.e(TAG," data response - "+data.getStringExtra("response"));
Toast.makeText(getApplicationContext(),data.getStringExtra("nativeSdkForMerchantMessage")
+ data.getStringExtra("response"),Toast.LENGTH_SHORT).show();
}else{
Log.e(TAG," payment Failed");
}
}
每当我得到response = true和responseBody = null
这是Logcat的输出:
D/OkHttp: --> POST https://jagdishshop.com/api/paytm http/1.1
D/OkHttp: Content-Type: application/json;charset=UTF-8
D/OkHttp: Content-Length: 816
D/OkHttp: Authorization: Bearer ...
D/OkHttp: X-Requested-With: XMLHttpRequest
D/OkHttp: --a67ac3f9-93a3-4a87-bdf5-85b447044dda
D/OkHttp: Content-disposition: form-data; name="code"
D/OkHttp: Content-transfer-encoding: binary
D/OkHttp: Content-Type: text/plain; charset=utf-8
D/OkHttp: Content-Length: 5
D/OkHttp: 12345
D/OkHttp: --a67ac3f9-93a3-4a87-bdf5-85b447044dda
D/OkHttp: Content-disposition: form-data; name="MID"
D/OkHttp: Content-transfer-encoding: binary
D/OkHttp: Content-Type: text/plain; charset=utf-8
D/OkHttp: Content-Length: 20
D/OkHttp: QKBnVxxxxxxxxx65
D/OkHttp: --a67ac3f9-93a3-4a87-bdf5-85b447044dda
D/OkHttp: Content-disposition: form-data; name="ORDER_ID"
D/OkHttp: Content-transfer-encoding: binary
D/OkHttp: Content-Type: text/plain; charset=utf-8
D/OkHttp: Content-Length: 4
D/OkHttp: 8361
D/OkHttp: --a67ac3f9-93a3-4a87-bdf5-85b447044dda
D/OkHttp: Content-disposition: form-data; name="AMOUNT"
D/OkHttp: Content-transfer-encoding: binary
D/OkHttp: Content-Type: text/plain; charset=utf-8
D/OkHttp: Content-Length: 3
D/OkHttp: 100
D/OkHttp: --a67ac3f9-93a3-4a87-bdf5-85b447044dda--
D/OkHttp: --> END POST (816-byte body)
D/OkHttp: <-- 200 OK https://jagdishshop.com/api/paytm (329ms)
D/OkHttp: Date: Tue,15 Sep 2020 05:53:09 GMT
D/OkHttp: Server: Apache
D/OkHttp: Cache-Control: no-cache,private
D/OkHttp: X-RateLimit-Limit: 60
D/OkHttp: X-RateLimit-Remaining: 58
D/OkHttp: vary: Authorization,User-Agent
D/OkHttp: Content-Length: 0
D/OkHttp: Keep-Alive: timeout=5,max=100
D/OkHttp: Connection: Keep-Alive
D/OkHttp: Content-Type: text/html; charset=UTF-8
D/OkHttp: <-- END HTTP (0-byte body)
解决方法
问题可能出在,您发布到https://jagdishshop.com/api/paytm而不是PayTM。 除非您要修复服务器端的实现,否则尝试修复客户端是毫无意义的。
,请在Initiate transaction API(服务器端实现)中使用以下回调URL。
分期:https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=