安卓Paypal通过应用程序退款



我有一个场景,如果服务器停机,我们需要对当前进行的交易entirely through the application进行"退款"。有可能吗?下面的贝宝退款API需要商家帐户的oAuth访问令牌,但我没有看到任何例子,如果移动端可以从商家获得oAuth?sdk示例主要在服务器端执行此操作。PayPal退款

"PaypalHere SDK"允许这样做,但API与常规API不同贝宝API。

PaypalHereApi

最后我通过应用程序找到了贝宝退款的解决方案。它包括三个非常简单的步骤。

  1. 根据商户的客户id和机密获取访问令牌。

  2. 从付款Id 获取交易详细信息

  3. 使用第二部分中提取的销售id退款

以下是上述三个步骤的工作代码。

步骤1:

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

步骤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);
    }
}

步骤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);
    }
}

最新更新