'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 |
|---|
