'Retrofit : Getting HTTP (0-byte body)

Sending post request to Transaction Api after payment success to verify transaction.

Main Activity:

 ServiceWrapper serviceWrapperVerify = new ServiceWrapper(null);
                Call<Token_Verify> call_verify = serviceWrapper.getVerify(midString,orderIdString);
                call_verify.enqueue(new Callback<Token_Verify>() {
                    @Override
                    public void onResponse(Call<Token_Verify> call, Response<Token_Verify> response) {
                        Log.d(TAG, "onResponse: "+response.isSuccessful());
                    }

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

                    }
                });

Modal Class Token_verify:


public class Token_Verify {

    @SerializedName("head")
    @Expose
    private Head head;

    @SerializedName("body")
    @Expose
    private Body body;

    public Head getHead() {
        return head;
    }

    public void setHead(Head head) {
        this.head = head;
    }

    public Body getBody() {
        return body;
    }

    public void setBody(Body body) {
        this.body = body;
    }

    public static class ResultInfo {

        @SerializedName("resultStatus")
        @Expose
        private String resultStatus;
        @SerializedName("resultCode")
        @Expose
        private String resultCode;
        @SerializedName("resultMsg")
        @Expose
        private String resultMsg;

        public String getResultStatus() {
            return resultStatus;
        }

        public void setResultStatus(String resultStatus) {
            this.resultStatus = resultStatus;
        }

        public String getResultCode() {
            return resultCode;
        }

        public void setResultCode(String resultCode) {
            this.resultCode = resultCode;
        }

        public String getResultMsg() {
            return resultMsg;
        }

        public void setResultMsg(String resultMsg) {
            this.resultMsg = resultMsg;
        }

    }

    public static class Head {

        @SerializedName("responseTimestamp")
        @Expose
        private String responseTimestamp;
        @SerializedName("version")
        @Expose
        private String version;
        @SerializedName("signature")
        @Expose
        private String signature;

        public String getResponseTimestamp() {
            return responseTimestamp;
        }

        public void setResponseTimestamp(String responseTimestamp) {
            this.responseTimestamp = responseTimestamp;
        }

        public String getVersion() {
            return version;
        }

        public void setVersion(String version) {
            this.version = version;
        }

        public String getSignature() {
            return signature;
        }

        public void setSignature(String signature) {
            this.signature = signature;
        }

    }

    public static class Body {

        @SerializedName("resultInfo")
        @Expose
        private ResultInfo resultInfo;
        @SerializedName("txnToken")
        @Expose
        private String txnId;
        @SerializedName("bankTxnId")
        @Expose
        private String bankTxnId;
        @SerializedName("orderId")
        @Expose
        private String orderId;
        @SerializedName("txnAmount")
        @Expose
        private String txnAmount;
        @SerializedName("txnType")
        @Expose
        private String txnType;
        @SerializedName("bankName")
        @Expose
        private String bankName;
        @SerializedName("mid")
        @Expose
        private String mid;
        @SerializedName("paymentMode")
        @Expose
        private String paymentMode;
        @SerializedName("refundAmount")
        @Expose
        private String refundAmount;
        @SerializedName("txnDate")
        @Expose
        private String txnDate;


        public ResultInfo getResultInfo() {
            return resultInfo;
        }

        public void setResultInfo(ResultInfo resultInfo) {
            this.resultInfo = resultInfo;
        }

        public String getTxnId() {
            return txnId;
        }

        public void setTxnId(String txnId) {
            this.txnId = txnId;
        }

        public String getBankTxnId() {
            return bankTxnId;
        }

        public void setBankTxnId(String bankTxnId) {
            this.bankTxnId = bankTxnId;
        }

        public String getOrderId() {
            return orderId;
        }

        public void setOrderId(String orderId) {
            this.orderId = orderId;
        }

        public String getTxnAmount() {
            return txnAmount;
        }

        public void setTxnAmount(String txnAmount) {
            this.txnAmount = txnAmount;
        }

        public String getTxnType() {
            return txnType;
        }

        public void setTxnType(String txnType) {
            this.txnType = txnType;
        }

        public String getBankName() {
            return bankName;
        }

        public void setBankName(String bankName) {
            this.bankName = bankName;
        }

        public String getMid() {
            return mid;
        }

        public void setMid(String mid) {
            this.mid = mid;
        }

        public String getPaymentMode() {
            return paymentMode;
        }

        public void setPaymentMode(String paymentMode) {
            this.paymentMode = paymentMode;
        }

        public String getRefundAmount() {
            return refundAmount;
        }

        public void setRefundAmount(String refundAmount) {
            this.refundAmount = refundAmount;
        }

        public String getTxnDate() {
            return txnDate;
        }

        public void setTxnDate(String txnDate) {
            this.txnDate = txnDate;
        }
    }

    @NonNull
    @Override
    public String toString() {
        return "Token_Verify{" +
                "head=" + head +
                ", body=" + body +
                '}';
    }
}

Service Wrapper Class:

public class ServiceWrapper {
private static final String BASE_URL = "https://gymscircle.com/";
    private final ServiceInterface mServiceInterface;

    public ServiceWrapper(Interceptor mInterceptorHeader) {
        mServiceInterface = getRetrofit(mInterceptorHeader).create(ServiceInterface.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();
        return new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(mOkHttpClient)
                .build();
    }


 public Call<Token_Verify> getVerify(String mid, String order_id){
        return mServiceInterface.generateVerifyTokenCall(
                convertVerifyToken(mid), convertVerifyToken(order_id)
        );
 }
 public  RequestBody convertVerifyToken(String data){
        return RequestBody.create(data, MediaType.parse("text/plain"));
 }

}
public interface ServiceInterface {

    @Multipart
    @POST("paytm/verify/verifyChecksum.php")
    Call<Token_Verify> generateVerifyTokenCall(
            @Part("MID") RequestBody mid,
            @Part("ORDER_ID") RequestBody order_id
    );
    
}

verifyChecksum Api on my server:

<?php
$mid = $_POST['MID'];
$orderid = $_POST['ORDER_ID'];

$mid =   stripslashes($mid);
$orderid =   stripslashes($orderid);

/**
* import checksum generation utility
* You can get this utility from https://developer.paytm.com/docs/checksum/
*/
require_once("PaytmChecksum.php"); // this is provided by company itself and i put this verifyChecksum.php and PaytmChecksum.php in same folder in my hosting server

/* initialize an array */
$paytmParams = array();

/* body parameters */
$paytmParams["body"] = array(
    "mid" => $mid,
    "orderId" => $orderid,
);

/**
* Generate checksum by parameters we have in body 
*/
$checksum = PaytmChecksum::generateSignature(json_encode($paytmParams["body"], JSON_UNESCAPED_SLASHES), "Qjd904&2Cxxxxxx"); // add xxxx for security reason

/* head parameters */
$paytmParams["head"] = array(

    /* put generated checksum value here */
    "signature" => $checksum
);

/* prepare JSON string for request */
$post_data = json_encode($paytmParams, JSON_UNESCAPED_SLASHES);


/* for Production */
$url = "https://securegw.paytm.in/v3/order/status";

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));  
$response = curl_exec($ch);

?>

Error Log:

I/okhttp.OkHttpClient: --> POST https://gymscircle.com/paytm/verify/verifyChecksum.php
I/okhttp.OkHttpClient: Content-Type: multipart/form-data; boundary=18d68fdd-02df-499f-8fe8-845047346a1e
I/okhttp.OkHttpClient: Content-Length: 449
I/okhttp.OkHttpClient: --18d68fdd-02df-499f-8fe8-845047346a1e
I/okhttp.OkHttpClient: Content-Disposition: form-data; name="MID"
I/okhttp.OkHttpClient: Content-Transfer-Encoding: binary
I/okhttp.OkHttpClient: Content-Type: text/plain; charset=utf-8
I/okhttp.OkHttpClient: Content-Length: 20
I/okhttp.OkHttpClient: 
I/okhttp.OkHttpClient: YXnQEX7530866XXXXXX // add xxxx for security reason
I/okhttp.OkHttpClient: Content-Disposition: form-data; name="ORDER_ID"
I/okhttp.OkHttpClient: Content-Type: text/plain; charset=utf-8
I/okhttp.OkHttpClient: Content-Length: 14
I/okhttp.OkHttpClient: 
I/okhttp.OkHttpClient: KH100420228546
I/okhttp.OkHttpClient: --18d68fdd-02df-499f-8fe8-845047346a1e--
I/okhttp.OkHttpClient: --> END POST (449-byte body)

I/okhttp.OkHttpClient: <-- 200 https://gymscircle.com/paytm/verify/verifyChecksum.php (1017ms)
I/okhttp.OkHttpClient: date: Sun, 10 Apr 2022 06:36:03 GMT
I/okhttp.OkHttpClient: content-type: text/html; charset=UTF-8
I/okhttp.OkHttpClient: content-length: 0
I/okhttp.OkHttpClient: cache-control: max-age=604800
I/okhttp.OkHttpClient: expires: Sun, 17 Apr 2022 06:36:02 GMT
I/okhttp.OkHttpClient: server: awex
I/okhttp.OkHttpClient: x-xss-protection: 1; mode=block
I/okhttp.OkHttpClient: x-content-type-options: nosniff
I/okhttp.OkHttpClient: x-request-id: c2f8278e35bc81a92d2ef883098e6bd2
I/okhttp.OkHttpClient: <-- **END HTTP (0-byte body)**

Always getting END HTTP (0-byte body) and don't give any response

When i done payment on calling init_transaction successfully, i have to verify this payment from Transaction Status APi which i have to call with orderID. but getting 0 body on calling this transaction status api

Please help to solve this.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source