Android Paypal refund through App

旧街凉风 提交于 2019-12-23 03:23:17

问题


I have a scenario , where if the server is down , we need to do the "Refund" of currently made transaction entirely through the application. Is it possible ? The following paypal Refund API requires Access token of oAuth from the merchant account , but i dont see any example if oAuth from merchant is possible on mobile end ? the sdk examples are doing this at server end mostly. PaypalRefund

"PaypalHere SDK" allows this , but that API is different from regular Paypal API.

PaypalHereApi


回答1:


Finally i found a solution for paypal refund through app. It comprises of three very simple steps.

  1. Get Access Token against merchant's Client id and secret.

  2. Get Transaction details from the Payment Id

  3. Refund Payment using the sale id fetched in the second part.

Following is the working code for the above three steps.

Step1:

 public class GetAccessToken extends AsyncTask<String, Void, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        materialProgressBar.setVisibility(View.VISIBLE);
    }

    @Override
    protected String doInBackground(String... strings) {
        StringBuffer stringBuffer = new StringBuffer("");
        try {
            URL url = new URL("https://api.sandbox.paypal.com/v1/oauth2/token");
            HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url.openConnection();
            httpsURLConnection.setRequestMethod("POST");
            httpsURLConnection.addRequestProperty("Accept", "application/json");
            httpsURLConnection.addRequestProperty("Accept-Language", "en_US");
            httpsURLConnection.addRequestProperty("Content-Type", "application/x-www-form-urlencoded");

            String basicAuth = "Basic " + base64;
            httpsURLConnection.setRequestProperty("Authorization", basicAuth);

            String data = "grant_type=client_credentials";

            OutputStreamWriter outputWriter = new OutputStreamWriter(httpsURLConnection.getOutputStream());
            outputWriter.write(data);
            outputWriter.flush();
            outputWriter.close();

            Log.d(TAG, "Response Code; " + httpsURLConnection.getResponseCode());

            InputStream is;

            int status = httpsURLConnection.getResponseCode();

            if (status >= 400)
                is = httpsURLConnection.getErrorStream();
            else
                is = httpsURLConnection.getInputStream();

            int read = -1;
            byte[] buffer = new byte[512];
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            while ((read = is.read(buffer)) > 0) {
                baos.write(buffer, 0, read);
                baos.flush();
            }

            stringBuffer.append(new String(baos.toByteArray()));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return stringBuffer.toString();
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        materialProgressBar.setVisibility(View.GONE);
        onGettingAccessToken(s);
    }
}

Step 2 :

public class GetTransactionDetail extends AsyncTask<String, Void, String> {

    private static final String URL = " https://api.sandbox.paypal.com/v1/payments/payment/%s";

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        materialProgressBar.setVisibility(View.VISIBLE);
    }

    @Override
    protected String doInBackground(String... strings) {
        String address = String.format(URL, strings[0]);
        StringBuffer stringBuffer = new StringBuffer("");
        try {
            URL url = new URL(address);
            Log.d(TAG, address);
            showLog(" Payment Id =" + strings[0] + " TOken = " + strings[1]);
            HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url.openConnection();
            httpsURLConnection.setRequestMethod("GET");
            httpsURLConnection.addRequestProperty("Content-Type", "application/json");
            String basicAuth = "Bearer " + strings[1];
            Log.d(TAG, basicAuth);
            httpsURLConnection.setRequestProperty("Authorization", basicAuth);
            Log.d(TAG, "Response Code; " + httpsURLConnection.getResponseCode());
            Log.i(TAG, "************GETTING TRANSACTIN  DETAILS ASYNC a********");

            Log.i(TAG, "Payment ID =" + strings[0] + " Access Token = " + strings[1]);


            InputStream is;

            int status = httpsURLConnection.getResponseCode();

            if (status >= 400)
                is = httpsURLConnection.getErrorStream();
            else
                is = httpsURLConnection.getInputStream();

            int read = -1;
            byte[] buffer = new byte[512];
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            while ((read = is.read(buffer)) > 0) {
                baos.write(buffer, 0, read);
                baos.flush();
            }

            stringBuffer.append(new String(baos.toByteArray()));
            showLog("Transaction Detail =" + stringBuffer.toString());
        } catch (Exception e) {
            e.printStackTrace();
            showLog("Exception " + e.toString());
        }
        return stringBuffer.toString();
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        materialProgressBar.setVisibility(View.GONE);
        // parse the json
        onTransactionDetails(s);
    }
}

Step 3:

public class RefundPayment extends AsyncTask<String, Void, String> {

    private static final String URL = "https://api.sandbox.paypal.com/v1/payments/sale/%s/refund";
    private static final String DATA = "{\"amount\":{\"total\": %s,\"currency\": \"%s\"}}";

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        materialProgressBar.setVisibility(View.VISIBLE);
        showToastAlpha("Starting Payment Refund...");
       /* progressDialog.setMessage("Please wait...");
        progressDialog.show();*/
    }

    @Override
    protected String doInBackground(String... strings) {
        String address = String.format(URL, strings[0]);
        String data;
        if (strings[1] == null || strings[2] == null) {
            data = "{}";
        } else {
            data = String.format(DATA, strings[1], strings[2]);
        }

        StringBuffer stringBuffer = new StringBuffer("");
        try {
            java.net.URL url = new URL(address);
            Log.d(TAG, address);
            HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url.openConnection();
            httpsURLConnection.setRequestMethod("POST");
            httpsURLConnection.addRequestProperty("Accept", "application/json");
            httpsURLConnection.addRequestProperty("Accept-Language", "en_US");
            httpsURLConnection.addRequestProperty("Content-Type", "application/json");
            String basicAuth = "Bearer " + strings[3];
            Log.d(TAG, basicAuth);
            httpsURLConnection.setRequestProperty("Authorization", basicAuth);
            Log.i(TAG, "************GETTING REFUND PAYMENT a********");

            Log.i(TAG, "SAle id =" + strings[0] + " Amount to Refund = " + strings[1] + " Currency =" + strings[2] + " Access token  = " + strings[3]);


            OutputStreamWriter outputWriter = new OutputStreamWriter(httpsURLConnection.getOutputStream());
            Log.d(TAG, "Sending: " + data);
            outputWriter.write(data);
            outputWriter.flush();
            outputWriter.close();

            Log.d(TAG, "Response Code; " + httpsURLConnection.getResponseCode());

            InputStream is;

            int status = httpsURLConnection.getResponseCode();

            if (status >= 400)
                is = httpsURLConnection.getErrorStream();
            else
                is = httpsURLConnection.getInputStream();

            int read = -1;
            byte[] buffer = new byte[512];
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            while ((read = is.read(buffer)) > 0) {
                baos.write(buffer, 0, read);
                baos.flush();
            }

            stringBuffer.append(new String(baos.toByteArray()));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return stringBuffer.toString();
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        materialProgressBar.setVisibility(View.GONE);
        onRefundPayment(s);
    }
}


来源:https://stackoverflow.com/questions/37144075/android-paypal-refund-through-app

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!