整合 Paytm PGSDK_V2.0 Android

Integrate Paytm PGSDK_V2.0 Android

我正在将 Paytm PGSDK_V2.0 集成到我的 android 应用程序中。我已阅读 Github 上的所有文档。我已经了解 everything.but 问题出在其早期的 SDK 中,我们可以使用 Paytm Merchant 对象简单地生成校验和 Like:

PaytmMerchant merchant=new PaytmMerchant("Checksum generation url","Checksum verification url");  

并像这样投入使用

 Service.initialize(Order,merchant,null);

但在新的 SDK 中它变为

 Service.initialize(Order,null);

所以请帮助我如何在新 SDK 中生成校验和

Paytm 已更改流程以提高安全性。现在在 PGSDK_V2.0 首先你必须通过调用服务器端的 api Checksum Generation 来生成 像这样:

 @Override
        protected String doInBackground(String... params) {
            url ="http://xxx.co.in/generateChecksum.php";
            JSONParser jsonParser = new JSONParser(MainActivity.this);

                param="ORDER_ID=" + orderId+
                        "&MID="+YourMID+
                        "&CUST_ID="+custId+
                        "&CHANNEL_ID=WAP&INDUSTRY_TYPE_ID=Retail110&WEBSITE=xxxwap&TXN_AMOUNT="+billAmt+"&CALLBACK_URL=http://xxx.co.in/verifyChecksum.php";

            JSONObject jsonObject = jsonParser.makeHttpRequest(url,"POST",param);
            Log.e("CheckSum result >>",jsonObject.toString());
            if(jsonObject != null){
                Log.d("CheckSum result >>",jsonObject.toString());
                try {

                    CHECKSUMHASH=jsonObject.has("CHECKSUMHASH")?jsonObject.getString("CHECKSUMHASH"):"";
                    Log.e("CheckSum result >>",CHECKSUMHASH);

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }

现在在您的 onPostExecute 中获取 CHECKSUM 字符串后初始化 paytm 服务对象并像这样进行进一步处理:

  @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            progressDialog.hide();
            Service = PaytmPGService.getProductionService();

    /*PaytmMerchant constructor takes two parameters
    1) Checksum generation url
    2) Checksum verification url
    Merchant should replace the below values with his values*/




            //below parameter map is required to construct PaytmOrder object, Merchant should replace below map values with his own values

            Map<String, String> paramMap = new HashMap<String, String>();

            //these are mandatory parameters


            paramMap.put("ORDER_ID", orderId);
            //MID provided by paytm

            paramMap.put("MID", yourMID);
            paramMap.put("CUST_ID", custId);
            paramMap.put("CHANNEL_ID", "WAP");
            paramMap.put("INDUSTRY_TYPE_ID", "Retail");
            paramMap.put("WEBSITE", "xxxwap");
            paramMap.put("TXN_AMOUNT",billAmt);
            // 
            paramMap.put("CALLBACK_URL" ,"http://xxx.co.in/verifyChecksum.php");
            paramMap.put("CHECKSUMHASH" ,CHECKSUMHASH);
            PaytmOrder Order = new PaytmOrder(paramMap);



            Service.initialize(Order,null);
            Service.startPaymentTransaction(ReviewBooking.this, true, true, new PaytmPaymentTransactionCallback() {
                @Override
                public void someUIErrorOccurred(String inErrorMessage) {
                    // Some UI Error Occurred in Payment Gateway Activity.
                    // // This may be due to initialization of views in
                    // Payment Gateway Activity or may be due to //
                    // initialization of webview. // Error Message details
                    // the error occurred.
                }

                @Override
                public void onTransactionResponse(Bundle inResponse) {
                    Log.d("LOG", "Payment Transaction : " + inResponse);
                    String response=inResponse.getString("RESPMSG");
                    if (response.equals("Txn Successful."))
                    {
                        new ConfirmMerchent().execute();
                    }else
                    {
                        Toast.makeText(getApplicationContext(),response,Toast.LENGTH_SHORT).show();
                    }
                    Toast.makeText(getApplicationContext(), "Payment Transaction response "+inResponse.toString(), Toast.LENGTH_LONG).show();
                }


                @Override
                public void networkNotAvailable() {
                    // If network is not
                    // available, then this
                    // method gets called.
                }

                @Override
                public void clientAuthenticationFailed(String inErrorMessage) {
                    // This method gets called if client authentication
                    // failed. // Failure may be due to following reasons //
                    // 1. Server error or downtime. // 2. Server unable to
                    // generate checksum or checksum response is not in
                    // proper format. // 3. Server failed to authenticate
                    // that client. That is value of payt_STATUS is 2. //
                    // Error Message describes the reason for failure.
                }

                @Override
                public void onErrorLoadingWebPage(int iniErrorCode,
                                                  String inErrorMessage, String inFailingUrl) {

                }

                // had to be added: NOTE
                @Override
                public void onBackPressedCancelTransaction() {
                    // TODO Auto-generated method stub
                }

                @Override
                public void onTransactionCancel(String inErrorMessage, Bundle inResponse) {
                    Log.d("LOG", "Payment Transaction Failed " + inErrorMessage);
                    Toast.makeText(getBaseContext(), "Payment Transaction Failed ", Toast.LENGTH_LONG).show();
                }
            });
        }

JsonParser Class

public class JSONParser {
    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    HttpURLConnection urlConnection = null;
    // variable to hold context
    private Context context;
    // constructor
    public JSONParser(Context context){
        this.context=context;
    }


    public JSONObject makeHttpRequest(String url,String method,String params) {

       // boolean isReachable =Config.isURLReachable(context);
        // Making HTTP request
        try {
            String retSrc="";
            char current = '0';

                URL url1 = new URL(url);
                // check for request method
                HttpURLConnection urlConnection = (HttpURLConnection) url1.openConnection();
            if (method == "POST") {
                // request method is POST
               urlConnection.setDoOutput(true);
                urlConnection.setRequestMethod("POST");
                urlConnection.setFixedLengthStreamingMode(params.getBytes().length);
                urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                PrintWriter out = new PrintWriter(urlConnection.getOutputStream());
                out.print(params);
                out.close();
            }
                InputStream in = urlConnection.getInputStream();

                InputStreamReader isw = new InputStreamReader(in);

                byte[] bytes = new byte[10000];
                StringBuilder x = new StringBuilder();
                int numRead = 0;
                while ((numRead = in.read(bytes)) >= 0) {
                    x.append(new String(bytes, 0, numRead));
                }
                retSrc=x.toString();



            jObj = new JSONObject(retSrc);
            } catch (Exception e) {
            e.printStackTrace();
            new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(context, "Connectivity issue. Please try again later.", Toast.LENGTH_LONG).show();
                }
            });
            return null;
        }finally {
                if (urlConnection != null) {
                    urlConnection.disconnect();
                }
            }
        return jObj;
    }
}

两次参数值应该相同。

什么是新的 ConfirmMerchent().execute(); 在文档中 商家验证后再次检查此 uri 以确认付款 https://secure.paytm.in/oltp/HANDLER_INTERNAL/TXNSTATUS

生成校验和非常简单。

  • 只需从 Github 获取 Paytm 应用校验和套件。
  • 解压缩下载的工具包并将其放入您的服务器。如果您使用的是使用 xampp 的本地服务器,那么路径将为 c:/xampp/htdocs/paytm。我建议将文件夹名称重命名为 paytm 或小名称。
  • 工具包内有一个名为lib的文件夹。在此文件夹中,您会找到一个名为 config_paytm.php 的文件,打开此文件并将您的 Paytm 商家密钥放在这里。
  • 现在您可以使用文件generateChecksum.php生成校验和了。
  • 请记住,您需要传递将随交易传递的每个参数。
  • 下面你可以看到一个改造 api 代码示例发送 POST 请求到 generateChecksum.php.

    //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://192.168.101.1/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
    );
    

这部分非常重要,您必须发送所有参数。 order_id 每次都应该是唯一的。

来源:Paytm Integration in Android Example

从 SDK 2.0 及更高版本生成校验和只需传递 8 个参数。在早期版本中,您还需要传递电子邮件和手机号码。现在没有使用这些参数。首先在您的服务器上上传 PHP 文件,然后更改 lib 文件夹内 config.php 文件中的商家密钥。现在从 android 开始,可以使用 retrofit 或 volley 或 httpconnection 请求从您的服务器获取校验和。这里我使用的是 Httpconnection(在此代码中,JSONParse 是一个单独的 java class 来调用 httpconnection)。你可以参考这个 link -http://www.blueappsoftware.in/android/blog/paytm-integration-sdk-2-1-android/

public class sendUserDetailTOServerdd extends AsyncTask<ArrayList<String>, Void, String> {

    private ProgressDialog dialog = new ProgressDialog(checksum.this);

    private String orderId , mid, custid, amt;
    String url ="http://www.blueappsoftware.com/payment/payment_paytm/generateChecksum.php";
    String varifyurl = // "https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=<ORDER_ID>"; //
                         "https://pguat.paytm.com/paytmchecksum/paytmCallback.jsp";//
    String CHECKSUMHASH ="";

            @Override
    protected void onPreExecute() {
        this.dialog.setMessage("Please wait");
        this.dialog.show();

       // initOrderId();
        orderId ="KK100343";  // NOTE :  order id must be unique
        mid = "blueap01867059473586";  // CREATI42545355156573
        custid = "KKCUST0342";

    }

    protected String doInBackground(ArrayList<String>... alldata) {

        // String  url ="http://xxx.co.in/generateChecksum.php";

        JSONParser jsonParser = new JSONParser(checksum.this);
        String  param=
                "MID="+mid+
                "&ORDER_ID=" + orderId+
                "&CUST_ID="+custid+
                "&CHANNEL_ID=WEB&TXN_AMOUNT=100&WEBSITE=www.blueappsoftware.in"+"&CALLBACK_URL="+ varifyurl+"&INDUSTRY_TYPE_ID=Retail";

        Log.e("checksum"," param string "+param );



        JSONObject jsonObject = jsonParser.makeHttpRequest(url,"POST",param);
        // yaha per checksum ke saht order id or status receive hoga..
        Log.e("CheckSum result >>",jsonObject.toString());
        if(jsonObject != null){
            Log.e("CheckSum result >>",jsonObject.toString());
            try {

                CHECKSUMHASH=jsonObject.has("CHECKSUMHASH")?jsonObject.getString("CHECKSUMHASH"):"";
                Log.e("CheckSum result >>",CHECKSUMHASH);

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        return CHECKSUMHASH;
    }

    @Override
    protected void onPostExecute(String result) {
        // jab run kroge to yaha checksum dekhega
        ///ab service ko call krna hai
        Log.e(" setup acc ","  signup result  " + result);
        if (dialog.isShowing()) {
            dialog.dismiss();
        }}

步骤 2) 现在 onPostExceute 方法得到校验和作为结果。是时候调用 paytm 登台服务并调用开始交易了。下面是调用 paytm 服务的代码

 PaytmPGService Service =PaytmPGService.getStagingService();
       // when app is ready to publish use production service
        // PaytmPGService  Service = PaytmPGService.getProductionService();

        // now call paytm service here
        //below parameter map is required to construct PaytmOrder object, Merchant should replace below map values with his own values
        Map<String, String> paramMap = new HashMap<String, String>();
        //these are mandatory parameters
        // ye sari valeu same hon achaiye

        //MID provided by paytm
        paramMap.put("MID", mid);
        paramMap.put("ORDER_ID", orderId);
        paramMap.put("CUST_ID", custid);
        paramMap.put("CHANNEL_ID", "WEB");
        paramMap.put("TXN_AMOUNT", "100");
        paramMap.put("WEBSITE", "www.blueappsoftware.in");
        paramMap.put("CALLBACK_URL" ,varifyurl);
        //paramMap.put( "EMAIL" , "abc@gmail.com");   // no need
       // paramMap.put( "MOBILE_NO" , "9144040888");  // no need
        paramMap.put("CHECKSUMHASH" ,CHECKSUMHASH);
        //paramMap.put("PAYMENT_TYPE_ID" ,"CC");    // no need
        paramMap.put("INDUSTRY_TYPE_ID", "Retail");

        PaytmOrder Order = new PaytmOrder(paramMap);

        Log.e("checksum ", paramMap.toString());


        Service.initialize(Order,null);
        // start payment service call here
        Service.startPaymentTransaction(checksum.this, true, true, checksum.this  );