整合Paytm PGSDK_V2.0 Android

时间:2017-04-17 05:30:59

标签: android paytm

我正在我的Android应用中集成Paytm PGSDK_V2.0。我已阅读OrderBy上的所有文档。我已经了解了所有内容。但问题出在早期的SDK中,我们可以使用Paytm Merchant对象生成校验和,如:

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

并将其置于此类服务中

 Service.initialize(Order,merchant,null);

但是在新的SDK中它会改为

 Service.initialize(Order,null);

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

4 个答案:

答案 0 :(得分:12)

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;
        }

现在,在您的CHECKSUM初始化paytm服务对象中获取onPostExecute字符串后,请执行进一步处理,如下所示:

  @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;
    }
}

和参数值在两个时间都应该相同。

答案 1 :(得分:4)

生成校验和非常简单。

  • 只需从Github获取Paytm App Checksum Kit。
  • 提取下载的套件并将其放入您的服务器中。如果您使用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

答案 2 :(得分:0)

您需要为SDK 2.0及更高版本仅生成校验和生成的8个参数。在早期版本中,您还需要传递电子邮件和手机号码。现在没有使用这些参数。首先在服务器上上传PHP文件,然后更改lib文件夹中config.php文件上的商家密钥。现在从android使用可以使用改造或齐射或httpconnection请求从您的服务器获取校验和。这里我使用的是Httpconnection(在这段代码中,JSONParse是一个单独的java类来调用httpconnection)。您可以参考此链接 - 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 staging服务并调用start transaction。以下是调用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  );

答案 3 :(得分:-1)

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