I have tried to integrate paytm using php. I followed this url for implementing paytm https://www.simplifiedcoding.net/paytm-integration-android-example/ . Then downloaded sample code of them to try. Changed all credential like MID, callback url and channel iD, etc. When running on device it open buying screen when tapping on buy button it takes to some time to load and show oops "Oops! Payment failed"
In android console i am able to get order id. Here is the code of constants.java
package simplifiedcoding.net.paytmpaymentsample;
/**
* Created by Belal on 1/10/2018.
*/
public class Constants {
public static final String M_ID = "xxxxx301208461"; //Paytm Merchand Id
we got it in paytm credentials
public static final String CHANNEL_ID = "WAP"; //Paytm Channel Id, got it in
paytm credentials
public static final String INDUSTRY_TYPE_ID = "Retail"; //Paytm industry type
got it in paytm credential
public static final String WEBSITE = "APP_STAGING";
public static final String CALLBACK_URL =
"https://pguat.paytm.com/paytmchecksum/paytmCallback.jsp";
}
here is the code API.java
package simplifiedcoding.net.paytmpaymentsample;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
/**
* Created by Belal on 1/10/2018.
*/
public interface Api {
//this is the URL of the paytm folder that we added in the server
//make sure you are using your ip else it will not work
String BASE_URL = "http://10.208.1.229/paytm/";
@FormUrlEncoded
@POST("generateChecksum.php")
Call<Checksum> getChecksum(
@Field("MID") String mId,
@Field("ORDER_ID") String orderId,
@Field("CUST_ID") String custId,
@Field("CHANNEL_ID") String channelId,
@Field("TXN_AMOUNT") String txnAmount,
@Field("WEBSITE") String website,
@Field("CALLBACK_URL") String callbackUrl,
@Field("INDUSTRY_TYPE_ID") String industryTypeId
);
}
MainActivity.java code
package simplifiedcoding.net.paytmpaymentsample;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.paytm.pgsdk.PaytmOrder;
import com.paytm.pgsdk.PaytmPGService;
import com.paytm.pgsdk.PaytmPaymentTransactionCallback;
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;
//implementing PaytmPaymentTransactionCallback to track the payment result.
public class MainActivity extends AppCompatActivity implements
PaytmPaymentTransactionCallback {
//the textview in the interface where we have the price
TextView textViewPrice;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//getting the textview
textViewPrice = findViewById(R.id.textViewPrice);
//attaching a click listener to the button buy
findViewById(R.id.buttonBuy).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//calling the method generateCheckSum() which will generate the paytm checksum for payment
generateCheckSum();
}
});
}
private void generateCheckSum() {
//getting the tax amount first.
String txnAmount = textViewPrice.getText().toString().trim();
//creating a retrofit object.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Api.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
//creating the retrofit api service
Api apiService = retrofit.create(Api.class);
//creating paytm object
//containing all the values required
final Paytm paytm = new Paytm(
Constants.M_ID,
Constants.CHANNEL_ID,
txnAmount,
Constants.WEBSITE,
Constants.CALLBACK_URL,
Constants.INDUSTRY_TYPE_ID
);
//creating a call object from the apiService
Call<Checksum> call = apiService.getChecksum(
paytm.getmId(),
paytm.getOrderId(),
paytm.getCustId(),
paytm.getChannelId(),
paytm.getTxnAmount(),
paytm.getWebsite(),
paytm.getCallBackUrl(),
paytm.getIndustryTypeId()
);
//making the call to generate checksum
call.enqueue(new Callback<Checksum>() {
@Override
public void onResponse(Call<Checksum> call, Response<Checksum> response) {
//once we get the checksum we will initiailize the payment.
//the method is taking the checksum we got and the paytm object as the parameter
initializePaytmPayment(response.body().getChecksumHash(), paytm);
}
@Override
public void onFailure(Call<Checksum> call, Throwable t) {
}
});
}
private void initializePaytmPayment(String checksumHash, Paytm paytm) {
//getting paytm service
PaytmPGService Service = PaytmPGService.getStagingService();
//use this when using for production
//PaytmPGService Service = PaytmPGService.getProductionService();
//creating a hashmap and adding all the values required
Map<String, String> paramMap = new HashMap<>();
paramMap.put("MID", Constants.M_ID);
paramMap.put("ORDER_ID", paytm.getOrderId());
paramMap.put("CUST_ID", paytm.getCustId());
paramMap.put("CHANNEL_ID", paytm.getChannelId());
paramMap.put("TXN_AMOUNT", paytm.getTxnAmount());
paramMap.put("WEBSITE", paytm.getWebsite());
paramMap.put("CALLBACK_URL", paytm.getCallBackUrl());
paramMap.put("CHECKSUMHASH", checksumHash);
paramMap.put("INDUSTRY_TYPE_ID", paytm.getIndustryTypeId());
//creating a paytm order object using the hashmap
PaytmOrder order = new PaytmOrder(paramMap);
//intializing the paytm service
Service.initialize(order, null);
//finally starting the payment transaction
Service.startPaymentTransaction(this, true, true, this);
}
//all these overriden method is to detect the payment result accordingly
@Override
public void onTransactionResponse(Bundle bundle) {
Toast.makeText(this, bundle.toString(), Toast.LENGTH_LONG).show();
}
@Override
public void networkNotAvailable() {
Toast.makeText(this, "Network error", Toast.LENGTH_LONG).show();
}
@Override
public void clientAuthenticationFailed(String s) {
Toast.makeText(this, s, Toast.LENGTH_LONG).show();
}
@Override
public void someUIErrorOccurred(String s) {
Toast.makeText(this, s, Toast.LENGTH_LONG).show();
}
@Override
public void onErrorLoadingWebPage(int i, String s, String s1) {
Toast.makeText(this, s, Toast.LENGTH_LONG).show();
}
@Override
public void onBackPressedCancelTransaction() {
Toast.makeText(this, "Back Pressed", Toast.LENGTH_LONG).show();
}
@Override
public void onTransactionCancel(String s, Bundle bundle) {
Toast.makeText(this, s + bundle.toString(), Toast.LENGTH_LONG).show();
}
}
For paytm integration there is 4 step process that you should follow. Some misleading information is given in Paytm Official documentation but you can follow this reference tutorial for lastest Paytm SDK integration 2019 .
Add paytm dependency
// paytm dependency
implementation('com.paytm:pgplussdk:1.2.3') {
transitive = true;
}
Add runtime permission
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
Also add this line in main Activity class
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_SMS, Manifest.permission.RECEIVE_SMS}, 101);
}
To Generate Paytm Checksum you first need to know Order id must be unique on every transaction even in test model transaction.
The flow of android code is as follow -
Main Activity – get order id and customer id from App UI.
Pass order id and customer id to another activity name as checksum.java
get checksum from URL by passing param.
String url ="https://www.blueappsoftware.com/payment/payment_paytm/generateChecksum.php";
String varifyurl = "https://pguat.paytm.com/paytmchecksum/paytmCallback.jsp";
// "https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID"+orderId;
String param=
"MID="+mid+
"&ORDER_ID=" + orderId+
"&CUST_ID="+custid+
"&CHANNEL_ID=WAP&TXN_AMOUNT=100&WEBSITE=WEBSTAGING"+
"&CALLBACK_URL="+ varifyurl+"&INDUSTRY_TYPE_ID=Retail";
start paytm transaction by calling
Service.startPaymentTransaction(checksum.this, true, true,
checksum.this );
Please read this reference tutorial for complete process
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.